user.go 28 KB

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