Procházet zdrojové kódy

Merge branch 'master' of http://1.14.104.71:10880/txl/ylrz_saas_his_scrm_adminUI

lmx před 1 dnem
rodič
revize
6f7f93af50
41 změnil soubory, kde provedl 775 přidání a 3 odebrání
  1. 63 0
      src/api/company/externalApi.js
  2. 23 0
      src/api/system/config.js
  3. 3 0
      src/views/company/components/companyProfit.vue
  4. 419 0
      src/views/company/workflowExternalApi/index.vue
  5. 4 1
      src/views/components/course/userCourseCatalogDetails.vue
  6. 6 0
      src/views/course/courseFinishTemp/index.vue
  7. 6 0
      src/views/course/courseFinishTempParent/index.vue
  8. 3 0
      src/views/course/userVideo/index.vue
  9. 3 0
      src/views/his/adv/index.vue
  10. 2 0
      src/views/his/aiDoctorRole/fastGptRoleUpdate.vue
  11. 2 0
      src/views/his/aiDoctorRole/index.vue
  12. 5 0
      src/views/his/appVersion/index.vue
  13. 3 0
      src/views/his/article/index.vue
  14. 3 0
      src/views/his/articleCate/index.vue
  15. 3 0
      src/views/his/department/index.vue
  16. 6 0
      src/views/his/doctor/type1.vue
  17. 6 0
      src/views/his/doctor/type2.vue
  18. 4 0
      src/views/his/doctorArticle/index.vue
  19. 3 0
      src/views/his/doctorArticleCate/index.vue
  20. 4 0
      src/views/his/homeArticle/index.vue
  21. 3 0
      src/views/his/homeCategory/index.vue
  22. 3 0
      src/views/his/packageCate/index.vue
  23. 2 0
      src/views/his/store/audit.vue
  24. 4 0
      src/views/his/store/index.vue
  25. 2 0
      src/views/his/storeProduct/index.vue
  26. 3 0
      src/views/his/storeProductCategory/index.vue
  27. 3 0
      src/views/his/testTemp/index.vue
  28. 4 0
      src/views/hisStore/adv/index.vue
  29. 23 0
      src/views/hisStore/store/index.vue
  30. 2 0
      src/views/live/live/index.vue
  31. 3 0
      src/views/qw/friendMaterial/index.vue
  32. 4 0
      src/views/qw/sopTemp/addSopTemp.vue
  33. 5 0
      src/views/qw/sopTemp/addSopTempOld.vue
  34. 2 0
      src/views/qw/sopTemp/addTemp.vue
  35. 4 0
      src/views/qw/sopTemp/updateSopTemp.vue
  36. 4 0
      src/views/qw/sopTemp/updateSopTemp2.vue
  37. 5 0
      src/views/qw/sopTemp/updateSopTempOld.vue
  38. 2 0
      src/views/qw/sopTemp/updateTemp.vue
  39. 123 2
      src/views/system/config/config.vue
  40. 3 0
      src/views/system/config/config2.vue
  41. binární
      src/views/system/config/操作指南.png

+ 63 - 0
src/api/company/externalApi.js

@@ -0,0 +1,63 @@
+import request from '@/utils/request'
+
+// 分页查询外部接口配置
+export function pageExternalApi(query) {
+  return request({
+    url: '/companyWorkflow/externalApi/page',
+    method: 'get',
+    params: query
+  })
+}
+
+// 详情
+export function getExternalApi(id) {
+  return request({
+    url: '/companyWorkflow/externalApi/' + id,
+    method: 'get'
+  })
+}
+
+// 新增/编辑
+export function saveOrUpdateExternalApi(data) {
+  return request({
+    url: '/companyWorkflow/externalApi/saveOrUpdate',
+    method: 'post',
+    data
+  })
+}
+
+// 启停
+export function changeExternalApiStatus(id, status) {
+  return request({
+    url: '/companyWorkflow/externalApi/' + id + '/status',
+    method: 'post',
+    params: { status }
+  })
+}
+
+// 删除
+export function deleteExternalApi(id) {
+  return request({
+    url: '/companyWorkflow/externalApi/' + id,
+    method: 'delete'
+  })
+}
+
+// 测试接口
+export function testExternalApi(id, data) {
+  return request({
+    url: '/companyWorkflow/externalApi/' + id + '/test',
+    method: 'post',
+    data
+  })
+}
+
+// 调用日志分页
+export function pageExternalApiLogs(query) {
+  return request({
+    url: '/companyWorkflow/externalApi/logs/page',
+    method: 'get',
+    params: query
+  })
+}
+

+ 23 - 0
src/api/system/config.js

@@ -97,4 +97,27 @@ export function getGatewayList(query) {
     method: 'get',
     params: query
   })
+}
+
+export function createTencentWordFile(title) {
+  return request({
+    url: '/third/tencentWord/createFile',
+    method: 'post',
+    data: title,
+    headers: { 'Content-Type': 'text/plain;charset=UTF-8' }
+  })
+}
+
+export function getTencentWordFiles() {
+  return request({
+    url: '/third/tencentWord/getFiles',
+    method: 'get',
+  })
+}
+
+export function synchronization(fileId) {
+  return request({
+    url: '/third/tencentWord/synchronization/' + fileId,
+    method: 'get',
+  })
 }

+ 3 - 0
src/views/company/components/companyProfit.vue

@@ -115,6 +115,7 @@
               v-model="form.imgUrl"
               class="avatar-uploader"
               :action="uploadUrl"
+              :headers="uploadHeaders"
               :show-file-list="false"
               :on-success="handleSuccess"
               :before-upload="beforeUpload">
@@ -136,6 +137,7 @@
 
 <script>
 import { audit1,audit2,audit3, getCompanyProfit, delCompanyProfit, addCompanyProfit, updateCompanyProfit, exportCompanyProfit } from "@/api/company/companyProfit";
+import { getToken } from "@/utils/auth";
 
 export default {
   name: "profit",
@@ -143,6 +145,7 @@ export default {
     return {
       type:null,
       uploadUrl:process.env.VUE_APP_BASE_API+"/common/uploadOSS",
+      uploadHeaders: { Authorization: "Bearer " + getToken() },
       baseUrl: process.env.VUE_APP_BASE_API,
        // 弹出层标题
        title: "",

+ 419 - 0
src/views/company/workflowExternalApi/index.vue

@@ -0,0 +1,419 @@
+<template>
+  <div class="app-container">
+    <el-card shadow="never" class="mb8">
+      <div slot="header">
+        <span>外部接口管理配置</span>
+      </div>
+
+      <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" label-width="70px">
+        <el-form-item label="接口类型">
+          <el-input v-model="queryParams.apiType" placeholder="请输入" clearable @keyup.enter.native="handleQuery" />
+        </el-form-item>
+        <el-form-item label="接口名称">
+          <el-input v-model="queryParams.apiName" placeholder="请输入" clearable @keyup.enter.native="handleQuery" />
+        </el-form-item>
+        <el-form-item label="接口编码">
+          <el-input v-model="queryParams.apiCode" placeholder="请输入" clearable @keyup.enter.native="handleQuery" />
+        </el-form-item>
+        <el-form-item label="状态">
+          <el-select v-model="queryParams.status" placeholder="请选择" clearable style="width: 120px">
+            <el-option label="启用" :value="1" />
+            <el-option label="停用" :value="0" />
+          </el-select>
+        </el-form-item>
+        <el-form-item>
+          <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">查询</el-button>
+          <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+        </el-form-item>
+      </el-form>
+    </el-card>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd">新增接口</el-button>
+      </el-col>
+    </el-row>
+
+    <el-table v-loading="loading" :data="list" border>
+      <el-table-column type="index" label="序号" width="60" />
+      <el-table-column prop="apiName" label="接口名称" min-width="160" show-overflow-tooltip />
+      <el-table-column prop="apiCode" label="接口编码" min-width="160" show-overflow-tooltip />
+      <el-table-column prop="apiType" label="接口类型" width="120" />
+      <el-table-column prop="apiUrl" label="请求地址" min-width="260" show-overflow-tooltip />
+      <el-table-column prop="httpMethod" label="请求方式" width="110" />
+      <el-table-column label="限频规则" width="140">
+        <template slot-scope="scope">
+          <span v-if="scope.row.rateMaxCount && scope.row.rateWindowSeconds">
+            {{ scope.row.rateMaxCount }}次/{{ formatWindow(scope.row.rateWindowSeconds) }}
+          </span>
+          <span v-else>-</span>
+        </template>
+      </el-table-column>
+      <el-table-column prop="priority" label="优先级" width="90" />
+      <el-table-column label="状态" width="110">
+        <template slot-scope="scope">
+          <el-switch
+            v-model="scope.row.status"
+            :active-value="1"
+            :inactive-value="0"
+            @change="val => handleStatusChange(scope.row, val)"
+          />
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" width="260" fixed="right">
+        <template slot-scope="scope">
+          <el-button type="text" size="mini" @click="handleTest(scope.row)">测试</el-button>
+          <el-button type="text" size="mini" @click="handleEdit(scope.row)">编辑</el-button>
+          <el-button type="text" size="mini" @click="handleLogs(scope.row)">日志</el-button>
+          <el-button type="text" size="mini" style="color:#F56C6C" @click="handleDelete(scope.row)">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total > 0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 新增/编辑 -->
+    <el-dialog :title="form.id ? '编辑接口' : '新增接口'" :visible.sync="openForm" width="720px" append-to-body>
+      <el-form ref="formRef" :model="form" :rules="rules" label-width="110px">
+        <el-row :gutter="12">
+          <el-col :span="12">
+            <el-form-item label="接口类型" prop="apiType">
+              <el-input v-model="form.apiType" placeholder="例如 WEATHER" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="接口名称" prop="apiName">
+              <el-input v-model="form.apiName" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="接口编码" prop="apiCode">
+              <el-input v-model="form.apiCode" :disabled="!!form.id" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="请求方式" prop="httpMethod">
+              <el-select v-model="form.httpMethod" placeholder="请选择" style="width:100%">
+                <el-option label="GET" value="GET" />
+                <el-option label="POST" value="POST" />
+                <el-option label="PUT" value="PUT" />
+                <el-option label="DELETE" value="DELETE" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="请求地址" prop="apiUrl">
+              <el-input v-model="form.apiUrl" placeholder="https://..." />
+            </el-form-item>
+          </el-col>
+
+          <el-col :span="12">
+            <el-form-item label="限频窗口(秒)">
+              <el-input-number v-model="form.rateWindowSeconds" :min="1" :step="1" style="width:100%" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="窗口最大次数">
+              <el-input-number v-model="form.rateMaxCount" :min="1" :step="1" style="width:100%" />
+            </el-form-item>
+          </el-col>
+
+          <el-col :span="12">
+            <el-form-item label="优先级">
+              <el-input-number v-model="form.priority" :min="0" :step="1" style="width:100%" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="状态">
+              <el-select v-model="form.status" style="width:100%">
+                <el-option label="启用" :value="1" />
+                <el-option label="停用" :value="0" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+
+          <el-col :span="12">
+            <el-form-item label="超时(ms)">
+              <el-input-number v-model="form.timeoutMs" :min="1000" :step="500" style="width:100%" />
+            </el-form-item>
+          </el-col>
+
+          <el-col :span="24">
+            <el-form-item label="默认请求头(JSON)">
+              <el-input v-model="form.defaultHeadersJson" type="textarea" :rows="3" placeholder='{"Content-Type":"application/json"}' />
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="默认请求体(JSON)">
+              <el-input v-model="form.defaultBodyJson" type="textarea" :rows="4" placeholder='{"k":"v"}' />
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="openForm = false">取消</el-button>
+        <el-button type="primary" @click="submitForm">确定</el-button>
+      </div>
+    </el-dialog>
+
+    <!-- 测试 -->
+    <el-dialog title="测试接口" :visible.sync="openTest" width="760px" append-to-body>
+      <el-form :model="testForm" label-width="130px">
+        <el-form-item label="覆盖请求头(JSON)">
+          <el-input v-model="testForm.headersJson" type="textarea" :rows="3" />
+        </el-form-item>
+        <el-form-item label="覆盖请求体(JSON)">
+          <el-input v-model="testForm.bodyJson" type="textarea" :rows="4" />
+        </el-form-item>
+        <el-form-item label="覆盖超时(ms)">
+          <el-input-number v-model="testForm.timeoutMs" :min="1000" :step="500" />
+        </el-form-item>
+      </el-form>
+
+      <el-divider content-position="left">响应</el-divider>
+      <el-descriptions :column="2" border size="small">
+        <el-descriptions-item label="状态码">{{ testResult.responseStatus || '-' }}</el-descriptions-item>
+        <el-descriptions-item label="耗时(ms)">{{ testResult.durationMs || '-' }}</el-descriptions-item>
+        <el-descriptions-item label="是否成功">{{ testResult.success === true ? '是' : (testResult.success === false ? '否' : '-') }}</el-descriptions-item>
+        <el-descriptions-item label="错误信息">{{ testResult.errorMessage || '-' }}</el-descriptions-item>
+      </el-descriptions>
+      <el-input v-model="testResult.responseBody" type="textarea" :rows="10" readonly style="margin-top: 10px" />
+
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="openTest = false">关闭</el-button>
+        <el-button type="primary" :loading="testLoading" @click="doTest">开始测试</el-button>
+      </div>
+    </el-dialog>
+
+    <!-- 日志 -->
+    <el-dialog title="调用日志" :visible.sync="openLogs" width="980px" append-to-body>
+      <el-table v-loading="logsLoading" :data="logs" border height="520px">
+        <el-table-column type="index" label="序号" width="60" />
+        <el-table-column prop="createTime" label="时间" width="170" />
+        <el-table-column prop="httpMethod" label="方法" width="90" />
+        <el-table-column prop="requestUrl" label="URL" min-width="260" show-overflow-tooltip />
+        <el-table-column prop="responseStatus" label="状态码" width="90" />
+        <el-table-column prop="durationMs" label="耗时(ms)" width="100" />
+        <el-table-column prop="success" label="成功" width="80">
+          <template slot-scope="scope">
+            <el-tag v-if="scope.row.success === 1" type="success">成功</el-tag>
+            <el-tag v-else type="danger">失败</el-tag>
+          </template>
+        </el-table-column>
+        <el-table-column prop="errorMessage" label="错误信息" min-width="160" show-overflow-tooltip />
+      </el-table>
+
+      <pagination
+        v-show="logsTotal > 0"
+        :total="logsTotal"
+        :page.sync="logsQuery.pageNum"
+        :limit.sync="logsQuery.pageSize"
+        @pagination="getLogs"
+      />
+
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="openLogs = false">关闭</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  pageExternalApi,
+  getExternalApi,
+  saveOrUpdateExternalApi,
+  changeExternalApiStatus,
+  deleteExternalApi,
+  testExternalApi,
+  pageExternalApiLogs
+} from '@/api/company/externalApi'
+
+export default {
+  name: 'CompanyWorkflowExternalApi',
+  data() {
+    return {
+      loading: false,
+      list: [],
+      total: 0,
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        apiType: undefined,
+        apiName: undefined,
+        apiCode: undefined,
+        status: undefined
+      },
+
+      openForm: false,
+      form: this.emptyForm(),
+      rules: {
+        apiType: [{ required: true, message: '接口类型不能为空', trigger: 'blur' }],
+        apiName: [{ required: true, message: '接口名称不能为空', trigger: 'blur' }],
+        apiCode: [{ required: true, message: '接口编码不能为空', trigger: 'blur' }],
+        apiUrl: [{ required: true, message: '请求地址不能为空', trigger: 'blur' }],
+        httpMethod: [{ required: true, message: '请求方式不能为空', trigger: 'change' }]
+      },
+
+      openTest: false,
+      testLoading: false,
+      currentRow: null,
+      testForm: {
+        headersJson: '',
+        bodyJson: '',
+        timeoutMs: 10000
+      },
+      testResult: {
+        responseStatus: null,
+        responseBody: '',
+        durationMs: null,
+        success: null,
+        errorMessage: ''
+      },
+
+      openLogs: false,
+      logsLoading: false,
+      logs: [],
+      logsTotal: 0,
+      logsQuery: {
+        pageNum: 1,
+        pageSize: 10,
+        configId: null
+      }
+    }
+  },
+  created() {
+    this.getList()
+  },
+  methods: {
+    emptyForm() {
+      return {
+        id: null,
+        apiType: '',
+        apiName: '',
+        apiCode: '',
+        apiUrl: '',
+        httpMethod: 'GET',
+        rateWindowSeconds: null,
+        rateMaxCount: null,
+        priority: 0,
+        status: 1,
+        timeoutMs: 10000,
+        defaultHeadersJson: '',
+        defaultBodyJson: ''
+      }
+    },
+    formatWindow(seconds) {
+      if (!seconds) return '-'
+      if (seconds % 86400 === 0) return (seconds / 86400) + '天'
+      if (seconds % 3600 === 0) return (seconds / 3600) + '小时'
+      if (seconds % 60 === 0) return (seconds / 60) + '分钟'
+      return seconds + '秒'
+    },
+    getList() {
+      this.loading = true
+      pageExternalApi(this.queryParams).then(res => {
+        const page = res.data || {}
+        this.list = page.records || []
+        this.total = page.total || 0
+      }).finally(() => {
+        this.loading = false
+      })
+    },
+    handleQuery() {
+      this.queryParams.pageNum = 1
+      this.getList()
+    },
+    resetQuery() {
+      this.queryParams = {
+        pageNum: 1,
+        pageSize: 10,
+        apiType: undefined,
+        apiName: undefined,
+        apiCode: undefined,
+        status: undefined
+      }
+      this.getList()
+    },
+    handleAdd() {
+      this.form = this.emptyForm()
+      this.openForm = true
+      this.$nextTick(() => this.$refs.formRef && this.$refs.formRef.clearValidate())
+    },
+    handleEdit(row) {
+      getExternalApi(row.id).then(res => {
+        this.form = Object.assign(this.emptyForm(), res.data || {})
+        this.openForm = true
+        this.$nextTick(() => this.$refs.formRef && this.$refs.formRef.clearValidate())
+      })
+    },
+    submitForm() {
+      this.$refs.formRef.validate(valid => {
+        if (!valid) return
+        saveOrUpdateExternalApi(this.form).then(() => {
+          this.$message.success('保存成功')
+          this.openForm = false
+          this.getList()
+        })
+      })
+    },
+    handleStatusChange(row, val) {
+      changeExternalApiStatus(row.id, val).then(() => {
+        this.$message.success('状态已更新')
+      }).catch(() => {
+        row.status = val === 1 ? 0 : 1
+      })
+    },
+    handleDelete(row) {
+      this.$confirm(`确认删除接口【${row.apiName}】?`, '提示', { type: 'warning' })
+        .then(() => deleteExternalApi(row.id))
+        .then(() => {
+          this.$message.success('删除成功')
+          this.getList()
+        })
+        .catch(() => {})
+    },
+    handleTest(row) {
+      this.currentRow = row
+      this.testForm = { headersJson: '', bodyJson: '', timeoutMs: row.timeoutMs || 10000 }
+      this.testResult = { responseStatus: null, responseBody: '', durationMs: null, success: null, errorMessage: '' }
+      this.openTest = true
+    },
+    doTest() {
+      if (!this.currentRow) return
+      this.testLoading = true
+      testExternalApi(this.currentRow.id, this.testForm).then(res => {
+        this.testResult = res.data || this.testResult
+      }).finally(() => {
+        this.testLoading = false
+      })
+    },
+    handleLogs(row) {
+      this.logsQuery = { pageNum: 1, pageSize: 10, configId: row.id }
+      this.openLogs = true
+      this.getLogs()
+    },
+    getLogs() {
+      this.logsLoading = true
+      pageExternalApiLogs(this.logsQuery).then(res => {
+        const page = res.data || {}
+        this.logs = page.records || []
+        this.logsTotal = page.total || 0
+      }).finally(() => {
+        this.logsLoading = false
+      })
+    }
+  }
+}
+</script>
+
+<style scoped>
+.mb8 { margin-bottom: 8px; }
+</style>
+

+ 4 - 1
src/views/components/course/userCourseCatalogDetails.vue

@@ -133,7 +133,7 @@
         </el-form-item>
 
         <el-form-item label="视频缩略图" prop="thumbnail">
-          <el-upload v-model="form.thumbnail" class="avatar-uploader" :action="uploadUrl" :show-file-list="false"
+          <el-upload v-model="form.thumbnail" class="avatar-uploader" :action="uploadUrl" :headers="uploadHeaders" :show-file-list="false"
                      :on-success="handleAvatarSuccess" :before-upload="beforeAvatarUpload">
             <img v-if="form.thumbnail" :src="form.thumbnail" class="avatar" width="300px">
             <i v-else class="el-icon-plus avatar-uploader-icon"></i>
@@ -491,6 +491,7 @@
           <el-upload v-model="batchEditCoverDialog.form.thumbnail"
                      class="avatar-uploader"
                      :action="uploadUrl"
+                     :headers="uploadHeaders"
                      :show-file-list="false"
                      :on-success="handleCoverSuccess"
                      :before-upload="beforeAvatarUpload">
@@ -531,6 +532,7 @@ import {getByIds} from '@/api/course/courseQuestionBank'
 import CourseWatchComment from "./courseWatchComment.vue";
 import {getCateListByPid, getCatePidList} from '@/api/course/userCourseCategory'
 import draggable from 'vuedraggable'
+import { getToken } from "@/utils/auth";
 import { getConfigByKey } from '@/api/system/config'
 
 export default {
@@ -578,6 +580,7 @@ export default {
       // 是否显示弹出层
       open: false,
       uploadUrl: process.env.VUE_APP_BASE_API + "/common/uploadOSS",
+      uploadHeaders: { Authorization: "Bearer " + getToken() },
       baseUrl: process.env.VUE_APP_BASE_API,
       typeOptions: [],
       files: [],

+ 6 - 0
src/views/course/courseFinishTemp/index.vue

@@ -279,6 +279,7 @@
                           v-model="item.fileUrl"
                           class="avatar-uploader"
                           :action="uploadUrl"
+                          :headers="uploadHeaders"
                           :show-file-list="false"
                           :on-success="(res, file) => handleAvatarSuccessFile(res, file, item)"
                           :before-upload="beforeAvatarUploadFile">
@@ -297,6 +298,7 @@
                           v-model="item.videoUrl"
                           class="avatar-uploader"
                           :action="uploadUrl"
+                          :headers="uploadHeaders"
                           :show-file-list="false"
                           :on-success="(res, file) => handleAvatarSuccessVideo(res, file, item)"
                           :before-upload="beforeAvatarUploadVideo">
@@ -379,6 +381,7 @@
                           v-model="item.fileUrl"
                           class="avatar-uploader"
                           :action="uploadUrl"
+                          :headers="uploadHeaders"
                           :show-file-list="false"
                           :on-success="(res, file) => handleAvatarSuccessFile(res, file, item)"
                           :before-upload="beforeAvatarUploadFile">
@@ -397,6 +400,7 @@
                           v-model="item.videoUrl"
                           class="avatar-uploader"
                           :action="uploadUrl"
+                          :headers="uploadHeaders"
                           :show-file-list="false"
                           :on-success="(res, file) => handleAvatarSuccessVideo(res, file, item)"
                           :before-upload="beforeAvatarUploadVideo">
@@ -477,6 +481,7 @@ import ImageUpload from "@/views/qw/sop/ImageUpload.vue";
 import { getCompanyList } from "@/api/company/company";
 import SelectTree from '@/components/TreeSelect/index.vue'
 import { getDeptData } from '@/api/system/employeeStats'
+import { getToken } from "@/utils/auth";
 
 export default {
   name: "CourseFinishTemp",
@@ -488,6 +493,7 @@ export default {
       //上传语音的遮罩层
       voiceLoading: false,
       uploadUrl: process.env.VUE_APP_BASE_API + "/common/uploadOSS2",
+      uploadHeaders: { Authorization: "Bearer " + getToken() },
       uploadUrlByVoice: process.env.VUE_APP_BASE_API + "/common/uploadOSSByHOOKVoice",
       companyUserIds: [],
       userList: [],

+ 6 - 0
src/views/course/courseFinishTempParent/index.vue

@@ -207,6 +207,7 @@
                           v-model="item.fileUrl"
                           class="avatar-uploader"
                           :action="uploadUrl"
+                          :headers="uploadHeaders"
                           :show-file-list="false"
                           :on-success="(res, file) => handleAvatarSuccessFile(res, file, item)"
                           :before-upload="beforeAvatarUploadFile">
@@ -225,6 +226,7 @@
                           v-model="item.videoUrl"
                           class="avatar-uploader"
                           :action="uploadUrl"
+                          :headers="uploadHeaders"
                           :show-file-list="false"
                           :on-success="(res, file) => handleAvatarSuccessVideo(res, file, item)"
                           :before-upload="beforeAvatarUploadVideo">
@@ -307,6 +309,7 @@
                           v-model="item.fileUrl"
                           class="avatar-uploader"
                           :action="uploadUrl"
+                          :headers="uploadHeaders"
                           :show-file-list="false"
                           :on-success="(res, file) => handleAvatarSuccessFile(res, file, item)"
                           :before-upload="beforeAvatarUploadFile">
@@ -325,6 +328,7 @@
                           v-model="item.videoUrl"
                           class="avatar-uploader"
                           :action="uploadUrl"
+                          :headers="uploadHeaders"
                           :show-file-list="false"
                           :on-success="(res, file) => handleAvatarSuccessVideo(res, file, item)"
                           :before-upload="beforeAvatarUploadVideo">
@@ -396,6 +400,7 @@ import { listCourseFinishTempParent, getCourseFinishTempParent, delCourseFinishT
 import {courseList} from '@/api/qw/sop'
 import ImageUpload from '@/views/qw/sop/ImageUpload.vue'
 import { getUserList } from '@/api/company/companyUser'
+import { getToken } from "@/utils/auth";
 
 
 export default {
@@ -405,6 +410,7 @@ export default {
     return {
       voiceLoading: false,
       uploadUrl: process.env.VUE_APP_BASE_API + "/common/uploadOSS2",
+      uploadHeaders: { Authorization: "Bearer " + getToken() },
       uploadUrlByVoice: process.env.VUE_APP_BASE_API + "/common/uploadOSSByHOOKVoice",
       // 遮罩层
       loading: true,

+ 3 - 0
src/views/course/userVideo/index.vue

@@ -272,6 +272,7 @@
             v-model="form.thumbnail"
             class="avatar-uploader"
             :action="uploadUrl"
+            :headers="uploadHeaders"
             :show-file-list="false"
             :on-success="handleAvatarSuccess"
             :before-upload="beforeAvatarUpload">
@@ -393,6 +394,7 @@ import axios from 'axios';
 import { Loading } from 'element-ui';
 import { uploadObject } from '@/utils/cos.js';
 import { uploadToOBS } from '@/utils/obs.js';
+import { getToken } from "@/utils/auth";
 export default {
   name: "UserVideo",
   components: {
@@ -475,6 +477,7 @@ export default {
       videoUrl: "",
       videoAccept:"video/*",
       uploadUrl:process.env.VUE_APP_BASE_API+"/common/uploadOSS",
+      uploadHeaders: { Authorization: "Bearer " + getToken() },
       baseUrl: process.env.VUE_APP_BASE_API,
       cateOptions:[],
       // 非单个禁用

+ 3 - 0
src/views/his/adv/index.vue

@@ -169,6 +169,7 @@
                       v-model="form.imageUrl"
                       class="avatar-uploader"
                       :action="uploadUrl"
+                      :headers="uploadHeaders"
                       :show-file-list="false"
                       :on-success="handleAvatarSuccess"
                       :before-upload="beforeAvatarUpload">
@@ -238,12 +239,14 @@
 import { listAdv, getAdv, delAdv, addAdv, updateAdv, exportAdv } from "@/api/his/adv";
 import Editor from '@/components/Editor/wang';
 import { getPromotionalActiveOption } from '@/api/his/promotionalActive'
+import { getToken } from "@/utils/auth";
 export default {
   name: "Adv",
   components: { Editor },
   data() {
     return {
       uploadUrl:process.env.VUE_APP_BASE_API+"/common/uploadOSS",
+      uploadHeaders: { Authorization: "Bearer " + getToken() },
       baseUrl: process.env.VUE_APP_BASE_API,
       showOptions: [],
       devOptions: [],

+ 2 - 0
src/views/his/aiDoctorRole/fastGptRoleUpdate.vue

@@ -160,6 +160,7 @@ import {
 } from "@/api/fastGpt/fastGptRoleTag";
 import source from "echarts/src/data/Source";
 import ImageUpload from "@/views/qw/sop/ImageUpload.vue";
+import { getToken } from "@/utils/auth";
 
 
 export default {
@@ -212,6 +213,7 @@ export default {
       tagListFormIndexAdd:[],
       // uploadUrl:process.env.VUE_APP_BASE_API+"/chat/upload/uploadFile",
       uploadUrl:process.env.VUE_APP_BASE_API+"/common/uploadOSS",
+      uploadHeaders: { Authorization: "Bearer " + getToken() },
       // 选中数组
       ids: [],
 	  externalInfoOptions : [],

+ 2 - 0
src/views/his/aiDoctorRole/index.vue

@@ -107,6 +107,7 @@ import {
 } from "@/api/fastGpt/fastGptRoleTag";
 import source from "echarts/src/data/Source";
 import ImageUpload from "@/views/qw/sop/ImageUpload.vue";
+import { getToken } from "@/utils/auth";
 
 export default {
   name: "FastGptRole",
@@ -159,6 +160,7 @@ export default {
       tagListFormIndexAdd:[],
       // uploadUrl:process.env.VUE_APP_BASE_API+"/chat/upload/uploadFile",
       uploadUrl:process.env.VUE_APP_BASE_API+"/common/uploadOSS",
+      uploadHeaders: { Authorization: "Bearer " + getToken() },
       // 选中数组
       ids: [],
 	  externalInfoOptions:[],

+ 5 - 0
src/views/his/appVersion/index.vue

@@ -123,6 +123,7 @@
             accept=".apk"
             class="upload-demo"
             :action="uploadUrl"
+            :headers="uploadHeaders"
             :before-upload="beforeUpload"
             :on-success="handleSuccess"
             :on-preview="handlePreview"
@@ -140,6 +141,7 @@
             accept=".zip"
             class="upload-demo"
             :action="uploadUrl"
+            :headers="uploadHeaders"
             :before-upload="beforeUpload"
             :on-success="handleSuccess"
             :on-preview="handlePreview"
@@ -161,6 +163,7 @@
             accept=".apk"
             class="upload-demo"
             :action="uploadUrl"
+            :headers="uploadHeaders"
             :before-upload="beforeUploadBaidu"
             :on-success="handleSuccessBaidu"
             :on-preview="handlePreviewBaidu"
@@ -216,6 +219,7 @@
 </template>
 <script>
 import { listApp, getApp, delApp, addApp, updateApp, exportApp } from "@/api/his/appVersion";
+import { getToken } from "@/utils/auth";
 
 export default {
   name: "App",
@@ -223,6 +227,7 @@ export default {
     return {
       updateConfig: { },
       uploadUrl:process.env.VUE_APP_BASE_API+"/common/uploadOSS",
+      uploadHeaders: { Authorization: "Bearer " + getToken() },
       // 遮罩层
       loading: true,
       // 导出遮罩层

+ 3 - 0
src/views/his/article/index.vue

@@ -184,6 +184,7 @@
                   v-model="form.imageUrl"
                   class="avatar-uploader"
                   :action="uploadUrl"
+                  :headers="uploadHeaders"
                   :show-file-list="false"
                   :on-success="handleAvatarSuccess"
                   :before-upload="beforeAvatarUpload">
@@ -253,6 +254,7 @@ import { listArticle, getArticle, delArticle, addArticle, updateArticle, exportA
 import { getAllArticleCateList} from "@/api/his/articleCate";
 import Editor from '@/components/Editor/wang';
 import ArticleDetails from '../../components/his/articleDetails.vue';
+import { getToken } from "@/utils/auth";
 export default {
   name: "article",
   components: { Editor ,ArticleDetails},
@@ -263,6 +265,7 @@ export default {
               open:false,
             },
       uploadUrl:process.env.VUE_APP_BASE_API+"/common/uploadOSS",
+      uploadHeaders: { Authorization: "Bearer " + getToken() },
       baseUrl: process.env.VUE_APP_BASE_API,
       cates:[],
       // 遮罩层

+ 3 - 0
src/views/his/articleCate/index.vue

@@ -133,6 +133,7 @@
             v-model="form.imgUrl"
             class="avatar-uploader"
             :action="uploadUrl"
+            :headers="uploadHeaders"
             :show-file-list="false"
             :on-success="handleAvatarSuccess"
             :before-upload="beforeAvatarUpload">
@@ -164,6 +165,7 @@
 
 <script>
 import { listArticleCate, getArticleCate, delArticleCate, addArticleCate, updateArticleCate, exportArticleCate } from "@/api/his/articleCate";
+import { getToken } from "@/utils/auth";
 
 export default {
   name: "articleCate",
@@ -172,6 +174,7 @@ export default {
       // 遮罩层
       loading: true,
       uploadUrl:process.env.VUE_APP_BASE_API+"/common/uploadOSS",
+      uploadHeaders: { Authorization: "Bearer " + getToken() },
       baseUrl: process.env.VUE_APP_BASE_API,
       // 导出遮罩层
       exportLoading: false,

+ 3 - 0
src/views/his/department/index.vue

@@ -157,6 +157,7 @@
             v-model="form.iconUrl"
             class="avatar-uploader"
             :action="uploadUrl"
+            :headers="uploadHeaders"
             :show-file-list="false"
             :on-success="handleAvatarSuccess"
             :before-upload="beforeAvatarUpload">
@@ -199,12 +200,14 @@
 <script>
 import { listDepartment, getDepartment, delDepartment, addDepartment, updateDepartment, exportDepartment } from "@/api/his/department";
 import departmentDetails from '../../components/his/departmentDetails.vue';
+import { getToken } from "@/utils/auth";
 export default {
   name: "Department",
    components: { departmentDetails },
   data() {
     return {
       uploadUrl:process.env.VUE_APP_BASE_API+"/common/uploadOSS",
+      uploadHeaders: { Authorization: "Bearer " + getToken() },
       baseUrl: process.env.VUE_APP_BASE_API,
    show:{
         title:"科室详情",

+ 6 - 0
src/views/his/doctor/type1.vue

@@ -461,6 +461,7 @@
                             v-model="form.idCardFrontUrl"
                             class="avatar-uploader"
                             :action="fruploadUrl"
+                            :headers="uploadHeaders"
                             :show-file-list="false"
                             :on-success="frhandleAvatarSuccess"
                             :before-upload="beforeAvatarUpload">
@@ -475,6 +476,7 @@
                               v-model="form.avatar"
                               class="avatar-uploader"
                               :action="avataruploadUrl"
+                              :headers="uploadHeaders"
                               :show-file-list="false"
                               :on-success="avatarhandleAvatarSuccess"
                               :before-upload="beforeAvatarUpload">
@@ -491,6 +493,7 @@
                          v-model="form.idCardBackUrl"
                          class="avatar-uploader"
                          :action="bauploadUrl"
+                         :headers="uploadHeaders"
                          :show-file-list="false"
                          :on-success="bahandleAvatarSuccess"
                          :before-upload="beforeAvatarUpload">
@@ -505,6 +508,7 @@
                          v-model="form.signUrl"
                          class="avatar-uploader"
                          :action="bauploadUrl"
+                         :headers="uploadHeaders"
                          :show-file-list="false"
                          :on-success="signhandleAvatarSuccess"
                          :before-upload="beforeAvatarUpload">
@@ -750,6 +754,7 @@ import{listAllHospital} from "@/api/his/hospital";
 import {getCitys} from "@/api/store/city";
 import {getAllAiRoleList} from "@/api/chat/chatRole"
 import { allPackage, } from "@/api/his/package";
+import { getToken } from "@/utils/auth";
 import doctorinquiryDetails from '../../components/his/doctorinquiryDetails.vue';
 import doctorDetails from '../../components/his/doctorDetails.vue';
 import { Form } from "element-ui";
@@ -777,6 +782,7 @@ export default {
       certificateBack:process.env.VUE_APP_BASE_API+"/common/uploadOSS",
       practise:process.env.VUE_APP_BASE_API+"/common/uploadOSS",
       practiseBack:process.env.VUE_APP_BASE_API+"/common/uploadOSS",
+      uploadHeaders: { Authorization: "Bearer " + getToken() },
       baseUrl: process.env.VUE_APP_BASE_API,
       orOptions: [],
 	  storeOPtions: [],

+ 6 - 0
src/views/his/doctor/type2.vue

@@ -372,6 +372,7 @@
                                   v-model="form.idCardFrontUrl"
                                   class="avatar-uploader"
                                   :action="FruploadUrl"
+                                  :headers="uploadHeaders"
                                   :show-file-list="false"
                                   :on-success="FrhandleAvatarSuccess"
                                   :before-upload="beforeAvatarUpload">
@@ -386,6 +387,7 @@
                                     v-model="form.avatar"
                                     class="avatar-uploader"
                                     :action="avataruploadUrl"
+                                    :headers="uploadHeaders"
                                     :show-file-list="false"
                                     :on-success="avatarhandleAvatarSuccess"
                                     :before-upload="beforeAvatarUpload">
@@ -402,6 +404,7 @@
                                   v-model="form.idCardBackUrl"
                                   class="avatar-uploader"
                                   :action="BauploadUrl"
+                                  :headers="uploadHeaders"
                                   :show-file-list="false"
                                   :on-success="BahandleAvatarSuccess"
                                   :before-upload="beforeAvatarUpload">
@@ -416,6 +419,7 @@
                                v-model="form.signUrl"
                                class="avatar-uploader"
                                :action="bauploadUrl"
+                               :headers="uploadHeaders"
                                :show-file-list="false"
                                :on-success="signhandleAvatarSuccess"
                                :before-upload="beforeAvatarUpload">
@@ -537,6 +541,7 @@ import{listDepartment} from "@/api/his/disease";
 import{listAllHospital} from "@/api/his/hospital";
 import {getCitys} from "@/api/store/city";
 import pharmacistDetails from '../../components/his/pharmacistDetails.vue';
+import { getToken } from "@/utils/auth";
 export default {
   name: "pharmacist",
   components: { pharmacistDetails },
@@ -551,6 +556,7 @@ export default {
       practise:process.env.VUE_APP_BASE_API+"/common/uploadOSS",
       practiseBack:process.env.VUE_APP_BASE_API+"/common/uploadOSS",
       bauploadUrl:process.env.VUE_APP_BASE_API+"/common/uploadOSS",
+      uploadHeaders: { Authorization: "Bearer " + getToken() },
       orOptions: [],
       isauditOptions: [],
       positionOptions: [],

+ 4 - 0
src/views/his/doctorArticle/index.vue

@@ -189,6 +189,7 @@
                       v-model="form.imageUrl"
                       class="avatar-uploader"
                       :action="uploadUrl"
+                      :headers="uploadHeaders"
                       :show-file-list="false"
                       :on-success="handleAvatarSuccess"
                       :before-upload="beforeAvatarUpload">
@@ -206,6 +207,7 @@
                ref="upload"
                class="upload-demo"
                :action="uploadUrl"
+               :headers="uploadHeaders"
                :on-success="handleSuccess"
                :before-upload="beforeUpload"
                :limit="1"
@@ -256,6 +258,7 @@ import {listdocuser, listArticle, getArticle, delArticle, addArticle, updateArti
 import articleDetails from '../../components/his/doctorArticleDetails.vue';
 import { getAllArticleCateList} from "@/api/his/doctorArticleCate";
 import Editor from '@/components/Editor/wang';
+import { getToken } from "@/utils/auth";
 export default {
   name: "Article",
   components: { articleDetails,Editor },
@@ -264,6 +267,7 @@ export default {
       videoUrl: "",
       videoAccept:"video/*",
       uploadUrl:process.env.VUE_APP_BASE_API+"/common/uploadOSS",
+      uploadHeaders: { Authorization: "Bearer " + getToken() },
       baseUrl: process.env.VUE_APP_BASE_API,
       show:{
               title:"医生文章详情",

+ 3 - 0
src/views/his/doctorArticleCate/index.vue

@@ -133,6 +133,7 @@
             v-model="form.imgUrl"
             class="avatar-uploader"
             :action="uploadUrl"
+            :headers="uploadHeaders"
             :show-file-list="false"
             :on-success="handleAvatarSuccess"
             :before-upload="beforeAvatarUpload">
@@ -164,6 +165,7 @@
 
 <script>
 import { listDoctorArticleCate, getDoctorArticleCate, delDoctorArticleCate, addDoctorArticleCate, updateDoctorArticleCate, exportDoctorArticleCate } from "@/api/his/doctorArticleCate";
+import { getToken } from "@/utils/auth";
 
 export default {
   name: "DoctorArticleCate",
@@ -172,6 +174,7 @@ export default {
       // 遮罩层
       loading: true,
       uploadUrl:process.env.VUE_APP_BASE_API+"/common/uploadOSS",
+      uploadHeaders: { Authorization: "Bearer " + getToken() },
       baseUrl: process.env.VUE_APP_BASE_API,
       // 导出遮罩层
       exportLoading: false,

+ 4 - 0
src/views/his/homeArticle/index.vue

@@ -152,6 +152,7 @@
           <el-upload
             class="avatar-uploader"
             :action="uploadUrl"
+            :headers="uploadHeaders"
             :show-file-list="false"
             :on-success="handleImageUrlSuccess"
             :before-upload="beforeImageUrlUpload">
@@ -171,6 +172,7 @@
               ref="upload"
               class="upload-demo"
               :action="uploadUrl"
+              :headers="uploadHeaders"
               :on-success="handleVideoSuccess"
               :before-upload="beforeVideoUpload"
               :limit="1"
@@ -215,6 +217,7 @@
 import { listHomeArticle, getHomeArticle, delHomeArticle, addHomeArticle, updateHomeArticle, exportHomeArticle } from "@/api/his/homeArticle";
 import { listHomeCategory, allListHomeCategory } from "@/api/his/homeCategory";
 import Editor from '@/components/Editor/wang';
+import { getToken } from "@/utils/auth";
 
 export default {
   name: "HomeArticle",
@@ -239,6 +242,7 @@ export default {
       categoryOptions: [],
       // 上传URL
       uploadUrl: process.env.VUE_APP_BASE_API + "/common/uploadOSS",
+      uploadHeaders: { Authorization: "Bearer " + getToken() },
       // 视频接受类型
       videoAccept: "video/*",
       // 弹出层标题

+ 3 - 0
src/views/his/homeCategory/index.vue

@@ -122,6 +122,7 @@
           <el-upload
             class="avatar-uploader"
             :action="uploadUrl"
+            :headers="uploadHeaders"
             :show-file-list="false"
             :on-success="handleImageUrlSuccess"
             :before-upload="beforeImageUrlUpload">
@@ -149,6 +150,7 @@
 
 <script>
 import { listHomeCategory, getHomeCategory, delHomeCategory, addHomeCategory, updateHomeCategory, exportHomeCategory } from "@/api/his/homeCategory";
+import { getToken } from "@/utils/auth";
 
 export default {
   name: "HomeCategory",
@@ -170,6 +172,7 @@ export default {
       homeCategoryList: [],
       // 上传URL
       uploadUrl: process.env.VUE_APP_BASE_API + "/common/uploadOSS",
+      uploadHeaders: { Authorization: "Bearer " + getToken() },
       // 弹出层标题
       title: "",
       // 是否显示弹出层

+ 3 - 0
src/views/his/packageCate/index.vue

@@ -136,6 +136,7 @@
             v-model="form.imgUrl"
             class="avatar-uploader"
             :action="uploadUrl"
+            :headers="uploadHeaders"
             :show-file-list="false"
             :on-success="handleAvatarSuccess"
             :before-upload="beforeAvatarUpload">
@@ -182,6 +183,7 @@
 
 <script>
 import { listPackageCate, getPackageCate, delPackageCate, addPackageCate, updatePackageCate, exportPackageCate } from "@/api/his/packageCate";
+import { getToken } from "@/utils/auth";
 
 export default {
   name: "PackageCate",
@@ -192,6 +194,7 @@ export default {
       // 导出遮罩层
       exportLoading: false,
       uploadUrl:process.env.VUE_APP_BASE_API+"/common/uploadOSS",
+      uploadHeaders: { Authorization: "Bearer " + getToken() },
       baseUrl: process.env.VUE_APP_BASE_API,
       // 选中数组
       ids: [],

+ 2 - 0
src/views/his/store/audit.vue

@@ -159,6 +159,7 @@
 import { audit,listStore, getStore, delStore, addStore, updateStore, exportStore } from "@/api/his/store";
 import storeDetails from '../../components/his/storeDetails.vue';
 import {getCitys} from "@/api/store/city";
+import { getToken } from "@/utils/auth";
 export default {
   name: "adutstore",
   components: { storeDetails },
@@ -172,6 +173,7 @@ export default {
       citys:[],
       licenseuploadUrl:process.env.VUE_APP_BASE_API+"/common/uploadOSS",
             uploadUrl:process.env.VUE_APP_BASE_API+"/common/uploadOSS",
+            uploadHeaders: { Authorization: "Bearer " + getToken() },
             baseUrl: process.env.VUE_APP_BASE_API,
       shippingTypeOptions: [{
         "label": "配送",

+ 4 - 0
src/views/his/store/index.vue

@@ -212,6 +212,7 @@
                  v-model="form.logoUrl"
                  class="avatar-uploader"
                  :action="uploadUrl"
+                 :headers="uploadHeaders"
                  :show-file-list="false"
                  :on-success="handleAvatarSuccess"
                  :before-upload="beforeAvatarUpload">
@@ -228,6 +229,7 @@
             v-model="form.licenseImages"
             class="avatar-uploader"
             :action="licenseuploadUrl"
+            :headers="uploadHeaders"
             :show-file-list="false"
             :on-success="licensehandleAvatarSuccess"
             :before-upload="beforeAvatarUpload">
@@ -353,6 +355,7 @@
 import { listStore, getStore, delStore, addStore, updateStore, exportStore } from "@/api/his/store";
 import storeDetails from '../../components/his/storeDetails.vue';
 import {getCitys} from "@/api/store/city";
+import { getToken } from "@/utils/auth";
 export default {
   name: "Store",
   components: { storeDetails },
@@ -366,6 +369,7 @@ shippingType:[],
       citys:[],
       licenseuploadUrl:process.env.VUE_APP_BASE_API+"/common/uploadOSS",
             uploadUrl:process.env.VUE_APP_BASE_API+"/common/uploadOSS",
+            uploadHeaders: { Authorization: "Bearer " + getToken() },
             baseUrl: process.env.VUE_APP_BASE_API,
       shippingTypeOptions: [{
         "label": "配送",

+ 2 - 0
src/views/his/storeProduct/index.vue

@@ -350,6 +350,7 @@
               ref="uploadVideo"
               class="upload-demo"
               :action="uploadUrl"
+              :headers="uploadHeaders"
               :on-success="handleSuccess"
               :before-upload="beforeUpload"
               :limit="1"
@@ -723,6 +724,7 @@ export default {
         attrsVal: ''
       },
       uploadUrl:process.env.VUE_APP_BASE_API+"/common/uploadOSS",
+      uploadHeaders: { Authorization: "Bearer " + getToken() },
       baseUrl: process.env.VUE_APP_BASE_API,
       storeOPtions:[],
       categoryOptions:[],

+ 3 - 0
src/views/his/storeProductCategory/index.vue

@@ -138,6 +138,7 @@
                       v-model="form.pic"
                       class="avatar-uploader"
                       :action="uploadUrl"
+                      :headers="uploadHeaders"
                       :show-file-list="false"
                       :on-success="handleAvatarSuccess"
                       :before-upload="beforeAvatarUpload">
@@ -163,6 +164,7 @@
 import { getPidList,getAllStoreProductCategory,pidlist, listCategory, getCategory, delCategory, addCategory, updateCategory, exportCategory } from "@/api/his/storeProductCategory";
 import Treeselect from "@riophae/vue-treeselect";
 import "@riophae/vue-treeselect/dist/vue-treeselect.css";
+import { getToken } from "@/utils/auth";
 export default {
   name: "Category",
   components: {Treeselect},
@@ -170,6 +172,7 @@ export default {
     return {
       categoryOptions:[],
       uploadUrl:process.env.VUE_APP_BASE_API+"/common/uploadOSS",
+      uploadHeaders: { Authorization: "Bearer " + getToken() },
       baseUrl: process.env.VUE_APP_BASE_API,
       orOptions: [],
       pidList: [],

+ 3 - 0
src/views/his/testTemp/index.vue

@@ -163,6 +163,7 @@
                               v-model="form.img"
                               class="avatar-uploader"
                               :action="uploadUrl"
+                              :headers="uploadHeaders"
                               :show-file-list="false"
                               :on-success="handleAvatarSuccess"
                               :before-upload="beforeAvatarUpload">
@@ -297,6 +298,7 @@ import { listTestTemp, getTestTemp, delTestTemp, addTestTemp, updateTestTemp, ex
 import testTempDetails from '../../components/his/testTempDetails.vue';
 import testTempItem from '../testTempItem/index.vue';
 import Editor from '@/components/Editor/wang';
+import { getToken } from "@/utils/auth";
 export default {
   name: "TestTemp",
   components: { testTempDetails ,testTempItem,Editor},
@@ -309,6 +311,7 @@ export default {
             },
 
       uploadUrl:process.env.VUE_APP_BASE_API+"/common/uploadOSS",
+      uploadHeaders: { Authorization: "Bearer " + getToken() },
       baseUrl: process.env.VUE_APP_BASE_API,
       itemTypeJson: [
         { itemType: "类别1", item: [{ name: "名称",value:"内容"}]},

+ 4 - 0
src/views/hisStore/adv/index.vue

@@ -141,6 +141,7 @@
               v-model="form.icon"
               class="avatar-uploader"
               :action="uploadUrl"
+              :headers="uploadHeaders"
               :show-file-list="false"
               :on-success="handleAvatarSuccess"
               :before-upload="beforeAvatarUpload">
@@ -154,6 +155,7 @@
               ref="upload"
               class="upload-demo"
               :action="uploadUrl"
+              :headers="uploadHeaders"
               :on-success="handleSuccess"
               :before-upload="beforeUpload"
               :limit="1"
@@ -204,6 +206,7 @@
 <script>
 import { listAdv, getAdv, delAdv, addAdv, updateAdv, exportAdv } from "@/api/hisStore/adv";
 import Editor from '@/components/Editor/wang';
+import { getToken } from "@/utils/auth";
 export default {
   name: "Adv",
   components: {
@@ -212,6 +215,7 @@ export default {
   data() {
     return {
       uploadUrl:process.env.VUE_APP_BASE_API+"/common/uploadOSS",
+      uploadHeaders: { Authorization: "Bearer " + getToken() },
       baseUrl: process.env.VUE_APP_BASE_API,
       videoAccept:"video/*",
       statusOptions:[],

+ 23 - 0
src/views/hisStore/store/index.vue

@@ -234,6 +234,7 @@
                 v-model="form.logoUrl"
                 class="avatar-uploader"
                 :action="uploadUrl"
+                :headers="uploadHeaders"
                 :show-file-list="false"
                 :on-success="handleAvatarSuccess"
                 :before-upload="beforeAvatarUpload">
@@ -293,6 +294,7 @@
               <el-upload
                 class="avatar-uploader"
                 :action="uploadUrl"
+                :headers="uploadHeaders"
                 :show-file-list="false"
                 :on-success="(response, file) => handleFileSuccess(response, file, 'businessLicense')"
                 :before-upload="beforeAvatarUpload">
@@ -321,6 +323,7 @@
                 <el-upload
                   class="avatar-uploader"
                   :action="uploadUrl"
+                  :headers="uploadHeaders"
                   :show-file-list="false"
                   :on-success="(response, file) => handleFileSuccess(response, file, 'drugLicense')"
                   :before-upload="beforeAvatarUpload">
@@ -348,6 +351,7 @@
                 <el-upload
                   class="avatar-uploader"
                   :action="uploadUrl"
+                  :headers="uploadHeaders"
                   :show-file-list="false"
                   :on-success="(response, file) => handleFileSuccess(response, file, 'medicalDevice1')"
                   :before-upload="beforeAvatarUpload">
@@ -375,6 +379,7 @@
                 <el-upload
                   class="avatar-uploader"
                   :action="uploadUrl"
+                  :headers="uploadHeaders"
                   :show-file-list="false"
                   :on-success="(response, file) => handleFileSuccess(response, file, 'medicalDevice2')"
                   :before-upload="beforeAvatarUpload">
@@ -402,6 +407,7 @@
                 <el-upload
                   class="avatar-uploader"
                   :action="uploadUrl"
+                  :headers="uploadHeaders"
                   :show-file-list="false"
                   :on-success="(response, file) => handleFileSuccess(response, file, 'medicalDevice3')"
                   :before-upload="beforeAvatarUpload">
@@ -429,6 +435,7 @@
                 <el-upload
                   class="avatar-uploader"
                   :action="uploadUrl"
+                  :headers="uploadHeaders"
                   :show-file-list="false"
                   :on-success="(response, file) => handleFileSuccess(response, file, 'foodLicense')"
                   :before-upload="beforeAvatarUpload">
@@ -456,6 +463,7 @@
                 <el-upload
                   class="avatar-uploader"
                   :action="uploadUrl"
+                  :headers="uploadHeaders"
                   :show-file-list="false"
                   :on-success="(response, file) => handleFileSuccess(response, file, 'medicalLicense')"
                   :before-upload="beforeAvatarUpload">
@@ -575,6 +583,7 @@
 import { listStore, getStore, delStore, addStore, updateStore, exportStore, refreshPasWod } from '@/api/hisStore/store'
 import storeDetails from '../components/storeDetails.vue';
 import {getCitys} from "@/api/store/city";
+import { getToken, getTenantCode } from '@/utils/auth'
 export default {
   name: "Store",
   components: { storeDetails },
@@ -588,6 +597,7 @@ export default {
       citys: [],
       licenseuploadUrl: process.env.VUE_APP_BASE_API + "/common/uploadOSS",
       uploadUrl: process.env.VUE_APP_BASE_API + "/common/uploadOSS",
+      uploadHeaders: { Authorization: "Bearer " + getToken() },
       baseUrl: process.env.VUE_APP_BASE_API,
       shippingTypeOptions: [{
         "label": "配送",
@@ -721,6 +731,19 @@ export default {
       }
     };
   },
+  computed: {
+    uploadHeaders() {
+      const token = getToken()
+      const headers = {
+        'X-Frontend-Type': 'admin',
+        'tenant-code': getTenantCode()
+      }
+      if (token) {
+        headers.Authorization = 'Bearer ' + token
+      }
+      return headers
+    }
+  },
   created() {
     this.getCitys();
     this.getList();

+ 2 - 0
src/views/live/live/index.vue

@@ -690,6 +690,7 @@ import {
 import Editor from "@/components/Editor/wang";
 import user from "@/store/modules/user";
 import VideoUpload from "@/components/LiveVideoUpload/single.vue";
+import { getToken } from "@/utils/auth";
 
 export default {
   name: "Live",
@@ -714,6 +715,7 @@ export default {
       tagOpen:false,
       baseUrl: process.env.VUE_APP_BASE_API,
       uploadUrl: process.env.VUE_APP_BASE_API + "/common/uploadOSS",
+      uploadHeaders: { Authorization: "Bearer " + getToken() },
       isPrivate: null,
       // 遮罩层
       loading: true,

+ 3 - 0
src/views/qw/friendMaterial/index.vue

@@ -70,6 +70,7 @@
                 <el-col :span="12" style="text-align: right;">
                   <el-upload
                     :action="uploadUrl"
+                    :headers="uploadHeaders"
                     :file-list="[]"
                     :on-progress="handleProgress"
                     :before-upload="beforeUpload"
@@ -140,6 +141,7 @@
 <script>
 import {addMaterial, delMaterial, listMaterial,} from "@/api/qw/material";
 import {addMaterialGroup, delMaterialGroup, listMaterialGroup, updateMaterialGroup} from "@/api/qw/materialGroup";
+import { getToken } from "@/utils/auth";
 
 export default {
   name: 'ImageSelect',
@@ -180,6 +182,7 @@ export default {
   data() {
     return {
       uploadUrl:process.env.VUE_APP_BASE_API+"/common/uploadOSS",
+      uploadHeaders: { Authorization: "Bearer " + getToken() },
       dialogVisible: false,
       materialUrl: '',
       listDialogVisible: false,

+ 4 - 0
src/views/qw/sopTemp/addSopTemp.vue

@@ -202,6 +202,7 @@
                                                 v-model="setList.fileUrl"
                                                 class="avatar-uploader"
                                                 :action="uploadUrl"
+                                                :headers="uploadHeaders"
                                                 :show-file-list="false"
                                                 :on-success="(res, file) => handleAvatarSuccessFile(res, file, setList)"
                                                 :before-upload="beforeAvatarUploadFile">
@@ -220,6 +221,7 @@
                                                 v-model="setList.videoUrl"
                                                 class="avatar-uploader"
                                                 :action="uploadUrl"
+                                                :headers="uploadHeaders"
                                                 :show-file-list="false"
                                                 :on-success="(res, file) => handleAvatarSuccessVideo(res, file, setList)"
                                                 :before-upload="beforeAvatarUploadVideo">
@@ -355,6 +357,7 @@ import {courseList, videoList} from "@/api/qw/sop";
 import ImageUpload from "@/views/qw/sop/ImageUpload";
 import FriendMaterial from "@/views/qw/friendMaterial/index.vue";
 import userVideo from "@/views/qw/userVideo/userVideo.vue";
+import { getToken } from "@/utils/auth";
 
 export default {
   name: "addSopTemp",
@@ -367,6 +370,7 @@ export default {
       dialogImageUrl:null,
 
       uploadUrl:process.env.VUE_APP_BASE_API+"/common/uploadOSS2",
+      uploadHeaders: { Authorization: "Bearer " + getToken() },
       uploadUrlByVoice:process.env.VUE_APP_BASE_API+"/common/uploadOSSByHOOKVoice",
       //上传语音的遮罩层
       voiceLoading :false,

+ 5 - 0
src/views/qw/sopTemp/addSopTempOld.vue

@@ -167,6 +167,7 @@
                                         v-model="content.fileUrl"
                                         class="avatar-uploader"
                                         :action="uploadUrl"
+                                        :headers="uploadHeaders"
                                         :show-file-list="false"
                                         :on-success="(res, file) => handleAvatarSuccessFile(res, file, content)"
                                         :before-upload="beforeAvatarUploadFile">
@@ -185,6 +186,7 @@
                                         v-model="content.videoUrl"
                                         class="avatar-uploader"
                                         :action="uploadUrl"
+                                        :headers="uploadHeaders"
                                         :show-file-list="false"
                                         :on-success="(res, file) => handleAvatarSuccessVideo(res, file, content)"
                                         :before-upload="beforeAvatarUploadVideo">
@@ -202,6 +204,7 @@
                                           v-model="content.voiceUrl"
                                           class="avatar-uploader"
                                           :action="uploadUrl"
+                                          :headers="uploadHeaders"
                                           :show-file-list="false"
                                           :on-success="(res, file) => handleAvatarSuccessVoice(res, file, content)"
                                           :before-upload="beforeAvatarUploadVoice">
@@ -281,12 +284,14 @@ import { listSopTemp, getSopTemp, delSopTemp, addSopTemp, updateSopTemp, exportS
 import { courseList,videoList } from "@/api/qw/sop";
 import ImageUpload from "@/views/qw/sop/ImageUpload";
 import FriendMaterial from "@/views/qw/friendMaterial/index.vue";
+import { getToken } from "@/utils/auth";
 export default {
   name: "SopTemp",
       components: { ImageUpload,FriendMaterial},
   data() {
     return {
       uploadUrl:process.env.VUE_APP_BASE_API+"/common/uploadOSS",
+      uploadHeaders: { Authorization: "Bearer " + getToken() },
       // 遮罩层
       loading: true,
       // 导出遮罩层

+ 2 - 0
src/views/qw/sopTemp/addTemp.vue

@@ -39,6 +39,7 @@ import {addTemp} from "@/api/qw/sopTemp";
 import ImageUpload from "@/views/qw/sop/ImageUpload";
 import FriendMaterial from "@/views/qw/friendMaterial/index.vue";
 import userVideo from "@/views/qw/userVideo/userVideo.vue";
+import { getToken } from "@/utils/auth";
 
 export default {
   name: "addSopTemp",
@@ -51,6 +52,7 @@ export default {
       dialogImageUrl:null,
 
       uploadUrl:process.env.VUE_APP_BASE_API+"/common/uploadOSS2",
+      uploadHeaders: { Authorization: "Bearer " + getToken() },
       uploadUrlByVoice:process.env.VUE_APP_BASE_API+"/common/uploadOSSByHOOKVoice",
       //上传语音的遮罩层
       voiceLoading :false,

+ 4 - 0
src/views/qw/sopTemp/updateSopTemp.vue

@@ -386,6 +386,7 @@
                                                 v-model="setList.fileUrl"
                                                 class="avatar-uploader"
                                                 :action="uploadUrl"
+                                                :headers="uploadHeaders"
                                                 :show-file-list="false"
                                                 :on-success="(res, file) => handleAvatarSuccessFile(res, file, setList)"
                                                 :before-upload="beforeAvatarUploadFile">
@@ -406,6 +407,7 @@
                                                 v-model="setList.videoUrl"
                                                 class="avatar-uploader"
                                                 :action="uploadUrl"
+                                                :headers="uploadHeaders"
                                                 :show-file-list="false"
                                                 :on-success="(res, file) => handleAvatarSuccessVideo(res, file, setList)"
                                                 :before-upload="beforeAvatarUploadVideo">
@@ -698,6 +700,7 @@ import {
 import {courseList, videoList} from "@/api/qw/sop";
 import ImageUpload from "@/views/qw/sop/ImageUpload";
 import userVideo from "@/views/qw/userVideo/userVideo.vue";
+import { getToken } from "@/utils/auth";
 
 export default {
   name: "updateSopTemp",
@@ -713,6 +716,7 @@ export default {
         delTagValue: ''
       }],
       uploadUrl: process.env.VUE_APP_BASE_API + "/common/uploadOSS",
+      uploadHeaders: { Authorization: "Bearer " + getToken() },
       uploadUrlByVoice: process.env.VUE_APP_BASE_API + "/common/uploadOSSByHOOKVoice",
       //上传语音的遮罩层
       voiceLoading: false,

+ 4 - 0
src/views/qw/sopTemp/updateSopTemp2.vue

@@ -169,6 +169,7 @@
                                                 v-model="setList.fileUrl"
                                                 class="avatar-uploader"
                                                 :action="uploadUrl"
+                                                :headers="uploadHeaders"
                                                 :show-file-list="false"
                                                 :on-success="(res, file) => handleAvatarSuccessFile(res, file, setList)"
                                                 :before-upload="beforeAvatarUploadFile">
@@ -187,6 +188,7 @@
                                                 v-model="setList.videoUrl"
                                                 class="avatar-uploader"
                                                 :action="uploadUrl"
+                                                :headers="uploadHeaders"
                                                 :show-file-list="false"
                                                 :on-success="(res, file) => handleAvatarSuccessVideo(res, file, setList)"
                                                 :before-upload="beforeAvatarUploadVideo">
@@ -316,12 +318,14 @@ import { listSopTemp, getSopTemp, delSopTemp, addSopTemp, updateSopTemp, exportS
 import { courseList,videoList } from "@/api/qw/sop";
 import ImageUpload from "@/views/qw/sop/ImageUpload";
 import userVideo from "@/views/qw/userVideo/userVideo.vue";
+import { getToken } from "@/utils/auth";
 export default {
   name: "updateSopTemp",
   components: { ImageUpload,userVideo},
   data() {
     return {
       uploadUrl:process.env.VUE_APP_BASE_API+"/common/uploadOSS2",
+      uploadHeaders: { Authorization: "Bearer " + getToken() },
       uploadUrlByVoice:process.env.VUE_APP_BASE_API+"/common/uploadOSSByHOOKVoice",
       //上传语音的遮罩层
       voiceLoading :false,

+ 5 - 0
src/views/qw/sopTemp/updateSopTempOld.vue

@@ -159,6 +159,7 @@
                                         v-model="content.fileUrl"
                                         class="avatar-uploader"
                                         :action="uploadUrl"
+                                        :headers="uploadHeaders"
                                         :show-file-list="false"
                                         :on-success="(res, file) => handleAvatarSuccessFile(res, file, content)"
                                         :before-upload="beforeAvatarUploadFile">
@@ -177,6 +178,7 @@
                                         v-model="content.videoUrl"
                                         class="avatar-uploader"
                                         :action="uploadUrl"
+                                        :headers="uploadHeaders"
                                         :show-file-list="false"
                                         :on-success="(res, file) => handleAvatarSuccessVideo(res, file, content)"
                                         :before-upload="beforeAvatarUploadVideo">
@@ -194,6 +196,7 @@
                                         v-model="content.voiceUrl"
                                         class="avatar-uploader"
                                         :action="uploadUrl"
+                                        :headers="uploadHeaders"
                                         :show-file-list="false"
                                         :on-success="(res, file) => handleAvatarSuccessVoice(res, file, content)"
                                         :before-upload="beforeAvatarUploadVoice">
@@ -270,12 +273,14 @@
 import { listSopTemp, getSopTemp, delSopTemp, addSopTemp, updateSopTemp, exportSopTemp } from "@/api/qw/sopTemp";
 import { courseList,videoList } from "@/api/qw/sop";
 import ImageUpload from "@/views/qw/sop/ImageUpload";
+import { getToken } from "@/utils/auth";
 export default {
   name: "SopTemp",
   components: { ImageUpload},
   data() {
     return {
       uploadUrl:process.env.VUE_APP_BASE_API+"/common/uploadOSS",
+      uploadHeaders: { Authorization: "Bearer " + getToken() },
       // 遮罩层
       loading: true,
       // 导出遮罩层

+ 2 - 0
src/views/qw/sopTemp/updateTemp.vue

@@ -40,11 +40,13 @@
 
 <script>
 import { listSopTemp, getSopTemp, delSopTemp, updateTemp, exportSopTemp } from "@/api/qw/sopTemp";
+import { getToken } from "@/utils/auth";
 export default {
   name: "updateSopTemp",
   data() {
     return {
       uploadUrl:process.env.VUE_APP_BASE_API+"/common/uploadOSS2",
+      uploadHeaders: { Authorization: "Bearer " + getToken() },
       uploadUrlByVoice:process.env.VUE_APP_BASE_API+"/common/uploadOSSByHOOKVoice",
       //上传语音的遮罩层
       voiceLoading :false,

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

@@ -1978,6 +1978,7 @@
                 ref="upload"
                 class="upload-demo"
                 :action="uploadUrl"
+                :headers="uploadHeaders"
                 :on-success="handleSuccess"
                 :before-upload="beforeUpload"
                 :limit="1"
@@ -2061,6 +2062,7 @@
                   ref="upload"
                   class="upload-demo"
                   :action="uploadUrl"
+                  :headers="uploadHeaders"
                   :on-success="appHandleSuccess"
                   :before-upload="beforeUpload"
                   :limit="1"
@@ -2675,6 +2677,48 @@
         </div>
       </el-tab-pane>
 
+      <el-tab-pane label="TC在线文档配置" name="tencent.sheetOnlineConfig">
+        <el-form ref="form37" :model="form37" :rules="rules37" label-width="100px">
+          <el-form-item label="client_id">
+            <el-input style="width: 200px" v-model="form37.clientId" placeholder="请输入client_id"></el-input>
+          </el-form-item>
+          <el-form-item label="access_token">
+            <el-input style="width: 200px" v-model="form37.accessToken" placeholder="请输入access_token"></el-input>
+          </el-form-item>
+          <el-form-item label="open_id">
+            <el-input style="width: 200px" v-model="form37.openId" placeholder="请输入open_id"></el-input>
+          </el-form-item>
+          
+          <div style="width: 900px;padding-left: 100px;margin-top: 16px;">
+            <el-table :data="tencentWordList" border stripe highlight-current-row>
+              <el-table-column prop="title" label="标题" min-width="140px"></el-table-column>
+              <el-table-column prop="fileId" label="文件ID" min-width="200px"></el-table-column>
+              <el-table-column prop="type" label="类型" width="80px">
+                <template slot-scope="scope">
+                  <el-tag type="success">{{ scope.row.type || '表格' }}</el-tag>
+                </template>
+              </el-table-column>
+              <el-table-column prop="url" label="URL" min-width="260px" show-overflow-tooltip></el-table-column>
+              <el-table-column label="操作" width="100px">
+                <template slot-scope="scope">
+                  <el-button type="warning" size="small" @click="handleSync(scope.row)">同步</el-button>
+                </template>
+              </el-table-column>
+              
+            </el-table>
+          
+          </div>
+          <div class="footer">
+            <el-button type="primary" @click="handleShowGuide">操作指南</el-button>
+            <el-button type="primary" @click="submitForm37">提  交</el-button>
+            <el-button type="success" @click="createWordDialog.open = true">创建表格</el-button>
+          </div>
+          
+          
+          
+        </el-form>
+      </el-tab-pane>
+
     </el-tabs>
 
 
@@ -2686,11 +2730,25 @@
     >
       <productDeliveryGiftValueSelect ref="DeliveryGiftDetails" @selectDeliveryGift="selectDeliveryGift"/>
     </el-dialog>
+    <el-dialog title="创建腾讯文档表格" :visible.sync="createWordDialog.open" width="450px" append-to-body>
+      <el-form :model="createWordDialog" label-width="80px">
+        <el-form-item label="标题">
+          <el-input v-model="createWordDialog.title" placeholder="请输入表格标题"></el-input>
+        </el-form-item>
+      </el-form>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="createWordDialog.open = false">取 消</el-button>
+        <el-button type="primary" @click="handleCreateFile">确 定</el-button>
+      </span>
+    </el-dialog>
+    <el-dialog title="操作指南" :visible.sync="guideDialogVisible" width="1860px" append-to-body>
+      <img :src="guideImage" style="width: 100%">
+    </el-dialog>
   </div>
 </template>
 
 <script>
-import { getConfigByKey, updateConfigByKey, clearCache, updateIsTownOn ,getGatewayList } from '@/api/system/config'
+import { getConfigByKey, updateConfigByKey, clearCache, updateIsTownOn ,getGatewayList, createTencentWordFile, getTencentWordFiles, synchronization } from '@/api/system/config'
 import { listStore } from '@/api/his/storeProduct'
 import { js } from 'js-beautify'
 import Material from '@/components/Material'
@@ -2705,6 +2763,7 @@ import { getCitys } from '@/api/store/city'
 import { listCompany } from '@/api/company/company'
 import { getStoreProductColumns } from '@/api/hisStore/storeProduct'
 import { getStoreColumns } from '@/api/hisStore/store'
+import { getToken } from "@/utils/auth";
 
 export default {
   name: 'Config',
@@ -2721,6 +2780,7 @@ export default {
       images: [],
       appImages: [],
       uploadUrl: process.env.VUE_APP_BASE_API + '/common/uploadOSS',
+      uploadHeaders: { Authorization: "Bearer " + getToken() },
       videoAccept: 'video/*',
       courseMaConfigLoading: false,
       courseMaConfigList: [],
@@ -2806,6 +2866,14 @@ export default {
       form34:{},
       form35:{},
       form36:{},
+      form37:{},
+      createWordDialog: {
+        open: false,
+        title: ''
+      },
+      tencentWordList: [],
+      guideDialogVisible: false,
+      guideImage: require('./操作指南.png'),
       
       form40: {
         enablePhoneConfig: false,
@@ -3129,7 +3197,9 @@ export default {
     },
     handleClick(tab, event) {
       this.getConfigByKey(tab.name)
-
+      if (tab.name === 'tencent.sheetOnlineConfig') {
+        this.loadTencentWordFiles()
+      }
     },
     handleAddProduct() {
       setTimeout(() => {
@@ -3367,6 +3437,9 @@ export default {
         if(key=="im.config"){
           this.form34 = this.safeParseConfig(configValue, { ...this.form34 });
         }
+        if(key=="tencent.sheetOnlineConfig"){
+          this.form37 = this.safeParseConfig(configValue, { ...this.form37 });
+        }
         if(key == 'vc.config'){
            if(!!response.data){
           this.configId = response.data.configId
@@ -3690,6 +3763,54 @@ export default {
         }
       });
     },
+    submitForm37(){
+      var param={configId:this.configId,configValue:JSON.stringify(this.form37),configKey:this.configKey,configName:"TC在线文档配置"}
+      updateConfigByKey(param).then(response => {
+        if (response.code === 200) {
+          this.msgSuccess("修改成功");
+        }
+      });
+    },
+    handleCreateFile(){
+      const title = this.createWordDialog.title;
+      if (!title || !title.trim()) {
+        this.msgError("请输入表格标题");
+        return;
+      }
+      createTencentWordFile(title).then(response => {
+        if (response.code === 200) {
+          this.msgSuccess("创建成功");
+          this.createWordDialog.open = false;
+          this.createWordDialog.title = '';
+          this.loadTencentWordFiles();
+        } else {
+          this.msgError(response.msg || "创建失败");
+        }
+      });
+    },
+    loadTencentWordFiles(){
+      getTencentWordFiles().then(response => {
+        this.tencentWordList = response.data || [];
+      });
+    },
+    handleSync(row){
+      this.$confirm('确定要同步「' + row.title + '」的工作表数据吗?', '同步', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'info'
+      }).then(() => {
+        synchronization(row.fileId).then(response => {
+          if (response.code === 200) {
+            this.msgSuccess("同步成功");
+          } else {
+            this.msgError(response.msg || "同步失败");
+          }
+        });
+      }).catch(() => {});
+    },
+    handleShowGuide(){
+      this.guideDialogVisible = true;
+    },
     submitForm35(){
       var param={configId:this.configId,configValue:JSON.stringify(this.form35)}
       updateConfigByKey(param).then(response => {

+ 3 - 0
src/views/system/config/config2.vue

@@ -1263,6 +1263,7 @@
                  ref="upload"
                  class="upload-demo"
                  :action="uploadUrl"
+                 :headers="uploadHeaders"
                  :on-success="handleSuccess"
                  :before-upload="beforeUpload"
                  :limit="1"
@@ -1303,6 +1304,7 @@ import productAttrValueSelect from "../../components/his/productGiftValueSelect.
 import productDeliveryGiftValueSelect from "../../components/his/productDeliveryGiftValueSelect.vue";
 import { Col } from "element-ui";
 import Editor from '@/components/Editor/wang';
+import { getToken } from "@/utils/auth";
 export default {
   name: "Config",
   components: {
@@ -1312,6 +1314,7 @@ export default {
     return {
       images:[],
       uploadUrl:process.env.VUE_APP_BASE_API+"/common/uploadOSS",
+      uploadHeaders: { Authorization: "Bearer " + getToken() },
       videoAccept:"video/*",
       courseMaConfigLoading:false,
       courseMaConfigList:[],

binární
src/views/system/config/操作指南.png