liuxiaolong
2020-06-29 167f00c02df35f19d689e60db3d30ebf035ab629
add user and userCar
5个文件已添加
8个文件已修改
471 ■■■■ 已修改文件
cache/redis.go 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
conf/app.conf 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
controllers/code.go 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
controllers/user.go 90 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
go.mod 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
go.sum 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
main.go 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
models/db.go 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
models/user.go 111 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
models/userCar.go 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
routers/router.go 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service/userService.go 114 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vo/user.go 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cache/redis.go
New file
@@ -0,0 +1,26 @@
package cache
import (
    "fmt"
    "github.com/astaxie/beego"
    redigo "github.com/gomodule/redigo/redis"
)
var pool *redigo.Pool
func init() {
    redisHost := beego.AppConfig.String("redisIp")
    redisPort := beego.AppConfig.String("redisPort")
    poolSize := 20
    pool = redigo.NewPool(func() (redigo.Conn, error) {
        c, err := redigo.Dial("tcp", fmt.Sprintf("%s:%d", redisHost, redisPort))
        if err != nil {
            return nil, err
        }
        return c, nil
    }, poolSize)
}
func Get() redigo.Conn {
    return pool.Get()
}
conf/app.conf
@@ -15,4 +15,7 @@
pushAppSecret = gui4KFqXDv8LWKR57NKfS5
pushMasterSecret = vFiErCTBqqAcufPzB0Tl45
pushPackageName = uni.UNIEDF0B5C
pushBaseUrl = https://restapi.getui.com/v2/
pushBaseUrl = https://restapi.getui.com/v2/
dbUrl = root:c++java123@tcp(192.168.20.173:3306)/car_yuying?charset=utf8
redisIp = 192.168.20.10
redisPort = 6379
controllers/code.go
New file
@@ -0,0 +1,37 @@
package controllers
import (
    "car-service/extend/code"
    "car-service/service"
    "github.com/astaxie/beego"
    "net/http"
)
type CodeController struct {
    beego.Controller
}
// @router /new [get]
func (c *CodeController) New() {
    phoneNum := c.GetString("phoneNum")
    resp := code.Code{}
    if phoneNum == "" {
        resp.Success= false
        resp.Status= http.StatusBadRequest
        resp.Data= nil
    } else {
        err := service.NewVerifyCode(phoneNum)
        if err == nil {
            resp.Success= true
            resp.Status= http.StatusOK
            resp.Data= "发送成功"
        } else {
            resp.Success= false
            resp.Status= http.StatusBadRequest
            resp.Data= err.Error()
        }
    }
    c.Data["json"] = resp
    c.ServeJSON()
}
controllers/user.go
@@ -1,10 +1,11 @@
package controllers
import (
    "car-service/extend/code"
    "car-service/models"
    "encoding/json"
    "car-service/service"
    "github.com/astaxie/beego"
    "net/http"
)
// Operations about Users
@@ -12,48 +13,6 @@
    beego.Controller
}
// @Title CreateUser
// @Description create users
// @Param    body        body     models.User    true        "body for user content"
// @Success 200 {int} models.User.Id
// @Failure 403 {string} json "body is empty"
// @router / [post]
func (u *UserController) Post() {
    var user models.User
    json.Unmarshal(u.Ctx.Input.RequestBody, &user)
    uid := models.AddUser(user)
    u.Data["json"] = map[string]string{"uid": uid}
    u.ServeJSON()
}
// @Title GetAll
// @Description get all Users
// @Success 200 {object} models.User
// @router / [get]
func (u *UserController) GetAll() {
    users := models.GetAllUsers()
    u.Data["json"] = users
    u.ServeJSON()
}
// @Title Get
// @Description get user by uid
// @Param    uid        path     string    true        "The key for staticblock"
// @Success 200 {object} models.User
// @Failure 403 {string} json ":uid is empty"
// @router /:uid [get]
func (u *UserController) Get() {
    uid := u.GetString(":uid")
    if uid != "" {
        user, err := models.GetUser(uid)
        if err != nil {
            u.Data["json"] = err.Error()
        } else {
            u.Data["json"] = user
        }
    }
    u.ServeJSON()
}
// @Title Update
// @Description update the user
@@ -66,13 +25,8 @@
    uid := u.GetString(":uid")
    if uid != "" {
        var user models.User
        json.Unmarshal(u.Ctx.Input.RequestBody, &user)
        uu, err := models.UpdateUser(uid, &user)
        if err != nil {
            u.Data["json"] = err.Error()
        } else {
            u.Data["json"] = uu
        }
        u.Data["json"] = user
    }
    u.ServeJSON()
}
@@ -85,8 +39,14 @@
// @router /:uid [delete]
func (u *UserController) Delete() {
    uid := u.GetString(":uid")
    models.DeleteUser(uid)
    u.Data["json"] = "delete success!"
    var user = models.User{
        Id: uid,
    }
    i, err := user.DeleteById()
    if err ==nil && i >0 {
        u.Data["json"] = "delete success!"
    }
    u.ServeJSON()
}
@@ -98,13 +58,21 @@
// @Failure 403 {string} json  "user not exist"
// @router /login [get]
func (u *UserController) Login() {
    username := u.GetString("username")
    password := u.GetString("password")
    if models.Login(username, password) {
        u.Data["json"] = "login success"
    phoneNum := u.GetString("phoneNum")
    cod := u.GetString("code")
    var sv service.UserService
    b, info, e := sv.Login(phoneNum, cod)
    resp := code.Code{}
    if b {
        resp.Success= true
        resp.Status= http.StatusOK
        resp.Data= *info
    } else {
        u.Data["json"] = "user not exist"
        resp.Success= false
        resp.Status= http.StatusBadRequest
        resp.Data= e.Error()
    }
    u.Data["json"] = resp
    u.ServeJSON()
}
@@ -113,7 +81,11 @@
// @Success 200 {string} logout success
// @router /logout [get]
func (u *UserController) Logout() {
    u.Data["json"] = "logout success"
    resp := code.Code{}
    resp.Success = true
    resp.Status = http.StatusOK
    resp.Data = "退出成功"
    u.Data["json"] = resp
    u.ServeJSON()
}
go.mod
@@ -10,4 +10,5 @@
    github.com/smartystreets/goconvey v1.6.4 // indirect
    github.com/swaggo/swag v1.6.7
    github.com/robfig/cron v1.2.0
    github.com/aliyun/alibaba-cloud-sdk-go v0.0.0-20190808125512-07798873deee
)
go.sum
@@ -10,12 +10,16 @@
github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY=
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 h1:JYp7IbQjafoB+tBA3gMyHYHrpOtNuDiK/uB5uXxq5wM=
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
github.com/aliyun/alibaba-cloud-sdk-go v0.0.0-20190808125512-07798873deee h1:NYqDBPkhVYt68W3yoGoRRi32i3MLx2ey7SFkJ1v/UI0=
github.com/aliyun/alibaba-cloud-sdk-go v0.0.0-20190808125512-07798873deee/go.mod h1:myCDvQSzCW+wB1WAlocEru4wMGJxy+vlxHdhegi1CDQ=
github.com/aliyun/alibaba-cloud-sdk-go v1.61.78 h1:9XVQI9E/JLj1tODaoZkrl/UXIdFL9WNo7Yly7iYwDFQ=
github.com/aliyun/alibaba-cloud-sdk-go v1.61.78/go.mod h1:v8ESoHo4SyHmuB4b1tJqDHxfTGEciD+yhvOU/5s1Rfk=
github.com/aliyun/aliyun-oss-go-sdk v0.0.0-20190307165228-86c17b95fcd5/go.mod h1:T/Aws4fEfogEE9v+HPhhw+CntffsBHJ8nXQCwKr0/g8=
github.com/astaxie/beego v1.12.1 h1:dfpuoxpzLVgclveAXe4PyNKqkzgm5zF4tgF2B3kkM2I=
github.com/astaxie/beego v1.12.1/go.mod h1:kPBWpSANNbSdIqOc8SUL9h+1oyBMZhROeYsXQDbidWQ=
github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f/go.mod h1:AuiFmCCPBSrqvVMvuqFuk0qogytodnVFVSN5CeJB8Gc=
github.com/beego/goyaml2 v0.0.0-20130207012346-5545475820dd/go.mod h1:1b+Y/CofkYwXMUU0OhQqGvsY2Bvgr4j6jfT699wyZKQ=
github.com/beego/x2j v0.0.0-20131220205130-a0352aadc542/go.mod h1:kSeGC/p1AbBiEp5kat81+DSQrZenVBZXklMLaELspWU=
github.com/robfig/cron v1.2.0 h1:ZjScXvvxeQ63Dbyxy76Fj3AT3Ut0aKsyd2/tl3DTMuQ=
github.com/robfig/cron v1.2.0/go.mod h1:JGuDeoQd7Z6yL4zQhZ3OPEVHB7fL6Ka6skscFHfmt2k=
github.com/bradfitz/gomemcache v0.0.0-20180710155616-bc664df96737/go.mod h1:PmM6Mmwb0LSuEubjR8N7PtNe1KxZLtOUHtbeikc5h60=
github.com/casbin/casbin v1.7.0/go.mod h1:c67qKN6Oum3UF5Q1+BByfFxkwKvhwW57ITjqwtzR1KE=
github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58/go.mod h1:EOBUe0h4xcZ5GoxqC5SDxFQ8gwyZPKQoEzownBlhI80=
@@ -54,12 +58,14 @@
github.com/go-redis/redis v6.14.2+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA=
github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
github.com/goji/httpauth v0.0.0-20160601135302-2da839ab0f4d/go.mod h1:nnjvkQ9ptGaCkuDUx6wNykzzlUixGxvkme+H/lnzb+A=
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/gomodule/redigo v2.0.0+incompatible/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4=
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
github.com/json-iterator/go v1.1.5/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
@@ -77,11 +83,14 @@
github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
github.com/mattn/go-sqlite3 v1.10.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/robfig/cron v1.2.0 h1:ZjScXvvxeQ63Dbyxy76Fj3AT3Ut0aKsyd2/tl3DTMuQ=
github.com/robfig/cron v1.2.0/go.mod h1:JGuDeoQd7Z6yL4zQhZ3OPEVHB7fL6Ka6skscFHfmt2k=
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
github.com/shiena/ansicolor v0.0.0-20151119151921-a422bbe96644 h1:X+yvsM2yrEktyI+b2qND5gpH8YhURn0k8OCaeRnkINo=
@@ -91,6 +100,7 @@
github.com/siddontang/ledisdb v0.0.0-20181029004158-becf5f38d373/go.mod h1:mF1DpOSOUiJRMR+FDqaqu3EBqrybQtrDDszLUZ6oxPg=
github.com/siddontang/rdb v0.0.0-20150307021120-fc89ed2e418d/go.mod h1:AMEsy7v5z92TR1JKMkLLoaOQk++LVnOKL3ScbJ8GNGA=
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=
github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
github.com/ssdb/gossdb v0.0.0-20180723034631-88f6b59b84ec/go.mod h1:QBvMkMya+gXctz3kmljlUCu/yB3GZ6oee+dUozsezQE=
@@ -138,6 +148,7 @@
golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190606050223-4d9ae51c2468/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
@@ -150,6 +161,7 @@
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE=
gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y=
gopkg.in/ini.v1 v1.42.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
gopkg.in/yaml.v2 v2.2.1 h1:mUhvW9EsL+naU5Q3cakzfE91YhliOondGd6ZrsDBHQE=
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
main.go
@@ -2,6 +2,7 @@
import (
    "car-service/controllers"
    "car-service/models"
    _ "car-service/routers"
    "github.com/astaxie/beego"
)
@@ -11,6 +12,7 @@
        beego.BConfig.WebConfig.DirectoryIndex = true
        beego.BConfig.WebConfig.StaticDir["/swagger"] = "swagger"
    }
    models.InitDb()
    controllers.Schedule()
    go controllers.ComputeSpaceLeftRealTime()
    beego.Run()
models/db.go
@@ -1 +1,14 @@
package models
import (
    "github.com/astaxie/beego"
    "github.com/astaxie/beego/orm"
    _ "github.com/go-sql-driver/mysql" //导入数据库驱动
)
func InitDb() {
    dbUrl := beego.AppConfig.String("dbUrl")
    _ = orm.RegisterDataBase("default", "mysql", dbUrl)
    orm.RegisterModel(new(User))
    _ = orm.RunSyncdb("default", false, true)
}
models/user.go
@@ -1,86 +1,71 @@
package models
import (
    "errors"
    "strconv"
    "time"
    "github.com/astaxie/beego/orm"
)
var (
    UserList map[string]*User
)
func init() {
    UserList = make(map[string]*User)
    u := User{"user_11111", "astaxie", "11111", Profile{"male", 20, "Singapore", "astaxie@gmail.com"}}
    UserList["user_11111"] = &u
}
type User struct {
    Id       string
    Username string
    Password string
    Profile  Profile
    Id           string         `orm:"pk;size(50);column(id)" json:"id"`
    Username     string        `orm:"size(250);column(username)" json:"username"`
    PhoneNum     string         `orm:"size(20);column(phoneNum)" json:"phoneNum"` //手机号
    Password     string        `orm:"size(50);column(password)" json:"password"`
    TrueName     string         `orm:"size(250);column(trueName)" json:"trueName"` //真实姓名
    Gender      int            `orm:"size(1);column(gender)" json:"gender"` //性别
    IdCard         string         `orm:"size(250);column(idCard)" json:"idCard"` //身份证号
    Age         int            `orm:"size(8);column(age)" json:"age"` //年龄
    Address     string        `orm:"size(200);column(address)" json:"gender"`  //地址
    Email       string        `orm:"size(200);column(email)" json:"email"` //邮箱
    IsDelete     bool         `orm:"size(1);default(0);column(isDelete)" json:"isDelete"`
}
type Profile struct {
    Gender  string
    Age     int
    Address string
    Email   string
func (u *User) TableName() string {
    return "sys_user"
}
func AddUser(u User) string {
    u.Id = "user_" + strconv.FormatInt(time.Now().UnixNano(), 10)
    UserList[u.Id] = &u
    return u.Id
}
func GetUser(uid string) (u *User, err error) {
    if u, ok := UserList[uid]; ok {
        return u, nil
func (u *User) TableUnique() [][]string {
    return [][]string {
        []string{"phoneNum"},
    }
    return nil, errors.New("User not exists")
}
func GetAllUsers() map[string]*User {
    return UserList
func (u *User) Insert() (int64,error) {
    o := orm.NewOrm()
    return o.Insert(u)
}
func UpdateUser(uid string, uu *User) (a *User, err error) {
    if u, ok := UserList[uid]; ok {
        if uu.Username != "" {
            u.Username = uu.Username
        }
        if uu.Password != "" {
            u.Password = uu.Password
        }
        if uu.Profile.Age != 0 {
            u.Profile.Age = uu.Profile.Age
        }
        if uu.Profile.Address != "" {
            u.Profile.Address = uu.Profile.Address
        }
        if uu.Profile.Gender != "" {
            u.Profile.Gender = uu.Profile.Gender
        }
        if uu.Profile.Email != "" {
            u.Profile.Email = uu.Profile.Email
        }
        return u, nil
func (u *User) SelectById(uid string) error {
    o := orm.NewOrm()
    err := o.Raw("select * from ? where id=?", u.TableName(), uid).QueryRow(u)
    return err
}
func (u *User) SelectByPhoneNum(phoneNum string) error {
    o := orm.NewOrm()
    err := o.Raw("select * from ? where phoneNum=?", u.TableName(), phoneNum).QueryRow(u)
    return err
}
func (u *User) GetAllUsers() (all []User,err error) {
    o := orm.NewOrm()
    _, err = o.Raw("select * from ?", u.TableName()).QueryRows(&all)
    if err != nil {
        return nil, err
    }
    return nil, errors.New("User Not Exist")
    return all,nil
}
func (u *User) Update() (int64, error) {
    o := orm.NewOrm()
    return o.Update(u)
}
func Login(username, password string) bool {
    for _, u := range UserList {
        if u.Username == username && u.Password == password {
            return true
        }
    }
    return false
}
func DeleteUser(uid string) {
    delete(UserList, uid)
func (u *User) DeleteById() (int64, error) {
    o := orm.NewOrm()
    return o.Update(u, "isDelete")
}
models/userCar.go
New file
@@ -0,0 +1,36 @@
package models
import "github.com/astaxie/beego/orm"
type UserCar struct {
    Id           string         `orm:"pk;size(50);column(id)" json:"id"`
    UserId         string         `orm:"column(userId)" json:"userId"` //人员id
    PlateNo     string         `orm:"column(plateNo)" json:"plateNo"` //车牌号
}
func (uc *UserCar) TableName() string {
    return "user_car"
}
func (uc *UserCar) Insert() (int64,error) {
    o := orm.NewOrm()
    return o.Insert(uc)
}
func (uc *UserCar) GetByUserId(userId string) (all []UserCar,err error) {
    o := orm.NewOrm()
    _, err = o.Raw("select * from ? where userId=?", uc.TableName(), userId).QueryRows(&all)
    if err != nil {
        return nil, err
    }
    return all,nil
}
func (uc *UserCar) DeleteByUserId(userId string) (int64, error) {
    o := orm.NewOrm()
    result, err := o.Raw("delete from ? where userId=?", uc.TableName(), userId).Exec()
    if err != nil {
        return 0, err
    }
    return result.RowsAffected()
}
routers/router.go
@@ -39,8 +39,12 @@
    //)
    //beego.AddNamespace(ns)
    //beego.Router("/basic/api/car/app/user", &controllers.UserController{})
    beego.Router("/basic/api/car/statistic", &controllers.CarController{}, "*:Statistic")
    beego.Router("/basic/api/car/spaceNo", &controllers.CarController{}, "*:SpaceNo")
    beego.Router("/basic/api/car/app/version", &controllers.AppController{}, "*:Version")
    beego.Router("/basic/api/car/restriction", &controllers.RestrictionController{}, "*:Restriction")
    preApi := "/basic/api"
    beego.Router(preApi+"/car/statistic", &controllers.CarController{}, "*:Statistic")
    beego.Router(preApi+"/car/spaceNo", &controllers.CarController{}, "*:SpaceNo")
    beego.Router(preApi+"/car/app/version", &controllers.AppController{}, "*:Version")
    beego.Router(preApi+"/car/restriction", &controllers.RestrictionController{}, "*:Restriction")
    beego.Router(preApi+"/code/new", &controllers.CodeController{}, "*:New")
    beego.Router(preApi+"/user/login", &controllers.UserController{}, "*:Login")
    beego.Router(preApi+"/user/logout", &controllers.UserController{}, "*:Logout")
}
service/userService.go
New file
@@ -0,0 +1,114 @@
package service
import (
    "car-service/cache"
    "car-service/extend/util"
    "car-service/models"
    "car-service/vo"
    "errors"
    "fmt"
    "github.com/aliyun/alibaba-cloud-sdk-go/services/dysmsapi"
    "github.com/gomodule/redigo/redis"
    "github.com/satori/go.uuid"
)
type UserService struct {
}
func (sv *UserService) Login(phoneNum, code string) (bool,*vo.UserInfo,error) {
    if verifyCode(phoneNum, code) {
        var tmpUser models.User
        if err := tmpUser.SelectByPhoneNum(phoneNum); err != nil { //用户不存在,则新增
            u := models.User{
                Id: uuid.NewV4().String(),
                PhoneNum: phoneNum,
                IsDelete: false,
            }
            if i, e := u.Insert();e ==nil && i >0 {
                return true, &vo.UserInfo{
                    UserId: u.Id,
                    PhoneNum: phoneNum,
                    PlateNos: []string{},
                }, nil
            } else {
                return false, nil, errors.New("注册失败")
            }
        } else { //用户已存在
            var userCar models.UserCar
            var plateNos []string
            all, e := userCar.GetByUserId(tmpUser.Id)
            if e == nil && all != nil {
                for _,up := range all {
                    plateNos = append(plateNos, up.PlateNo)
                }
            }
            return true, &vo.UserInfo{
                UserId: tmpUser.Id,
                PhoneNum: phoneNum,
                PlateNos: plateNos,
            }, nil
        }
    } else {
        return false,nil, errors.New("验证码错误")
    }
}
func NewVerifyCode(phoneNum string) error {
    regionId := "cn-hangzhou"
    accessKeyId := "LTAIkHFaStA1JKk5"
    AccessSecret := "oE7LhSqBWWUBzV0B7l1G9aVmgHPddM"
    client, err := dysmsapi.NewClientWithAccessKey(regionId, accessKeyId, AccessSecret)
    if err != nil {
        return errors.New("短信服务器出错,请联系管理员")
    }
    verifyCode := util.GenValidateCode(6)
    request := dysmsapi.CreateSendSmsRequest()
    request.Scheme = "https"
    request.SignName = "贝思科"
    request.TemplateCode = "SMS_186578313"
    request.PhoneNumbers = phoneNum
    request.TemplateParam = "{\"code\":"+verifyCode+"}"
    response, err := client.SendSms(request)
    fmt.Println("sendSms err:", err)
    if err != nil {
        return errors.New("发送短信验证码失败,请联系管理员")
    }
    go add2Cache(phoneNum, verifyCode)
    fmt.Println("send sms resp:", response)
    return nil
}
func verifyCode(phoneNum string, cod string) bool {
    if b,r := existCode(phoneNum);b && r == cod {
        return true
    } else {
        fmt.Println("verifyCode false,cod:",cod, "r:",r,"b:",b)
    }
    return false
}
func add2Cache(phoneNum string, code string) {
    //写到redis缓存中
    c := cache.Get()
    defer c.Close()
    reply, err := c.Do("SET", phoneNum, code, "EX", 5 * 60)//超时五分钟
    if err != nil {
        fmt.Println("写入redis失败")
    } else {
        fmt.Println("写入redis成功,reply:", reply)
    }
}
func existCode(phoneNum string) (bool,string) {
    c := cache.Get()
    defer c.Close()
    r, err := redis.String(c.Do("GET", phoneNum))
    if err != nil {
        fmt.Println("existCode err:", err)
        return false,""
    }
    return true,r
}
vo/user.go
New file
@@ -0,0 +1,8 @@
package vo
type UserInfo struct {
    UserId         string         `json:"userId"`
    PhoneNum     string         `json:"phoneNum"`
    TrueName     string         `json:"trueName"`
    PlateNos    []string     `json:"plateNos"`
}