lex před 9 měsíci
rodič
revize
8783112aa2

+ 9 - 0
src/utils/vueFilter.js

@@ -956,3 +956,12 @@ Vue.filter("courseEmnu", value => {
 Vue.filter("suggestionType", value => {
   return constant.suggestionType[value];
 });
+
+Vue.filter("rangeType", value => {
+  let obj = {
+    ALL: "全部",
+    RANGE: "部分",
+    DISABLE: "无"
+  };
+  return obj[value];
+});

+ 226 - 0
src/views/courseware-config/add-teacher.vue

@@ -0,0 +1,226 @@
+<template>
+  <div class="add-courseware">
+    <save-form
+      :inline="true"
+      :model="searchForm"
+      @submit="search"
+      @reset="onReSet"
+      ref="searchForm"
+      savekey="courseware-config-add-teacher"
+    >
+      <el-form-item prop="search">
+        <el-input
+          v-model.trim="searchForm.search"
+          clearable
+          @keyup.enter.native="
+            e => {
+              e.target.blur();
+              $refs.searchForm.save();
+              search();
+            }
+          "
+          placeholder="编号/姓名/手机号"
+        ></el-input>
+      </el-form-item>
+      <el-form-item prop="organId">
+        <el-select
+          v-model.trim="searchForm.organId"
+          filterable
+          clearable
+          multiple
+          collapse-tags
+          placeholder="请选择分部"
+        >
+          <el-option
+            v-for="item in selects.branchs"
+            :key="item.id"
+            :label="item.name"
+            :value="item.id"
+          >
+          </el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item prop="jobNature">
+        <el-select
+          v-model.trim="searchForm.jobNature"
+          filterable
+          clearable
+          placeholder="工作类型"
+        >
+          <el-option
+            v-for="item in jobNature"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value"
+          ></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button native-type="submit" type="primary">搜索</el-button>
+        <el-button native-type="reset" type="danger">重置</el-button>
+      </el-form-item>
+    </save-form>
+    <div class="tableWrap">
+      <el-table
+        :data="tableList"
+        ref="multipleTable"
+        :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
+        @selection-change="handleSelectionChange"
+      >
+        <el-table-column type="selection"  width="55" />
+        <el-table-column
+          align="center"
+          prop="id"
+          label="编号"
+        ></el-table-column>
+        <el-table-column
+          align="center"
+          prop="realName"
+          label="姓名"
+        ></el-table-column>
+
+        <el-table-column
+          align="center"
+          label="手机号"
+          prop="phone"
+        ></el-table-column>
+        <el-table-column
+          align="center"
+          label="分部"
+          prop="organName"
+        ></el-table-column>
+        <el-table-column align="center" label="工作类型" prop="courseNum">
+          <template slot-scope="scope">
+            <p>{{ scope.row.jobNature | jobNature }}</p>
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination
+        sync
+        savekey="courseware-config-add-teacher"
+        :total.sync="pageInfo.total"
+        :page.sync="pageInfo.page"
+        :limit.sync="pageInfo.limit"
+        :page-sizes="pageInfo.page_size"
+        @pagination="getList"
+      />
+    </div>
+
+    <span slot="footer" class="dialog-footer">
+      <el-button @click="$emit('close')">取 消</el-button>
+      <el-button
+        :disabled="activeChiose.length <= 0"
+        @click="onSubmit"
+        type="primary"
+        >确 定</el-button
+      >
+    </span>
+  </div>
+</template>
+
+<script>
+import pagination from "@/components/Pagination/index";
+import {
+  lessonCoursewarePage,
+  queryLessonCoursewareId,
+  addLessonCourseware
+} from "./api";
+import { courseEmnuList, jobNature } from "@/utils/searchArray";
+import { teacherQueryPage } from "@/api/teacherManager";
+export default {
+  name: "add-courseware",
+  components: { pagination },
+  props: ['list'],
+  data() {
+    return {
+      jobNature, // 工作类型
+      courseEmnuList,
+      tableList: [],
+      searchForm: {
+        search: null,
+        organId: null,
+        jobNature: null
+      },
+      pageInfo: {
+        // 分页规则
+        limit: 10, // 限制显示条数
+        page: 1, // 当前页
+        total: 0, // 总条数
+        page_size: [10, 20, 40, 50] // 选择限制显示条数
+      },
+      existIds: [],
+      activeChiose: []
+    };
+  },
+  async mounted() {
+    await this.$store.dispatch("setBranchs");
+    this.getList();
+  },
+  methods: {
+    search() {
+      this.pageInfo.page = 1;
+      this.getList();
+    },
+    onReSet() {
+      this.$refs.searchForm.resetFields();
+      this.search();
+    },
+    handleSelectionChange(val) {
+      console.log(val, 'val')
+      this.activeChiose = val;
+    },
+    async getList() {
+      //
+      try {
+        let params = {
+          ...this.searchForm,
+          page: this.pageInfo.page,
+          rows: this.pageInfo.limit
+        };
+        teacherQueryPage(params).then(res => {
+          if (res.code == 200) {
+            //  (res)
+            console.log(res, 'data')
+            this.tableList = res.data.rows;
+            this.pageInfo.total = res.data.total;
+
+            // 反选对应数据
+            console.log(this.list, 'this.list')
+            this.$nextTick(() => {
+              this.tableList.forEach(item => {
+                const index = this.list.findIndex(child => child.id === item.id);
+                console.log(index, 'tableList')
+                if(index > -1) {
+                  this.$refs.multipleTable.toggleRowSelection(item);
+                }
+              })
+            })
+          }
+        });
+      } catch {
+        //
+      }
+    },
+    async onSubmit() {
+      
+      const userList = []
+      this.activeChiose.forEach(item => {
+        userList.push({
+          name: item.realName,
+          id: item.id
+        })
+      })
+      console.log(userList, 'this.activeChiose')
+      this.$emit('confirm', userList)
+      this.$emit("close");
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+.dialog-footer {
+  display: block;
+  text-align: right;
+}
+</style>

+ 14 - 0
src/views/courseware-config/api.js

@@ -52,3 +52,17 @@ export const addLessonCourseware = data =>
     data,
     method: "post"
   });
+/** 修改适用范围 */
+export const api_updateRangeType = data =>
+  request({
+    url: "/api-web/lessonCourseware/updateRangeType",
+    data,
+    method: "post"
+  });
+/** 获取课件适用范围详情 */
+export const api_getRangeType = data =>
+  request({
+    url: "/api-web/lessonCourseware/getRangeType",
+    params: data,
+    method: "get"
+  });

+ 164 - 0
src/views/courseware-config/apply-auth.vue

@@ -0,0 +1,164 @@
+<template>
+  <div class="update-courseware">
+    <el-form
+      ref="visibleForm"
+      :model="visibleForm"
+      class="visibleForm"
+      label-width="100px"
+    >
+      <el-form-item label="课件名称">{{ detail.name }}</el-form-item>
+      <el-form-item
+        label="适用老师"
+        :rules="[
+          { required: true, message: '请选择适用老师', trigger: 'change' }
+        ]"
+        prop="teacherRangeType"
+      >
+        <el-select
+          clearable
+          v-model="visibleForm.teacherRangeType"
+          placeholder="请选择适用老师"
+          style="width: 100% !important"
+        >
+          <el-option value="ALL" label="全部"></el-option>
+          <el-option value="RANGE" label="部分"></el-option>
+          <el-option value="DISABLE" label="无"></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item
+        v-if="visibleForm.teacherRangeType === 'RANGE'"
+        label="添加老师"
+        :rules="[
+          { required: true, message: '请选择添加老师', trigger: 'change' }
+        ]"
+        prop="teacherList"
+      >
+        <el-button type="primary" @click="onAddTeacher">添加老师</el-button>
+        <div
+          v-if="visibleForm.teacherList.length > 0"
+          style="max-height: 400px; margin-top: 12px; overflow-x: hidden; overflow-y: auto"
+        >
+          <el-tag closable @close="onTagRemove(index)" v-for="(item, index) in visibleForm.teacherList" :key="index" style="margin-right: 8px">{{ item.name }}</el-tag>
+        </div>
+      </el-form-item>
+      <el-form-item
+        label="适用学生"
+        :rules="[
+          { required: true, message: '请选择适用学生', trigger: 'change' }
+        ]"
+        prop="studentRangeType"
+      >
+        <el-select
+          clearable
+          v-model="visibleForm.studentRangeType"
+          placeholder="请选择适用学生"
+          style="width: 100% !important"
+        >
+          <el-option value="ALL" label="全部"></el-option>
+          <el-option value="DISABLE" label="无"></el-option>
+        </el-select>
+      </el-form-item>
+    </el-form>
+    <span slot="footer" class="dialog-footer">
+      <el-button @click="$emit('close')">取 消</el-button>
+      <el-button @click="onSubmit" type="primary">确 定</el-button>
+    </span>
+
+    <el-dialog
+      :title="'添加老师'"
+      :visible.sync="addTeacherStatus"
+      v-if="addTeacherStatus"
+      :close-on-click-modal="false"
+      width="1000px"
+      append-to-body
+      :destroy-on-close="true"
+    >
+      <addTeacher
+        v-if="addTeacherStatus"
+        :list="visibleForm.teacherList"
+        @close="addTeacherStatus = false"
+        @confirm="val => (visibleForm.teacherList = val)"
+      />
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { api_updateRangeType, api_getRangeType } from "./api";
+import addTeacher from "./add-teacher.vue";
+export default {
+  name: "update-courseware",
+  props: ["detail"],
+  components: { addTeacher },
+  data() {
+    return {
+      addTeacherStatus: false,
+
+      visibleForm: {
+        teacherRangeType: null,
+        studentRangeType: null,
+        teacherList: []
+      }
+    };
+  },
+  async mounted() {
+    try {
+      const {data} = await api_getRangeType({ lessonCoursewareId: this.detail.id })
+      this.visibleForm.studentRangeType = data.studentRangeType || null
+      this.visibleForm.teacherRangeType = data.teacherRangeType || null
+      const teacherList = data.teacherList || []
+      teacherList.forEach(item => {
+        this.visibleForm.teacherList.push({
+          name: item.realName,
+          id: item.userId
+        })  
+      })
+      
+    } catch {
+     //
+    }
+  },
+  methods: {
+    onTagRemove(index) {
+      this.visibleForm.teacherList.splice(index, 1)
+    },
+    async onSubmit() {
+      //
+      this.$refs["visibleForm"].validate(async flag => {
+        if (!flag) {
+          return;
+        }
+        const teacherIds = []
+        this.visibleForm.teacherList.forEach(item => {
+          teacherIds.push(item.id)
+        })
+        const params = {
+          lessonCoursewareId: this.detail.id,
+          studentRangeType: this.visibleForm.studentRangeType,
+          teacherRangeType: this.visibleForm.teacherRangeType,
+          teacherIds: this.visibleForm.teacherRangeType === 'RANGE' ? teacherIds: []
+        }
+
+        try {
+          await api_updateRangeType(params);
+          this.$message.success("修改成功");
+          this.$emit("close");
+          this.$emit("getList");
+        } catch {
+          //
+        }
+      });
+    },
+    onAddTeacher() {
+      this.addTeacherStatus = true;
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+.dialog-footer {
+  display: block;
+  text-align: right;
+}
+</style>

+ 133 - 1
src/views/courseware-config/index.vue

@@ -5,6 +5,66 @@
       课件配置
     </h2>
     <div class="m-core">
+      <save-form
+        :inline="true"
+        :model="searchForm"
+        @submit="search"
+        @reset="onReSet"
+        ref="searchForm"
+      >
+        <el-form-item prop="subjectId">
+          <el-select
+            v-model.trim="searchForm.subjectId"
+            clearable
+            filterable
+            placeholder="请选择声部"
+          >
+           <el-option
+            v-for="item in selects.subjects"
+            :value="item.id"
+            :label="item.name"
+            :key="item.id"
+          ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item prop="teacherRangeType">
+          <el-select
+            v-model.trim="searchForm.teacherRangeType"
+            clearable
+            filterable
+            placeholder="请选择适用老师"
+          >
+            <el-option value="ALL" label="全部"></el-option>
+            <el-option value="RANGE" label="部分"></el-option>
+            <el-option value="DISABLE" label="无"></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item prop="studentRangeType">
+          <el-select
+            v-model.trim="searchForm.studentRangeType"
+            clearable
+            filterable
+            placeholder="请选择适用学生"
+          >
+            <el-option value="ALL" label="全部"></el-option>
+            <el-option value="DISABLE" label="无"></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item prop="enable">
+          <el-select
+            v-model.trim="searchForm.enable"
+            clearable
+            filterable
+            placeholder="请选择状态"
+          >
+            <el-option value="item.value" label="item.label"></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item>
+          <el-button native-type="submit" type="primary">搜索</el-button>
+          <el-button native-type="reset" type="danger">重置</el-button>
+        </el-form-item>
+      </save-form>
       <el-button
         type="primary"
         style="margin-bottom:20px"
@@ -46,6 +106,38 @@
             label="课时数"
             prop="courseNum"
           ></el-table-column>
+          <el-table-column
+            align="center"
+            label="适用老师"
+            prop="teacherRangeType"
+          >
+             <template slot-scope="scope">
+              <span v-if="scope.row.subjectName">{{
+                scope.row.teacherRangeType | rangeType
+              }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column
+            align="center"
+            label="适用学生"
+            prop="studentRangeType"
+          >
+            <template slot-scope="scope">
+              <span v-if="scope.row.subjectName">{{
+                scope.row.studentRangeType | rangeType
+              }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column
+            align="center"
+            label="添加时间"
+            prop="createTime"
+          ></el-table-column>
+          <el-table-column
+            align="center"
+            label="添加人"
+            prop="createName"
+          ></el-table-column>
           <el-table-column align="center" label="状态">
             <template slot-scope="scope">
               <el-tag :type="scope.row.enable ? '' : 'danger'">{{
@@ -62,6 +154,9 @@
                 @click="coursewareOperation('update', scope.row)"
                 >修改</el-button
               >
+              <el-button v-permission="'lessonCourseware/updateRangeType'" type="text" @click="onAuth(scope.row)"
+                >适用权限</el-button
+              >
               <el-button
                 v-permission="'lessonCourseware/updateEnableFlag'"
                 type="text"
@@ -127,11 +222,31 @@
         @getList="getList"
       />
     </el-dialog>
+
+    <el-dialog
+      :title="'适用权限'"
+      :visible.sync="updateAuth"
+      v-if="updateAuth"
+      :close-on-click-modal="false"
+      width="500px"
+    >
+      <applyAuth
+        :detail.sync="rowDetail"
+        v-if="updateAuth"
+        @close="
+          () => {
+            updateAuth = false;
+          }
+        "
+        @getList="getList"
+      />
+    </el-dialog>
   </div>
 </template>
 <script>
 import pagination from "@/components/Pagination/index";
 import addCourseware from "./add-courseware.vue";
+import applyAuth from "./apply-auth.vue";
 import updateCourseware from "./update-courseware.vue";
 import {
   queryLessonCourseware,
@@ -139,11 +254,17 @@ import {
   updateEnableFlag
 } from "./api";
 export default {
-  components: { pagination, addCourseware, updateCourseware },
+  components: { pagination, addCourseware, updateCourseware, applyAuth },
   name: "helpCategory",
   data() {
     return {
       tableList: [],
+      searchForm: {
+        subjectId: null,
+        teacherRangeType: null,
+        studentRangeType: null,
+        enable: null
+      },
       pageInfo: {
         // 分页规则
         limit: 10, // 限制显示条数
@@ -154,10 +275,12 @@ export default {
       formActionTitle: "create",
       coursewareStatus: false,
       updateStatus: false,
+      updateAuth: false,
       rowDetail: {}
     };
   },
   mounted() {
+    this.$store.dispatch("setSubjects");
     this.getList();
   },
   methods: {
@@ -165,6 +288,10 @@ export default {
       this.pageInfo.page = 1;
       this.getList();
     },
+    onReSet() {
+      this.$refs.searchForm.resetFields();
+      this.search();
+    },
     onChangeStatus(row) {
       //
       this.$confirm(`是否${row.enable ? "停用" : "启用"}该课件?`, "提示", {
@@ -201,6 +328,7 @@ export default {
     },
     async getList() {
       let params = {
+        ...this.searchForm,
         page: this.pageInfo.page,
         rows: this.pageInfo.limit
       };
@@ -220,6 +348,10 @@ export default {
         this.updateStatus = true;
         this.rowDetail = row || {};
       }
+    },
+    onAuth(row) {
+      this.updateAuth = true;
+      this.rowDetail = row || {}
     }
   }
 };

+ 1 - 1
vue.config.js

@@ -19,7 +19,7 @@ const name = defaultSettings.title || "管乐迷后台管理系统"; // page tit
 // let target = 'http://192.168.3.20:8000' //邹璇
 // let target = "http://192.168.0.127:8000"; //勇哥
 // let target = "http://192.168.3.14:8005"; // 原谅
-let target = "https://test.gym.lexiaoya.cn"; //测试环境
+let target = "https://dev.gym.lexiaoya.cn"; //测试环境
 // All configuration item explanations can be find in https://cli.vuejs.org/config/
 module.exports = {
   /**