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获取投票任务信息 // 根据投票任务Id获取投票任务信息
export const QueryVoteTaskDetailById = (obj) => http.post('/voteSubmit/queryVoteTaskDetailById', obj) 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 {getCookieForName, throttle} from "@/api/method";
import JSONBigInt from 'json-bigint'; import JSONBigInt from 'json-bigint';
@@ -22,7 +22,7 @@ export function useBoeApiPage(_url, params = {}, config = {
function fetch() { function fetch() {
state.loading = true state.loading = true
return request(_url, params).then(r => { return boeRequest(_url, params).then(r => {
state.data = config.result(r) state.data = config.result(r)
state.totalPage = config.totalPage(r) state.totalPage = config.totalPage(r)
state.total = config.total(r) state.total = config.total(r)
@@ -62,7 +62,7 @@ export function useBoeApi(_url, params = {}, config = {
function fetch() { function fetch() {
state.loading = true state.loading = true
return request(_url, params).then(r => { return boeRequest(_url, params).then(r => {
state.data = config.result(r) state.data = config.result(r)
state.loading = false state.loading = false
}) })
@@ -95,7 +95,7 @@ export function useBoeUserListPage(_url, params = {}, init = true) {
state.loading = false state.loading = false
return 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.data = params.page === 1 ? r.result.userInfoList : [...state.data, ...r.result.userInfoList]
state.totalPage = r.result.totalPage state.totalPage = r.result.totalPage
state.total = r.result.totalElement 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({ const state = reactive({
data: [], data: [],
total:1,
current:1,
pages:1,
loading: false loading: false
}) })
watch(params, () => { if (isRef(params)) {
fetch() watch(params, () => {
}) fetch()
})
}
function reset(){
state.data = []
state.loading = false
}
function fetch() { function fetch() {
state.loading = true state.loading = true
return request(_url, params).then(r => { return request(unref(_url), unref(params)).then(r => {
console.log('fetch') state.data = r.data.records
console.log(r) state.current = r.data.current
state.data = r.result state.pages = r.data.pages
state.total = r.data.total
state.loading = false state.loading = false
}) })
} }
init && fetch() if (isRef(_url)) {
watchEffect(fetch)
} else {
init && fetch()
}
return { return {
...toRefs(state), ...toRefs(state),
fetch, 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(' ') const s = _url.split(' ')
let url = s[0] let url = s[0]
const method = s[1]?.toLowerCase() || 'get' const method = s[1]?.toLowerCase() || 'get'
@@ -193,23 +210,34 @@ export async function request(_url, params) {
}).then(res => { }).then(res => {
return JSONBigIntStr.parse(res) return JSONBigIntStr.parse(res)
}) })
// return axios({ }
// url,
// method, export async function request(_url, params) {
// headers: { const s = _url.split(' ')
// token: getCookie('token'), let url = s[0]
// ...method !== 'get' ? {'Content-Type': 'application/json'} : {} const method = s[1]?.toLowerCase() || 'get'
// }, if (method === 'get') {
// baseURL: '', let paramsArray = [];
// ...method !== 'get' ? {data: JSON.stringify(body)} : {} if (params) {
// }).then(resp => { Object.keys(params).forEach(key => paramsArray.push(key + '=' + params[key]))
// return resp.data if (url.search(/\?/) === -1) {
// }).then(response => { url += '?' + paramsArray.join('&')
// console.log(response) } else {
// return response url += '&' + paramsArray.join('&')
// }).catch(e => { }
// console.log(2222) }
// console.log(e) }
// // router.push({path: '/login'}) 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="drawerMain">
<div class="header"> <div class="header">
<div class="headerTitle">{{ title }}考勤</div> <div class="headerTitle">{{ datasource.type==6?"直播":"活动" }}考勤</div>
<img <img
style="width: 29px; height: 29px; cursor: pointer" style="width: 29px; height: 29px; cursor: pointer"
src="../../assets/images/basicinfo/close.png" src="../../assets/images/basicinfo/close.png"
@@ -18,10 +18,15 @@
<div class="centermain"> <div class="centermain">
<div class="titl"> <div class="titl">
<div class="endtime"> <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>
<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>
<div class="search"> <div class="search">
@@ -35,7 +40,7 @@
maxlength="20" maxlength="20"
/> />
</div> </div>
<div class="namecon" style="margin-right: 30px"> <!-- <div class="namecon" style="margin-right: 30px">
<div class="name">考勤</div> <div class="name">考勤</div>
<div class="select"> <div class="select">
<a-select <a-select
@@ -48,7 +53,7 @@
showSearch showSearch
></a-select> ></a-select>
</div> </div>
</div> </div> -->
<div class="namecon"> <div class="namecon">
<div class="name">签到状态</div> <div class="name">签到状态</div>
<div class="select"> <div class="select">
@@ -65,11 +70,11 @@
</div> </div>
<div class="btns"> <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="img1"></div>
<div class="wz">搜索</div> <div class="wz">搜索</div>
</div> </div>
<div class="btn btn2"> <div class="btn btn2" @click="resetTaskList">
<div class="img2"></div> <div class="img2"></div>
<div class="wz">重置</div> <div class="wz">重置</div>
</div> </div>
@@ -82,12 +87,12 @@
<div class="btn btn2" @click="showqdModal"> <div class="btn btn2" @click="showqdModal">
<div class="wz">批量签到</div> <div class="wz">批量签到</div>
</div> </div>
<div class="btn btn1"> <div class="btn btn1" @click="exportTaskStu">
<div class="img2"></div> <div class="img2"></div>
<div class="wz">导出数据</div> <div class="wz">导出数据</div>
</div> </div>
</div> </div>
<div class="line"> <!-- <div class="line">
<div class="inline"> <div class="inline">
<div class="left"> <div class="left">
<div class="img"></div> <div class="img"></div>
@@ -99,14 +104,14 @@
</div> </div>
<div class="right" @click="clearLine">清空</div> <div class="right" @click="clearLine">清空</div>
</div> </div>
</div> </div> -->
<div class="tableBox" style="margin-top: 30px"> <div class="tableBox" style="margin-top: 30px">
<a-table <a-table
style="border: 1px solid #f2f6fe" style="border: 1px solid #f2f6fe"
:columns="tableDataFunc()" :columns="tableDataFunc()"
:data-source="tableData" :data-source="tableData"
:loading="tableDataTotal === -1 ? true : false" :loading="tableDataTotalLoading"
:scroll="{ x: 1300 }" :scroll="{ x: 1300 }"
:pagination="false" :pagination="false"
:row-selection="{ :row-selection="{
@@ -142,11 +147,11 @@
<span>您确定要批量签到吗</span> <span>您确定要批量签到吗</span>
</div> </div>
<div class="del_btnbox"> <div class="del_btnbox">
<div class="del_btn btn1"> <div class="del_btn btn1" @click="closeqdModal">
<div class="btnText" @click="closeqdModal">取消</div> <div class="btnText">取消</div>
</div> </div>
<div class="del_btn btn2"> <div class="del_btn btn2" @click="batchSign">
<div class="btnText" @click="closeqdModal">确定</div> <div class="btnText">确定</div>
</div> </div>
</div> </div>
</div> </div>
@@ -245,15 +250,29 @@
</a-modal> </a-modal>
<!-- 二维码签到弹窗 --> <!-- 二维码签到弹窗 -->
<SignQR v-model:signQRvisible="signQRvisible" /> <SignQR v-model:signQRvisible="signQRvisible" />
<!-- 二维码弹窗 -->
<two-dimensional-code
v-model:codevisible="codevisible"
:codeInfo="codeInfo"
:index="codeIndex"
:type="codeType == 1 ? '课程二维码' : codeType == 2 ? '签到二维码' : ''"
/>
<!-- 二维码弹窗 -->
</template> </template>
<script> <script>
import { toRefs, reactive } from "vue"; import { toRefs, reactive } from "vue";
import SignQR from "./SignQR.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 { export default {
name: "ActiveAttendance", name: "ActiveAttendance",
components: { components: {
SignQR, SignQR,
TwoDimensionalCode
}, },
props: { props: {
AAvisible: { AAvisible: {
@@ -264,6 +283,16 @@ export default {
type: String, type: String,
default: "", default: "",
}, },
datasource: {
type: Object,
default: function () {
return {};
},
},
types: {
type: Number,
default: null,
}
}, },
setup(props, ctx) { setup(props, ctx) {
@@ -284,46 +313,26 @@ export default {
projectNameList: [ projectNameList: [
{ {
id: 1, id: 1,
value: "项目一", value: "1",
label: "项目一", label: "签到",
}, },
{ {
id: 2, id: 2,
value: "项目二", value: "2",
label: "项目二", label: "请假",
}, }
{
id: 3,
value: "项目三",
label: "项目三",
},
{
id: 4,
value: "项目四",
label: "项目四",
},
], ],
projectNameList2: [ projectNameList2: [
{ {
id: 1, id: 1,
value: "项目一", value: "1",
label: "项目一", label: "正常",
}, },
{ {
id: 2, id: 2,
value: "项目二", value: "2",
label: "项目二", label: "异常",
}, }
{
id: 3,
value: "项目三",
label: "项目三",
},
{
id: 4,
value: "项目四",
label: "项目四",
},
], ],
selectedRowKeys: [], selectedRowKeys: [],
tableData: [ tableData: [
@@ -339,72 +348,7 @@ export default {
signIn: false, //签到 signIn: false, //签到
signOut: false, //签退 signOut: false, //签退
leave: 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: [ options: [
{ {
@@ -420,6 +364,16 @@ export default {
value: "Orange", 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) => { const selectProjectName = (value, index) => {
console.log("value", value, index); console.log("value", value, index);
@@ -434,64 +388,238 @@ export default {
const showEntryScore = () => { const showEntryScore = () => {
state.Evisible = true; state.Evisible = true;
}; };
const onSelectChange = (selectedRowKeys) => { const onSelectChange = (selectedRowKeys, e) => {
console.log("selectedRowKeys changed: ", selectedRowKeys);
state.selectedRowKeys = 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 = () => { const getTableData = () => {
let arr = state.tableData; console.log('当前是项目还是路径图 1 路径图 2 项目', props.types)
arr.map((value) => { if ( props.datasource.type == 6 && props.types==1 || props.datasource.type == 9 && props.types==1) {
// console.log("value", value); // 此处为获取评估学员的接口 - 如后续还有用到此接口的公共任务可直接在if里面加||判断即可
value.opacation = ( console.log("我是传递的查询参数", {
<div class="opa"> pageNo: state.currentPage,
<a-checkbox pageSize: state.pageSize,
checked={value.signIn} currentStageId: props.datasource.chapterId,
onChange={(e) => { type: 2,
console.log("点击签到", e); pid: props.datasource.routerId,
showsingleqdModal(); taskId: props.datasource.routerTaskId,
}} taskType: props.datasource.type,
> status: state.projectName,
签到 studentName: state.name,
</a-checkbox> signStatus: state.projectName2
<a-checkbox });
checked={value.signOut} api
onChange={(e) => { .AssessmentManagementMessage({
console.log("点击签退", e); pageNo: state.currentPage,
showsingleqtModal(); pageSize: state.pageSize,
}} currentStageId: props.datasource.chapterId,
> type: 2, // 1项目 2 路径
签退 pid: props.datasource.routerId,
</a-checkbox> taskId: props.datasource.routerTaskId,
<a-checkbox taskType: props.datasource.type,
checked={value.leave} status: state.projectName,
onChange={(e) => { studentName: state.name,
console.log("点击请假", e); })
showsingleqjModal(); .then((res) => {
}} console.log(res);
> if (res.status == 200) {
请假 let keyarr = []
</a-checkbox> for(let i =0;i<res.data.data.records.length;i++){
</div> res.data.data.records[i].key = res.data.data.records[i].studentId
); keyarr.push( res.data.data.records[i])
}); }
state.tableData = arr; 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);
});
}; };
getTableData();
const tableDataFunc = () => { const tableDataFunc = () => {
const columns = [ const columns = [
{ {
title: "工号", title: "工号",
dataIndex: "workNum", dataIndex: "studentUserNo",
key: "workNum", key: "studentUserNo",
width: 50, width: 50,
align: "center", align: "center",
className: "h", className: "h",
customRender: (text) => {
return (
<div class="racona">
<span> {text.record.studentUserNo?text.record.studentUserNo:"-"}</span>
</div>
);
},
}, },
{ {
title: "姓名", title: "姓名",
dataIndex: "name", dataIndex: "studentName",
key: "name", key: "studentName",
width: 50, width: 50,
align: "center", align: "center",
className: "classify", className: "classify",
@@ -499,18 +627,26 @@ export default {
customRender: (text) => { customRender: (text) => {
return ( return (
<div class="racona"> <div class="racona">
<span> {text.record.name}</span> <span> {text.record.studentName?text.record.studentName:"-"}</span>
</div> </div>
); );
}, },
}, },
{ {
title: "所在部门", title: "所在部门",
dataIndex: "com", dataIndex: "studentDepartName",
key: "com", key: "studentDepartName",
width: 50, width: 50,
align: "center", align: "center",
className: "h", className: "h",
ellipsis: true,
customRender: (text) => {
return (
<div class="racona">
<span> {text.record.studentDepartName?text.record.studentDepartName:"-"}</span>
</div>
);
},
}, },
{ {
title: "所在岗位", title: "所在岗位",
@@ -519,38 +655,66 @@ export default {
width: 50, width: 50,
align: "center", align: "center",
className: "h", className: "h",
ellipsis: true,
customRender: (text) => {
return (
<div class="racona">
<span> {text.record.studentJobName?text.record.studentJobName:"-"}</span>
</div>
);
},
}, },
{ {
title: "签到时间", title: "签到时间",
dataIndex: "cur", dataIndex: "signTime",
key: "cur", key: "signTime",
width: 110,
align: "center",
className: "h",
},
{
title: "签退时间",
dataIndex: "jin",
key: "jin",
width: 110, width: 110,
align: "center", align: "center",
className: "h", className: "h",
customRender: (text) => {
return (
<div class="racona">
<span> {text.record.signTime?text.record.signTime:"-"}</span>
</div>
);
},
}, },
{ {
title: "考勤", title: "考勤",
dataIndex: "time", dataIndex: "signStatus",
key: "time", key: "signStatus",
width: 50, width: 50,
align: "center", align: "center",
className: "h", className: "h",
customRender: (text) => {
// console.log("text", text);
return (
<div class="racona">
<span>
{text.record.signStatus
? "签到"
: text.record.leaveStatus
? "请假"
: "-"}
</span>
</div>
);
},
}, },
{ {
title: "签到状态", title: "签到状态",
dataIndex: "state", dataIndex: "signStatus",
key: "state", key: "signStatus",
width: 50, width: 50,
align: "center", align: "center",
className: "h", 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: "考勤情况", title: "考勤情况",
@@ -559,18 +723,118 @@ export default {
key: "opacation", key: "opacation",
width: 130, width: 130,
align: "center", 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; return columns;
}; };
//清空所选
// 清空所选
const clearLine = () => { const clearLine = () => {
state.selectedRowKeys = []; state.selectedRowKeys = [];
}; };
const showqdModal = () => { const showqdModal = () => {
if(state.selectedStudents.length==0){
message.destroy()
message.error('请选择学员')
return
}
state.qdModal = true; state.qdModal = true;
}; };
const closeqdModal = () => { const closeqdModal = () => {
state.selectedRowKeys = [];
state.qdModal = false; state.qdModal = false;
}; };
const showsingleqdModal = () => { const showsingleqdModal = () => {
@@ -592,8 +856,78 @@ export default {
state.singleqjModal = false; state.singleqjModal = false;
}; };
const signQR = () => { 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 { return {
...toRefs(state), ...toRefs(state),
selectProjectName, selectProjectName,
@@ -612,6 +946,11 @@ export default {
closesingleqtModal, closesingleqtModal,
closesingleqjModal, closesingleqjModal,
signQR, signQR,
afterVisibleChange,
batchSign,
searchTaskList,
resetTaskList,
exportTaskStu
}; };
}, },
}; };

View File

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

View File

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

View File

@@ -11,7 +11,7 @@
<div class="drawerMain" id="ProjCheckship" style=""> <div class="drawerMain" id="ProjCheckship" style="">
<div class="header"> <div class="header">
<div class="headerTitle"> <div class="headerTitle">
{{ {1: "添加学员", 2: "添加学员", 3: "添加学员"}[type] || "" }} {{ {1: "添加学员", 2: "添加学员", 3: "添加学员",4: "查看权",5: "管理权"}[type] || "" }}
</div> </div>
<img <img
style="width: 29px; height: 29px; cursor: pointer" style="width: 29px; height: 29px; cursor: pointer"
@@ -406,7 +406,7 @@
</template> </template>
<script setup> <script setup>
import {computed, defineEmits, defineProps, ref, watch} from "vue"; import {computed, defineEmits, defineProps, ref, watch} from "vue";
import {request, useBoeApi, useBoeApiPage} from "@/api/request"; import {boeRequest, useBoeApi, useBoeApiPage} from "@/api/request";
import { import {
AUDIENCE_LIST, AUDIENCE_LIST,
ORG_CHILD_LIST, ORG_CHILD_LIST,
@@ -616,7 +616,7 @@ const closeDrawer = () => {
}; };
function onLoadData(treeNode) { function onLoadData(treeNode) {
return request(ORG_CHILD_LIST, {keyword: "", orgId: treeNode.id}).then( return boeRequest(ORG_CHILD_LIST, {keyword: "", orgId: treeNode.id}).then(
(r) => { (r) => {
treeNode.dataRef.treeChildList = r.result.directChildList; treeNode.dataRef.treeChildList = r.result.directChildList;
treeData.value = [...treeData.value]; treeData.value = [...treeData.value];
@@ -625,7 +625,7 @@ function onLoadData(treeNode) {
} }
function onLoadOrgData(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) => { (r) => {
treeNode.dataRef.treeChildList = r.result.directChildList; treeNode.dataRef.treeChildList = r.result.directChildList;
treeOrgData.value = [...treeOrgData.value]; 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> -->
<!-- </div>--> <!-- </div>-->
<a-row gutter="12"> <a-space :size="2">
<a-col> <slot name="extension" v-bind:data="{ record }"></slot>
<slot name="extension" v-bind:data="{ record }"></slot> <a-button
</a-col> v-if="type === 1"
<!-- 新加 换组 通过 拒绝 --> @click="updateStatus(0, record.id)"
<a-col v-if="type === 1"> type="link"
<div >换组</a-button
style=" >
color: #4ea6ff; <a-button
font-size: 14px; v-if="type === 3 && record.status !== 0"
text-align: center; @click="updateStatus(0, record.id)"
margin-left: 10px; type="link"
cursor: pointer; >通过</a-button
" >
> <a-button
换组 v-if="type === 3 && record.status !== 0"
</div> @click="updateStatus(2, record.id)"
</a-col> type="link"
<a-col v-if="type === 3 && record.status !== 0"> >拒绝</a-button
<div >
style=" <a-button @click="del(record.id)" type="link" danger>删除</a-button>
color: #4ea6ff; </a-space>
font-size: 14px;
text-align: center;
margin-left: 10px;
cursor: pointer;
"
@click="updateStatus(0, record.id)"
>
通过
</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;
"
@click="updateStatus(2, record.id)"
>
拒绝
</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>
</template> </template>
</a-table> </a-table>
</div> </div>
@@ -383,11 +344,11 @@
/> />
</template> </template>
<script setup> <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 { delStudentList, getStuPage, batchUpdateStatus } from "@/api/index1";
import CommonStudent from "@/components/student/CommonStudent"; import CommonStudent from "@/components/student/CommonStudent";
import ChangeLevelModal from "./ChangeLevelModal.vue"; import ChangeLevelModal from "./ChangeLevelModal.vue";
import { message } from "ant-design-vue"; import { message, Modal } from "ant-design-vue";
// import { topStudent } from "../../api/indexProjStu"; // import { topStudent } from "../../api/indexProjStu";
import SeeStu from "../../components/drawers/SeeStu"; import SeeStu from "../../components/drawers/SeeStu";
import EScore from "../drawers/ExportScore.vue"; import EScore from "../drawers/ExportScore.vue";
@@ -395,6 +356,8 @@ import OrgClass from "@/components/project/OrgClass";
import ExportHomeWork from "../Modals/ExportHomeWork.vue"; import ExportHomeWork from "../Modals/ExportHomeWork.vue";
import * as api from "../../api/index1"; import * as api from "../../api/index1";
import ImpStu from "../drawers/AddLevelImportStu"; import ImpStu from "../drawers/AddLevelImportStu";
import { ExclamationCircleOutlined } from "@ant-design/icons-vue";
const props = defineProps({ const props = defineProps({
type: Number, type: Number,
id: String, id: String,
@@ -629,12 +592,17 @@ function bathDel() {
} }
function del(id) { function del(id) {
id && Modal.confirm({
delStudentList({ title: () => "确定删除?",
ids: [id], icon: () => createVNode(ExclamationCircleOutlined),
}).then(() => { content: () => "数据删除后不可恢复!",
getStuList(); okText: () => "确定",
}); okType: "danger",
cancelText: () => "取消",
onOk() {
id && delStudentList({ ids: [id] }).then(() => getStuList());
},
});
} }
function submitCall(flag) { function submitCall(flag) {

View File

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

View File

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

View File

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

View File

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

View File

@@ -191,7 +191,7 @@
<a-tab-pane key="1" tab="概览"> <a-tab-pane key="1" tab="概览">
<div class="split"></div> <div class="split"></div>
<!-- 概览(无数据) --> <!-- 概览(无数据) -->
<div v-if="!hasTask"> <div v-if="!hasTask">
<div class="onerow"> <div class="onerow">
<div class="taskmain">快速创建项目详情</div> <div class="taskmain">快速创建项目详情</div>
</div> </div>
@@ -266,7 +266,7 @@
</div> </div>
<!-- 概览(无数据) --> <!-- 概览(无数据) -->
<!-- 概览(有数据) --> <!-- 概览(有数据) -->
<div v-if="hasTask"> <div v-if="hasTask">
<div class="onerow"> <div class="onerow">
<div class="taskmain">项目概览</div> <div class="taskmain">项目概览</div>
</div> </div>
@@ -326,15 +326,15 @@
</div> --> </div> -->
<div class="stagemess"> <div class="stagemess">
<div <div
v-for="(item,index) in stageList" v-for="(item, index) in stageList"
:class="{ :class="{
stage1: index === choosedStageIndex, stage1: index === choosedStageIndex,
stage2: index !== choosedStageIndex, stage2: index !== choosedStageIndex,
}" }"
:key="item.stageId" :key="item.stageId"
@click="stageChange(item,index)" @click="stageChange(item, index)"
> >
{{ item.name || '无阶段' }} {{ item.name || "无阶段" }}
</div> </div>
<!-- <div class="stage1">阶段1</div> <!-- <div class="stage1">阶段1</div>
<div class="stage2">阶段2</div> --> <div class="stage2">阶段2</div> -->
@@ -348,7 +348,9 @@
<a-progress <a-progress
type="dashboard" type="dashboard"
gapDegree="0" gapDegree="0"
:percent="stageOverviewList[choosedStageIndex]?.completeCourseRatio" :percent="
stageOverviewList[choosedStageIndex]?.completeCourseRatio
"
:width="140" :width="140"
/> />
<div class="protext">课程完成率</div> <div class="protext">课程完成率</div>
@@ -357,7 +359,9 @@
<a-progress <a-progress
type="dashboard" type="dashboard"
gapDegree="0" gapDegree="0"
:percent="stageOverviewList[choosedStageIndex]?.completeExamRatio" :percent="
stageOverviewList[choosedStageIndex]?.completeExamRatio
"
:width="140" :width="140"
/> />
<div class="protext">考试通过率</div> <div class="protext">考试通过率</div>
@@ -378,7 +382,9 @@
<div class="proright1"> <div class="proright1">
<span class="textpro">阶段任务总数</span> <span class="textpro">阶段任务总数</span>
<a-progress <a-progress
:percent="stageOverviewList[choosedStageIndex]?.totalTaskCnt" :percent="
stageOverviewList[choosedStageIndex]?.totalTaskCnt
"
style="width: 369px" style="width: 369px"
/> />
</div> </div>
@@ -540,17 +546,27 @@
</div> </div>
<div class="progress"> <div class="progress">
<div class="progresstext"> <div class="progresstext">
{{item.finishStuCnt || 0 }}/{{item.totalStuCnt || 0}}人 {{ item.finishStuCnt || 0 }}/{{
item.totalStuCnt || 0
}}人
</div> </div>
<div style="display: flex"> <div style="display: flex">
<a-progress <a-progress
:showInfo="false" :showInfo="false"
:percent="parseInt((item.finishStuCnt / item.totalStuCnt) * 100)" :percent="
parseInt(
(item.finishStuCnt / item.totalStuCnt) * 100
)
"
strokeColor="#FFC067" strokeColor="#FFC067"
trailColor="rgba(253, 209, 98, 0.2)" trailColor="rgba(253, 209, 98, 0.2)"
/> />
<span class="progresstext" style="margin-left: 10px" <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>
</div> </div>
@@ -567,7 +583,7 @@
<div <div
class="operation" class="operation"
style="cursor: pointer" style="cursor: pointer"
@click="showAA(item.name)" @click="showAA(item.type, item.name, item)"
v-if="item.type == 6 || item.type == 9" v-if="item.type == 6 || item.type == 9"
> >
考勤 考勤
@@ -701,35 +717,117 @@
:visable="tabFlag" :visable="tabFlag"
> >
<template #extension="{ data: { record } }"> <template #extension="{ data: { record } }">
<div style="display: flex"> <a-button @click="showStudent(record)" type="link"
<div >查看</a-button
@click="showStudent(record)" >
style=" <a-button @click="settingTopFlag(record)" type="link">{{
color: #4ea6ff; record.topFlag ? "取消优秀" : "优秀学员"
font-size: 14px; }}</a-button>
text-align: center;
margin-left: 20px;
cursor: pointer;
"
>
查看
</div>
<div
@click="settingTopFlag(record)"
style="
color: #4ea6ff;
font-size: 14px;
text-align: center;
margin-left: 20px;
cursor: pointer;
"
>
{{ record.topFlag ? "取消优秀" : "优秀学员" }}
</div>
</div>
</template> </template>
</TableStudent> </TableStudent>
</a-tab-pane> </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> </a-tabs>
</div> </div>
</a-tab-pane> </a-tab-pane>
@@ -747,11 +845,9 @@
</a-tab-pane> </a-tab-pane>
</a-tabs> </a-tabs>
</a-tab-pane> </a-tab-pane>
<!-- 2022-11-30注释 后面放开 -->
<a-tab-pane key="5" tab="项目积分"> <a-tab-pane key="5" tab="项目积分">
<ProjectScore :projectId="projectId"></ProjectScore> <ProjectScore :projectId="projectId"></ProjectScore>
</a-tab-pane> </a-tab-pane>
<!-- 2022-11-30注释 后面放开 -->
<a-tab-pane key="6" tab="排行榜"> <a-tab-pane key="6" tab="排行榜">
<div class="split"></div> <div class="split"></div>
<div class="content6"> <div class="content6">
@@ -759,7 +855,6 @@
<div class="line"></div> <div class="line"></div>
<div class="search"> <div class="search">
<div class="left"> <div class="left">
<div class="time"> <div class="time">
<div class="text">选择时间:</div> <div class="text">选择时间:</div>
<a-range-picker <a-range-picker
@@ -870,38 +965,112 @@
<a-tab-pane key="7" tab="证书"> <a-tab-pane key="7" tab="证书">
<div class="split"></div> <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 <img
src="@/assets/images/nodata.png" src="@/assets/images/nodata.png"
style=" width: 212px; height: 212px;" style="width: 212px; height: 212px"
alt="" alt=""
/> />
<button class="xkbtn11" @click="addCertificate"> <button class="xkbtn11" @click="addCertificate">添加证书</button>
添加证书
</button>
</div> </div>
<!-- 有证书显示的页面 --> <!-- 有证书显示的页面 -->
<div v-else style="padding: 36px; display: flex;min-height: 400px;"> <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
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 class="ant-upload-text">+添加证书</div>
</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
<img 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" @click="previewPic"
style="cursor:pointer" style="cursor: pointer"
width="140" width="140"
height="160" height="160"
src="https://picb6.photophoto.cn/32/552/32552236_1.jpg" alt="" srcset=""> src="https://picb6.photophoto.cn/32/552/32552236_1.jpg"
<div style="display:flex;height: 26px;justify-content: space-around;align-items: center;"> alt=""
<div style="font-size:14px; width: 85px;overflow: hidden;white-space: nowrap;text-overflow: ellipsis;">培训认证证书</div> srcset=""
<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="
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
<div style="font-size:12px;color:#999">查看</div> style="
<div style="font-size:12px;color:#999">编辑</div> position: absolute;
<div style="font-size:12px;color:#999">删除</div> 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>
</div> </div>
</div> </div>
</div> </div>
@@ -1019,7 +1188,7 @@
</div> </div>
</div> </div>
</a-tab-pane> </a-tab-pane>
<a-tab-pane key="13" tab="共享文档"> <a-tab-pane key="13" tab="共享文档">
<div class="sametab"> <div class="sametab">
<div class="Gcon"> <div class="Gcon">
@@ -1051,7 +1220,13 @@
> >
<img <img
src="@/assets/images/basicinfo/cloud.png" 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="" alt=""
/> />
</a-upload> </a-upload>
@@ -1086,26 +1261,74 @@
" "
alt="" alt=""
/> --> /> -->
<img v-if=" <img
item.name.indexOf('jpg') !== -1 || v-if="
item.name.indexOf('jpeg') !== -1 || item.name.indexOf('jpg') !== -1 ||
item.name.indexOf('png') !== -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> <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> <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> <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> <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> <div v-else>
<img v-if="item.name.indexOf('zip') !== -1" <img
style="width: 27px;height: 32px;margin-right: 40px;" v-if="item.name.indexOf('zip') !== -1"
src="@/assets/images/coursewareManage/zippic.png" /> style="
<img v-else style="width: 27px;height: 32px;margin-right: 40px;" src="@/assets/images/coursewareManage/docpic.png" /> 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> </div>
</div> </div>
@@ -1123,10 +1346,16 @@
:title="item.name" :title="item.name"
>{{ item.name }}</span >{{ item.name }}</span
> >
<a <a
href="javascript:void(0);" href="javascript:void(0);"
@click="downloadFile(item.response ? item.response.data : '')" @click="
style="margin-left: 5px">下载</a> downloadFile(
item.response ? item.response.data : ''
)
"
style="margin-left: 5px"
>下载</a
>
<span <span
style="color: #4ea6ff; float: right; cursor: pointer" style="color: #4ea6ff; float: right; cursor: pointer"
@click="deFile(item.uid)" @click="deFile(item.uid)"
@@ -1138,7 +1367,6 @@
</div> </div>
</div> </div>
</a-tab-pane> </a-tab-pane>
</a-tabs> </a-tabs>
</a-tab-pane> </a-tab-pane>
</a-tabs> </a-tabs>
@@ -1184,7 +1412,7 @@
<!-- 投票管理抽屉 --> <!-- 投票管理抽屉 -->
<ProjectVoteManage <ProjectVoteManage
v-model:ProjectVoteModelVisible="projectVoteModelVisible" v-model:ProjectVoteModelVisible="projectVoteModelVisible"
:title="voteModelVisibleTitle" :title="voteModelVisibleTitle"
:levelName="voteLevelName" :levelName="voteLevelName"
:datasource="voteData" :datasource="voteData"
/> />
@@ -1196,16 +1424,12 @@
:itemsType="evaltype" :itemsType="evaltype"
:datasource="evalData" :datasource="evalData"
/> />
<!-- 添加证书抽屉 --> <!-- 添加证书抽屉 -->
<AddCertificate <AddCertificate v-model:ACertificate="ACertificate" />
v-model:ACertificate="ACertificate"
/>
<!-- 创建证书抽屉 --> <!-- 创建证书抽屉 -->
<CreateCertificate <CreateCertificate v-model:CCertificate="CCertificate" />
v-model:CCertificate="CCertificate"
/>
<!-- 预览 --> <!-- 预览 -->
<a-modal <a-modal
@@ -1213,12 +1437,15 @@
width="60%" width="60%"
:footer="null" :footer="null"
v-model:visible="modal1Visible" 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)" @ok="setModal1Visible(false)"
> >
<img <img
:width="screenWidth*0.55" :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> </a-modal>
<!-- 学员(小组管理)创建小组抽屉 --> <!-- 学员(小组管理)创建小组抽屉 -->
@@ -1262,11 +1489,13 @@
v-model:FSvisible="FSvisible" v-model:FSvisible="FSvisible"
:projectTaskInfo="facestudent" :projectTaskInfo="facestudent"
/> />
<!-- 活动考勤抽屉 --> <!-- 活动直播考勤抽屉 -->
<active-attendance <active-attendance
v-model:AAvisible="AAvisible" v-model:AAvisible="AAvisible"
:title="showkaoqinText" :datasource="liveData"
classify="1" :title="showKaoqinText"
types="2"
classify="2"
/> />
<!-- 批量面授报名 --> <!-- 批量面授报名 -->
@@ -1825,9 +2054,9 @@ import ProjectFaceTaskManage from "../../components/drawers/project/ProjectFaceT
import ProjectOnlineManage from "../../components/drawers/project/ProjectOnlineManage"; import ProjectOnlineManage from "../../components/drawers/project/ProjectOnlineManage";
import ProjectHomeWorkManage from "../../components/drawers/project/ProjectHomeWorkManage"; import ProjectHomeWorkManage from "../../components/drawers/project/ProjectHomeWorkManage";
import ProjectExamManage from "../../components/drawers/project/ProjectExamManage"; import ProjectExamManage from "../../components/drawers/project/ProjectExamManage";
import ProjectEvalManage from "../../components/drawers/project/ProjectEvalManage"; import ProjectEvalManage from "../../components/drawers/project/ProjectEvalManage";
import AddCertificate from "../../components/drawers/project/AddCertificate"; import AddCertificate from "../../components/drawers/project/AddCertificate";
import CreateCertificate from "../../components/drawers/project/CreateCertificate"; import CreateCertificate from "../../components/drawers/project/CreateCertificate";
import ProjectVoteManage from "../../components/drawers/project/ProjectVoteManage"; import ProjectVoteManage from "../../components/drawers/project/ProjectVoteManage";
import SubsetManage from "../../components/drawers/SubsetManage"; import SubsetManage from "../../components/drawers/SubsetManage";
@@ -1899,17 +2128,17 @@ export default {
TableStudent, TableStudent,
AddCertificate, AddCertificate,
CreateCertificate, CreateCertificate,
ProjectVoteManage ProjectVoteManage,
}, },
setup() { setup() {
const store = useStore(); const store = useStore();
const route = useRoute(); const route = useRoute();
const state = reactive({ const state = reactive({
screenHeight: document.body.clientHeight, screenHeight: document.body.clientHeight,
screenWidth: document.body.clientWidth, screenWidth: document.body.clientWidth,
editRecord: {}, editRecord: {},
choosedStageIndex:0, choosedStageIndex: 0,
hasTask:false, hasTask: false,
tabFlag: true, tabFlag: true,
stage: [], stage: [],
stuColumns: [ stuColumns: [
@@ -1923,7 +2152,7 @@ export default {
ellipsis: true, ellipsis: true,
customRender: ({ record }) => ( customRender: ({ record }) => (
<div> <div>
{record.finishTaskNum|| 0}/{record.totalTaskNum || 0} {record.finishTaskNum || 0}/{record.totalTaskNum || 0}
</div> </div>
), ),
}, },
@@ -1937,7 +2166,11 @@ export default {
ellipsis: true, ellipsis: true,
customRender: ({ record }) => ( customRender: ({ record }) => (
<div> <div>
{record.finishTaskNum ==0?"未开始":record.finishTaskNum == record.totalTaskNum?"已完成":"进行中"} {record.finishTaskNum == 0
? "未开始"
: record.finishTaskNum == record.totalTaskNum
? "已完成"
: "进行中"}
</div> </div>
), ),
}, },
@@ -2047,7 +2280,7 @@ export default {
projectVoteModelVisible: false, // 投票管理 projectVoteModelVisible: false, // 投票管理
TMvisible: false, //考试管理 TMvisible: false, //考试管理
Evalvisible: false, //测评管理 Evalvisible: false, //测评管理
ACertificate: false, //证书添加 ACertificate: false, //证书添加
CCertificate: false, //证书创建 CCertificate: false, //证书创建
Stuvisible: false, //添加学员 Stuvisible: false, //添加学员
Importvisible: false, //导入学员 Importvisible: false, //导入学员
@@ -2536,7 +2769,8 @@ export default {
//直播、面授传递title //直播、面授传递title
showWorkText: "", showWorkText: "",
//直播、活动页面传递参数 //直播、活动页面传递参数
showkaoqinText: "", showkaoqinText: "直播",
liveData: "",
//所有抽屉的传过去的type //所有抽屉的传过去的type
itemstype: null, itemstype: null,
@@ -2588,8 +2822,8 @@ export default {
evaltype: "", evaltype: "",
evalData: "", evalData: "",
voteData: "", voteData: "",
voteModelVisibleTitle:'', voteModelVisibleTitle: "",
voteLevelName:'', voteLevelName: "",
facestudent: "", facestudent: "",
modal1Visible: false, // 证书预览 modal1Visible: false, // 证书预览
@@ -2614,7 +2848,7 @@ export default {
totalTaskCnt: 0, totalTaskCnt: 0,
totalReqCnt: 0, totalReqCnt: 0,
totalOptCnt: 0, totalOptCnt: 0,
} },
], ],
stageList: [ stageList: [
// 阶段列表 // 阶段列表
@@ -2655,7 +2889,7 @@ export default {
} }
} }
} }
levelList.stageList = res.data.data.stageList levelList.stageList = res.data.data.stageList;
//暂时传个固定的id用 到时候看数据里面是否有在更换 //暂时传个固定的id用 到时候看数据里面是否有在更换
// state.projectTaskId = res.data.data.stageList[0].taskList[0].projectTaskId // state.projectTaskId = res.data.data.stageList[0].taskList[0].projectTaskId
let leng = res.data.data.stageList.length; let leng = res.data.data.stageList.length;
@@ -2869,9 +3103,18 @@ export default {
state.chooseGroupId = id; state.chooseGroupId = id;
}; };
//活动考勤的抽屉 //活动考勤的抽屉
const showAA = (title) => { {
/* const showAA = (title) => {
state.AAvisible = true; state.AAvisible = true;
state.showkaoqinText = title; 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) => { const showWork = (name, id, item) => {
@@ -2880,14 +3123,16 @@ export default {
state.projectTaskId = id; state.projectTaskId = id;
state.projectTaskInfo = item; state.projectTaskInfo = item;
}; };
{/* 直播管理的抽屉 */} {
/* 直播管理的抽屉 */
}
const showVote = (name, id, data) => { const showVote = (name, id, data) => {
console.log(name, id, data) console.log(name, id, data);
state.projectVoteModelVisible = true; state.projectVoteModelVisible = true;
state.voteData = data; state.voteData = data;
state.voteModelVisibleTitle = name; state.voteModelVisibleTitle = name;
state.voteLevelName = '无阶段任务'; state.voteLevelName = "无阶段任务";
} };
//考试管理的抽屉 //考试管理的抽屉
const showTest = (name, id, data) => { const showTest = (name, id, data) => {
state.examData = data; state.examData = data;
@@ -3623,7 +3868,9 @@ export default {
state.noticeFlag = info.noticeFlag; state.noticeFlag = info.noticeFlag;
state.switchopen = info.attachSwitch == 1 ? true : false; state.switchopen = info.attachSwitch == 1 ? true : false;
state.docChecked = 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.attach = info.attach;
// state.templateId = info.templateId; // state.templateId = info.templateId;
state.sourceBelong = state.sourceBelong =
@@ -4246,9 +4493,9 @@ export default {
// 共享文档文件下载 // 共享文档文件下载
const downloadFile = (url) => { const downloadFile = (url) => {
console.log(url) console.log(url);
if(url){ if (url) {
window.open(url) window.open(url);
} }
// if(url){ // if(url){
// const filename = '操作指南' // const filename = '操作指南'
@@ -4265,14 +4512,16 @@ export default {
// } // }
// x.send() // x.send()
// } // }
} };
function stageChange(item,index){ function stageChange(item, index) {
state.choosedStageId = item.stageId state.choosedStageId = item.stageId;
state.choosedStageIndex = index; state.choosedStageIndex = index;
} }
{/* 证书 */} {
function addCertificate(){ /* 证书 */
}
function addCertificate() {
state.ACertificate = true; state.ACertificate = true;
} }
@@ -4390,7 +4639,7 @@ export default {
checkType, checkType,
downloadFile, downloadFile,
addCertificate, addCertificate,
previewPic previewPic,
}; };
}, },
}; };
@@ -5966,7 +6215,7 @@ export default {
.groupright { .groupright {
display: flex; display: flex;
margin-left: 48px;
.btn1 { .btn1 {
width: 100px; width: 100px;
height: 40px; height: 40px;