Browse Source

Merge branch '01/21VipReset'

lex-xin 4 years ago
parent
commit
af8538533b

+ 161 - 122
src/layout/components/Navbar.vue

@@ -4,217 +4,256 @@
 
     <!-- <breadcrumb class="breadcrumb-container" /> -->
     <div class="left-menu">
-      <i class='el-icon-location-information topIcon'></i>
+      <i class="el-icon-location-information topIcon"></i>
 
-      <el-popover placement="top-start"
-                  width="300"
-                  trigger="hover">
+      <el-popover placement="top-start" width="300" trigger="hover">
         <div class="popover-container">
           <!-- <p style="color: red">{{ organName }}</p> -->
-          <el-tag class="navbar_tag" type="info" v-for="item in organNameList" :key="item">{{ item }}</el-tag>
+          <el-tag
+            class="navbar_tag"
+            type="info"
+            v-for="item in organNameList"
+            :key="item"
+            >{{ item }}</el-tag
+          >
         </div>
-        <span slot="reference">{{ organName.length > 10 ? organName.substr(0, 10) + '...' : organName}}</span>
+        <span slot="reference">{{
+          organName.length > 10 ? organName.substr(0, 10) + "..." : organName
+        }}</span>
       </el-popover>
     </div>
     <div class="right-menu">
-      <div class="msginfo"
-           v-permission="'/journals'"
-           @click="gotoRecode">
-       <img src='@/assets/images/base/base-bell.svg'/>
+      <div class="msginfo" v-permission="'/journals'" @click="gotoRecode">
+        <img src="@/assets/images/base/base-bell.svg" />
         <!-- <div class="active"></div> -->
       </div>
-      <el-dropdown class="avatar-container"
-                   trigger="click">
-
+      <el-dropdown class="avatar-container" trigger="click">
         <div class="avatar-wrapper">
-          <img v-if="$store.getters.avatar"
-               :src="$store.getters.avatar"
-               class="user-avatar" />
-          <img v-else
-          class="user-avatar"
-               src="@/assets/images/base/placehorder-icon.png" />
+          <img
+            v-if="$store.getters.avatar"
+            :src="$store.getters.avatar"
+            class="user-avatar"
+          />
+          <img
+            v-else
+            class="user-avatar"
+            src="@/assets/images/base/placehorder-icon.png"
+          />
           <!-- <i class="el-icon-caret-bottom" /> -->
           <span>{{ username }}</span>
         </div>
-        <el-dropdown-menu slot="dropdown"
-                          class="user-dropdown">
+        <el-dropdown-menu slot="dropdown" class="user-dropdown">
           <!-- divided -->
 
           <el-dropdown-item>
-            <span style="display:block;"
-                  @click="resetPassWord">修改密码</span>
+            <span style="display: block" @click="resetPassWord">修改密码</span>
           </el-dropdown-item>
           <el-dropdown-item>
-            <span style="display:block;"
-                  @click="logout">退出</span>
+            <span style="display: block" @click="logout">退出</span>
           </el-dropdown-item>
         </el-dropdown-menu>
-
       </el-dropdown>
     </div>
-    <el-dialog title="修改密码"
-               width="500px"
-               append-to-body
-               :visible.sync="resetVisible">
-      <el-form :model="resetForm"
-               label-position='right'
-               label-width="100px"
-               ref='pwdForm'>
-        <el-form-item label="手机号"
-                      prop="phone">
-          <div>{{this.$store.getters.phone}}</div>
+    <el-dialog
+      title="修改密码"
+      width="500px"
+      append-to-body
+      :visible.sync="resetVisible"
+    >
+      <el-form
+        :model="resetForm"
+        label-position="right"
+        label-width="100px"
+        ref="pwdForm"
+      >
+        <el-form-item label="手机号" prop="phone">
+          <div>{{ this.$store.getters.phone }}</div>
         </el-form-item>
-        <el-form-item label="新密码"
-                      :rules="[{ required: true, message: '密码不能为空',trigger: 'blur'},{pattern:/^[\w]{6,20}$/,message:'密码为6-20位',trigger: 'blur'}]"
-                      prop="password">
-          <el-input v-model.trim="resetForm.password"
-                    type='password'
-                    style="width:180px"
-                    autocomplete="off"></el-input>
+        <el-form-item
+          label="新密码"
+          :rules="[
+            { required: true, message: '密码不能为空', trigger: 'blur' },
+            {
+              pattern: /^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,20}$/,
+              message: '密码为6-20位数字和字母组合',
+              trigger: 'blur',
+            },
+          ]"
+          prop="password"
+        >
+          <el-input
+            v-model.trim="resetForm.password"
+            type="password"
+            style="width: 180px"
+            autocomplete="off"
+          ></el-input>
         </el-form-item>
-        <el-form-item label="再次输入"
-                      :rules="[{ required: true, message: '密码不能为空',trigger: 'blur'},{pattern:/^[\w]{6,20}$/,message:'密码为6-20位',trigger: 'blur'}]"
-                      prop="password2">
-          <el-input v-model.trim="resetForm.password2"
-                    type='password'
-                    style="width:180px"
-                    autocomplete="off"></el-input>
+        <el-form-item
+          label="再次输入"
+          :rules="[
+            { required: true, message: '密码不能为空', trigger: 'blur' },
+            {
+              pattern: /^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,20}$/,
+              message: '密码为6-20位数字和字母组合',
+              trigger: 'blur',
+            },
+          ]"
+          prop="password2"
+        >
+          <el-input
+            v-model.trim="resetForm.password2"
+            type="password"
+            style="width: 180px"
+            autocomplete="off"
+          ></el-input>
         </el-form-item>
-        <el-form-item label="验证码"
-                      :rules="[{ required: true, message: '验证码不能为空',trigger: 'blur'}]"
-                      prop="authCode"
-                      style="">
-          <el-input v-model.trim="resetForm.authCode"
-                    style="width:180px"
-                    autocomplete="off"></el-input>
-          <el-button :disabled="isDisable"
-                     @click="getCode">{{ btnName }}</el-button>
+        <el-form-item
+          label="验证码"
+          :rules="[
+            { required: true, message: '验证码不能为空', trigger: 'blur' },
+          ]"
+          prop="authCode"
+          style=""
+        >
+          <el-input
+            v-model.trim="resetForm.authCode"
+            style="width: 180px"
+            autocomplete="off"
+          ></el-input>
+          <el-button :disabled="isDisable" @click="getCode">{{
+            btnName
+          }}</el-button>
         </el-form-item>
       </el-form>
-      <div slot="footer"
-           class="dialog-footer">
+      <div slot="footer" class="dialog-footer">
         <el-button @click="resetVisible = false">取 消</el-button>
-        <el-button type="primary"
-                   @click="submitResetPassWord">确 定</el-button>
+        <el-button type="primary" @click="submitResetPassWord">确 定</el-button>
       </div>
     </el-dialog>
   </div>
 </template>
 
 <script>
-import qs from 'qs'
-import axios from 'axios'
+import qs from "qs";
+import axios from "axios";
 import { mapGetters } from "vuex";
 // import Breadcrumb from '@/components/Breadcrumb'
 // import Hamburger from '@/components/Hamburger'
-import { resetPassword } from '@/api/buildTeam'
+import { resetPassword } from "@/api/buildTeam";
 export default {
-  data () {
+  data() {
     return {
-      username: '',
+      username: "",
       organName: this.$store.getters.organName,
       organNameList: [],
       resetVisible: false,
       resetForm: {
-        phone: '',
-        authCode: '',
-        password: '',
-        password2: ''
+        phone: "",
+        authCode: "",
+        password: "",
+        password2: "",
       },
       isDisable: false, // 是否允许发送验证码
       timerCount: 60,
-      btnName: '获取验证码'
-    }
+      btnName: "获取验证码",
+    };
   },
   components: {
     // Breadcrumb,
     // Hamburger
   },
   computed: {
-    ...mapGetters(["sidebar", "avatar"])
+    ...mapGetters(["sidebar", "avatar"]),
   },
-  mounted () {
+  mounted() {
     // 手动加入
     this.toggleSideBar();
     this.username = this.$store.getters.name;
-    this.organNameList = this.organName.split(',')
+    this.organNameList = this.organName.split(",");
   },
   methods: {
-    toggleSideBar () {
+    toggleSideBar() {
       this.$store.dispatch("app/toggleSideBar");
     },
-    async logout () {
+    async logout() {
       await this.$store.dispatch("user/logout");
       // await this.$store.dispatch("permission/removePermission")
       this.$router.push(`/login`);
-      window.location.reload()
-
+      window.location.reload();
     },
-    gotoRecode () {
-      this.$router.push('/journal/journal')
+    gotoRecode() {
+      this.$router.push("/journal/journal");
     },
-    resetPassWord () {
+    resetPassWord() {
       this.resetVisible = true;
     },
-    submitResetPassWord () {
+    submitResetPassWord() {
       if (this.resetForm.password !== this.resetForm.password2) {
-        this.$message.error('两次密码必须相同')
-        return
+        this.$message.error("两次密码必须相同");
+        return;
       }
-      this.$refs['pwdForm'].validate(res => {
+      this.$refs["pwdForm"].validate((res) => {
         if (res) {
           // 发请求
-          resetPassword({ authCode: this.resetForm.authCode, mobile: this.$store.getters.phone, newPassword: this.resetForm.password }).then(res => {
+          resetPassword({
+            authCode: this.resetForm.authCode,
+            mobile: this.$store.getters.phone,
+            newPassword: this.resetForm.password,
+          }).then((res) => {
             if (res.code == 200) {
               // 修改成功
-              this.$message.success('修改成功')
-              this.logout()
+              this.$message.success("修改成功");
+              this.logout();
             }
-          })
+          });
         }
-      })
+      });
     },
-    getCode () {
+    getCode() {
       // 获取验证码
       if (!this.$store.getters.phone) {
-        this.$message.error('请输入正确的手机号')
-        return
+        this.$message.error("请输入正确的手机号");
+        return;
       }
       if (!this.isDisable) {
         this.isDisable = true;
         // 发请求成功后开启定时器
         // 发送验证码
-        axios.post('/api-web/code/sendSms', qs.stringify({ mobile: this.$store.getters.phone })).then(res => {
-          if (res.data.code == 200) {
-            let timer = setInterval(res => {
-              if (this.timerCount <= 0) {
-                clearInterval(timer)
-                this.isDisable = false;
-                this.btnName = '获取验证码';
-                this.timerCount = 60;
-              } else {
-                this.timerCount--;
-                this.btnName = `${this.timerCount}s后重试`
-              }
-            }, 1000)
-          }
-        })
-
+        axios
+          .post(
+            "/api-web/code/sendSms",
+            qs.stringify({ mobile: this.$store.getters.phone })
+          )
+          .then((res) => {
+            if (res.data.code == 200) {
+              let timer = setInterval((res) => {
+                if (this.timerCount <= 0) {
+                  clearInterval(timer);
+                  this.isDisable = false;
+                  this.btnName = "获取验证码";
+                  this.timerCount = 60;
+                } else {
+                  this.timerCount--;
+                  this.btnName = `${this.timerCount}s后重试`;
+                }
+              }, 1000);
+            }
+          });
       }
-    }
+    },
   },
   watch: {
-    resetVisible (val) {
+    resetVisible(val) {
       if (!val) {
         this.resetForm = {
-          phone: '',
-          authCode: '',
-          password: '',
-          password2: ''
-        }
+          phone: "",
+          authCode: "",
+          password: "",
+          password2: "",
+        };
       }
-    }
-  }
+    },
+  },
 };
 </script>
 

+ 1 - 1
src/store/modules/tagsView.js

@@ -5,7 +5,7 @@ const tagsView = {
   },
   mutations: {
     ADD_VISITED_VIEWS: (state, view) => {
-      // console.log(view)
+      console.log(view)
       if (state.visitedViews.some(v => v.path === view.path)) {
         state.visitedViews.forEach(v => {
           if (v.path === view.path) {

+ 10 - 9
src/views/stuRecodeManager/index.vue

@@ -305,15 +305,7 @@
             </template>
           </el-table-column>
         </el-table>
-        <el-dialog title="新增回访" width="500px" :visible.sync="visitVisible">
-          <visit
-            v-if="visitVisible && detail"
-            :detail="detail"
-            :username="detail.username"
-            @close="visitVisible = false"
-            @submited="getList"
-          />
-        </el-dialog>
+
         <pagination
           sync
           :total.sync="rules.total"
@@ -322,6 +314,15 @@
           :page-sizes="rules.page_size"
           @pagination="getList"
         />
+            <el-dialog title="新增回访" width="500px" :visible.sync="visitVisible">
+          <visit
+            v-if="visitVisible && detail"
+            :detail="detail"
+            :username="detail.username"
+            @close="visitVisible = false"
+            @submited="getList"
+          />
+        </el-dialog>
       </div>
     </div>
   </div>

+ 7 - 6
src/views/studentManager/studentList.vue

@@ -572,10 +572,10 @@
           prop="password"
           label-width="120px"
           :rules="[
-            { required: true, message: '密码不能为空', trigger: 'blur' },
+             { required: true, message: '密码不能为空', trigger: 'blur' },
             {
-              pattern: /^[\w]{6,20}$/,
-              message: '密码为6-20位',
+              pattern: /^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,20}$/,
+              message: '密码为6-20位数字和字母组合',
               trigger: 'blur',
             },
           ]"
@@ -589,8 +589,8 @@
           :rules="[
             { required: true, message: '密码不能为空', trigger: 'blur' },
             {
-              pattern: /^[\w]{6,20}$/,
-              message: '密码为6-20位',
+              pattern: /^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,20}$/,
+              message: '密码为6-20位数字和字母组合',
               trigger: 'blur',
             },
           ]"
@@ -1032,7 +1032,8 @@ export default {
     lookContracts(row) {
       getLatest({ userId: row.userId }).then((res) => {
         if (res.code == 200) {
-          window.open(res.data.url);
+          window.location.href = res.data.url
+          // window.open(res.data.url);
         }
       });
     },

+ 4 - 4
src/views/teacherManager/teacherList.vue

@@ -322,8 +322,8 @@
           :rules="[
             { required: true, message: '密码不能为空', trigger: 'blur' },
             {
-              pattern: /^[\w]{6,20}$/,
-              message: '密码为6-20位',
+              pattern: /^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,20}$/,
+              message: '密码为6-20位数字和字母组合',
               trigger: 'blur',
             },
           ]"
@@ -337,8 +337,8 @@
           :rules="[
             { required: true, message: '密码不能为空', trigger: 'blur' },
             {
-              pattern: /^[\w]{6,20}$/,
-              message: '密码为6-20位',
+              pattern: /^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,20}$/,
+              message: '密码为6-20位数字和字母组合',
               trigger: 'blur',
             },
           ]"

+ 35 - 3
src/views/teamDetail/componentClass/calenderStudentList.vue

@@ -9,6 +9,19 @@
       :hideMoney="true"
     />
     <otherform :form="other" ref="other" />
+
+    <!-- <div v-for="(item,index) in conrseTypeList" :key="index" style="margin-bottom:30px">
+      <el-alert :title="getTypeName(item.courseType)" :closable="false" class="alert" type="info">
+      </el-alert>
+       <descriptions :column="2">
+        <descriptions-item label="原价:">
+          <el-input v-model="item.courseOriginalPrice" size='mini'></el-input>
+        </descriptions-item>
+      <descriptions-item label="现价:">
+             <el-input v-model="item.courseCurrentPrice" size='mini'></el-input>
+      </descriptions-item>
+      </descriptions>
+    </div> -->
     <el-table
       :data="dataList"
       :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
@@ -39,13 +52,13 @@
       </el-table-column>
       <el-table-column align="center" label="现价">
         <template slot-scope="scope">
-          <div >
+          <div>
             <div
               class="courseDiv"
               v-for="(item, index) in scope.row.courseList"
               :key="index"
             >
-              <el-input v-model="item.courseCurrentPrice"></el-input>
+              <el-input v-model="item.courseCurrentPrice" size='mini'></el-input>
             </div>
           </div>
         </template>
@@ -58,7 +71,7 @@
               v-for="(item, index) in scope.row.courseList"
               :key="index"
             >
-              <el-input v-model="item.courseOriginalPrice"></el-input>
+              <el-input v-model="item.courseOriginalPrice" size='mini'></el-input>
             </div>
           </div>
         </template>
@@ -67,10 +80,14 @@
   </div>
 </template>
 <script>
+import Vue from "vue";
 import paymentCycle from "@/views/resetTeaming/modals/payment-cycle";
 import otherform from "@/views/resetTeaming/modals/other";
 import { getTimes } from "@/utils";
 import { spanGroupMergeClassSplitClassAffirm } from "@/api/buildTeam";
+import {filterCourseType} from "@/constant"
+import descriptions from "@/components/Descriptions";
+Vue.use(descriptions);
 export default {
   props: [
     "studentIds",
@@ -93,6 +110,7 @@ export default {
       },
       other: {},
       dataList: [],
+      conrseTypeList: [],
     };
   },
   mounted() {
@@ -216,7 +234,21 @@ export default {
         }
       });
       this.dataList = Object.values(data);
+      // this.getNewClassType(this.dataList[0]?.courseList);
+    },
+    getNewClassType(arr) {
+      console.log(this.$options)
+      this.conrseTypeList = arr.map((item) => {
+        return {
+          courseType: item.courseType,
+          courseCurrentPrice: item.courseCurrentPrice,
+          courseOriginalPrice: item.courseOriginalPrice,
+        };
+      });
     },
+    getTypeName(type){
+      return filterCourseType[type]
+    }
   },
 };
 </script>

+ 1 - 1
src/views/teamDetail/teamClassList.vue

@@ -18,7 +18,7 @@
             v-model.trim="searchForm.search"
             clearable
             @keyup.enter.native="search"
-            placeholder="请输入课班级编号"
+            placeholder="乐团&班级编号"
           ></el-input>
         </el-form-item>
         <el-form-item prop="organIdList">

+ 8 - 0
src/views/withdrawal-application/api.js

@@ -6,3 +6,11 @@ export const musicGroupQuitQeryPage = data => {
     params: data
   })
 }
+
+// 获取学生作业记录
+export const getStudentHomeWorks = data => {
+  return request({
+    url: '/api-web/webCurseHomework/getStudentHomeWorks',
+    params: data
+  })
+}

+ 175 - 0
src/views/withdrawal-application/modals/afterWork.vue

@@ -0,0 +1,175 @@
+<template>
+  <div>
+    <el-form :inline="true" :model="searchForm" ref='searchForm'>
+      <el-form-item prop="timer">
+        <el-date-picker
+          v-model.trim="searchForm.timer"
+          style="width: 400px"
+          type="daterange"
+          value-format="yyyy-MM-dd"
+          range-separator="至"
+          start-placeholder="布置开始日期"
+          end-placeholder="布置结束日期"
+          :picker-options="{
+            firstDayOfWeek: 1,
+          }"
+        ></el-date-picker>
+      </el-form-item>
+      <el-form-item prop="status">
+        <el-select placeholder="是否提交" v-model="searchForm.status" clearable>
+          <el-option label="是" value="1"></el-option>
+          <el-option label="否" value="0"></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item prop="isReplied">
+        <el-select
+          placeholder="是否评价"
+          v-model="searchForm.isReplied"
+          clearable
+        >
+          <el-option label="是" value="1"></el-option>
+          <el-option label="否" value="0"></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="danger" @click="search">搜索</el-button>
+        <el-button type="primary" @click="onReset">重置</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="createTime"
+        label="布置时间"
+        width="150"
+      >
+        <template slot-scope="scope">{{
+          scope.row.createTime | dateForMinFormat
+        }}</template>
+      </el-table-column>
+      <el-table-column
+        align="center"
+        prop="teacherName"
+        label="布置老师"
+      ></el-table-column>
+      <el-table-column align="center" prop="title" label="训练标题">
+        <template slot-scope="scope">
+          <div>
+            <div >
+                <overflow-text :text="scope.row.title" :width="'100%'"></overflow-text>
+            </div>
+          </div>
+        </template>
+      </el-table-column>
+            <el-table-column align="center" prop="title" label="训练内容">
+        <template slot-scope="scope">
+          <div>
+            <div >
+                 <overflow-text :text="scope.row.content" :width="'100%'"></overflow-text>
+            </div>
+          </div>
+        </template>
+      </el-table-column>
+      <!-- content -->
+      <el-table-column align="center" label="是否提交">
+        <template slot-scope="scope">
+          <div>{{ scope.row.status ? "是" : "否" }}</div>
+        </template>
+      </el-table-column>
+            <el-table-column align="center" prop="isView" label="是否查看">
+        <template slot-scope="scope">
+          <div>{{ scope.row.isView ? "是" : "否" }}</div>
+        </template>
+      </el-table-column>
+      <el-table-column align="center" prop="isReplied" label="是否评价">
+        <template slot-scope="scope">
+          <div>{{ scope.row.isReplied ? "是" : "否" }}</div>
+        </template>
+      </el-table-column>
+      <!-- <el-table-column align="center"
+                           label="操作"
+                           fixed="right">
+            <template slot-scope="scope">
+              <div>
+                <el-button type="text"
+                           v-permission="'afterWorkList/look'"
+                           @click="lookDetail(scope.row)">查看</el-button>
+              </div>
+            </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 { getTimes } from "@/utils";
+import pagination from "@/components/Pagination/index";
+import { extracurricularExercisesReply } from "@/api/afterSchool";
+import dayjs from 'dayjs'
+export default {
+  props: ["studentId"],
+  components: { pagination },
+  data() {
+    return {
+      searchForm: {
+        search: "",
+        timer: [],
+        status: null,
+        isReplied: null,
+        isRepliedTimely: null,
+        isView: null,
+      },
+      rules: {
+        // 分页规则
+        limit: 10, // 限制显示条数
+        page: 1, // 当前页
+        total: 0, // 总条数
+        page_size: [10, 20, 40, 50], // 选择限制显示条数
+      },
+      tableList: [],
+    };
+  },
+  mounted() {
+    if (this.searchForm.timer?.length < 1) {
+      this.searchForm.timer = [dayjs(new Date().setDate(1)).format('YYYY-MM-DD'), dayjs(new Date()).format('YYYY-MM-DD')];
+    }
+    this.searchForm.search = this.studentId;
+    this.getList()
+  },
+  methods: {
+    onReset() {
+      this.$refs.searchForm.resetFields()
+      this.search()
+    },
+    search(){
+      this.rules.page =1;
+      this.getList()
+    },
+    getList() {
+      const { timer, ...rest } = this.searchForm;
+      let obj = {
+        ...rest,
+        page: this.rules.page,
+        rows: this.rules.limit,
+        ...getTimes(timer, ["submitStartTime", "submitEndTime"], "YYYY-MM-DD"),
+      };
+      extracurricularExercisesReply(obj).then((res) => {
+        if (res.code == 200) {
+          this.tableList = res.data.rows;
+          this.rules.total = res.data.total;
+        }
+      });
+    },
+  },
+};
+</script>

+ 183 - 0
src/views/withdrawal-application/modals/courseWork.vue

@@ -0,0 +1,183 @@
+<template>
+  <div>
+    <el-form :inline="true" :model="searchForm" ref="searchForm">
+      <el-form-item>
+        <el-date-picker
+          v-model.trim="searchForm.courseTimer"
+          style="width: 400px"
+          type="daterange"
+          value-format="yyyy-MM-dd"
+          range-separator="至"
+          start-placeholder="上课开始日期"
+          end-placeholder="上课结束日期"
+          :picker-options="{
+            firstDayOfWeek: 1,
+          }"
+        ></el-date-picker>
+      </el-form-item>
+      <el-form-item prop="status">
+        <el-select placeholder="是否提交" v-model="searchForm.status" clearable>
+          <el-option label="是" value="1"></el-option>
+          <el-option label="否" value="0"></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item prop="isReplied">
+        <el-select
+          placeholder="是否评价"
+          v-model="searchForm.isReplied"
+          clearable
+        >
+          <el-option label="是" value="1"></el-option>
+          <el-option label="否" value="0"></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="courseScheduleId"
+            label="课程编号"
+          ></el-table-column>
+          <el-table-column
+            align="center"
+            prop="courseName"
+            label="课程名称"
+          ></el-table-column>
+            <el-table-column
+            align="center"
+            prop="groupName"
+            label="课程组名称"
+          >
+          <template slot-scope="scope">
+            <div>
+               <overflow-text :text="scope.row.groupName" :width="'100%'"></overflow-text>
+            </div>
+          </template>
+          </el-table-column>
+      <el-table-column
+        align="center"
+        prop="createTime"
+        label="布置时间"
+        width="150"
+      >
+        <template slot-scope="scope">{{
+          scope.row.createTime | dateForMinFormat
+        }}</template>
+      </el-table-column>
+      <el-table-column
+        align="center"
+        prop="teacherName"
+        label="布置老师"
+      ></el-table-column>
+      <el-table-column align="center" prop="title" label="作业内容">
+        <template slot-scope="scope">
+          <div>
+             <overflow-text :text="scope.row.content" :width="'100%'"></overflow-text>
+          </div>
+        </template>
+      </el-table-column>
+      <!-- content -->
+      <el-table-column align="center" label="是否提交">
+        <template slot-scope="scope">
+          <div>{{ scope.row.status ? "是" : "否" }}</div>
+        </template>
+      </el-table-column>
+      <el-table-column align="center" prop="isView" label="是否查看">
+        <template slot-scope="scope">
+          <div>{{ scope.row.isView ? "是" : "否" }}</div>
+        </template>
+      </el-table-column>
+           <el-table-column align="center" prop="isReplied" label="是否评价">
+        <template slot-scope="scope">
+          <div>{{ scope.row.isReplied ? "是" : "否" }}</div>
+        </template>
+      </el-table-column>
+      <!-- <el-table-column align="center"
+                           label="操作"
+                           fixed="right">
+            <template slot-scope="scope">
+              <div>
+                <el-button type="text"
+                           v-permission="'afterWorkList/look'"
+                           @click="lookDetail(scope.row)">查看</el-button>
+              </div>
+            </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 { getTimes } from "@/utils";
+import { getStudentHomeWorks } from "../api";
+import dayjs from "dayjs";
+export default {
+  props:['studentId'],
+  components: { pagination },
+  data() {
+    return {
+      searchForm: {
+        courseTimer: [],
+        status: "",
+        isReplied: "",
+        userId: "",
+      },
+      tableList: [],
+      rules: {
+        // 分页规则
+        limit: 10, // 限制显示条数
+        page: 1, // 当前页
+        total: 0, // 总条数
+        page_size: [10, 20, 40, 50], // 选择限制显示条数
+      },
+    };
+  },
+  mounted() {
+        if (this.searchForm.courseTimer?.length < 1) {
+      this.searchForm.courseTimer = [dayjs(new Date().setDate(1)).format('YYYY-MM-DD'), dayjs(new Date()).format('YYYY-MM-DD')];
+    }
+    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 { courseTimer, ...rest } = this.searchForm;
+      let obj = {
+        ...rest,
+        page: this.rules.page,
+        rows: this.rules.limit,
+        ...getTimes(courseTimer, ["startTime", "endTime"], "YYYY-MM-DD"),
+      };
+      try {
+        const ruselt = await getStudentHomeWorks(obj);
+        this.tableList = ruselt.data.rows;
+      } catch {}
+    },
+  },
+};
+</script>

+ 178 - 0
src/views/withdrawal-application/modals/record.vue

@@ -0,0 +1,178 @@
+<template>
+  <div>
+    <el-form :inline="true" ref="searchForm" :model="searchForm">
+      <el-form-item prop="dates">
+        <el-date-picker
+          v-model="searchForm.dates"
+          type="daterange"
+          style="width: 405px"
+          range-separator="至"
+          start-placeholder="课程开始日期"
+          end-placeholder="课程结束日期"
+        >
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item prop="groupType">
+        <el-select
+          v-model.trim="searchForm.groupType"
+          placeholder="请选择课程组类型"
+        >
+          <el-option
+            v-for="(item, index) in courseListType"
+            :key="index"
+            :value="item.value"
+            :label="item.label"
+          ></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item prop="status">
+        <el-select
+          v-model.trim="searchForm.status"
+          placeholder="请选择考勤状态"
+          clearable
+        >
+          <el-option
+            v-for="(item, index) in attendanceStatus"
+            :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="courseScheduleId" label="课程编号">
+        <template slot-scope="scope">
+          <div>
+            <copy-text>{{ scope.row.courseScheduleId }}</copy-text>
+          </div>
+        </template>
+      </el-table-column>
+
+      <el-table-column
+        align="center"
+        prop="courseSchedule.name"
+        label="课程名称"
+      ></el-table-column>
+
+      <el-table-column
+        width="180px"
+        align="center"
+        prop="startClassTime"
+        label="上课时间"
+      >
+        <template slot-scope="scope">
+          <div>
+            {{ scope.row.courseSchedule.classDate | dayjsFormat }}
+            {{ scope.row.courseSchedule.startClassTime | dayjsFormatMinute }}-{{
+              scope.row.courseSchedule.endClassTime | dayjsFormatMinute
+            }}
+          </div>
+        </template>
+      </el-table-column>
+      <el-table-column align="center" prop="startClassTime" label="课程组类型">
+        <template slot-scope="scope">
+          <div>
+            {{ scope.row.groupType | coursesType }}
+          </div>
+        </template>
+      </el-table-column>
+      <el-table-column align="center" prop="startClassTime" label="课程类型">
+        <template slot-scope="scope">
+          <div>
+            {{ scope.row.courseSchedule.type | coursesType }}
+          </div>
+        </template>
+      </el-table-column>
+      <el-table-column align="center" label="考勤状态">
+        <template slot-scope="scope">
+          <div>
+            {{ scope.row.status | clockingIn }}
+          </div>
+        </template>
+      </el-table-column>
+    </el-table>
+    <pagination
+      :total.sync="rules.total"
+      :page.sync="rules.page"
+      :limit.sync="rules.limit"
+      :page-sizes="rules.page_size"
+      @pagination="getList"
+    />
+  </div>
+</template>
+<script>
+import { courseListType, stuAttendance } from "@/utils/searchArray";
+import pagination from "@/components/Pagination/index";
+import { findStudentAttendance } from "@/api/buildTeam";
+import { getTimes } from "@/utils";
+export default {
+  components: { pagination },
+  props:['studentId'],
+  data() {
+    return {
+      searchForm: {
+        studentID: "",
+        groupType: "",
+        status: "",
+        dates: [],
+      },
+      courseListType,
+      attendanceStatus: stuAttendance,
+      rules: {
+        // 分页规则
+        limit: 10, // 限制显示条数
+        page: 1, // 当前页
+        total: 0, // 总条数
+        page_size: [10, 20, 40, 50], // 选择限制显示条数
+      },
+      tableList: [],
+    };
+  },
+  mounted() {
+    this.searchForm.studentID = this.studentId
+    if (this.searchForm.dates?.length < 1) {
+      this.searchForm.dates = [new Date().setDate(1), new Date()];
+    }
+    this.init();
+  },
+  methods: {
+    init(){
+      this.getList()
+    },
+    search() {
+      this.rules.page =1;
+      this.getList()
+    },
+    onReSet() {
+      this.$refs["searchForm"].resetFields();
+      this.search();
+    },
+    getList() {
+      const { dates, ...rest } = this.searchForm;
+      let obj =  {
+        ...rest,
+        page: this.rules.page,
+        rows: this.rules.limit,
+        ...getTimes(dates, ["startDateOfCourse", "endDateOfCourse"],  "YYYY-MM-DD"),
+      }
+       findStudentAttendance(obj).then((res) => {
+        if (res.code == 200) {
+          this.tableList = res.data.rows;
+          this.rules.total = res.data.total;
+        }
+      });
+    },
+  },
+};
+</script>
+<style lang="scss" scoped>
+</style>

+ 28 - 0
src/views/withdrawal-application/modals/studentWork.vue

@@ -0,0 +1,28 @@
+<template>
+  <div>
+      <el-tabs v-model="activeName" type="card">
+    <el-tab-pane label="课程作业" name="first" lazy>
+      <courseWork  :studentId='studentId' v-if="studentId"/>
+    </el-tab-pane>
+    <el-tab-pane label="课外训练" name="second"  lazy>
+      <afterWork :studentId='studentId' v-if="studentId"/>
+    </el-tab-pane>
+
+  </el-tabs>
+  </div>
+</template>
+<script>
+import courseWork from './courseWork'
+import afterWork from './afterWork'
+export default {
+  props:['studentId'],
+  components:{courseWork,afterWork},
+  data(){
+    return{
+      activeName:'first'
+    }
+  },
+  mounted(){},
+  methods:{},
+}
+</script>

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

@@ -1,5 +1,9 @@
 <template>
   <div>
+    <div class="visitBtnWrap">
+      <el-button type="text" @click="recordVisible = true">学员考勤</el-button>
+      <el-button type="text" @click="workVisible=true">作业情况</el-button>
+    </div>
     <el-form
       :model="visitForm"
       label-width="120px"
@@ -54,18 +58,42 @@
         ></el-input>
       </el-form-item>
     </el-form>
-    <div slot="footer" class="dialog-footer" style="text-align: right;margin-right: 15%;">
+    <div
+      slot="footer"
+      class="dialog-footer"
+      style="text-align: right; margin-right: 15%"
+    >
       <el-button @click="$emit('close')">取 消</el-button>
       <el-button type="primary" @click="submitAddVisit">确 定</el-button>
     </div>
+    <el-dialog
+      title="学员考勤"
+      width="1020px"
+      :visible.sync="recordVisible"
+      append-to-body
+    >
+    <record  :studentId="this.detail.userId"/>
+    </el-dialog>
+
+    <el-dialog
+      title="作业列表"
+      width="1020px"
+      :visible.sync="workVisible"
+      append-to-body
+    >
+    <studentWork  :studentId="this.detail.userId"/>
+    </el-dialog>
   </div>
 </template>
 <script>
-import cleanDeep from 'clean-deep'
+import cleanDeep from "clean-deep";
 import { visitChiose } from "@/utils/searchArray";
-import { addVisit } from "@/views/returnVisitManager/api"
+import { addVisit } from "@/views/returnVisitManager/api";
+import record from './record'
+import studentWork from './studentWork'
 export default {
-  props: ['detail', 'username'],
+  props: ["detail", "username"],
+  components:{record,studentWork},
   data() {
     return {
       visitChiose,
@@ -86,7 +114,9 @@ export default {
         visitTime: [{ required: true, message: "请输入回访时间" }],
         visitType: [{ required: true, message: "请选择回访类型" }],
       },
-    }
+      recordVisible:false,
+      workVisible:false
+    };
   },
   computed: {
     userName() {
@@ -101,7 +131,7 @@ export default {
 
       this.$refs.visitForm.validate((res) => {
         if (res) {
-          const { visitType, ...rest } = this.visitForm
+          const { visitType, ...rest } = this.visitForm;
           const data = {
             ...rest,
             objectId: this.detail.id,
@@ -110,17 +140,25 @@ export default {
             studentId: this.studentId,
             type: visitType[0],
             purpose: visitType[1],
-          }
+          };
           addVisit(cleanDeep(data)).then((res) => {
             if (res.code === 200) {
               this.$message.success("新增成功");
-              this.$emit('close')
-              this.$emit('submited')
+              this.$emit("close");
+              this.$emit("submited");
             }
           });
         }
       });
     },
-  }
-}
+  },
+};
 </script>
+<style lang="scss" scoped>
+.visitBtnWrap {
+  position: absolute;
+  right: 90px;
+  top: 82px;
+  z-index: 20;
+}
+</style>