feat:增加小组管理页面

This commit is contained in:
lixg
2023-01-31 13:41:31 +08:00
14 changed files with 1589 additions and 1260 deletions

1
src/api/apis.js Normal file
View File

@@ -0,0 +1 @@
export const STUDENT_LIST = '/admin/student/getStudent'

View File

@@ -37,3 +37,9 @@ export const QueryVoteManagementDetail = (obj) => http.post('/admin/vote/manage/
// 根据投票任务Id获取投票任务信息
export const QueryVoteTaskDetailById = (obj) => http.post('/voteSubmit/queryVoteTaskDetailById', obj)
// 直播考勤请假
export const AttendanceLeave = (obj) => http.post('/stu/task/attendance/leave', obj)
// 直播考勤签到
export const AttendanceSign = (obj) => http.post('/stu/task/attendance/sign', obj)

View File

@@ -1,4 +1,4 @@
import {reactive, ref, toRefs, watch} from "vue";
import {isRef, reactive, ref, toRefs, unref, watch, watchEffect} from "vue";
import {getCookieForName, throttle} from "@/api/method";
import JSONBigInt from 'json-bigint';
@@ -22,7 +22,7 @@ export function useBoeApiPage(_url, params = {}, config = {
function fetch() {
state.loading = true
return request(_url, params).then(r => {
return boeRequest(_url, params).then(r => {
state.data = config.result(r)
state.totalPage = config.totalPage(r)
state.total = config.total(r)
@@ -62,7 +62,7 @@ export function useBoeApi(_url, params = {}, config = {
function fetch() {
state.loading = true
return request(_url, params).then(r => {
return boeRequest(_url, params).then(r => {
state.data = config.result(r)
state.loading = false
})
@@ -95,7 +95,7 @@ export function useBoeUserListPage(_url, params = {}, init = true) {
state.loading = false
return
}
return request(_url, params).then(r => {
return boeRequest(_url, params).then(r => {
state.data = params.page === 1 ? r.result.userInfoList : [...state.data, ...r.result.userInfoList]
state.totalPage = r.result.totalPage
state.total = r.result.totalElement
@@ -110,31 +110,48 @@ export function useBoeUserListPage(_url, params = {}, init = true) {
};
}
export function usePage(_url, params = {}, init = true) {
export function usePage(_url, params, init = true) {
const state = reactive({
data: [],
total:1,
current:1,
pages:1,
loading: false
})
if (isRef(params)) {
watch(params, () => {
fetch()
})
}
function reset(){
state.data = []
state.loading = false
}
function fetch() {
state.loading = true
return request(_url, params).then(r => {
console.log('fetch')
console.log(r)
state.data = r.result
return request(unref(_url), unref(params)).then(r => {
state.data = r.data.records
state.current = r.data.current
state.pages = r.data.pages
state.total = r.data.total
state.loading = false
})
}
if (isRef(_url)) {
watchEffect(fetch)
} else {
init && fetch()
}
return {
...toRefs(state),
fetch,
reset,
};
}
@@ -163,7 +180,7 @@ export function useRequest(_url, params = {}, init = true) {
};
}
export async function request(_url, params) {
export async function boeRequest(_url, params) {
const s = _url.split(' ')
let url = s[0]
const method = s[1]?.toLowerCase() || 'get'
@@ -193,23 +210,34 @@ export async function request(_url, params) {
}).then(res => {
return JSONBigIntStr.parse(res)
})
// return axios({
// url,
// method,
// headers: {
// token: getCookie('token'),
// ...method !== 'get' ? {'Content-Type': 'application/json'} : {}
// },
// baseURL: '',
// ...method !== 'get' ? {data: JSON.stringify(body)} : {}
// }).then(resp => {
// return resp.data
// }).then(response => {
// console.log(response)
// return response
// }).catch(e => {
// console.log(2222)
// console.log(e)
// // router.push({path: '/login'})
// })
}
export async function request(_url, params) {
const s = _url.split(' ')
let url = s[0]
const method = s[1]?.toLowerCase() || 'get'
if (method === 'get') {
let paramsArray = [];
if (params) {
Object.keys(params).forEach(key => paramsArray.push(key + '=' + params[key]))
if (url.search(/\?/) === -1) {
url += '?' + paramsArray.join('&')
} else {
url += '&' + paramsArray.join('&')
}
}
}
const body = method !== 'get' ? params || {} : {}
return fetch(process.env.VUE_APP_BASE_API + url, {
method,
headers: {
token: getCookieForName('token'),
...method !== 'get' ? {'Content-Type': 'application/json'} : {}
},
...method !== 'get' ? {body: JSON.stringify(body)} : {}
}).then(res => {
return res.text()
}).then(res => {
return JSONBigIntStr.parse(res)
})
}

View File

@@ -8,7 +8,7 @@
>
<div class="drawerMain">
<div class="header">
<div class="headerTitle">{{ title }}考勤</div>
<div class="headerTitle">{{ datasource.type==6?"直播":"活动" }}考勤</div>
<img
style="width: 29px; height: 29px; cursor: pointer"
src="../../assets/images/basicinfo/close.png"
@@ -18,10 +18,15 @@
<div class="centermain">
<div class="titl">
<div class="endtime">
起止时间2022-07-21 14:00 2022-7-30 14:00
起止时间{{
datasource && datasource.startTime ? datasource.startTime : "-"
}}
{{ datasource && datasource.endTime ? datasource.endTime : "-" }}
</div>
<div class="endtime" style="margin-left: 64px">签到时间14:00</div>
<div class="endtime" style="margin-left: 40px">退时间21:00</div>
<div class="endtime" style="margin-left: 64px">时间{{beginTime}}</div>
<!-- <div class="endtime" style="margin-left: 40px">签退时间{{endTime}}</div> -->
</div>
<div class="search">
@@ -35,7 +40,7 @@
maxlength="20"
/>
</div>
<div class="namecon" style="margin-right: 30px">
<!-- <div class="namecon" style="margin-right: 30px">
<div class="name">考勤</div>
<div class="select">
<a-select
@@ -48,7 +53,7 @@
showSearch
></a-select>
</div>
</div>
</div> -->
<div class="namecon">
<div class="name">签到状态</div>
<div class="select">
@@ -65,11 +70,11 @@
</div>
<div class="btns">
<div class="btn btn1" style="margin-right: 20px">
<div class="btn btn1" style="margin-right: 20px" @click="searchTaskList">
<div class="img1"></div>
<div class="wz">搜索</div>
</div>
<div class="btn btn2">
<div class="btn btn2" @click="resetTaskList">
<div class="img2"></div>
<div class="wz">重置</div>
</div>
@@ -82,12 +87,12 @@
<div class="btn btn2" @click="showqdModal">
<div class="wz">批量签到</div>
</div>
<div class="btn btn1">
<div class="btn btn1" @click="exportTaskStu">
<div class="img2"></div>
<div class="wz">导出数据</div>
</div>
</div>
<div class="line">
<!-- <div class="line">
<div class="inline">
<div class="left">
<div class="img"></div>
@@ -99,14 +104,14 @@
</div>
<div class="right" @click="clearLine">清空</div>
</div>
</div>
</div> -->
<div class="tableBox" style="margin-top: 30px">
<a-table
style="border: 1px solid #f2f6fe"
:columns="tableDataFunc()"
:data-source="tableData"
:loading="tableDataTotal === -1 ? true : false"
:loading="tableDataTotalLoading"
:scroll="{ x: 1300 }"
:pagination="false"
:row-selection="{
@@ -142,11 +147,11 @@
<span>您确定要批量签到吗</span>
</div>
<div class="del_btnbox">
<div class="del_btn btn1">
<div class="btnText" @click="closeqdModal">取消</div>
<div class="del_btn btn1" @click="closeqdModal">
<div class="btnText">取消</div>
</div>
<div class="del_btn btn2">
<div class="btnText" @click="closeqdModal">确定</div>
<div class="del_btn btn2" @click="batchSign">
<div class="btnText">确定</div>
</div>
</div>
</div>
@@ -245,15 +250,29 @@
</a-modal>
<!-- 二维码签到弹窗 -->
<SignQR v-model:signQRvisible="signQRvisible" />
<!-- 二维码弹窗 -->
<two-dimensional-code
v-model:codevisible="codevisible"
:codeInfo="codeInfo"
:index="codeIndex"
:type="codeType == 1 ? '课程二维码' : codeType == 2 ? '签到二维码' : ''"
/>
<!-- 二维码弹窗 -->
</template>
<script>
import { toRefs, reactive } from "vue";
import SignQR from "./SignQR.vue";
import TwoDimensionalCode from "../../components/TwoDimensionalCode";
import * as api from "../../api/indexTaskManage";
import { toDate } from "../../api/method";
import { message } from "ant-design-vue";
export default {
name: "ActiveAttendance",
components: {
SignQR,
TwoDimensionalCode
},
props: {
AAvisible: {
@@ -264,6 +283,16 @@ export default {
type: String,
default: "",
},
datasource: {
type: Object,
default: function () {
return {};
},
},
types: {
type: Number,
default: null,
}
},
setup(props, ctx) {
@@ -284,46 +313,26 @@ export default {
projectNameList: [
{
id: 1,
value: "项目一",
label: "项目一",
value: "1",
label: "签到",
},
{
id: 2,
value: "项目二",
label: "项目二",
},
{
id: 3,
value: "项目三",
label: "项目三",
},
{
id: 4,
value: "项目四",
label: "项目四",
},
value: "2",
label: "请假",
}
],
projectNameList2: [
{
id: 1,
value: "项目一",
label: "项目一",
value: "1",
label: "正常",
},
{
id: 2,
value: "项目二",
label: "项目二",
},
{
id: 3,
value: "项目三",
label: "项目三",
},
{
id: 4,
value: "项目四",
label: "项目四",
},
value: "2",
label: "异常",
}
],
selectedRowKeys: [],
tableData: [
@@ -339,72 +348,7 @@ export default {
signIn: false, //签到
signOut: false, //签退
leave: false, //请假
},
{
key: 2,
name: "张三",
com: "产研部",
gang: "产品经理",
cur: "2022-10-31 23:12",
jin: "-",
time: "签到/签退",
state: "正常",
signIn: true, //签到
signOut: true, //签退
leave: false, //请假
},
{
key: 3,
name: "张三",
com: "产研部",
gang: "产品经理",
cur: "2022-10-31 23:12",
jin: "2022-10-31 23:12",
time: "迟到",
state: "异常",
signIn: false, //签到
signOut: true, //签退
leave: false, //请假
},
{
key: 4,
name: "张三",
com: "产研部",
gang: "产品经理",
cur: "2022-10-31 23:12",
jin: "2022-10-31 23:12",
time: "早退",
state: "异常",
signIn: true, //签到
signOut: false, //签退
leave: false, //请假
},
{
key: 5,
name: "张三",
com: "产研部",
gang: "产品经理",
cur: "2022-10-31 23:12",
jin: "2022-10-31 23:12",
time: "签到/签退",
state: "正常",
signIn: true, //签到
signOut: true, //签退
leave: false, //请假
},
{
key: 6,
name: "张三",
com: "产研部",
gang: "产品经理",
cur: "2022-10-31 23:12",
jin: "2022-10-31 23:12",
time: "签到/签退",
state: "正常",
signIn: true, //签到
signOut: true, //签退
leave: false, //请假
},
}
],
options: [
{
@@ -420,6 +364,16 @@ export default {
value: "Orange",
},
],
tableDataTotalLoading: true, // 表格loading加载配置
beginTime: null, //签到开始时间
endTime: null, //签到结束时间
selectedStudents:[],
projectName:undefined,
projectName2:undefined,
codeType: null,
codeIndex: null,
codeInfo: null, //二维码内容
codevisible: false, //二维码弹窗
});
const selectProjectName = (value, index) => {
console.log("value", value, index);
@@ -434,64 +388,238 @@ export default {
const showEntryScore = () => {
state.Evisible = true;
};
const onSelectChange = (selectedRowKeys) => {
const onSelectChange = (selectedRowKeys, e) => {
console.log("selectedRowKeys changed: ", selectedRowKeys);
state.selectedRowKeys = selectedRowKeys;
let array = [];
for (let i = 0; i < e.length; i++) {
array.push(e[i].studentId);
}
state.selectedStudents = array;
};
// 计算签到时间
const isSignClick = () => {
console.log("计算签到时间", props.datasource);
let beginTime = new Date(props.datasource.startTime).getTime();
let endTime = !props.datasource.afterStart
? new Date(props.datasource.endTime).getTime()
: new Date(props.datasource.startTime).getTime();
if (props.datasource.beforeStart && props.datasource.afterStart) {
//有开始前有开始后
beginTime = beginTime - props.datasource.beforeStart * 60 * 1000;
endTime = endTime + props.datasource.afterStart * 60 * 1000;
console.log("1111", beginTime, endTime);
} else if (props.datasource.beforeStart && !props.datasource.afterStart) {
//只有开始前无开始后
beginTime = beginTime - props.datasource.beforeStart * 60 * 1000;
console.log("11112222", beginTime);
} else if (!props.datasource.beforeStart && props.datasource.afterStart) {
//无开始前有开始后
endTime = endTime + props.datasource.afterStart * 60 * 1000;
console.log("1111333", endTime);
}
state.beginTime = toDate(beginTime / 1000, "Y/M/D h:m:s");
state.endTime = toDate(endTime / 1000, "Y/M/D h:m:s");
console.log("beginTime,endTime", state.beginTime, state.endTime);
};
const afterVisibleChange = (bol) => {
if (bol == true) {
console.log("当前是什么类型", props.datasource.type);
state.tableDataTotalLoading = true;
getTableData();
isSignClick();
}
};
const getTableData = () => {
let arr = state.tableData;
arr.map((value) => {
// console.log("value", value);
value.opacation = (
<div class="opa">
<a-checkbox
checked={value.signIn}
onChange={(e) => {
console.log("点击签到", e);
showsingleqdModal();
}}
>
签到
</a-checkbox>
<a-checkbox
checked={value.signOut}
onChange={(e) => {
console.log("点击签退", e);
showsingleqtModal();
}}
>
签退
</a-checkbox>
<a-checkbox
checked={value.leave}
onChange={(e) => {
console.log("点击请假", e);
showsingleqjModal();
}}
>
请假
</a-checkbox>
</div>
);
console.log('当前是项目还是路径图 1 路径图 2 项目', props.types)
if ( props.datasource.type == 6 && props.types==1 || props.datasource.type == 9 && props.types==1) {
// 此处为获取评估学员的接口 - 如后续还有用到此接口的公共任务可直接在if里面加||判断即可
console.log("我是传递的查询参数", {
pageNo: state.currentPage,
pageSize: state.pageSize,
currentStageId: props.datasource.chapterId,
type: 2,
pid: props.datasource.routerId,
taskId: props.datasource.routerTaskId,
taskType: props.datasource.type,
status: state.projectName,
studentName: state.name,
signStatus: state.projectName2
});
state.tableData = arr;
api
.AssessmentManagementMessage({
pageNo: state.currentPage,
pageSize: state.pageSize,
currentStageId: props.datasource.chapterId,
type: 2, // 1项目 2 路径
pid: props.datasource.routerId,
taskId: props.datasource.routerTaskId,
taskType: props.datasource.type,
status: state.projectName,
studentName: state.name,
})
.then((res) => {
console.log(res);
if (res.status == 200) {
let keyarr = []
for(let i =0;i<res.data.data.records.length;i++){
res.data.data.records[i].key = res.data.data.records[i].studentId
keyarr.push( res.data.data.records[i])
}
state.tableData = keyarr;
state.tableDataTotal = res.data.data.total;
state.tableDataTotalLoading = false;
}
})
.catch((err) => {
console.log(err);
state.tableDataTotalLoading = false;
state.tableData = [];
});
} else if ( props.datasource.type == 6 && props.types==2 || props.datasource.type == 9 && props.types==2) {
// 此处为获取评估学员的接口 - 如后续还有用到此接口的公共任务可直接在if里面加||判断即可
console.log("我是传递的查询参数", {
pageNo: state.currentPage,
pageSize: state.pageSize,
currentStageId: props.datasource.stageId,
type: 1,
pid: props.datasource.projectId,
taskId: props.datasource.projectTaskId,
taskType: props.datasource.type,
status: state.projectName,
studentName: state.name,
signStatus: state.projectName2
});
api
.AssessmentManagementMessage({
pageNo: state.currentPage,
pageSize: state.pageSize,
currentStageId: props.datasource.stageId,
type: 1, // 1项目 2 路径
pid: props.datasource.projectId,
taskId: props.datasource.projectTaskId,
taskType: props.datasource.type,
status: state.projectName,
studentName: state.name,
})
.then((res) => {
console.log(res);
if (res.status == 200) {
let keyarr = []
for(let i =0;i<res.data.data.records.length;i++){
res.data.data.records[i].key = res.data.data.records[i].studentId
keyarr.push( res.data.data.records[i])
}
state.tableData = keyarr;
state.tableDataTotal = res.data.data.total;
state.tableDataTotalLoading = false;
}
})
.catch((err) => {
console.log(err);
state.tableDataTotalLoading = false;
state.tableData = [];
});
} else{
state.tableDataTotalLoading = false;
state.tableData = [];
}
// let arr = state.tableData;
// arr.map((value) => {
// // console.log("value", value);
// value.opacation = (
// <div class="opa">
// <a-checkbox
// checked={value.signIn}
// onChange={(e) => {
// console.log("点击签到", e);
// showsingleqdModal();
// }}
// >
// 签到
// </a-checkbox>
// <a-checkbox
// checked={value.signOut}
// onChange={(e) => {
// console.log("点击签退", e);
// showsingleqtModal();
// }}
// >
// 签退
// </a-checkbox>
// <a-checkbox
// checked={value.leave}
// onChange={(e) => {
// console.log("点击请假", e);
// showsingleqjModal();
// }}
// >
// 请假
// </a-checkbox>
// </div>
// );
// });
// state.tableData = arr;
};
//批量签到
const batchSign = () => {
let obj = {
courseId: Number(props.datasource.courseId),
routerId: Number(props.datasource.routerId),
ids: state.selectedStudents,
taskId: Number(props.datasource.routerTaskId),
taskType: Number(props.datasource.type),
type: 1,
};
console.log(obj)
state.tableDataTotalLoading = true;
api
.AttendanceSign(obj)
.then((res) => {
console.log("签到结果", res, obj);
if (res.data.code === 200) {
message.destroy();
message.success("批量签到成功");
state.qdModal = false;
state.selectedRowKeys = [];
state.selectedStudents = [];
getTableData();
}
})
.catch((err) => {
console.log("签到失败", err, obj);
});
};
const tableDataFunc = () => {
const columns = [
{
title: "工号",
dataIndex: "workNum",
key: "workNum",
dataIndex: "studentUserNo",
key: "studentUserNo",
width: 50,
align: "center",
className: "h",
customRender: (text) => {
return (
<div class="racona">
<span> {text.record.studentUserNo?text.record.studentUserNo:"-"}</span>
</div>
);
},
},
{
title: "姓名",
dataIndex: "name",
key: "name",
dataIndex: "studentName",
key: "studentName",
width: 50,
align: "center",
className: "classify",
@@ -499,18 +627,26 @@ export default {
customRender: (text) => {
return (
<div class="racona">
<span> {text.record.name}</span>
<span> {text.record.studentName?text.record.studentName:"-"}</span>
</div>
);
},
},
{
title: "所在部门",
dataIndex: "com",
key: "com",
dataIndex: "studentDepartName",
key: "studentDepartName",
width: 50,
align: "center",
className: "h",
ellipsis: true,
customRender: (text) => {
return (
<div class="racona">
<span> {text.record.studentDepartName?text.record.studentDepartName:"-"}</span>
</div>
);
},
},
{
title: "所在岗位",
@@ -519,38 +655,66 @@ export default {
width: 50,
align: "center",
className: "h",
ellipsis: true,
customRender: (text) => {
return (
<div class="racona">
<span> {text.record.studentJobName?text.record.studentJobName:"-"}</span>
</div>
);
},
},
{
title: "签到时间",
dataIndex: "cur",
key: "cur",
dataIndex: "signTime",
key: "signTime",
width: 110,
align: "center",
className: "h",
customRender: (text) => {
return (
<div class="racona">
<span> {text.record.signTime?text.record.signTime:"-"}</span>
</div>
);
},
{
title: "签退时间",
dataIndex: "jin",
key: "jin",
width: 110,
align: "center",
className: "h",
},
{
title: "考勤",
dataIndex: "time",
key: "time",
dataIndex: "signStatus",
key: "signStatus",
width: 50,
align: "center",
className: "h",
customRender: (text) => {
// console.log("text", text);
return (
<div class="racona">
<span>
{text.record.signStatus
? "签到"
: text.record.leaveStatus
? "请假"
: "-"}
</span>
</div>
);
},
},
{
title: "签到状态",
dataIndex: "state",
key: "state",
dataIndex: "signStatus",
key: "signStatus",
width: 50,
align: "center",
className: "h",
customRender: (text) => {
return (
<div class="racona">
<span>{text.record.signStatus == null && new Date().getTime() > new Date(state.endTime).getTime() ? "异常" : text.record.signStatus ? "正常" : text.record.leaveStatus ? "异常" : text.record.signStatus == null ? "-" : "异常"}</span>
</div>
);
},
},
{
title: "考勤情况",
@@ -559,18 +723,118 @@ export default {
key: "opacation",
width: 130,
align: "center",
customRender: (value) => {
return (
<div class="opa" style='display:flex;justify-content:center;align-items:center;'>
<div
onClick={()=>{
console.log("点击签到", value);
{/* showsingleqdModal(); */}
{/* AttendanceSign */}
let obj = {
courseId: Number(props.datasource.courseId),
routerId: Number(props.datasource.routerId),
ids: [value.record.studentId],
taskId: Number(props.datasource.routerTaskId),
taskType: Number(props.datasource.type),
type: 1,
};
let obj2 = {
courseId: Number(props.datasource.courseId),
routerId: Number(props.datasource.projectId),
ids: [value.record.studentId],
taskId: Number(props.datasource.projectTaskId),
taskType: Number(props.datasource.type),
type: 2,
};
console.log(obj, obj2)
state.tableDataTotalLoading = true;
api.AttendanceSign(props.types==1? obj : obj2).then(res=>{
console.log('res----签到是否成功',res)
message.destroy()
message.info('签到成功')
getTableData();
}).catch(err=>{
state.tableDataTotalLoading = false;
console.log(err)
})
}}
style="display:flex;justify-content:center;align-items:center;margin-right:12px;cursor:pointer;">
{value.signStatus?
<div style='width:16px;height:16px;margin-right:6px;border-radius:16px;border:1px solid #ccc;display:flex;justify-content:center;align-items:center;'>
<div style='width:8px;height:8px;border-radius:8px;background:#4ea6ff;'></div>
</div>:
<div style='width:16px;height:16px;margin-right:6px;border-radius:16px;border:1px solid #ccc;'></div>
}
<div>签到</div>
</div>
<div
onClick={()=>{
console.log("点击请假", value);
{/* showsingleqjModal(); */}
{/* AttendanceLeave */}
let obj = {
courseId: Number(props.datasource.courseId),
routerId: Number(props.datasource.routerId),
ids: [value.record.studentId],
taskId: Number(props.datasource.routerTaskId),
taskType: Number(props.datasource.type),
type: 1,
};
let obj2 = {
courseId: Number(props.datasource.courseId),
routerId: Number(props.datasource.projectId),
ids: [value.record.studentId],
taskId: Number(props.datasource.projectTaskId),
taskType: Number(props.datasource.type),
type: 2,
};
console.log(obj, obj2)
state.tableDataTotalLoading = true;
api.AttendanceLeave(props.types==1? obj : obj2).then(res=>{
console.log('res----请假是否成功',res)
message.destroy()
message.info('请假成功')
getTableData();
}).catch(err=>{
state.tableDataTotalLoading = false;
console.log(err)
})
}}
style="display:flex;justify-content:center;align-items:center;cursor:pointer;">
{value.leaveStatus?
<div style='width:16px;height:16px;margin-right:6px;border-radius:16px;border:1px solid #ccc;display:flex;justify-content:center;align-items:center;'>
<div style='width:8px;height:8px;border-radius:8px;background:#4ea6ff;'></div>
</div>:
<div style='width:16px;height:16px;margin-right:6px;border-radius:16px;border:1px solid #ccc;'></div>
}
<div>请假</div>
</div>
</div>
)
}
},
];
return columns;
};
// 清空所选
const clearLine = () => {
state.selectedRowKeys = [];
};
const showqdModal = () => {
if(state.selectedStudents.length==0){
message.destroy()
message.error('请选择学员')
return
}
state.qdModal = true;
};
const closeqdModal = () => {
state.selectedRowKeys = [];
state.qdModal = false;
};
const showsingleqdModal = () => {
@@ -592,8 +856,78 @@ export default {
state.singleqjModal = false;
};
const signQR = () => {
state.signQRvisible = true;
state.codevisible = true;
state.codeInfo = {
title: "【签到】二维码",
name: props.datasource?.name,
url:
process.env.VUE_APP_BASE_API +
`/admin/student/studentSign?taskId=${
props.datasource.routerTaskId
}&taskType=${props.datasource.type}&type=${2}`,
};
console.log("codeInfo", state.codeInfo);
state.codeIndex = 0;
state.codeType = 1;
};
//搜索学员
const searchTaskList = () => {
state.tableDataTotalLoading = true;
state.currentPage = 1;
getTableData();
};
// 重置按钮
function resetTaskList() {
state.selectedRowKeys = [];
state.tableDataTotalLoading = true;
state.currentPage = 1;
state.name = null;
state.projectName2 = undefined;
state.tableDataTotal = -1;
state.tableDataTotal2 = 0;
getTableData();
}
// 导出数据
function exportTaskStu() {
console.log("props.datasource", props.datasource);
if(props.types==1){
window.open(
`${
process.env.VUE_APP_BASE_API
}/admin/student/exportTaskStudent?currentStageId=${
props.datasource.chapterId
}&type=2&pid=${props.datasource.courseId}&thirdType=1&taskId=${props.datasource.routerTaskId}`
);
}else{
window.open(
`${
process.env.VUE_APP_BASE_API
}/admin/student/exportTaskStudent?currentStageId=${
props.datasource.stageId
}&type=1&pid=${props.datasource.courseId}&thirdType=1&taskId=${props.datasource.projectTaskId}`
);
}
// api
// .exportTaskStudent({
// pageNo: state.currentPage,
// pageSize: state.pageSize,
// currentStageId: props.datasource.stageId,
// currentTaskId: props.datasource.projectTaskId,
// type: 1,
// pid: props.datasource.projectId,
// })
// .then((res) => {
// console.log(res);
// })
// .catch((err) => {
// console.log(err);
// });
}
return {
...toRefs(state),
selectProjectName,
@@ -612,6 +946,11 @@ export default {
closesingleqtModal,
closesingleqjModal,
signQR,
afterVisibleChange,
batchSign,
searchTaskList,
resetTaskList,
exportTaskStu
};
},
};

View File

@@ -42,9 +42,14 @@
v-model:value="value.name"
style="border-radius: 8px; height: 40px"
/>
<div class="peopleNum">{{ peopleNum2 }}</div>
<a-input-number
:min="1"
:precision="0"
style="width: 64px; height: 40px; border-radius: 8px"
v-model:value="peopleNum"
/>
<span style="margin-left: 3px"></span>
<div class="delete">删除</div>
<div class="delete" @click="deleteGroup(value)">删除</div>
</div>
</div>
</div>
@@ -110,6 +115,7 @@ export default {
let arr = [];
for (let i = 0; i < state.groupNum; i++) {
let obj = {
key: i,
name: "",
number: state.peopleNum,
};
@@ -118,10 +124,19 @@ export default {
state.groupNum2 = arr;
state.peopleNum2 = state.peopleNum;
};
//删除单个小组
const deleteGroup = (item) => {
for (let i = 0; i < state.groupNum2.length; i++) {
if (item.key === state.groupNum2[i].key) {
state.groupNum2.splice(i, 1);
}
}
};
//添加小组
const addGroup = () => {
console.log("state.groupNum2", state.groupNum2);
};
return {
...toRefs(state),
afterVisibleChange,
@@ -130,6 +145,7 @@ export default {
showAddGroup,
addGroup,
// change,
deleteGroup,
};
},
};
@@ -169,6 +185,12 @@ export default {
}
}
.main {
.ant-input-number-input {
height: 38px;
}
.ant-input-number {
margin-left: 10px;
}
.group {
display: flex;
align-items: center;

View File

@@ -28,7 +28,7 @@
</template>
<script setup>
import { defineEmits, defineProps, ref, watch } from "vue";
import { request, useBoeApi } from "@/api/request";
import {boeRequest, useBoeApi} from "@/api/request";
import { ORG_CHILD_LIST, ORG_LIST } from "@/api/ThirdApi";
const props = defineProps({
@@ -62,7 +62,7 @@ watch(props, () => {
});
function onLoadData(treeNode) {
return request(ORG_CHILD_LIST, { keyword: "", orgId: treeNode.id }).then(
return boeRequest(ORG_CHILD_LIST, { keyword: "", orgId: treeNode.id }).then(
(r) => {
treeNode.dataRef.treeChildList = r.result.directChildList;
options.value = [...options.value];

View File

@@ -11,7 +11,7 @@
<div class="drawerMain" id="ProjCheckship" style="">
<div class="header">
<div class="headerTitle">
{{ {1: "添加学员", 2: "添加学员", 3: "添加学员"}[type] || "" }}
{{ {1: "添加学员", 2: "添加学员", 3: "添加学员",4: "查看权",5: "管理权"}[type] || "" }}
</div>
<img
style="width: 29px; height: 29px; cursor: pointer"
@@ -406,7 +406,7 @@
</template>
<script setup>
import {computed, defineEmits, defineProps, ref, watch} from "vue";
import {request, useBoeApi, useBoeApiPage} from "@/api/request";
import {boeRequest, useBoeApi, useBoeApiPage} from "@/api/request";
import {
AUDIENCE_LIST,
ORG_CHILD_LIST,
@@ -616,7 +616,7 @@ const closeDrawer = () => {
};
function onLoadData(treeNode) {
return request(ORG_CHILD_LIST, {keyword: "", orgId: treeNode.id}).then(
return boeRequest(ORG_CHILD_LIST, {keyword: "", orgId: treeNode.id}).then(
(r) => {
treeNode.dataRef.treeChildList = r.result.directChildList;
treeData.value = [...treeData.value];
@@ -625,7 +625,7 @@ function onLoadData(treeNode) {
}
function onLoadOrgData(treeNode) {
return request(ORG_CHILD_LIST, {keyword: "", orgId: treeNode.id}).then(
return boeRequest(ORG_CHILD_LIST, {keyword: "", orgId: treeNode.id}).then(
(r) => {
treeNode.dataRef.treeChildList = r.result.directChildList;
treeOrgData.value = [...treeOrgData.value];

View File

@@ -0,0 +1,460 @@
<template>
<div class="CommonStudent">
<a-drawer
:visible="visiable"
class="drawerStyle ProjCheckship"
placement="right"
width="40%"
>
<div class="drawerMain" id="ProjCheckship" style="">
<div class="header">
<div class="headerTitle">
权限名单
</div>
<img
style="width: 29px; height: 29px; cursor: pointer"
src="../../assets/images/basicinfo/close.png"
@click="closeDrawer"
/>
</div>
<div class="TableStudent">
<a-row
type="flex"
gutter="12"
style="padding-left: 20px; margin-right: 0px"
>
<a-col>
<a-form-item title="姓名:">
<a-input
class="cus-input"
v-model:value="searchParams.studentName"
placeholder="请输入姓名"
/>
</a-form-item>
</a-col>
<a-col>
<a-button
class="cus-btn"
style="background: #4ea6ff; color: #fff; width: 100px"
@click="searchStu"
>
<template #icon><img style="margin-right: 10px" src="../../assets/images/courseManage/search0.png"/>
</template>
搜索
</a-button>
</a-col>
<a-col :span="2">
<a-button class="cus-btn white" style="width: 100px" @click="reset">
<template #icon><img style="margin-right: 10px" src="../../assets/images/leveladd/reset.png"/>
</template>
重置
</a-button>
</a-col>
</a-row>
<div style="margin-top: 20px">
<a-table
:columns="columns"
:data-source="studentList"
:pagination="stuPagination"
:loading="loading"
row-key="id"
>
<template #action="{ record }">
<a-space :size="2">
<slot name="extension" v-bind:data="{ record }"></slot>
<a-button @click="del(record.id)" type="link" danger>删除</a-button>
</a-space>
</template>
</a-table>
</div>
</div>
<div class="btnn">
<button class="btn1" @click="closeDrawer">取消</button>
<button class="btn2" @click="closeDrawer">确定</button>
</div>
</div>
</a-drawer>
<div @click="openDrawer">
<slot></slot>
</div>
</div>
</template>
<script setup>
import {computed, createVNode, defineProps, ref, watch} from "vue";
import {usePage} from "@/api/request";
import {STUDENT_LIST} from "@/api/apis";
import {delStudentList} from "@/api/index1";
import {ExclamationCircleOutlined} from "@ant-design/icons-vue";
import {Modal} from "ant-design-vue";
const props = defineProps({
type: Number,
id: String,
stage: {
type: Array,
default: () => [],
},
types: {
type: Array,
default: () => [],
},
});
const visiable = ref(false);
const initParams = {
studentName: "",
page: 1,
pageSize: 10,
type: props.type || '',
types: props.types,
pid: props.id || '',
}
const searchParams = ref(initParams)
const columns = ref([
{
title: "姓名",
dataIndex: "studentName",
key: "studentName",
width: 30,
align: "center",
ellipsis: true,
},
{
title: "工号",
dataIndex: "studentUserNo",
key: "studentUserNo",
width: 50,
align: "center",
ellipsis: true,
},
{
title: "部门",
dataIndex: "studentDepartName",
key: "studentDepartName",
width: 80,
align: "center",
ellipsis: true,
},
{
title: "权限",
dataIndex: "type",
key: "type",
width: 30,
align: "center",
customRender: ({record: {type}}) => ({4: "查看权", 5: "管理权", 6: "归属权"}[type]),
},
{
title: "操作",
dataIndex: "operation",
key: "operation",
width: 50,
align: "center",
slots: {customRender: "action"},
},
])
const {data: studentList, fetch: searchStu, total, loading} = usePage(STUDENT_LIST, searchParams.value)
const stuPagination = computed(() => ({
total: total,
showSizeChanger: false,
current: searchParams.value.page,
pageSize: searchParams.value.pageSize,
onChange: changePagination,
}));
const openDrawer = () => {
visiable.value = true;
};
const changePagination = (page) => {
searchParams.value.page = page;
searchStu();
};
function del(id) {
Modal.confirm({
title: () => '确定删除?',
icon: () => createVNode(ExclamationCircleOutlined),
content: () => '数据删除后不可恢复!',
okText: () => '确定',
okType: 'danger',
cancelText: () => '取消',
onOk() {
id && delStudentList({ids: [id]}).then(() => searchStu())
},
});
}
const closeDrawer = () => {
visiable.value = false;
};
function reset(){
searchParams.value = initParams
searchStu()
}
watch(visiable, () => {
visiable.value && searchStu()
searchParams.value = initParams
});
</script>
<style lang="scss">
.cus-btn {
width: 100%;
height: 40px;
display: flex;
align-items: center;
justify-content: center;
margin-right: 16px;
border: 1px solid #4ea6ff;
border-radius: 8px;
background: #4ea6ff;
cursor: pointer;
color: #fff;
}
.white {
background: #fff;
color: #4ea6ff;
}
.cus-input {
height: 40px;
border-radius: 8px;
}
.cus-select {
height: 40px;
border-radius: 8px;
}
.CommonStudent {
.ant-btn-primary {
background-color: #4ea6ff !important;
}
.cus-select {
height: 40px;
border-radius: 8px;
}
.tableBox .ant-table-row .ant-table-cell {
height: 48px;
font-size: 14px;
font-weight: 400;
color: #4f5156;
line-height: 29px;
padding: 0px;
}
.tableBox .ant-table-thead tr th {
font-size: 14px;
}
.ant-tabs-tabpane {
height: 100%;
}
.ant-tabs {
overflow: visible;
}
.right1 {
border-left: 1px solid #f2f6fe;
margin-left: 20px;
.onerow {
display: flex;
justify-content: space-between;
align-items: center;
margin-right: 40px;
flex-wrap: wrap;
width: 100%;
.onleft {
display: flex;
text-align: center;
.already {
color: rgba(51, 51, 51, 1);
font-size: 16px;
font-weight: 500;
margin-left: 32px;
white-space: nowrap;
// margin-bottom: 20px;
}
.count {
color: #4ea6ff;
font-size: 16px;
margin: 0 6px;
}
.peo {
color: rgba(51, 51, 51, 1);
font-size: 16px;
font-weight: 500;
}
}
.clbox {
margin-right: 50px;
display: flex;
justify-content: center;
align-items: center;
cursor: pointer;
width: 104px;
height: 32px;
border-radius: 4px;
background: #4ea6ff;
.colose {
width: 16px;
height: 16px;
// border-radius: 8px;
// background: #ffffff;
// position: relative;
background-image: url(../../assets/images/basicinfo/ch.png);
background-size: 100%;
margin-right: 4px;
}
.allclear {
color: rgba(255, 255, 255, 1);
font-size: 14px;
}
}
}
.selecteds {
display: flex;
flex-wrap: wrap;
margin-left: 32px;
.person {
width: 100%;
margin-top: 20px;
border-top: 1px solid #f2f6fe;
}
.chose {
width: 64px;
height: 24px;
margin-top: 25px;
margin-right: 25px;
display: flex;
align-items: center;
justify-content: center;
border-radius: 2px;
border: 1px solid rgba(56, 139, 225, 1);
color: rgba(56, 139, 225, 1);
font-size: 12px;
position: relative;
.ch {
position: absolute;
width: 18px;
height: 18px;
background-image: url(../../assets/images/basicinfo/ch.png);
right: -8px;
top: -8px;
}
}
.ifsw {
display: flex;
align-items: end;
justify-content: center;
color: #4ea6ff;
}
.sw {
display: flex;
align-items: center;
justify-content: center;
text-align: justify;
color: #4ea6ff;
margin-top: 23px;
margin-left: 10px;
}
.dept {
width: 100%;
margin-top: 30px;
border-top: 1px solid #f2f6fe;
}
.chose1 {
//width: 90px;
height: 24px;
margin-top: 25px;
margin-right: 25px;
display: flex;
align-items: center;
justify-content: center;
border-radius: 2px;
border: 1px solid rgba(56, 139, 225, 1);
color: rgba(56, 139, 225, 1);
font-size: 12px;
position: relative;
.span {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.ch1 {
position: absolute;
width: 18px;
height: 18px;
background-image: url(../../assets/images/basicinfo/ch.png);
right: -8px;
top: -8px;
}
}
.group {
width: 100%;
margin-top: 30px;
border-top: 1px solid #f2f6fe;
}
.chose2 {
//width: 120px;
height: 24px;
margin-top: 25px;
margin-right: 25px;
display: flex;
align-items: center;
justify-content: center;
border-radius: 2px;
border: 1px solid rgba(56, 139, 225, 1);
color: rgba(56, 139, 225, 1);
font-size: 12px;
position: relative;
.span {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.ch2 {
position: absolute;
width: 18px;
height: 18px;
background-image: url(../../assets/images/basicinfo/ch.png);
right: -8px;
top: -8px;
}
}
}
}
}
</style>

View File

@@ -214,67 +214,28 @@
调整
</div> -->
<!-- </div>-->
<a-row gutter="12">
<a-col>
<a-space :size="2">
<slot name="extension" v-bind:data="{ record }"></slot>
</a-col>
<!-- 新加 换组 通过 拒绝 -->
<a-col v-if="type === 1">
<div
style="
color: #4ea6ff;
font-size: 14px;
text-align: center;
margin-left: 10px;
cursor: pointer;
"
>
换组
</div>
</a-col>
<a-col v-if="type === 3 && record.status !== 0">
<div
style="
color: #4ea6ff;
font-size: 14px;
text-align: center;
margin-left: 10px;
cursor: pointer;
"
<a-button
v-if="type === 1"
@click="updateStatus(0, record.id)"
type="link"
>换组</a-button
>
通过
</div>
</a-col>
<a-col v-if="type === 3 && record.status !== 0">
<div
style="
color: #4ea6ff;
font-size: 14px;
text-align: center;
margin-left: 10px;
cursor: pointer;
"
<a-button
v-if="type === 3 && record.status !== 0"
@click="updateStatus(0, record.id)"
type="link"
>通过</a-button
>
<a-button
v-if="type === 3 && record.status !== 0"
@click="updateStatus(2, record.id)"
type="link"
>拒绝</a-button
>
拒绝
</div>
</a-col>
<a-col>
<div
@click="del(record.id)"
style="
color: #4ea6ff;
font-size: 14px;
text-align: center;
margin-left: 10px;
cursor: pointer;
"
>
删除
</div>
</a-col>
</a-row>
<a-button @click="del(record.id)" type="link" danger>删除</a-button>
</a-space>
</template>
</a-table>
</div>
@@ -383,11 +344,11 @@
/>
</template>
<script setup>
import { computed, defineProps, onMounted, ref, watch } from "vue";
import { computed, createVNode, defineProps, onMounted, ref, watch } from "vue";
import { delStudentList, getStuPage, batchUpdateStatus } from "@/api/index1";
import CommonStudent from "@/components/student/CommonStudent";
import ChangeLevelModal from "./ChangeLevelModal.vue";
import { message } from "ant-design-vue";
import { message, Modal } from "ant-design-vue";
// import { topStudent } from "../../api/indexProjStu";
import SeeStu from "../../components/drawers/SeeStu";
import EScore from "../drawers/ExportScore.vue";
@@ -395,6 +356,8 @@ import OrgClass from "@/components/project/OrgClass";
import ExportHomeWork from "../Modals/ExportHomeWork.vue";
import * as api from "../../api/index1";
import ImpStu from "../drawers/AddLevelImportStu";
import { ExclamationCircleOutlined } from "@ant-design/icons-vue";
const props = defineProps({
type: Number,
id: String,
@@ -629,11 +592,16 @@ function bathDel() {
}
function del(id) {
id &&
delStudentList({
ids: [id],
}).then(() => {
getStuList();
Modal.confirm({
title: () => "确定删除?",
icon: () => createVNode(ExclamationCircleOutlined),
content: () => "数据删除后不可恢复!",
okText: () => "确定",
okType: "danger",
cancelText: () => "取消",
onOk() {
id && delStudentList({ ids: [id] }).then(() => getStuList());
},
});
}

View File

@@ -309,628 +309,48 @@
<a-table
:columns="columns1"
:data-source="tableData1"
:loading="tableDataTotal1 === -1 ? true : false"
:loading="tableDataTotal1 === -1"
:scroll="{ x: 600 }"
expandRowByClick="true"
@expand="expandTable"
:pagination="false"
>
<template #bodyCell="{ record, column }">
<template
v-if="
(String(record.status) === '0' || record.status === '未提交') &&
column.key === 'operation'
"
>
<div
style="margin-right: 24px"
:class="[
String(record.courseform) === '1'
? 'disabled operation'
: 'operation',
]"
>
<div class="fb">
<div
class="jc"
@click="
() => {
handleEdit(record, String(record.courseform));
}
"
style="display: inline-block; margin-left: 20px"
>
编辑
</div>
<div
class="jc"
@click="
() => {
handleCopy(record, String(record.courseform));
}
"
style="display: inline-block; margin-left: 20px"
>
复制
</div>
<!-- 2022-12-10注释 后面放开 -->
<!-- <a-dropdown>
<template #overlay>
<a-menu>
<a-menu-item
@click="
() => {
if (String(record.courseform) === '1') {
return;
}
showPrower(record);
}
"
>
权限名单
</a-menu-item>
<a-menu-item
@click="
() => {
if (String(record.courseform) === '1') {
return;
}
showOwnPrower(record);
}
"
>
归属权
</a-menu-item>
<a-menu-item
@click="
() => {
if (String(record.courseform) === '1') {
return;
}
showViewPrower(record);
}
"
>查看权</a-menu-item
>
<a-menu-item
@click="
() => {
if (String(record.courseform) === '1') {
return;
}
showManagePrower(record);
}
"
>管理权</a-menu-item
>
</a-menu>
</template>
<a>
授权
<down-outlined />
</a>
</a-dropdown> -->
<div
class="jc"
@click="
() => {
handleDelete(record, String(record.courseform));
}
"
style="display: inline-block; margin-left: 20px"
>
删除
</div>
</div>
</div>
</template>
<template
v-if="
(String(record.status) === '1' || record.status === '待审核') &&
column.key === 'operation'
"
>
<div
style="margin-right: 24px"
:class="[
String(record.courseform) === '1'
? 'disabled operation'
: 'operation',
]"
>
<div class="fb">
<div
class="jc"
@click="
() => {
handleRejectExit(record, String(record.courseform));
}
"
style="display: inline-block; margin-left: 20px"
>
撤回
</div>
<div
class="jc"
@click="
() => {
handleCopy(record, String(record.courseform));
}
"
style="display: inline-block; margin-left: 20px"
>
复制
</div>
<!-- 2022-12-10注释 后面放开 -->
<!-- <a-dropdown>
<template #overlay>
<a-menu>
<a-menu-item
@click="
() => {
if (String(record.courseform) === '1') {
return;
}
showPrower(record);
}
"
>
权限名单
</a-menu-item>
<a-menu-item
@click="
() => {
if (String(record.courseform) === '1') {
return;
}
showOwnPrower(record);
}
"
>
归属权
</a-menu-item>
<a-menu-item
@click="
() => {
if (String(record.courseform) === '1') {
return;
}
showViewPrower(record);
}
"
>查看权</a-menu-item
>
<a-menu-item
@click="
() => {
if (String(record.courseform) === '1') {
return;
}
showManagePrower(record);
}
"
>管理权</a-menu-item
>
</a-menu>
</template>
<a>
授权
<down-outlined />
</a>
</a-dropdown> -->
</div>
</div>
</template>
<template
v-if="
(String(record.status) === '2' || record.status === '已审核') &&
String(record.kkty) === '1' &&
column.key === 'operation'
"
>
<div
style="margin-right: 24px"
:class="[
String(record.courseform) === '1'
? 'disabled operation'
: 'operation',
]"
>
<div class="fb">
<div
class="jc"
@click="
() => {
handleStart(record, String(record.courseform));
}
"
style="display: inline-block; margin-left: 20px"
>
开课
</div>
<div
class="jc"
@click="
() => {
handleLook(record, String(record.courseform));
}
"
style="display: inline-block; margin-left: 20px"
>
查看
</div>
<!-- 2022-12-11注释 后面放开 -->
<div
class="jc"
@click="
() => {
if (String(record.courseform) === '1') {
return;
}
if (String(record.courseform) === ('1' || '线上')) {
om_1 = true;
ft_1 = false;
} else if (
String(record.courseform) === ('2' || '面授')
) {
om_1 = true;
ft_1 = true;
}
handleGuan22(record);
}
"
style="display: inline-block; margin-left: 20px"
>
管理
</div>
<div
class="jc"
@click="
() => {
handleCopy(record, String(record.courseform));
}
"
style="display: inline-block; margin-left: 20px"
>
复制
</div>
<!-- 2022-12-10注释 后面放开 -->
<!-- <a-dropdown>
<template #overlay>
<a-menu>
<a-menu-item
@click="
() => {
if (String(record.courseform) === '1') {
return;
}
showPrower(record);
}
"
>
权限名单
</a-menu-item>
<a-menu-item
@click="
() => {
if (String(record.courseform) === '1') {
return;
}
showOwnPrower(record);
}
"
>
归属权
</a-menu-item>
<a-menu-item
@click="
() => {
if (String(record.courseform) === '1') {
return;
}
showViewPrower(record);
}
"
>查看权</a-menu-item
>
<a-menu-item
@click="
() => {
if (String(record.courseform) === '1') {
return;
}
showManagePrower(record);
}
"
>管理权</a-menu-item
>
</a-menu>
</template>
<a>
授权
<down-outlined />
</a>
</a-dropdown> -->
<div
class="jc"
@click="
() => {
handleStop(record, String(record.courseform));
}
"
style="display: inline-block; margin-left: 20px"
>
停用
</div>
</div>
</div>
</template>
<template
v-if="
(String(record.status) === '2' || record.status === '已审核') &&
String(record.kkty) === '0' &&
column.key === 'operation'
"
>
<div
style="margin-right: 24px"
:class="[
String(record.courseform) === '1'
? 'disabled operation'
: 'operation',
]"
>
<div class="fb">
<div
class="jc"
@click="
() => {
handleStart(record, String(record.courseform));
}
"
style="display: inline-block; margin-left: 20px"
>
开课
</div>
<div
class="jc"
@click="
() => {
handleEdit(record, String(record.courseform));
}
"
style="display: inline-block; margin-left: 20px"
>
编辑
</div>
<!-- 2022-12-10注释 后面放开 -->
<div
class="jc"
@click="
() => {
if (String(record.courseform) === '1') {
return;
}
if (String(record.courseform) === ('1' || '线上')) {
om_1 = true;
ft_1 = false;
} else if (
String(record.courseform) === ('2' || '面授')
) {
om_1 = true;
ft_1 = true;
}
handleGuan22(record);
}
"
style="display: inline-block; margin-left: 20px"
>
管理
</div>
<div
class="jc"
@click="
() => {
handleCopy(record, String(record.courseform));
}
"
style="display: inline-block; margin-left: 20px"
>
复制
</div>
<!-- 2022-12-10注释 后面放开 -->
<!-- <a-dropdown>
<template #overlay>
<a-menu>
<a-menu-item
@click="
() => {
if (String(record.courseform) === '1') {
return;
}
showPrower(record);
}
"
>
权限名单
</a-menu-item>
<a-menu-item
@click="
() => {
if (String(record.courseform) === '1') {
return;
}
showOwnPrower(record);
}
"
>
归属权
</a-menu-item>
<a-menu-item
@click="
() => {
if (String(record.courseform) === '1') {
return;
}
showViewPrower(record);
}
"
>查看权</a-menu-item
>
<a-menu-item
@click="
() => {
if (String(record.courseform) === '1') {
return;
}
showManagePrower(record);
}
"
>管理权</a-menu-item
>
</a-menu>
</template>
<a>
授权
<down-outlined />
</a>
</a-dropdown> -->
<div
class="jc"
@click="
() => {
handleOpen(record, String(record.courseform));
}
"
style="display: inline-block; margin-left: 20px"
>
启用
</div>
<div
class="jc"
@click="
() => {
handleDelete(record, String(record.courseform));
}
"
style="display: inline-block; margin-left: 20px"
>
删除
</div>
</div>
</div>
</template>
<template
v-if="
(String(record.status) === '-1' ||
record.status === '审核未通过') &&
column.key === 'operation'
"
>
<div
style="margin-right: 24px"
:class="[
String(record.courseform) === '1'
? 'disabled operation'
: 'operation',
]"
>
<div class="fb">
<div
class="jc"
@click="
() => {
handleEdit(record, String(record.courseform));
}
"
style="display: inline-block; margin-left: 20px"
>
编辑
</div>
<div
class="jc"
@click="
() => {
handleCopy(record, String(record.courseform));
}
"
style="display: inline-block; margin-left: 20px"
>
复制
</div>
<!-- 2022-12-10注释 后面放开 -->
<!-- <a-dropdown>
<template #overlay>
<a-menu>
<a-menu-item
@click="
() => {
if (String(record.courseform) === '1') {
return;
}
showPrower(record);
}
"
>
权限名单
</a-menu-item>
<a-menu-item
@click="
() => {
if (String(record.courseform) === '1') {
return;
}
showOwnPrower(record);
}
"
>
归属权
</a-menu-item>
<a-menu-item
@click="
() => {
if (String(record.courseform) === '1') {
return;
}
showViewPrower(record);
}
"
>查看权</a-menu-item
>
<a-menu-item
@click="
() => {
if (String(record.courseform) === '1') {
return;
}
showManagePrower(record);
}
"
>管理权</a-menu-item
>
</a-menu>
</template>
<a>
授权
<down-outlined />
</a>
</a-dropdown> -->
<div
class="jc"
@click="
() => {
handleDelete(record, String(record.courseform));
}
"
style="display: inline-block; margin-left: 20px"
>
删除
</div>
<template v-if="column.key === 'operation'">
<a-space :size="0">
<a-button v-if="record.status===0 || record.status===-1 || !record.kkty" @click="() => handleEdit(record, String(record.courseform))" type="link">编辑</a-button>
<a-button block v-if="record.status===2" @click="() => handleStart(record, String(record.courseform))" type="link">开课</a-button>
<a-button v-if="record.status===2" @click="() => handleLook(record, String(record.courseform))" type="link">查看</a-button>
<a-button v-if="record.status===2" @click="() => handleGuan22(record, String(record.courseform))" type="link">管理</a-button>
<div className="tableSelect" style="margin-left: 0">
<a-select value="授权" dropdownClassName="tabledropdown">
<a-select-option value="权限名单" label="权限名单">
<TableModelStudent :types="[10,11,12]" :id="record.offcourseId">权限名单</TableModelStudent>
</a-select-option>
<a-select-option value="查看权" label="查看权">
<CommonStudent :type="10" :id="record.offcourseId">查看权</CommonStudent>
</a-select-option>
<a-select-option value="管理权" label="管理权">
<CommonStudent :type="11" :id="record.offcourseId">管理权</CommonStudent>
</a-select-option>
</a-select>
</div>
<div className="tableSelect">
<a-select value="更多" dropdownClassName="tabledropdown">
<a-select-option value="复制" label="复制">
<a-button @click="() => handleCopy(record, String(record.courseform))" type="link">复制</a-button>
</a-select-option>
<a-select-option v-if="record.status===1" value="撤回" label="撤回">
<a-button @click="() => handleRejectExit(record, String(record.courseform))" type="link">撤回</a-button>
</a-select-option>
<a-select-option v-if="record.status===2" value="停用" label="停用">
<a-button v-if="record.status===2 && record.kkty" @click="() => handleStop(record, String(record.courseform))" type="link">停用</a-button>
<a-button v-if="record.status===2 && !record.kkty" @click="() => handleOpen(record, String(record.courseform))" type="link">启用</a-button>
</a-select-option>
<a-select-option value="删除" label="删除">
<a-button @click="() => handleDelete(record, String(record.courseform))" type="link" danger>删除</a-button>
</a-select-option>
</a-select>
</div>
</a-space>
</template>
</template>
</a-table>
@@ -1702,65 +1122,9 @@
:isgetStudent="isgetStudent"
>
<template #extension="{ data: { record } }">
<div style="display: flex">
<div
v-if="record.source === 4 && record.status === 1"
@click="
() => {
record.status = 0;
auditStudent(record);
}
"
style="
color: #4ea6ff;
font-size: 14px;
text-align: center;
margin-left: 20px;
cursor: pointer;
"
>
审核通过
</div>
<div
v-if="record.source === 4 && record.status === 1"
@click="
() => {
record.status = 2;
auditStudent(record);
}
"
style="
color: #4ea6ff;
font-size: 14px;
text-align: center;
margin-left: 20px;
cursor: pointer;
"
>
拒绝
</div>
<div
v-if="
record.source === 4 &&
(record.status === 0 || record.status === 2)
"
@click="
() => {
record.status = 1;
auditStudent(record);
}
"
style="
color: #4ea6ff;
font-size: 14px;
text-align: center;
margin-left: 20px;
cursor: pointer;
"
>
撤回
</div>
</div>
<a-button v-if="record.source === 4 && record.status === 1" @click="() => {record.status = 0;auditStudent(record);}" type="link">审核通过</a-button>
<a-button v-if="record.source === 4 && record.status === 1" @click="() => {record.status = 2;auditStudent(record);}" type="link">拒绝</a-button>
<a-button v-if="record.source === 4 && (record.status === 0 || record.status === 2)" @click="() => {record.status = 1;auditStudent(record);}" type="link">撤回</a-button>
</template>
</TableStudent>
</div>
@@ -2295,6 +1659,8 @@ import * as api from "../../api/indexInvist.js";
import * as apis from "../../api/indexTaskManage";
import { message } from "ant-design-vue";
import { useRouter, useRoute } from "vue-router";
import CommonStudent from "@/components/student/CommonStudent";
import TableModelStudent from "@/components/student/TableModelStudent";
// import StuAdd from "../../components/drawers/StuAdd";
// import OwnPower from "../../components/drawers/OwnPower.vue";
// import Corpowerlist from "../../components/drawers/CorPowerlist.vue";
@@ -2525,8 +1891,7 @@ const columns1 = [
},
{
title: "操作",
width: 315,
className: "h",
width: 370,
dataIndex: "operation",
key: "operation",
fixed: "right",
@@ -2913,7 +2278,8 @@ export default defineComponent({
components: {
// OwnPower,
// Corpowerlist,
CommonStudent,
TableModelStudent,
SeeModal,
CourseModal,
FJUpload,
@@ -8093,24 +7459,24 @@ export default defineComponent({
margin-bottom: 20px;
}
// .tableSelect {
// position: relative;
// .hoverList {
// display: none;
// }
// &:hover {
// .hoverList {
// display: block;
// position: absolute;
// top: 20px;
// left: -20px;
// background: #fff;
// box-sizing: border-box;
// // padding: 20px;
// color: #000000;
// }
// }
// }
.tableSelect {
position: relative;
.hoverList {
display: none;
}
&:hover {
.hoverList {
display: block;
position: absolute;
top: 20px;
left: -20px;
background: #fff;
box-sizing: border-box;
// padding: 20px;
color: #000000;
}
}
}
// ::v-deep .w-e-toolbar {
// .w-e-bar-item {

View File

@@ -690,26 +690,24 @@
<script>
import { reactive, toRefs, onMounted, watch, computed } from "vue";
import { useRouter } from "vue-router";
// import OwnerShip from "../../components/drawers/Ownership";
// import PowerList from "../../components/drawers/PowerList";
// import QueryRight from "../../components/drawers/QueryRight";
import CommonStudent from "@/components/student/CommonStudent";
import TableModelStudent from "@/components/student/TableModelStudent";
import ProjOwnerShip from "../../components/drawers/ProjectOwn";
import ProjPowerList from "../../components/drawers/ProjPowerList";
import ProjCheckShip from "../../components/drawers/ProjCheckPower";
// import ManageRight from "../../components/drawers/ManageRight";
import * as api from "../../api/index1";
import * as apiStu from "../../api/index";
import { message } from "ant-design-vue";
import {
commonData,
changeOwnership,
// setCookie
} from "../../api/method";
import { storage } from "../../api/storage";
} from "@/api/method";
import { storage } from "@/api/storage";
import { useStore } from "vuex";
import OrgClass from "@/components/project/OrgClass";
import NameInput from "@/components/project/NameInput";
import {validateName} from "../../api/index1";
import {validateName} from "@/api/index1";
export default {
name: "learningPath",
@@ -1249,51 +1247,23 @@ export default {
>
管理
</div>
{/**
// <!-- 2022-12-10注释 后面放开 -->
{
<a-select
style="width: 50px;margin-top:2px;margin-left:25px"
value="授权"
dropdownClassName="tabledropdown"
>
<a-select-option value="权限名单" label="权限名单">
<div
onClick={() => {
showPower(text.record.id);
}}
>
权限名单
</div>
</a-select-option>
<a-select-option value="归属权" label="归属权">
<div
onClick={() => {
showOwner(text.record.id);
}}
>
归属权
</div>
<TableModelStudent types={[7,8,9]} id={text.record.id}>权限名单</TableModelStudent>
</a-select-option>
<a-select-option value="查看权" label="查看权">
<div
onClick={() => {
showQuery(text.record.id);
}}
>
查看权
</div>
<CommonStudent type={7} id={text.record.id}>查看权</CommonStudent>
</a-select-option>
<a-select-option value="管理权" label="管理权">
<div
onClick={() => {
showManage(text.record.id);
}}
>
管理权
</div>
<CommonStudent type={8} id={text.record.id}>管理权</CommonStudent>
</a-select-option>
</a-select>
*/}
}
</div>
<div class="tableSelect">
{text.record.state === "草稿" ? (

View File

@@ -455,7 +455,7 @@
<div
class="operation"
style="cursor: pointer"
@click="showAA(item.type, item.name)"
@click="showAA(item.type, item.name, item)"
:style="{
display:
item.type === 6 || item.type === 9
@@ -523,32 +523,8 @@
:columns="tableDataFunc()"
>
<template #extension="{ data: { record } }">
<div style="display: flex">
<div
@click="showStudent(record)"
style="
color: #4ea6ff;
font-size: 14px;
text-align: center;
margin-left: 20px;
cursor: pointer;
"
>
查看
</div>
<div
@click="setLevels(record)"
style="
color: #4ea6ff;
font-size: 14px;
text-align: center;
margin-left: 20px;
cursor: pointer;
"
>
调整
</div>
</div>
<a-button type="link" @click="showStudent(record)">查看</a-button>
<a-button type="link" @click="setLevels(record)">调整</a-button>
</template>
</TableStudent>
<TableStudent
@@ -559,32 +535,8 @@
:columns="tableDataFunc()"
>
<template #extension="{ data: { record } }">
<div style="display: flex">
<div
@click="showStudent(record)"
style="
color: #4ea6ff;
font-size: 14px;
text-align: center;
margin-left: 20px;
cursor: pointer;
"
>
查看
</div>
<div
@click="setLevels(record)"
style="
color: #4ea6ff;
font-size: 14px;
text-align: center;
margin-left: 20px;
cursor: pointer;
"
>
调整
</div>
</div>
<a-button type="link" @click="showStudent(record)">查看</a-button>
<a-button type="link" @click="setLevels(record)">调整</a-button>
</template>
</TableStudent>
</a-tab-pane>
@@ -1070,7 +1022,9 @@
<!-- 活动考勤抽屉 -->
<active-attendance
v-model:AAvisible="AAvisible"
:datasource="liveData"
:title="showKaoqinText"
types="1"
classify="2"
/>
<!-- 时间管理抽屉 -->
@@ -1569,6 +1523,7 @@ export default {
evaluationData: "",
homeworkData: "",
commonData: "",
liveData: "",
voteData: "",
commonLevelName: "",
examLevelName: "",
@@ -1797,10 +1752,11 @@ export default {
console.log("facestudent", state.facestudent);
};
//考勤的抽屉
const showAA = (course) => {
const showAA = (course, a, data) => {
state.AAvisible = true;
state.showKaoqinText = "【" + course + "】" + "考勤";
console.log(state.showKaoqinText, 1111);
state.liveData = data;
state.showKaoqinText = "直播";
console.log(state.showKaoqinText, 1111, data);
};
// 时间管理
const showTime = (course) => {

View File

@@ -830,7 +830,6 @@ import * as api from "../../api/index";
import * as api1 from "../../api/index1";
import { storage } from "../../api/storage";
import ProjectManager from "@/components/project/ProjectManagerNew";
// import ProjectClass from "@/components/project/ProjectClass";
import TrainClass from "@/components/project/TrainClass";
import OrgClass from "@/components/project/OrgClass";
import dayjs from "dayjs";
@@ -838,7 +837,8 @@ import * as moment from "moment";
import { changeOwnership } from "@/api/method";
import NameInput from "@/components/project/NameInput";
import { validateName } from "@/api/index1";
//import { toDate } from "../../api/method";
import CommonStudent from "@/components/student/CommonStudent";
import TableModelStudent from "@/components/student/TableModelStudent";
export default {
name: "projectManage",
@@ -1510,57 +1510,21 @@ export default {
) : (
""
)}
{/**
//<!-- 2022-12-10注释 后面放开 -->
{
<div className="tableSelect">
<a-select
style="width: 50px"
value="授权"
// options={state.projectNameList}
dropdownClassName="tabledropdown"
>
<a-select style="width: 50px;" value="授权" dropdownClassName="tabledropdown">
<a-select-option value="权限名单" label="权限名单">
<div
onClick={() => {
showProjPrower(value.record.projectId);
}}
>
权限名单
</div>
</a-select-option>
<a-select-option value="归属权" label="归属权">
<div
onClick={() => {
console.log("点击了111");
showProjOwner(value.record.projectId);
}}
>
归属权
</div>
<TableModelStudent types={[4,5,6]} id={value.record.projectId}>权限名单</TableModelStudent>
</a-select-option>
<a-select-option value="查看权" label="查看权">
<div
onClick={() => {
console.log("点击了111");
showProjCheck(value.record.projectId);
}}
>
查看权
</div>
<CommonStudent type={4} id={value.record.projectId}>查看权</CommonStudent>
</a-select-option>
<a-select-option value="管理权" label="管理权">
<div
onClick={() => {
showProjManage(value.record.projectId);
}}
>
管理权
</div>
<CommonStudent type={5} id={value.record.projectId}>管理权</CommonStudent>
</a-select-option>
</a-select>
</div>
*/}
}
{value.record.type === 1 ? (
<span
className="operation3"

View File

@@ -334,7 +334,7 @@
:key="item.stageId"
@click="stageChange(item, index)"
>
{{ item.name || '无阶段' }}
{{ item.name || "无阶段" }}
</div>
<!-- <div class="stage1">阶段1</div>
<div class="stage2">阶段2</div> -->
@@ -348,7 +348,9 @@
<a-progress
type="dashboard"
gapDegree="0"
:percent="stageOverviewList[choosedStageIndex]?.completeCourseRatio"
:percent="
stageOverviewList[choosedStageIndex]?.completeCourseRatio
"
:width="140"
/>
<div class="protext">课程完成率</div>
@@ -357,7 +359,9 @@
<a-progress
type="dashboard"
gapDegree="0"
:percent="stageOverviewList[choosedStageIndex]?.completeExamRatio"
:percent="
stageOverviewList[choosedStageIndex]?.completeExamRatio
"
:width="140"
/>
<div class="protext">考试通过率</div>
@@ -378,7 +382,9 @@
<div class="proright1">
<span class="textpro">阶段任务总数</span>
<a-progress
:percent="stageOverviewList[choosedStageIndex]?.totalTaskCnt"
:percent="
stageOverviewList[choosedStageIndex]?.totalTaskCnt
"
style="width: 369px"
/>
</div>
@@ -540,17 +546,27 @@
</div>
<div class="progress">
<div class="progresstext">
{{item.finishStuCnt || 0 }}/{{item.totalStuCnt || 0}}人
{{ item.finishStuCnt || 0 }}/{{
item.totalStuCnt || 0
}}人
</div>
<div style="display: flex">
<a-progress
:showInfo="false"
:percent="parseInt((item.finishStuCnt / item.totalStuCnt) * 100)"
:percent="
parseInt(
(item.finishStuCnt / item.totalStuCnt) * 100
)
"
strokeColor="#FFC067"
trailColor="rgba(253, 209, 98, 0.2)"
/>
<span class="progresstext" style="margin-left: 10px"
>{{parseInt((item.finishStuCnt / item.totalStuCnt) * 100) || 0 }}%</span
>{{
parseInt(
(item.finishStuCnt / item.totalStuCnt) * 100
) || 0
}}%</span
>
</div>
</div>
@@ -567,7 +583,7 @@
<div
class="operation"
style="cursor: pointer"
@click="showAA(item.name)"
@click="showAA(item.type, item.name, item)"
v-if="item.type == 6 || item.type == 9"
>
考勤
@@ -701,35 +717,117 @@
:visable="tabFlag"
>
<template #extension="{ data: { record } }">
<div style="display: flex">
<div
@click="showStudent(record)"
style="
color: #4ea6ff;
font-size: 14px;
text-align: center;
margin-left: 20px;
cursor: pointer;
"
<a-button @click="showStudent(record)" type="link"
>查看</a-button
>
查看
</div>
<div
@click="settingTopFlag(record)"
style="
color: #4ea6ff;
font-size: 14px;
text-align: center;
margin-left: 20px;
cursor: pointer;
"
>
{{ record.topFlag ? "取消优秀" : "优秀学员" }}
</div>
</div>
<a-button @click="settingTopFlag(record)" type="link">{{
record.topFlag ? "取消优秀" : "优秀学员"
}}</a-button>
</template>
</TableStudent>
</a-tab-pane>
<a-tab-pane key="9" tab="小组管理" force-render>
<div class="group">
<div class="groupleft">
<div class="groupname">小组名称:</div>
<a-input
v-model:value="valuestugn"
placeholder="请输入小组名称"
/>
</div>
<div class="groupright">
<div class="btn1" @click="searchGroup">
<img src="../../assets/images/courseManage/search0.png" />
<span class="btn1text">搜索</span>
</div>
<div class="btn2" @click="resetGroupName">
<img src="../../assets/images/courseManage/reset1.png" />
<span class="btn2text">重置</span>
</div>
</div>
</div>
<div class="second2">
<div class="btn1" @click="showModal2(1, null)">
<img src="../../assets/images/courseManage/add0.png" />
<span class="btn1text">创建小组</span>
</div>
<div class="btn2" @click="showSubset">
<img src="../../assets/images/courseManage/reset2.png" />
<span class="btn2text">随机分组</span>
</div>
<div class="btn2">
<span class="btn2text">导出小组</span>
</div>
<div class="btn2">
<span class="btn2text">导入小组长</span>
</div>
</div>
<!-- 小组列表 -->
<div class="groupmain">
<div
class="groupbox"
v-for="item in groupList"
:key="item.projectGroupId"
>
<div style="width: 90%">
<div class="grouptitle">
<div class="goodgruop">{{ item.groupName }}</div>
<div class="more">
<span
style="color: rgba(0, 0, 0, 0.45); cursor: pointer"
>. . .</span
>
<div class="moreItems">
<div class="sammo" @click="showModal2(2, item)">
编辑
</div>
<div
class="sammo"
@click="deleteGroupBtn(item.projectGroupId)"
>
删除
</div>
</div>
</div>
</div>
<div class="leader">组长:{{ item.leaderName }}</div>
<div class="grocenter">
<div class="leader1">进度</div>
<a-progress :percent="item.completeRatio" />
</div>
<div
class="grofooter"
@click="showMemberList(item.projectGroupId)"
>
<div class="ftext">组员名单 ></div>
<div class="peoples">
<div class="people1">
<img
src="../../assets/images/taskpage/people1.png"
/>
</div>
<div class="people2">
<img
src="../../assets/images/taskpage/people2.png"
/>
</div>
<div class="people3">
<img
src="../../assets/images/taskpage/people3.png"
/>
</div>
<div class="people4">
<img
src="../../assets/images/taskpage/people4.png"
/>
</div>
</div>
</div>
</div>
</div>
</div>
</a-tab-pane>
</a-tabs>
</div>
</a-tab-pane>
@@ -747,11 +845,9 @@
</a-tab-pane>
</a-tabs>
</a-tab-pane>
<!-- 2022-11-30注释 后面放开 -->
<a-tab-pane key="5" tab="项目积分">
<ProjectScore :projectId="projectId"></ProjectScore>
</a-tab-pane>
<!-- 2022-11-30注释 后面放开 -->
<a-tab-pane key="6" tab="排行榜">
<div class="split"></div>
<div class="content6">
@@ -759,7 +855,6 @@
<div class="line"></div>
<div class="search">
<div class="left">
<div class="time">
<div class="text">选择时间:</div>
<a-range-picker
@@ -870,35 +965,109 @@
<a-tab-pane key="7" tab="证书">
<div class="split"></div>
<!-- 没有证书显示的页面 -->
<div v-if="3>7" style="display:flex; justify-content:center; align-items:center;height: 600px;flex-direction:column;">
<div
v-if="3 > 7"
style="
display: flex;
justify-content: center;
align-items: center;
height: 600px;
flex-direction: column;
"
>
<img
src="@/assets/images/nodata.png"
style=" width: 212px; height: 212px;"
style="width: 212px; height: 212px"
alt=""
/>
<button class="xkbtn11" @click="addCertificate">
添加证书
</button>
<button class="xkbtn11" @click="addCertificate">添加证书</button>
</div>
<!-- 有证书显示的页面 -->
<div v-else style="padding: 36px; display: flex;min-height: 400px;">
<div style="width:170px;height:200px;border:1px solid #b1b3b8;display: flex;justify-content: center;align-items: center;color: #4ea6ff;cursor: pointer;" @click="addCertificate">
<div v-else style="padding: 36px; display: flex; min-height: 400px">
<div
style="
width: 170px;
height: 200px;
border: 1px solid #b1b3b8;
display: flex;
justify-content: center;
align-items: center;
color: #4ea6ff;
cursor: pointer;
"
@click="addCertificate"
>
<div class="ant-upload-text">+添加证书</div>
</div>
<div style="width:170px;height:200px;border:1px solid #b1b3b8;margin-left: 32px;display: flex;justify-content: center;align-items: center;flex-direction:column;">
<div
style="
width: 170px;
height: 200px;
border: 1px solid #b1b3b8;
margin-left: 32px;
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
"
>
<img
@click="previewPic"
style="cursor: pointer"
width="140"
height="160"
src="https://picb6.photophoto.cn/32/552/32552236_1.jpg" alt="" srcset="">
<div style="display:flex;height: 26px;justify-content: space-around;align-items: center;">
<div style="font-size:14px; width: 85px;overflow: hidden;white-space: nowrap;text-overflow: ellipsis;">培训认证证书</div>
<div style="font-size:12px;color:#999;width:50px;margin-left: 6px;overflow: hidden;white-space: nowrap;text-overflow: ellipsis;">完成项目</div>
<div style="cursor:pointer;position: relative;">
src="https://picb6.photophoto.cn/32/552/32552236_1.jpg"
alt=""
srcset=""
/>
<div
style="
display: flex;
height: 26px;
justify-content: space-around;
align-items: center;
"
>
<div
style="
font-size: 14px;
width: 85px;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
"
>
培训认证证书
</div>
<div
style="
font-size: 12px;
color: #999;
width: 50px;
margin-left: 6px;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
"
>
完成项目
</div>
<div style="cursor: pointer; position: relative">
...
<div style="position:absolute;width: 45px;height: 60px;background: #fff;display: flex;flex-direction: column;justify-content: center;align-items: center;border: 1px solid #b1b3b8;">
<div
style="
position: absolute;
width: 45px;
height: 60px;
background: #fff;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
border: 1px solid #b1b3b8;
"
>
<div style="font-size: 12px; color: #999">查看</div>
<div style="font-size: 12px; color: #999">编辑</div>
<div style="font-size: 12px; color: #999">删除</div>
@@ -1051,7 +1220,13 @@
>
<img
src="@/assets/images/basicinfo/cloud.png"
style="cursor: pointer; width: 24px; height: 24px; margin-left: 8px;margin-bottom: 3px;"
style="
cursor: pointer;
width: 24px;
height: 24px;
margin-left: 8px;
margin-bottom: 3px;
"
alt=""
/>
</a-upload>
@@ -1086,26 +1261,74 @@
"
alt=""
/> -->
<img v-if="
<img
v-if="
item.name.indexOf('jpg') !== -1 ||
item.name.indexOf('jpeg') !== -1 ||
item.name.indexOf('png') !== -1
"
style="width: 27px;height: 32px;margin-right: 40px;"
src="@/assets/images/coursewareManage/pngpic.png" />
style="width: 27px; height: 32px; margin-right: 40px"
src="@/assets/images/coursewareManage/pngpic.png"
/>
<div v-else>
<img v-if="item.name.indexOf('doc') !== -1" style="width: 27px;height: 32px;margin-right: 40px;" src="@/assets/images/coursewareManage/docpic.png" />
<img
v-if="item.name.indexOf('doc') !== -1"
style="
width: 27px;
height: 32px;
margin-right: 40px;
"
src="@/assets/images/coursewareManage/docpic.png"
/>
<div v-else>
<img v-if="item.name.indexOf('xls') !== -1" style="width: 27px;height: 32px;margin-right: 40px;" src="@/assets/images/coursewareManage/xlspic.png" />
<img
v-if="item.name.indexOf('xls') !== -1"
style="
width: 27px;
height: 32px;
margin-right: 40px;
"
src="@/assets/images/coursewareManage/xlspic.png"
/>
<div v-else>
<img v-if="item.name.indexOf('ppt') !== -1" style="width: 27px;height: 32px;margin-right: 40px;" src="@/assets/images/coursewareManage/pptpic.png" />
<img
v-if="item.name.indexOf('ppt') !== -1"
style="
width: 27px;
height: 32px;
margin-right: 40px;
"
src="@/assets/images/coursewareManage/pptpic.png"
/>
<div v-else>
<img v-if="item.name.indexOf('pdf') !== -1" style="width: 27px;height: 32px;margin-right: 40px;" src="@/assets/images/coursewareManage/pdfpic.png" />
<img
v-if="item.name.indexOf('pdf') !== -1"
style="
width: 27px;
height: 32px;
margin-right: 40px;
"
src="@/assets/images/coursewareManage/pdfpic.png"
/>
<div v-else>
<img v-if="item.name.indexOf('zip') !== -1"
style="width: 27px;height: 32px;margin-right: 40px;"
src="@/assets/images/coursewareManage/zippic.png" />
<img v-else style="width: 27px;height: 32px;margin-right: 40px;" src="@/assets/images/coursewareManage/docpic.png" />
<img
v-if="item.name.indexOf('zip') !== -1"
style="
width: 27px;
height: 32px;
margin-right: 40px;
"
src="@/assets/images/coursewareManage/zippic.png"
/>
<img
v-else
style="
width: 27px;
height: 32px;
margin-right: 40px;
"
src="@/assets/images/coursewareManage/docpic.png"
/>
</div>
</div>
</div>
@@ -1125,8 +1348,14 @@
>
<a
href="javascript:void(0);"
@click="downloadFile(item.response ? item.response.data : '')"
style="margin-left: 5px">下载</a>
@click="
downloadFile(
item.response ? item.response.data : ''
)
"
style="margin-left: 5px"
>下载</a
>
<span
style="color: #4ea6ff; float: right; cursor: pointer"
@click="deFile(item.uid)"
@@ -1138,7 +1367,6 @@
</div>
</div>
</a-tab-pane>
</a-tabs>
</a-tab-pane>
</a-tabs>
@@ -1198,14 +1426,10 @@
/>
<!-- 添加证书抽屉 -->
<AddCertificate
v-model:ACertificate="ACertificate"
/>
<AddCertificate v-model:ACertificate="ACertificate" />
<!-- 创建证书抽屉 -->
<CreateCertificate
v-model:CCertificate="CCertificate"
/>
<CreateCertificate v-model:CCertificate="CCertificate" />
<!-- 预览 -->
<a-modal
@@ -1213,12 +1437,15 @@
width="60%"
:footer="null"
v-model:visible="modal1Visible"
style="display:flex; justify-content:center; align-items:center;"
style="display: flex; justify-content: center; align-items: center"
@ok="setModal1Visible(false)"
>
<img
:width="screenWidth * 0.55"
src="https://picb6.photophoto.cn/32/552/32552236_1.jpg" alt="" srcset="">
src="https://picb6.photophoto.cn/32/552/32552236_1.jpg"
alt=""
srcset=""
/>
</a-modal>
<!-- 学员(小组管理)创建小组抽屉 -->
@@ -1262,11 +1489,13 @@
v-model:FSvisible="FSvisible"
:projectTaskInfo="facestudent"
/>
<!-- 活动考勤抽屉 -->
<!-- 活动直播考勤抽屉 -->
<active-attendance
v-model:AAvisible="AAvisible"
:title="showkaoqinText"
classify="1"
:datasource="liveData"
:title="showKaoqinText"
types="2"
classify="2"
/>
<!-- 批量面授报名 -->
@@ -1899,7 +2128,7 @@ export default {
TableStudent,
AddCertificate,
CreateCertificate,
ProjectVoteManage
ProjectVoteManage,
},
setup() {
const store = useStore();
@@ -1937,7 +2166,11 @@ export default {
ellipsis: true,
customRender: ({ record }) => (
<div>
{record.finishTaskNum ==0?"未开始":record.finishTaskNum == record.totalTaskNum?"已完成":"进行中"}
{record.finishTaskNum == 0
? "未开始"
: record.finishTaskNum == record.totalTaskNum
? "已完成"
: "进行中"}
</div>
),
},
@@ -2536,7 +2769,8 @@ export default {
//直播、面授传递title
showWorkText: "",
//直播、活动页面传递参数
showkaoqinText: "",
showkaoqinText: "直播",
liveData: "",
//所有抽屉的传过去的type
itemstype: null,
@@ -2588,8 +2822,8 @@ export default {
evaltype: "",
evalData: "",
voteData: "",
voteModelVisibleTitle:'',
voteLevelName:'',
voteModelVisibleTitle: "",
voteLevelName: "",
facestudent: "",
modal1Visible: false, // 证书预览
@@ -2614,7 +2848,7 @@ export default {
totalTaskCnt: 0,
totalReqCnt: 0,
totalOptCnt: 0,
}
},
],
stageList: [
// 阶段列表
@@ -2655,7 +2889,7 @@ export default {
}
}
}
levelList.stageList = res.data.data.stageList
levelList.stageList = res.data.data.stageList;
//暂时传个固定的id用 到时候看数据里面是否有在更换
// state.projectTaskId = res.data.data.stageList[0].taskList[0].projectTaskId
let leng = res.data.data.stageList.length;
@@ -2869,9 +3103,18 @@ export default {
state.chooseGroupId = id;
};
//活动考勤的抽屉
const showAA = (title) => {
{
/* const showAA = (title) => {
state.AAvisible = true;
state.showkaoqinText = title;
}; */
}
//考勤的抽屉
const showAA = (course, a, data) => {
state.AAvisible = true;
state.liveData = data;
state.showKaoqinText = "直播";
console.log(state.showKaoqinText, 1111, data);
};
//作业管理的抽屉
const showWork = (name, id, item) => {
@@ -2880,14 +3123,16 @@ export default {
state.projectTaskId = id;
state.projectTaskInfo = item;
};
{/* 直播管理的抽屉 */}
{
/* 直播管理的抽屉 */
}
const showVote = (name, id, data) => {
console.log(name, id, data)
console.log(name, id, data);
state.projectVoteModelVisible = true;
state.voteData = data;
state.voteModelVisibleTitle = name;
state.voteLevelName = '无阶段任务';
}
state.voteLevelName = "无阶段任务";
};
//考试管理的抽屉
const showTest = (name, id, data) => {
state.examData = data;
@@ -3623,7 +3868,9 @@ export default {
state.noticeFlag = info.noticeFlag;
state.switchopen = info.attachSwitch == 1 ? true : false;
state.docChecked = info.attachSwitch == 1 ? true : false;
state.hasTask = !!res.data.data?.stageList.some(({taskList})=>taskList.length);
state.hasTask = !!res.data.data?.stageList.some(
({ taskList }) => taskList.length
);
// state.attach = info.attach;
// state.templateId = info.templateId;
state.sourceBelong =
@@ -4246,9 +4493,9 @@ export default {
// 共享文档文件下载
const downloadFile = (url) => {
console.log(url)
console.log(url);
if (url) {
window.open(url)
window.open(url);
}
// if(url){
// const filename = '操作指南'
@@ -4265,13 +4512,15 @@ export default {
// }
// x.send()
// }
}
};
function stageChange(item, index) {
state.choosedStageId = item.stageId
state.choosedStageId = item.stageId;
state.choosedStageIndex = index;
}
{/* 证书 */}
{
/* 证书 */
}
function addCertificate() {
state.ACertificate = true;
}
@@ -4390,7 +4639,7 @@ export default {
checkType,
downloadFile,
addCertificate,
previewPic
previewPic,
};
},
};
@@ -5966,7 +6215,7 @@ export default {
.groupright {
display: flex;
margin-left: 48px;
.btn1 {
width: 100px;
height: 40px;