lex-xin 4 anos atrás
pai
commit
2fca577b7e
62 arquivos alterados com 508 adições e 84 exclusões
  1. 0 0
      dist/index.html
  2. 1 0
      dist/static/css/app.14a54fb6.css
  3. 0 0
      dist/static/css/app.61955a35.css
  4. 1 0
      dist/static/css/chunk-0236a4cb.fbda7ff3.css
  5. 0 1
      dist/static/css/chunk-0779b5c9.31e651b0.css
  6. 1 0
      dist/static/css/chunk-25fe1009.c31b56f4.css
  7. 0 0
      dist/static/css/chunk-25fe1009.d47e80d8.css
  8. 0 0
      dist/static/css/chunk-263aa15a.596a1a75.css
  9. 0 1
      dist/static/css/chunk-3272f826.377ebf23.css
  10. 0 0
      dist/static/css/chunk-48a66b2f.2f4907e0.css
  11. 1 0
      dist/static/css/chunk-566a5725.458c8713.css
  12. 0 0
      dist/static/css/chunk-5722a7ad.70c7c915.css
  13. 0 0
      dist/static/css/chunk-63d9af64.9448cddb.css
  14. 1 0
      dist/static/css/chunk-6a8de0db.28ab62ef.css
  15. 0 0
      dist/static/css/chunk-6ad43184.55421538.css
  16. 0 0
      dist/static/css/chunk-7352975b.715283e8.css
  17. 0 0
      dist/static/css/chunk-8d3f8a4c.bf529c91.css
  18. 1 0
      dist/static/css/chunk-9cf825a4.1e37fc06.css
  19. 1 0
      dist/static/css/chunk-e60d0406.0064c6fb.css
  20. 0 0
      dist/static/js/app.98d016cb.js
  21. 0 0
      dist/static/js/chunk-0236a4cb.1d9b4854.js
  22. 0 0
      dist/static/js/chunk-05215e45.70eeefea.js
  23. 0 0
      dist/static/js/chunk-05fe29e4.74606407.js
  24. 0 0
      dist/static/js/chunk-18b37c00.3f1b11ce.js
  25. 0 0
      dist/static/js/chunk-206a2e07.628264ac.js
  26. 0 0
      dist/static/js/chunk-22b5b4e8.994dec20.js
  27. 0 0
      dist/static/js/chunk-24f3ce3b.df424260.js
  28. 0 0
      dist/static/js/chunk-25fe1009.c3fc73d1.js
  29. 0 0
      dist/static/js/chunk-263aa15a.d22c7eeb.js
  30. 0 0
      dist/static/js/chunk-35d964c1.33a3a04a.js
  31. 0 0
      dist/static/js/chunk-3a08ee3b.8aa05f49.js
  32. 0 0
      dist/static/js/chunk-3c8266ca.c4b5673e.js
  33. 0 0
      dist/static/js/chunk-48f2714c.bb4aebc5.js
  34. 0 0
      dist/static/js/chunk-566a5725.24d4bbdf.js
  35. 0 0
      dist/static/js/chunk-5722a7ad.23ab5afa.js
  36. 0 0
      dist/static/js/chunk-63d9af64.cbbd092e.js
  37. 0 0
      dist/static/js/chunk-6a8de0db.0785fa83.js
  38. 0 0
      dist/static/js/chunk-6ad43184.37cbd63a.js
  39. 0 0
      dist/static/js/chunk-6ea8aabe.963e97a9.js
  40. 0 0
      dist/static/js/chunk-7352975b.5e42909a.js
  41. 0 0
      dist/static/js/chunk-7f91ee0d.bea6a779.js
  42. 0 0
      dist/static/js/chunk-8d3f8a4c.50a2e2a1.js
  43. 0 0
      dist/static/js/chunk-91193b0c.9f56f2b6.js
  44. 1 0
      dist/static/js/chunk-9cf825a4.7e5d580a.js
  45. 0 0
      dist/static/js/chunk-c68f3e9e.d4b1d666.js
  46. 0 0
      dist/static/js/chunk-c771365a.71cb5b57.js
  47. 0 0
      dist/static/js/chunk-e60d0406.1cceab17.js
  48. 0 0
      dist/static/js/chunk-fcd89c9c.2a3e7a9c.js
  49. 33 0
      src/components/singe-file-upload/index.vue
  50. 7 2
      src/main.js
  51. 14 2
      src/store/modules/permission.js
  52. 1 4
      src/utils/searchArray.js
  53. 1 1
      src/views/accompanyManager/accompanys.vue
  54. 16 39
      src/views/businessManager/shopManager/shopList.vue
  55. 5 4
      src/views/businessManager/shopManager/shopOperation.vue
  56. 15 0
      src/views/main/api.js
  57. 7 0
      src/views/main/constant.js
  58. 176 0
      src/views/main/modals/studentLeaveDetail.vue
  59. 191 0
      src/views/main/studentLeaveList.vue
  60. 22 20
      src/views/teamDetail/teamCourseList.vue
  61. 11 9
      src/views/withdrawal-application/modals/visit.vue
  62. 1 1
      vue.config.js

Diferenças do arquivo suprimidas por serem muito extensas
+ 0 - 0
dist/index.html


Diferenças do arquivo suprimidas por serem muito extensas
+ 1 - 0
dist/static/css/app.14a54fb6.css


Diferenças do arquivo suprimidas por serem muito extensas
+ 0 - 0
dist/static/css/app.61955a35.css


Diferenças do arquivo suprimidas por serem muito extensas
+ 1 - 0
dist/static/css/chunk-0236a4cb.fbda7ff3.css


+ 0 - 1
dist/static/css/chunk-0779b5c9.31e651b0.css

@@ -1 +0,0 @@
-.el-button--primary[data-v-636ed273],.el-button--primary[data-v-636ed273]:active,.el-button--primary[data-v-636ed273]:focus,.el-button--primary[data-v-636ed273]:hover{background:#14928a;border-color:#14928a;color:#fff}.el-row[data-v-636ed273]{margin-top:40px}.el-col[data-v-636ed273]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-bottom:20px;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end;margin-right:50%}.el-input-group[data-v-636ed273]{width:200px;margin:0 20px}[data-v-636ed273] .el-tree-node__content{height:40px!important}[data-v-636ed273] .avatar-uploader .el-upload{border:1px dashed #d9d9d9;border-radius:6px;cursor:pointer;position:relative;overflow:hidden}.avatar-uploader .el-upload[data-v-636ed273]:hover{border-color:#409eff}.avatar-uploader-icon[data-v-636ed273]{font-size:28px;color:#8c939d;width:120px;height:120px;line-height:120px;text-align:center}.avatar[data-v-636ed273]{width:120px;height:120px;display:block}.el-select__tags .el-tag.el-tag--info.el-tag--small.el-tag--light[data-v-636ed273]{max-width:95px}

Diferenças do arquivo suprimidas por serem muito extensas
+ 1 - 0
dist/static/css/chunk-25fe1009.c31b56f4.css


Diferenças do arquivo suprimidas por serem muito extensas
+ 0 - 0
dist/static/css/chunk-25fe1009.d47e80d8.css


Diferenças do arquivo suprimidas por serem muito extensas
+ 0 - 0
dist/static/css/chunk-263aa15a.596a1a75.css


+ 0 - 1
dist/static/css/chunk-3272f826.377ebf23.css

@@ -1 +0,0 @@
-.titlewrap[data-v-431c3e3c]{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.titlewrap[data-v-431c3e3c],.wrap[data-v-431c3e3c]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.wrap div[data-v-431c3e3c]{margin-right:20px;max-width:inherit}.countWrap[data-v-431c3e3c] .el-date-editor.el-input,.countWrap[data-v-431c3e3c] .el-date-editor.el-input__inner{width:100px!important}

Diferenças do arquivo suprimidas por serem muito extensas
+ 0 - 0
dist/static/css/chunk-48a66b2f.2f4907e0.css


+ 1 - 0
dist/static/css/chunk-566a5725.458c8713.css

@@ -0,0 +1 @@
+.el-button--primary[data-v-a476bcec],.el-button--primary[data-v-a476bcec]:active,.el-button--primary[data-v-a476bcec]:focus,.el-button--primary[data-v-a476bcec]:hover{background:#14928a;border-color:#14928a;color:#fff}.el-row[data-v-a476bcec]{margin-top:40px}.el-col[data-v-a476bcec]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-bottom:20px;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end;margin-right:50%}.el-input-group[data-v-a476bcec]{width:200px;margin:0 20px}[data-v-a476bcec] .el-tree-node__content{height:40px!important}[data-v-a476bcec] .avatar-uploader .el-upload{border:1px dashed #d9d9d9;border-radius:6px;cursor:pointer;position:relative;overflow:hidden}.avatar-uploader .el-upload[data-v-a476bcec]:hover{border-color:#409eff}.avatar-uploader-icon[data-v-a476bcec]{font-size:28px;color:#8c939d;width:120px;height:120px;line-height:120px;text-align:center}.avatar[data-v-a476bcec]{width:120px;height:120px;display:block}.el-select__tags .el-tag.el-tag--info.el-tag--small.el-tag--light[data-v-a476bcec]{max-width:95px}

Diferenças do arquivo suprimidas por serem muito extensas
+ 0 - 0
dist/static/css/chunk-5722a7ad.70c7c915.css


Diferenças do arquivo suprimidas por serem muito extensas
+ 0 - 0
dist/static/css/chunk-63d9af64.9448cddb.css


+ 1 - 0
dist/static/css/chunk-6a8de0db.28ab62ef.css

@@ -0,0 +1 @@
+.titlewrap[data-v-024f20e8]{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.titlewrap[data-v-024f20e8],.wrap[data-v-024f20e8]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.wrap div[data-v-024f20e8]{margin-right:20px;max-width:inherit}.countWrap[data-v-024f20e8] .el-date-editor.el-input,.countWrap[data-v-024f20e8] .el-date-editor.el-input__inner{width:100px!important}

Diferenças do arquivo suprimidas por serem muito extensas
+ 0 - 0
dist/static/css/chunk-6ad43184.55421538.css


Diferenças do arquivo suprimidas por serem muito extensas
+ 0 - 0
dist/static/css/chunk-7352975b.715283e8.css


Diferenças do arquivo suprimidas por serem muito extensas
+ 0 - 0
dist/static/css/chunk-8d3f8a4c.bf529c91.css


+ 1 - 0
dist/static/css/chunk-9cf825a4.1e37fc06.css

@@ -0,0 +1 @@
+.payForm[data-v-3d1ffe73] .el-form-item{min-width:40%}.newBand[data-v-ec92bcbc]{display:inline-block}.noWrap[data-v-ec92bcbc]{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}

+ 1 - 0
dist/static/css/chunk-e60d0406.0064c6fb.css

@@ -0,0 +1 @@
+/deep/.avatar-uploader .el-upload,/deep/.upload-demo .el-upload{border-radius:6px;cursor:pointer;position:relative;overflow:hidden}.avatar-uploader .el-upload:hover{border-color:#409eff}.avatar-uploader-icon{border:1px dashed #d9d9d9;font-size:28px;color:#8c939d;width:120px;height:120px;line-height:120px;text-align:center}.avatar{width:120px;height:120px;display:block}.ivu-upload{display:none}.shopImage{width:60px;height:60px}.shopDesc{max-height:70px;overflow:hidden}.el-select__tags .el-tag.el-tag--info.el-tag--small.el-tag--light{max-width:95px}

Diferenças do arquivo suprimidas por serem muito extensas
+ 0 - 0
dist/static/js/app.98d016cb.js


Diferenças do arquivo suprimidas por serem muito extensas
+ 0 - 0
dist/static/js/chunk-0236a4cb.1d9b4854.js


Diferenças do arquivo suprimidas por serem muito extensas
+ 0 - 0
dist/static/js/chunk-05215e45.70eeefea.js


Diferenças do arquivo suprimidas por serem muito extensas
+ 0 - 0
dist/static/js/chunk-05fe29e4.74606407.js


Diferenças do arquivo suprimidas por serem muito extensas
+ 0 - 0
dist/static/js/chunk-18b37c00.3f1b11ce.js


Diferenças do arquivo suprimidas por serem muito extensas
+ 0 - 0
dist/static/js/chunk-206a2e07.628264ac.js


Diferenças do arquivo suprimidas por serem muito extensas
+ 0 - 0
dist/static/js/chunk-22b5b4e8.994dec20.js


Diferenças do arquivo suprimidas por serem muito extensas
+ 0 - 0
dist/static/js/chunk-24f3ce3b.df424260.js


Diferenças do arquivo suprimidas por serem muito extensas
+ 0 - 0
dist/static/js/chunk-25fe1009.c3fc73d1.js


Diferenças do arquivo suprimidas por serem muito extensas
+ 0 - 0
dist/static/js/chunk-263aa15a.d22c7eeb.js


Diferenças do arquivo suprimidas por serem muito extensas
+ 0 - 0
dist/static/js/chunk-35d964c1.33a3a04a.js


Diferenças do arquivo suprimidas por serem muito extensas
+ 0 - 0
dist/static/js/chunk-3a08ee3b.8aa05f49.js


Diferenças do arquivo suprimidas por serem muito extensas
+ 0 - 0
dist/static/js/chunk-3c8266ca.c4b5673e.js


Diferenças do arquivo suprimidas por serem muito extensas
+ 0 - 0
dist/static/js/chunk-48f2714c.bb4aebc5.js


Diferenças do arquivo suprimidas por serem muito extensas
+ 0 - 0
dist/static/js/chunk-566a5725.24d4bbdf.js


Diferenças do arquivo suprimidas por serem muito extensas
+ 0 - 0
dist/static/js/chunk-5722a7ad.23ab5afa.js


Diferenças do arquivo suprimidas por serem muito extensas
+ 0 - 0
dist/static/js/chunk-63d9af64.cbbd092e.js


Diferenças do arquivo suprimidas por serem muito extensas
+ 0 - 0
dist/static/js/chunk-6a8de0db.0785fa83.js


Diferenças do arquivo suprimidas por serem muito extensas
+ 0 - 0
dist/static/js/chunk-6ad43184.37cbd63a.js


Diferenças do arquivo suprimidas por serem muito extensas
+ 0 - 0
dist/static/js/chunk-6ea8aabe.963e97a9.js


Diferenças do arquivo suprimidas por serem muito extensas
+ 0 - 0
dist/static/js/chunk-7352975b.5e42909a.js


Diferenças do arquivo suprimidas por serem muito extensas
+ 0 - 0
dist/static/js/chunk-7f91ee0d.bea6a779.js


Diferenças do arquivo suprimidas por serem muito extensas
+ 0 - 0
dist/static/js/chunk-8d3f8a4c.50a2e2a1.js


Diferenças do arquivo suprimidas por serem muito extensas
+ 0 - 0
dist/static/js/chunk-91193b0c.9f56f2b6.js


Diferenças do arquivo suprimidas por serem muito extensas
+ 1 - 0
dist/static/js/chunk-9cf825a4.7e5d580a.js


Diferenças do arquivo suprimidas por serem muito extensas
+ 0 - 0
dist/static/js/chunk-c68f3e9e.d4b1d666.js


Diferenças do arquivo suprimidas por serem muito extensas
+ 0 - 0
dist/static/js/chunk-c771365a.71cb5b57.js


Diferenças do arquivo suprimidas por serem muito extensas
+ 0 - 0
dist/static/js/chunk-e60d0406.1cceab17.js


Diferenças do arquivo suprimidas por serem muito extensas
+ 0 - 0
dist/static/js/chunk-fcd89c9c.2a3e7a9c.js


+ 33 - 0
src/components/singe-file-upload/index.vue

@@ -4,17 +4,29 @@
     :headers="headers"
     :on-success="success"
     :on-remove="remove"
+    :on-progress="progress"
     :on-error="error"
     :limit="1"
     :file-list="filelist"
     :accept="accept">
     <el-button size="small" type="primary" plain>点击上传</el-button>
     <div slot="tip" v-if="tips" class="el-upload__tip">{{tips}}</div>
+    <div slot="file" slot-scope="{file}">
+      <div style="display: flex; align-items: center;flex: 1 auto;justify-content: space-between;">
+        <div style="display: flex; align-items: center;overflow: hidden;">
+          <i v-if="!!file.url" @click.stop="copyText(file.url)" title="复制" style="padding-right: 5px" class="el-icon-document-copy"></i>
+          <span class="upload-text" :title="file.url">{{ file.url }}</span>
+        </div>
+        <i v-if="!!file.url" class="el-icon-delete" @click="remove"></i>
+      </div>
+    </div>
   </el-upload>
 </template>
 
 <script>
+import copy from 'copy-to-clipboard'
 import { getToken } from '@/utils/auth'
+import load from '@/utils/loading'
 export default {
   name: 'singe-file-upload',
   props: {
@@ -62,8 +74,13 @@ export default {
     },
     error() {
       this.remove()
+      load.endLoading()
+    },
+    progress() {
+      load.startLoading()
     },
     success(res) {
+      load.endLoading()
       if (res.code == 200) {
         this.filelist = [{
           name: res.data.url,
@@ -76,6 +93,22 @@ export default {
         this.$message.error(res.msg || '上传失败')
       }
     },
+    copyText(text) {
+      if (text) {
+        copy(text)
+        this.$message.success('复制成功')
+      }
+    }
   }
 }
 </script>
+
+<style lang="less" scoped>
+.upload-text {
+  display: inline-block;
+  width: 100%;
+  overflow: hidden;
+  white-space: nowrap;
+  text-overflow: ellipsis;
+}
+</style>

+ 7 - 2
src/main.js

@@ -52,13 +52,18 @@ class DonMessage {
     this[showMessage]('error', options, single)
   }
   [showMessage] (type, options, single) {
+    // console.log(type, options, Message)
+    let params = {
+      message: options,
+      offset: 90
+    }
     if (single) {
       // 判断是否已存在Message
       if (document.getElementsByClassName('el-message').length === 0) {
-        Message[type](options)
+        Message[type](params)
       }
     } else {
-      Message[type](options)
+      Message[type](params)
     }
   }
 }

+ 14 - 2
src/store/modules/permission.js

@@ -205,6 +205,18 @@ function setDetailRoute(accessedRoutes) {
             activeMenu: '/main/main'
           }
         },
+        {
+          name: '学员请假列表',
+          path: 'studentLeaveList',
+          component: () => import('@/views/main/studentLeaveList'),
+          hidden: true,
+          meta: {
+            noCache: '1',
+            title: '学员请假列表',
+            belongTopMenu: "/main",
+            activeMenu: '/main/main'
+          }
+        },
         //
       ])
     }
@@ -479,7 +491,7 @@ function setDetailRoute(accessedRoutes) {
             noCache: '1',
             title: '进货清单',
             belongTopMenu: "/shopManager",
-            activeMenu: '/shopManager'
+            activeMenu: '/shopList'
           }
         },
         {
@@ -491,7 +503,7 @@ function setDetailRoute(accessedRoutes) {
             noCache: '1',
             title: '添加修改商品',
             belongTopMenu: "/shopManager",
-            activeMenu: '/shopManager'
+            activeMenu: '/shopList'
           }
         },
       ])

+ 1 - 4
src/utils/searchArray.js

@@ -152,10 +152,7 @@ export const visitChiose = [
 ]
 export const visitChiose1 = [
   { value: '课程推荐', label: '课程推荐', children: [{ value: '新课推荐', label: '新课推荐' }, { value: '续费提醒', label: '续费提醒' }] },
-  { value: '常规回访', label: '常规回访', children: [{ value: '课后及作业回访', label: '课后及作业回访' }, { value: '练习及乐团表现', label: '练习及乐团表现' },{
-    label:'考勤申诉',
-    value:'考勤申诉'
-   }] },
+  { value: '常规回访', label: '常规回访', children: [{ value: '课后及作业回访', label: '课后及作业回访' }, { value: '练习及乐团表现', label: '练习及乐团表现' },{ label:'考勤申诉',  value:'考勤申诉' }, { value: "异常请假回访", label: "异常请假回访" }] },
   { value: '其它', label: '其它', children: [{ value: '其它', label: '其它' }] }
 ]
 

+ 1 - 1
src/views/accompanyManager/accompanys.vue

@@ -168,7 +168,7 @@
                 v-if="
                   scope.row.status == 'NOT_START' &&
                   courseType != 'TRIAL' &&
-                  permission('courseSchedule/practiceCourseTeacherAdjust')
+                  permission('courseSchedule/practiceCourseTeacherAdjust/3420')
                 "
                 @click="resetTeacher(scope.row)"
                 >更换老师</el-button

+ 16 - 39
src/views/businessManager/shopManager/shopList.vue

@@ -49,7 +49,7 @@
       >
       <el-button
         class="btn-primary"
-        permission="'goods/update'"
+        v-permission="'goods/add/commonAdd'"
         @click="onShopComAdd"
         >添加组合商品</el-button
       >
@@ -190,7 +190,7 @@
           </el-table-column>
           <el-table-column align="center" prop="brand" label="品牌">
           </el-table-column>
-          <el-table-column align="center" prop="name" label="商品名称">
+          <el-table-column align="center" prop="name" label="商品名称" width="150px">
             <template slot-scope="scope">
               <overflow-text :text="scope.row.name" width="100%" />
             </template>
@@ -330,14 +330,6 @@
                 type="text"
                 >进货清单</el-button
               >
-              <!-- <el-popconfirm title="你是否上架该商品?"
-                             @confirm="onUpdate(scope.row)"
-                             v-if="scope.row.status == 0"
-                             v-permission="'goods/updateGoodsStatus'">
-                <el-button slot="reference"
-                           type="text">上架</el-button>
-              </el-popconfirm> -->
-              <!-- v-permission="'goods/updateGoodsStatus'" -->
               <el-button
                 v-if="
                   scope.row.status == 0 && permission('goods/updateGoodsStatus')
@@ -348,28 +340,14 @@
               >
               <el-button
                 v-if="
-                  scope.row.status == 1 && permission('goods/updateGoodsStatus')
+                  scope.row.status == 1 && permission('goods/updateGoodsStatus/downGoods')
                 "
                 @click="onUpdate(scope.row, 1)"
                 type="text"
                 >下架</el-button
               >
-              <!-- <el-popconfirm title="你是否下架该商品?"
-                             @confirm="onUpdate(scope.row)"
-                             v-if="scope.row.status == 1"
-                             v-permission="'goods/updateGoodsStatus'">
-                <el-button slot="reference"
-                           type="text">下架</el-button>
-              </el-popconfirm> -->
-              <!-- {{ scope.row.status }} -->
-              <!-- v-permission="scope.row.complementGoodsIdList ? 'goods/update' : '/shopOperation'" -->
               <el-button
-                v-if="
-                  scope.row.status == 0 &&
-                  (scope.row.complementGoodsIdList
-                    ? 'goods/update'
-                    : '/shopOperation')
-                "
+                v-if="scope.row.status == 0 && permission('/shopOperation/updateShop')"
                 @click="onShopOperation('update', scope.row)"
                 type="text"
                 >修改</el-button
@@ -377,16 +355,13 @@
               <el-button
                 v-if="
                   scope.row.status == 1 &&
-                  permission(
-                    scope.row.complementGoodsIdList
-                      ? 'goods/update'
-                      : '/shopOperation'
-                  )
+                  permission('/shopOperation/shopLook')
                 "
                 @click="onShopOperation('look', scope.row)"
                 type="text"
-                >查看</el-button
-              >
+                >查看</el-button>
+
+              <el-button v-if="permission('/shopOperation/copyShop')" @click="onShopOperation('copy', scope.row)" type="text" >复制</el-button>
               <!-- <el-button v-if="scope.row.status == 0"
                          v-permission="'goods/del'"
                          @click="onDelete(scope.row)"
@@ -711,7 +686,7 @@ import { getToken } from "@/utils/auth";
 import { goodsType } from "@/utils/searchArray";
 import load from "@/utils/loading";
 import { permission } from "@/utils/directivePage";
-import courseEvaluateVue from '@/views/teamDetail/componentCourse/courseEvaluate.vue';
+// import courseEvaluateVue from '@/views/teamDetail/componentCourse/courseEvaluate.vue';
 let validPrice = (rule, value, callback) => {
   if ((value == "" && typeof value == "string") || value == null) {
     callback(new Error("请输入金额"));
@@ -780,6 +755,7 @@ export default {
         create: "添加",
         update: "修改",
         look: "查看",
+        copy: "复制"
       },
       addDisabled: false,
       form: {
@@ -1056,7 +1032,6 @@ export default {
       params.page = this.pageInfo.page;
       goodsQuery(params).then((res) => {
         if (res.code == 200 && res.data) {
-          
           this.tableList = res.data.rows;
           this.pageInfo.total = res.data.total;
         }
@@ -1148,7 +1123,7 @@ export default {
       this.addType = type;
       this.addDisabled = type == "look" ? true : false;
       // 判断是否是修改组合商品
-      if ((type == "update" || type == "look") && row.complementGoodsIdList) {
+      if ((type == "update" || type == "look" || type == 'copy') && row.complementGoodsIdList) {
         this.routeShopStatus = true;
 
         let form = this.form;
@@ -1177,6 +1152,8 @@ export default {
           pageTitle = "修改";
         } else if (type == "look") {
           pageTitle = "查看";
+        } else if(type == 'copy') {
+          pageTitle = '复制'
         }
         this.$router.push(
           {
@@ -1292,18 +1269,18 @@ export default {
           form.complementGoodsIdList = tempIds.join(",");
           form.courseViewType = form.courseViewType.join(',')
           form.goodsList = null;
-          if (this.addType == "create") {
+          if (this.addType == "create" || this.addType == "copy") {
             if (this.form.id) {
               // 判断有没有Id,如果有则删除
               delete this.form.id;
             }
             form.status = "NO"; // 默认上架
             goodsAdd(cleanDeep(form)).then((res) => {
-              this.messageTips("添加", res);
+              this.messageTips("保存", res);
             });
           } else if (this.addType == "update") {
             goodsUpdate(cleanDeep(form)).then((res) => {
-              this.messageTips("修改", res);
+              this.messageTips("保存", res);
             });
           }
         } else {

+ 5 - 4
src/views/businessManager/shopManager/shopOperation.vue

@@ -239,7 +239,7 @@
         </el-form-item>
         <el-form-item v-if="!pageDisabled">
           <el-button @click="onSubmit('form')" type="primary"
-            >立即{{ pageType == "create" ? "创建" : "修改" }}</el-button
+            >保存</el-button
           >
           <el-button @click="onReSet('form')">重置</el-button>
         </el-form-item>
@@ -288,6 +288,7 @@ export default {
         create: "添加",
         update: "修改",
         look: "查看",
+        copy: "复制"
       },
       pageDisabled: false,
       headers: {
@@ -476,18 +477,18 @@ export default {
         if (valid) {
           let tempForm = JSON.parse(JSON.stringify(this.form))
           tempForm.courseViewType = tempForm.courseViewType.join(',')
-          if (this.pageType == "create") {
+          if (this.pageType == "create" || this.pageType == 'copy') {
             if (tempForm.id) {
               // 判断有没有Id,如果有则删除
               delete tempForm.id;
             }
             tempForm.status = "NO"; // 默认上架
             goodsAdd(tempForm).then((res) => {
-              this.messageTips("添加", res);
+              this.messageTips("保存", res);
             });
           } else if (this.pageType == "update") {
             goodsUpdate(tempForm).then((res) => {
-              this.messageTips("修改", res);
+              this.messageTips("保存", res);
             });
           }
         } else {

+ 15 - 0
src/views/main/api.js

@@ -117,3 +117,18 @@ export const queryNoClassMusicStudentInfo = (data) => request2({
   method: 'get',
   params: data
 })
+
+// 获取学生请假异常列表
+export const queryStudentErrorLeaveList = (data) => request2({
+  url: '/api-web/studentManage/queryStudentErrorLeaveList',
+  method: 'get',
+  params: data
+})
+
+// 获取学生请假课程列表
+export const queryStudentLeaveCourseList = (data) => request2({
+  url: '/api-web/studentManage/queryStudentLeaveCourseList',
+  method: 'get',
+  params: data
+})
+

+ 7 - 0
src/views/main/constant.js

@@ -96,6 +96,13 @@ export const errorType = {
     permission: '/notClassStudent',
     always: true,
   },
+  STUDENT_ERROR_LEAVE: {
+    name: '学员异常请假',
+    isError: true,
+    url: '/main/studentLeaveList',
+    permission: '/studentLeaveList',
+    always: true,
+  },
   STUDENT_ARREARAGE:{
     name: '未缴费学员数',
     isError: true,

+ 176 - 0
src/views/main/modals/studentLeaveDetail.vue

@@ -0,0 +1,176 @@
+<template>
+  <div>
+    <el-form :inline="true" :model="searchForm" ref="searchForm">
+      <el-form-item prop="search">
+        <el-input
+            v-model.trim="searchForm.search"
+            clearable
+            @keyup.enter.native="search"
+            placeholder="老师编号/姓名/课程编号"
+        ></el-input>
+        </el-form-item>
+      <el-form-item prop="leaveVisitFlag">
+        <el-select placeholder="是否回访" v-model="searchForm.leaveVisitFlag" clearable>
+          <el-option label="是" value="1"></el-option>
+          <el-option label="否" value="0"></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+          <el-select
+            v-model.trim="searchForm.courseType"
+            clearable
+            filterable
+            placeholder="课程类型"
+          >
+            <el-option
+              v-for="(item, index) in courseType"
+              :key="index"
+              :value="item.value"
+              :label="item.label"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+      <el-form-item>
+        <el-button @click="search" type="danger">搜索</el-button>
+        <el-button @click="onReSet" type="primary">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-table
+      style="width: 100%"
+      :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
+      :data="tableList"
+    >
+        <el-table-column
+            align="center"
+            prop="actualTeacherId"
+            label="老师编号"
+            width="120px"
+        >
+            <template slot-scope="scope">
+                <copy-text>{{ scope.row.actualTeacherId }}</copy-text>
+            </template>
+        </el-table-column>
+        <el-table-column
+            align="center"
+            prop="teacherName"
+            label="老师姓名"
+            width="120px"
+        >
+            <template slot-scope="scope">
+                <copy-text>{{ scope.row.teacherName }}</copy-text>
+            </template>
+        </el-table-column>
+        <el-table-column
+            align="center"
+            prop="groupId"
+            label="课程组编号"
+            width="120px"
+        >
+        </el-table-column>
+        <el-table-column
+            align="center"
+            prop="courseScheduleId"
+            label="课程编号"
+            width="120px"
+        >
+            <template slot-scope="scope">
+                <copy-text>{{ scope.row.courseScheduleId }}</copy-text>
+            </template>
+        </el-table-column>
+        <el-table-column
+            align="center"
+            label="课程类型"
+             width="120px"
+        >
+            <template slot-scope="scope">
+                {{ scope.row.groupType | coursesType }}
+            </template>
+        </el-table-column>
+        <el-table-column
+            align="center"
+            prop="courseName"
+            label="课程名称"
+        ></el-table-column>
+        <el-table-column
+            align="center"
+            label="上课时间"
+        >
+            <template slot-scope="scope">
+                {{ scope.row.classDate + ' ' + scope.row.startClassTime.substr(0, 5) + '-' + scope.row.endClassTime.substr(0, 5) }}
+            </template>
+        </el-table-column>
+        <el-table-column
+            align="center"
+            label="是否回访"
+            width="120px"
+        >
+            <template slot-scope="scope">
+                {{ scope.row.leaveVisitFlag ? '是' : '否' }}
+            </template>
+        </el-table-column>
+    </el-table>
+    <pagination
+      :total="rules.total"
+      :page.sync="rules.page"
+      :limit.sync="rules.limit"
+      :page-sizes="rules.page_size"
+      @pagination="getList"
+    />
+  </div>
+</template>
+<script>
+import pagination from "@/components/Pagination/index";
+import { queryStudentLeaveCourseList } from "../api";
+import { courseType } from "@/utils/searchArray";
+import dayjs from "dayjs";
+export default {
+  props: ["studentId"],
+  components: { pagination },
+  data() {
+    return {
+        courseType,
+        searchForm: {
+            leaveVisitFlag: null,
+            courseType: null,
+            userId: null
+        },
+        tableList: [],
+        rules: {
+            // 分页规则
+            limit: 10, // 限制显示条数
+            page: 1, // 当前页
+            total: 0, // 总条数
+            page_size: [10, 20, 40, 50] // 选择限制显示条数
+        }
+    };
+  },
+  mounted() {
+    this.searchForm.userId = this.studentId;
+    this.getList();
+  },
+  methods: {
+    search() {
+      this.rules.page = 1;
+      this.getList();
+    },
+    onReSet() {
+      this.$refs.searchForm.resetFields();
+      this.search();
+    },
+    async getList() {
+      const { ...rest } = this.searchForm;
+      let obj = {
+        ...rest,
+        page: this.rules.page,
+        rows: this.rules.limit,
+      };
+      try {
+        const result = await queryStudentLeaveCourseList(obj);
+        this.tableList = result.data.rows;
+        this.rules.total = result.data.total
+      } catch {}
+    }
+  }
+};
+</script>

+ 191 - 0
src/views/main/studentLeaveList.vue

@@ -0,0 +1,191 @@
+<!--  -->
+<template>
+    <div class="m-container">
+        <h2>
+            <div class="squrt"></div>
+            学员请假列表
+        </h2>
+        <div class="m-core">
+            <save-form
+                :inline="true"
+                @submit="search"
+                @reset="onReSet"
+                ref="searchFrom"
+                :model="searchForm"
+            >
+                <el-form-item prop="search">
+                    <el-input
+                        v-model.trim="searchForm.search"
+                        clearable
+                        @keyup.enter.native="search"
+                        placeholder="学员编号/姓名/手机号"
+                    ></el-input>
+                </el-form-item>
+                <el-form-item prop="organIds">
+                    <el-select
+                        placeholder="请选择分部"
+                        v-model="searchForm.organIds"
+                        clearable
+                    >
+                        <el-option
+                        v-for="(item, index) in selects.branchs"
+                        :label="item.name"
+                        :value="item.id"
+                        :key="index"
+                        ></el-option>
+                    </el-select>
+                </el-form-item>
+                <el-form-item>
+                    <el-button type="danger" native-type="submit">搜索</el-button>
+                    <el-button native-type="reset" type="primary">重置</el-button>
+                </el-form-item>
+            </save-form>
+            <div class="tableWrap">
+                <el-table
+                style="width: 100%"
+                :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
+                :data="tableList"
+                >
+                <el-table-column align="center" label="分部">
+                    <template slot-scope="scope">
+                        <copy-text>{{ scope.row.organName }}</copy-text>
+                    </template>
+                </el-table-column>
+                <el-table-column align="center" label="学员编号">
+                    <template slot-scope="scope">
+                        <copy-text>{{ scope.row.userId }}</copy-text>
+                    </template>
+                </el-table-column>
+                <el-table-column align="center" label="学员姓名">
+                    <template slot-scope="scope">
+                        <copy-text>{{ scope.row.studentName }}</copy-text>
+                    </template>
+                </el-table-column>
+                <el-table-column align="center" label="手机号" prop="phone">
+                </el-table-column>
+                <el-table-column align="center" label="近两个月请假次数" prop="totalNum">
+                </el-table-column>
+                <el-table-column align="center" label="本月请假次数" prop="currentNum">
+                </el-table-column>
+                <el-table-column align="center" label="操作">
+                    <template slot-scope="scope">
+                        <auth :auths="['notClassStudent/nowLook', '/resetTeaming']" mulit>
+                            <el-button type="text" @click="showDetail(scope.row)">查看</el-button>
+                        </auth>
+                         <el-button type="text" @click="addVisit(scope.row)">新增回访</el-button>
+                    </template>
+                </el-table-column>
+                </el-table>
+                <pagination
+                sync
+                :total.sync="pageInfo.total"
+                :page.sync="pageInfo.page"
+                :limit.sync="pageInfo.limit"
+                :page-sizes="pageInfo.page_size"
+                @pagination="getList"
+                />
+            </div>
+        </div>
+
+        <el-dialog
+            title="查看"
+            width="1000px"
+            :visible.sync="leaveVisible"
+            append-to-body>
+            <student-leave-detail v-if="leaveVisible" :studentId="studentId" />
+        </el-dialog>
+
+        <el-dialog
+            title="新增回访"
+            width="500px"
+            :visible.sync="visitVisible"
+            append-to-body
+        >
+            <visit
+                v-if="visitVisible && detail"
+                :detail="detail"
+                :username="detail.username"
+                @close="visitVisible = false"
+                @submited="getList"
+                :useVisitType="['常规回访','异常请假回访']"
+            />
+        </el-dialog>
+    </div>
+</template>
+
+<script>
+import pagination from "@/components/Pagination/index";
+import visit from "@/views/withdrawal-application/modals/visit";
+import studentLeaveDetail from './modals/studentLeaveDetail'
+import { queryStudentErrorLeaveList } from './api.js'
+export default {
+    components: { pagination, visit, studentLeaveDetail },
+    data() {
+        return {
+            searchForm: {
+                search: null,
+                studentSearch: null,
+                organIds: null,
+            },
+            visitVisible: false,
+            detail: null,
+            pageInfo: {
+                // 分页规则
+                limit: 10, // 限制显示条数
+                page: 1, // 当前页
+                total: 0, // 总条数
+                page_size: [10, 20, 40, 50], // 选择限制显示条数
+            },
+            tableList: [],
+            leaveVisible: false,
+            studentId: null,
+        };
+    },
+    //生命周期 - 挂载完成(可以访问DOM元素)
+    mounted() {
+        const { query } = this.$route
+        if (query.organId) {
+            this.searchForm.organIds = Number(query.organId)
+        }
+        this.$store.dispatch("setBranchs");
+
+        this.getList()
+    },
+    methods: {
+        addVisit(row) {
+            this.visitVisible = true;
+            this.detail = row;
+        },
+        search() {
+            this.pageInfo.page = 1;
+            this.getList();
+        },
+        onReSet() {
+            this.$refs['searchFrom'].resetFields()
+            this.getList()
+        },
+        async getList() {
+            try {
+                const { ...search } = this.searchForm
+                const params = {
+                    ...search,
+                    page: this.pageInfo.page,
+                    rows: this.pageInfo.limit
+                }
+                let res = await queryStudentErrorLeaveList(params)
+                this.tableList = res.data.rows;
+                this.pageInfo.total = res.data.total;
+            } catch (err) {
+                //
+            }
+        },
+        showDetail(item) {
+            this.leaveVisible = true
+            this.studentId = item.userId
+        }
+    },
+};
+</script>
+<style lang='scss' scoped>
+
+</style>

+ 22 - 20
src/views/teamDetail/teamCourseList.vue

@@ -1099,7 +1099,7 @@ export default {
         },
         params: this.getSearchForm(),
         url,
-        responseType: "blob",
+        // responseType: "blob",
       };
       this.$confirm("您确定导出报表", "提示", {
         confirmButtonText: "确定",
@@ -1110,27 +1110,29 @@ export default {
           load.startLoading();
           axios(options)
             .then((res) => {
-              let blob = new Blob([res.data], {
+              console.log(res)
+              this.$message.success(res.data.data)
+              // let blob = new Blob([res.data], {
                 // type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8'
-                type: "application/vnd.ms-excel;charset=utf-8",
+                // type: "application/vnd.ms-excel;charset=utf-8",
                 //word文档为application/msword,pdf文档为application/pdf,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8
-              });
-              let text = new Response(blob).text();
-              text.then((res) => {
-                // 判断是否报错
-                if (res.indexOf("code") != -1) {
-                  let json = JSON.parse(res);
-                  this.$message.error(json.msg);
-                } else {
-                  let objectUrl = URL.createObjectURL(blob);
-                  let link = document.createElement("a");
-                  let fname = "课表列表" + new Date().getTime() + ".xls"; //下载文件的名字
-                  link.href = objectUrl;
-                  link.setAttribute("download", fname);
-                  document.body.appendChild(link);
-                  link.click();
-                }
-              });
+              // });
+              // let text = new Response(blob).text();
+              // text.then((res) => {
+              //   // 判断是否报错
+              //   if (res.indexOf("code") != -1) {
+              //     let json = JSON.parse(res);
+              //     this.$message.error(json.msg);
+              //   } else {
+              //     let objectUrl = URL.createObjectURL(blob);
+              //     let link = document.createElement("a");
+              //     let fname = "课表列表" + new Date().getTime() + ".xls"; //下载文件的名字
+              //     link.href = objectUrl;
+              //     link.setAttribute("download", fname);
+              //     document.body.appendChild(link);
+              //     link.click();
+              //   }
+              // });
               load.endLoading();
             })
             .catch((error) => {

+ 11 - 9
src/views/withdrawal-application/modals/visit.vue

@@ -7,8 +7,6 @@
        <auth :auths="['webCurseHomework/getStudentHomeWorks','extracurricularExercisesReply/queryPageList']">
          <el-button type="text" @click="workVisible=true">作业情况</el-button>
        </auth>
-
-
     </div>
     <el-form
       :model="visitForm"
@@ -22,7 +20,7 @@
       </el-form-item>
       <el-form-item label="回访类型" prop="visitType">
         <el-cascader
-        :disabled='isMainGo'
+          :disabled='isMainGo || !!useVisitType'
           expand-trigger="hover"
           clearable
           style="width: 80% !important"
@@ -90,7 +88,7 @@
       :visible.sync="workVisible"
       append-to-body
     >
-    <studentWork  :studentId="this.detail.userId"/>
+    <studentWork :studentId="this.detail.userId"/>
     </el-dialog>
   </div>
 </template>
@@ -101,7 +99,8 @@ import { addVisit } from "@/views/returnVisitManager/api";
 import record from './record'
 import studentWork from './studentWork'
 export default {
-  props: ["detail", "username",'isMainGo'],
+  // useVisitType 自定义回访类型
+  props: ["detail", "username",'isMainGo', "useVisitType"],
   components:{record,studentWork},
   data() {
     return {
@@ -129,9 +128,12 @@ export default {
   },
   mounted(){
     if(this.isMainGo){
-     this.visitChiose = visitChiose1
-    this.$set(this.visitForm,'visitType',['常规回访','考勤申诉'])
-    }else{
+      this.visitChiose = visitChiose1
+      this.$set(this.visitForm,'visitType',['常规回访','考勤申诉'])
+    } else if(this.useVisitType) {
+      this.visitChiose = visitChiose1
+      this.$set(this.visitForm,'visitType', this.useVisitType)
+    } else{
       this.visitChiose = visitChiose
     }
   },
@@ -159,7 +161,7 @@ export default {
           };
           addVisit(cleanDeep(data)).then((res) => {
             if (res.code === 200) {
-              this.$message.success("新增成功");
+              this.$message.success("保存成功");
               this.$emit("close");
               this.$emit("submited");
             }

+ 1 - 1
vue.config.js

@@ -55,7 +55,7 @@ module.exports = {
     //   warnings: false,
     //   errors: true
     // },
-    https: true,
+    https: false,
     proxy: {
       // change xxx-api/login => mock/login
       // detail: https://cli.vuejs.org/config/#devserver-proxy

Alguns arquivos não foram mostrados porque muitos arquivos mudaram nesse diff