From 167f00c02df35f19d689e60db3d30ebf035ab629 Mon Sep 17 00:00:00 2001
From: liuxiaolong <liuxiaolong@aiotlink.com>
Date: 星期一, 29 六月 2020 17:02:02 +0800
Subject: [PATCH] add user and userCar

---
 controllers/user.go    |   90 +++-------
 vo/user.go             |    8 +
 cache/redis.go         |   26 +++
 controllers/code.go    |   37 ++++
 go.mod                 |    1 
 service/userService.go |  114 ++++++++++++++
 models/user.go         |  111 ++++++-------
 conf/app.conf          |    5 
 go.sum                 |   16 +
 routers/router.go      |   12 +
 models/userCar.go      |   36 ++++
 models/db.go           |   13 +
 main.go                |    2 
 13 files changed, 342 insertions(+), 129 deletions(-)

diff --git a/cache/redis.go b/cache/redis.go
new file mode 100644
index 0000000..9598272
--- /dev/null
+++ b/cache/redis.go
@@ -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()
+}
\ No newline at end of file
diff --git a/conf/app.conf b/conf/app.conf
index 0f511aa..8ccddc0 100644
--- a/conf/app.conf
+++ b/conf/app.conf
@@ -15,4 +15,7 @@
 pushAppSecret =聽gui4KFqXDv8LWKR57NKfS5
 pushMasterSecret = vFiErCTBqqAcufPzB0Tl45
 pushPackageName = uni.UNIEDF0B5C
-pushBaseUrl = https://restapi.getui.com/v2/
\ No newline at end of file
+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
\ No newline at end of file
diff --git a/controllers/code.go b/controllers/code.go
new file mode 100644
index 0000000..5319d49
--- /dev/null
+++ b/controllers/code.go
@@ -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()
+}
+
diff --git a/controllers/user.go b/controllers/user.go
index 4fb7558..05a46fa 100644
--- a/controllers/user.go
+++ b/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()
 }
 
diff --git a/go.mod b/go.mod
index a9742c0..b16c2de 100644
--- a/go.mod
+++ b/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
 )
diff --git a/go.sum b/go.sum
index 1751cd9..df1b18b 100644
--- a/go.sum
+++ b/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=
diff --git a/main.go b/main.go
index 2acffc9..7679f46 100644
--- a/main.go
+++ b/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()
diff --git a/models/db.go b/models/db.go
index 2640e7f..f4be3a1 100644
--- a/models/db.go
+++ b/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)
+}
diff --git a/models/user.go b/models/user.go
index d4bebb2..5e2e8f0 100644
--- a/models/user.go
+++ b/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")
 }
diff --git a/models/userCar.go b/models/userCar.go
new file mode 100644
index 0000000..598e613
--- /dev/null
+++ b/models/userCar.go
@@ -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()
+}
\ No newline at end of file
diff --git a/routers/router.go b/routers/router.go
index 5a9a84c..e2e6f18 100644
--- a/routers/router.go
+++ b/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")
 }
diff --git a/service/userService.go b/service/userService.go
new file mode 100644
index 0000000..665820b
--- /dev/null
+++ b/service/userService.go
@@ -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
+}
\ No newline at end of file
diff --git a/vo/user.go b/vo/user.go
new file mode 100644
index 0000000..dd04367
--- /dev/null
+++ b/vo/user.go
@@ -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"`
+}
\ No newline at end of file

--
Gitblit v1.8.0