user.go 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071
  1. package controllers
  2. import (
  3. "encoding/json"
  4. "eta/eta_mini_api/models"
  5. "eta/eta_mini_api/models/request"
  6. "eta/eta_mini_api/models/response"
  7. "eta/eta_mini_api/services"
  8. "eta/eta_mini_api/services/alarm_msg"
  9. "eta/eta_mini_api/services/go_redis"
  10. "eta/eta_mini_api/utils"
  11. "fmt"
  12. "image/color"
  13. "strconv"
  14. "strings"
  15. "time"
  16. "github.com/mojocn/base64Captcha"
  17. )
  18. type UserController struct {
  19. BaseCommonController
  20. }
  21. type UserAuthController struct {
  22. BaseAuthController
  23. }
  24. // @Title 用户登录接口
  25. // @Description 用户登录
  26. // @Param request body models.LoginReq true "type json string"
  27. // @Success 200 {object} models.LoginResp
  28. // @router /login [post]
  29. func (this *UserAuthController) Login() {
  30. br := new(models.BaseResponse).Init()
  31. defer func() {
  32. this.Data["json"] = br
  33. this.ServeJSON()
  34. }()
  35. session := this.Session
  36. var req request.LoginReq
  37. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  38. if err != nil {
  39. br.Msg = "参数解析失败"
  40. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  41. return
  42. }
  43. if req.RealName == "" {
  44. br.Msg = "请输入姓名"
  45. return
  46. }
  47. if req.SysDepartmentId <= 0 {
  48. br.Msg = "请选择营业部门"
  49. return
  50. }
  51. switch req.LoginType {
  52. case 1:
  53. if req.Phone == "" {
  54. br.Msg = "请输入手机号"
  55. br.ErrMsg = "请输入手机号"
  56. return
  57. }
  58. if req.SmsCode == "" {
  59. br.Msg = "请输入验证码"
  60. br.ErrMsg = "请输入验证码"
  61. return
  62. }
  63. phone := req.AreaCode + req.Phone
  64. item, err := models.GetMsgCode(phone, req.SmsCode)
  65. if err != nil {
  66. if err.Error() == utils.ErrNoRow() {
  67. br.Msg = "验证码错误,请重新输入"
  68. br.ErrMsg = "校验验证码失败,Err:" + err.Error()
  69. return
  70. } else {
  71. br.Msg = "验证码错误,请重新输入"
  72. br.ErrMsg = "校验验证码失败,Err:" + err.Error()
  73. return
  74. }
  75. }
  76. if item == nil {
  77. br.Msg = "验证码错误,请重新输入"
  78. return
  79. }
  80. case 2:
  81. if req.Email == "" {
  82. br.Msg = "请输入邮箱"
  83. br.ErrMsg = "请输入邮箱"
  84. return
  85. }
  86. if req.SmsCode == "" {
  87. br.Msg = "请输入验证码"
  88. br.ErrMsg = "请输入验证码"
  89. return
  90. }
  91. item, err := models.GetMsgCode(req.Email, req.SmsCode)
  92. if err != nil {
  93. if err.Error() == utils.ErrNoRow() {
  94. br.Msg = "验证码错误,请重新输入"
  95. br.ErrMsg = "校验验证码失败,Err:" + err.Error()
  96. return
  97. } else {
  98. br.Msg = "验证码错误,请重新输入"
  99. br.ErrMsg = "校验验证码失败,Err:" + err.Error()
  100. return
  101. }
  102. }
  103. if item == nil {
  104. br.Msg = "验证码错误,请重新输入"
  105. return
  106. }
  107. }
  108. _, errMsg, err := services.BindUser(session.UnionId, session.OpenId, req.Phone, req.Email, req.AreaCode, req.SysDepartmentId, req.RealName)
  109. if err != nil && err.Error() != utils.ErrNoRow() {
  110. br.Msg = "登录失败,系统处理中,请稍后重试"
  111. if errMsg != "" {
  112. br.Msg = errMsg
  113. }
  114. br.ErrMsg = "登录失败:" + err.Error()
  115. return
  116. }
  117. br.Msg = "登录成功"
  118. br.Success = true
  119. br.Ret = 200
  120. }
  121. // GenerateCaptcha
  122. // @Title 生成图形验证码
  123. // @Description 生成图形验证码
  124. // @Success 200 Ret=200 获取成功
  125. // @router /getCaptcha [get]
  126. func (this *UserController) GenerateCaptcha() {
  127. br := new(models.BaseResponse).Init()
  128. defer func() {
  129. if br.ErrMsg == "" {
  130. br.IsSendEmail = false
  131. }
  132. this.Data["json"] = br
  133. this.ServeJSON()
  134. }()
  135. // 自定义验证码样式
  136. var driver base64Captcha.Driver
  137. driverString := base64Captcha.DriverString{
  138. Height: 60, //高度
  139. Width: 120, //宽度
  140. NoiseCount: 0, //干扰数
  141. ShowLineOptions: 2 | 4, //展示个数
  142. Length: 4, //长度
  143. //Source: "1234567890qwertyuioplkjhgfdsazxcvbnm", //验证码随机字符串来源
  144. Source: "1234567890", //验证码随机字符串来源
  145. BgColor: &color.RGBA{ // 背景颜色
  146. R: 0,
  147. G: 0,
  148. B: 0,
  149. A: 0,
  150. },
  151. Fonts: []string{"wqy-microhei.ttc"}, // 字体
  152. }
  153. driver = driverString.ConvertFonts()
  154. // 生成验证码
  155. store := services.CaptchaRedis{}
  156. captcha := base64Captcha.NewCaptcha(driver, store)
  157. id, b64s, _, err := captcha.Generate()
  158. if err != nil {
  159. br.Msg = "生成失败"
  160. br.ErrMsg = "生成验证码失败, Err: " + err.Error()
  161. return
  162. }
  163. type CaptchaResult struct {
  164. Id string
  165. Base64Blob string
  166. }
  167. res := new(CaptchaResult)
  168. res.Id = id
  169. res.Base64Blob = b64s
  170. br.Ret = 200
  171. br.Success = true
  172. br.Msg = "获取成功"
  173. br.Data = res
  174. }
  175. // @Title 获取短信/邮箱验证码
  176. // @Description 用户登录
  177. // @Param request body models.LoginReq true "type json string"
  178. // @Success 200 {object} models.LoginResp
  179. // @router /getVerifyCode [post]
  180. func (this *UserController) GetVerifyCode() {
  181. br := new(models.BaseResponse).Init()
  182. defer func() {
  183. if br.Ret != 200 {
  184. b, _ := json.Marshal(br)
  185. alarm_msg.SendAlarmMsg(string(b), 1)
  186. }
  187. this.Data["json"] = br
  188. this.ServeJSON()
  189. }()
  190. var req request.VerifyCodeReq
  191. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  192. if err != nil {
  193. br.Msg = "参数解析异常!"
  194. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  195. return
  196. }
  197. if req.VerifyType != 1 && req.VerifyType != 2 {
  198. br.Msg = "验证方式有误"
  199. br.ErrMsg = fmt.Sprintf("验证方式异常<%d>", req.VerifyType)
  200. }
  201. if req.CaptchaId == "" || req.CaptchaCode == "" {
  202. br.Msg = "请输入图形验证码"
  203. return
  204. }
  205. code := utils.GetRandDigit(6)
  206. fmt.Println(code)
  207. switch req.VerifyType {
  208. case 1:
  209. if req.AreaCode == "" {
  210. br.Msg = "请选择区号"
  211. return
  212. }
  213. if req.Phone == "" {
  214. br.Msg = "请输入手机号"
  215. return
  216. }
  217. if req.AreaCode == utils.TelAreaCodeHome && !utils.ValidateMobileFormatat(req.Phone) {
  218. br.Msg = "您的手机号输入有误, 请检查"
  219. return
  220. }
  221. phoneKey := utils.CACHE_ACCESS_PHONE_LOGIN_CODE + req.AreaCode + req.Phone
  222. res, _ := go_redis.RedisInt(phoneKey)
  223. if res >= 5 {
  224. br.Msg = "验证码发送太频繁,请稍后重试"
  225. return
  226. }
  227. phoneCountKey := utils.CACHE_ACCESS_PHONE_COUNT_LOGIN_CODE + req.AreaCode + req.Phone
  228. resCount, _ := go_redis.RedisInt(phoneCountKey)
  229. if resCount >= utils.VerifyCodeSendLimit {
  230. br.Msg = fmt.Sprintf("一天最多获取%s次,已超限", strconv.Itoa(utils.VerifyCodeSendLimit))
  231. return
  232. }
  233. store := services.CaptchaRedis{}
  234. var ok bool
  235. ok = store.Verify(req.CaptchaId, req.CaptchaCode, true)
  236. if !ok {
  237. br.Msg = "图形验证码错误"
  238. return
  239. }
  240. if req.AreaCode == "86" {
  241. ok = services.SendSmsCode(req.Phone, code)
  242. }
  243. if !ok {
  244. br.Msg = "请检查手机号和区号"
  245. br.ErrMsg = "短信验证码发送失败"
  246. return
  247. } else {
  248. item := new(models.MsgCode)
  249. item.OpenId = ""
  250. item.Code = code
  251. item.Mobile = req.AreaCode + req.Phone
  252. item.ExpiredIn = time.Now().Add(15 * time.Minute).Unix()
  253. item.CreateTime = time.Now()
  254. err = item.Insert()
  255. if err != nil {
  256. br.Msg = "发送失败"
  257. br.ErrMsg = "发送失败,Err:" + err.Error()
  258. return
  259. }
  260. br.Msg = "发送成功"
  261. phoneVerifyCahcheSvc := &services.VerifyCacheIncrService{}
  262. err = phoneVerifyCahcheSvc.VerifyCacheIncr(phoneKey, 15*int(time.Minute.Seconds()))
  263. if err != nil {
  264. utils.FileLog.Info("验证码手机号临时缓存失败", err.Error())
  265. }
  266. err = phoneVerifyCahcheSvc.VerifyCacheIncr(phoneCountKey, int(utils.SetKeyExpireToday().Seconds()))
  267. if err != nil {
  268. utils.FileLog.Info("验证码手机号当日缓存失败", err.Error())
  269. }
  270. }
  271. case 2:
  272. if req.Email == "" {
  273. br.Msg = "请输入邮箱"
  274. }
  275. if !utils.ValidateEmailFormatat(req.Email) {
  276. br.Msg = "您的邮箱格式输入有误, 请检查"
  277. return
  278. }
  279. emailKey := utils.CACHE_ACCESS_EMAIL_LOGIN_CODE + req.Email
  280. res, _ := go_redis.RedisInt(emailKey)
  281. if res >= 5 {
  282. br.Msg = "验证码发送太频繁,请稍后重试"
  283. return
  284. }
  285. emailCountKey := utils.CACHE_ACCESS_EMAIL_COUNT_LOGIN_CODE + req.Email
  286. resCount, _ := go_redis.RedisInt(emailCountKey)
  287. if resCount >= utils.VerifyCodeSendLimit {
  288. br.Msg = fmt.Sprintf("一天最多获取%s次,已超限", strconv.Itoa(utils.VerifyCodeSendLimit))
  289. return
  290. }
  291. store := services.CaptchaRedis{}
  292. var ok bool
  293. ok = store.Verify(req.CaptchaId, req.CaptchaCode, true)
  294. if !ok {
  295. br.Msg = "图形验证码错误"
  296. return
  297. }
  298. date := time.Now()
  299. content := "尊敬的用户:</br>本次请求的验证码为:" + code + "(为了保障您账号的安全性,请在15分钟内完成验证。)</br>东吴期货研究团队 </br>" + fmt.Sprintf("%d年%02d月%02d日", date.Year(), date.Month(), date.Day())
  300. title := "东吴期货登录验证"
  301. result, err := utils.SendEmailByDw(title, content, req.Email)
  302. if err != nil {
  303. br.Msg = "发送失败"
  304. br.ErrMsg = "发送失败,Err:" + err.Error()
  305. return
  306. }
  307. if result {
  308. item := new(models.MsgCode)
  309. item.OpenId = ""
  310. item.Code = code
  311. item.Mobile = req.Email
  312. item.ExpiredIn = time.Now().Add(15 * time.Minute).Unix()
  313. item.CreateTime = time.Now()
  314. err = item.Insert()
  315. if err != nil {
  316. br.Msg = "发送失败"
  317. br.ErrMsg = "发送失败,Err:" + err.Error()
  318. return
  319. }
  320. br.Msg = "发送成功"
  321. emailVerifyCahcheSvc := &services.VerifyCacheIncrService{}
  322. err = emailVerifyCahcheSvc.VerifyCacheIncr(emailKey, 15*int(time.Minute.Seconds()))
  323. if err != nil {
  324. utils.FileLog.Info("验证码邮箱临时缓存失败, err:", err.Error())
  325. }
  326. err = emailVerifyCahcheSvc.VerifyCacheIncr(emailCountKey, int(utils.SetKeyExpireToday().Seconds()))
  327. if err != nil {
  328. utils.FileLog.Info("验证码邮箱当日缓存失败, err:", err.Error())
  329. }
  330. } else {
  331. br.Msg = "发送失败"
  332. }
  333. }
  334. br.Ret = 200
  335. br.Success = true
  336. br.Msg = "发送成功"
  337. }
  338. // @Title 新增报告浏览记录
  339. // @Description 新增报告浏览记录接口
  340. // @Param request body models.ReportRecordReq true "type json string"
  341. // @Success 200 新增成功
  342. // @router /addReportRecord [post]
  343. func (this *UserAuthController) AddReportRecord() {
  344. br := new(models.BaseResponse).Init()
  345. defer func() {
  346. this.Data["json"] = br
  347. this.ServeJSON()
  348. }()
  349. user := this.User
  350. if user == nil {
  351. br.Msg = "请登录"
  352. br.ErrMsg = "请登录,用户信息为空"
  353. br.Ret = 403
  354. return
  355. }
  356. var req request.ReportRecordReq
  357. if err := json.Unmarshal(this.Ctx.Input.RequestBody, &req); err != nil {
  358. br.Msg = "参数解析异常!"
  359. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  360. return
  361. }
  362. if req.ReportId <= 0 {
  363. br.Msg = "参数错误"
  364. br.ErrMsg = "参数错误,报告id小于等于0"
  365. return
  366. }
  367. reportResp, err := services.GetReportDetail(req.ReportId, user.UserId)
  368. if err != nil {
  369. br.Msg = "添加阅读记录失败"
  370. br.ErrMsg = "获取研报错误,Err:" + err.Error()
  371. return
  372. }
  373. if reportResp.Ret != 200 {
  374. br.Msg = reportResp.Msg
  375. br.ErrMsg = reportResp.ErrMsg
  376. return
  377. }
  378. reportDetail := reportResp.Data.Report
  379. reportPermissionResp, err := services.GetReportChartPermissionList(req.ReportId)
  380. if err != nil {
  381. br.Msg = "添加阅读记录失败"
  382. br.ErrMsg = "获取研报品种错误,Err:" + err.Error()
  383. return
  384. }
  385. if reportPermissionResp.Ret != 200 {
  386. br.Msg = reportPermissionResp.Msg
  387. br.ErrMsg = reportPermissionResp.ErrMsg
  388. return
  389. }
  390. reportPermissionList := reportPermissionResp.Data
  391. chartPermissionList, err := services.GetChartPermissionAllList()
  392. if err != nil {
  393. br.Msg = "添加阅读记录失败"
  394. br.ErrMsg = "获取研报品种列表失败,Err:" + err.Error()
  395. return
  396. }
  397. chartMap := make(map[int]*models.ChartPermission)
  398. for _, permission := range chartPermissionList.Data {
  399. chartMap[permission.ChartPermissionId] = permission
  400. }
  401. curTime := time.Now()
  402. var insertId int64
  403. if req.RecordId == 0 {
  404. // 如果不存在就新增一条记录
  405. permission1Ids := make([]int, 0)
  406. permission2Ids := make([]int, 0)
  407. permissionNames := make([]string, 0)
  408. for _, item := range reportPermissionList {
  409. curPermission := chartMap[item.ChartPermissionId]
  410. permission1Ids = append(permission1Ids, curPermission.ParentId)
  411. permission2Ids = append(permission2Ids, curPermission.ChartPermissionId)
  412. permissionNames = append(permissionNames, curPermission.PermissionName)
  413. }
  414. permission1Ids = utils.Unique(permission1Ids)
  415. permission2Ids = utils.Unique(permission2Ids)
  416. permissionNames = utils.Unique(permissionNames)
  417. userReadRecord := &models.UserReadRecord{
  418. UserId: user.UserId,
  419. ReportId: req.ReportId,
  420. ReportTitle: reportDetail.Title,
  421. ChartPermissionName: strings.Join(permissionNames, ","),
  422. ClassifyId1: reportDetail.ClassifyIdFirst,
  423. ClassifyName1: reportDetail.ClassifyNameFirst,
  424. ClassifyId2: reportDetail.ClassifyIdSecond,
  425. ClassifyName2: reportDetail.ClassifyNameSecond,
  426. ClassifyId3: reportDetail.ClassifyIdThird,
  427. ClassifyName3: reportDetail.ClassifyNameThird,
  428. Timestamp: int(curTime.Unix()),
  429. CreateTime: curTime,
  430. CreateDate: curTime.Format(utils.FormatDate),
  431. ReportType: utils.ReportTypeEta,
  432. }
  433. insertId, err = userReadRecord.Insert()
  434. if err != nil {
  435. br.Msg = "添加阅读记录失败"
  436. br.ErrMsg = "添加阅读记录失败,Err:" + err.Error()
  437. return
  438. }
  439. userReadPermission1 := make([]*models.UserReadPermission1, 0)
  440. for _, id := range permission1Ids {
  441. userReadPermission1 = append(userReadPermission1, &models.UserReadPermission1{
  442. UserReadRecordId: int(insertId),
  443. ChartPermissionId: id,
  444. PermissionName: chartMap[id].PermissionName,
  445. })
  446. }
  447. err = models.UserReadPermission1MultiInsert(userReadPermission1)
  448. if err != nil {
  449. br.Msg = "添加阅读记录失败"
  450. br.ErrMsg = "添加阅读记录失败,Err:" + err.Error()
  451. return
  452. }
  453. userReadPermission2 := make([]*models.UserReadPermission2, 0)
  454. for _, id := range permission2Ids {
  455. userReadPermission2 = append(userReadPermission2, &models.UserReadPermission2{
  456. UserReadRecordId: int(insertId),
  457. ChartPermissionId: id,
  458. })
  459. }
  460. err = models.UserReadPermission2MultiInsert(userReadPermission2)
  461. if err != nil {
  462. br.Msg = "添加阅读记录失败"
  463. br.ErrMsg = "添加阅读记录失败,Err:" + err.Error()
  464. return
  465. }
  466. } else {
  467. // 如果存在就计算停留时间
  468. userRecord, err := models.GetUserReadRecordListById(req.RecordId)
  469. if err != nil {
  470. if err.Error() == utils.ErrNoRow() {
  471. br.Msg = "更新阅读记录不存在"
  472. return
  473. }
  474. br.Msg = "更新阅读记录失败"
  475. br.ErrMsg = "更新阅读记录失败,Err:" + err.Error()
  476. return
  477. }
  478. stayTime := curTime.Unix() - int64(userRecord.Timestamp)
  479. stayTimeStr := utils.SecondsToHMS(stayTime)
  480. err = models.UpdateUserReadRecordById(req.RecordId, int(curTime.Unix()), int(stayTime), stayTimeStr)
  481. if err != nil {
  482. br.Msg = "更新阅读记录失败"
  483. br.ErrMsg = "更新阅读记录失败,Err:" + err.Error()
  484. return
  485. }
  486. }
  487. resp := new(response.UserReadRecordResp)
  488. resp.RecordId = insertId
  489. br.Msg = "添加阅读记录成功"
  490. br.Ret = 200
  491. br.Success = true
  492. br.Data = resp
  493. }
  494. // @Title 新增pdf报告浏览记录
  495. // @Description 新增pdf报告浏览记录接口
  496. // @Param request body models.ReportPdfRecordReq true "type json string"
  497. // @Success 200 新增成功
  498. // @router /pdf/addReportRecord [post]
  499. func (this *UserAuthController) AddReportPdfRecord() {
  500. br := new(models.BaseResponse).Init()
  501. defer func() {
  502. this.Data["json"] = br
  503. this.ServeJSON()
  504. }()
  505. user := this.User
  506. if user == nil {
  507. br.Msg = "请登录"
  508. br.ErrMsg = "请登录,用户信息为空"
  509. br.Ret = 403
  510. return
  511. }
  512. var req request.ReportPdfRecordReq
  513. if err := json.Unmarshal(this.Ctx.Input.RequestBody, &req); err != nil {
  514. br.Msg = "参数解析异常!"
  515. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  516. return
  517. }
  518. if req.ReportPdfId <= 0 {
  519. br.Msg = "参数错误"
  520. br.ErrMsg = "参数错误,报告id小于等于0"
  521. return
  522. }
  523. reportPdf, err := models.GetReportPdfById(req.ReportPdfId)
  524. if err != nil {
  525. if err.Error() == utils.ErrNoRow() {
  526. br.Msg = "报告不存在或已删除"
  527. return
  528. }
  529. br.Msg = "添加阅读记录失败"
  530. br.ErrMsg = "获取研报错误,Err:" + err.Error()
  531. return
  532. }
  533. reportClassifyId := services.GetReportPdfClassify(reportPdf)
  534. reportPermissionResp, err := services.GetChartPermissionListByClassifyId(reportClassifyId, 0)
  535. if err != nil {
  536. br.Msg = "添加阅读记录失败"
  537. br.ErrMsg = "获取研报品种错误,Err:" + err.Error()
  538. return
  539. }
  540. if reportPermissionResp.Ret != 200 {
  541. br.Msg = reportPermissionResp.Msg
  542. br.ErrMsg = reportPermissionResp.ErrMsg
  543. return
  544. }
  545. reportPermissionList := reportPermissionResp.Data
  546. chartPermissionList, err := services.GetChartPermissionAllList()
  547. if err != nil {
  548. br.Msg = "添加阅读记录失败"
  549. br.ErrMsg = "获取研报品种列表失败,Err:" + err.Error()
  550. return
  551. }
  552. chartMap := make(map[int]*models.ChartPermission)
  553. for _, permission := range chartPermissionList.Data {
  554. chartMap[permission.ChartPermissionId] = permission
  555. }
  556. curTime := time.Now()
  557. var insertId int64
  558. if req.RecordId == 0 {
  559. // 如果不存在就新增一条记录
  560. permission1Ids := make([]int, 0)
  561. permission2Ids := make([]int, 0)
  562. permissionNames := make([]string, 0)
  563. for _, item := range reportPermissionList {
  564. curPermission := chartMap[item.ChartPermissionId]
  565. permission1Ids = append(permission1Ids, curPermission.ParentId)
  566. permission2Ids = append(permission2Ids, curPermission.ChartPermissionId)
  567. permissionNames = append(permissionNames, curPermission.PermissionName)
  568. }
  569. permission1Ids = utils.Unique(permission1Ids)
  570. permission2Ids = utils.Unique(permission2Ids)
  571. permissionNames = utils.Unique(permissionNames)
  572. userReadRecord := &models.UserReadRecord{
  573. UserId: user.UserId,
  574. ReportId: reportPdf.ReportPdfId,
  575. ReportTitle: reportPdf.Title,
  576. ChartPermissionName: strings.Join(permissionNames, ","),
  577. ClassifyId1: reportPdf.ClassifyIdFirst,
  578. ClassifyName1: reportPdf.ClassifyNameFirst,
  579. ClassifyId2: reportPdf.ClassifyIdSecond,
  580. ClassifyName2: reportPdf.ClassifyNameSecond,
  581. Timestamp: int(curTime.Unix()),
  582. CreateTime: curTime,
  583. CreateDate: curTime.Format(utils.FormatDate),
  584. ReportType: utils.ReportTypePdf,
  585. }
  586. insertId, err = userReadRecord.Insert()
  587. if err != nil {
  588. br.Msg = "添加阅读记录失败"
  589. br.ErrMsg = "添加阅读记录失败,Err:" + err.Error()
  590. return
  591. }
  592. userReadPermission1 := make([]*models.UserReadPermission1, 0)
  593. for _, id := range permission1Ids {
  594. userReadPermission1 = append(userReadPermission1, &models.UserReadPermission1{
  595. UserReadRecordId: int(insertId),
  596. ChartPermissionId: id,
  597. PermissionName: chartMap[id].PermissionName,
  598. })
  599. }
  600. err = models.UserReadPermission1MultiInsert(userReadPermission1)
  601. if err != nil {
  602. br.Msg = "添加阅读记录失败"
  603. br.ErrMsg = "添加阅读记录失败,Err:" + err.Error()
  604. return
  605. }
  606. userReadPermission2 := make([]*models.UserReadPermission2, 0)
  607. for _, id := range permission2Ids {
  608. userReadPermission2 = append(userReadPermission2, &models.UserReadPermission2{
  609. UserReadRecordId: int(insertId),
  610. ChartPermissionId: id,
  611. })
  612. }
  613. err = models.UserReadPermission2MultiInsert(userReadPermission2)
  614. if err != nil {
  615. br.Msg = "添加阅读记录失败"
  616. br.ErrMsg = "添加阅读记录失败,Err:" + err.Error()
  617. return
  618. }
  619. count, err := models.GetUserReadRecordCountByReportPdfIdAndUserId(req.ReportPdfId, user.UserId)
  620. if err != nil {
  621. br.Msg = "添加阅读记录失败"
  622. br.ErrMsg = "获取阅读记录失败,Err:" + err.Error()
  623. return
  624. }
  625. if count > 1 {
  626. err = models.UpdateReportPdfPv(req.ReportPdfId)
  627. if err != nil {
  628. br.Msg = "添加研报阅读记录失败"
  629. br.ErrMsg = "更新阅读记录失败,Err:" + err.Error()
  630. return
  631. }
  632. } else {
  633. err = models.UpdateReportPdfUvAndPv(req.ReportPdfId)
  634. if err != nil {
  635. br.Msg = "添加研报阅读记录失败"
  636. br.ErrMsg = "更新阅读记录失败,Err:" + err.Error()
  637. return
  638. }
  639. }
  640. } else {
  641. // 如果存在就计算停留时间
  642. userRecord, err := models.GetUserReadRecordListById(req.RecordId)
  643. if err != nil {
  644. if err.Error() == utils.ErrNoRow() {
  645. br.Msg = "更新阅读记录不存在"
  646. return
  647. }
  648. br.Msg = "更新阅读记录失败"
  649. br.ErrMsg = "更新阅读记录失败,Err:" + err.Error()
  650. return
  651. }
  652. stayTime := curTime.Unix() - int64(userRecord.Timestamp)
  653. stayTimeStr := utils.SecondsToHMS(stayTime)
  654. err = models.UpdateUserReadRecordById(req.RecordId, int(curTime.Unix()), int(stayTime), stayTimeStr)
  655. if err != nil {
  656. br.Msg = "更新阅读记录失败"
  657. br.ErrMsg = "更新阅读记录失败,Err:" + err.Error()
  658. return
  659. }
  660. }
  661. resp := new(response.UserReadRecordResp)
  662. resp.RecordId = insertId
  663. br.Msg = "添加阅读记录成功"
  664. br.Ret = 200
  665. br.Success = true
  666. br.Data = resp
  667. }
  668. // AreaCodeList
  669. // @Title 手机号区号列表
  670. // @Description 手机号区号列表
  671. // @Success 200 Ret=200 获取成功
  672. // @router /area_code/list [get]
  673. func (this *UserController) AreaCodeList() {
  674. br := new(models.BaseResponse).Init()
  675. defer func() {
  676. if br.ErrMsg == "" {
  677. br.IsSendEmail = false
  678. }
  679. this.Data["json"] = br
  680. this.ServeJSON()
  681. }()
  682. resp := make([]response.AreaCodeListResp, 0)
  683. confValue, e := models.GetConfigDetailByCode(models.ConfAreaCodeListKey)
  684. if e != nil {
  685. br.Msg = "获取失败"
  686. br.ErrMsg = "获取手机号区号配置失败, Err: " + e.Error()
  687. return
  688. }
  689. if confValue == "" {
  690. br.Msg = "获取失败"
  691. br.ErrMsg = "手机号区号配置为空"
  692. return
  693. }
  694. if e := json.Unmarshal([]byte(confValue), &resp); e != nil {
  695. br.Msg = "获取失败"
  696. br.ErrMsg = "手机号区号配置有误"
  697. return
  698. }
  699. br.Data = resp
  700. br.Ret = 200
  701. br.Success = true
  702. br.Msg = "获取成功"
  703. }
  704. // 用户品种信息
  705. // @Title 用户信息
  706. // @Description 用户信息
  707. // @Success 200 Ret=200 获取成功
  708. // @router /info [get]
  709. func (this *UserAuthController) Info() {
  710. br := new(models.BaseResponse).Init()
  711. defer func() {
  712. this.Data["json"] = br
  713. this.ServeJSON()
  714. }()
  715. user := this.User
  716. if user == nil {
  717. user = &models.User{}
  718. }
  719. department, err := models.GetSysDepartmentById(user.SellerDepartmentId)
  720. if err != nil && err.Error() != utils.ErrNoRow() {
  721. br.Msg = "查询失败"
  722. br.ErrMsg = "查询失败,系统异常,Err:" + err.Error()
  723. return
  724. }
  725. private, err := services.GetPrivateChartPermissionList()
  726. if err != nil {
  727. br.Msg = "查询失败"
  728. br.ErrMsg = "查询失败,系统异常,Err:" + err.Error()
  729. return
  730. }
  731. if private.Ret != 200 {
  732. br.Msg = private.Msg
  733. br.ErrMsg = private.ErrMsg
  734. return
  735. }
  736. userPermissionIds, err := models.GetUserChartPermissionIdByUserId(user.UserId)
  737. if err != nil {
  738. br.Msg = "查看权限失败"
  739. br.ErrMsg = "查看权限失败,系统异常,Err:" + err.Error()
  740. return
  741. }
  742. userPermissionMap := make(map[int]struct{})
  743. for _, v := range userPermissionIds {
  744. userPermissionMap[v] = struct{}{}
  745. }
  746. var hasPermission string
  747. for _, v := range private.Data {
  748. for _, vv := range v.Child {
  749. if _, ok := userPermissionMap[vv.ChartPermissionId]; ok {
  750. hasPermission = "私有权限"
  751. break
  752. }
  753. }
  754. }
  755. if hasPermission == "" || user.Status == utils.UserStatusNo {
  756. hasPermission = "公有权限"
  757. }
  758. miniconf, err := models.GetMiniConf()
  759. if err != nil {
  760. br.Msg = "获取配置失败"
  761. br.ErrMsg = "获取配置失败,系统异常,Err:" + err.Error()
  762. return
  763. }
  764. userView := &models.UserView{
  765. Headimgurl: miniconf["Logo"],
  766. RealName: user.RealName,
  767. Phone: user.Phone,
  768. AreaCode: user.AreaCode,
  769. SellerDepartmentName: department.SysDepartmentName,
  770. HasPermission: hasPermission,
  771. Email: user.Email,
  772. Componey: user.Company,
  773. IsRegistered: user.IsRegistered,
  774. Status: user.Status,
  775. ValidEndTime: user.ValidEndTime.Format(utils.FormatDate),
  776. }
  777. if user.ValidEndTime.IsZero() {
  778. userView.ValidEndTime = ""
  779. }
  780. br.Data = userView
  781. br.Msg = "查询成功"
  782. br.Success = true
  783. br.Ret = 200
  784. }
  785. // PermissionList
  786. // @Title 用户个人权限列表
  787. // @Description 用户个人权限列表
  788. // @Param request body models.LoginReq true "type json string"
  789. // @Success 200 {object} []models.ChartPermissionTreeView
  790. // @router /permission/list [get]
  791. func (this *UserAuthController) PermissionList() {
  792. br := new(models.BaseResponse).Init()
  793. defer func() {
  794. this.Data["json"] = br
  795. this.ServeJSON()
  796. }()
  797. user := this.User
  798. permissionIds, err := models.GetUserChartPermissionIdByUserId(user.UserId)
  799. if err != nil {
  800. br.Msg = "查询用户权限失败"
  801. br.ErrMsg = "查询用户权限失败,系统异常,Err:" + err.Error()
  802. return
  803. }
  804. userPermissionMap := make(map[int]struct{})
  805. for _, v := range permissionIds {
  806. userPermissionMap[v] = struct{}{}
  807. }
  808. // 查询公有权限
  809. var publicView []*models.ChartPermissionTreeView
  810. publicResp, err := services.GetPublicChartPermissionList()
  811. if err != nil {
  812. br.Msg = "查询公有权限失败"
  813. br.ErrMsg = "查询私有权限失败,系统异常,Err:" + err.Error()
  814. }
  815. if publicResp.Ret != 200 {
  816. br.Msg = publicResp.Msg
  817. br.ErrMsg = publicResp.ErrMsg
  818. return
  819. }
  820. publicView = publicResp.Data
  821. // 如果是正式用户,则查询私有权限
  822. var privateView []*models.ChartPermissionTreeView
  823. if user.Status == utils.UserStatusFormal {
  824. privateResp, err := services.GetPrivateChartPermissionList()
  825. if err != nil {
  826. br.Msg = "查询私有权限失败"
  827. br.ErrMsg = "查询私有权限失败,系统异常,Err:" + err.Error()
  828. }
  829. if privateResp.Ret != 200 {
  830. br.Msg = privateResp.Msg
  831. br.ErrMsg = privateResp.ErrMsg
  832. return
  833. }
  834. for _, v := range privateResp.Data {
  835. IsAdd := false
  836. curPermissionView := &models.ChartPermissionTreeView{
  837. ChartPermissionId: v.ChartPermissionId,
  838. PermissionName: v.PermissionName,
  839. IsPublic: v.IsPublic,
  840. Sort: v.Sort,
  841. Child: make([]*models.ChartPermissionTreeView, 0),
  842. }
  843. for _, vv := range v.Child {
  844. if _, ok := userPermissionMap[vv.ChartPermissionId]; ok {
  845. curPermissionView.Child = append(curPermissionView.Child, vv)
  846. IsAdd = true
  847. }
  848. }
  849. if IsAdd {
  850. privateView = append(privateView, curPermissionView)
  851. }
  852. }
  853. }
  854. privateAloneView := make([]*models.ChartPermissionTreeView, 0)
  855. for _, vi := range privateView {
  856. isHas := false
  857. for _, vb := range publicView {
  858. if vi.ChartPermissionId == vb.ChartPermissionId {
  859. isHas = true
  860. vb.Child = append(vb.Child, vi.Child...)
  861. break
  862. }
  863. }
  864. if !isHas {
  865. privateAloneView = append(privateAloneView, vi)
  866. }
  867. }
  868. publicView = append(publicView, privateAloneView...)
  869. for _, vi := range publicView {
  870. vi.ChartPermissionType = utils.PermissionTypeEta
  871. for _, vi := range vi.Child {
  872. vi.ChartPermissionType = utils.PermissionTypeEta
  873. }
  874. }
  875. br.Data = publicView
  876. br.Msg = "查询成功"
  877. br.Success = true
  878. br.Ret = 200
  879. }
  880. // PermissionList
  881. // @Title 用户已购权限列表
  882. // @Description 用户已购权限列表
  883. // @Param request body models.LoginReq true "type json string"
  884. // @Success 200 {object} []models.ChartPermissionTreeView
  885. // @router /purchased/list [get]
  886. func (this *UserAuthController) PurchasedPermission() {
  887. br := new(models.BaseResponse).Init()
  888. defer func() {
  889. this.Data["json"] = br
  890. this.ServeJSON()
  891. }()
  892. user := this.User
  893. permissionIds, err := models.GetUserChartPermissionIdByUserId(user.UserId)
  894. if err != nil {
  895. br.Msg = "查询用户权限失败"
  896. br.ErrMsg = "查询用户权限失败,系统异常,Err:" + err.Error()
  897. return
  898. }
  899. permissionMap := make(map[int]struct{})
  900. for _, v := range permissionIds {
  901. permissionMap[v] = struct{}{}
  902. }
  903. // 查询私有权限
  904. privateResp, err := services.GetPrivateChartPermissionList()
  905. if err != nil {
  906. br.Msg = "查询私有权限失败"
  907. br.ErrMsg = "查询私有权限失败,系统异常,Err:" + err.Error()
  908. }
  909. if privateResp.Ret != 200 {
  910. br.Msg = privateResp.Msg
  911. br.ErrMsg = privateResp.ErrMsg
  912. return
  913. }
  914. var privateView []*models.ChartPermissionTreeView
  915. for _, v := range privateResp.Data {
  916. IsAdd := false
  917. curPermissionView := &models.ChartPermissionTreeView{
  918. ChartPermissionId: v.ChartPermissionId,
  919. PermissionName: v.PermissionName,
  920. IsPublic: v.IsPublic,
  921. Sort: v.Sort,
  922. Child: make([]*models.ChartPermissionTreeView, 0),
  923. ChartPermissionType: utils.PermissionTypeEta,
  924. }
  925. for _, vv := range v.Child {
  926. if _, ok := permissionMap[vv.ChartPermissionId]; ok && vv.ParentId != 0 {
  927. vv.ChartPermissionType = utils.PermissionTypeEta
  928. curPermissionView.Child = append(curPermissionView.Child, vv)
  929. IsAdd = true
  930. }
  931. }
  932. if IsAdd {
  933. privateView = append(privateView, curPermissionView)
  934. }
  935. }
  936. for _, vi := range privateView {
  937. vi.Child = append(vi.Child, &models.ChartPermissionTreeView{
  938. ChartPermissionId: -1,
  939. PermissionName: utils.MINI_CUSTOM_PERMISSION_NAME,
  940. IsPublic: 0,
  941. Sort: 0,
  942. ChartPermissionType: utils.ReportTypePdf,
  943. })
  944. }
  945. br.Data = privateView
  946. br.Msg = "查询成功"
  947. br.Success = true
  948. br.Ret = 200
  949. }
  950. // UserInfoSave
  951. // @Title 用户信息补充
  952. // @Description 用户信息补充
  953. // @Param request body request.UserEidtReq true "type json string"
  954. // @Success Ret=200 保存成功
  955. // @router /info/save [post]
  956. func (this *UserAuthController) UserInfoSave() {
  957. br := new(models.BaseResponse).Init()
  958. defer func() {
  959. this.Data["json"] = br
  960. this.ServeJSON()
  961. }()
  962. var req request.UserInfoSaveReq
  963. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  964. if err != nil {
  965. br.Msg = "参数解析异常!"
  966. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  967. return
  968. }
  969. user := this.User
  970. if user == nil {
  971. br.Msg = "用户不存在"
  972. return
  973. }
  974. if user.SellerDepartmentId > 0 {
  975. req.SysDepartmentId = user.SellerDepartmentId
  976. }
  977. if user.RealName != "" {
  978. req.RealName = user.RealName
  979. }
  980. msg, err := services.SaveUserInfo(user.UserId, req.SysDepartmentId, req.RealName)
  981. if err != nil {
  982. if msg == "" {
  983. br.Msg = "保存失败"
  984. } else {
  985. br.Msg = msg
  986. }
  987. br.ErrMsg = "保存失败,系统异常,Err:" + err.Error()
  988. return
  989. }
  990. if msg != "" {
  991. br.Msg = msg
  992. return
  993. }
  994. br.Msg = "用户信息保存成功"
  995. br.Success = true
  996. br.Ret = 200
  997. }
  998. // ApplyPermission
  999. // @Title 用户申请认证
  1000. // @Description 用户申请认证
  1001. // @Success Ret=200 获取成功
  1002. // @router /apply/permission [post]
  1003. func (this *UserAuthController) ApplyPermission() {
  1004. br := new(models.BaseResponse).Init()
  1005. defer func() {
  1006. this.Data["json"] = br
  1007. this.ServeJSON()
  1008. }()
  1009. user := this.User
  1010. if user.ApplyStatus == 1 {
  1011. br.Msg = "您已提交过认证申请,请等待!"
  1012. return
  1013. }
  1014. user.ApplyStatus = 1
  1015. user.ApplyTime = time.Now()
  1016. err := user.Update([]string{"apply_status", "apply_time"})
  1017. if err != nil {
  1018. br.Msg = "提交认证申请失败"
  1019. br.ErrMsg = "提交认证申请失败,系统异常,Err:" + err.Error()
  1020. return
  1021. }
  1022. br.Msg = "认证申请,需要1~3个工作日"
  1023. br.Success = true
  1024. br.Ret = 200
  1025. }