教师端1期问题修复

This commit is contained in:
赵依梦
2025-12-14 18:22:48 +08:00
parent 07506d0fff
commit bee726ebd2
2 changed files with 186 additions and 65 deletions

View File

@@ -19,6 +19,24 @@ Vue.use(vueKatexEs,{
} }
}) })
Vue.directive('limit-input', {
bind: function (el, binding) {
const max = binding.value || 50;
// 找到input元素
const input = el.querySelector('input');
if (input) {
// 监听input事件在输入时限制长度
input.addEventListener('input', function () {
if (input.value.length > max) {
input.value = input.value.substring(0, max);
// 触发input事件让element-ui的内部处理更新
input.dispatchEvent(new Event('input', { bubbles: true }));
}
});
}
}
});
//import './mock/index' //import './mock/index'
import xpage from '@/utils/xpage' import xpage from '@/utils/xpage'

View File

@@ -16,7 +16,17 @@
<el-tab-pane label="报名记录" name="second"> <el-tab-pane label="报名记录" name="second">
<el-row style="margin: 20px 0;" :gutter="20"> <el-row style="margin: 20px 0;" :gutter="20">
<el-col :span="4"> <el-col :span="4">
<div class="grid-content bg-purple"><el-input v-model="signup.name" clearable placeholder="姓名" maxlength="50" /></div> <div class="grid-content bg-purple">
<!-- <el-input v-model="signup.name" clearable placeholder="姓名" maxlength="50" /> -->
<el-select :key="2" style="width:100%" clearable multiple v-model="signup.aid" filterable
placeholder="姓名" v-limit-input="50" remote reserve-keyword :remote-method="initNameList"
:multiple-limit="5" :loading="nameListLoading">
<el-option v-for="item in nameList" :key="item.userId" :label="item.name" :value="item.userId">
<span>{{ item.name }}</span>
<span v-if="item.code" class="option-code">{{ item.code }}</span>
</el-option>
</el-select>
</div>
</el-col> </el-col>
<el-col :span="4"> <el-col :span="4">
<div class="grid-content bg-purple"> <div class="grid-content bg-purple">
@@ -49,7 +59,8 @@
<el-table-column prop="orgInfo" label="部门"> <el-table-column prop="orgInfo" label="部门">
<template slot-scope="scope"> <template slot-scope="scope">
<el-tooltip class="item" effect="dark" :content="scope.row.orgInfo" placement="top-start"> <el-tooltip class="item" effect="dark" :content="scope.row.orgInfo" placement="top-start">
<p class="no-wrap"> {{scope.row.orgInfo && scope.row.orgInfo.split('/')[scope.row.orgInfo.split('/').length - 1]}}</p> <p class="no-wrap">
{{scope.row.orgInfo && scope.row.orgInfo.split('/')[scope.row.orgInfo.split('/').length - 1]}}</p>
</el-tooltip> </el-tooltip>
</template> </template>
</el-table-column> </el-table-column>
@@ -72,12 +83,23 @@
<el-tab-pane label="学习记录" name="third"> <el-tab-pane label="学习记录" name="third">
<el-row style="margin-bottom: 20px;" :gutter="20"> <el-row style="margin-bottom: 20px;" :gutter="20">
<el-col :span="4"> <el-col :span="4">
<div class="grid-content bg-purple"><el-input clearable v-model="learningRecords.name" maxlength="50" <div class="grid-content bg-purple">
placeholder="姓名"></el-input></div> <!-- <el-input clearable v-model="learningRecords.name" maxlength="50"
placeholder="姓名"></el-input> -->
<el-select :key="1" style="width:100%" clearable multiple v-model="learningRecords.aid" filterable
placeholder="姓名" v-limit-input="50" reserve-keyword remote :remote-method="initNameList"
:multiple-limit="5" :loading="nameListLoading">
<el-option v-for="item in nameList" :key="item.userId" :label="item.name" :value="item.userId">
<span>{{ item.name }}</span>
<span v-if="item.code" class="option-code">{{ item.code }}</span>
</el-option>
</el-select>
</div>
</el-col> </el-col>
<el-col :span="4"> <el-col :span="4">
<div class="grid-content bg-purple"> <div class="grid-content bg-purple">
<el-select style="width: 100%;" v-model="learningRecords.status" clearable placeholder="全部学习状态"> <el-select style="width: 100%;" v-model="learningRecords.status" clearable placeholder="学习状态">
<el-option label="未开始" :value="1"></el-option> <el-option label="未开始" :value="1"></el-option>
<el-option label="进行中" :value="2"></el-option> <el-option label="进行中" :value="2"></el-option>
@@ -87,7 +109,8 @@
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<div :class="['grid-content', 'bg-purple', 'resetDatePicker', !studyDateTime||studyDateTime.length==0?'noSplitDatePicker':'']"> <div
:class="['grid-content', 'bg-purple', 'resetDatePicker', !studyDateTime||studyDateTime.length==0?'noSplitDatePicker':'']">
<el-date-picker value-format="yyyy-MM-dd" v-model="studyDateTime" type="daterange" align="right" <el-date-picker value-format="yyyy-MM-dd" v-model="studyDateTime" type="daterange" align="right"
unlink-panels range-separator="" start-placeholder="学习时长" :picker-options="pickerOptions"> unlink-panels range-separator="" start-placeholder="学习时长" :picker-options="pickerOptions">
</el-date-picker> </el-date-picker>
@@ -114,7 +137,8 @@
<el-table-column prop="orgInfo" label="部门"> <el-table-column prop="orgInfo" label="部门">
<template slot-scope="scope"> <template slot-scope="scope">
<el-tooltip class="item" effect="dark" :content="scope.row.orgInfo" placement="top-start"> <el-tooltip class="item" effect="dark" :content="scope.row.orgInfo" placement="top-start">
<p class="no-wrap">{{scope.row.orgInfo && scope.row.orgInfo.split('/')[scope.row.orgInfo.split('/').length - 1]}}</p> <p class="no-wrap">
{{scope.row.orgInfo && scope.row.orgInfo.split('/')[scope.row.orgInfo.split('/').length - 1]}}</p>
</el-tooltip> </el-tooltip>
</template> </template>
</el-table-column> </el-table-column>
@@ -245,14 +269,26 @@
<el-dialog title="学习详情" v-if="commonResourceStudyPeopleShow" :visible.sync="commonResourceStudyPeopleShow" <el-dialog title="学习详情" v-if="commonResourceStudyPeopleShow" :visible.sync="commonResourceStudyPeopleShow"
width="50%" :append-to-body="true"> width="50%" :append-to-body="true">
<el-row style="margin: 20px 0 20px -10px;" :gutter="20" v-if="rousourceRow.contentType == '60'"> <el-row style="margin: 20px 0 20px -10px;" :gutter="20">
<el-col :span="6"> <el-col :span="6">
<div class="grid-content bg-purple"><el-input v-model="commonResourceStudyPeopleQuery.name" clearable maxlength="50" <div class="grid-content bg-purple">
placeholder="姓名" /></div> <el-select :key="3" style="width:100%" clearable multiple v-model="commonResourceStudyPeopleQuery.aid"
filterable placeholder="姓名" v-limit-input="50" remote reserve-keyword :remote-method="initNameList"
:multiple-limit="5" :loading="nameListLoading">
<el-option v-for="item in nameList" :key="item.userId" :label="item.name" :value="item.userId">
<span>{{ item.name }}</span>
<span v-if="item.code" class="option-code">{{ item.code }}</span>
</el-option>
</el-select>
<!-- <el-input v-model="commonResourceStudyPeopleQuery.name" clearable
maxlength="50" placeholder="姓名" /> -->
</div>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<div class="grid-content bg-purple"> <div class="grid-content bg-purple">
<el-select style="width: 100%;" v-model="commonResourceStudyPeopleQuery.status" placeholder="完成状态" clearable> <el-select style="width: 100%;" v-model="commonResourceStudyPeopleQuery.status"
:placeholder="rousourceRow.contentType == '60' || rousourceRow.contentType == '62' ? '完成状态' : '学习状态'"
clearable>
<el-option label="未开始" :value="1"></el-option> <el-option label="未开始" :value="1"></el-option>
<el-option label="已完成" :value="2"></el-option> <el-option label="已完成" :value="2"></el-option>
<el-option label="进行中" :value="3"></el-option> <el-option label="进行中" :value="3"></el-option>
@@ -273,7 +309,8 @@
<el-table-column prop="orgInfo" label="部门"> <el-table-column prop="orgInfo" label="部门">
<template slot-scope="scope"> <template slot-scope="scope">
<el-tooltip class="item" effect="dark" :content="scope.row.orgInfo" placement="top-start"> <el-tooltip class="item" effect="dark" :content="scope.row.orgInfo" placement="top-start">
<p class="no-wrap">{{scope.row.orgInfo && scope.row.orgInfo.split('/')[scope.row.orgInfo.split('/').length - 1]}}</p> <p class="no-wrap">
{{scope.row.orgInfo && scope.row.orgInfo.split('/')[scope.row.orgInfo.split('/').length - 1]}}</p>
</el-tooltip> </el-tooltip>
</template> </template>
</el-table-column> </el-table-column>
@@ -290,7 +327,7 @@
</template> </template>
</el-table-column> </el-table-column>
<el-table-column v-if="rousourceRow.contentType == '62'" prop="studyAssesses[0].asScore" <el-table-column v-if="rousourceRow.contentType == '62'" prop="studyAssesses[0].asScore"
label="满意度分"></el-table-column> label="满意度分"></el-table-column>
<el-table-column prop="finishTime" width="200" label="完成时间"></el-table-column> <el-table-column prop="finishTime" width="200" label="完成时间"></el-table-column>
</el-table> </el-table>
<div style="text-align: center;padding: 10px;"> <div style="text-align: center;padding: 10px;">
@@ -309,12 +346,22 @@
:append-to-body="true"> :append-to-body="true">
<el-row style="margin: 20px 0 20px -10px;" :gutter="20"> <el-row style="margin: 20px 0 20px -10px;" :gutter="20">
<el-col :span="6"> <el-col :span="6">
<div class="grid-content bg-purple"><el-input v-model="examResourceStudyPeopleQuery.name" clearable maxlength="50" <div class="grid-content bg-purple">
placeholder="姓名" /></div> <el-select :key="4" style="width:100%" clearable multiple v-model="examResourceStudyPeopleQuery.aid"
filterable placeholder="姓名" v-limit-input="50" remote reserve-keyword :remote-method="initNameList"
:multiple-limit="5" :loading="nameListLoading">
<el-option v-for="item in nameList" :key="item.userId" :label="item.name" :value="item.userId">
<span>{{ item.name }}</span>
<span v-if="item.code" class="option-code">{{ item.code }}</span>
</el-option>
</el-select>
<!-- <el-input v-model="examResourceStudyPeopleQuery.name" clearable
maxlength="50" placeholder="姓名" /> -->
</div>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<div class="grid-content bg-purple"> <div class="grid-content bg-purple">
<el-select style="width: 100%;" v-model="examResourceStudyPeopleQuery.status" placeholder="完成状态" clearable> <el-select style="width: 100%;" v-model="examResourceStudyPeopleQuery.status" placeholder="考试状态" clearable>
<el-option label="未开始" :value="1"></el-option> <el-option label="未开始" :value="1"></el-option>
<el-option label="已完成" :value="2"></el-option> <el-option label="已完成" :value="2"></el-option>
<el-option label="进行中" :value="3"></el-option> <el-option label="进行中" :value="3"></el-option>
@@ -349,7 +396,8 @@
<el-table-column prop="orgInfo" label="部门"> <el-table-column prop="orgInfo" label="部门">
<template slot-scope="scope"> <template slot-scope="scope">
<el-tooltip class="item" effect="dark" :content="scope.row.orgInfo" placement="top-start"> <el-tooltip class="item" effect="dark" :content="scope.row.orgInfo" placement="top-start">
<p class="no-wrap">{{scope.row.orgInfo && scope.row.orgInfo.split('/')[scope.row.orgInfo.split('/').length - 1]}}</p> <p class="no-wrap">
{{scope.row.orgInfo && scope.row.orgInfo.split('/')[scope.row.orgInfo.split('/').length - 1]}}</p>
</el-tooltip> </el-tooltip>
</template> </template>
</el-table-column> </el-table-column>
@@ -368,7 +416,7 @@
layout="total, sizes, prev, pager, next, jumper" :total="examResourceStudyPeopleQuery.count"></el-pagination> layout="total, sizes, prev, pager, next, jumper" :total="examResourceStudyPeopleQuery.count"></el-pagination>
</div> </div>
<span slot="footer" class="dialog-footer"> <span slot="footer" class="dialog-footer">
<el-button @click="commonResourceStudyPeopleShow = false"> </el-button> <el-button @click="examResourceStudyPeopleShow = false"> </el-button>
<!-- <el-button type="primary" @click="study.detailShow = false">提交</el-button> --> <!-- <el-button type="primary" @click="study.detailShow = false">提交</el-button> -->
</span> </span>
</el-dialog> </el-dialog>
@@ -382,6 +430,7 @@ import {
// sysTypeList, // sysTypeList,
getType, getType,
} from "../../utils/tools.js"; } from "../../utils/tools.js";
import apiUserbasic from "@/api/boe/userbasic.js";
import apicourseStudy from "@/api/modules/courseStudy.js"; import apicourseStudy from "@/api/modules/courseStudy.js";
import apiCoursePortal from "@/api/modules/coursePortal.js"; import apiCoursePortal from "@/api/modules/coursePortal.js";
import { mapGetters, mapActions } from "vuex"; import { mapGetters, mapActions } from "vuex";
@@ -389,6 +438,7 @@ import apiUser from "@/api/system/user.js";
import apiStudy from "@/api/modules/courseStudy.js"; import apiStudy from "@/api/modules/courseStudy.js";
import { getToken } from "@/utils/token"; import { getToken } from "@/utils/token";
import axios from "axios"; import axios from "axios";
export default { export default {
computed: { computed: {
...mapGetters(["resOwnerMap", "sysTypeMap"]), ...mapGetters(["resOwnerMap", "sysTypeMap"]),
@@ -441,9 +491,6 @@ export default {
picker.$emit("pick", [start, end]); picker.$emit("pick", [start, end]);
}, },
}, },
], ],
}, },
studyDateTime: [], studyDateTime: [],
@@ -466,6 +513,7 @@ export default {
signup: { signup: {
name: "", name: "",
signType: "", signType: "",
aid: [],
}, },
courseType: courseType, courseType: courseType,
value: "", value: "",
@@ -490,6 +538,7 @@ export default {
status: "", status: "",
queryStartTime: "", queryStartTime: "",
queryFinishTime: "", queryFinishTime: "",
aid: [],
}, },
study: { study: {
detailType: "", detailType: "",
@@ -540,6 +589,7 @@ export default {
count: 0, count: 0,
name: "", name: "",
status: "", status: "",
aid: [],
}, },
examResourceStudyPeopleShow: false, examResourceStudyPeopleShow: false,
examResourceStudyPeopleList: [], examResourceStudyPeopleList: [],
@@ -549,7 +599,10 @@ export default {
count: 0, count: 0,
name: "", name: "",
status: "", status: "",
aid: [],
}, },
nameList: [],
nameListLoading: false,
}; };
}, },
mounted() { mounted() {
@@ -569,6 +622,40 @@ export default {
loadSysTypes: "sysType/loadSysTypes", loadSysTypes: "sysType/loadSysTypes",
}), }),
async initNameList(keyword) {
console.log("initNameList", keyword);
if (!keyword) {
return;
}
this.nameListLoading = true;
try {
const res = await apiUserbasic.selectUser(keyword);
this.nameListLoading = false;
if (res && res.status === 200) {
const resultList = res.result || [];
this.nameList = resultList
.map((item) => this.formatCreatorItem(item))
.filter((item) => item.userId);
} else {
this.creatorOptions = [];
}
} catch (error) {
this.nameList = [];
this.nameListLoading = false;
} finally {
this.nameListLoading = false;
}
},
formatCreatorItem(item = {}) {
return {
userId: item.id,
name: item.realName,
code: item.userNo,
};
},
resetCommonResourceQuery() { resetCommonResourceQuery() {
this.commonResourceStudyPeopleQuery = { this.commonResourceStudyPeopleQuery = {
pageIndex: 1, //第几页 pageIndex: 1, //第几页
@@ -576,8 +663,9 @@ export default {
count: 0, count: 0,
name: "", name: "",
status: "", status: "",
aid: [],
}; };
this.queryResourceStudyPeopleList() this.queryResourceStudyPeopleList();
}, },
resetExamCommonResourceQuery() { resetExamCommonResourceQuery() {
@@ -587,8 +675,9 @@ export default {
count: 0, count: 0,
name: "", name: "",
status: "", status: "",
aid: [],
}; };
this.queryExamStudyPeopleList() this.queryExamStudyPeopleList();
}, },
handleShowResourdeDetailList(row) { handleShowResourdeDetailList(row) {
@@ -600,6 +689,7 @@ export default {
count: 0, count: 0,
name: "", name: "",
status: "", status: "",
aid: [],
}; };
this.rousourceRow = row; this.rousourceRow = row;
if (row.contentType == "61") { if (row.contentType == "61") {
@@ -624,8 +714,9 @@ export default {
contentId: this.rousourceRow.contentId, contentId: this.rousourceRow.contentId,
pageIndex: this.examResourceStudyPeopleQuery.pageIndex, pageIndex: this.examResourceStudyPeopleQuery.pageIndex,
pageSize: this.examResourceStudyPeopleQuery.pageSize, pageSize: this.examResourceStudyPeopleQuery.pageSize,
name: this.examResourceStudyPeopleQuery.name, name: '',
status: this.examResourceStudyPeopleQuery.status, status: this.examResourceStudyPeopleQuery.status,
aid: this.examResourceStudyPeopleQuery.aid.join(","),
}) })
.then((res) => { .then((res) => {
if (res.status === 200) { if (res.status === 200) {
@@ -650,6 +741,9 @@ export default {
contentId: this.rousourceRow.contentId, contentId: this.rousourceRow.contentId,
pageIndex: this.commonResourceStudyPeopleQuery.pageIndex, pageIndex: this.commonResourceStudyPeopleQuery.pageIndex,
pageSize: this.commonResourceStudyPeopleQuery.pageSize, pageSize: this.commonResourceStudyPeopleQuery.pageSize,
name: "",
status: this.commonResourceStudyPeopleQuery.status,
aid: this.commonResourceStudyPeopleQuery.aid.join(","),
}) })
.then((res) => { .then((res) => {
if (res.status === 200) { if (res.status === 200) {
@@ -669,15 +763,16 @@ export default {
queryResourceStudyPeopleList() { queryResourceStudyPeopleList() {
console.log(this.rousourceRow); console.log(this.rousourceRow);
console.log(888) console.log(888);
apicourseStudy apicourseStudy
.studyContentRecords({ .studyContentRecords({
courseId: this.courseDetail.id, courseId: this.courseDetail.id,
contentId: this.rousourceRow.contentId, contentId: this.rousourceRow.contentId,
pageIndex: this.commonResourceStudyPeopleQuery.pageIndex, pageIndex: this.commonResourceStudyPeopleQuery.pageIndex,
pageSize: this.commonResourceStudyPeopleQuery.pageSize, pageSize: this.commonResourceStudyPeopleQuery.pageSize,
name: this.commonResourceStudyPeopleQuery.name, name: "",
status: this.commonResourceStudyPeopleQuery.status, status: this.commonResourceStudyPeopleQuery.status,
aid: this.commonResourceStudyPeopleQuery.aid.join(","),
}) })
.then((res) => { .then((res) => {
if (res.status === 200) { if (res.status === 200) {
@@ -770,23 +865,25 @@ export default {
}, },
resetResourseList() { resetResourseList() {
this.recourseListQuery.contentName = ""; this.recourseListQuery.contentName = "";
this.getResourseList() this.getResourseList();
}, },
resetStudyRecords() { resetStudyRecords() {
this.learningRecords.aid = [];
this.learningRecords.name = ""; this.learningRecords.name = "";
this.learningRecords.status = ""; this.learningRecords.status = "";
this.studyDateTime = []; this.studyDateTime = [];
this.learningRecords.queryStartTime = ""; this.learningRecords.queryStartTime = "";
this.learningRecords.queryFinishTime = ""; this.learningRecords.queryFinishTime = "";
this.getStudyRecords() this.getStudyRecords();
}, },
resetSignupList() { resetSignupList() {
this.signup = { this.signup = {
name: "", name: "",
signType: "", signType: "",
aid: [],
}; };
this.getSignupList() this.getSignupList();
}, },
resOwnerName(code) { resOwnerName(code) {
if (code == "") { if (code == "") {
@@ -876,7 +973,7 @@ export default {
this.recourseListQuery.pageIndex = 1; this.recourseListQuery.pageIndex = 1;
this.getResourseList(); this.getResourseList();
}, },
handleCurrentChangeRecourseList() { handleCurrentChangeRecourseList(val) {
this.recourseListQuery.pageIndex = val; this.recourseListQuery.pageIndex = val;
this.getResourseList(); this.getResourseList();
}, },
@@ -929,13 +1026,14 @@ export default {
courseId: this.courseDetail.id, //课程的id courseId: this.courseDetail.id, //课程的id
status: this.learningRecords.status, //状态 status: this.learningRecords.status, //状态
// courseType:this.learningRecords.type,//类型 // courseType:this.learningRecords.type,//类型
aname: this.learningRecords.name, //学习人的姓名 learningRecords aname: "", //学习人的姓名 learningRecords
pageIndex: this.learningRecords.pageIndex, pageIndex: this.learningRecords.pageIndex,
pageSize: this.learningRecords.pageSize, pageSize: this.learningRecords.pageSize,
queryStartTime: queryStartTime:
this.studyDateTime.length > 0 ? this.studyDateTime[0] : "", this.studyDateTime.length > 0 ? this.studyDateTime[0] : "",
queryFinishTime: queryFinishTime:
this.studyDateTime.length > 1 ? this.studyDateTime[1] : "", this.studyDateTime.length > 1 ? this.studyDateTime[1] : "",
aid: this.learningRecords.aid.join(","),
}; };
apicourseStudy.studyRecords(params).then((res) => { apicourseStudy.studyRecords(params).then((res) => {
if (res.status === 200) { if (res.status === 200) {
@@ -989,10 +1087,10 @@ export default {
let params = { let params = {
courseId: this.courseDetail.id, //课程的id courseId: this.courseDetail.id, //课程的id
signType: this.signup.signType, //报名方式 signType: this.signup.signType, //报名方式
name: this.signup.name, //姓名 name: "", //姓名
pageIndex: this.study.pageIndex, pageIndex: this.study.pageIndex,
pageSize: this.study.pageSize, pageSize: this.study.pageSize,
aid: this.study.aid, aid: this.signup.aid.join(","),
}; };
apicourseStudy.findSignup(params).then((res) => { apicourseStudy.findSignup(params).then((res) => {
@@ -1039,6 +1137,7 @@ export default {
}, },
handleTabClick(tab) { handleTabClick(tab) {
this.tabName = tab.name; this.tabName = tab.name;
this.nameList = [];
if (tab.name === "second") { if (tab.name === "second") {
this.getSignupList(); this.getSignupList();
} else if (tab.name === "third") { } else if (tab.name === "third") {
@@ -1063,14 +1162,18 @@ export default {
</script> </script>
<style lang="scss"> <style lang="scss">
#courseManage { .no-wrap {
.no-wrap {
overflow: hidden; overflow: hidden;
text-overflow: ellipsis; text-overflow: ellipsis;
-webkit-box-orient: vertical; -webkit-box-orient: vertical;
-webkit-line-clamp: 1; -webkit-line-clamp: 1;
word-break: break-all; word-break: break-all;
white-space: nowrap; white-space: nowrap;
}
#courseManage {
.option-code {
margin-left: 4px;
color: #999;
} }
.noSplitDatePicker { .noSplitDatePicker {
/* 隐藏范围选择器的分隔符和占位符 */ /* 隐藏范围选择器的分隔符和占位符 */