Browse Source

Merge branch 'master' into bjcz_his_scrm

# Conflicts:
#	src/views/course/courseWatchLog/index.vue
#	src/views/course/courseWatchLog/watchLog.vue
#	src/views/member/mylist.vue
#	src/views/qw/sopTemp/index.vue
吴树波 1 tháng trước cách đây
mục cha
commit
1460fdfd2c
100 tập tin đã thay đổi với 3529 bổ sung11 xóa
  1. 23 0
      .env.development
  2. 3 0
      .env.prod-bjczwh
  3. 3 0
      .env.prod-bjyjb
  4. 45 0
      .env.prod-bjzm
  5. 3 0
      .env.prod-bly
  6. 3 0
      .env.prod-bnkc
  7. 3 0
      .env.prod-cqtyt
  8. 3 0
      .env.prod-cqxzt
  9. 3 0
      .env.prod-czt
  10. 3 0
      .env.prod-ddgy
  11. 4 0
      .env.prod-drk
  12. 4 0
      .env.prod-fby
  13. 25 0
      .env.prod-gzzdy
  14. 4 0
      .env.prod-hat
  15. 3 0
      .env.prod-hcl
  16. 4 0
      .env.prod-hdt
  17. 22 0
      .env.prod-heyantang
  18. 3 0
      .env.prod-hst
  19. 4 0
      .env.prod-hyt
  20. 3 0
      .env.prod-hzyy
  21. 4 0
      .env.prod-jkj
  22. 4 1
      .env.prod-jnlzjk
  23. 3 0
      .env.prod-jnmy
  24. 22 0
      .env.prod-jnsyj
  25. 4 0
      .env.prod-jzzx
  26. 4 0
      .env.prod-knt
  27. 26 0
      .env.prod-knt2
  28. 3 0
      .env.prod-kyt
  29. 4 0
      .env.prod-lmjy
  30. 3 0
      .env.prod-myhk
  31. 3 0
      .env.prod-nmgyt
  32. 4 0
      .env.prod-qdtst
  33. 26 0
      .env.prod-sczy
  34. 4 0
      .env.prod-sft
  35. 3 0
      .env.prod-sxjz
  36. 4 0
      .env.prod-syysy
  37. 3 0
      .env.prod-test
  38. 4 0
      .env.prod-whhm
  39. 3 0
      .env.prod-xfk
  40. 4 0
      .env.prod-ylrz
  41. 26 0
      .env.prod-yxj
  42. 4 0
      .env.prod-yzt
  43. 3 0
      .env.prod-zkzh
  44. 3 0
      .env.prod-zsjk
  45. 33 5
      .env.production
  46. 11 0
      package.json
  47. 9 1
      src/api/common.js
  48. 16 0
      src/api/company/companyConfig.js
  49. 53 0
      src/api/company/companyUser.js
  50. 9 0
      src/api/company/redPacket.js
  51. 8 0
      src/api/course/courseFinishTemp.js
  52. 37 1
      src/api/course/courseFinishTempParent.js
  53. 14 0
      src/api/course/userCoursePeriod.js
  54. 117 0
      src/api/hisStore/user.js
  55. 61 0
      src/api/hisStore/userAddress.js
  56. 62 0
      src/api/live/gift.js
  57. 141 0
      src/api/live/live.js
  58. 77 0
      src/api/live/liveAfterSales.js
  59. 53 0
      src/api/live/liveAnchor.js
  60. 137 0
      src/api/live/liveCoupon.js
  61. 61 0
      src/api/live/liveData.js
  62. 96 0
      src/api/live/liveGoods.js
  63. 62 0
      src/api/live/liveLotteryConf.js
  64. 61 0
      src/api/live/liveLotteryProductConf.js
  65. 62 0
      src/api/live/liveMsg.js
  66. 168 0
      src/api/live/liveOrder.js
  67. 53 0
      src/api/live/liveOrderitems.js
  68. 10 0
      src/api/live/liveProfit.js
  69. 53 0
      src/api/live/liveQuestion.js
  70. 36 0
      src/api/live/liveQuestionBank.js
  71. 89 0
      src/api/live/liveQuestionLive.js
  72. 63 0
      src/api/live/liveRedConf.js
  73. 19 0
      src/api/live/liveRewardRecord.js
  74. 62 0
      src/api/live/liveUserLotteryRecord.js
  75. 68 0
      src/api/live/liveVideo.js
  76. 43 0
      src/api/live/liveWatchUser.js
  77. 86 0
      src/api/live/task.js
  78. 53 0
      src/api/live/words.js
  79. 8 0
      src/api/qw/qwDept.js
  80. 17 0
      src/api/qw/sopTemp.js
  81. 8 0
      src/api/qw/sopUserLogs.js
  82. 9 0
      src/api/qw/user.js
  83. 76 0
      src/api/store/collectionSchedule.js
  84. 18 0
      src/api/store/packageOrder.js
  85. 1 1
      src/api/store/patient.js
  86. 18 0
      src/api/wechat.js
  87. BIN
      src/assets/images/videoIsAudit.png
  88. BIN
      src/assets/images/videoNotStart.png
  89. BIN
      src/assets/logo/bjzmky.png
  90. BIN
      src/assets/logo/cdhyt.jpg
  91. BIN
      src/assets/logo/gzzdy_logo.png
  92. BIN
      src/assets/logo/sczy.png
  93. BIN
      src/assets/logo/yxj.jpg
  94. 274 0
      src/components/LiveVideoUpload/index.vue
  95. 446 0
      src/components/LiveVideoUpload/single.vue
  96. 11 1
      src/router/index.js
  97. 40 1
      src/store/index.js
  98. 96 0
      src/utils/cos.js
  99. 112 0
      src/utils/liveWS.js
  100. 73 0
      src/utils/obs.js

+ 23 - 0
.env.development

@@ -9,6 +9,26 @@ VUE_APP_ICP_URL =https://beian.miit.gov.cn
 # 网站LOG
 VUE_APP_LOG_URL =@/assets/logo/myhk.png
 
+# 存储桶配置
+VUE_APP_OBS_ACCESS_KEY_ID = K2UTJGIN7UTZJR2XMXYG
+# 存储桶配置
+VUE_APP_OBS_SECRET_ACCESS_KEY = sbyeNJLbcYmH6copxeFP9pAoksM4NIT9Zw4x0SRX
+# 存储桶配置
+VUE_APP_OBS_SERVER = https://obs.cn-north-4.myhuaweicloud.com
+# 存储桶配置
+VUE_APP_OBS_BUCKET = zkzh-hw079058881
+# 存储桶配置
+VUE_APP_COS_BUCKET = fs-1319721001
+# 存储桶配置
+VUE_APP_COS_REGION = ap-chongqing
+# 线路一地址
+VUE_APP_VIDEO_LINE_1 =
+# 线路二地址
+VUE_APP_VIDEO_LINE_2 = https://zkzhobs.ylrztop.com
+
+VUE_APP_LIVE_WS_URL = ws://127.0.0.1:7114/ws
+
+
 # 开发环境配置
 ENV = 'development'
 
@@ -26,5 +46,8 @@ VUE_APP_PATIENT_INFO = '客户信息'
 # 添加病人
 VUE_APP_ADD_PATIENT = '添加信息'
 
+#项目所属
+VUE_APP_PROJECT_FROM=dev
+
 #1、正常搜索下拉框 2、查询出200条数据,然后搜索这200条以内的
 VUE_APP_COURSE_COMPANY_NAME = 2

+ 3 - 0
.env.prod-bjczwh

@@ -19,5 +19,8 @@ VUE_APP_BASE_API = '/prod-api'
 #默认 1、会员 2、企微
 VUE_APP_COURSE_DEFAULT = 1
 
+#项目所属
+VUE_APP_PROJECT_FROM=bjczwh
+
 # 路由懒加载
 VUE_CLI_BABEL_TRANSPILE_MODULES = true

+ 3 - 0
.env.prod-bjyjb

@@ -18,5 +18,8 @@ VUE_APP_BASE_API = '/prod-api'
 #默认 1、会员 2、企微
 VUE_APP_COURSE_DEFAULT = 1
 
+#项目所属
+VUE_APP_PROJECT_FROM=bjyjb
+
 # 路由懒加载
 VUE_CLI_BABEL_TRANSPILE_MODULES = true

+ 45 - 0
.env.prod-bjzm

@@ -0,0 +1,45 @@
+# 页面标题
+VUE_APP_TITLE =北京卓美悦康销售端
+# 公司名称
+VUE_APP_COMPANY_NAME =北京卓美悦康
+# ICP备案号
+VUE_APP_ICP_RECORD =京ICP备2024068752号
+# ICP网站访问地址
+VUE_APP_ICP_URL =https://beian.miit.gov.cn
+# 网站LOG
+VUE_APP_LOG_URL =@/assets/logo/bjzmky.png
+
+# 存储桶配置
+VUE_APP_OBS_ACCESS_KEY_ID = K2UTJGIN7UTZJR2XMXYG
+# 存储桶配置
+VUE_APP_OBS_SECRET_ACCESS_KEY = sbyeNJLbcYmH6copxeFP9pAoksM4NIT9Zw4x0SRX
+# 存储桶配置
+VUE_APP_OBS_SERVER = https://bjzmobs.cn-north-4.myhuaweicloud.com
+# 存储桶配置
+VUE_APP_OBS_BUCKET = bjzm
+# 存储桶配置
+VUE_APP_COS_BUCKET = bjzmky-1323137866
+# 存储桶配置
+VUE_APP_COS_REGION = ap-chongqing
+# 线路一地址
+VUE_APP_VIDEO_LINE_1 = https://bjzmky-1323137866.cos.ap-chongqing.myqcloud.com
+# 线路二地址
+VUE_APP_VIDEO_LINE_2 = https://bjzmobs.ylrztop.com
+
+# 生产环境配置
+ENV = 'production'
+
+# FS管理系统/开发环境
+VUE_APP_BASE_API = '/prod-api'
+
+
+#默认 1、会员 2、企微
+VUE_APP_COURSE_DEFAULT = 1
+
+#项目所属
+VUE_APP_PROJECT_FROM=bjczwh
+
+# 路由懒加载
+VUE_CLI_BABEL_TRANSPILE_MODULES = true
+
+VUE_APP_LIVE_WS_URL = wss://ws.klbycp.com/ws

+ 3 - 0
.env.prod-bly

@@ -15,5 +15,8 @@ ENV = 'production'
 #FS管理系统/生产环境
 VUE_APP_BASE_API = '/prod-api'
 
+#项目所属
+VUE_APP_PROJECT_FROM=bly
+
 # 路由懒加载
 VUE_CLI_BABEL_TRANSPILE_MODULES = true

+ 3 - 0
.env.prod-bnkc

@@ -19,5 +19,8 @@ VUE_APP_BASE_API = '/prod-api'
 #默认 1、会员 2、企微
 VUE_APP_COURSE_DEFAULT = 1
 
+#项目所属
+VUE_APP_PROJECT_FROM=bnkc
+
 # 路由懒加载
 VUE_CLI_BABEL_TRANSPILE_MODULES = true

+ 3 - 0
.env.prod-cqtyt

@@ -18,5 +18,8 @@ VUE_APP_BASE_API = '/prod-api'
 #默认 1、会员 2、企微
 VUE_APP_COURSE_DEFAULT = 1
 
+#项目所属
+VUE_APP_PROJECT_FROM=cqtyt
+
 # 路由懒加载
 VUE_CLI_BABEL_TRANSPILE_MODULES = true

+ 3 - 0
.env.prod-cqxzt

@@ -18,5 +18,8 @@ VUE_APP_BASE_API = '/prod-api'
 #默认 1、会员 2、企微
 VUE_APP_COURSE_DEFAULT = 1
 
+#项目所属
+VUE_APP_PROJECT_FROM=cqxzt
+
 # 路由懒加载
 VUE_CLI_BABEL_TRANSPILE_MODULES = true

+ 3 - 0
.env.prod-czt

@@ -18,5 +18,8 @@ VUE_APP_BASE_API = '/prod-api'
 #默认 1、会员 2、企微
 VUE_APP_COURSE_DEFAULT = 2
 
+#项目所属
+VUE_APP_PROJECT_FROM=czt
+
 # 路由懒加载
 VUE_CLI_BABEL_TRANSPILE_MODULES = true

+ 3 - 0
.env.prod-ddgy

@@ -18,5 +18,8 @@ VUE_APP_BASE_API = '/prod-api'
 #默认 1、会员 2、企微
 VUE_APP_COURSE_DEFAULT = 1
 
+#项目所属
+VUE_APP_PROJECT_FROM=ddgy
+
 # 路由懒加载
 VUE_CLI_BABEL_TRANSPILE_MODULES = true

+ 4 - 0
.env.prod-drk

@@ -18,5 +18,9 @@ VUE_APP_BASE_API = '/prod-api'
 #默认 1、会员 2、企微
 VUE_APP_COURSE_DEFAULT = 1
 
+
+#项目所属
+VUE_APP_PROJECT_FROM=drk
+
 # 路由懒加载
 VUE_CLI_BABEL_TRANSPILE_MODULES = true

+ 4 - 0
.env.prod-fby

@@ -18,6 +18,10 @@ VUE_APP_BASE_API = '/prod-api'
 # 路由懒加载
 VUE_CLI_BABEL_TRANSPILE_MODULES = true
 
+
+#项目所属
+VUE_APP_PROJECT_FROM=fby
+
 #默认 1、会员 2、企微
 VUE_APP_COURSE_DEFAULT = 2
 

+ 25 - 0
.env.prod-gzzdy

@@ -0,0 +1,25 @@
+# 页面标题
+VUE_APP_TITLE =郑多燕SCRM销售端
+# 公司名称
+VUE_APP_COMPANY_NAME =广州郑多燕健康管理有限公司
+# ICP备案号
+VUE_APP_ICP_RECORD =粤ICP备2023104913号-7
+# ICP网站访问地址
+VUE_APP_ICP_URL =https://beian.miit.gov.cn
+# 网站LOG
+VUE_APP_LOG_URL =@/assets/logo/gzzdy_logo.png
+
+# 生产环境配置
+ENV = 'production'
+
+# FS管理系统/开发环境
+VUE_APP_BASE_API = '/prod-api'
+
+#默认 1、会员 2、企微
+VUE_APP_COURSE_DEFAULT = 2
+
+#项目所属
+VUE_APP_PROJECT_FROM=gzzdy
+
+# 路由懒加载
+VUE_CLI_BABEL_TRANSPILE_MODULES = true

+ 4 - 0
.env.prod-hat

@@ -18,5 +18,9 @@ VUE_APP_BASE_API = '/prod-api'
 #默认 1、会员 2、企微
 VUE_APP_COURSE_DEFAULT = 2
 
+
+#项目所属
+VUE_APP_PROJECT_FROM=hat
+
 # 路由懒加载
 VUE_CLI_BABEL_TRANSPILE_MODULES = true

+ 3 - 0
.env.prod-hcl

@@ -18,5 +18,8 @@ VUE_APP_BASE_API = '/prod-api'
 #默认 1、会员 2、企微
 VUE_APP_COURSE_DEFAULT = 1
 
+#项目所属
+VUE_APP_PROJECT_FROM=hcl
+
 # 路由懒加载
 VUE_CLI_BABEL_TRANSPILE_MODULES = true

+ 4 - 0
.env.prod-hdt

@@ -18,5 +18,9 @@ VUE_APP_BASE_API = '/prod-api'
 #默认 1、会员 2、企微
 VUE_APP_COURSE_DEFAULT = 1
 
+
+#项目所属
+VUE_APP_PROJECT_FROM=hat
+
 # 路由懒加载
 VUE_CLI_BABEL_TRANSPILE_MODULES = true

+ 22 - 0
.env.prod-heyantang

@@ -0,0 +1,22 @@
+# 页面标题
+VUE_APP_TITLE =成都鹤颜堂健康管理
+# 公司名称
+VUE_APP_COMPANY_NAME =成都御养堂健康管理有限公司
+# ICP备案号
+VUE_APP_ICP_RECORD =蜀ICP备2024054506号-51
+# ICP网站访问地址
+VUE_APP_ICP_URL =https://beian.miit.gov.cn
+# 网站LOG
+VUE_APP_LOG_URL =@/assets/logo/cdhyt.jpg
+
+# 生产环境配置
+ENV = 'production'
+
+# FS管理系统/开发环境
+VUE_APP_BASE_API = '/prod-api'
+
+#默认 1、会员 2、企微
+VUE_APP_COURSE_DEFAULT = 1
+
+# 路由懒加载
+VUE_CLI_BABEL_TRANSPILE_MODULES = true

+ 3 - 0
.env.prod-hst

@@ -18,5 +18,8 @@ VUE_APP_BASE_API = '/prod-api'
 #默认 1、会员 2、企微
 VUE_APP_COURSE_DEFAULT = 2
 
+#项目所属
+VUE_APP_PROJECT_FROM=hst
+
 # 路由懒加载
 VUE_CLI_BABEL_TRANSPILE_MODULES = true

+ 4 - 0
.env.prod-hyt

@@ -18,5 +18,9 @@ VUE_APP_BASE_API = '/prod-api'
 #默认 1、会员 2、企微
 VUE_APP_COURSE_DEFAULT = 1
 
+
+#项目所属
+VUE_APP_PROJECT_FROM=hyt
+
 # 路由懒加载
 VUE_CLI_BABEL_TRANSPILE_MODULES = true

+ 3 - 0
.env.prod-hzyy

@@ -18,5 +18,8 @@ VUE_APP_BASE_API = '/prod-api'
 #默认 1、会员 2、企微
 VUE_APP_COURSE_DEFAULT = 2
 
+#项目所属
+VUE_APP_PROJECT_FROM=hzyy
+
 # 路由懒加载
 VUE_CLI_BABEL_TRANSPILE_MODULES = true

+ 4 - 0
.env.prod-jkj

@@ -15,5 +15,9 @@ ENV = 'production'
 # FS管理系统/开发环境
 VUE_APP_BASE_API = '/prod-api'
 
+
+#项目所属
+VUE_APP_PROJECT_FROM=jkj
+
 # 路由懒加载
 VUE_CLI_BABEL_TRANSPILE_MODULES = true

+ 4 - 1
.env.prod-jnlzjk

@@ -17,7 +17,10 @@ VUE_APP_BASE_API = '/prod-api'
 
 
 #默认 1、会员 2、企微
-VUE_APP_COURSE_DEFAULT = 1
+VUE_APP_COURSE_DEFAULT = 2
+
+#项目所属
+VUE_APP_PROJECT_FROM=jnlzjk
 
 # 路由懒加载
 VUE_CLI_BABEL_TRANSPILE_MODULES = true

+ 3 - 0
.env.prod-jnmy

@@ -18,5 +18,8 @@ VUE_APP_BASE_API = '/prod-api'
 #默认 1、会员 2、企微
 VUE_APP_COURSE_DEFAULT = 2
 
+#项目所属
+VUE_APP_PROJECT_FROM=jnmy
+
 # 路由懒加载
 VUE_CLI_BABEL_TRANSPILE_MODULES = true

+ 22 - 0
.env.prod-jnsyj

@@ -0,0 +1,22 @@
+# 页面标题
+VUE_APP_TITLE =互联网医院管理系统
+# 公司名称
+VUE_APP_COMPANY_NAME =济南顺亿景互联网医院有限公司
+# ICP备案号
+VUE_APP_ICP_RECORD =蜀ICP备2024052643号
+# ICP网站访问地址
+VUE_APP_ICP_URL =https://beian.miit.gov.cn
+# 网站LOG
+VUE_APP_LOG_URL =@/assets/logo/jnmy.png
+
+# 生产环境配置
+ENV = 'production'
+
+# FS管理系统/开发环境
+VUE_APP_BASE_API = '/prod-api'
+
+#默认 1、会员 2、企微
+VUE_APP_COURSE_DEFAULT = 2
+
+# 路由懒加载
+VUE_CLI_BABEL_TRANSPILE_MODULES = true

+ 4 - 0
.env.prod-jzzx

@@ -18,5 +18,9 @@ VUE_APP_BASE_API = '/prod-api'
 #默认 1、会员 2、企微
 VUE_APP_COURSE_DEFAULT = 2
 
+
+#项目所属
+VUE_APP_PROJECT_FROM=jzzx
+
 # 路由懒加载
 VUE_CLI_BABEL_TRANSPILE_MODULES = true

+ 4 - 0
.env.prod-knt

@@ -18,5 +18,9 @@ VUE_APP_BASE_API = '/prod-api'
 # 路由懒加载
 VUE_CLI_BABEL_TRANSPILE_MODULES = true
 
+
+#项目所属
+VUE_APP_PROJECT_FROM=knt
+
 #默认 1、会员 2、企微
 VUE_APP_COURSE_DEFAULT = 1

+ 26 - 0
.env.prod-knt2

@@ -0,0 +1,26 @@
+# 页面标题
+VUE_APP_TITLE = 康年堂SCRM销售端
+# 公司名称
+VUE_APP_COMPANY_NAME = 陕西康年堂医药连锁有限公司
+# ICP备案号
+VUE_APP_ICP_RECORD = 陕ICP备2023011686号-5
+# ICP网站访问地址
+VUE_APP_ICP_URL =https://beian.miit.gov.cn
+# 网站LOG
+VUE_APP_LOG_URL =@/assets/logo/knt.jpg
+
+# 生产环境配置
+ENV = 'production'
+
+#FS管理系统/生产环境
+VUE_APP_BASE_API = '/prod-api'
+
+# 路由懒加载
+VUE_CLI_BABEL_TRANSPILE_MODULES = true
+
+
+#项目所属
+VUE_APP_PROJECT_FROM=knt
+
+#默认 1、会员 2、企微
+VUE_APP_COURSE_DEFAULT = 1

+ 3 - 0
.env.prod-kyt

@@ -18,5 +18,8 @@ VUE_APP_BASE_API = '/prod-api'
 #默认 1、会员 2、企微
 VUE_APP_COURSE_DEFAULT = 2
 
+#项目所属
+VUE_APP_PROJECT_FROM=kyt
+
 # 路由懒加载
 VUE_CLI_BABEL_TRANSPILE_MODULES = true

+ 4 - 0
.env.prod-lmjy

@@ -18,5 +18,9 @@ VUE_APP_BASE_API = '/prod-api'
 #默认 1、会员 2、企微
 VUE_APP_COURSE_DEFAULT = 1
 
+
+#项目所属
+VUE_APP_PROJECT_FROM=lmjy
+
 # 路由懒加载
 VUE_CLI_BABEL_TRANSPILE_MODULES = true

+ 3 - 0
.env.prod-myhk

@@ -18,5 +18,8 @@ VUE_APP_BASE_API = '/prod-api'
 #默认 1、会员 2、企微
 VUE_APP_COURSE_DEFAULT = 2
 
+#项目所属
+VUE_APP_PROJECT_FROM=myhk
+
 # 路由懒加载
 VUE_CLI_BABEL_TRANSPILE_MODULES = true

+ 3 - 0
.env.prod-nmgyt

@@ -18,5 +18,8 @@ VUE_APP_BASE_API = '/prod-api'
 #默认 1、会员 2、企微
 VUE_APP_COURSE_DEFAULT = 2
 
+#项目所属
+VUE_APP_PROJECT_FROM=nmgyt
+
 # 路由懒加载
 VUE_CLI_BABEL_TRANSPILE_MODULES = true

+ 4 - 0
.env.prod-qdtst

@@ -18,5 +18,9 @@ VUE_APP_BASE_API = '/prod-api'
 #默认 1、会员 2、企微
 VUE_APP_COURSE_DEFAULT = 1
 
+
+#项目所属
+VUE_APP_PROJECT_FROM=qdtst
+
 # 路由懒加载
 VUE_CLI_BABEL_TRANSPILE_MODULES = true

+ 26 - 0
.env.prod-sczy

@@ -0,0 +1,26 @@
+# 页面标题
+VUE_APP_TITLE =致医SCRM销售端
+# 公司名称
+VUE_APP_COMPANY_NAME =云联融智互联网医院有限公司
+# ICP备案号
+VUE_APP_ICP_RECORD =渝ICP备2024031984号-1
+# ICP网站访问地址
+VUE_APP_ICP_URL =https://beian.miit.gov.cn
+# 网站LOG
+VUE_APP_LOG_URL =@/assets/logo/sczy.png
+
+# 生产环境配置
+ENV = 'production'
+
+# FS管理系统/开发环境
+VUE_APP_BASE_API = '/prod-api'
+
+#默认 1、会员 2、企微
+VUE_APP_COURSE_DEFAULT = 2
+
+
+#项目所属
+VUE_APP_PROJECT_FROM=sczy
+
+# 路由懒加载
+VUE_CLI_BABEL_TRANSPILE_MODULES = true

+ 4 - 0
.env.prod-sft

@@ -21,5 +21,9 @@ VUE_APP_COURSE_DEFAULT = 1
 # 路由懒加载
 VUE_CLI_BABEL_TRANSPILE_MODULES = true
 
+
+#项目所属
+VUE_APP_PROJECT_FROM=sft
+
 #1、正常搜索下拉框 2、查询出200条数据,然后搜索这200条以内的
 VUE_APP_COURSE_COMPANY_NAME = 2

+ 3 - 0
.env.prod-sxjz

@@ -18,5 +18,8 @@ VUE_APP_BASE_API = '/prod-api'
 #默认 1、会员 2、企微
 VUE_APP_COURSE_DEFAULT = 1
 
+#项目所属
+VUE_APP_PROJECT_FROM=sxjz
+
 # 路由懒加载
 VUE_CLI_BABEL_TRANSPILE_MODULES = true

+ 4 - 0
.env.prod-syysy

@@ -18,5 +18,9 @@ VUE_APP_BASE_API = '/prod-api'
 #默认 1、会员 2、企微
 VUE_APP_COURSE_DEFAULT = 1
 
+
+#项目所属
+VUE_APP_PROJECT_FROM=syysy
+
 # 路由懒加载
 VUE_CLI_BABEL_TRANSPILE_MODULES = true

+ 3 - 0
.env.prod-test

@@ -18,5 +18,8 @@ VUE_APP_BASE_API = '/prod-api'
 #默认 1、会员 2、企微
 VUE_APP_COURSE_DEFAULT = 1
 
+#项目所属
+VUE_APP_PROJECT_FROM=test
+
 # 路由懒加载
 VUE_CLI_BABEL_TRANSPILE_MODULES = true

+ 4 - 0
.env.prod-whhm

@@ -18,5 +18,9 @@ VUE_APP_BASE_API = '/prod-api'
 #默认 1、会员 2、企微
 VUE_APP_COURSE_DEFAULT = 1
 
+
+#项目所属
+VUE_APP_PROJECT_FROM=whhm
+
 # 路由懒加载
 VUE_CLI_BABEL_TRANSPILE_MODULES = true

+ 3 - 0
.env.prod-xfk

@@ -18,5 +18,8 @@ VUE_APP_BASE_API = '/prod-api'
 #默认 1、会员 2、企微
 VUE_APP_COURSE_DEFAULT = 2
 
+#项目所属
+VUE_APP_PROJECT_FROM=xfk
+
 # 路由懒加载
 VUE_CLI_BABEL_TRANSPILE_MODULES = true

+ 4 - 0
.env.prod-ylrz

@@ -15,5 +15,9 @@ ENV = 'production'
 # FS管理系统/开发环境
 VUE_APP_BASE_API = '/prod-api'
 
+
+#项目所属
+VUE_APP_PROJECT_FROM=ylrz
+
 # 路由懒加载
 VUE_CLI_BABEL_TRANSPILE_MODULES = true

+ 26 - 0
.env.prod-yxj

@@ -0,0 +1,26 @@
+# 页面标题
+VUE_APP_TITLE =易行健SCRM销售端
+# 公司名称
+VUE_APP_COMPANY_NAME =云联融智互联网医院有限公司
+# ICP备案号
+VUE_APP_ICP_RECORD =渝ICP备2024031984号-1
+# ICP网站访问地址
+VUE_APP_ICP_URL =https://beian.miit.gov.cn
+# 网站LOG
+VUE_APP_LOG_URL =@/assets/logo/yxj.jpg
+
+# 生产环境配置
+ENV = 'production'
+
+# FS管理系统/开发环境
+VUE_APP_BASE_API = '/prod-api'
+
+#默认 1、会员 2、企微
+VUE_APP_COURSE_DEFAULT = 2
+
+
+#项目所属
+VUE_APP_PROJECT_FROM=hat
+
+# 路由懒加载
+VUE_CLI_BABEL_TRANSPILE_MODULES = true

+ 4 - 0
.env.prod-yzt

@@ -18,5 +18,9 @@ VUE_APP_BASE_API = '/prod-api'
 #默认 1、会员 2、企微
 VUE_APP_COURSE_DEFAULT = 2
 
+
+#项目所属
+VUE_APP_PROJECT_FROM=yzt
+
 # 路由懒加载
 VUE_CLI_BABEL_TRANSPILE_MODULES = true

+ 3 - 0
.env.prod-zkzh

@@ -18,5 +18,8 @@ VUE_APP_BASE_API = '/prod-api'
 # 路由懒加载
 VUE_CLI_BABEL_TRANSPILE_MODULES = true
 
+#项目所属
+VUE_APP_PROJECT_FROM=zkzh
+
 #默认 1、会员 2、企微
 VUE_APP_COURSE_DEFAULT = 1

+ 3 - 0
.env.prod-zsjk

@@ -18,5 +18,8 @@ VUE_APP_BASE_API = '/prod-api'
 #默认 1、会员 2、企微
 VUE_APP_COURSE_DEFAULT = 2
 
+#项目所属
+VUE_APP_PROJECT_FROM=zsjk
+
 # 路由懒加载
 VUE_CLI_BABEL_TRANSPILE_MODULES = true

+ 33 - 5
.env.production

@@ -1,11 +1,39 @@
 # 页面标题
-VUE_APP_TITLE =互联网医院管理系统
-VUE_APP_COMPANY_NAME =重庆云联融智科技有限公司
-VUE_APP_ICP_RECORD =蜀ICP备2023036719号
+VUE_APP_TITLE = 互联网医院管理系统
+# 公司名称
+VUE_APP_COMPANY_NAME = 重庆云联融智科技有限公司
+# ICP备案号
+VUE_APP_ICP_RECORD = 蜀ICP备2023036719号
+# ICP网站访问地址
 VUE_APP_ICP_URL =https://beian.miit.gov.cn
+# 网站LOG
+VUE_APP_LOG_URL =@/assets/logo/myhk.png
 
-# 生产环境配置
+# 存储桶配置
+VUE_APP_OBS_ACCESS_KEY_ID = K2UTJGIN7UTZJR2XMXYG
+# 存储桶配置
+VUE_APP_OBS_SECRET_ACCESS_KEY = sbyeNJLbcYmH6copxeFP9pAoksM4NIT9Zw4x0SRX
+# 存储桶配置
+VUE_APP_OBS_SERVER = https://obs.cn-north-4.myhuaweicloud.com
+# 存储桶配置
+VUE_APP_OBS_BUCKET = zkzh-hw079058881
+# 存储桶配置
+VUE_APP_COS_BUCKET = fs-1319721001
+# 存储桶配置
+VUE_APP_COS_REGION = ap-chongqing
+# 线路一地址
+VUE_APP_VIDEO_LINE_1 = https://cos.his.cdwjyyh.com
+# 线路二地址
+VUE_APP_VIDEO_LINE_2 = https://zkzhobs.ylrztop.com
+
+# 开发环境配置
 ENV = 'production'
 
-#FS管理系统/生产环境
+# FS管理系统/开发环境
 VUE_APP_BASE_API = '/prod-api'
+
+# 路由懒加载
+VUE_CLI_BABEL_TRANSPILE_MODULES = true
+
+# 直播webSocket地址
+VUE_APP_LIVE_WS_URL = ws://127.0.0.1:7014/ws/

+ 11 - 0
package.json

@@ -17,6 +17,7 @@
     "build:prod-sxjz": "vue-cli-service build --mode prod-sxjz",
     "build:prod-jnmy": "vue-cli-service build --mode prod-jnmy",
     "build:prod-knt": "vue-cli-service build --mode prod-knt",
+    "build:prod-knt2": "vue-cli-service build --mode prod-knt2",
     "build:prod-hdt": "vue-cli-service build --mode prod-hdt",
     "build:prod-yzt": "vue-cli-service build --mode prod-yzt",
     "build:prod-xfk": "vue-cli-service build --mode prod-xfk",
@@ -31,6 +32,7 @@
     "build:prod-zkzh": "vue-cli-service build --mode prod-zkzh",
     "build:prod-nmgyt": "vue-cli-service build --mode prod-nmgyt",
     "build:prod-cqtyt": "vue-cli-service build --mode prod-cqtyt",
+    "build:prod-heyantang": "vue-cli-service build --mode prod-heyantang",
     "build:prod-bly": "vue-cli-service build --mode prod-bly",
     "build:prod-qdtst": "vue-cli-service build --mode prod-qdtst",
     "build:prod-bjczwh": "vue-cli-service build --mode prod-bjczwh",
@@ -44,8 +46,13 @@
     "build:prod-hyt": "vue-cli-service build --mode prod-hyt",
     "build:prod-hst": "vue-cli-service build --mode prod-hst",
     "build:prod-hat": "vue-cli-service build --mode prod-hat",
+    "build:prod-sczy": "vue-cli-service build --mode prod-sczy",
     "build:prod-ddgy": "vue-cli-service build --mode prod-ddgy",
     "build:prod-czt": "vue-cli-service build --mode prod-czt",
+    "build:prod-jnsyj": "vue-cli-service build --mode prod-jnsyj",
+    "build:prod-yxj": "vue-cli-service build --mode prod-yxj",
+    "build:prod-bjzm": "vue-cli-service build --mode prod-bjzm",
+    "build:prod-gzzdy": "vue-cli-service build --mode prod-gzzdy",
     "preview": "node build/index.js --preview",
     "lint": "eslint --ext .js,.vue src",
     "test:unit": "jest --clearCache && vue-cli-service test:unit",
@@ -82,12 +89,15 @@
     "clipboard": "2.0.4",
     "compression-webpack-plugin": "^5.0.1",
     "core-js": "3.6.5",
+    "cos-js-sdk-v5": "^1.10.1",
     "dayjs": "^1.11.13",
     "echarts": "4.2.1",
     "element-ui": "2.15.5",
+    "esdk-obs-browserjs": "^3.25.6",
     "file-saver": "2.0.1",
     "form-making": "^1.2.9",
     "fuse.js": "^3.4.4",
+    "hls.js": "^1.6.13",
     "js-beautify": "1.10.2",
     "js-cookie": "2.2.0",
     "jsencrypt": "3.0.0-rc.1",
@@ -104,6 +114,7 @@
     "stylus": "^0.54.7",
     "stylus-loader": "^3.0.2",
     "v-clipboard": "^2.2.3",
+    "vod-js-sdk-v6": "^1.7.1-beta.1",
     "vue": "2.6.10",
     "vue-clipboard2": "^0.3.1",
     "vue-count-to": "1.0.13",

+ 9 - 1
src/api/common.js

@@ -14,4 +14,12 @@ export function getTask(taskId) {
     method: 'get'
   })
 }
- 
+
+export function getTmpSecretKey(query) {
+  return request({
+    url: '/common/getTmpSecretKey',
+    method: 'get',
+    params:query
+  })
+
+}

+ 16 - 0
src/api/company/companyConfig.js

@@ -35,4 +35,20 @@ export function configUserCheck(data) {
   })
 }
 
+export function getCompanyMiniAppList() {
+  return request({
+    url: '/company/companyConfig/getCompanyMiniAppList',
+    method: 'get'
+  })
+}
+
+export function saveCompanyMiniApp(data) {
+  return request({
+    url: '/company/companyConfig/saveCompanyMiniApp',
+    method: 'post',
+    data: data
+  })
+}
+
+
 

+ 53 - 0
src/api/company/companyUser.js

@@ -43,6 +43,23 @@ export function getQwAllUserList(id) {
   })
 }
 
+
+export function getQwMyUserList(id) {
+  return request({
+    url: '/company/user/getQwMyUserList/'+id,
+    method: 'get'
+  })
+}
+
+export function getQwDeptUserList(id) {
+  return request({
+    url: '/company/user/getQwDeptUserList/'+id,
+    method: 'get'
+  })
+}
+
+
+
 export function getUserListByDeptId(query) {
   return request({
     url: '/company/user/getUserListByDeptId',
@@ -235,6 +252,16 @@ export function getCompanyUserListLikeName(params) {
   })
 }
 
+// 根据名模糊查询用户列表
+export function getCompanyUserListLikeNameByDept(params) {
+  return request({
+    url: '/company/user/getCompanyUserListLikeNameDept',
+    method: 'get',
+    params: params
+  })
+}
+
+
 // 查询企业员工信息列表
 export function listCompanyUser(query) {
   return request({
@@ -307,3 +334,29 @@ export function updateBatchUserRoles(data) {
     data: data
   })
 }
+
+// 根据手机号码查询fs_user(完全匹配)
+export function queryFsUserByPhone(phone) {
+  return request({
+    url: '/company/user/fsUser/queryByPhone',
+    method: 'get',
+    params: { phone: phone }
+  })
+}
+
+// 批量绑定用户到员工
+export function batchBindCompanyUserId(data) {
+  return request({
+    url: '/company/user/batchBindCompanyUserId',
+    method: 'post',
+    data: data
+  })
+}
+
+// 查询已绑定的用户
+export function getBoundUsers(companyUserId) {
+  return request({
+    url: '/company/user/getBoundUsers/' + companyUserId,
+    method: 'get'
+  })
+}

+ 9 - 0
src/api/company/redPacket.js

@@ -0,0 +1,9 @@
+import request from '@/utils/request'
+
+export function redPacketInfo(query) {
+  return request({
+    url: '/his/redPacket/info',
+    method: 'get',
+    params: query
+  })
+}

+ 8 - 0
src/api/course/courseFinishTemp.js

@@ -51,3 +51,11 @@ export function exportCourseFinishTemp(query) {
     params: query
   })
 }
+
+export function updateStatusBatch(data) {
+  return request({
+    url: '/course/courseFinishTemp/updateStatusBatch',
+    method: 'post',
+    data: data
+  })
+}

+ 37 - 1
src/api/course/courseFinishTempParent.js

@@ -9,6 +9,24 @@ export function listCourseFinishTempParent(query) {
   })
 }
 
+export function myListCourseFinishTempParent(query) {
+  return request({
+    url: '/course/courseFinishTempParent/myList',
+    method: 'get',
+    params: query
+  })
+}
+
+
+export function deptListCourseFinishTempParent(query) {
+  return request({
+    url: '/course/courseFinishTempParent/deptList',
+    method: 'get',
+    params: query
+  })
+}
+
+
 // 查询完课模板详细
 export function getCourseFinishTempParent(id) {
   return request({
@@ -50,4 +68,22 @@ export function exportCourseFinishTempParent(query) {
     method: 'get',
     params: query
   })
-}
+}
+
+export function myExportCourseFinishTempParent(query) {
+  return request({
+    url: '/course/courseFinishTempParent/myExport',
+    method: 'get',
+    params: query
+  })
+}
+
+
+
+export function deptExportCourseFinishTempParent(query) {
+  return request({
+    url: '/course/courseFinishTempParent/deptExport',
+    method: 'get',
+    params: query
+  })
+}

+ 14 - 0
src/api/course/userCoursePeriod.js

@@ -8,6 +8,14 @@ export function listPeriod(query) {
     params: query
   })
 }
+// 获取营期名称列表
+export function listPeriodLabel(query) {
+  return request({
+    url: '/course/period/listLabel',
+    method: 'get',
+    params: query
+  })
+}
 // 查询会员营期列表
 export function getDays(query) {
   return request({
@@ -175,6 +183,12 @@ export function updatePeriod(data) {
     method: 'put',
     data: data
   })
+}export function updatePeriodIsNeedRegisterMember(data) {
+  return request({
+    url: '/course/period/editIsNeedRegisterMember',
+    method: 'put',
+    data: data
+  })
 }
 
 // 根据营期id获取公司红包金额列表

+ 117 - 0
src/api/hisStore/user.js

@@ -0,0 +1,117 @@
+import request from '@/utils/request'
+
+// 查询用户列表
+export function listUser(query) {
+  return request({
+    url: '/store/store/user/list',
+    method: 'get',
+    params: query
+  })
+}
+export function listUserByProject(query) {
+  return request({
+    url: '/store/store/user/listProject',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询用户详细
+export function getUser(userId) {
+  return request({
+    url: '/store/store/user/' + userId,
+    method: 'get'
+  })
+}
+
+// 查询用户详细
+export function queryUserVo(userId) {
+  return request({
+    url: '/store/store/user/queryvo/' + userId,
+    method: 'get'
+  })
+}
+
+// 新增用户
+export function addUser(data) {
+  return request({
+    url: '/store/store/user',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改用户
+export function updateUser(data) {
+  return request({
+    url: '/store/store/user',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除用户
+export function delUser(userId) {
+  return request({
+    url: '/store/store/user/' + userId,
+    method: 'delete'
+  })
+}
+// 删除用户
+export function delUserCompanyUser(id) {
+  return request({
+    url: '/store/store/user/delete/' + id,
+    method: 'delete'
+  })
+}
+
+// 导出用户
+export function exportUser(query) {
+  return request({
+    url: '/store/store/user/export',
+    method: 'get',
+    params: query
+  })
+}
+
+export function getUserList(query) {
+  return request({
+    url: '/store/store/user/getUserList',
+    method: 'get',
+    params: query
+  })
+}
+
+export function listBySearch(query) {
+  return request({
+    url: '/store/store/user/listBySearch',
+    method: 'get',
+    params: query
+  })
+}
+
+export function getAllUserListLimit(query) {
+  return request({
+    url: '/store/company/companyUser/getAllUserListLimit',
+    method: 'get',
+    params: query
+  })
+}
+
+// 获取小黑屋用户列表
+export function darkRoomList(query) {
+  return request({
+    url: '/store/store/user/darkRoomList',
+    method: 'get',
+    params: query
+  })
+}
+
+// 批量解禁
+export function enabledUsers(data) {
+  return request({
+    url: '/store/store/user/enabledUsers',
+    method: 'post',
+    data: data
+  })
+}

+ 61 - 0
src/api/hisStore/userAddress.js

@@ -0,0 +1,61 @@
+import request from '@/utils/request'
+
+// 查询用户地址列表
+export function listUserAddress(query) {
+  return request({
+    url: '/store/store/userAddress/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询用户地址详细
+export function getUserAddress(id) {
+  return request({
+    url: '/store/store/userAddress/' + id,
+    method: 'get'
+  })
+}
+
+// 新增用户地址
+export function addUserAddress(data) {
+  return request({
+    url: '/store/store/userAddress',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改用户地址
+export function updateUserAddress(data) {
+  return request({
+    url: '/store/store/userAddress',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除用户地址
+export function delUserAddress(id) {
+  return request({
+    url: '/store/store/userAddress/' + id,
+    method: 'delete'
+  })
+}
+
+// 导出用户地址
+export function exportUserAddress(query) {
+  return request({
+    url: '/store/store/userAddress/export',
+    method: 'get',
+    params: query
+  })
+}
+
+export function getAddressList(query) {
+  return request({
+    url: '/store/store/userAddress/getAddressList',
+    method: 'get',
+    params: query
+  })
+}

+ 62 - 0
src/api/live/gift.js

@@ -0,0 +1,62 @@
+import request from '@/utils/request'
+
+// 查询直播间礼物配置列表
+export function listGift(query) {
+  return request({
+    url: '/live/gift/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询直播间礼物配置详细
+export function getGift(giftId) {
+  return request({
+    url: '/live/gift/' + giftId,
+    method: 'get'
+  })
+}
+
+// 新增直播间礼物配置
+export function addGift(data) {
+  return request({
+    url: '/live/gift',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改直播间礼物配置
+export function updateGift(data) {
+  return request({
+    url: '/live/gift',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除直播间礼物配置
+export function delGift(giftId) {
+  return request({
+    url: '/live/gift/' + giftId,
+    method: 'delete'
+  })
+}
+
+// 导出直播间礼物配置
+export function exportGift(query) {
+  return request({
+    url: '/live/gift/export',
+    method: 'get',
+    params: query
+  })
+}
+
+
+// 查询直播间礼物配置详细
+export function getDictData(dictType) {
+  return request({
+    url: '/system/dict/data/type/' + dictType,
+    method: 'get'
+  })
+}

+ 141 - 0
src/api/live/live.js

@@ -0,0 +1,141 @@
+import request from '@/utils/request'
+
+// 查询直播列表
+export function listLive(query) {
+  return request({
+    url: '/live/live/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询直播详细
+export function getLive(liveId) {
+  return request({
+    url: '/live/live/' + liveId,
+    method: 'get'
+  })
+}
+
+// 新增直播
+export function addLive(data) {
+  return request({
+    url: '/live/live',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改直播
+export function updateLive(data) {
+  return request({
+    url: '/live/live',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除直播
+export function delLive(liveId) {
+  return request({
+    url: '/live/live/' + liveId,
+    method: 'delete'
+  })
+}
+
+// 导出直播
+export function exportLive(query) {
+  return request({
+    url: '/live/live/export',
+    method: 'get',
+    params: query
+  })
+}
+// 查询未结束的直播间
+export function listToLiveNoEnd() {
+  return request({
+    url: '/live/live/listToLiveNoEnd',
+    method: 'get'
+  })
+}
+
+export function selectLiveToStudent(query) {
+  return request({
+    url: '/live/live/selectLiveToStudent?pageNum=' + query.pageNum + '&pageSize=' + query.pageSize,
+    method: 'post',
+    data: query
+  })
+}
+
+export function selectCompanyTalent(query) {
+  return request({
+    url: '/company/user/selectCompanyTalent/' + query,
+    method: 'get'
+  })
+}
+
+export function getLivingUrl(liveId) {
+  return request({
+    url: '/live/live/living/' + liveId,
+    method: 'get'
+  })
+}
+
+export function verifyIdInfo(data) {
+  return request({
+    url: '/live/live/verifyIdInfo',
+    method: 'post',
+    data: data
+  })
+}
+//上下架视频
+export function handleShelfOrUn(data) {
+  return request({
+    url: '/live/live/handleShelfOrUn',
+    method: 'post',
+    data: data
+  })
+}
+
+
+export function handleDeleteSelected(data) {
+  return request({
+    url: '/live/live/handleDeleteSelected',
+    method: 'post',
+    data: data
+  })
+}
+
+// 结束录播直播间
+export function finishLive(data) {
+  return request({
+    url: '/live/live/finishLive',
+    method: 'get',
+    params: data
+  })
+}
+// 复制录播直播间
+export function copyLive(data) {
+  return request({
+    url: '/live/live/copyLive',
+    method: 'get',
+    params: data
+  })
+}
+
+// 结束录播直播间
+export function startLive(data) {
+  return request({
+    url: '/live/live/startLive',
+    method: 'get',
+    params: data
+  })
+}
+// 生成直播间小程序二维码
+export function generateCode(data) {
+  return request({
+    url: '/live/live/getWxaCodeUnLimit',
+    method: 'get',
+    params: data
+  })
+}

+ 77 - 0
src/api/live/liveAfterSales.js

@@ -0,0 +1,77 @@
+import request from '@/utils/request'
+
+// 查询售后记录列表
+export function listLiveAfterSales(query) {
+  return request({
+    url: '/live/liveAfterSales/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询售后记录详细
+export function getLiveAfterSales(id) {
+  return request({
+    url: '/live/liveAfterSales/' + id,
+    method: 'get'
+  })
+}
+
+// 新增售后记录
+export function addLiveAfterSales(data) {
+  return request({
+    url: '/live/liveAfterSales',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改售后记录
+export function updateLiveAfterSales(data) {
+  return request({
+    url: '/live/liveAfterSales',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除售后记录
+export function delLiveAfterSales(id) {
+  return request({
+    url: '/live/liveAfterSales/' + id,
+    method: 'delete'
+  })
+}
+
+// 导出售后记录
+export function exportLiveAfterSales(query) {
+  return request({
+    url: '/live/liveAfterSales/export',
+    method: 'get',
+    params: query
+  })
+}
+
+export function cancel(data) {
+  return request({
+    url: '/live/liveAfterSales/cancel',
+    method: 'post',
+    data: data
+  })
+}
+
+export function refund(data) {
+  return request({
+    url: '/live/liveAfterSales/refund',
+    method: 'post',
+    data: data
+  })
+}
+
+export function audit(data) {
+  return request({
+    url: '/live/liveAfterSales/audit',
+    method: 'post',
+    data: data
+  })
+}

+ 53 - 0
src/api/live/liveAnchor.js

@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 查询主播列表
+export function listLiveAnchor(query) {
+  return request({
+    url: '/live/liveAnchor/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询主播详细
+export function getLiveAnchor(anchorId) {
+  return request({
+    url: '/live/liveAnchor/' + anchorId,
+    method: 'get'
+  })
+}
+
+// 新增主播
+export function addLiveAnchor(data) {
+  return request({
+    url: '/live/liveAnchor',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改主播
+export function updateLiveAnchor(data) {
+  return request({
+    url: '/live/liveAnchor',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除主播
+export function delLiveAnchor(anchorId) {
+  return request({
+    url: '/live/liveAnchor/' + anchorId,
+    method: 'delete'
+  })
+}
+
+// 导出主播
+export function exportLiveAnchor(query) {
+  return request({
+    url: '/live/liveAnchor/export',
+    method: 'get',
+    params: query
+  })
+}

+ 137 - 0
src/api/live/liveCoupon.js

@@ -0,0 +1,137 @@
+import request from '@/utils/request'
+
+// 查询优惠券列表
+export function listStoreCoupon(query) {
+  return request({
+    url: '/live/coupon/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询优惠券详细
+export function getStoreCoupon(couponId) {
+  return request({
+    url: '/live/coupon/' + couponId,
+    method: 'get'
+  })
+}
+
+// 新增优惠券
+export function addStoreCoupon(data) {
+  return request({
+    url: '/live/coupon',
+    method: 'post',
+    data: data
+  })
+}
+export function publishCoupon(data) {
+  return request({
+    url: '/live/coupon/publish',
+    method: 'post',
+    data: data
+  })
+}
+
+export function batchPublishCoupon(data) {
+  return request({
+    url: '/live/coupon/batchPublish',
+    method: 'post',
+    data: data
+  })
+}
+
+
+
+// 修改优惠券
+export function updateStoreCoupon(data) {
+  return request({
+    url: '/live/coupon',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除优惠券
+export function delStoreCoupon(couponId) {
+  return request({
+    url: '/live/coupon/' + couponId,
+    method: 'delete'
+  })
+}
+
+// 导出优惠券
+export function exportStoreCoupon(query) {
+  return request({
+    url: '/live/coupon/export',
+    method: 'get',
+    params: query
+  })
+}
+
+export function listLiveCoupon(query) {
+  return request({
+    url: '/live/coupon/listLiveCoupon',
+    method: 'get',
+    params: query
+  })
+}
+
+export function listCoupon(query) {
+  return request({
+    url: '/live/coupon/listCoupon',
+    method: 'get',
+    params: query
+  })
+}
+export function addLiveCoupon(data) {
+  return request({
+    url: '/live/coupon/addLiveCoupon',
+    method: 'post',
+    data: data
+  })
+}
+
+export function handleDeleteSelected(data) {
+  return request({
+    url: '/live/coupon/handleDeleteSelected',
+    method: 'post',
+    data: data
+  })
+}
+
+export function handleIsShowChange(data) {
+  return request({
+    url: '/live/coupon/handleIsShowChange',
+    method: 'post',
+    data: data
+  })
+}
+
+// 删除直播商品
+export function delLiveCoupon(data) {
+  return request({
+    url: '/live/coupon/delLiveCoupon',
+    method: 'post',
+    data: data
+  })
+}
+// 删除直播商品
+export function updateLiveCouponBind(data) {
+  return request({
+    url: '/live/coupon/updateLiveCouponBind',
+    method: 'post',
+    data: data
+  })
+}
+
+// 查询直播抽奖配置列表  未开启
+export function listLiveCouponOn(query) {
+  return request({
+    url: '/live/coupon/listOn',
+    method: 'get',
+    params: query
+  })
+}
+
+

+ 61 - 0
src/api/live/liveData.js

@@ -0,0 +1,61 @@
+import request from '@/utils/request'
+export function recentLive() {
+  return request({
+    url: '/liveData/liveData/recentLive',
+    method: 'get',
+  })
+}
+
+export function liveTop(query) {
+  return request({
+    url: '/liveData/liveData/getLiveTop',
+    method: 'get',
+    params: query
+  })
+}
+export function getTrendData(queryParams) {
+  return request({
+    url: '/liveData/liveData/getTrendData',
+    method: 'post',
+    data: queryParams
+  })
+}
+
+export function columns() {
+  return request({
+    url: '/liveData/liveData/columns',
+    method: 'get',
+  })
+}
+
+
+export function updateColumns(columns) {
+  return request({
+    url: '/liveData/liveData/updateColumns',
+    method: 'post',
+    data:columns,
+  })
+}
+
+export function queryStudentData(query) {
+  return request({
+    url: '/live/studentData/queryStudentData',
+    method: 'post',
+    data:query,
+  })
+}
+
+export function dashboardData(liveId) {
+  return request({
+    url: '/liveData/liveData/dashboardData' + '?liveId=' +liveId,
+    method: 'get'
+  })
+}
+export function listLiveData(data) {
+  return request({
+    url: '/liveData/liveData/listLiveData',
+    method: 'post',
+    data:data,
+  })
+}
+

+ 96 - 0
src/api/live/liveGoods.js

@@ -0,0 +1,96 @@
+import request from '@/utils/request'
+
+// 查询直播商品列表
+export function listLiveGoods(query) {
+  return request({
+    url: '/live/liveGoods/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询直播商品详细
+export function getLiveGoods(goodsId) {
+  return request({
+    url: '/live/liveGoods/' + goodsId,
+    method: 'get'
+  })
+}
+
+// 新增直播商品
+export function addLiveGoods(data) {
+  return request({
+    url: '/live/liveGoods',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改直播商品
+export function updateLiveGoods(data) {
+  return request({
+    url: '/live/liveGoods',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除直播商品
+export function delLiveGoods(goodsId) {
+  return request({
+    url: '/live/liveGoods/' + goodsId,
+    method: 'delete'
+  })
+}
+
+// 导出直播商品
+export function exportLiveGoods(query) {
+  return request({
+    url: '/live/liveGoods/export',
+    method: 'get',
+    params: query
+  })
+}
+
+// 导出直播商品
+export function listStoreProduct(data) {
+  return request({
+    url: '/live/liveGoods/liveList',
+    method: 'get',
+    params: data
+  })
+}
+
+//上下架商品
+export function handleShelfOrUn(data) {
+  return request({
+    url: '/live/liveGoods/handleShelfOrUn',
+    method: 'post',
+    data: data
+  })
+}
+
+
+export function handleDeleteSelected(data) {
+  return request({
+    url: '/live/liveGoods/handleDeleteSelected',
+    method: 'post',
+    data: data
+  })
+}
+
+export function handleIsShowChange(data) {
+  return request({
+    url: '/live/liveGoods/handleIsShowChange',
+    method: 'post',
+    data: data
+  })
+}
+export function updateGoodsStock(data) {
+  return request({
+    url: '/live/liveGoods',
+    method: 'put',
+    data: data
+  })
+}
+

+ 62 - 0
src/api/live/liveLotteryConf.js

@@ -0,0 +1,62 @@
+import request from '@/utils/request'
+
+// 查询直播抽奖配置列表
+export function listLiveLotteryConf(query) {
+  return request({
+    url: '/live/liveLotteryConf/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询直播抽奖配置详细
+export function getLiveLotteryConf(lotteryId) {
+  return request({
+    url: '/live/liveLotteryConf/' + lotteryId,
+    method: 'get'
+  })
+}
+
+// 新增直播抽奖配置
+export function addLiveLotteryConf(data) {
+  return request({
+    url: '/live/liveLotteryConf',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改直播抽奖配置
+export function updateLiveLotteryConf(data) {
+  return request({
+    url: '/live/liveLotteryConf',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除直播抽奖配置
+export function delLiveLotteryConf(lotteryId) {
+  return request({
+    url: '/live/liveLotteryConf/' + lotteryId,
+    method: 'delete'
+  })
+}
+
+// 导出直播抽奖配置
+export function exportLiveLotteryConf(query) {
+  return request({
+    url: '/live/liveLotteryConf/export',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询直播抽奖配置列表  未开启
+export function listLiveLotteryConfOn(query) {
+  return request({
+    url: '/live/liveLotteryConf/listOn',
+    method: 'get',
+    params: query
+  })
+}

+ 61 - 0
src/api/live/liveLotteryProductConf.js

@@ -0,0 +1,61 @@
+import request from '@/utils/request'
+
+// 查询直播抽奖记录列表
+export function listLiveLotteryProductConf(query) {
+  return request({
+    url: '/live/liveLotteryProductConf/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询直播抽奖记录详细
+export function getLiveLotteryProductConf(id) {
+  return request({
+    url: '/live/liveLotteryProductConf/' + id,
+    method: 'get'
+  })
+}
+
+//查询抽奖商品列表
+export function listStoreProduct(query) {
+  return request({
+    url: '/live/liveLotteryConf/getGoods/'+query,
+    method: 'get'
+  })
+}
+
+// 新增直播抽奖记录
+export function addLiveLotteryProductConf(data) {
+  return request({
+    url: '/live/liveLotteryProductConf',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改直播抽奖记录
+export function updateLiveLotteryProductConf(data) {
+  return request({
+    url: '/live/liveLotteryConf/product',
+    method: 'post',
+    data: data
+  })
+}
+
+// 删除直播抽奖记录
+export function delLiveLotteryProductConf(id) {
+  return request({
+    url: '/live/liveLotteryProductConf/' + id,
+    method: 'delete'
+  })
+}
+
+// 导出直播抽奖记录
+export function exportLiveLotteryProductConf(query) {
+  return request({
+    url: '/live/liveLotteryProductConf/export',
+    method: 'get',
+    params: query
+  })
+}

+ 62 - 0
src/api/live/liveMsg.js

@@ -0,0 +1,62 @@
+import request from '@/utils/request'
+
+// 查询直播讨论列表
+export function listLiveMsg(query) {
+  return request({
+    url: '/live/liveMsg/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询直播讨论列表
+export function listLiveSingleMsg(query) {
+  return request({
+    url: '/live/liveMsg/singleList',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询直播讨论详细
+export function getLiveMsg(msgId) {
+  return request({
+    url: '/live/liveMsg/' + msgId,
+    method: 'get'
+  })
+}
+
+// 新增直播讨论
+export function addLiveMsg(data) {
+  return request({
+    url: '/live/liveMsg',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改直播讨论
+export function updateLiveMsg(data) {
+  return request({
+    url: '/live/liveMsg',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除直播讨论
+export function delLiveMsg(msgId) {
+  return request({
+    url: '/live/liveMsg/' + msgId,
+    method: 'delete'
+  })
+}
+
+// 导出直播讨论
+export function exportLiveMsg(query) {
+  return request({
+    url: '/live/liveMsg/export',
+    method: 'get',
+    params: query
+  })
+}

+ 168 - 0
src/api/live/liveOrder.js

@@ -0,0 +1,168 @@
+import request from '@/utils/request'
+
+// 查询订单列表
+export function listLiveOrder(query) {
+  return request({
+    url: '/live/liveOrder/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询订单详细
+export function getLiveOrder(orderId) {
+  return request({
+    url: '/live/liveOrder/info/' + orderId,
+    method: 'get'
+  })
+}
+
+
+// 查询订单列表
+export function listLiveOrderZm(query) {
+  return request({
+    url: '/live/liveOrder/listZm',
+    method: 'get',
+    params: query
+  })
+}
+
+// 导出订单
+export function exportLiveOrderZm(query) {
+  return request({
+    url: '/live/liveOrder/exportZm',
+    method: 'get',
+    params: query
+  })
+}
+
+// 新增订单
+export function addLiveOrder(data) {
+  return request({
+    url: '/live/liveOrder',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改订单
+export function updateLiveOrder(data) {
+  return request({
+    url: '/live/liveOrder/update',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除订单
+export function delLiveOrder(orderId) {
+  return request({
+    url: '/live/liveOrder/' + orderId,
+    method: 'delete'
+  })
+}
+
+// 导出订单
+export function exportLiveOrder(query) {
+  return request({
+    url: '/live/liveOrder/export',
+    method: 'get',
+    params: query
+  })
+}
+
+// 获取表格 时间粒度
+export function getLiveOrderTimeGranularity(query) {
+  return request({
+    url: '/live/liveOrder/getLiveOrderTimeGranularity',
+    method: 'get',
+    params: query
+  })
+}
+
+// 同步快递信息
+export function syncExpress(orderId) {
+  return request({
+    url: '/live/liveOrder/syncExpress/' + orderId,
+    method: 'get'
+  })
+}
+
+
+export function getExpress(orderId) {
+  return request({
+    url: '/live/liveOrder/getExpress/' + orderId,
+    method: 'get'
+  })
+}
+
+export function updateErp(data) {
+  return request({
+    url: '/live/liveOrder/updateErpOrder',
+    method: 'post',
+    data: data
+  })
+}
+
+export function listOrderitem(orderId) {
+  return request({
+    url: '/live/liveOrder/ltemlist/' + orderId,
+    method: 'get'
+  })
+}
+
+export function tuiOrder(data) {
+  return request({
+    url: '/live/liveOrder/tuiOrder',
+    method: 'put',
+    data: data
+  })
+}
+
+export function getExpressByDeliverId(param) {
+  return request({
+    url: '/live/liveOrder/getExpressByDeliverId',
+    method: 'post',
+    data: param
+  })
+}
+
+/**
+ * 根据订单获取物流信息
+ * @param orderId
+ * @returns {*}
+ */
+export function getByOrderId(orderId){
+  return request({
+    url: '/live/liveOrder/getByOrderId/'+orderId,
+    method: 'get'
+  })
+}
+export function bindCustomer(data) {
+  return request({
+    url: '/live/liveOrder/bindCustomer',
+    method: 'post',
+    data: data
+  })
+}
+// 查询订单详细
+export function getLiveOrderAll(id) {
+  return request({
+    url: '/live/liveOrder/' + id,
+    method: 'get'
+  })
+}
+// 查询订单详细
+export function getLiveOrderAddress(id) {
+  return request({
+    url: '/live/liveOrder/queryAddress/' + id,
+    method: 'get'
+  })
+}
+// 查询电话
+export function getUserPhone(id) {
+  return request({
+    url: '/live/liveOrder/queryPhone/' + id,
+    method: 'get'
+  })
+}

+ 53 - 0
src/api/live/liveOrderitems.js

@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 查询订单商品列表
+export function listLiveOrderitems(query) {
+  return request({
+    url: '/live/liveOrderitems/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询订单商品详细
+export function getLiveOrderitems(id) {
+  return request({
+    url: '/live/liveOrderitems/' + id,
+    method: 'get'
+  })
+}
+
+// 新增订单商品
+export function addLiveOrderitems(data) {
+  return request({
+    url: '/live/liveOrderitems',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改订单商品
+export function updateLiveOrderitems(data) {
+  return request({
+    url: '/live/liveOrderitems',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除订单商品
+export function delLiveOrderitems(id) {
+  return request({
+    url: '/live/liveOrderitems/' + id,
+    method: 'delete'
+  })
+}
+
+// 导出订单商品
+export function exportLiveOrderitems(query) {
+  return request({
+    url: '/live/liveOrderitems/export',
+    method: 'get',
+    params: query
+  })
+}

+ 10 - 0
src/api/live/liveProfit.js

@@ -0,0 +1,10 @@
+import request from '@/utils/request'
+export function liveProfitList(data) {
+  return request({
+    url: '/live/liveProfit/list',
+    method: 'get',
+    params: data
+  })
+}
+
+

+ 53 - 0
src/api/live/liveQuestion.js

@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 查询问答列表
+export function listLiveQuestion(query) {
+  return request({
+    url: '/live/liveQuestion/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询问答详细
+export function getLiveQuestion(questionId) {
+  return request({
+    url: '/live/liveQuestion/' + questionId,
+    method: 'get'
+  })
+}
+
+// 新增问答
+export function addLiveQuestion(data) {
+  return request({
+    url: '/live/liveQuestion',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改问答
+export function updateLiveQuestion(data) {
+  return request({
+    url: '/live/liveQuestion',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除问答
+export function delLiveQuestion(questionId) {
+  return request({
+    url: '/live/liveQuestion/' + questionId,
+    method: 'delete'
+  })
+}
+
+// 导出问答
+export function exportLiveQuestion(query) {
+  return request({
+    url: '/live/liveQuestion/export',
+    method: 'get',
+    params: query
+  })
+}

+ 36 - 0
src/api/live/liveQuestionBank.js

@@ -0,0 +1,36 @@
+import request from '@/utils/request'
+
+// 查询题库列表
+export function listLiveQuestionBank(query) {
+  return request({
+    url: '/live/liveQuestionBank/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 新增题库
+export function addLiveQuestionBank(data) {
+  return request({
+    url: '/live/liveQuestionBank',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改题库
+export function updateLiveQuestionBank(data) {
+  return request({
+    url: '/live/liveQuestionBank',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除题库
+export function deleteLiveQuestionBank(questionBankId) {
+  return request({
+    url: '/live/liveQuestionBank/' + questionBankId,
+    method: 'delete'
+  })
+}

+ 89 - 0
src/api/live/liveQuestionLive.js

@@ -0,0 +1,89 @@
+import request from '@/utils/request'
+
+// 查询直播间题库列表
+export function listLiveQuestionLive(query) {
+    return request({
+        url: '/live/liveQuestionLive/list',
+        method: 'get',
+        params: query
+    })
+}
+
+// 查询直播间可选题库列表
+export function listLiveQuestionOptionList(query) {
+    return request({
+        url: '/live/liveQuestionLive/optionList',
+        method: 'get',
+        params: query
+    })
+}
+
+// 新增直播间题库
+export function addLiveQuestionLive(data) {
+    return request({
+        url: '/live/liveQuestionLive',
+        method: 'post',
+        params: data
+    })
+}
+
+// 删除直播间题库
+export function deleteLiveQuestionLive(data) {
+    return request({
+        url: '/live/liveQuestionLive/' + data.liveId,
+        method: 'delete',
+        params: {ids: data.ids}
+    })
+}
+
+// 查询直播观看奖励设置列表
+export function listConfig(query) {
+  return request({
+    url: '/live/config/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询直播观看奖励设置详细
+export function getConfig(id) {
+  return request({
+    url: '/live/config/' + id,
+    method: 'get'
+  })
+}
+
+// 新增直播观看奖励设置
+export function addConfig(data,liveId) {
+  return request({
+    url: '/live/config'  + '?liveId=' + liveId,
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改直播观看奖励设置
+export function updateConfig(data,liveId) {
+  return request({
+    url: '/live/config'  + '?liveId=' + liveId,
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除直播观看奖励设置
+export function delConfig(id) {
+  return request({
+    url: '/live/config/' + id,
+    method: 'delete'
+  })
+}
+
+// 导出直播观看奖励设置
+export function exportConfig(query) {
+  return request({
+    url: '/live/config/export',
+    method: 'get',
+    params: query
+  })
+}

+ 63 - 0
src/api/live/liveRedConf.js

@@ -0,0 +1,63 @@
+import request from '@/utils/request'
+
+// 查询直播红包记录配置列表
+export function listLiveRedConf(query) {
+  return request({
+    url: '/live/liveRedConf/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询直播红包记录配置详细
+export function getLiveRedConf(redId) {
+  return request({
+    url: '/live/liveRedConf/' + redId,
+    method: 'get'
+  })
+}
+
+// 新增直播红包记录配置
+export function addLiveRedConf(data) {
+  return request({
+    url: '/live/liveRedConf',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改直播红包记录配置
+export function updateLiveRedConf(data) {
+  return request({
+    url: '/live/liveRedConf',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除直播红包记录配置
+export function delLiveRedConf(redId) {
+  return request({
+    url: '/live/liveRedConf/' + redId,
+    method: 'delete'
+  })
+}
+
+// 导出直播红包记录配置
+export function exportLiveRedConf(query) {
+  return request({
+    url: '/live/liveRedConf/export',
+    method: 'get',
+    params: query
+  })
+}
+
+
+// 查询直播红包 未使用的红包
+export function listLiveRedConfOn(query) {
+  return request({
+    url: '/live/liveRedConf/listOn',
+    method: 'get',
+    params: query
+  })
+}

+ 19 - 0
src/api/live/liveRewardRecord.js

@@ -0,0 +1,19 @@
+import request from '@/utils/request'
+
+
+export function statistics(data) {
+  return request({
+    url: '/live/record/statistics',
+    method: 'post',
+    data: data
+  })
+}
+
+export function exportLiveIntegral(data) {
+  return request({
+    url: '/live/record/export',
+    method: 'post',
+    data: data
+  })
+}
+

+ 62 - 0
src/api/live/liveUserLotteryRecord.js

@@ -0,0 +1,62 @@
+import request from '@/utils/request'
+
+// 查询直播用户中奖记录列表
+export function listLiveUserLotteryRecord(query) {
+  return request({
+    url: '/live/liveUserLotteryRecord/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询直播用户中奖记录详细
+export function getLiveUserLotteryRecord(id) {
+  return request({
+    url: '/live/liveUserLotteryRecord/' + id,
+    method: 'get'
+  })
+}
+
+// 新增直播用户中奖记录
+export function addLiveUserLotteryRecord(data) {
+  return request({
+    url: '/live/liveUserLotteryRecord',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改直播用户中奖记录
+export function updateLiveUserLotteryRecord(data) {
+  return request({
+    url: '/live/liveUserLotteryRecord',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除直播用户中奖记录
+export function delLiveUserLotteryRecord(id) {
+  return request({
+    url: '/live/liveUserLotteryRecord/' + id,
+    method: 'delete'
+  })
+}
+
+// 导出直播用户中奖记录
+export function exportLiveUserLotteryRecord(query) {
+  return request({
+    url: '/live/liveUserLotteryRecord/export',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询单一数据的中奖信息
+export function info(data) {
+  return request({
+    url: '/live/liveUserLotteryRecord/info',
+    method: 'post',
+    data: data
+  })
+}

+ 68 - 0
src/api/live/liveVideo.js

@@ -0,0 +1,68 @@
+import request from '@/utils/request'
+
+// 查询直播视频列表
+export function listLiveVideo(query) {
+  return request({
+    url: '/live/liveVideo/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询直播视频详细
+export function getLiveVideo(videoId) {
+  return request({
+    url: '/live/liveVideo/' + videoId,
+    method: 'get'
+  })
+}
+
+// 查询直播视频详细
+export function getLiveVideoByLiveId(liveId) {
+  return request({
+    url: '/live/liveVideo/liveVideoByLiveId/' + liveId,
+    method: 'get'
+  })
+}
+// 查询直播视频详细
+export function getLiveVideoByLiveIdAndType(liveId) {
+  return request({
+    url: '/live/liveVideo/preview/' + liveId,
+    method: 'get'
+  })
+}
+
+// 新增直播视频
+export function addLiveVideo(data) {
+  return request({
+    url: '/live/liveVideo',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改直播视频
+export function updateLiveVideo(data) {
+  return request({
+    url: '/live/liveVideo',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除直播视频
+export function delLiveVideo(videoId) {
+  return request({
+    url: '/live/liveVideo/' + videoId,
+    method: 'delete'
+  })
+}
+
+// 导出直播视频
+export function exportLiveVideo(query) {
+  return request({
+    url: '/live/liveVideo/export',
+    method: 'get',
+    params: query
+  })
+}

+ 43 - 0
src/api/live/liveWatchUser.js

@@ -0,0 +1,43 @@
+import request from '@/utils/request'
+
+// 查询直播间用户列表
+export function watchUserList(query) {
+  return request({
+    url: '/live/liveWatchUser/watchUserList',
+    method: 'get',
+    params: query
+  })
+}
+// 查询直播间用户列表
+export function dashBoardWatchUserList(query) {
+  return request({
+    url: '/live/liveWatchUser/dashBoardWatchUserList',
+    method: 'get',
+    params: query
+  })
+}
+// 查询直播间用户列表
+export function getLiveUserTotals(query) {
+  return request({
+    url: '/live/liveWatchUser/liveUserTotals',
+    method: 'get',
+    params: query
+  })
+}
+
+// 直播间用户禁言
+export function changeUserStatus(query) {
+  return request({
+    url: '/live/liveWatchUser/changeUserState',
+    method: 'put',
+    params: query
+  })
+}
+
+// 直播间用户禁言
+export function blockUser(query) {
+  return request({
+    url: '/live/liveWatchUser/blockUser/' + query,
+    method: 'get',
+  })
+}

+ 86 - 0
src/api/live/task.js

@@ -0,0 +1,86 @@
+import request from '@/utils/request'
+
+// 查询直播间自动化任务配置列表
+export function listTask(query) {
+  return request({
+    url: '/live/task/list',
+    method: 'get',
+    params: query
+  })
+}
+// 查询直播间自动化任务配置列表
+export function listTaskBarrage(query) {
+  return request({
+    url: '/live/task/listBarrage',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询直播间自动化任务配置详细
+export function getTask(id) {
+  return request({
+    url: '/live/task/' + id,
+    method: 'get'
+  })
+}
+
+// 新增直播间自动化任务配置
+export function addTask(data) {
+  return request({
+    url: '/live/task',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改直播间自动化任务配置
+export function updateTask(data) {
+  return request({
+    url: '/live/task',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除直播间自动化任务配置
+export function delTask(id) {
+  return request({
+    url: '/live/task/' + id,
+    method: 'delete'
+  })
+}
+
+// 导出直播间自动化任务配置
+export function exportTask(query) {
+  return request({
+    url: '/live/task/export',
+    method: 'get',
+    params: query
+  })
+}
+// 导出直播间自动化任务配置
+export function exportTaskBarrage(query) {
+  return request({
+    url: '/live/task/exportData',
+    method: 'get',
+    params: query
+  })
+}
+
+// 下载用户导入模板
+export function importTemplate() {
+  return request({
+    url: '/live/task/importTemplate',
+    method: 'get'
+  })
+}
+
+// 新直播控制台任务列表
+export function consoleList(query) {
+  return request({
+    url: '/live/task/consoleList',
+    method: 'get',
+    params: query
+  })
+}

+ 53 - 0
src/api/live/words.js

@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 查询直播间敏感词过滤列表
+export function listWords(query) {
+  return request({
+    url: '/live/words/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询直播间敏感词过滤详细
+export function getWords(wordId) {
+  return request({
+    url: '/live/words/' + wordId,
+    method: 'get'
+  })
+}
+
+// 新增直播间敏感词过滤
+export function addWords(data) {
+  return request({
+    url: '/live/words',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改直播间敏感词过滤
+export function updateWords(data) {
+  return request({
+    url: '/live/words',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除直播间敏感词过滤
+export function delWords(wordId) {
+  return request({
+    url: '/live/words/' + wordId,
+    method: 'delete'
+  })
+}
+
+// 导出直播间敏感词过滤
+export function exportWords(query) {
+  return request({
+    url: '/live/words/export',
+    method: 'get',
+    params: query
+  })
+}

+ 8 - 0
src/api/qw/qwDept.js

@@ -59,3 +59,11 @@ export function exportQwDept(query) {
     params: query
   })
 }
+
+export function treeselect(query) {
+  return request({
+    url: '/qw/qwDept/treeselect',
+    method: 'get',
+    params: query
+  })
+}

+ 17 - 0
src/api/qw/sopTemp.js

@@ -8,6 +8,23 @@ export function listSopTemp(query) {
     params: query
   })
 }
+
+export function listSopTempMyList(query) {
+  return request({
+    url: '/qw/sopTemp/myList',
+    method: 'get',
+    params: query
+  })
+}
+
+export function listSopTempDeptList(query) {
+  return request({
+    url: '/qw/sopTemp/deptList',
+    method: 'get',
+    params: query
+  })
+}
+
 // 查询sop模板列表
 export function redList(id) {
   return request({

+ 8 - 0
src/api/qw/sopUserLogs.js

@@ -60,6 +60,14 @@ export function repairSopUserLogs(data) {
     data: data
   })
 }
+//修复营期
+export function getShortLink(data) {
+  return request({
+    url: '/qwSop/sopUserLogs/getShortLink',
+    method: 'get',
+    params: data
+  })
+}
 
 // 修改sopUserLogs
 export function updateLogDate(data) {

+ 9 - 0
src/api/qw/user.js

@@ -9,6 +9,15 @@ export function staffListUser(query) {
   })
 }
 
+export function myStaffListUser(query) {
+  return request({
+    url: '/qw/user/myStaffList',
+    method: 'get',
+    params: query
+  })
+}
+
+
 export function myDepartListUser(query) {
   return request({
     url: '/qw/user/myDepartList',

+ 76 - 0
src/api/store/collectionSchedule.js

@@ -0,0 +1,76 @@
+import request from '@/utils/request'
+
+// 查询用户信息采集进度列表
+export function listCollectionSchedule(query) {
+  return request({
+    url: '/store/collectionSchedule/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询用户信息采集进度详细
+export function getCollectionSchedule(id) {
+  return request({
+    url: '/store/collectionSchedule/' + id,
+    method: 'get'
+  })
+}
+
+// 新增用户信息采集进度
+export function addCollectionSchedule(data) {
+  return request({
+    url: '/store/collectionSchedule',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改用户信息采集进度
+export function updateCollectionSchedule(data) {
+  return request({
+    url: '/store/collectionSchedule',
+    method: 'put',
+    data: data
+  })
+}
+// 终止用户信息采集进度(暂时弃用)
+export function endProcess(data) {
+  return request({
+    url: '/store/collectionSchedule/endProcess',
+    method: 'put',
+    data: data
+  })
+}  // 终止用户信息采集进度
+export function stop(data) {
+  return request({
+    url: '/hisStore/collection/stop',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除用户信息采集进度
+export function delCollectionSchedule(id) {
+  return request({
+    url: '/store/collectionSchedule/' + id,
+    method: 'delete'
+  })
+}
+
+// 导出用户信息采集进度
+export function exportCollectionSchedule(query) {
+  return request({
+    url: '/store/collectionSchedule/export',
+    method: 'get',
+    params: query
+  })
+}
+
+// 获取流程步骤枚举
+export function getCollectionScheduleSteps() {
+  return request({
+    url: '/store/collectionSchedule/steps',
+    method: 'get'
+  });
+}

+ 18 - 0
src/api/store/packageOrder.js

@@ -96,6 +96,24 @@ export function getUserPhone(orderId) {
     method: 'get'
   })
 }
+
+// 修改或者添加患者首诊图片
+export function editPatientImages(orderId, imagesList) {
+  const formData = new FormData();
+  formData.append('orderId', orderId);
+  formData.append('imagesList', imagesList);
+  
+  return request({
+    url: '/store/packageOrder/editPatientImages',
+    method: 'post',
+    data: formData,
+    transformRequest: [function (data, headers) {
+      // 删除默认的Content-Type,让浏览器自动设置为multipart/form-data
+      delete headers['Content-Type'];
+      return data;
+    }]
+  })
+}
 export function getWxaCodePackageOrderUnLimit(orderId) {
   return request({
     url: '/store/packageOrder/getWxaCodePackageOrderUnLimit/'+orderId,

+ 1 - 1
src/api/store/patient.js

@@ -45,7 +45,7 @@ export function updatePatient(data) {
 // 删除病人
 export function delPatient(patientId) {
   return request({
-    url: '/his/patient/' + patientId,
+    url: '/store/patient/' + patientId,
     method: 'delete'
   })
 }

+ 18 - 0
src/api/wechat.js

@@ -0,0 +1,18 @@
+import request from '@/utils/request'
+
+// 获取绑定二维码
+export function getWechatBindQrcode() {
+  return request({
+    url: '/wechat/bind/qrcode',
+    method: 'get'
+  });
+}
+
+// 检测绑定状态
+export function checkWechatBindStatus(sceneId) {
+  return request({
+    url: '/wechat/bind/status',
+    method: 'get',
+    params: { sceneId }
+  });
+}

BIN
src/assets/images/videoIsAudit.png


BIN
src/assets/images/videoNotStart.png


BIN
src/assets/logo/bjzmky.png


BIN
src/assets/logo/cdhyt.jpg


BIN
src/assets/logo/gzzdy_logo.png


BIN
src/assets/logo/sczy.png


BIN
src/assets/logo/yxj.jpg


+ 274 - 0
src/components/LiveVideoUpload/index.vue

@@ -0,0 +1,274 @@
+<template>
+  <div>
+    <el-form-item label="视频上传">
+      <div class="upload_video" id="upload_video">
+        <el-upload
+          ref="upload"
+          action="#"
+          :http-request="uploadVideoToTxPcdn"
+          accept=".mp4"
+          :limit="1"
+          :on-remove="handleRemove"
+          :on-change="handleChange"
+          :auto-upload="false"
+          :key="uploadKey"
+        >
+          <el-button slot="trigger" size="small" type="primary">选取视频</el-button>
+          <el-button style="margin-left: 10px;" size="small" type="success" @click="submitUpload">点击上传</el-button>
+          <!-- 线路一 -->
+          <div class="progress-container" style="width:100% !important;">
+            <span class="progress-label">线路一</span>
+            <el-progress
+              style="margin-top: 5px;"
+              class="progress"
+              :text-inside="true"
+              :stroke-width="18"
+              :percentage="txProgress"
+              status="success">
+            </el-progress>
+          </div>
+
+          <!-- 线路二 -->
+<!--          <div class="progress-container">-->
+<!--            <span class="progress-label">线路er</span>-->
+<!--            <el-progress-->
+<!--              style="margin-top: 5px;"-->
+<!--              class="progress"-->
+<!--              :text-inside="true"-->
+<!--              :stroke-width="18"-->
+<!--              :percentage="hwProgress"-->
+<!--              status="success">-->
+<!--            </el-progress>-->
+<!--          </div>-->
+          <div slot="tip" class="el-upload__tip">只能上传mp4文件,且不超过500M</div>
+        </el-upload>
+      </div>
+    </el-form-item>
+    <el-form-item label="视频播放">
+      <video v-if="videoUrl" ref="myvideo" :src="videoUrl" id="video" width="100%" height="300px" controls></video>
+      <div v-if="fileName">视频文件名: {{ fileName }}</div>
+      <div v-if="fileKey">文件Key: {{ fileKey }}</div>
+      <div v-if="fileSize">文件大小(MB): {{ (fileSize / (1024 * 1024)).toFixed(2) }} MB</div>
+    </el-form-item>
+    <!-- 仅当showControl为true时显示播放线路选择器 -->
+    <el-form-item v-if="showControl" label="播放线路">
+      <el-radio-group v-model="localUploadType">
+        <el-radio :label="1" >线路一</el-radio>
+<!--        <el-radio :label="2" >线路二</el-radio>-->
+        <!--        <el-radio :label="3" >线路三</el-radio>-->
+      </el-radio-group>
+    </el-form-item>
+
+  </div>
+</template>
+
+<script>
+import { uploadObject } from "@/utils/cos.js";
+import Pagination from "@/components/Pagination";
+
+export default {
+  components: {
+    Pagination
+  },
+  props: {
+    videoUrl: {
+      type: String,
+      default: "",
+    },
+    fileKey: {
+      type: String,
+      default: "",
+    },
+    fileSize: {
+      type: Number,
+      default: null,
+    },
+    fileName: {
+      type: String,
+      default: "",
+    },
+    line_1: {
+      type: String,
+      default: "",
+    },
+    line_2: {
+      type: String,
+      default: "",
+    },
+    line_3: {
+      type: String,
+      default: "",
+    },
+    thumbnail: {
+      type: String,
+      default: "",
+    },
+    uploadType: {
+      type: Number,
+      default: null,
+    },
+    type: {
+      type: Number,
+      default: null,
+    },
+    isPrivate: {
+      type: Number,
+      default: 0,
+    },
+
+    // 使用一个变量控制显示,默认为true显示所有控制项
+    showControl: {
+      type: Boolean,
+      default: false,
+    }
+  },
+  data() {
+    return {
+      videoName:'',
+      isHidden : false,
+      localUploadType: this.uploadType,
+      duration: 0,
+      fileId: "",
+      uploadTypeOptions: [
+        { dictLabel: "线路一", dictValue: 1 }, // 腾讯pcdn
+        // { dictLabel: "线路二", dictValue: 2 }, // 华为云obs
+        // { dictLabel: "华为云VOD", dictValue: 4 },
+        // { dictLabel: "腾讯云VOD", dictValue: 5 },
+      ],
+      fileList: [],
+      txProgress: 0,
+      hwProgress: 0,
+      uploadLoading: false,
+      uploadKey: 0,
+    };
+  },
+  mounted() {
+    this.reset()
+  },
+  watch: {
+    localUploadType(newType) {
+
+      this.$emit("update:uploadType", newType);
+    },
+    uploadType(newType) {
+      this.localUploadType = newType;
+    },
+  },
+  methods: {
+// 提供重置方法供父组件调用
+    reset() {
+      this.txProgress = 0;
+      this.fileList = [];
+      this.$refs.upload.clearFiles();
+      // 重置其他状态...
+    },
+    handleChange(file, fileList) {
+      this.fileList = fileList;
+      this.getVideoDuration(file.raw);
+    },
+    getVideoDuration(file) {
+      const video = document.createElement("video");
+      video.preload = "metadata";
+      video.onloadedmetadata = () => {
+        window.URL.revokeObjectURL(video.src);
+        this.duration = parseInt(video.duration.toFixed(2));
+        console.log("视频时长=========>",this.duration);
+        this.$emit("video-duration", this.duration);
+        console.log("文件大小=====>",file.size);
+        this.$emit("update:fileSize", file.size);
+      };
+      video.src = URL.createObjectURL(file);
+    },
+    async submitUpload() {
+      if (this.fileList.length < 1) {
+        return this.$message.error("请先选取视频,再进行上传");
+      }
+      //同时上传个线路
+      await this.uploadVideoToTxPcdn();
+      // await this.uploadVideoToHwObs();
+      this.$emit("update:fileName", this.fileList[0].name);
+    },
+    //更新华为线路进度条
+    updateHwProgress(progress) {
+      this.hwProgress = progress;
+    },
+    //更新腾讯线路进度条
+    updateTxProgress(progressData) {
+      this.txProgress = Math.round(progressData.percent * 100);
+    },
+    //上传腾讯云Pcdn
+    async uploadVideoToTxPcdn() {
+      try {
+        const file = this.fileList[0].raw;
+        const data = await uploadObject(file, this.updateTxProgress,this.type);
+        console.log("腾讯COS返回========>",data);
+        console.log("isPrivate=======>",this.isPrivate)
+        let line_1='' ;
+        if (this.isPrivate===0){
+          line_1 = `${process.env.VUE_APP_VIDEO_LINE_1}${data.urlPath}`;
+        }else {
+          line_1 = `${process.env.VUE_APP_VIDEO_LINE_1}${data.urlPath}`;
+        }
+        line_1 = line_1.replace(/\.mp4$/, '.m3u8');
+
+        let urlPathWithoutFirstSlash = data.urlPath.substring(1);
+        this.$emit("update:fileKey", urlPathWithoutFirstSlash);
+
+        console.log("文件key",urlPathWithoutFirstSlash);
+        console.log("组装URL========>",line_1);
+        this.$emit("update:videoUrl", line_1);
+        this.$emit("update:line_1", line_1);
+        this.$emit("change", line_1,line_1);
+        // this.$emit("update:line_2", line_2);
+        this.$message.success("线路一上传成功");
+      } catch (error) {
+        this.$message.error("线路一上传失败");
+      }
+    },
+    // //上传华为云Obs
+    // async uploadVideoToHwObs() {
+    //   try {
+    //     const file = this.fileList[0].raw;
+    //     const data = await uploadToOBS(file, this.updateHwProgress,this.type);
+    //     console.log("华为OBS返回========>",data);
+    //     let line_2='' ;
+    //     if (this.isPrivate===0){
+    //       line_2 = `${process.env.VUE_APP_VIDEO_LINE_2}/${data.urlPath}`;
+    //     }else {
+    //       line_2 = `${process.env.VUE_APP_VIDEO_LINE_2}/${data.urlPath}`;
+    //     }
+    //     this.$emit("update:videoUrl", line_2);
+    //     this.$emit("update:line_2", line_2);
+    //     this.$message.success("线路二上传成功");
+    //   } catch (error) {
+    //     this.$message.error("线路二上传失败");
+    //   }
+    // },
+    handleRemove(file, fileList) {
+      console.log(file, fileList.length);
+    },
+  }
+};
+</script>
+
+<style>
+.progress-container {
+  margin-bottom: 5px; /* 进度条之间的间距 */
+}
+
+.progress-label {
+  display: block;
+  font-weight: bold;
+  font-size: 13px;
+  color: #303331; /* 标签颜色,可以根据需要调整 */
+}
+
+/* 视频库选择对话框样式 */
+.library-search {
+  margin-bottom: 15px;
+}
+
+.el-table .el-table__row:hover {
+  cursor: pointer;
+}
+</style>

+ 446 - 0
src/components/LiveVideoUpload/single.vue

@@ -0,0 +1,446 @@
+<template>
+  <div>
+    <el-form-item label="">
+      <div class="upload_video" id="upload_video">
+<!--        <el-upload-->
+<!--          class="upload-demo"-->
+<!--          ref="upload"-->
+<!--          action="#"-->
+<!--          :http-request="uploadVideoToTxPcdn"-->
+<!--          accept=".mp4"-->
+<!--          :limit="1"-->
+<!--          :on-remove="handleRemove"-->
+<!--          :on-change="handleChange"-->
+<!--          :auto-upload="false"-->
+<!--          :key="uploadKey"-->
+<!--        >-->
+<!--          <el-button slot="trigger" size="small" type="primary" >选取视频</el-button>-->
+<!--          <el-button style="margin-left: 10px;" size="small" type="success" @click="submitUpload">点击上传</el-button>-->
+          <!-- 仅当showControl为true时显示视频库选取按钮 -->
+          <el-button v-if="showControl" style="margin-left: 10px;" size="small" type="success" @click="openVideoLibrary">视频库选取</el-button>
+          <!-- 线路一 -->
+          <div class="progress-container">
+            <span class="progress-label">线路一</span>
+            <el-progress
+              style="margin-top: 5px;"
+              class="progress"
+              :text-inside="true"
+              :stroke-width="18"
+              :percentage="txProgress"
+              status="success">
+            </el-progress>
+          </div>
+
+          <!-- 线路二 -->
+<!--          <div class="progress-container">-->
+<!--            <span class="progress-label">线路二</span>-->
+<!--            <el-progress-->
+<!--              style="margin-top: 5px;"-->
+<!--              class="progress"-->
+<!--              :text-inside="true"-->
+<!--              :stroke-width="18"-->
+<!--              :percentage="hwProgress"-->
+<!--              status="success">-->
+<!--            </el-progress>-->
+<!--          </div>-->
+          <div slot="tip" class="el-upload__tip">只能上传mp4文件,且不超过500M</div>
+        </el-upload>
+      </div>
+    </el-form-item>
+    <el-form-item label="视频播放">
+      <video v-if="videoUrl" ref="myvideo" :src="videoUrl" id="video" width="100%" height="300px" controls></video>
+      <div v-if="fileName">视频文件名: {{ fileName }}</div>
+      <div v-if="fileKey">文件Key: {{ fileKey }}</div>
+      <div v-if="fileSize">文件大小(MB): {{ (fileSize / (1024 * 1024)).toFixed(2) }} MB</div>
+    </el-form-item>
+    <!-- 仅当showControl为true时显示播放线路选择器 -->
+<!--    <el-form-item v-if="showControl" label="播放线路">-->
+<!--      <el-radio-group v-model="localUploadType">-->
+<!--        <el-radio :label="1" >线路一</el-radio>-->
+<!--&lt;!&ndash;        <el-radio :label="2" >线路二</el-radio>&ndash;&gt;-->
+<!--        &lt;!&ndash;        <el-radio :label="3" >线路三</el-radio>&ndash;&gt;-->
+<!--      </el-radio-group>-->
+<!--    </el-form-item>-->
+
+    <!-- 视频库选择对话框 -->
+    <el-dialog title="视频库选择" :visible.sync="libraryOpen" width="900px" append-to-body>
+      <!-- 搜索条件 -->
+      <el-form :inline="true" :model="libraryQueryParams" class="library-search">
+        <el-form-item label="素材名称">
+          <el-input
+            v-model="libraryQueryParams.remark"
+            placeholder="请输入素材名称"
+            clearable
+            size="small"
+            @keyup.enter.native="handleLibraryQuery"
+          />
+        </el-form-item>
+        <el-form-item>
+          <el-button type="primary" icon="el-icon-search" size="mini" @click="handleLibraryQuery">搜索</el-button>
+          <el-button icon="el-icon-refresh" size="mini" @click="resetLibraryQuery">重置</el-button>
+        </el-form-item>
+      </el-form>
+
+      <!-- 视频列表 -->
+      <el-table v-loading="libraryLoading" :data="libraryList" @row-click="handleLibrarySelect" highlight-current-row>
+        <el-table-column label="素材名称" align="center" prop="remark" />
+<!--        <el-table-column label="缩略图" align="center">-->
+<!--          <template slot-scope="scope">-->
+<!--            <video-->
+<!--              :src="scope.row.videoUrl"-->
+<!--              controls-->
+<!--              controlsList="nodownload"-->
+<!--              class="video-player"-->
+<!--              @contextmenu.prevent-->
+<!--            ></video>-->
+<!--          </template>-->
+<!--        </el-table-column>-->
+        <el-table-column label="视频时长" align="center">
+          <template slot-scope="scope">
+            <span>{{ formatDuration(scope.row.duration) }}</span>
+          </template>
+        </el-table-column>
+      </el-table>
+
+      <!-- 分页 -->
+      <pagination
+        v-show="libraryTotal>0"
+        :total="libraryTotal"
+        :page.sync="libraryQueryParams.pageNum"
+        :limit.sync="libraryQueryParams.pageSize"
+        @pagination="getList"
+      />
+
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="confirmVideoSelection">确 定</el-button>
+        <el-button @click="cancelVideoSelection">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { uploadObject } from "@/utils/cos.js";
+import Pagination from "@/components/Pagination";
+// import { listVideoResource } from '@/api/course/videoResource';
+import { listLiveVideo, getLiveVideo, delLiveVideo, addLiveVideo, updateLiveVideo, exportLiveVideo } from "@/api/live/liveVideo";
+
+export default {
+  components: {
+    Pagination
+  },
+  props: {
+    videoUrl: {
+      type: String,
+      default: "",
+    },
+    fileKey: {
+      type: String,
+      default: "",
+    },
+    fileSize: {
+      type: Number,
+      default: null,
+    },
+    fileName: {
+      type: String,
+      default: "",
+    },
+    line_1: {
+      type: String,
+      default: "",
+    },
+    line_2: {
+      type: String,
+      default: "",
+    },
+    line_3: {
+      type: String,
+      default: "",
+    },
+    thumbnail: {
+      type: String,
+      default: "",
+    },
+    uploadType: {
+      type: Number,
+      default: null,
+    },
+    type: {
+      type: Number,
+      default: null,
+    },
+    isPrivate: {
+      type: Number,
+      default: 0,
+    },
+
+    // 使用一个变量控制显示,默认为true显示所有控制项
+    showControl: {
+      type: Boolean,
+      default: true,
+    }
+  },
+  data() {
+    return {
+      videoName:'',
+      isHidden : false,
+      localUploadType: this.uploadType,
+      duration: 0,
+      fileId: "",
+      uploadTypeOptions: [
+        { dictLabel: "线路一", dictValue: 1 }, // 腾讯pcdn
+        { dictLabel: "线路二", dictValue: 2 }, // 华为云obs
+        // { dictLabel: "华为云VOD", dictValue: 4 },
+        // { dictLabel: "腾讯云VOD", dictValue: 5 },
+      ],
+      fileList: [],
+      txProgress: 0,
+      hwProgress: 0,
+      uploadLoading: false,
+      uploadKey: 0,
+      // 视频库选择相关数据
+      libraryOpen: false,
+      libraryLoading: false,
+      libraryTotal: 0,
+      libraryList: [],
+      selectedVideo: null,
+      libraryQueryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        resourceName: null,
+        liveId: -1,
+        videoUrl: null,
+        videoType: -1,
+        sort: null,
+        remark: null,
+        finishStatus:1
+      },
+      liveQueryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        liveId: -1,
+        videoUrl: null,
+        videoType: -1,
+        sort: null,
+        remark: null,
+      },
+    };
+  },
+  mounted() {
+    this.reset();
+  },
+  watch: {
+    uploadType(newType) {
+      this.localUploadType = newType;
+    },
+  },
+  methods: {
+    /** 查询直播视频列表 */
+    getList() {
+      this.libraryLoading = true;
+      listLiveVideo(this.libraryQueryParams).then(response => {
+        this.libraryList = response.rows;
+        this.libraryTotal = response.total;
+        this.libraryLoading = false;
+      });
+    },
+    // 打开视频库对话框
+    openVideoLibrary() {
+      this.libraryOpen = true;
+      this.selectedVideo = null;
+      this.getList();
+    },
+    handleChange(file, fileList) {
+      this.fileList = fileList;
+      this.getVideoDuration(file.raw);
+    },
+    getVideoDuration(file) {
+      const video = document.createElement("video");
+      video.preload = "metadata";
+      video.onloadedmetadata = () => {
+        window.URL.revokeObjectURL(video.src);
+        this.duration = parseInt(video.duration.toFixed(2));
+        console.log("视频时长=========>",this.duration);
+        this.$emit("video-duration", this.duration);
+        console.log("文件大小=====>",file.size);
+        this.$emit("update:fileSize", file.size);
+      };
+      video.src = URL.createObjectURL(file);
+    },
+    async submitUpload() {
+      if (this.fileList.length < 1) {
+        return this.$message.error("请先选取视频,再进行上传");
+      }
+      //同时上传个线路
+      await this.uploadVideoToTxPcdn();
+      this.$emit("update:fileName", this.fileList[0].name);
+    },
+    //获取第一帧封面
+    async getFirstThumbnail(){
+      const file = this.fileList[0].raw;
+      getThumbnail(file).then(response => {
+        console.log("获取到第一帧为封面======>",response.url)
+        this.$emit("update:thumbnail", response.url);
+      })
+    },
+    //更新华为线路进度条
+    // updateHwProgress(progress) {
+    //   this.hwProgress = progress;
+    // },
+    //更新腾讯线路进度条
+    updateTxProgress(progressData) {
+      this.txProgress = Math.round(progressData.percent * 100);
+    },
+    //上传腾讯云Pcdn
+    async uploadVideoToTxPcdn() {
+      try {
+        const file = this.fileList[0].raw;
+        const data = await uploadObject(file, this.updateTxProgress,this.type);
+        console.log("腾讯COS返回========>",data);
+        console.log("isPrivate=======>",this.isPrivate)
+        let line_1='' ;
+        if (this.isPrivate===0){
+          line_1 = `${process.env.VUE_APP_VIDEO_LINE_1}${data.urlPath}`;
+        }else {
+          line_1 = `${process.env.VUE_APP_VIDEO_LINE_1}${data.urlPath}`;
+        }
+        line_1 = line_1.replace(/\.mp4$/, '.m3u8');
+
+        let urlPathWithoutFirstSlash = data.urlPath.substring(1);
+        this.$emit("update:fileKey", urlPathWithoutFirstSlash);
+
+        console.log("文件key",urlPathWithoutFirstSlash);
+        console.log("组装URL========>",line_1);
+        this.$emit("update:videoUrl", line_1);
+        this.$emit("update:line_1", line_1);
+        this.$emit("change", line_1,line_1);
+        // this.$emit("update:line_2", line_2);
+        this.$message.success("线路一上传成功");
+      } catch (error) {
+        this.$message.error("线路一上传失败");
+      }
+    },
+    //上传华为云Obs
+    async uploadVideoToHwObs() {
+      try {
+        const file = this.fileList[0].raw;
+        const data = await uploadToOBS(file, this.updateHwProgress,this.type);
+        console.log("华为OBS返回========>",data);
+        let line_2='' ;
+        if (this.isPrivate===0){
+          line_2 = `${process.env.VUE_APP_VIDEO_LINE_2}/${data.urlPath}`;
+        }else {
+          line_2 = `${process.env.VUE_APP_VIDEO_LINE_2}/${data.urlPath}`;
+        }
+        // this.$emit("update:videoUrl", data);
+        this.$emit("update:line_2", line_2);
+        this.$message.success("线路二上传成功");
+      } catch (error) {
+        this.$message.error("线路二上传失败");
+      }
+    },
+    handleRemove(file, fileList) {
+      console.log(file, fileList.length);
+    },
+    reset() {
+      // 重置内部状态
+      this.txProgress = 0;
+      this.fileList = [];
+      this.$refs.upload.clearFiles();
+      this.uploadKey++;
+    },
+    /** 查询视频库列表 */
+    getLibraryList() {
+      this.libraryLoading = true;
+      // listVideoResource(this.libraryQueryParams).then(response => {
+      //   this.libraryList = response.rows;
+      //   this.libraryTotal = response.total;
+      //   this.libraryLoading = false;
+      // });
+    },
+    /** 搜索视频库按钮操作 */
+    handleLibraryQuery() {
+      this.libraryQueryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置视频库查询按钮操作 */
+    resetLibraryQuery() {
+      this.libraryQueryParams = {
+        pageNum: 1,
+        pageSize: 10,
+        resourceName: null,
+        liveId: -1,
+        videoUrl: null,
+        videoType: -1,
+        sort: null,
+        remark: null,
+        finishStatus:1
+      };
+      this.handleLibraryQuery();
+    },
+    /** 视频库选择行点击 */
+    handleLibrarySelect(row) {
+      this.selectedVideo = row;
+    },
+    /** 格式化视频时长 */
+    formatDuration(seconds) {
+      if (!seconds) return '00:00';
+
+      const minutes = Math.floor(seconds / 60);
+      const remainingSeconds = seconds % 60;
+
+      return `${minutes.toString().padStart(2, '0')}:${remainingSeconds.toString().padStart(2, '0')}`;
+    },
+    /** 确认选择视频 */
+    confirmVideoSelection() {
+      if (!this.selectedVideo) {
+        this.$message.warning("请选择一个视频");
+        return;
+      }
+
+      // 更新组件内部数据
+      this.$emit("update:fileName", this.selectedVideo.fileName);
+      this.$emit("update:thumbnail", this.selectedVideo.thumbnail);
+      this.$emit("update:line_1", this.selectedVideo.lineOne);
+      this.$emit("update:fileSize", this.selectedVideo.fileSize);
+      this.$emit("update:fileKey", this.selectedVideo.fileKey);
+      this.$emit("update:uploadType", this.selectedVideo.uploadType);
+      this.$emit("video-duration", this.selectedVideo.duration);
+      // 设置预览URL
+      this.$emit("update:videoUrl", this.selectedVideo.videoUrl);
+      this.$emit("change", this.selectedVideo.videoUrl,this.selectedVideo.lineOne);
+
+
+      this.libraryOpen = false;
+    },
+    /** 取消视频选择 */
+    cancelVideoSelection() {
+      this.libraryOpen = false;
+      this.selectedVideo = null;
+    }
+  }
+};
+</script>
+
+<style>
+.progress-container {
+  margin-bottom: 5px; /* 进度条之间的间距 */
+}
+
+.progress-label {
+  display: block;
+  font-weight: bold;
+  font-size: 13px;
+  color: #303331; /* 标签颜色,可以根据需要调整 */
+}
+
+/* 视频库选择对话框样式 */
+.library-search {
+  margin-bottom: 15px;
+}
+
+.el-table .el-table__row:hover {
+  cursor: pointer;
+}
+</style>

+ 11 - 1
src/router/index.js

@@ -6,6 +6,7 @@ Vue.use(Router)
 /* Layout */
 import Layout from '@/layout'
 import ParentView from '@/components/ParentView';
+import LiveConsole from "@/views/live/liveConsole/index.vue";
 
 /**
  * Note: 路由配置项
@@ -174,7 +175,7 @@ export const constantRoutes = [
     hidden: true,
     children: [
       {
-        path: 'addSop/:corpId',
+        path: 'addSop/:corpId/:type(\\d+)',
         component: (resolve) => require(['@/views/qw/sop/addSop'], resolve),
         name: 'addSop',
         meta: { title: '新增SOP任务', activeMenu: '/qw/sop'}
@@ -261,6 +262,15 @@ export const constantRoutes = [
       }
     ]
   },
+  // 独立页路由:不嵌套根布局,直接渲染目标组件
+  {
+    path: '/live/liveConsole/:liveId',
+    name: 'LiveConsole',
+    component: LiveConsole, // 直接渲染目标组件,无侧边栏
+    meta: {
+      isIndependentPage: true // 标记为“独立页”
+    }
+  },
 
 
 

+ 40 - 1
src/store/index.js

@@ -6,6 +6,7 @@ import tagsView from './modules/tagsView'
 import permission from './modules/permission'
 import settings from './modules/settings'
 import getters from './getters'
+import {LiveWS} from "@/utils/liveWS";
 
 Vue.use(Vuex)
 
@@ -17,7 +18,45 @@ const store = new Vuex.Store({
     permission,
     settings
   },
-  getters
+  getters,
+  state: {
+    liveWs: {}
+  },
+  mutations: {
+    // 更新为支持多个 WebSocket 连接
+    setLiveWs(state, { ws, liveId }) {
+      // 使用 liveId 作为键来存储不同的 WebSocket 连接
+      Vue.set(state.liveWs, liveId, ws);
+    },
+    // 添加移除 WebSocket 连接的 mutation
+    removeLiveWs(state, liveId) {
+      Vue.delete(state.liveWs, liveId);
+    }
+  },
+  actions: {
+    // 修改 action 以正确传递参数
+    initLiveWs({ commit, state }, { liveWsUrl, liveId, userId }) {
+      // 如果已经存在对应 liveId 的连接,先关闭它
+      if (state.liveWs[liveId]) {
+        state.liveWs[liveId].close();
+      }
+
+      // 创建新的 WebSocket 连接
+      const ws = new LiveWS(liveWsUrl, liveId, userId);
+
+      // 提交到 mutation
+      commit('setLiveWs', { ws, liveId });
+
+      return ws;
+    },
+    // 添加关闭特定 WebSocket 连接的 action
+    closeLiveWs({ commit, state }, liveId) {
+      if (state.liveWs[liveId]) {
+        state.liveWs[liveId].close();
+        commit('removeLiveWs', liveId);
+      }
+    }
+  }
 })
 
 export default store

+ 96 - 0
src/utils/cos.js

@@ -0,0 +1,96 @@
+import COS from 'cos-js-sdk-v5';
+import { Message } from 'element-ui';
+import { getTmpSecretKey } from '@/api/common';
+
+console.log('环境变量:', process.env);
+console.log('NODE_ENV:', process.env.NODE_ENV);
+console.log('VUE_APP_COS_BUCKET:', process.env.VUE_APP_COS_BUCKET);
+console.log('VUE_APP_COS_REGION:', process.env.VUE_APP_COS_REGION);
+
+const config = {
+  Bucket: process.env.VUE_APP_COS_BUCKET,
+  Region: process.env.VUE_APP_COS_REGION,
+};
+console.log('COS配置:', config);
+
+// 上传到腾讯云cos
+export const uploadObject = async (file,onProgress,type,callBackUp) => {
+    try {
+        console.log(type);
+        const response = await getTmpSecretKey(); // 后台接口返回 密钥相关信息
+        console.log("Key  ",response);
+        const data = response.data;
+        const credentials = data && data.credentials;
+
+        if (!data || !credentials) {
+            console.error('未获取到参数');
+            return;
+        }
+
+        // 初始化
+        const cos = new COS({
+            getAuthorization: (options, callback) => {
+                callback({
+                    TmpSecretId: credentials.tmpSecretId,
+                    TmpSecretKey: credentials.tmpSecretKey,
+                    XCosSecurityToken: credentials.sessionToken,
+                    StartTime: data.startTime,
+                    ExpiredTime: data.expiredTime,
+                });
+            },
+        });
+
+        console.log("初始化成功")
+        let fileName = file.name || ""
+        const upload_file_name = new Date().getTime() + '.' + fileName.split(".")[fileName.split(".").length - 1];
+        let date =  new Date()
+        let year = date.getFullYear()
+        let month = date.getMonth() + 1
+        let strDate = date.getDate()
+        let uploadDay = `${year}${month}${strDate}`
+        let videoKey = `/userVideo/${uploadDay}/${upload_file_name}`
+        let courseKey = `/live/${uploadDay}/${upload_file_name}`
+        let key = type ===1 ? courseKey : videoKey;
+        console.log("开始上传")
+        return new Promise((resolve, reject) => {
+            console.log("uploadFile")
+            cos.uploadFile(
+                {
+                    Bucket: config.Bucket, /* 必须 */
+                    Region: config.Region, /* 存储桶所在地域,必须字段 */
+                    Key: key, // 文件名
+                    StorageClass: 'STANDARD', // 上传类型,可选
+                    Body: file, // 上传文件对象
+                    // onTaskReady: function (taskId) {
+                    //     // 用于中断分片上传回调
+                    //     console.log('Task ready:', taskId);
+                    //     callBackUp && callBackUp({cos,taskId})
+                    // },
+                    onProgress: function (progressData) {
+                        console.log('COS上传进度=======>:', JSON.stringify(progressData));
+                        onProgress(progressData);
+                    },
+                    // onFileFinish: function (err, data, options) {
+                    //     console.log(options.Key + '上传' + (err ? '失败' : '完成'));
+                    // },
+                },
+                (err, data) => {
+                    if (err) {
+                        reject(err);
+                    } else {
+                        // 将上传的key包含在返回的数据中
+                        const result = {
+                            ...data,
+                            urlPath: key
+                        };
+                        console.log('上传成功', result);
+                        resolve(result);
+                    }
+                }
+            );
+        });
+    } catch (error) {
+        console.error('Error during upload:', error);
+        throw error;
+    }
+};

+ 112 - 0
src/utils/liveWS.js

@@ -0,0 +1,112 @@
+import CryptoJS from 'crypto-js'
+
+export class LiveWS {
+  /**
+   * @param {string} url - WebSocket 服务器地址
+   * @param {number} liveId - 直播间ID
+   * @param {number} userId - 用户ID
+   * @param {number} checkInterval - 检查连接状态的时间间隔,单位毫秒
+   * @param {number} reconnectDelay - 连接断开后重连的延迟,单位毫秒
+   */
+  constructor(url, liveId, userId, checkInterval = 5000, reconnectDelay = 3000) {
+    let timestamp = new Date().getTime()
+    let userType = 1
+    let signature = CryptoJS.HmacSHA256(
+      CryptoJS.enc.Utf8.parse('' + liveId + userId + userType + timestamp),
+      CryptoJS.enc.Utf8.parse(timestamp)).toString(CryptoJS.enc.Hex)
+    this.url = url + `?liveId=${liveId}&userId=${userId}&userType=${userType}&timestamp=${timestamp}&signature=${signature}`;
+    console.log(this.url)
+    this.liveId = liveId;
+    this.userId = userId;
+    this.checkInterval = checkInterval;
+    this.reconnectDelay = reconnectDelay;
+    this.ws = null;
+    this.reconnectTimer = null;
+    this.heartbeatTimer = null;
+    this.isManualClose = false;
+    this.connect();
+    this.startHeartbeat();
+  }
+
+  connect() {
+    // 如果已经有一个连接处于 OPEN 或 CONNECTING 状态,则不再创建新连接
+    if (this.ws && (this.ws.readyState === WebSocket.OPEN || this.ws.readyState === WebSocket.CONNECTING)) {
+      return;
+    }
+
+    this.ws = new WebSocket(this.url);
+
+    // 绑定事件
+    this.ws.onopen = (event) => {
+      // 连接成功后,清除重连计时器
+      if (this.reconnectTimer) {
+        clearTimeout(this.reconnectTimer);
+        this.reconnectTimer = null;
+      }
+    };
+
+    this.ws.onmessage = (event) => {
+      this.onmessage(event);
+    };
+
+    this.ws.onerror = (error) => {
+    };
+
+    this.ws.onclose = (event) => {
+      // 如果不是主动关闭,则重连
+      if (!this.isManualClose) {
+        setTimeout(() => this.reconnect(), this.reconnectDelay);
+      }
+    };
+  }
+
+  onmessage(event) {}
+
+  reconnect() {
+    this.connect();
+  }
+
+  // 调度重连
+  scheduleReconnect() {
+    // 避免多次重连定时器同时存在
+    if (this.reconnectTimer) return;
+    this.reconnectTimer = setTimeout(() => {
+      this.connect();
+    }, this.reconnectDelay);
+  }
+
+  // 定时检查连接状态
+  startHeartbeat() {
+    this.heartbeatTimer = setInterval(() => {
+      if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {
+        this.scheduleReconnect();
+      } else {
+        // 发送信息
+        this.ws.send(JSON.stringify({'cmd':'heartbeat','msg':'ping', 'liveId': this.liveId, 'userId': this.userId}));
+      }
+    }, this.checkInterval);
+  }
+
+  // 主动关闭 WebSocket 连接,并清除定时任务
+  close() {
+    this.isManualClose = true;
+    if (this.heartbeatTimer) {
+      clearInterval(this.heartbeatTimer);
+    }
+    if (this.reconnectTimer) {
+      clearTimeout(this.reconnectTimer);
+    }
+    if (this.ws) {
+      this.ws.close();
+    }
+  }
+
+  // 发送消息方法
+  send(message) {
+    if (this.ws && this.ws.readyState === WebSocket.OPEN) {
+      this.ws.send(message);
+    } else {
+      console.error("WebSocket is not open. Message not sent.");
+    }
+  }
+}

+ 73 - 0
src/utils/obs.js

@@ -0,0 +1,73 @@
+import ObsClient from "esdk-obs-browserjs/src/obs"
+
+export const uploadToOBS = async (file, progressCallback, type, cancelCallback) => {
+  try {
+    const obsClient = new ObsClient({
+      access_key_id: process.env.VUE_APP_OBS_ACCESS_KEY_ID,
+      secret_access_key: process.env.VUE_APP_OBS_SECRET_ACCESS_KEY,
+      server: process.env.VUE_APP_OBS_SERVER,
+      timeout: 1200,
+    })
+
+    const fileName = file.name || ""
+    const upload_file_name = new Date().getTime() + "." + fileName.split(".")[fileName.split(".").length - 1]
+    const date = new Date()
+    const year = date.getFullYear()
+    const month = date.getMonth() + 1
+    const strDate = date.getDate()
+    const uploadDay = `${year}${month}${strDate}`
+    const videoKey = `userVideo/${uploadDay}/${upload_file_name}`
+    const courseKey = `course/${uploadDay}/${upload_file_name}`
+    const key = type === 1 ? courseKey : videoKey
+
+    var callback = (transferredAmount, totalAmount, totalSeconds) => {
+      const progress = Number.parseInt((transferredAmount * 100.0) / totalAmount)
+      if (progressCallback) {
+        progressCallback(progress)
+      }
+    }
+
+    return new Promise((resolve, reject) => {
+      let isCancelled = false
+
+      if (cancelCallback) {
+        cancelCallback({
+          cancel: () => {
+            console.log("Cancelling OBS upload")
+            isCancelled = true
+            reject(new Error("Upload cancelled by user"))
+          },
+        })
+      }
+
+      obsClient.putObject(
+        {
+          Bucket: process.env.VUE_APP_OBS_BUCKET,
+          Key: key,
+          Body: file,
+          ProgressCallback: callback,
+        },
+        (err, result) => {
+          if (isCancelled) {
+            return // Don't process result if cancelled
+          }
+
+          if (err) {
+            reject(err)
+            console.error("Error-->" + err)
+          } else {
+            const a = {
+              ...result,
+              urlPath: key,
+            }
+            console.log("上传成功", a)
+            resolve(a)
+          }
+        },
+      )
+    })
+  } catch (error) {
+    console.error("Error during upload:", error)
+    throw error
+  }
+}

Một số tệp đã không được hiển thị bởi vì quá nhiều tập tin thay đổi trong này khác