瀏覽代碼

Merge remote-tracking branch 'origin/master'

三七 2 周之前
父節點
當前提交
1ec72e39dd

+ 35 - 0
.env.prod-hcl

@@ -0,0 +1,35 @@
+# 页面标题
+VUE_APP_TITLE =恒春来管理系统
+# 公司名称
+VUE_APP_COMPANY_NAME =黑龙江珠斯网络科技有限公司
+# ICP备案号
+VUE_APP_ICP_RECORD =黑ICP备2024024871号-3
+# ICP网站访问地址
+VUE_APP_ICP_URL =https://beian.miit.gov.cn
+# 网站LOG
+VUE_APP_LOG_URL =@/assets/logo/hcl.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 = hclobs-hw079058881
+# 存储桶配置
+VUE_APP_COS_BUCKET = hcl-1323137866
+# 存储桶配置
+VUE_APP_COS_REGION = ap-chongqing
+# 线路一地址
+VUE_APP_VIDEO_LINE_1 = https://hcltcpv.ylrzcloud.com
+# 线路二地址
+VUE_APP_VIDEO_LINE_2 = https://hclobs.ylrztop.com
+
+# 开发环境配置
+ENV = 'development'
+
+# FS管理系统/开发环境
+VUE_APP_BASE_API = '/prod-api'
+
+# 路由懒加载
+VUE_CLI_BABEL_TRANSPILE_MODULES = true

+ 35 - 0
.env.prod-jzzx

@@ -0,0 +1,35 @@
+# 页面标题
+VUE_APP_TITLE =九州在线管理系统
+# 公司名称
+VUE_APP_COMPANY_NAME =成都双流九州在线互联网医院有限公司
+# ICP备案号
+VUE_APP_ICP_RECORD =蜀ICP备2025130335号
+# ICP网站访问地址
+VUE_APP_ICP_URL =https://beian.miit.gov.cn
+# 网站LOG
+VUE_APP_LOG_URL =@/assets/logo/jzzx.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 = jzzx-hw079058881
+# 存储桶配置
+VUE_APP_COS_BUCKET = jiuzhou-1323137866
+# 存储桶配置
+VUE_APP_COS_REGION = ap-chongqing
+# 线路一地址
+VUE_APP_VIDEO_LINE_1 = https://jzzxtcpv.ylrzcloud.com
+# 线路二地址
+VUE_APP_VIDEO_LINE_2 = https://jzzxobs.ylrztop.com
+
+# 开发环境配置
+ENV = 'development'
+
+# FS管理系统/开发环境
+VUE_APP_BASE_API = '/prod-api'
+
+# 路由懒加载
+VUE_CLI_BABEL_TRANSPILE_MODULES = true

+ 35 - 0
.env.prod-myhk

@@ -0,0 +1,35 @@
+# 页面标题
+VUE_APP_TITLE =木易华康医药管理系统
+# 公司名称
+VUE_APP_COMPANY_NAME =木易华康医药管理系统
+# ICP备案号
+VUE_APP_ICP_RECORD =桂ICP备2025059156号-1
+# 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 = myhk-hw079058881
+# 存储桶配置
+VUE_APP_COS_BUCKET = myhk-1323137866
+# 存储桶配置
+VUE_APP_COS_REGION = ap-chongqing
+# 线路一地址
+VUE_APP_VIDEO_LINE_1 = https://myhktcpv.ylrzcloud.com
+# 线路二地址
+VUE_APP_VIDEO_LINE_2 = https://myhkobs.ylrztop.com
+
+# 开发环境配置
+ENV = 'development'
+
+# FS管理系统/开发环境
+VUE_APP_BASE_API = '/prod-api'
+
+# 路由懒加载
+VUE_CLI_BABEL_TRANSPILE_MODULES = true

+ 35 - 0
.env.prod-test

@@ -0,0 +1,35 @@
+# 页面标题
+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/logo.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 = zkzh-1323137866
+# 存储桶配置
+VUE_APP_COS_REGION = ap-chongqing
+# 线路一地址
+VUE_APP_VIDEO_LINE_1 = https://zkzhtcpv.ylrzcloud.com
+# 线路二地址
+VUE_APP_VIDEO_LINE_2 = https://zkzhobs.ylrztop.com
+
+# 开发环境配置
+ENV = 'development'
+
+# FS管理系统/开发环境
+VUE_APP_BASE_API = '/prod-api'
+
+# 路由懒加载
+VUE_CLI_BABEL_TRANSPILE_MODULES = true

+ 7 - 2
package.json

@@ -7,7 +7,10 @@
   "scripts": {
     "dev": "vue-cli-service serve",
     "build:prod": "vue-cli-service build",
+    "build:prod-test": "vue-cli-service build --mode prod-test",
     "build:prod-hzyy": "vue-cli-service build --mode prod-hzyy",
+    "build:prod-jzzx": "vue-cli-service build --mode prod-jzzx",
+    "build:prod-hcl": "vue-cli-service build --mode prod-hcl",
     "build:prod-sxjz": "vue-cli-service build --mode prod-sxjz",
     "build:prod-jnmy": "vue-cli-service build --mode prod-jnmy",
     "build:prod-hdt": "vue-cli-service build --mode prod-hdt",
@@ -83,12 +86,14 @@
     "eslint": "7.15.0",
     "eslint-plugin-vue": "7.2.0",
     "lint-staged": "10.5.3",
-    "runjs": "4.4.2",
     "node-sass": "4.14.1",
+    "runjs": "4.4.2",
     "sass-loader": "8.0.2",
     "script-ext-html-webpack-plugin": "2.1.5",
     "svg-sprite-loader": "5.1.1",
-    "vue-template-compiler": "2.6.12"
+    "vue-template-compiler": "2.6.12",
+    "webpack": "^4.46.0",
+    "webpack-dev-server": "^3.11.3"
   },
   "engines": {
     "node": ">=8.9",

二進制
src/assets/logo/hcl.png


二進制
src/assets/logo/jzzx.png


+ 133 - 0
src/components/MinimizableDialog/index.vue

@@ -0,0 +1,133 @@
+<template>
+  <div>
+    <!-- 正常弹窗 -->
+    <el-dialog
+      v-show="!minimized"
+      :visible.sync="visibleSync"
+      :title="title"
+      v-bind="$attrs"
+      v-on="$listeners"
+      :before-close="handleClose"
+    >
+      <template #title>
+        <span>{{ title }}</span>
+        <i
+          class="el-icon-minus"
+          style="cursor:pointer;float:right;margin-right:35px;"
+          @click.stop="minimize"
+        ></i>
+      </template>
+      <slot />
+      <template #footer>
+        <slot name="footer" />
+      </template>
+    </el-dialog>
+
+    <!-- 最小化悬浮卡片 -->
+    <div
+      v-show="minimized"
+      class="minimized-dialog"
+      ref="minCard"
+      @click="restore"
+    >
+      <i :class="minIcon"></i>
+      <span>{{ minTitle || title }}</span>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  name: "MinimizableDialog",
+  props: {
+    visible: {
+      type: Boolean,
+      required: true
+    },
+    title: {
+      type: String,
+      default: ""
+    },
+    minTitle: {
+      type: String,
+      default: ""
+    },
+    minIcon: {
+      type: String,
+      default: "el-icon-files"
+    }
+  },
+  data() {
+    return {
+      minimized: false,
+      visibleSync: this.visible
+    };
+  },
+  watch: {
+    visible(val) {
+      this.visibleSync = val;
+      if (val) this.minimized = false;
+    },
+    visibleSync(val) {
+      this.$emit("update:visible", val);
+    }
+  },
+  mounted() {
+    this.moveMinCardToBody();
+  },
+  beforeDestroy() {
+    this.removeMinCardFromBody();
+  },
+  methods: {
+    moveMinCardToBody() {
+      if (this.$refs.minCard && typeof window !== 'undefined') {
+        document.body.appendChild(this.$refs.minCard);
+      }
+    },
+    removeMinCardFromBody() {
+      if (this.$refs.minCard && this.$refs.minCard.parentNode) {
+        this.$refs.minCard.parentNode.removeChild(this.$refs.minCard);
+      }
+    },
+    minimize() {
+      this.minimized = true;
+      this.visibleSync = false;
+      this.$emit("minimize");
+    },
+    restore() {
+      this.minimized = false;
+      this.visibleSync = true;
+      this.$emit("restore");
+    },
+    handleClose(done) {
+      this.$emit("close");
+      done();
+    }
+  }
+};
+</script>
+
+<style scoped>
+.minimized-dialog {
+  position: fixed;
+  right: 30px;
+  bottom: 30px;
+  background: #409EFF;
+  color: #fff;
+  padding: 10px 18px;
+  border-radius: 20px;
+  box-shadow: 0 2px 8px rgba(0,0,0,0.15);
+  cursor: pointer;
+  z-index: 1000;
+  display: flex;
+  align-items: center;
+  font-size: 15px;
+}
+.minimized-dialog:hover {
+  box-shadow: 0 4px 16px rgba(0,0,0,0.25);
+}
+.minimized-dialog i {
+  margin-right: 8px;
+  font-size: 18px;
+}
+</style>

+ 5 - 5
src/router/index.js

@@ -165,27 +165,27 @@ export const constantRoutes = [
     ]
   },
   {
-    path: '/qw/sopTempe',
+    path: '/course/sopTempe',
     component: Layout,
     hidden: true,
     children: [
       {
         path: 'updateSopTemp/:id/:type(\\d+)', // 确保 :type 的正则匹配数字
-        component: (resolve) => require(['@/views/qw/sopTemp/updateSopTemp'], resolve),
+        component: () => import('@/views/qw/sopTemp/updateSopTemp'),
         name: 'updateSopTemp',
-        meta: { title: '改动SOP模板', activeMenu: '/qw/addSopTemp' }
+        meta: { title: '改动SOP模板', activeMenu: '/course/addSopTemp' }
       },
       {
         path: 'updateTemp/:id/:type(\\d+)', // 确保 :type 的正则匹配数字
         component: () => import('@/views/qw/sopTemp/updateTemp'),
         name: 'updateTemp',
-        meta: { title: '改动SOP模板', activeMenu: '/qw/updateTemp' }
+        meta: { title: '改动SOP模板', activeMenu: '/course/updateTemp' }
       },
       {
         path: 'updateAiChatTemp/:id/:type(\\d+)', // 确保 :type 的正则匹配数字
         component: () => import('@/views/qw/sopTemp/updateAiChatTemp'),
         name: 'updateAiChatTemp',
-        meta: { title: '改动SOP模板', activeMenu: '/qw/addSopTemp' }
+        meta: { title: '改动SOP模板', activeMenu: '/course/addSopTemp' }
       }
     ]
   },

+ 18 - 6
src/views/course/videoResource/index.vue

@@ -52,6 +52,7 @@
           icon="el-icon-plus"
           size="mini"
           @click="handleAdd"
+          :disabled="hasMinimizableDialog"
           v-hasPermi="['course:videoResource:add']"
         >新增</el-button>
       </el-col>
@@ -61,6 +62,7 @@
           icon="el-icon-plus"
           size="mini"
           @click="handleBatchAdd"
+          :disabled="hasMinimizableDialog"
           v-hasPermi="['course:videoResource:add']"
         >批量新增</el-button>
       </el-col>
@@ -77,7 +79,7 @@
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
 
-    <el-table v-loading="loading" :data="resourceList" @selection-change="handleSelectionChange">
+    <el-table v-loading="loading" :data="resourceList" @selection-change="handleSelectionChange" border>
       <el-table-column type="selection" width="55" align="center" />
       <el-table-column label="序号" width="55" align="center">
               <template slot-scope="scope">
@@ -155,6 +157,7 @@
             type="text"
             icon="el-icon-edit"
             @click="handleUpdate(scope.row)"
+            :disabled="hasMinimizableDialog"
             v-hasPermi="['course:videoResource:edit']"
           >修改</el-button>
           <el-button
@@ -177,7 +180,8 @@
     />
 
     <!-- 添加或修改视频素材库对话框 -->
-    <el-dialog :title="title" :visible.sync="open" width="700px" append-to-body :before-close="cancel">
+    <minimizable-dialog :title="title" :visible.sync="open" width="700px" append-to-body :before-close="cancel"
+                        @minimize="hasMinimizableDialog = true" @restore="hasMinimizableDialog = false">
       <el-form ref="form" :model="form" :rules="rules" label-width="80px">
         <el-form-item label="素材名称" prop="resourceName" style="margin-top: 20px">
           <el-input v-model="form.resourceName" placeholder="请输入" />
@@ -286,7 +290,7 @@
         <el-button @click="cancel">取消</el-button>
         <el-button type="primary" @click="submitForm">保存</el-button>
       </div>
-    </el-dialog>
+    </minimizable-dialog>
 
     <el-dialog
       title="视频预览"
@@ -301,7 +305,8 @@
     </el-dialog>
 
     <!-- 批量选择视频弹窗 -->
-    <el-dialog :title="'选择视频'" :visible.sync="batchAddVisible" width="1200px" append-to-body class="batch-dialog" :close-on-click-modal="false" :before-close="cancelBeforeBatch">
+    <minimizable-dialog :title="'选择视频'" :visible.sync="batchAddVisible" width="1200px" append-to-body class="batch-dialog" :close-on-click-modal="false" :before-close="cancelBeforeBatch"
+                        @minimize="hasMinimizableDialog = true" @restore="hasMinimizableDialog = false">
       <div class="filter-container">
         <el-button type="primary" icon="el-icon-plus" size="small" @click="showUploadPanel">上传视频</el-button>
       </div>
@@ -309,7 +314,8 @@
       <el-table
         v-loading="batchLoading"
         :data="videoList"
-        height="350">
+        height="350"
+        border>
         <el-table-column label="序号" width="60" align="center">
           <template slot-scope="scope">
             {{ scope.$index + 1 }}
@@ -491,7 +497,7 @@
         </div>
       </el-dialog>
 
-    </el-dialog>
+    </minimizable-dialog>
 
     <!-- 项目选择弹窗 -->
     <el-dialog
@@ -643,9 +649,13 @@ import {getByIds, listCourseQuestionBank} from '@/api/course/courseQuestionBank'
 import {getThumbnail} from "@/api/course/userVideo";
 import {uploadObject} from "@/utils/cos.js";
 import {uploadToOBS} from "@/utils/obs.js";
+import MinimizableDialog from "@/components/MinimizableDialog"
 
 export default {
   name: 'VideoResource',
+  components: {
+    MinimizableDialog
+  },
   data() {
     return {
       // 遮罩层
@@ -768,6 +778,8 @@ export default {
           ]
         },
       },
+      // 是否存在最小化窗口
+      hasMinimizableDialog: false,
     }
   },
   watch: {

+ 7 - 2
src/views/his/company/index.vue

@@ -422,7 +422,12 @@ export default {
          { required: true, message: "管理员账号不能为空", trigger: "blur" }
        ],
        password: [
-         { required: true, message: "管理员密码不能为空", trigger: "blur" }
+         { required: true, message: "管理员密码不能为空", trigger: "blur" },
+         {
+           pattern: /^(?=.*[A-Za-z])(?=.*\d)(?=.*[^A-Za-z0-9]).{8,20}$/,
+           message: "密码长度为8-20 位,必须包含字母、数字和特殊字符",
+           trigger: ["blur", "change"],
+         }
        ],
         manager: [
          { required: true, message: "商务负责人不能为空", trigger: "blur" }
@@ -566,7 +571,7 @@ export default {
 
     handleResetPwd(row) {
       const companyIds = row.companyId || this.ids;
-      this.$confirm('是否确认重复密码为123456?', "警告", {
+      this.$confirm('是否确认重复密码为cq654321!!', "警告", {
           confirmButtonText: "确定",
           cancelButtonText: "取消",
           type: "warning"

+ 6 - 1
src/views/login.vue

@@ -86,7 +86,12 @@ export default {
           { required: true, trigger: "blur", message: "用户名不能为空" }
         ],
         password: [
-          { required: true, trigger: "blur", message: "密码不能为空" }
+          { required: true, trigger: "blur", message: "密码不能为空" },
+          {
+            pattern: /^(?=.*[A-Za-z])(?=.*\d)(?=.*[^A-Za-z0-9]).{8,20}$/,
+            message: "密码长度为8-20 位,必须包含字母、数字和特殊字符",
+            trigger: ["blur", "change"],
+          }
         ],
         code: [{ required: true, trigger: "change", message: "验证码不能为空" }]
       },

+ 2 - 2
src/views/qw/sopTemp/index.vue

@@ -504,7 +504,7 @@ export default {
       // if (row.sendType==4) {
       //   this.$router.push(`/qw/sopTemp/updateAiChatTemp/${row.id}/3`)
       // }else{
-      this.$router.push(`/qw/sopTempe/updateSopTemp/${row.id}/3`)
+      this.$router.push(`/course/sopTempe/updateSopTemp/${row.id}/3`)
       // }
     },
     /** 修改按钮操作 */
@@ -522,7 +522,7 @@ export default {
       // if (row.sendType==4) {
       //   this.$router.push(`/qw/sopTemp/updateAiChatTemp/${row.id}/1`)
       // }else{
-      let url = `/qw/sopTempe/updateSopTemp/${row.id}/1`;
+      let url = `/course/sopTempe/updateSopTemp/${row.id}/1`;
       console.info(url)
       this.$router.push(url)
       // }

+ 12 - 2
src/views/system/config/config.vue

@@ -864,7 +864,18 @@
     </el-tab-pane>
        <el-tab-pane label="点播配置" name="course.config">
          <el-form ref="form18" :model="form18" label-width="120px">
-           <el-form-item label="完课进度(%)">
+           <el-form-item label="完课模式">
+             <el-radio-group v-model="form18.completionMode">
+               <el-radio label="1">百分比</el-radio>
+               <el-radio label="2">分钟数</el-radio>
+             </el-radio-group>
+           </el-form-item>
+           <el-form-item label="完课进度(分)" v-if="form18.completionMode == 2">
+             <el-tooltip class="item" effect="dark" content="看多少分钟算完课" placement="top-end">
+               <el-input-number  v-model="form18.minutesNum" :min="1"></el-input-number>
+             </el-tooltip>
+           </el-form-item>
+           <el-form-item label="完课进度(%)" v-if="form18.completionMode == 1">
              <el-tooltip class="item" effect="dark" content="看多少百分比算完课" placement="top-end">
                <el-input-number  v-model="form18.answerRate" :min="1" :max="100"    ></el-input-number>
              </el-tooltip>
@@ -965,7 +976,6 @@
                <el-radio label="2">分公司</el-radio>
              </el-radio-group>
            </el-form-item>
-
            <div class="line"></div>
            <div style="float:right;margin-right:20px">
              <el-button type="primary" @click="submitForm18">提交</el-button>

+ 5 - 1
src/views/system/user/profile/resetPwd.vue

@@ -42,7 +42,11 @@ export default {
         ],
         newPassword: [
           { required: true, message: "新密码不能为空", trigger: "blur" },
-          { min: 6, max: 20, message: "长度在 6 到 20 个字符", trigger: "blur" }
+          {
+            pattern: /^(?=.*[A-Za-z])(?=.*\d)(?=.*[^A-Za-z0-9]).{8,20}$/,
+            message: "密码长度为 8-20 位,必须包含字母、数字和特殊字符",
+            trigger: ["blur", "change"],
+          }
         ],
         confirmPassword: [
           { required: true, message: "确认密码不能为空", trigger: "blur" },