一物一码
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

477 rivejä
17 KiB

  1. package db
  2. import (
  3. "applet/app/db/model"
  4. "applet/app/utils"
  5. "applet/app/utils/logx"
  6. "errors"
  7. "strconv"
  8. "strings"
  9. "github.com/gin-gonic/gin"
  10. "github.com/tidwall/gjson"
  11. "xorm.io/xorm"
  12. )
  13. // 返回所有, 不管是否显示
  14. func SysModFindAll(Db *xorm.Engine) (*[]model.SysModule, error) {
  15. var m []model.SysModule
  16. if err := Db.Find(&m); err != nil {
  17. return nil, err
  18. }
  19. return &m, nil
  20. }
  21. // 查找主模块数据
  22. func SysModFindMain(Db *xorm.Engine) (*[]model.SysModule, error) {
  23. var m []model.SysModule
  24. if err := Db.Where("mod_pid = 0 AND state = 1 AND position = 'base'").
  25. Asc("sort").
  26. Find(&m); err != nil {
  27. return nil, err
  28. }
  29. return &m, nil
  30. }
  31. // 用父ID查找子模块数据
  32. func SysModFindByPId(c *gin.Context, Db *xorm.Engine, id int) (*[]model.SysModule, error) {
  33. var m []model.SysModule
  34. if err := Db.Where("state = 1").Where("mod_pid = ?", id).
  35. Asc("sort").
  36. Find(&m); err != nil {
  37. return nil, err
  38. }
  39. mm, err := sysModFormat(c, &m)
  40. if err != nil {
  41. return nil, err
  42. }
  43. var ms []model.SysModule
  44. modname_list := []string{"product", "search_result_taobao_item", "hot_rank_tab_view"}
  45. for _, item := range *mm.(*[]model.SysModule) {
  46. if strings.Contains(item.Data, "tmall") == false && item.ModName == "product_detail_title" {
  47. item.Data = strings.Replace(item.Data, "\"platform_css\":[", "\"platform_css\":[{\"name\":\"天猫\",\"type\":\"tmall\",\"text_color\":\"#FFFFFF\",\"bg_color\":\"#FF4242\"},", 1)
  48. }
  49. if strings.Contains(item.Data, "tmall") == false && utils.InArr(item.ModName, modname_list) {
  50. item.Data = strings.Replace(item.Data, "{\"index\":\"6\",\"type\":\"kaola\",\"platform_name\":\"考拉\",\"provider_name_color\":\"#FFFFFF\",\"provider_bg_color\":\"#FF4242\"}", "{\"index\":\"6\",\"type\":\"kaola\",\"platform_name\":\"考拉\",\"provider_name_color\":\"#FFFFFF\",\"provider_bg_color\":\"#FF4242\"},{\"index\":\"7\",\"type\":\"tmall\",\"platform_name\":\"天猫\",\"provider_name_color\":\"#FFFFFF\",\"provider_bg_color\":\"#FF4242\"}", 1)
  51. item.Data = strings.Replace(item.Data, "{\"type\":\"kaola\",\"provider_name_color\":\"#FFFFFF\",\"provider_bg_color\":\"#FF4242\"}", "{\"type\":\"kaola\",\"provider_name_color\":\"#FFFFFF\",\"provider_bg_color\":\"#FF4242\"},{\"type\":\"tmall\",\"provider_name_color\":\"#FFFFFF\",\"provider_bg_color\":\"#FF4242\"}", 1)
  52. }
  53. if strings.Contains(item.Data, "优惠卷") {
  54. item.Data = strings.Replace(item.Data, "优惠卷", "优惠券", -1)
  55. }
  56. ms = append(ms, item)
  57. }
  58. return &ms, nil
  59. }
  60. // 用父ID查找子模块数据
  61. func SysModFindByPIds(c *gin.Context, Db *xorm.Engine, ids ...int) (*[]model.SysModule, error) {
  62. var m []model.SysModule
  63. if err := Db.In("mod_pid", ids).Where("state = 1").
  64. Asc("sort").
  65. Find(&m); err != nil {
  66. return nil, err
  67. }
  68. mm, err := sysModFormat(c, &m)
  69. if err != nil {
  70. return nil, err
  71. }
  72. var ms []model.SysModule
  73. for _, item := range *mm.(*[]model.SysModule) {
  74. //数据里面
  75. if strings.Contains(item.Data, "tmall") == false && item.ModName == "product" {
  76. item.Data = strings.Replace(item.Data, "{\"index\":\"6\",\"type\":\"kaola\",\"platform_name\":\"考拉\",\"provider_name_color\":\"#FFFFFF\",\"provider_bg_color\":\"#FF4242\"}", "{\"index\":\"6\",\"type\":\"kaola\",\"platform_name\":\"考拉\",\"provider_name_color\":\"#FFFFFF\",\"provider_bg_color\":\"#FF4242\"},{\"index\":\"7\",\"type\":\"tmall\",\"platform_name\":\"天猫\",\"provider_name_color\":\"#FFFFFF\",\"provider_bg_color\":\"#FF4242\"}", 1)
  77. }
  78. item = SysModDataByReplace(c, item)
  79. ms = append(ms, item)
  80. }
  81. return &ms, nil
  82. }
  83. // 用IDS找对应模块数据
  84. func SysModFindByIds(Db *xorm.Engine, ids ...int) (*[]model.SysModule, error) {
  85. var m []model.SysModule
  86. if err := Db.In("mod_id", ids).Where("state = 1").
  87. Cols("mod_id,mod_pid,mod_name,position,skip_identifier,title,subtitle,url,margin,aspect_ratio,icon,img,font_color,bg_img,bg_color,bg_color_t,badge,path,data,sort").
  88. Asc("sort").Find(&m); err != nil {
  89. return nil, err
  90. }
  91. return &m, nil
  92. }
  93. // ID查找对应模块
  94. func SysModFindById(c *gin.Context, Db *xorm.Engine, id string) (*model.SysModule, error) {
  95. var m model.SysModule
  96. if has, err := Db.Where("state = 1 AND mod_id = ?", id).
  97. Get(&m); err != nil || has == false {
  98. return nil, logx.Warn(err)
  99. }
  100. mm, err := sysModFormat(c, &m)
  101. if err != nil {
  102. return nil, err
  103. }
  104. return mm.(*model.SysModule), nil
  105. }
  106. // SysModFindByTmpId is 根据模板
  107. func SysModFindByTmpId(c *gin.Context, Db *xorm.Engine, id string) (*model.SysModule, error) {
  108. var m model.SysModule
  109. if has, err := Db.Where("state = 1 AND template_id = ?", id).
  110. Get(&m); err != nil || has == false {
  111. return nil, logx.Warn(err)
  112. }
  113. mm, err := sysModFormat(c, &m)
  114. if err != nil {
  115. return nil, err
  116. }
  117. return mm.(*model.SysModule), nil
  118. }
  119. // Name查找对应模块
  120. func SysModFindByName(c *gin.Context, Db *xorm.Engine, name string) (*model.SysModule, error) {
  121. var m model.SysModule
  122. if has, err := Db.Where("state = 1 AND mod_name = ?", name).
  123. Get(&m); err != nil || has == false {
  124. return nil, logx.Warn(err)
  125. }
  126. mm, err := sysModFormat(c, &m)
  127. if err != nil {
  128. return nil, err
  129. }
  130. return mm.(*model.SysModule), nil
  131. }
  132. // SysModFindByName is Name查找对应模块
  133. func SysModFindByNames(names ...string) (*[]model.SysModule, error) {
  134. var m []model.SysModule
  135. if err := Db.In("mod_name", names).Where("state = 1").
  136. Cols("mod_id,mod_pid,mod_name,position,skip_identifier,title,subtitle,url,margin,aspect_ratio,icon,img,font_color,bg_img,bg_color,bg_color_t,badge,path,data,sort").
  137. Find(&m); err != nil {
  138. return nil, err
  139. }
  140. return &m, nil
  141. }
  142. // SysModFindByPosition is 根据位置查找对应模块
  143. func SysModFindByPosition(Db *xorm.Engine, positions ...string) (*[]model.SysModule, error) {
  144. var m []model.SysModule
  145. if err := Db.In("position", positions).Where("state = 1").Find(&m); err != nil {
  146. return nil, err
  147. }
  148. return &m, nil
  149. }
  150. // 根据跳转标识 查找对应模块
  151. func SysModFindBySkipIdentifier(c *gin.Context, Db *xorm.Engine, name string) (*model.SysModule, error) {
  152. var m model.SysModule
  153. if has, err := Db.Where("state = 1 AND skip_identifier = ?", name).
  154. Get(&m); err != nil || has == false {
  155. return nil, logx.Warn(err)
  156. }
  157. mm, err := sysModFormat(c, &m)
  158. if err != nil {
  159. return nil, err
  160. }
  161. return mm.(*model.SysModule), nil
  162. }
  163. // 根据跳转标识和位置 查找对应模块list
  164. func SysModFindBySkipIdentifierAndPosition(c *gin.Context, Db *xorm.Engine, name string, position string) (*[]model.SysModule, error) {
  165. var m []model.SysModule
  166. if err := Db.Where("state = 1 AND skip_identifier = ? AND position = ?", name, position).
  167. Cols("mod_id,mod_pid,mod_name,position,skip_identifier,title,subtitle,url,margin,aspect_ratio,icon,img,font_color,bg_img,bg_color,bg_color_t,badge,path,data,sort").
  168. Asc("sort").Find(&m); err != nil {
  169. return nil, err
  170. }
  171. mm, err := sysModFormat(c, &m)
  172. if err != nil {
  173. return nil, err
  174. }
  175. return mm.(*[]model.SysModule), nil
  176. }
  177. // SysModFindByTemplateIDAndSkip is 根据模板id 查找对应模块
  178. func SysModFindByTemplateIDAndSkip(Db *xorm.Engine, id interface{}, skip string) (*model.SysModule, error) {
  179. var m model.SysModule
  180. if has, err := Db.Where("state = 1 AND template_id = ? AND skip_identifier = ?", id, skip).
  181. Get(&m); err != nil || has == false {
  182. return nil, logx.Warn(err)
  183. }
  184. return &m, nil
  185. }
  186. // SysModFindByTemplateIDAndPID is 根据模板id 和pid =0 查找父模块
  187. func SysModFindByTemplateIDAndPID(Db *xorm.Engine, id interface{}, pid interface{}) (*model.SysModule, error) {
  188. var m model.SysModule
  189. if has, err := Db.Where("state = 1 AND template_id = ? AND mod_pid = ?", id, pid).
  190. Get(&m); err != nil || has == false {
  191. return nil, logx.Warn(err)
  192. }
  193. return &m, nil
  194. }
  195. // SysModFindByTemplateIDAndModName is 根据模板id 和mod name 查找模块
  196. func SysModFindByTemplateIDAndModName(Db *xorm.Engine, id interface{}, modName string) (*model.SysModule, error) {
  197. var m model.SysModule
  198. if has, err := Db.Where("state = 1 AND template_id = ? AND mod_name = ?", id, modName).
  199. Get(&m); err != nil || has == false {
  200. return nil, logx.Warn(err)
  201. }
  202. return &m, nil
  203. }
  204. // SysModFindNavIsUsed 查找正在使用的底部导航栏模板
  205. func SysModFindNavIsUsedByPlatform(c *gin.Context, Db *xorm.Engine, platform string) (*model.SysModule, error) {
  206. var (
  207. tm model.SysTemplate
  208. m model.SysModule
  209. )
  210. switch platform {
  211. case "ios":
  212. if has, err := Db.Where("is_use = 1 AND type = 'bottom' AND platform = 2 ").
  213. Cols("id,uid,name,is_use,is_system").
  214. Get(&tm); err != nil || has == false {
  215. return nil, logx.Warn(err)
  216. }
  217. appvserison := SysCfgGet(c, "ios_audit_version")
  218. if c.GetHeader("app_version_name") == appvserison && c.GetHeader("app_version_name") != "" {
  219. m, err := GetCloudBundleByVersion(Db, appvserison, 2)
  220. if err != nil {
  221. return nil, logx.Warn(err)
  222. }
  223. tm.Id = int(gjson.Get(m.TemplateDuringAudit, "bottom").Int())
  224. }
  225. if has, err := Db.Where("state = 1 AND template_id = ? AND mod_name = 'bottom_nav'", tm.Id).
  226. Get(&m); err != nil || has == false {
  227. return nil, logx.Warn(err)
  228. }
  229. mm, err := sysModFormat(c, &m)
  230. if err != nil {
  231. return nil, err
  232. }
  233. return mm.(*model.SysModule), nil
  234. case "android":
  235. has, err := Db.Where("is_use = 1 AND type = 'bottom' AND platform = 2 ").Cols("id,uid,name,is_use,is_system").Get(&tm)
  236. if err != nil || has == false {
  237. return nil, logx.Warn(err)
  238. }
  239. appvserison := SysCfgGet(c, "android_audit_version")
  240. if appvserison != "" && c.GetHeader("app_version_name") == appvserison {
  241. m, err := GetCloudBundleByVersion(Db, appvserison, 1)
  242. if err != nil {
  243. return nil, logx.Warn(err)
  244. }
  245. tm.Id = int(gjson.Get(m.TemplateDuringAudit, "bottom").Int())
  246. }
  247. if has, err := Db.Where("state = 1 AND template_id = ? AND mod_name = 'bottom_nav'", tm.Id).
  248. Get(&m); err != nil || has == false {
  249. return nil, logx.Warn(err)
  250. }
  251. mm, err := sysModFormat(c, &m)
  252. if err != nil {
  253. return nil, err
  254. }
  255. return mm.(*model.SysModule), nil
  256. case "wx_applet", "wap":
  257. if has, err := Db.Where("is_use = 1 AND type = 'bottom' AND platform = 4 ").
  258. Cols("id,uid,name,is_use,is_system").
  259. Get(&tm); err != nil || has == false {
  260. return nil, logx.Warn(err)
  261. }
  262. appvserison := SysCfgGet(c, "mp_audit_version")
  263. // fmt.Println("header:", c.Request.Header)
  264. if c.GetHeader("AppVersionName") == appvserison && c.GetHeader("AppVersionName") != "" {
  265. m, err := SysCfgGetOne(Db, "mp_audit_template")
  266. if err != nil {
  267. return nil, logx.Warn(err)
  268. }
  269. tm.Id = int(gjson.Get(m.Val, "bottom").Int())
  270. }
  271. // fmt.Println("template_id", tm.Id)
  272. if has, err := Db.Where("state = 1 AND template_id = ? AND mod_name = 'bottom_nav'", tm.Id).
  273. Get(&m); err != nil || has == false {
  274. return nil, logx.Warn(err)
  275. }
  276. mm, err := sysModFormat(c, &m)
  277. if err != nil {
  278. return nil, err
  279. }
  280. return mm.(*model.SysModule), nil
  281. case "baidu_applet":
  282. if has, err := Db.Where("is_use = 1 AND type = 'bottom' AND platform = 4 ").
  283. Cols("id,uid,name,is_use,is_system").
  284. Get(&tm); err != nil || has == false {
  285. return nil, logx.Warn(err)
  286. }
  287. appvserison := SysCfgGet(c, "baidu_audit_version")
  288. if appvserison != "" && c.GetHeader("app_version_name") == appvserison {
  289. m, err := SysCfgGetOne(Db, "baidu_audit_template")
  290. if err != nil {
  291. return nil, logx.Warn(err)
  292. }
  293. tm.Id = int(gjson.Get(m.Val, "bottom").Int())
  294. }
  295. if has, err := Db.Where("state = 1 AND template_id = ? AND mod_name = 'bottom_nav'", tm.Id).
  296. Get(&m); err != nil || has == false {
  297. return nil, logx.Warn(err)
  298. }
  299. mm, err := sysModFormat(c, &m)
  300. if err != nil {
  301. return nil, err
  302. }
  303. return mm.(*model.SysModule), nil
  304. case "toutiao_applet":
  305. if has, err := Db.Where("is_use = 1 AND type = 'bottom' AND platform = 4 ").
  306. Cols("id,uid,name,is_use,is_system").
  307. Get(&tm); err != nil || has == false {
  308. return nil, logx.Warn(err)
  309. }
  310. appvserison := SysCfgGet(c, "tt_audit_version")
  311. if appvserison != "" && c.GetHeader("app_version_name") == appvserison {
  312. m, err := SysCfgGetOne(Db, "tt_audit_template")
  313. if err != nil {
  314. return nil, logx.Warn(err)
  315. }
  316. tm.Id = int(gjson.Get(m.Val, "bottom").Int())
  317. }
  318. if has, err := Db.Where("state = 1 AND template_id = ? AND mod_name = 'bottom_nav'", tm.Id).
  319. Get(&m); err != nil || has == false {
  320. return nil, logx.Warn(err)
  321. }
  322. mm, err := sysModFormat(c, &m)
  323. if err != nil {
  324. return nil, err
  325. }
  326. return mm.(*model.SysModule), nil
  327. case "alipay_applet":
  328. if has, err := Db.Where("is_use = 1 AND type = 'bottom' AND platform = 4 ").
  329. Cols("id,uid,name,is_use,is_system").
  330. Get(&tm); err != nil || has == false {
  331. return nil, logx.Warn(err)
  332. }
  333. appvserison := SysCfgGet(c, "zfb_audit_version")
  334. if appvserison != "" && c.GetHeader("app_version_name") == appvserison {
  335. m, err := SysCfgGetOne(Db, "zfb_audit_template")
  336. if err != nil {
  337. return nil, logx.Warn(err)
  338. }
  339. tm.Id = int(gjson.Get(m.Val, "bottom").Int())
  340. }
  341. if has, err := Db.Where("state = 1 AND template_id = ? AND mod_name = 'bottom_nav'", tm.Id).
  342. Get(&m); err != nil || has == false {
  343. return nil, logx.Warn(err)
  344. }
  345. mm, err := sysModFormat(c, &m)
  346. if err != nil {
  347. return nil, err
  348. }
  349. return mm.(*model.SysModule), nil
  350. default:
  351. return &m, errors.New("Platform not support")
  352. }
  353. }
  354. // SysModFindBySkipIdentifierAndModName is 根据mod_name和位置 查找对应模块
  355. func SysModFindBySkipIdentifierAndModName(c *gin.Context, Db *xorm.Engine, name string, modName string) (*model.SysModule, error) {
  356. var m model.SysModule
  357. if has, err := Db.Where("state = 1 AND skip_identifier = ? AND mod_name = ?", name, modName).Get(&m); err != nil || !has {
  358. return nil, logx.Warn(err)
  359. }
  360. mm, err := sysModFormat(c, &m)
  361. if err != nil {
  362. return nil, err
  363. }
  364. return mm.(*model.SysModule), nil
  365. }
  366. // SysModFindByModName is 根据mod_name和位置 查找对应模块
  367. func SysModFindByModName(c *gin.Context, Db *xorm.Engine, modName string) (*model.SysModule, error) {
  368. var m model.SysModule
  369. if has, err := Db.Where("state = 1 AND mod_name = ?", modName).Get(&m); err != nil || !has {
  370. return nil, logx.Warn(err)
  371. }
  372. mm, err := sysModFormat(c, &m)
  373. if err != nil {
  374. return nil, err
  375. }
  376. return mm.(*model.SysModule), nil
  377. }
  378. // 根据跳转标识和平台类型查找
  379. func SysModFindBySkipIdentifierAndPlatform(c *gin.Context, Db *xorm.Engine, name string, platform int) (*model.SysModule, error) {
  380. var m model.SysModule
  381. if has, err := Db.Where("state = 1 AND skip_identifier = ? AND platform = ?", name, platform).Get(&m); err != nil || !has {
  382. return nil, logx.Warn(err)
  383. }
  384. mm, err := sysModFormat(c, &m)
  385. if err != nil {
  386. return nil, err
  387. }
  388. return mm.(*model.SysModule), nil
  389. }
  390. //公共处理modData的链接
  391. func SysModDataByReplace(c *gin.Context, mod model.SysModule) model.SysModule {
  392. //替换链接的一些参数
  393. if strings.Contains(mod.Data, "[replace_APP_URL]") {
  394. mod.Data = strings.Replace(mod.Data, "[replace_APP_URL]", c.GetString("domain_wap_base"), -1)
  395. }
  396. if strings.Contains(mod.Data, "[replace_masterId]") {
  397. mod.Data = strings.Replace(mod.Data, "[replace_masterId]", c.GetString("mid"), -1)
  398. }
  399. if strings.Contains(mod.Data, "优惠卷") {
  400. mod.Data = strings.Replace(mod.Data, "优惠卷", "优惠券", -1)
  401. }
  402. if strings.Contains(mod.Data, "[replace_uid]") {
  403. token := c.GetHeader("Authorization")
  404. // 按空格分割
  405. parts := strings.SplitN(token, " ", 2)
  406. if len(parts) == 2 && parts[0] == "Bearer" {
  407. // parts[1]是获取到的tokenString,我们使用之前定义好的解析JWT的函数来解析它
  408. mc, _ := utils.ParseToken(parts[1])
  409. mod.Data = strings.Replace(mod.Data, "[replace_uid]", strconv.Itoa(mc.UID), -1)
  410. }
  411. }
  412. //if strings.Contains(mod.Data, "\"child_category_id") && strings.Contains(mod.Data, "\"category_id") {
  413. // //如果存在这两个字段,要换一下
  414. // mod.Data = strings.ReplaceAll(mod.Data, "\"category_id", "\"null_category_id")
  415. // mod.Data = strings.ReplaceAll(mod.Data, "\"child_category_id", "\"category_id")
  416. //}
  417. return mod
  418. }
  419. //公共处理modData的链接
  420. func SysModDataByReplaceSecond(c *gin.Context, mod *model.SysModule) *model.SysModule {
  421. //替换链接的一些参数
  422. if strings.Contains(mod.Data, "[replace_APP_URL]") {
  423. mod.Data = strings.Replace(mod.Data, "[replace_APP_URL]", c.GetString("domain_wap_base"), -1)
  424. }
  425. if strings.Contains(mod.Data, "[replace_masterId]") {
  426. mod.Data = strings.Replace(mod.Data, "[replace_masterId]", c.GetString("mid"), -1)
  427. }
  428. if strings.Contains(mod.Data, "优惠卷") {
  429. mod.Data = strings.Replace(mod.Data, "优惠卷", "优惠券", -1)
  430. }
  431. if strings.Contains(mod.Data, "[replace_uid]") {
  432. token := c.GetHeader("Authorization")
  433. // 按空格分割
  434. parts := strings.SplitN(token, " ", 2)
  435. if len(parts) == 2 && parts[0] == "Bearer" {
  436. // parts[1]是获取到的tokenString,我们使用之前定义好的解析JWT的函数来解析它
  437. mc, _ := utils.ParseToken(parts[1])
  438. mod.Data = strings.Replace(mod.Data, "[replace_uid]", strconv.Itoa(mc.UID), -1)
  439. }
  440. }
  441. //if strings.Contains(mod.Data, "\"child_category_id") && strings.Contains(mod.Data, "\"category_id") {
  442. // //如果存在这两个字段,要换一下
  443. // mod.Data = strings.ReplaceAll(mod.Data, "\"category_id", "\"null_category_id")
  444. // mod.Data = strings.ReplaceAll(mod.Data, "\"child_category_id", "\"category_id")
  445. //}
  446. return mod
  447. }