首页 > 其他分享 >一个练习项目,好玩的bbs-go-beego

一个练习项目,好玩的bbs-go-beego

时间:2024-09-02 14:17:35浏览次数:10  
标签:beego string type db json go bbs struct

代码:

package main

/**
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn
go mod init gos
go mod tidy
go mod vendor
*/

import (
    "crypto/md5"
    "database/sql"
    "fmt"
    "log"
    "math"
    "strconv"

    "github.com/astaxie/beego"
    _ "github.com/go-sql-driver/mysql"
    "github.com/jmoiron/sqlx"
)

var (
    userName  string = "root"
    password  string = "123456"
    ipAddrees string = "127.0.0.1"
    port      int    = 3306
    dbName    string = "my_bbs"
    charset   string = "utf8mb4"
)

type countinfo struct {
    Count int64 `db:"count" json:"count"`
}

type userinfo struct {
    Id        int    `db:"id" json:"id"`
    Username  string `db:"username" json:"username"`
    Nickname  string `db:"nickname" json:"nickname"`
    AddTime   string `db:"addTime" json:"addTime"`
    SessionId string `db:"sessionId" json:"sessionId"`
}

type postinfo struct {
    Id            int    `db:"id" json:"id"`
    Title         string `db:"title" json:"title"`
    UserId        string `db:"userId" json:"userId"`
    UserNickename string `db:"userNickename" json:"userNickename"`
    ReplyNum      int    `db:"replyNum" json:"replyNum"`
    UpdateTime    string `db:"updateTime" json:"updateTime"`
}

type postinfodetail struct {
    Id            int    `db:"id" json:"id"`
    Title         string `db:"title" json:"title"`
    Content       string `db:"content" json:"content"`
    UserId        int    `db:"userId" json:"userId"`
    UserNickename string `db:"userNickename" json:"userNickename"`
    ReplyNum      int    `db:"replyNum" json:"replyNum"`
    UpdateTime    string `db:"updateTime" json:"updateTime"`
}

type replyinfo struct {
    Id                 int    `db:"id" json:"id"`
    ContentId          int    `db:"contentId" json:"contentId"`
    Content            string `db:"content" json:"content"`
    ReplyUserId        int    `db:"replyUserId" json:"replyUserId"`
    ReplyUserNickename string `db:"replyUserNickename" json:"replyUserNickename"`
    AddTime            string `db:"addTime" json:"addTime"`
}

type postlistpage struct {
    Totalpage int        `db:"totalpage" json:"totalpage"`
    Data      []postinfo `db:"data" json:"data"`
}

type replylistpage struct {
    Totalpage int         `db:"totalpage" json:"totalpage"`
    Data      []replyinfo `db:"data" json:"data"`
}

type Responsex struct {
    Code int    `json:"code"`
    Msg  string `json:"msg"`
    Data string `json:"data"`
}

type Responseuserinfo struct {
    Code int       `json:"code"`
    Msg  string    `json:"msg"`
    Data *userinfo `json:"data"`
}

type Responsepostlistpage struct {
    Code int           `json:"code"`
    Msg  string        `json:"msg"`
    Data *postlistpage `json:"data"`
}

type Responsepostinfodetail struct {
    Code int             `json:"code"`
    Msg  string          `json:"msg"`
    Data *postinfodetail `json:"data"`
}

type Responsereplylistpage struct {
    Code int            `json:"code"`
    Msg  string         `json:"msg"`
    Data *replylistpage `json:"data"`
}

type Responsereplyinfo struct {
    Code int        `json:"code"`
    Msg  string     `json:"msg"`
    Data *replyinfo `json:"data"`
}

var pagesize = 20
var secretKey = "saacac3423@21212"

func connectMysql() *sqlx.DB {
    dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=%s", userName, password, ipAddrees, port, dbName, charset)
    Db, err := sqlx.Open("mysql", dsn)
    if err != nil {
        log.Fatal(err)
    }
    return Db
}

func calcMD5(message string) string {
    data := []byte(message)
    return fmt.Sprintf("%x", md5.Sum(data))
}

func getloginuserinfo(sessionId string) *userinfo {
    var Db *sqlx.DB = connectMysql()
    defer Db.Close()

    var result1 *userinfo = new(userinfo)
    sql1 := "select id,username,nickname,addTime,sessionId from user where sessionId='" + sessionId + "'"
    err := Db.Get(result1, sql1)
    if err != nil {
        log.Fatal(err)
    }

    return result1
}

type IndexController struct {
    beego.Controller
}

type UserRegisterController struct {
    beego.Controller
}

type UserLoginController struct {
    beego.Controller
}

type UserLogoutController struct {
    beego.Controller
}

type UserInfoController struct {
    beego.Controller
}

type PostlistController struct {
    beego.Controller
}

type PostdetailController struct {
    beego.Controller
}

type PostaddController struct {
    beego.Controller
}

type PosteditController struct {
    beego.Controller
}

type PostdeleteController struct {
    beego.Controller
}

type ReplylistController struct {
    beego.Controller
}

type ReplydetailController struct {
    beego.Controller
}

type ReplyaddController struct {
    beego.Controller
}

type ReplyeditController struct {
    beego.Controller
}

type ReplydeleteController struct {
    beego.Controller
}

func (this *IndexController) Get() {
    this.Ctx.Output.Header("Server", "go.beego")
    this.Ctx.WriteString("此站接口使用go.beego实现,<a href='api.html' target='_blank'>接口列表</a>")
}

func (this *UserRegisterController) Get() {
    this.Ctx.Output.Header("Server", "go.beego")

    username := this.Ctx.Input.Query("username")
    password := this.Ctx.Input.Query("password")
    nickname := this.Ctx.Input.Query("nickname")
    passwordMd5 := calcMD5(password)

    var Db *sqlx.DB = connectMysql()
    defer Db.Close()

    var result1 *userinfo = new(userinfo)
    sql1 := "select id,username,nickname,addTime,sessionId from user where username='" + username + "'"
    err := Db.Get(result1, sql1)

    if err == sql.ErrNoRows {
        sql2 := "insert into user(username, password, nickname) value('" + username + "', '" + passwordMd5 + "', '" + nickname + "')"
        result2, err := Db.Exec(sql2)
        if err != nil {
            log.Fatal(err)
            log.Fatal(result2)
        }
        insertId, err := result2.LastInsertId()
        this.Data["json"] = &Responsex{Code: 0, Msg: "", Data: fmt.Sprintf("%d", insertId)}
        this.ServeJSON()
    } else if result1.Id > 0 {
        this.Data["json"] = &Responsex{Code: 1, Msg: "用户名已经存在", Data: ""}
        this.ServeJSON()
    } else {
        this.Data["json"] = &Responsex{Code: 1, Msg: "未知错误", Data: ""}
        this.ServeJSON()
    }
}

func (this *UserLoginController) Get() {
    this.Ctx.Output.Header("Server", "go.beego")

    username := this.Ctx.Input.Query("username")
    password := this.Ctx.Input.Query("password")
    passwordMd5 := calcMD5(password)

    var Db *sqlx.DB = connectMysql()
    defer Db.Close()

    var result1 *userinfo = new(userinfo)
    sql1 := "select id,username,nickname,addTime,sessionId from user where username='" + username + "' and password='" + passwordMd5 + "'"
    err := Db.Get(result1, sql1)

    if err == sql.ErrNoRows {
        this.Data["json"] = &Responsex{Code: 1, Msg: "用户名或者密码错误", Data: ""}
        this.ServeJSON()
    } else {
        sessionId := calcMD5(secretKey + strconv.Itoa(result1.Id) + result1.AddTime)
        sql2 := "update user set sessionId='" + sessionId + "' where id=" + strconv.Itoa(result1.Id)
        result2, err := Db.Exec(sql2)
        if err != nil {
            log.Fatal(err)
            log.Fatal(result2)
        }
        result1.SessionId = sessionId
        this.Data["json"] = &Responseuserinfo{Code: 0, Msg: "", Data: result1}
        this.ServeJSON()
    }
}

func (this *UserLogoutController) Get() {
    this.Ctx.Output.Header("Server", "go.beego")

    sessionId := this.Ctx.Input.Query("sessionId")

    var Db *sqlx.DB = connectMysql()
    defer Db.Close()

    var result1 *userinfo = new(userinfo)
    sql1 := "select id,username,nickname,addTime,sessionId from user where sessionId='" + sessionId + "'"
    err := Db.Get(result1, sql1)

    if err == sql.ErrNoRows {
        //
    } else {

        sql2 := "update user set sessionId='' where sessionId='" + sessionId + "'"
        result2, err := Db.Exec(sql2)
        if err != nil {
            log.Fatal(err)
            log.Fatal(result2)
        }
        result1.SessionId = ""
    }

    this.Data["json"] = &Responseuserinfo{Code: 0, Msg: "", Data: result1}
    this.ServeJSON()
}

func (this *UserInfoController) Get() {
    this.Ctx.Output.Header("Server", "go.beego")

    sessionId := this.Ctx.Input.Query("sessionId")

    var Db *sqlx.DB = connectMysql()
    defer Db.Close()

    var result1 *userinfo = new(userinfo)
    sql1 := "select id,username,nickname,addTime,sessionId from user where sessionId='" + sessionId + "'"
    err := Db.Get(result1, sql1)
    if err != nil {
        log.Fatal(err)
    }

    this.Data["json"] = &Responseuserinfo{Code: 0, Msg: "", Data: result1}
    this.ServeJSON()
}

func (this *PostlistController) Get() {
    this.Ctx.Output.Header("Server", "go.beego")

    page, err := strconv.Atoi(this.Ctx.Input.Query("page"))
    keyword := this.Ctx.Input.Query("keyword")

    if page <= 0 {
        page = 1
    }

    start := (page - 1) * pagesize

    addSql := " isDel=0 "
    if keyword != "" {
        addSql = " isDel=0 and title like '%" + keyword + "%' "
    }

    var Db *sqlx.DB = connectMysql()
    defer Db.Close()

    var result1 *countinfo = new(countinfo)
    sql1 := "select count(1) as count from content where " + addSql
    err = Db.Get(result1, sql1)
    if err != nil {
        log.Fatal(err)
    }

    var result2 []postinfo
    sql2 := "select id,title,userId,userNickename,replyNum,updateTime from content where " + addSql + " order by updateTime desc limit " + strconv.Itoa(start) + "," + strconv.Itoa(pagesize)
    err = Db.Select(&result2, sql2)
    if err != nil {
        log.Fatal(err)
    }

    totalcount := result1.Count
    totalpage := int(math.Ceil(float64(totalcount) / float64(pagesize)))

    var result3 *postlistpage = new(postlistpage)

    if result2 != nil {
        result3.Data = result2
    } else {
        result3.Data = make([]postinfo, 0)
    }

    result3.Totalpage = totalpage

    this.Data["json"] = &Responsepostlistpage{Code: 0, Msg: "", Data: result3}
    this.ServeJSON()
}

func (this *PostdetailController) Get() {
    this.Ctx.Output.Header("Server", "go.beego")

    id := this.Ctx.Input.Query("id")

    var Db *sqlx.DB = connectMysql()
    defer Db.Close()

    var result1 *postinfodetail = new(postinfodetail)
    sql1 := "select id,title,content,userId,userNickename,replyNum,updateTime from content where isDel=0 and id=" + id
    err := Db.Get(result1, sql1)
    if err != nil {
        log.Fatal(err)
    }

    this.Data["json"] = &Responsepostinfodetail{Code: 0, Msg: "", Data: result1}
    this.ServeJSON()
}

func (this *PostaddController) Get() {
    this.Ctx.Output.Header("Server", "go.beego")

    title := this.Ctx.Input.Query("title")
    content := this.Ctx.Input.Query("content")
    sessionId := this.Ctx.Input.Query("sessionId")

    var Db *sqlx.DB = connectMysql()
    defer Db.Close()

    var userinfo1 *userinfo = getloginuserinfo(sessionId)
    if userinfo1.Id <= 0 {
        this.Data["json"] = &Responsex{Code: 1, Msg: "请先登录", Data: ""}
        this.ServeJSON()
    } else {
        sql2 := "insert into content(title, content, userId, userNickename) value('" + title + "', '" + content + "', " + strconv.Itoa(userinfo1.Id) + ", '" + userinfo1.Nickname + "')"
        result2, err := Db.Exec(sql2)
        if err != nil {
            log.Fatal(err)
            log.Fatal(result2)
        }
        insertId, err := result2.LastInsertId()
        this.Data["json"] = &Responsex{Code: 0, Msg: "", Data: fmt.Sprintf("%d", insertId)}
        this.ServeJSON()
    }
}

func (this *PosteditController) Get() {
    this.Ctx.Output.Header("Server", "go.beego")

    id := this.Ctx.Input.Query("id")
    title := this.Ctx.Input.Query("title")
    content := this.Ctx.Input.Query("content")
    sessionId := this.Ctx.Input.Query("sessionId")

    var Db *sqlx.DB = connectMysql()
    defer Db.Close()

    var userinfo1 *userinfo = getloginuserinfo(sessionId)
    if userinfo1.Id <= 0 {
        this.Data["json"] = &Responsex{Code: 1, Msg: "请先登录", Data: ""}
        this.ServeJSON()
    } else {
        sql2 := "update content set title='" + title + "',content='" + content + "',userId=" + strconv.Itoa(userinfo1.Id) + ",userNickename='" + userinfo1.Nickname + "' where id=" + id + " and userId=" + strconv.Itoa(userinfo1.Id)
        result2, err := Db.Exec(sql2)
        if err != nil {
            log.Fatal(err)
            log.Fatal(result2)
        }
        this.Data["json"] = &Responsex{Code: 0, Msg: "", Data: ""}
        this.ServeJSON()
    }
}

func (this *PostdeleteController) Get() {
    this.Ctx.Output.Header("Server", "go.beego")

    id := this.Ctx.Input.Query("id")
    sessionId := this.Ctx.Input.Query("sessionId")

    var Db *sqlx.DB = connectMysql()
    defer Db.Close()

    var userinfo1 *userinfo = getloginuserinfo(sessionId)
    if userinfo1.Id <= 0 {
        this.Data["json"] = &Responsex{Code: 1, Msg: "请先登录", Data: ""}
        this.ServeJSON()
    } else {
        sql2 := "update content set isDel=1 where id=" + id + " and userId=" + strconv.Itoa(userinfo1.Id)
        result2, err := Db.Exec(sql2)
        if err != nil {
            log.Fatal(err)
            log.Fatal(result2)
        }
        this.Data["json"] = &Responsex{Code: 0, Msg: "", Data: ""}
        this.ServeJSON()
    }
}

func (this *ReplylistController) Get() {
    this.Ctx.Output.Header("Server", "go.beego")

    page, err := strconv.Atoi(this.Ctx.Input.Query("page"))
    contentId := this.Ctx.Input.Query("contentId")

    if page <= 0 {
        page = 1
    }

    start := (page - 1) * pagesize

    var Db *sqlx.DB = connectMysql()
    defer Db.Close()

    var result1 *countinfo = new(countinfo)
    sql1 := "select count(1) as count from reply where isDel=0 and contentId=" + contentId
    err = Db.Get(result1, sql1)
    if err != nil {
        log.Fatal(err)
    }

    var result2 []replyinfo
    sql2 := "select id,content,replyUserId,replyUserNickename,addTime,contentId from reply where isDel=0 and contentId=" + contentId + " order by id asc limit " + strconv.Itoa(start) + "," + strconv.Itoa(pagesize)
    err = Db.Select(&result2, sql2)
    if err != nil {
        log.Fatal(err)
    }

    totalcount := result1.Count
    totalpage := int(math.Ceil(float64(totalcount) / float64(pagesize)))

    var result3 *replylistpage = new(replylistpage)
    if result2 != nil {
        result3.Data = result2
    } else {
        result3.Data = make([]replyinfo, 0)
    }

    result3.Totalpage = totalpage
    this.Data["json"] = &Responsereplylistpage{Code: 0, Msg: "", Data: result3}
    this.ServeJSON()
}

func (this *ReplydetailController) Get() {
    this.Ctx.Output.Header("Server", "go.beego")

    id := this.Ctx.Input.Query("id")

    var Db *sqlx.DB = connectMysql()
    defer Db.Close()

    var result1 *replyinfo = new(replyinfo)
    sql1 := "select id,content,replyUserId,replyUserNickename,addTime,contentId from reply where isDel=0 and id=" + id
    err := Db.Get(result1, sql1)
    if err != nil {
        log.Fatal(err)
    }

    this.Data["json"] = &Responsereplyinfo{Code: 0, Msg: "", Data: result1}
    this.ServeJSON()
}

func (this *ReplyaddController) Get() {
    this.Ctx.Output.Header("Server", "go.beego")

    contentId := this.Ctx.Input.Query("contentId")
    content := this.Ctx.Input.Query("content")
    sessionId := this.Ctx.Input.Query("sessionId")

    var Db *sqlx.DB = connectMysql()
    defer Db.Close()

    var userinfo1 *userinfo = getloginuserinfo(sessionId)
    if userinfo1.Id <= 0 {
        this.Data["json"] = &Responsex{Code: 1, Msg: "请先登录", Data: ""}
        this.ServeJSON()
    } else {
        sql1 := "update content set replyNum=replyNum+1 where id=" + contentId
        result1, err := Db.Exec(sql1)
        if err != nil {
            log.Fatal(err)
            log.Fatal(result1)
        }

        sql2 := "insert into reply(contentId, content, replyUserId, replyUserNickename) value(" + contentId + ", '" + content + "', " + strconv.Itoa(userinfo1.Id) + ", '" + userinfo1.Nickname + "')"
        result2, err := Db.Exec(sql2)
        if err != nil {
            log.Fatal(err)
            log.Fatal(result2)
        }
        insertId, err := result2.LastInsertId()
        this.Data["json"] = &Responsex{Code: 0, Msg: "", Data: fmt.Sprintf("%d", insertId)}
        this.ServeJSON()
    }
}

func (this *ReplyeditController) Get() {
    this.Ctx.Output.Header("Server", "go.beego")

    id := this.Ctx.Input.Query("id")
    content := this.Ctx.Input.Query("content")
    sessionId := this.Ctx.Input.Query("sessionId")

    var Db *sqlx.DB = connectMysql()
    defer Db.Close()

    var userinfo1 *userinfo = getloginuserinfo(sessionId)
    if userinfo1.Id <= 0 {
        this.Data["json"] = &Responsex{Code: 1, Msg: "请先登录", Data: ""}
        this.ServeJSON()
    } else {
        sql2 := "update reply set content='" + content + "',replyUserId=" + strconv.Itoa(userinfo1.Id) + ",replyUserNickename='" + userinfo1.Nickname + "' where id=" + id + " and replyUserId=" + strconv.Itoa(userinfo1.Id)
        result2, err := Db.Exec(sql2)
        if err != nil {
            log.Fatal(err)
            log.Fatal(result2)
        }
        this.Data["json"] = &Responsex{Code: 0, Msg: "", Data: ""}
        this.ServeJSON()
    }
}

func (this *ReplydeleteController) Get() {
    this.Ctx.Output.Header("Server", "go.beego")

    id := this.Ctx.Input.Query("id")
    sessionId := this.Ctx.Input.Query("sessionId")

    var Db *sqlx.DB = connectMysql()
    defer Db.Close()

    var userinfo1 *userinfo = getloginuserinfo(sessionId)
    if userinfo1.Id <= 0 {
        this.Data["json"] = &Responsex{Code: 1, Msg: "请先登录", Data: ""}
        this.ServeJSON()
    } else {
        var result0 *replyinfo = new(replyinfo)
        sql0 := "select id,content,replyUserId,replyUserNickename,addTime,contentId from reply where isDel=0 and id=" + id
        err := Db.Get(result0, sql0)
        if err != nil {
            log.Fatal(err)
        }

        sql1 := "update content set replyNum=replyNum-1 where id=" + strconv.Itoa(result0.ContentId)
        result1, err := Db.Exec(sql1)
        if err != nil {
            log.Fatal(err)
            log.Fatal(result1)
        }

        sql2 := "update reply set isDel=1 where id=" + id + " and replyUserId=" + strconv.Itoa(userinfo1.Id)
        result2, err := Db.Exec(sql2)
        if err != nil {
            log.Fatal(err)
            log.Fatal(result2)
        }
        this.Data["json"] = &Responsex{Code: 0, Msg: "", Data: ""}
        this.ServeJSON()
    }
}

func main() {
    beego.BConfig.AppName = "beego"
    beego.BConfig.ServerName = "beego"
    beego.BConfig.Listen.HTTPAddr = "127.0.0.1"
    beego.BConfig.Listen.HTTPPort = 1096

    beego.Router("/", &IndexController{})
    beego.Router("/user/register", &UserRegisterController{})
    beego.Router("/user/login", &UserLoginController{})
    beego.Router("/user/logout", &UserLogoutController{})
    beego.Router("/user/getuserinfo", &UserInfoController{})
    beego.Router("/post/list", &PostlistController{})
    beego.Router("/post/detail", &PostdetailController{})
    beego.Router("/post/add", &PostaddController{})
    beego.Router("/post/edit", &PosteditController{})
    beego.Router("/post/delete", &PostdeleteController{})
    beego.Router("/reply/list", &ReplylistController{})
    beego.Router("/reply/detail", &ReplydetailController{})
    beego.Router("/reply/add", &ReplyaddController{})
    beego.Router("/reply/edit", &ReplyeditController{})
    beego.Router("/reply/delete", &ReplydeleteController{})
    beego.Run()
}

 

输出:

D:\workspace\studys\study_bbs>D:\software\go\bin\go.exe run D:\workspace\studys\study_bbs\start_web_beego.go
2024/09/02 14:14:04.499 [I]  http server Running on http://127.0.0.1:1096

 

标签:beego,string,type,db,json,go,bbs,struct
From: https://www.cnblogs.com/xuxiaobo/p/18392616

相关文章

  • 一个练习项目,好玩的bbs-go-chi
    代码:packagemain/**goenv-wGO111MODULE=ongoenv-wGOPROXY=https://goproxy.cngomodinitgosgomodtidygomodvendor*/import("crypto/md5""database/sql""encoding/json""fmt""......
  • 一个练习项目,好玩的bbs-perl-mojolicious
    代码:#!D:/software/Strawberry/perl/bin/perl.exeBEGIN{push(@INC,'D:/workspace/studys/study_bbs');}useMojolicious::Lite-signatures;useutf8;useNet::MySQL;useEncode;usePOSIX;useJSONqw/encode_jsondecode_json/;useDigest;o......
  • 一个练习项目,好玩的bbs-perl-dancer
    代码:#!D:/software/Strawberry/perl/bin/perl.exeBEGIN{push(@INC,'D:/workspace/studys/study_bbs');}useutf8;useDancer;useDancer::Serializer::JSON;useNet::MySQL;useEncode;usePOSIX;useJSONqw/encode_jsondecode_json/;useDi......
  • 一个练习项目,好玩的bbs-python-cherrypy
    代码:importcherrypyimportMySQLdbimportjsonimporthashlibimportrandomimportmathimportosfromdatetimeimportdatetimeclassDateEncoder(json.JSONEncoder):defdefault(self,obj):ifisinstance(obj,datetime):returnobj......
  • 一个练习项目,好玩的bbs-python-tornado
    代码:importos.pathimporttornado.httpserverimporttornado.webimporttornado.optionsimporttornado.ioloopfromtornado.optionsimportdefine,optionsimportMySQLdbimportjsonimporthashlibimportrandomimportmathimportosfromdatetimeimportda......
  • 一个练习项目,好玩的bbs-python-flask
    代码:fromflaskimportFlask,make_response,requestimportos.pathimportMySQLdbimportjsonimporthashlibimportrandomimportmathimportosfromdatetimeimportdatetimeapp=Flask(__name__)classDateEncoder(json.JSONEncoder):defdefault(se......
  • 一个练习项目,好玩的bbs-python-fastapi
    代码:fromfastapiimportFastAPI,Response,Cookie,Dependsfromfastapi.responsesimportJSONResponsefromfastapi.responsesimportHTMLResponseimportos.pathimportMySQLdbimportjsonimporthashlibimportrandomimportmathimportosfromdatetimeim......
  • 一个练习项目,好玩的bbs-python-bottle
    代码:frombottleimportroute,run,templatefrombottleimportBottle,request,responseimportos.pathimportMySQLdbimportjsonimporthashlibimportrandomimportmathimportosfromdatetimeimportdatetimeclassDateEncoder(json.JSONEncoder):......
  • 一个练习项目,好玩的bbs-python-pyramid
    代码:fromwsgiref.simple_serverimportmake_serverfrompyramid.configimportConfiguratorfrompyramid.viewimportview_configfrompyramid.responseimportResponseimportos.pathimportMySQLdbimportjsonimporthashlibimportrandomimportmathimport......
  • 一个练习项目,好玩的bbs-python-webpy
    代码:importwebimportos.pathimportMySQLdbimportjsonimporthashlibimportrandomimportmathimportosfromdatetimeimportdatetimeclassDateEncoder(json.JSONEncoder):defdefault(self,obj):ifisinstance(obj,datetime):......