user.go 29 KB

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