zjxpcyc 6 vuotta sitten
vanhempi
commit
3c390742fc

+ 1
- 1
conf/db.conf Näytä tiedosto

@@ -6,7 +6,7 @@ con_protocol = tcp
6 6
 
7 7
 ; 数据库地址,可以使用IP
8 8
 # db_addr      = 192.168.0.122
9
-db_addr      = localhost
9
+db_addr      = 192.168.0.122
10 10
 
11 11
 ; 端口
12 12
 db_port      = 3306

+ 0
- 1
controllers/base.go Näytä tiedosto

@@ -77,7 +77,6 @@ func (c *BaseController) ResponseData(data interface{}, msg interface{}, code in
77 77
 	}
78 78
 
79 79
 	c.destroyContext(status < http.StatusMultipleChoices)
80
-
81 80
 	c.crosPolicy()
82 81
 	c.ServeJSON()
83 82
 	c.StopRun()

+ 1
- 1
controllers/card/card.go Näytä tiedosto

@@ -169,5 +169,5 @@ func (c *CardController) GiveCard() {
169 169
 
170 170
 // GetCardWithCustomer 获取卡及领取信息
171 171
 func (c *CardController) GetCardWithCustomer() {
172
-
172
+	c.ResponseJSON("ok")
173 173
 }

+ 2
- 6
controllers/customer/customer.go Näytä tiedosto

@@ -82,13 +82,11 @@ func (c *CustomerController) SignIn() {
82 82
 		}
83 83
 	}
84 84
 	userMapping := c.Context.Get("userMap").(model.TaUserMapping)
85
-	cust, err := c.serv.BindWechatUser(&userMapping, phone)
85
+	_, err := c.serv.BindWechatUser(&userMapping, phone)
86 86
 	if err != nil {
87 87
 		c.ResponseError(err)
88 88
 	}
89 89
 
90
-	c.SetSession(controllers.SNCustID, cust.CustomerId)
91
-
92 90
 	c.ResponseJSON("ok")
93 91
 }
94 92
 
@@ -111,13 +109,11 @@ func (c *CustomerController) SignUp() {
111 109
 
112 110
 	userMapping := c.Context.Get("userMap").(model.TaUserMapping)
113 111
 
114
-	cust, err := c.serv.BindWechatCust(&userMapping, phone, csID, arID)
112
+	_, err := c.serv.BindWechatCust(&userMapping, phone, csID, arID)
115 113
 	if err != nil {
116 114
 		c.ResponseError(err)
117 115
 	}
118 116
 
119
-	c.SetSession(controllers.SNCustID, cust.CustomerId)
120
-
121 117
 	c.ResponseJSON("ok")
122 118
 }
123 119
 

+ 2
- 0
controllers/file.go Näytä tiedosto

@@ -67,5 +67,7 @@ func (c *BaseController) SaveToExcel(fn string, excel *utils.TinyXLSXEngine) {
67 67
 
68 68
 	r := bytes.NewReader(buf.Bytes())
69 69
 	http.ServeContent(c.Ctx.ResponseWriter, c.Ctx.Request, fn, time.Now().Local(), r)
70
+
71
+	c.destroyContext(true)
70 72
 	c.StopRun()
71 73
 }

+ 0
- 13
controllers/session.go Näytä tiedosto

@@ -1,13 +0,0 @@
1
-package controllers
2
-
3
-// session key 列表
4
-const (
5
-	// 用户ID
6
-	SNUserID = "userid"
7
-
8
-	// 客户ID
9
-	SNCustID = "custid"
10
-
11
-	// 内置 wechat_user
12
-	// 请勿使用 wechat_user 作为 session 的key
13
-)

+ 63
- 0
controllers/wechat.go Näytä tiedosto

@@ -0,0 +1,63 @@
1
+package controllers
2
+
3
+import (
4
+	"errors"
5
+	"net/url"
6
+	"spaceofcheng/services/models/model"
7
+	"spaceofcheng/services/utils"
8
+)
9
+
10
+// GetWxJsSDKSignature 获取 微信 jssdk 签名
11
+func (c *BaseController) GetWxJsSDKSignature() {
12
+	org := c.Context.Get("org").(model.SysOrg)
13
+	url, _ := url.QueryUnescape(c.GetString("url"))
14
+
15
+	cli := utils.WxClientFor(org.OrgId)
16
+	if cli == nil {
17
+		c.ResponseError(errors.New("初始化微信服务失败"))
18
+	}
19
+
20
+	res := cli.GetJsTicketSignature(url)
21
+	c.ResponseJSON(res)
22
+}
23
+
24
+// MiniLogin 获取小程序 OPENID
25
+func (c *BaseController) MiniLogin() {
26
+	org := c.Context.Get("org").(model.SysOrg)
27
+	code := c.GetString("code")
28
+
29
+	cli := utils.MiniClientFor(org.OrgId)
30
+	if cli == nil {
31
+		c.ResponseError(errors.New("初始化小程序服务失败"))
32
+	}
33
+
34
+	res, err := cli.GetOpenID(code)
35
+	if err != nil {
36
+		utils.LogError("获取用户信息失败: " + err.Error())
37
+		c.ResponseError(errors.New("获取用户信息失败"))
38
+	}
39
+
40
+	c.ResponseJSON(res)
41
+}
42
+
43
+// DecodeMiniData 解密小程序信息
44
+func (c *BaseController) DecodeMiniData() {
45
+	org := c.Context.Get("org").(model.SysOrg)
46
+
47
+	cli := utils.MiniClientFor(org.OrgId)
48
+	if cli == nil {
49
+		c.ResponseError(errors.New("初始化小程序服务失败"))
50
+	}
51
+
52
+	data := c.GetString("encrypted_data")
53
+	key := c.GetString("session_key")
54
+	iv := c.GetString("iv")
55
+
56
+	res, err := cli.GetUserFromEncryptData(data, key, iv)
57
+	if err != nil {
58
+		utils.LogError("解密用户信息失败: " + err.Error())
59
+		c.ResponseError(errors.New("解密用户信息失败"))
60
+	}
61
+
62
+	c.ResponseJSON(res)
63
+}

+ 23
- 3309
log/common.log
File diff suppressed because it is too large
Näytä tiedosto


+ 1
- 1
models/models.go Näytä tiedosto

@@ -20,7 +20,7 @@ func NewDBEngine() *xorm.Engine {
20 20
 	dns := getMySQLDNS()
21 21
 
22 22
 	engine, err := xorm.NewEngine(dbType, dns)
23
-	// dao.ShowSQL()
23
+	// engine.ShowSQL()
24 24
 
25 25
 	if err != nil {
26 26
 		panic(err)

+ 68
- 56
models/sys.go Näytä tiedosto

@@ -3,33 +3,16 @@ package models
3 3
 import (
4 4
 	"errors"
5 5
 	"spaceofcheng/services/models/model"
6
-	"spaceofcheng/services/utils"
7 6
 	"time"
8 7
 
9 8
 	"github.com/yl10/kit/guid"
10
-
11
-	"github.com/go-xorm/xorm"
12 9
 )
13 10
 
14
-// SysDAO 系统
15
-type SysDAO struct {
16
-	ctx *utils.Context
17
-	db  *xorm.Session
18
-}
19
-
20
-// NewSysDAO New Inst
21
-func NewSysDAO(ctx *utils.Context) *SysDAO {
22
-	return &SysDAO{
23
-		ctx: ctx,
24
-		db:  ctx.DB,
25
-	}
26
-}
27
-
28 11
 // GetPureUserInfo 获取用户基本信息
29
-func (m *SysDAO) GetPureUserInfo(id string) (*model.SysUser, error) {
12
+func GetPureUserInfo(id string) (*model.SysUser, error) {
30 13
 	user := model.SysUser{}
31 14
 
32
-	has, err := m.db.Where("user_id=?", id).Get(&user)
15
+	has, err := DBEngine.Where("user_id=?", id).Get(&user)
33 16
 	if err != nil {
34 17
 		return nil, err
35 18
 	}
@@ -46,7 +29,7 @@ func (m *SysDAO) GetPureUserInfo(id string) (*model.SysUser, error) {
46 29
 }
47 30
 
48 31
 // GetUserMenu 获取用户菜单
49
-func (m *SysDAO) GetUserMenu(userID string) ([]model.SysMenu, error) {
32
+func GetUserMenu(userID string) ([]model.SysMenu, error) {
50 33
 	query := `
51 34
 		SELECT t.*
52 35
 		FROM sys_menu t
@@ -57,7 +40,7 @@ func (m *SysDAO) GetUserMenu(userID string) ([]model.SysMenu, error) {
57 40
 	`
58 41
 
59 42
 	var menus []model.SysMenu
60
-	if err := m.db.SQL(query, userID, STATUS_NORMAL).Find(&menus); err != nil {
43
+	if err := DBEngine.SQL(query, userID, STATUS_NORMAL).Find(&menus); err != nil {
61 44
 		return nil, err
62 45
 	}
63 46
 
@@ -65,7 +48,7 @@ func (m *SysDAO) GetUserMenu(userID string) ([]model.SysMenu, error) {
65 48
 }
66 49
 
67 50
 // GetUserCase 获取用户案场
68
-func (m *SysDAO) GetUserCase(userID string) ([]model.SysUserCase, error) {
51
+func GetUserCase(userID string) ([]model.SysUserCase, error) {
69 52
 	query := `
70 53
 		SELECT t.*
71 54
 		FROM sys_user_case t
@@ -74,7 +57,7 @@ func (m *SysDAO) GetUserCase(userID string) ([]model.SysUserCase, error) {
74 57
 	`
75 58
 
76 59
 	var cases []model.SysUserCase
77
-	if err := m.db.SQL(query, userID, STATUS_NORMAL).Find(&cases); err != nil {
60
+	if err := DBEngine.SQL(query, userID, STATUS_NORMAL).Find(&cases); err != nil {
78 61
 		return nil, err
79 62
 	}
80 63
 
@@ -82,9 +65,9 @@ func (m *SysDAO) GetUserCase(userID string) ([]model.SysUserCase, error) {
82 65
 }
83 66
 
84 67
 // GetOrg 获取机构信息
85
-func (m *SysDAO) GetOrg(orgID string) (*model.SysOrg, error) {
68
+func GetOrg(orgID string) (*model.SysOrg, error) {
86 69
 	var org model.SysOrg
87
-	has, err := m.db.Where("org_id=?", orgID).And("status=?", STATUS_NORMAL).Get(&org)
70
+	has, err := DBEngine.Where("org_id=?", orgID).And("status=?", STATUS_NORMAL).Get(&org)
88 71
 	if err != nil {
89 72
 		return nil, err
90 73
 	}
@@ -98,10 +81,10 @@ func (m *SysDAO) GetOrg(orgID string) (*model.SysOrg, error) {
98 81
 
99 82
 // GetCustomer 获取用户信息
100 83
 // 暂时无法解决 一个用户 多组织架构的问题
101
-func (m *SysDAO) GetCustomer(custID string) (*model.TaCustomer, error) {
84
+func GetCustomer(custID string) (*model.TaCustomer, error) {
102 85
 	var cust model.TaCustomer
103 86
 
104
-	has, err := m.db.Where("customer_id=?", custID).And("status=?", STATUS_NORMAL).Get(&cust)
87
+	has, err := DBEngine.Where("customer_id=?", custID).And("status=?", STATUS_NORMAL).Get(&cust)
105 88
 	if err != nil {
106 89
 		return nil, err
107 90
 	}
@@ -114,19 +97,19 @@ func (m *SysDAO) GetCustomer(custID string) (*model.TaCustomer, error) {
114 97
 }
115 98
 
116 99
 // GetUserMappingByOpenID 获取用户映射信息
117
-func (m *SysDAO) GetUserMappingByOpenID(openID string) ([]model.TaUserMapping, error) {
100
+func GetUserMappingByOpenID(openID string) ([]model.TaUserMapping, error) {
118 101
 	var users []model.TaUserMapping
119 102
 
120
-	err := m.db.Where("openid=?", openID).Find(&users)
103
+	err := DBEngine.Where("openid=?", openID).Find(&users)
121 104
 	return users, err
122 105
 }
123 106
 
124
-// UpdateUserMapping 保存用户映射信息
125
-func (m *SysDAO) UpdateUserMapping(user *model.TaUserMapping) error {
107
+// EditUserMapping 保存用户映射信息
108
+func EditUserMapping(user *model.TaUserMapping) error {
126 109
 	// 如果没有映射ID, 则新增记录
127 110
 	if user.MappingId == "" {
128 111
 		user.MappingId = guid.NewGUIDString()
129
-		_, err := m.db.Insert(user)
112
+		_, err := DBEngine.Insert(user)
130 113
 		return err
131 114
 	}
132 115
 
@@ -134,33 +117,18 @@ func (m *SysDAO) UpdateUserMapping(user *model.TaUserMapping) error {
134 117
 	cols := []string{
135 118
 		"account_info",
136 119
 	}
137
-	_, err := m.db.Cols(cols...).
120
+	_, err := DBEngine.Cols(cols...).
138 121
 		Where("account_type=?", user.AccountType).
139 122
 		And("openid=?", user.Openid).
140 123
 		Update(user)
141 124
 	return err
142 125
 }
143 126
 
144
-// GetCaseByContext 获取案场
145
-func GetCaseByContext(ctx *utils.Context) (string, error) {
146
-	csRaw := ctx.Get("currentCase")
147
-	if csRaw == nil {
148
-		return "", errors.New("当前人员无案场权限")
149
-	}
150
-
151
-	cs := csRaw.(model.SysUserCase)
152
-	if cs.CaseId == "" || cs.Status == STATUS_DEL {
153
-		return "", errors.New("当前人员无案场权限")
154
-	}
155
-
156
-	return cs.CaseId, nil
157
-}
158
-
159 127
 // GetWeChatConfig 获取微信配置
160
-func (m *SysDAO) GetWeChatConfig(org string) (*model.SysWechatConf, error) {
128
+func GetWeChatConfig(org, cliType string) (*model.SysWechatConf, error) {
161 129
 	conf := new(model.SysWechatConf)
162 130
 
163
-	if _, err := m.db.Where("org_id=?", org).And("type=?", WECHAT_WX).Get(conf); err != nil {
131
+	if _, err := DBEngine.Where("org_id=?", org).And("type=?", cliType).Get(conf); err != nil {
164 132
 		return nil, err
165 133
 	}
166 134
 
@@ -168,14 +136,14 @@ func (m *SysDAO) GetWeChatConfig(org string) (*model.SysWechatConf, error) {
168 136
 }
169 137
 
170 138
 // InsertToken 插入 token 生成记录
171
-func (m *SysDAO) InsertToken(token string) error {
139
+func InsertToken(token string) error {
172 140
 	tk := model.SysTokenLog{
173 141
 		Token:      token,
174 142
 		Status:     STATUS_NORMAL,
175 143
 		CreateDate: time.Now().Local(),
176 144
 	}
177 145
 
178
-	if _, err := m.db.Insert(&tk); err != nil {
146
+	if _, err := DBEngine.Insert(&tk); err != nil {
179 147
 		return err
180 148
 	}
181 149
 
@@ -183,12 +151,12 @@ func (m *SysDAO) InsertToken(token string) error {
183 151
 }
184 152
 
185 153
 // UpdateTokenExpire 设置 token 过期
186
-func (m *SysDAO) UpdateTokenExpire(token string) error {
154
+func UpdateTokenExpire(token string) error {
187 155
 	tk := model.SysTokenLog{
188 156
 		Status: STATUS_DEL,
189 157
 	}
190 158
 
191
-	if _, err := m.db.Cols("status").Where("token=?", token).Update(&tk); err != nil {
159
+	if _, err := DBEngine.Cols("status").Where("token=?", token).Update(&tk); err != nil {
192 160
 		return err
193 161
 	}
194 162
 
@@ -196,12 +164,56 @@ func (m *SysDAO) UpdateTokenExpire(token string) error {
196 164
 }
197 165
 
198 166
 // GetToken 获取 token
199
-func (m *SysDAO) GetToken(token string) (*model.SysTokenLog, error) {
167
+func GetToken(token string) (*model.SysTokenLog, error) {
200 168
 	tk := model.SysTokenLog{}
201 169
 
202
-	if _, err := m.db.Where("token=?", token).Get(&tk); err != nil {
170
+	if _, err := DBEngine.Where("token=?", token).Get(&tk); err != nil {
203 171
 		return nil, err
204 172
 	}
205 173
 
206 174
 	return &tk, nil
207 175
 }
176
+
177
+// GetCustomerByID 依据ID获取客户
178
+func GetCustomerByID(id string) (*model.TaCustomer, error) {
179
+	cust := new(model.TaCustomer)
180
+
181
+	if _, err := DBEngine.Where("customer_id=?", id).Get(cust); err != nil {
182
+		return nil, err
183
+	}
184
+
185
+	return cust, nil
186
+}
187
+
188
+func SaveCustomer(cust *model.TaCustomer) error {
189
+	cust.CustomerId = guid.NewGUIDString()
190
+	cust.CreateDate = time.Now().Local()
191
+	cust.Status = STATUS_NORMAL
192
+
193
+	_, err := DBEngine.Insert(cust)
194
+	return err
195
+}
196
+
197
+// SaveAccount 保存账户信息
198
+func SaveAccount(account *model.TaCustomerAccount) error {
199
+	if account.CustomerId == "" {
200
+		return errors.New("账户未关联人员")
201
+	}
202
+
203
+	account.Status = STATUS_NORMAL
204
+	account.CreateDate = time.Now().Local()
205
+	account.AccountId = guid.NewGUIDString()
206
+
207
+	_, err := DBEngine.Insert(account)
208
+	return err
209
+}
210
+
211
+// UpdateUserMapping 更新用户映射
212
+func UpdateUserMapping(userMap *model.TaUserMapping, cols []string) error {
213
+	if userMap.MappingId == "" {
214
+		return errors.New("用户映射信息不存在")
215
+	}
216
+
217
+	_, err := DBEngine.Where("mapping_id=?", userMap.MappingId).Cols(cols...).Update(userMap)
218
+	return err
219
+}

+ 6
- 0
routers/guest.go Näytä tiedosto

@@ -50,6 +50,12 @@ func getGuestRoutes() beego.LinkNamespace {
50 50
 		// 登录
51 51
 		beego.NSRouter("/signin", &user.UserController{}, "post:SignIn"),
52 52
 
53
+		// 微信
54
+		// js sdk 签名
55
+		beego.NSRouter("/wechat/jssdk/signature", &controllers.BaseController{}, "get:GetWxJsSDKSignature"),
56
+		beego.NSRouter("/wechat/mini/login", &controllers.BaseController{}, "post:MiniLogin"),
57
+		beego.NSRouter("/wechat/mini/decodedata", &controllers.BaseController{}, "post:DecodeMiniData"),
58
+
53 59
 		beego.NSRouter("/websocket/:grps/:id", &controllers.BaseController{}, "get:Ws"),
54 60
 	)
55 61
 }

+ 57
- 76
service/sys.go Näytä tiedosto

@@ -5,7 +5,6 @@ import (
5 5
 	"errors"
6 6
 	"net/http"
7 7
 	"spaceofcheng/services/models"
8
-	"spaceofcheng/services/models/customer"
9 8
 	"spaceofcheng/services/models/model"
10 9
 	"spaceofcheng/services/utils"
11 10
 	"strings"
@@ -21,18 +20,14 @@ const (
21 20
 
22 21
 // SysServ 系统处理
23 22
 type SysServ struct {
24
-	org         model.SysOrg
25
-	ctx         *utils.Context
26
-	dao         *models.SysDAO
27
-	customerdao *customer.CustomerDAO
23
+	org model.SysOrg
24
+	ctx *utils.Context
28 25
 }
29 26
 
30 27
 // NewSysServ 初始化
31 28
 func NewSysServ(ctx *utils.Context) *SysServ {
32 29
 	return &SysServ{
33
-		ctx:         ctx,
34
-		dao:         models.NewSysDAO(ctx),
35
-		customerdao: customer.NewCustomerDAO(ctx),
30
+		ctx: ctx,
36 31
 	}
37 32
 }
38 33
 
@@ -68,6 +63,11 @@ func (s *SysServ) AuthAndInitCtx(gctx *context.Context) map[string]interface{} {
68 63
 		return s.authWechat(gctx)
69 64
 	}
70 65
 
66
+	// 小程序 端
67
+	if clientType == utils.ClientMini {
68
+		return s.authMini(gctx)
69
+	}
70
+
71 71
 	return map[string]interface{}{
72 72
 		"code":  http.StatusBadRequest,
73 73
 		"error": errors.New("暂无该客户端的 API"),
@@ -111,7 +111,7 @@ func (s *SysServ) NewToken() string {
111 111
 
112 112
 	// 入库
113 113
 	if !token.Guest {
114
-		if err := s.dao.InsertToken(tokenEncodeStr); err != nil {
114
+		if err := models.InsertToken(tokenEncodeStr); err != nil {
115 115
 			utils.LogError("入库 Token 失败: " + err.Error())
116 116
 			return tokenEncodeStr
117 117
 		}
@@ -163,11 +163,11 @@ func (s *SysServ) authWechat(gctx *context.Context) map[string]interface{} {
163 163
 	} else {
164 164
 		// 初始化微信配置
165 165
 		if err := s.initWechatClient(s.org.OrgId); err != nil {
166
-			utils.LogError("初始化微信客户端失败: " + err.Error())
166
+			utils.LogError("初始化微信服务失败: " + err.Error())
167 167
 
168 168
 			return map[string]interface{}{
169 169
 				"code":  http.StatusInternalServerError,
170
-				"error": errors.New("初始化微信客户端失败"),
170
+				"error": errors.New("初始化微信服务失败"),
171 171
 			}
172 172
 		}
173 173
 
@@ -223,7 +223,7 @@ func (s *SysServ) authWechat(gctx *context.Context) map[string]interface{} {
223 223
 	}
224 224
 
225 225
 	// 查询数据库是否存在已有映射
226
-	userMapList, err := s.dao.GetUserMappingByOpenID(openID)
226
+	userMapList, err := models.GetUserMappingByOpenID(openID)
227 227
 	if err != nil {
228 228
 		utils.LogError("校验人员失败: " + err.Error())
229 229
 		return map[string]interface{}{
@@ -267,7 +267,7 @@ func (s *SysServ) authWechat(gctx *context.Context) map[string]interface{} {
267 267
 	}
268 268
 
269 269
 	// 更新映射信息, 没有的话则插入
270
-	err = s.dao.UpdateUserMapping(userMapping)
270
+	err = models.EditUserMapping(userMapping)
271 271
 	if err != nil {
272 272
 		utils.LogError("保存用户映射信息失败: " + err.Error())
273 273
 		return map[string]interface{}{
@@ -294,7 +294,7 @@ func (s *SysServ) authWechat(gctx *context.Context) map[string]interface{} {
294 294
 			}
295 295
 		}
296 296
 	} else {
297
-		cust, err = s.customerdao.GetCustomerByID(userMapping.UserId)
297
+		cust, err = models.GetCustomerByID(userMapping.UserId)
298 298
 		if err != nil {
299 299
 			utils.LogError("查询用户信息失败: " + err.Error())
300 300
 			return map[string]interface{}{
@@ -317,6 +317,20 @@ func (s *SysServ) authWechat(gctx *context.Context) map[string]interface{} {
317 317
 	return nil
318 318
 }
319 319
 
320
+// 小程序端暂时无人员或者其他业务要求
321
+func (s *SysServ) authMini(gctx *context.Context) map[string]interface{} {
322
+	if err := s.initMiniClient(s.org.OrgId); err != nil {
323
+		utils.LogError("初始化小程序服务失败: " + err.Error())
324
+
325
+		return map[string]interface{}{
326
+			"code":  http.StatusInternalServerError,
327
+			"error": errors.New("初始化小程序服务失败"),
328
+		}
329
+	}
330
+
331
+	return nil
332
+}
333
+
320 334
 // wechartSignIn 使用 code 微信登录
321 335
 func (s *SysServ) wechartSignIn(gctx *context.Context, code string) (*utils.WechatUser, error) {
322 336
 	// 获取 微信信息
@@ -349,7 +363,7 @@ func (s *SysServ) getToken(gctx *context.Context) (*utils.JWTToken, error) {
349 363
 	}
350 364
 
351 365
 	// 校验 token
352
-	tk, err := s.dao.GetToken(tokenEnStr)
366
+	tk, err := models.GetToken(tokenEnStr)
353 367
 	if err != nil {
354 368
 		utils.LogError("查询 Token 失败: " + err.Error())
355 369
 		return nil, errors.New("校验Token失败或已过期")
@@ -365,7 +379,7 @@ func (s *SysServ) getToken(gctx *context.Context) (*utils.JWTToken, error) {
365 379
 // UpdateTokenExpire 更新 token 为过期
366 380
 // 如果发生错误, 此处选择忽略
367 381
 func (s *SysServ) UpdateTokenExpire(token string) {
368
-	if err := s.dao.UpdateTokenExpire(token); err != nil {
382
+	if err := models.UpdateTokenExpire(token); err != nil {
369 383
 		utils.LogError("更新 Token 过期失败: " + err.Error())
370 384
 	}
371 385
 }
@@ -384,13 +398,13 @@ func (s *SysServ) needAuth(gctx *context.Context) bool {
384 398
 
385 399
 // SetUserProfile 设置用户信息
386 400
 func (s *SysServ) SetUserProfile(id string) error {
387
-	user, err := s.dao.GetPureUserInfo(id)
401
+	user, err := models.GetPureUserInfo(id)
388 402
 	if err != nil {
389 403
 		return utils.LogError("获取用户基本信息失败: " + err.Error())
390 404
 	}
391 405
 	s.ctx.Set("user", *user)
392 406
 
393
-	cases, err := s.dao.GetUserCase(id)
407
+	cases, err := models.GetUserCase(id)
394 408
 	if err != nil {
395 409
 		return utils.LogError("获取用户案场信息失败: " + err.Error())
396 410
 	}
@@ -421,7 +435,7 @@ func (s *SysServ) saveNewCustomer(wxUser *utils.WechatUser, userMap *model.TaUse
421 435
 		OrgId:        s.org.OrgId,
422 436
 	}
423 437
 
424
-	if err := s.customerdao.SaveCustomer(&cust); err != nil {
438
+	if err := models.SaveCustomer(&cust); err != nil {
425 439
 		utils.LogError("更新客户信息失败: " + err.Error())
426 440
 		return nil, errors.New("更新客户信息失败")
427 441
 	}
@@ -435,14 +449,14 @@ func (s *SysServ) saveNewCustomer(wxUser *utils.WechatUser, userMap *model.TaUse
435 449
 	account.PayedAmount = "0"
436 450
 	account.PayedPoints = "0"
437 451
 
438
-	if err := s.customerdao.SaveAccount(account); err != nil {
452
+	if err := models.SaveAccount(account); err != nil {
439 453
 		utils.LogError("插入账户信息失败: " + err.Error())
440 454
 		return nil, errors.New("更新客户信息失败")
441 455
 	}
442 456
 
443 457
 	// 更新映射表信息
444 458
 	userMap.UserId = cust.CustomerId
445
-	if err := s.customerdao.UpdateUserMapping(userMap, []string{"user_id"}); err != nil {
459
+	if err := models.UpdateUserMapping(userMap, []string{"user_id"}); err != nil {
446 460
 		utils.LogError("更新用户映射信息失败:" + err.Error())
447 461
 		return nil, errors.New("映射用户信息失败")
448 462
 	}
@@ -450,62 +464,9 @@ func (s *SysServ) saveNewCustomer(wxUser *utils.WechatUser, userMap *model.TaUse
450 464
 	return &cust, nil
451 465
 }
452 466
 
453
-// CheckWechatUserMapping 校验并更新客户信息
454
-// 如果不存在, 则插入新数据
455
-func (s *SysServ) CheckWechatUserMapping(user map[string]interface{}) (*model.TaUserMapping, error) {
456
-	openID := user["openid"].(string)
457
-
458
-	uuID := ""
459
-	uuidRaw, ok := user["unionid"]
460
-	if ok {
461
-		uuID = uuidRaw.(string)
462
-	}
463
-
464
-	accountRaw, err := json.Marshal(user)
465
-	if err != nil {
466
-		return nil, err
467
-	}
468
-	account := string(accountRaw)
469
-
470
-	userMapping := model.TaUserMapping{
471
-		AccountType: models.ACCMAP_WECHAT,
472
-		Openid:      openID,
473
-		Uuid:        uuID,
474
-		AccountInfo: account,
475
-	}
476
-
477
-	// 查询数据库是否存在已有映射
478
-	userMapList, err := s.dao.GetUserMappingByOpenID(openID)
479
-
480
-	if err != nil {
481
-		return nil, err
482
-	}
483
-
484
-	// 如果存在
485
-	if len(userMapList) > 0 {
486
-		for _, um := range userMapList {
487
-			if userMapping.Openid == um.Openid &&
488
-				userMapping.AccountType == um.AccountType {
489
-				userMapping.UserId = um.UserId
490
-
491
-				// 存在的用户, 使用 ID 作为检查条件去更新
492
-				userMapping.MappingId = um.MappingId
493
-			}
494
-		}
495
-	}
496
-
497
-	// 更新数据库内容, 没有的话则插入
498
-	err = s.dao.UpdateUserMapping(&userMapping)
499
-	if err != nil {
500
-		return nil, err
501
-	}
502
-
503
-	return &userMapping, nil
504
-}
505
-
506 467
 // initWechatClient 初始化微信客户端
507 468
 func (s *SysServ) initWechatClient(orgID string) error {
508
-	conf, err := s.dao.GetWeChatConfig(orgID)
469
+	conf, err := models.GetWeChatConfig(orgID, models.WECHAT_WX)
509 470
 	if err != nil {
510 471
 		utils.LogError("获取微信配置失败: " + err.Error())
511 472
 		return errors.New("获取微信配置失败")
@@ -527,11 +488,31 @@ func (s *SysServ) initWechatClient(orgID string) error {
527 488
 	return nil
528 489
 }
529 490
 
491
+func (s *SysServ) initMiniClient(orgID string) error {
492
+	conf, err := models.GetWeChatConfig(orgID, models.WECHAT_MINI)
493
+	if err != nil {
494
+		utils.LogError("获取小程序配置失败: " + err.Error())
495
+		return errors.New("获取小程序配置失败")
496
+	}
497
+
498
+	if conf == nil || conf.ConfId == "" {
499
+		return errors.New("未找到小程序配置")
500
+	}
501
+
502
+	cert := map[string]string{
503
+		"appid":  conf.Appid,
504
+		"secret": conf.Secret,
505
+	}
506
+
507
+	utils.MiniClientSingleton(orgID, cert)
508
+	return nil
509
+}
510
+
530 511
 // SetOrgByID 获取组织
531 512
 func (s *SysServ) SetOrgByID(orgID string) error {
532 513
 	orgID = utils.DecodeBase64NoTail(orgID)
533 514
 
534
-	org, err := s.dao.GetOrg(orgID)
515
+	org, err := models.GetOrg(orgID)
535 516
 	if err != nil {
536 517
 		utils.LogError("获取组织信息失败: " + err.Error())
537 518
 		return errors.New("获取组织信息失败")

+ 21
- 0
utils/wechat.go Näytä tiedosto

@@ -1,10 +1,12 @@
1 1
 package utils
2 2
 
3 3
 import (
4
+	"github.com/zjxpcyc/wechat/mini"
4 5
 	"github.com/zjxpcyc/wechat/wx"
5 6
 )
6 7
 
7 8
 var wxClients map[string]*wx.Client
9
+var miniClients map[string]*mini.Client
8 10
 
9 11
 type WechatUser struct {
10 12
 	OpenID     string  `json:"openid"`
@@ -30,11 +32,29 @@ func WxClientSingleton(org string, cert map[string]string) {
30 32
 	}
31 33
 }
32 34
 
35
+// MiniClientSingleton 初始化
36
+func MiniClientSingleton(org string, cert map[string]string) {
37
+	if miniClients == nil {
38
+		miniClients = map[string]*mini.Client{
39
+			org: mini.NewClient(cert),
40
+		}
41
+	} else {
42
+		if _, ok := miniClients[org]; !ok {
43
+			miniClients[org] = mini.NewClient(cert)
44
+		}
45
+	}
46
+}
47
+
33 48
 // WxClientFor 微信客户端
34 49
 func WxClientFor(org string) *wx.Client {
35 50
 	return wxClients[org]
36 51
 }
37 52
 
53
+// MiniClientFor 小程序客户端
54
+func MiniClientFor(org string) *mini.Client {
55
+	return miniClients[org]
56
+}
57
+
38 58
 // GetWxAppID 获取微信ID
39 59
 func GetWxAppID(org string) string {
40 60
 	return wxClients[org].GetAppID()
@@ -42,6 +62,7 @@ func GetWxAppID(org string) string {
42 62
 
43 63
 func init() {
44 64
 	wx.SetLogInst(defaultLogger)
65
+	mini.SetLogInst(defaultLogger)
45 66
 }
46 67
 
47 68
 // MapToWechatUser 映射微信人员