feat:合并

This commit is contained in:
lixg
2023-02-01 17:33:42 +08:00
22 changed files with 752 additions and 1306 deletions

View File

@@ -49,7 +49,8 @@
"eslintConfig": { "eslintConfig": {
"root": true, "root": true,
"env": { "env": {
"node": true "node": true,
"vue/setup-compiler-macros": true
}, },
"extends": [ "extends": [
"plugin:vue/vue3-essential", "plugin:vue/vue3-essential",

View File

@@ -18,46 +18,37 @@
<router-view/> <router-view/>
</div> </div>
</template> </template>
<script> <script setup>
import { computed, defineComponent, ref, onMounted } from "vue"; import {ref, onMounted} from "vue";
import { useRouter, useRoute } from "vue-router";
import {useStore, createStore} from "vuex"; import {useStore, createStore} from "vuex";
import NavLeft from "@/components/NavLeft"; import NavLeft from "@/components/NavLeft";
import NavTop from "@/components/NavTop"; import NavTop from "@/components/NavTop";
import OpenPages from "@/components/OpenPages"; import OpenPages from "@/components/OpenPages";
import BreadCrumb from "@/components/BreadCrumb"; import BreadCrumb from "@/components/BreadCrumb";
import zhCN from "ant-design-vue/es/locale/zh_CN"; import zhCN from "ant-design-vue/es/locale/zh_CN";
import * as api from "./api/index1";
import * as api1 from "@/api/index1"; import * as api1 from "@/api/index1";
import * as api2 from "@/api/index"; import * as api2 from "@/api/index";
export default defineComponent({
components: {
NavLeft,
NavTop,
OpenPages,
BreadCrumb,
},
setup() {
const router = useRouter();
const route = useRoute();
const store = useStore(); const store = useStore();
const isLogin = ref(false); const isLogin = ref(false);
// console.log("router", router.getRoutes(), route);
console.log("版本2.1.6------------"); console.log("版本2.1.6------------");
const routes = computed(() => {
return router.getRoutes().filter((e) => e.meta?.isLink); // 监听关闭浏览器
}); let time1 = ref(0);
// watch( let time2 = ref(0);
// () => route.path,
// () => { onMounted(() => {
// route.path === "/login" && (isLogin.value = true); init()
// } window.addEventListener('beforeunload', e => beforeunloadHandler(e));
// ); window.addEventListener('unload', e => unloadHandler(e));
const currentRouteName = computed(() => route.name); })
//添加监听事件
function beforeunloadHandler() {
time1.value = new Date().getTime();
}
function init() { function init() {
console.log(store);
getUserInfo(); getUserInfo();
initDict("faceclassPic"); initDict("faceclassPic");
initDict("faceclassClass"); initDict("faceclassClass");
@@ -69,17 +60,6 @@ export default defineComponent({
initDict("projectPic"); initDict("projectPic");
initDict("sysType"); initDict("sysType");
getMemberInfo(); getMemberInfo();
getOrgTree();
}
// 监听关闭浏览器
let time1 = ref(0);
let time2 = ref(0);
//添加监听事件
function beforeunloadHandler() {
time1.value = new Date().getTime();
// e.returnValue = '关闭提示';
} }
function unloadHandler() { function unloadHandler() {
@@ -90,13 +70,6 @@ export default defineComponent({
} }
} }
onMounted(()=>{
window.addEventListener('beforeunload', e => beforeunloadHandler(e));
window.addEventListener('unload', e => unloadHandler(e));
})
async function getMemberInfo() { async function getMemberInfo() {
const list = localStorage.getItem("memberInitInfo"); const list = localStorage.getItem("memberInitInfo");
if (list) { if (list) {
@@ -130,48 +103,9 @@ export default defineComponent({
} }
const getDictList = (param) => api1.getDictTree({setCode: param,}).then((res) => res.data.data); const getDictList = (param) => api1.getDictTree({setCode: param,}).then((res) => res.data.data);
//获取组织树
const getOrgTree = () => {
api.getOrgTreeInfo().then((res) => {
store.commit("getOrgtreeList", res.data.data);
});
};
init();
return {
isLogin,
routes,
name: currentRouteName,
zhCN,
};
}
});
</script> </script>
<style lang="scss"> <style lang="scss">
//.ant-modal {
//
// .ant-modal-content {
// background-image: linear-gradient(
// 180deg, rgba(103, 64, 255, .2), rgba(166, 168, 255, 0), rgba(166, 168, 255, 0)) !important;
// border-radius: 4px;
//
// .ant-modal-body {
// .ant-btn {
// border-radius: 8px;
// width: 100px;
// height: 40px;
// }
//
// .ant-btn-primary {
// background: #4ea6ff;
// color: #fff;
// }
// }
// }
//}
#app { #app {
// font-family: MicrosoftYaHei, Microsoft YaHei, Avenir, Helvetica, Arial,
// sans-serif;
font-family: Helvetica Neue, Helvetica, PingFang SC, Hiragino Sans GB, font-family: Helvetica Neue, Helvetica, PingFang SC, Hiragino Sans GB,
Microsoft YaHei, Arial, sans-serif; Microsoft YaHei, Arial, sans-serif;
-webkit-font-smoothing: antialiased; -webkit-font-smoothing: antialiased;

View File

@@ -43,3 +43,6 @@ export const AttendanceLeave = (obj) => http.post('/stu/task/attendance/leave',
// 直播考勤签到 // 直播考勤签到
export const AttendanceSign = (obj) => http.post('/stu/task/attendance/sign', obj) export const AttendanceSign = (obj) => http.post('/stu/task/attendance/sign', obj)
// 查询项目管理的信息
export const QueryProjectManageDetail = (obj) => http.post('/project/management/queryProjectManageDetail', obj)

View File

@@ -121,11 +121,17 @@ export function usePage(_url, params, init = true) {
}) })
if (isRef(params)) { if (isRef(params)) {
watch(params, () => { watch(params.value, () => {
fetch() fetch()
}) })
} }
if (isRef(_url)) {
watchEffect(fetch)
} else {
init && fetch()
}
function reset(){ function reset(){
state.data = [] state.data = []
state.loading = false state.loading = false
@@ -142,12 +148,6 @@ export function usePage(_url, params, init = true) {
}) })
} }
if (isRef(_url)) {
watchEffect(fetch)
} else {
init && fetch()
}
return { return {
...toRefs(state), ...toRefs(state),
fetch, fetch,

View File

@@ -0,0 +1,20 @@
<template>
<div className="tableSelect" style="margin-left: 0">
<a-select :value="value" dropdownClassName="tabledropdown">
<template :key="index" v-for="(item, index) in $slots.default()">
<a-select-option v-if="item.children!=='v-if'" :value="index">
<component :is="item"></component>
</a-select-option>
</template>
</a-select>
</div>
</template>
<script setup>
import {defineProps} from "vue";
defineProps({
value: {
type: String,
default: ''
}
})
</script>

View File

@@ -3,7 +3,7 @@
<!-- <div class="split"></div> --> <!-- <div class="split"></div> -->
<div class="noticeTitle"> <div class="noticeTitle">
<!-- <div class="notitle"><span class="titlespan">公告</span></div> --> <!-- <div class="notitle"><span class="titlespan">公告</span></div> -->
<div class="switch"> <div v-button-per="permissions" class="switch">
<a-switch <a-switch
v-model:checked="noticeChecked" v-model:checked="noticeChecked"
@click="noticeFlag" @click="noticeFlag"
@@ -25,7 +25,7 @@
style="margin-top: -10px; height: 220px;border:1px solid #fff; resize: none;background-color: #fff;color:#666;" style="margin-top: -10px; height: 220px;border:1px solid #fff; resize: none;background-color: #fff;color:#666;"
/> />
<!-- <pre>{{noticeContent1}}</pre> --> <!-- <pre>{{noticeContent1}}</pre> -->
<div class="btn-content"> <div class="btn-content" v-button-per="permissions">
<a-button type="primary" @click="handleEdit">编辑</a-button> <a-button type="primary" @click="handleEdit">编辑</a-button>
</div> </div>
</template> </template>
@@ -49,7 +49,7 @@
placeholder="公告信息最多输入150个字" placeholder="公告信息最多输入150个字"
style="margin-top: -10px; height: 160px;" style="margin-top: -10px; height: 160px;"
/> />
<div class="btn-content"> <div class="btn-content" v-button-per="permissions">
<a-button class="cancel" @click="handleCancel">取消</a-button> <a-button class="cancel" @click="handleCancel">取消</a-button>
<a-button type="primary" @click="pubNotice" class="sure"> <a-button type="primary" @click="pubNotice" class="sure">
发布 发布
@@ -69,6 +69,10 @@ import emitter from "../../utils/bus";
export default { export default {
name: "NoticePub", name: "NoticePub",
props: { props: {
permissions:{
type:String,
default:''
},
projectId: { projectId: {
type: Number, type: Number,
default: null, default: null,

View File

@@ -144,7 +144,7 @@
<div class="groupright"> <div class="groupright">
<div class="spandiv"><span class="spantext">规则</span></div> <div class="spandiv"><span class="spantext">规则</span></div>
<div v-if="edit" class="btns"> <div v-if="edit" class="btns">
<div class="btn1" @click="edit = false"> <div v-button-per="permissions" class="btn1" @click="edit = false">
<img src="../../assets/images/projectadd/edit1.png" /> <img src="../../assets/images/projectadd/edit1.png" />
<span class="btn1text">编辑</span> <span class="btn1text">编辑</span>
</div> </div>
@@ -302,6 +302,10 @@ export default {
StuScoreDetail, StuScoreDetail,
}, },
props: { props: {
permissions:{
type:String,
default: ''
},
projectId: { projectId: {
type: Number, type: Number,
default: null, default: null,

View File

@@ -112,10 +112,11 @@
</div>--> </div>-->
</div> </div>
</a-drawer> </a-drawer>
<CVote <!-- 学员查看抽屉 -->
v-model:CVvisible="CVvisible" <check-stu
:voteID="voteID" v-model:CheckStuvisible="CheckStuvisible"
:courseID="courseID" v-model:routerId="routerId"
v-model:studentId="studentId"
/> />
</template> </template>
@@ -124,12 +125,12 @@
import { message } from "ant-design-vue"; import { message } from "ant-design-vue";
// import * as api from "../../../api/index"; // import * as api from "../../../api/index";
import * as api from "../../../api/indexTaskManage"; import * as api from "../../../api/indexTaskManage";
import CVote from "../CheckVote.vue" import CheckStu from "../CheckStu";
export default { export default {
name: "RouterProjectManage", name: "RouterProjectManage",
components:{ components:{
CVote, CheckStu,
}, },
props: { props: {
PjModelVisible: { PjModelVisible: {
@@ -185,25 +186,25 @@
id: 3, id: 3,
value: "3", value: "3",
label: "已完成", label: "已完成",
}, }
{
id: 4,
value: "4",
label: "未完成",
},
], ],
tabledata: [], tabledata: [],
tableDataTotalLoading: true, // 表格loading加载配置 tableDataTotalLoading: true, // 表格loading加载配置
CVvisible:false, //查看投票抽屉 CVvisible:false, //查看投票抽屉
voteID: "", voteID: "",
courseID: "" courseID: "",
routerId: '',
studentId: '',
CheckStuvisible: false,
}); });
const tableDataFunc = () => { const tableDataFunc = () => {
const columns = [ const columns = [
{ {
title: "工号", title: "工号",
dataIndex: "studentUserNo", dataIndex: "studentCode",
key: "studentUserNo", key: "studentCode",
width: "20%", width: "20%",
align: "center", align: "center",
ellipsis: true, ellipsis: true,
@@ -211,7 +212,7 @@
customRender: (text) => { customRender: (text) => {
return ( return (
<div class="racona"> <div class="racona">
<span> {text.record.studentUserNo?text.record.studentUserNo:"-"}</span> <span> {text.record.studentCode?text.record.studentCode:"-"}</span>
</div> </div>
); );
}, },
@@ -267,24 +268,72 @@
}, },
{ {
title: "学员关卡", title: "学员关卡",
dataIndex: "chapterName",
key: "chapterName",
width: "10%",
align: "center",
ellipsis: true,
className: "h",
customRender: (text) => {
return (
<div class="racona">
<span> {text.record.chapterName?text.record.chapterName:"-"}</span>
</div>
);
},
},
{
title: "当前阶段",
dataIndex: "currentStageName", dataIndex: "currentStageName",
key: "currentStageName", key: "currentStageName",
width: "10%", width: "10%",
align: "center", align: "center",
ellipsis: true, ellipsis: true,
className: "h", className: "h",
customRender: () => { customRender: (text) => {
return ( return (
<div class="racona"> <div class="racona">
<span> {props.levelName}</span> <span> {text.record.currentStageName?text.record.currentStageName:"-"}</span>
</div>
);
},
},
{
title: "当前任务",
dataIndex: "currentTaskName",
key: "currentTaskName",
width: "10%",
align: "center",
ellipsis: true,
className: "h",
customRender: (text) => {
return (
<div class="racona">
<span> {text.record.currentTaskName?text.record.currentTaskName:"-"}</span>
</div>
);
},
},
{
title: "进度",
dataIndex: "process",
key: "process",
width: "10%",
align: "center",
ellipsis: true,
className: "h",
customRender: (text) => {
return (
<div class="racona">
<span> {text.record.process?text.record.process:"-"}</span>
</div> </div>
); );
}, },
}, },
{ {
title: "完成时间", title: "完成时间",
dataIndex: "lastStudyTime", dataIndex: "finishEdTime",
key: "lastStudyTime", key: "finishEdTime",
width: "15%", width: "15%",
align: "center", align: "center",
ellipsis: true, ellipsis: true,
@@ -292,7 +341,7 @@
customRender: (text) => { customRender: (text) => {
return ( return (
<div class="racona"> <div class="racona">
<span> {text.record.lastStudyTime?text.record.lastStudyTime:"-"}</span> <span> {text.record.finishEdTime?text.record.finishEdTime:"-"}</span>
</div> </div>
); );
}, },
@@ -327,20 +376,13 @@
style="color:#387df7;cursor:pointer" style="color:#387df7;cursor:pointer"
onClick={ onClick={
() => { () => {
if(value.record.finishStatus !== 3){ {/* 当前学员 用来查看学员详情 */}
message.destroy() state.routerId = value.record.routerId;
message.error("当前任务未完成") state.studentId = value.record.studentId;
return state.CheckStuvisible = true;
} console.log(value);
{/* 当前投票提交的ID 用来查看投票详情 */}
console.log(value.record.voteSubmitId);
state.voteID = value.record.voteSubmitId;
state.CVvisible = true;
}}> }}>
{value.record.finishStatus == 3 ?
<span style='color:#387df7;'> 查看 </span> <span style='color:#387df7;'> 查看 </span>
:
<span style='color:#999;'> 查看 </span>}
</div> </div>
); );
}, },
@@ -359,8 +401,9 @@
const afterVisibleChange = (bol) => { const afterVisibleChange = (bol) => {
if (bol == true) { if (bol == true) {
console.log("当前是什么类型", props.datasource.type); console.log("当前是什么类型", props.datasource.type);
console.log("当前是什么类型", props.datasource);
state.tableDataTotalLoading = true; state.tableDataTotalLoading = true;
{/* getData(); */} getData();
} }
}; };
const selectProjectName = (value) => { const selectProjectName = (value) => {
@@ -377,51 +420,34 @@
// 获取数据 // 获取数据
function getData() { function getData() {
if(props.datasource.type == 12){ if(props.datasource.type == 13){
console.log("我是传递的查询参数", { console.log("我是传递的查询参数", {
"pageNo": state.currentPage, "courseId": props.datasource.courseId,
"pageSize": state.pageSize,
"chapterId": props.datasource.stageId=="0"?"":props.datasource.stageId,
"status": state.projectName,
"studentName": state.name,
"targetId":props.datasource.projectId,
"taskId": props.datasource.courseId,
"type": 1
});
api.QueryVoteManagementDetail({
"pageNo": state.currentPage, "pageNo": state.currentPage,
"pageSize": state.pageSize, "pageSize": state.pageSize,
"chapterId": props.datasource.chapterId, "chapterId": props.datasource.chapterId,
"status": state.projectName, "status": state.projectName,
"studentName": state.name, "studentName": state.name
"targetId":props.datasource.routerId, });
"taskId": props.datasource.courseId, api.QueryProjectManageDetail({
"type": 1 "courseId": props.datasource.courseId,
"pageNo": state.currentPage,
"pageSize": state.pageSize,
"chapterId": props.datasource.chapterId,
"status": state.projectName,
"studentName": state.name
}).then(res=>{ }).then(res=>{
console.log('投票数据获取', res) console.log('投票数据获取', res)
if(res.data.code==200){ if(res.data.code==200){
state.tableDataTotalLoading = false; state.tableDataTotalLoading = false;
let newData = [] state.tabledata = res.data.data.rows;
for(let i=0;i<res.data.data.rows.length;i++){
// 处理在线课字段和表格中字段保持一致
let obj = {
studentUserNo: res.data.data.rows[i].studentCode,
studentName: res.data.data.rows[i].studentName,
studentDepartName: res.data.data.rows[i].studentDepartName,
studentJobName: res.data.data.rows[i].studentJobName,
lastStudyTime: res.data.data.rows[i].submitTime,
finishStatus: res.data.data.rows[i].status?res.data.data.rows[i].status:0,
voteSubmitId: res.data.data.rows[i].voteSubmitId
}
newData.push(obj)
}
state.tabledata = newData;
state.courseID = props.datasource.courseId; state.courseID = props.datasource.courseId;
state.tableDataTotal = res.data.data.total; state.tableDataTotal = res.data.data.total;
} }
}).catch(err=>{ }).catch(err=>{
console.log(err) console.log(err)
state.tableDataTotalLoading = false; state.tableDataTotalLoading = false;
state.tabledata = [];
}) })
}else{ }else{
state.tableDataTotalLoading = false; state.tableDataTotalLoading = false;
@@ -453,8 +479,8 @@
// 导出数据 // 导出数据
function exportTaskStu() { function exportTaskStu() {
console.log(`${process.env.VUE_APP_BASE_API}/admin/vote/manage/export/vote?type=${1}&voteId=${props.datasource.routerTaskId}`) console.log(`${process.env.VUE_APP_BASE_API}/project/management/exportProjectManage?courseId=${props.datasource.courseId}`)
window.open(`${process.env.VUE_APP_BASE_API}/admin/vote/manage/export/vote?type=${1}&voteId=${props.datasource.routerTaskId}`) window.open(`${process.env.VUE_APP_BASE_API}/project/management/exportProjectManage?courseId=${props.datasource.courseId}`)
} }
return { return {
@@ -477,8 +503,13 @@
</script> </script>
<style lang="scss"> <style lang="scss">
.ant-drawer-content-wrapper {
max-width: 80% !important;
}
.RouterProjectManage { .RouterProjectManage {
// overflow-x: auto; // overflow-x: auto;
max-width: auto;
.drawerMain { .drawerMain {
min-width: 550px; min-width: 550px;
margin: 0px 32px 0px 32px; margin: 0px 32px 0px 32px;

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: "添加学员",4: "查看权",5: "管理权"}[type] || title }} {{ {1: "添加学员", 2: "添加学员", 3: "添加学员"}[type] || title }}
</div> </div>
<img <img
style="width: 29px; height: 29px; cursor: pointer" style="width: 29px; height: 29px; cursor: pointer"
@@ -288,32 +288,8 @@
</div> </div>
</div> </div>
</a-drawer> </a-drawer>
<div @click="openDrawer"> <a-button @click="openDrawer" type="link"><slot></slot></a-button>
<slot></slot>
</div> </div>
</div>
<!--
<a-modal
v-model:visible="stageVisible"
width="1000px"
title="选择阶段"
@ok="handleStageOk"
>
<div>
{{ type === 1 ? "选择阶段" : "" }}
<a-select
style="width: 150px"
:placeholder="type === 1 ? '选择阶段' : '选择关卡'"
v-model:value="selectsData.stageId"
className="cus-select"
>
<a-select-option v-for="(item, i) in stageIds" :key="i" :value="item.id"
>{{ item.name || "默认" }}
</a-select-option>
</a-select>
</div>
</a-modal>
-->
<a-modal <a-modal
:style="{padding: 0,position: relative,right: '-20%'}" :style="{padding: 0,position: relative,right: '-20%'}"
:closable="true" :closable="true"

View File

@@ -29,7 +29,7 @@ import { defineProps, ref } from "vue";
import TableModelStudent from "@/components/student/TableModelStudent"; import TableModelStudent from "@/components/student/TableModelStudent";
import CommonStudent from "@/components/student/CommonStudent"; import CommonStudent from "@/components/student/CommonStudent";
const props = defineProps({ defineProps({
id: String, id: String,
type: Number, type: Number,
types: { types: {
@@ -37,7 +37,6 @@ const props = defineProps({
default: () => [], default: () => [],
}, },
}); });
console.log("props", props.types);
const tableModelRef = ref(); const tableModelRef = ref();
function submitCall(flag) { function submitCall(flag) {

View File

@@ -8,7 +8,9 @@
> >
<div class="drawerMain" id="ProjCheckship" style=""> <div class="drawerMain" id="ProjCheckship" style="">
<div class="header"> <div class="header">
<div class="headerTitle">权限名单</div> <div class="headerTitle">
权限名单
</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"
@@ -25,7 +27,7 @@
<a-form-item title="姓名:"> <a-form-item title="姓名:">
<a-input <a-input
class="cus-input" class="cus-input"
v-model:value="searchParams.studentName" v-model:value="searchName"
placeholder="请输入姓名" placeholder="请输入姓名"
/> />
</a-form-item> </a-form-item>
@@ -34,28 +36,16 @@
<a-button <a-button
class="cus-btn" class="cus-btn"
style="background: #4ea6ff; color: #fff; width: 100px" style="background: #4ea6ff; color: #fff; width: 100px"
@click="searchStu" @click="search"
> >
<template #icon <template #icon><img style="margin-right: 10px" src="../../assets/images/courseManage/search0.png"/>
><img
style="margin-right: 10px"
src="../../assets/images/courseManage/search0.png"
/>
</template> </template>
搜索 搜索
</a-button> </a-button>
</a-col> </a-col>
<a-col :span="2"> <a-col :span="2">
<a-button <a-button class="cus-btn white" style="width: 100px" @click="reset">
class="cus-btn white" <template #icon><img style="margin-right: 10px" src="../../assets/images/leveladd/reset.png"/>
style="width: 100px"
@click="reset"
>
<template #icon
><img
style="margin-right: 10px"
src="../../assets/images/leveladd/reset.png"
/>
</template> </template>
重置 重置
</a-button> </a-button>
@@ -72,9 +62,7 @@
<template #action="{ record }"> <template #action="{ record }">
<a-space :size="2"> <a-space :size="2">
<slot name="extension" v-bind:data="{ record }"></slot> <slot name="extension" v-bind:data="{ record }"></slot>
<a-button @click="del(record.id)" type="link" danger <a-button v-if="record.type!==6 && record.type!==9 && record.type!==12" @click="del(record.id)" type="link" danger>删除</a-button>
>删除</a-button
>
</a-space> </a-space>
</template> </template>
</a-table> </a-table>
@@ -86,20 +74,11 @@
</div> </div>
</div> </div>
</a-drawer> </a-drawer>
<div @click="openDrawer"> <a-button @click="openDrawer" type="link"><slot></slot></a-button>
<slot></slot>
</div>
</div> </div>
</template> </template>
<script setup> <script setup>
import { import {computed, createVNode, defineProps, defineExpose, ref, watch} from "vue";
computed,
createVNode,
defineProps,
defineExpose,
ref,
watch,
} from "vue";
import {usePage} from "@/api/request"; import {usePage} from "@/api/request";
import {STUDENT_LIST} from "@/api/apis"; import {STUDENT_LIST} from "@/api/apis";
import {delStudentList} from "@/api/index1"; import {delStudentList} from "@/api/index1";
@@ -123,14 +102,15 @@ const visiable = ref(false);
const initParams = { const initParams = {
studentName: "", studentName: "",
page: 1, pageNo: 1,
pageSize: 10, pageSize: 10,
type: props.type || "", type: props.type || '',
types: props.types, types: props.types,
pid: props.id || "", pid: props.id || '',
}; }
const searchParams = ref(initParams); const searchParams = ref(initParams)
const searchName = ref('')
const columns = ref([ const columns = ref([
{ {
@@ -163,8 +143,7 @@ const columns = ref([
key: "type", key: "type",
width: 30, width: 30,
align: "center", align: "center",
customRender: ({ record: { type } }) => customRender: ({record: {type}}) => ({4: "查看权", 5: "管理权", 6: "归属权",7: "查看权", 8: "管理权", 9: "归属权",10: "查看权", 11: "管理权", 12: "归属权"}[type])
({ 4: "查看权", 5: "管理权", 6: "归属权" }[type]),
}, },
{ {
title: "操作", title: "操作",
@@ -174,41 +153,40 @@ const columns = ref([
align: "center", align: "center",
slots: {customRender: "action"}, slots: {customRender: "action"},
}, },
]); ])
const { const {data: studentList, fetch: searchStu, total, loading} = usePage(STUDENT_LIST, searchParams)
data: studentList,
fetch: searchStu,
total,
loading,
} = usePage(STUDENT_LIST, searchParams.value);
const stuPagination = computed(() => ({ const stuPagination = computed(() => ({
total: total, total:total.value,
showSizeChanger: false, showSizeChanger: false,
current: searchParams.value.page, current: searchParams.value.pageNo,
pageSize: searchParams.value.pageSize, pageSize: searchParams.value.pageSize,
onChange: changePagination, onChange: changePagination
})); }));
const openDrawer = () => { const openDrawer = () => {
visiable.value = true; visiable.value = true;
}; };
const changePagination = (page) => { const changePagination = (page) => {
searchParams.value.page = page; searchParams.value.pageNo = page;
searchStu();
}; };
function search(){
searchParams.value.studentName = searchName.value
searchParams.value.pageNo = 1
}
function del(id) { function del(id) {
Modal.confirm({ Modal.confirm({
title: () => "确定删除?", title: () => '确定删除?',
icon: () => createVNode(ExclamationCircleOutlined), icon: () => createVNode(ExclamationCircleOutlined),
content: () => "数据删除后不可恢复!", content: () => '数据删除后不可恢复!',
okText: () => "确定", okText: () => '确定',
okType: "danger", okType: 'danger',
cancelText: () => "取消", cancelText: () => '取消',
onOk() { onOk() {
id && delStudentList({ ids: [id] }).then(() => searchStu()); id && delStudentList({ids: [id]}).then(() => searchStu())
}, },
}); });
} }
@@ -218,19 +196,19 @@ const closeDrawer = () => {
}; };
function reset(){ function reset(){
searchParams.value = initParams; searchParams.value = initParams
searchStu(); searchName.value=''
} }
watch(visiable, () => { watch(visiable, () => {
visiable.value && searchStu(); visiable.value && searchStu()
searchParams.value = initParams; searchParams.value = initParams
}); });
defineExpose({ defineExpose({
searchStu, searchStu,
loading, loading
}); })
</script> </script>
<style lang="scss"> <style lang="scss">
.cus-btn { .cus-btn {

View File

@@ -79,6 +79,7 @@
type="flex" type="flex"
gutter="12" gutter="12"
style="padding-left: 20px; margin-right: 0px" style="padding-left: 20px; margin-right: 0px"
v-button-per="permissions"
> >
<a-col :span="1.5"> <a-col :span="1.5">
<CommonStudent <CommonStudent
@@ -217,18 +218,20 @@
<slot name="extension" v-bind:data="{ record }"></slot> <slot name="extension" v-bind:data="{ record }"></slot>
<a-button <a-button
v-button-per="permissions"
v-if="type === 3 && record.status !== 0" v-if="type === 3 && record.status !== 0"
@click="updateStatus(0, record.id)" @click="updateStatus(0, record.id)"
type="link" type="link"
>通过</a-button >通过</a-button
> >
<a-button <a-button
v-button-per="permissions"
v-if="type === 3 && record.status !== 0" v-if="type === 3 && record.status !== 0"
@click="updateStatus(2, record.id)" @click="updateStatus(2, record.id)"
type="link" type="link"
>拒绝</a-button >拒绝</a-button
> >
<a-button @click="del(record.id)" type="link" danger>删除</a-button> <a-button v-button-per="permissions" @click="del(record.id)" type="link" danger>删除</a-button>
</a-space> </a-space>
</template> </template>
</a-table> </a-table>
@@ -354,6 +357,10 @@ import { ExclamationCircleOutlined } from "@ant-design/icons-vue";
const props = defineProps({ const props = defineProps({
type: Number, type: Number,
permissions:{
type: String,
default: ''
},
id: String, id: String,
columns: { columns: {
type: Array, type: Array,

View File

@@ -16,6 +16,7 @@ import 'element-plus/dist/index.css'
import "@/assets/scss/common.scss" import "@/assets/scss/common.scss"
import Antd from 'ant-design-vue'; import Antd from 'ant-design-vue';
import 'ant-design-vue/dist/antd.css'; import 'ant-design-vue/dist/antd.css';
import {vButPer} from "@/utils/directive";
// import axios from 'axios' // import axios from 'axios'
// axios.defaults.withCredentials = true; // axios.defaults.withCredentials = true;
// import zhCN from 'ant-design-vue/es/locale/zh_CN'; // import zhCN from 'ant-design-vue/es/locale/zh_CN';
@@ -28,4 +29,5 @@ app.config.warnHandler = () => null;
app.use(Antd); app.use(Antd);
app.use(router); app.use(router);
app.use(store); app.use(store);
app.directive('buttonPer', vButPer)
app.mount('#app'); app.mount('#app');

13
src/utils/directive.js Normal file
View File

@@ -0,0 +1,13 @@
export const vButPer = {
mounted: (el, binding) => {
checkPer(binding.value) || el.parentNode.removeChild(el)
}
}
const admin = [5, 6, 8, 9, 11, 12]
function checkPer(per) {
if (!per) {
return true
}
return (per + "").split(',').some(t => admin.some(s => s == t))
}

View File

@@ -315,8 +315,9 @@
> >
<template #bodyCell="{ record, column }"> <template #bodyCell="{ record, column }">
<template v-if="column.key === 'operation'"> <template v-if="column.key === 'operation'">
<a-space :size="0"> <a-space>
<a-button <a-button
v-button-per="record.permissions"
v-if=" v-if="
record.status === 0 || record.status === -1 || !record.kkty record.status === 0 || record.status === -1 || !record.kkty
" "
@@ -325,6 +326,7 @@
>编辑</a-button >编辑</a-button
> >
<a-button <a-button
v-button-per="record.permissions"
block block
v-if="record.status === 2" v-if="record.status === 2"
@click="() => handleStart(record, String(record.courseform))" @click="() => handleStart(record, String(record.courseform))"
@@ -332,6 +334,7 @@
>开课</a-button >开课</a-button
> >
<a-button <a-button
v-button-per="record.permissions"
v-if="record.status === 2" v-if="record.status === 2"
@click="() => handleLook(record, String(record.courseform))" @click="() => handleLook(record, String(record.courseform))"
type="link" type="link"
@@ -343,86 +346,57 @@
type="link" type="link"
>管理</a-button >管理</a-button
> >
<div className="tableSelect" style="margin-left: 0"> <DropDown v-button-per="record.permissions" value="授权">
<a-select value="授权" dropdownClassName="tabledropdown"> <OwnerTableModelStudent
<a-select-option value="权限名单" label="权限名单">
<TableModelStudent
:types="[10, 11, 12]" :types="[10, 11, 12]"
:id="record.offcourseId" :id="record.offcourseId"
>权限名单</TableModelStudent >权限名单</OwnerTableModelStudent
> >
</a-select-option> <CommonStudent
<a-select-option value="查看权" label="查看权"> :type="10"
<CommonStudent :type="10" :id="record.offcourseId" :id="record.offcourseId"
title="查看权"
>查看权</CommonStudent >查看权</CommonStudent
> >
</a-select-option> <CommonStudent
<a-select-option value="管理权" label="管理权"> :type="11"
<CommonStudent :type="11" :id="record.offcourseId" :id="record.offcourseId"
title="管理权"
>管理权</CommonStudent >管理权</CommonStudent
> >
</a-select-option> </DropDown>
</a-select> <DropDown v-button-per="record.permissions" value="更多">
</div>
<div className="tableSelect">
<a-select value="更多" dropdownClassName="tabledropdown">
<a-select-option value="复制" label="复制">
<a-button <a-button
@click=" @click="() => handleCopy(record, String(record.courseform))"
() => handleCopy(record, String(record.courseform))
"
type="link" type="link"
>复制</a-button >复制</a-button
> >
</a-select-option>
<a-select-option
v-if="record.status === 1"
value="撤回"
label="撤回"
>
<a-button <a-button
@click=" @click="
() => () => handleRejectExit(record, String(record.courseform))
handleRejectExit(record, String(record.courseform))
" "
type="link" type="link"
>撤回</a-button >撤回</a-button
> >
</a-select-option>
<a-select-option
v-if="record.status === 2"
value="停用"
label="停用"
>
<a-button <a-button
v-if="record.status === 2 && record.kkty" v-if="record.status === 2 && record.kkty"
@click=" @click="() => handleStop(record, String(record.courseform))"
() => handleStop(record, String(record.courseform))
"
type="link" type="link"
>停用</a-button >停用</a-button
> >
<a-button <a-button
v-if="record.status === 2 && !record.kkty" v-if="record.status === 2 && !record.kkty"
@click=" @click="() => handleOpen(record, String(record.courseform))"
() => handleOpen(record, String(record.courseform))
"
type="link" type="link"
>启用</a-button >启用</a-button
> >
</a-select-option>
<a-select-option value="删除" label="删除">
<a-button <a-button
@click=" @click="() => handleDelete(record, String(record.courseform))"
() => handleDelete(record, String(record.courseform))
"
type="link" type="link"
danger danger
>删除</a-button >删除</a-button
> >
</a-select-option> </DropDown>
</a-select>
</div>
</a-space> </a-space>
</template> </template>
</template> </template>
@@ -1234,161 +1208,6 @@
</template> </template>
</TableStudent> </TableStudent>
</div> </div>
<div class="tableBox" style="margin-top: 20px">
<!-- <a-table-->
<!-- :columns="columns7"-->
<!-- :data-source="tableData7"-->
<!-- :loading="tableDataTotal3 === -1 ? true : false"-->
<!-- :scroll="{ x: 800 }"-->
<!-- expandRowByClick="true"-->
<!-- @expand="expandTable"-->
<!-- :pagination="false"-->
<!-- :row-selection="{-->
<!-- selectedRowKeys: selectedRowKeys7,-->
<!-- onChange: onSelectChange7,-->
<!-- }"-->
<!-- >-->
<!-- <template #bodyCell="{ record, column }">-->
<!-- &lt;!&ndash; 操作1 &ndash;&gt;-->
<!-- <template-->
<!-- v-if="-->
<!-- (String(record.applyStatus) === '0' ||-->
<!-- record.status === '待审核') &&-->
<!-- column.key === 'overstatus'-->
<!-- "-->
<!-- >-->
<!-- <span class="table-operation">-</span>-->
<!-- </template>-->
<!-- <template-->
<!-- v-if="-->
<!-- (String(record.applyStatus) === '-1' ||-->
<!-- record.status === '已拒绝') &&-->
<!-- column.key === 'overstatus'-->
<!-- "-->
<!-- >-->
<!-- <span class="table-operation">-</span>-->
<!-- </template>-->
<!-- <template-->
<!-- v-if="-->
<!-- (String(record.applyStatus) === '1' ||-->
<!-- record.status === '已通过') &&-->
<!-- column.key === 'overstatus'-->
<!-- "-->
<!-- >-->
<!-- <span class="table-operation">-->
<!-- <a-->
<!-- @click="-->
<!-- () => {-->
<!-- handlJoinStu(record);-->
<!-- }-->
<!-- "-->
<!-- >-->
<!-- 成绩录入-->
<!-- </a>-->
<!-- <a-->
<!-- @click="-->
<!-- () => {-->
<!-- handleOverStu(record);-->
<!-- }-->
<!-- "-->
<!-- >-->
<!-- 结业-->
<!-- </a>-->
<!-- </span>-->
<!-- </template>-->
<!-- &lt;!&ndash; 操作2 &ndash;&gt;-->
<!-- <template-->
<!-- v-if="-->
<!-- (String(record.applyStatus) === '0' ||-->
<!-- record.status === '待审核') &&-->
<!-- column.key === 'operation'-->
<!-- "-->
<!-- >-->
<!-- <span class="table-operation">-->
<!-- <a-->
<!-- @click="-->
<!-- () => {-->
<!-- handleSucessStu(record);-->
<!-- }-->
<!-- "-->
<!-- >-->
<!-- 通过-->
<!-- </a>-->
<!-- <a-->
<!-- @click="-->
<!-- () => {-->
<!-- handleRejectStu(record);-->
<!-- }-->
<!-- "-->
<!-- >-->
<!-- 拒绝-->
<!-- </a>-->
<!-- <a-->
<!-- @click="-->
<!-- () => {-->
<!-- handleDeleteStu(record);-->
<!-- }-->
<!-- "-->
<!-- >-->
<!-- 删除-->
<!-- </a>-->
<!-- </span>-->
<!-- </template>-->
<!-- <template-->
<!-- v-if="-->
<!-- (String(record.applyStatus) === '1' ||-->
<!-- record.status === '已通过') &&-->
<!-- column.key === 'operation'-->
<!-- "-->
<!-- >-->
<!-- <span class="table-operation">-->
<!-- <a-->
<!-- @click="-->
<!-- () => {-->
<!-- handleDeleteStu(record);-->
<!-- }-->
<!-- "-->
<!-- >-->
<!-- 删除-->
<!-- </a>-->
<!-- </span>-->
<!-- </template>-->
<!-- <template-->
<!-- v-if="-->
<!-- (String(record.applyStatus) === '-1' ||-->
<!-- record.status === '已拒绝') &&-->
<!-- column.key === 'operation'-->
<!-- "-->
<!-- >-->
<!-- <span class="table-operation">-->
<!-- <a-->
<!-- @click="-->
<!-- () => {-->
<!-- handleDeleteStu(record);-->
<!-- }-->
<!-- "-->
<!-- >-->
<!-- 删除-->
<!-- </a>-->
<!-- </span>-->
<!-- </template>-->
<!-- </template>-->
<!-- </a-table>-->
<!-- <div class="tableBox" style="margin-top: 50px">-->
<!-- <div class="pa">-->
<!-- <a-pagination-->
<!-- :showSizeChanger="false"-->
<!-- showQuickJumper="true"-->
<!-- hideOnSinglePage="true"-->
<!-- :pageSize="pageSize3"-->
<!-- :current="currentPage3"-->
<!-- :total="tableDataTotal3"-->
<!-- class="pagination"-->
<!-- @change="handelChangePage3"-->
<!-- />-->
<!-- </div>-->
<!-- </div>-->
</div>
</div> </div>
</div> </div>
</div> </div>
@@ -1766,7 +1585,7 @@ 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 CommonStudent from "@/components/student/CommonStudent";
import TableModelStudent from "@/components/student/TableModelStudent"; import OwnerTableModelStudent from "@/components/student/OwnerTableModelStudent";
// 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";
@@ -1822,6 +1641,7 @@ import TableStudent from "@/components/student/TableStudent";
import FJUpload from "@/components/common/FJUpload"; import FJUpload from "@/components/common/FJUpload";
import { updateStudent } from "@/api/indexProjStu"; import { updateStudent } from "@/api/indexProjStu";
import { useStore } from "vuex"; import { useStore } from "vuex";
import DropDown from "@/components/common/DropDown";
//列表表格 //列表表格
const columns1 = [ const columns1 = [
@@ -2379,7 +2199,8 @@ export default defineComponent({
// OwnPower, // OwnPower,
// Corpowerlist, // Corpowerlist,
CommonStudent, CommonStudent,
TableModelStudent, DropDown,
OwnerTableModelStudent,
SeeModal, SeeModal,
CourseModal, CourseModal,
FJUpload, FJUpload,
@@ -4747,6 +4568,16 @@ export default defineComponent({
// 管理开课 // 管理开课
const handleGuan22 = (item) => { const handleGuan22 = (item) => {
if (String(item.courseform) === "1") {
return;
}
if (String(item.courseform) === ("1" || "线上")) {
state.om_1 = true;
state.ft_1 = false;
} else if (String(item.courseform) === ("2" || "面授")) {
state.om_1 = true;
state.ft_1 = true;
}
state.manageStuLoading = true; state.manageStuLoading = true;
console.log(787666, item); console.log(787666, item);
state.faceClassification = item.contentTxt; state.faceClassification = item.contentTxt;

View File

@@ -96,12 +96,81 @@
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="tableLoading"
expandRowByClick="true" expandRowByClick="true"
:scroll="{ x: 1550 }" :scroll="{ x: 1550 }"
@expand="expandTable" @expand="expandTable"
:pagination="false" :pagination="false"
/> >
<template #bodyCell="{ record, column }">
<template v-if="column.key === 'operation'">
<a-space>
<a-button
v-button-per="record.permissions"
v-if="record.state === '草稿'"
@click="showPub(record)"
type="link"
>发布</a-button
>
<a-button
v-button-per="record.permissions"
v-if="record.state === '草稿'"
@click="getLearnPathInfo(record.id)"
type="link"
>编辑</a-button
>
<a-button
v-button-per="record.permissions"
v-if="record.state === '已发布'"
@click="getLearnPathInfo(record.id)"
type="link"
>编辑</a-button
>
<a-button @click="manage(record.id)" type="link">管理</a-button>
<DropDown v-button-per="record.permissions" value="授权">
<OwnerTableModelStudent
:types="[7, 8, 9]"
:id="record.id"
:type="9"
>权限名单</OwnerTableModelStudent
>
<CommonStudent :type="7" :id="record.id" title="查看权"
>查看权</CommonStudent
>
<CommonStudent :type="8" :id="record.id" title="管理权"
>管理权</CommonStudent
>
</DropDown>
<DropDown v-button-per="record.permissions" value="更多">
<a-button @click="showCopyModal(record.id)" type="link"
>复制</a-button
>
<a-button @click="showDeleteModal(record.id)" type="link" danger
>删除</a-button
>
<a-button
v-if="record.state === '已发布'"
@click="showBackModal(record.id)"
type="link"
>撤回</a-button
>
<a-button
v-if="record.state === '已发布'"
@click="showStopModal(record.id)"
type="link"
>结束</a-button
>
<a-button
v-if="record.state === '已结束'"
@click="showStartModal(record.id)"
type="link"
>启用</a-button
>
</DropDown>
</a-space>
</template>
</template>
</a-table>
</div> </div>
<div class="tableBox"> <div class="tableBox">
<div class="pa"> <div class="pa">
@@ -704,25 +773,26 @@ 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";
import DropDown from "@/components/common/DropDown";
export default { export default {
name: "learningPath", name: "learningPath",
components: { components: {
// OwnerShip,
// PowerList,
// QueryRight,
// ManageRight,
ProjOwnerShip, ProjOwnerShip,
OrgClass, OrgClass,
NameInput, NameInput,
ProjPowerList, ProjPowerList,
ProjCheckShip, ProjCheckShip,
CommonStudent,
OwnerTableModelStudent,
DropDown,
}, },
setup() { setup() {
const store = useStore(); const store = useStore();
const router = useRouter(); const router = useRouter();
const state = reactive({ const state = reactive({
tableLoading: false,
out: false, out: false,
out1: false, out1: false,
number: null, number: null,
@@ -947,7 +1017,8 @@ export default {
state.routeStudentsNum = null; state.routeStudentsNum = null;
}; };
//显示复制窗口 //显示复制窗口
const showCopyModal = () => { const showCopyModal = (id) => {
state.copyPathId = id;
state.copyModal = true; state.copyModal = true;
}; };
//关闭复制窗口 //关闭复制窗口
@@ -980,7 +1051,8 @@ export default {
}; };
//显示结束窗口 //显示结束窗口
const showStopModal = () => { const showStopModal = (id) => {
state.stopPathId = id;
state.stopModal = true; state.stopModal = true;
}; };
//关闭结束窗口 //关闭结束窗口
@@ -1012,7 +1084,8 @@ export default {
}); });
}; };
const showDeleteModal = () => { const showDeleteModal = (id) => {
state.deletePathId = id;
state.deleteModal = true; state.deleteModal = true;
}; };
const closeDeleteModal = () => { const closeDeleteModal = () => {
@@ -1159,275 +1232,12 @@ export default {
}, },
{ {
title: "操作", title: "操作",
className: "h", dataIndex: "operation",
dataIndex: "opacation", key: "operation",
key: "opacation",
width: "20%", width: "20%",
align: "center", align: "right",
fixed: "right", fixed: "right",
scopedSlots: { customRender: "action" }, //引入的插槽 scopedSlots: { customRender: "action" },
customRender: (text) => {
// console.log(text);
return (
<div class="operation">
<div class="nSelect">
{text.record.state === "草稿" ? (
<div class="fb">
<div
style="cursor:pointer"
class="jc"
onClick={() => {
// console.log("text.record.", text.record);
showPub(text.record);
}}
>
发布
</div>
<div
class="jc"
onClick={() => {
// console.log("text.record", text.record);
getLearnPathInfo(text.record.id);
}}
>
编辑
</div>
</div>
) : (
<div></div>
)}
{text.record.state === "已发布" ? (
<div class="fb">
<div
class="jc"
onClick={() => {
// state.out1 = true;
// state.pathName = text.record.manager;
// // state.pathBg = "";
// // state.organizationSelectName = null;
// // state.organizationSelectId = null;
// state.pathIntro = text.record.remark;
// state.editPathId = text.record.id;
}}
></div>
</div>
) : (
<div></div>
)}
{
// text.record.state === "未发布" ? (
// <div class="fb">
// <div
// style="cursor:pointer"
// class="jc"
// onClick={() => {
// showCopyModal();
// }}
// >
// 复制
// </div>
// </div>
// ) : (
// <div></div>
// )
}
</div>
<div class="tableSelect">
<div
class="g1"
onClick={() => {
router.push({
path: "/leveladd",
});
storage.set("routerId", text.record.id);
}}
>
管理
</div>
{
<a-select
style="width: 50px;margin-top:2px;margin-left:25px"
value="授权"
dropdownClassName="tabledropdown"
>
<a-select-option value="权限名单" label="权限名单">
<OwnerTableModelStudent
types={[7, 8, 9]}
id={text.record.id}
type={9}
>
权限名单
</OwnerTableModelStudent>
</a-select-option>
<a-select-option value="查看权" label="查看权">
<CommonStudent type={7} id={text.record.id}>
查看权
</CommonStudent>
</a-select-option>
<a-select-option value="管理权" label="管理权">
<CommonStudent type={8} id={text.record.id}>
管理权
</CommonStudent>
</a-select-option>
</a-select>
}
</div>
<div class="tableSelect">
{text.record.state === "草稿" ? (
<a-select
style="width: 50px;margin-top:2px;margin-right:20px;"
value="更多"
dropdownClassName="tabledropdown"
>
<a-select-option
value="复制"
label="复制"
style="padding-left:35px"
>
<div
onClick={() => {
state.copyPathId = text.record.id;
showCopyModal();
}}
>
复制
</div>
</a-select-option>
<a-select-option
value="删除"
label="删除"
style="padding-left:35px"
>
<div
onClick={() => {
state.deletePathId = text.record.id;
// console.log("text.record", text.record);
showDeleteModal();
}}
>
删除
</div>
</a-select-option>
</a-select>
) : (
<div></div>
)}
{text.record.state === "已发布" ? (
<div>
<a-select
style="width: 50px;margin-top:2px;margin-right:20px;"
value="更多"
dropdownClassName="tabledropdown"
>
<a-select-option
value="复制"
label="复制"
style="padding-left:35px"
>
<div
onClick={() => {
state.copyPathId = text.record.id;
showCopyModal();
}}
>
复制
</div>
</a-select-option>
<a-select-option
value="撤回"
label="撤回"
style="padding-left:35px"
>
<div
onClick={() => {
showBackModal(text.record.id);
}}
>
撤回
</div>
</a-select-option>
<a-select-option
value="结束"
label="结束"
style="padding-left:35px"
>
<div
onClick={() => {
state.stopPathId = text.record.id;
showStopModal();
}}
>
结束
</div>
</a-select-option>
</a-select>
</div>
) : (
<div></div>
)}
{text.record.state === "已结束" ? (
<div>
<a-select
style="width: 50px;margin-top:2px;margin-right:20px;"
value="更多"
dropdownClassName="tabledropdown"
>
<a-select-option
value="复制"
label="复制"
style="padding-left:35px"
>
<div
onClick={() => {
state.copyPathId = text.record.id;
showCopyModal();
}}
>
复制
</div>
</a-select-option>
{/**
<a-select-option
value="启用"
label="启用"
style="padding-left:35px"
>
<div
onClick={() => {
showStartModal();
}}
>
启用
</div>
</a-select-option>
*/}
<a-select-option
value="删除"
label="删除"
style="padding-left:35px"
>
<div
onClick={() => {
state.deletePathId = text.record.id;
showDeleteModal();
}}
>
删除
</div>
</a-select-option>
</a-select>
</div>
) : (
<div></div>
)}
</div>
</div>
);
},
}, },
]; ];
return columns; return columns;
@@ -1515,6 +1325,7 @@ export default {
//获取学习路径列表 //获取学习路径列表
const getLearnPath = () => { const getLearnPath = () => {
state.tableLoading = true;
let obj = { let obj = {
pageNo: state.currentPage, pageNo: state.currentPage,
pageSize: state.pageSize, pageSize: state.pageSize,
@@ -1541,6 +1352,7 @@ export default {
} }
getTableDate(arr); getTableDate(arr);
state.tableDataTotal = Number(res.data.data.total); state.tableDataTotal = Number(res.data.data.total);
state.tableLoading = false;
} }
}) })
.catch((err) => { .catch((err) => {
@@ -1578,44 +1390,6 @@ export default {
}); });
}; };
//获取路径图详细信息
const getLearnPathInfo = (id) => {
// console.log("编辑学习路径图id", id);
//获取学习路径详情
api
.getRouterDetail(id)
.then((res) => {
if (res.data.code === 200) {
console.log("获取学习路径详情成功", res.data.data);
let detail = res.data.data.routerInfo;
state.pathName = detail.name;
state.pathBg = detail.picUrl;
state.pathBgId = "";
state.organizationSelectName = detail.organizationName;
state.organizationSelectId = detail.organizationId;
state.pathIntro = detail.remark;
state.editPathId = id;
let arr = imgData.value;
arr.forEach((item) => {
if (item.dictValue === state.pathBg) {
state.pathBgId = item.dictCode;
}
});
//for (let i = 0; i < arr.length; i++) {
// console.log("arr[i].dictValue", arr[i].dictValue, state.pathBg);
// if (arr[i].dictValue === state.pathBg) {
// state.pathBgId = arr[i].dictCode;
// }
// }
}
})
.catch((err) => {
console.log("获取详情失败", err);
});
state.out1 = true;
};
//编辑学习路径图 //编辑学习路径图
const editLearnPath = async () => { const editLearnPath = async () => {
if (!state.pathName) { if (!state.pathName) {
@@ -1817,10 +1591,17 @@ export default {
}); });
} }
); );
function manage(id) {
router.push({
path: "/leveladd",
});
storage.set("routerId", id);
}
return { return {
...toRefs(state), ...toRefs(state),
imgData, imgData,
manage,
selectProjectName, selectProjectName,
expandTable, expandTable,
handleOut, handleOut,
@@ -2763,6 +2544,10 @@ export default {
// position: absolute; // position: absolute;
// bottom: -40px; // bottom: -40px;
} }
th {
background-color: #eff4fc !important;
text-align: center !important;
}
} }
.operation { .operation {

View File

@@ -53,7 +53,7 @@
<div class="onerow"> <div class="onerow">
<div class="taskmain">快速创建路径图详情</div> <div class="taskmain">快速创建路径图详情</div>
</div> </div>
<div class="second"> <div class="second" v-button-per="permissions">
<div @click="totask"> <div @click="totask">
<div <div
class="taskbox" class="taskbox"
@@ -326,7 +326,11 @@
<div class="onerow"> <div class="onerow">
<div class="taskmain">任务大纲</div> <div class="taskmain">任务大纲</div>
<router-link to="/leveladddetail" class="editright"> <router-link
to="/leveladddetail"
class="editright"
v-button-per="permissions"
>
<img <img
class="editimg" class="editimg"
src="../../assets/images/leveladd/edit.png" src="../../assets/images/leveladd/edit.png"
@@ -554,6 +558,7 @@
</a-tab-pane> </a-tab-pane>
<a-tab-pane key="3" tab="学员管理" force-render> <a-tab-pane key="3" tab="学员管理" force-render>
<TableStudent <TableStudent
:permissions="permissions"
v-if="isreload" v-if="isreload"
:type="2" :type="2"
:id="routerId" :id="routerId"
@@ -562,7 +567,12 @@
> >
<template #extension="{ data: { record } }"> <template #extension="{ data: { record } }">
<a-button type="link" @click="showStudent(record)">查看</a-button> <a-button type="link" @click="showStudent(record)">查看</a-button>
<a-button type="link" @click="setLevels(record)">调整</a-button> <a-button
type="link"
@click="setLevels(record)"
v-button-per="permissions"
>调整</a-button
>
</template> </template>
</TableStudent> </TableStudent>
<TableStudent <TableStudent
@@ -574,11 +584,15 @@
> >
<template #extension="{ data: { record } }"> <template #extension="{ data: { record } }">
<a-button type="link" @click="showStudent(record)">查看</a-button> <a-button type="link" @click="showStudent(record)">查看</a-button>
<a-button type="link" @click="setLevels(record)">调整</a-button> <a-button
type="link"
@click="setLevels(record)"
v-button-per="permissions"
>调整</a-button
>
</template> </template>
</TableStudent> </TableStudent>
</a-tab-pane> </a-tab-pane>
<!-- 1211注释 待开放 -->
<a-tab-pane key="4" tab="设置"> <a-tab-pane key="4" tab="设置">
<div class="split"></div> <div class="split"></div>
@@ -592,7 +606,12 @@
<div class="headone"> <div class="headone">
<div class="box"></div> <div class="box"></div>
<div class="onetitle">关卡内容可见可学设置</div> <div class="onetitle">关卡内容可见可学设置</div>
<div class="oneedi" @click="showbtn" v-show="twobtn"> <div
class="oneedi"
@click="showbtn"
v-show="twobtn"
v-button-per="permissions"
>
编辑 编辑
</div> </div>
<div v-show="twobtnn" class="twobtn"> <div v-show="twobtnn" class="twobtn">
@@ -1388,6 +1407,7 @@ export default {
const router = useRouter(); const router = useRouter();
// const store = useStore(); // const store = useStore();
const state = reactive({ const state = reactive({
permissions: "",
hasTask: false, hasTask: false,
stage: [], stage: [],
statess: [], statess: [],
@@ -1553,7 +1573,7 @@ export default {
previewEndNum: 0, previewEndNum: 0,
studyStartNum: 0, studyStartNum: 0,
studyEndNum: 0, studyEndNum: 0,
pjModelVisible: false,
faceTeachModelVisible: false, faceTeachModelVisible: false,
examinationModelVisible: false, examinationModelVisible: false,
evaluationModelVisible: false, evaluationModelVisible: false,
@@ -1561,7 +1581,6 @@ export default {
commonModelVisible: false, commonModelVisible: false,
voteModelVisible: false, voteModelVisible: false,
projectModelVisible: false, projectModelVisible: false,
PjModelVisible: false,
faceTeachModelVisibleTitle: "", faceTeachModelVisibleTitle: "",
examinationModelVisibleTitle: "", examinationModelVisibleTitle: "",
evaluationModelVisibleTitle: "", evaluationModelVisibleTitle: "",
@@ -2241,6 +2260,7 @@ export default {
.then((res) => { .then((res) => {
console.log("router-list", res); console.log("router-list", res);
state.fileList = JSON.parse(res.data.data.routerInfo.attach); state.fileList = JSON.parse(res.data.data.routerInfo.attach);
state.permissions = res.data.data.routerInfo.permissions;
console.log("asdasdasd-------->", state.fileList); console.log("asdasdasd-------->", state.fileList);
state.docChecked = state.docChecked =
res.data.data.routerInfo.attachSwitch == 1 ? true : false; res.data.data.routerInfo.attachSwitch == 1 ? true : false;

View File

@@ -192,7 +192,7 @@
</div> </div>
<div class="rightt"> <div class="rightt">
<!-- 2022-11-30注释 后面放开 --> <!-- 2022-11-30注释 后面放开 -->
<!-- <div class="select"> <div class="select" style="margin-right:90px;">
<span>学习模式</span> <span>学习模式</span>
<div class="inputbox"> <div class="inputbox">
<input type="text" placeholder="按学习时间解锁" /> <input type="text" placeholder="按学习时间解锁" />
@@ -201,7 +201,7 @@
</div> </div>
</div> </div>
<unlock-mode v-model:unlockModeVisible="unlockModeVisible" /> <unlock-mode v-model:unlockModeVisible="unlockModeVisible" />
</div> --> </div>
<div class="line"></div> <div class="line"></div>
<router-link to="/leveladd"> <router-link to="/leveladd">
<div style="display: flex"> <div style="display: flex">
@@ -781,7 +781,7 @@
</div> </div>
<div class="rightt"> <div class="rightt">
<!-- 2022-11-30注释 后面放开 --> <!-- 2022-11-30注释 后面放开 -->
<!-- <div class="select"> <div class="select">
<span>学习模式</span> <span>学习模式</span>
<div class="inputbox"> <div class="inputbox">
<input type="text" placeholder="按学习时间解锁" /> <input type="text" placeholder="按学习时间解锁" />
@@ -790,7 +790,7 @@
</div> </div>
</div> </div>
<unlock-mode v-model:unlockModeVisible="unlockModeVisible" /> <unlock-mode v-model:unlockModeVisible="unlockModeVisible" />
</div> --> </div>
<div class="line"></div> <div class="line"></div>
<router-link to="/leveladd"> <router-link to="/leveladd">
<div style="display: flex"> <div style="display: flex">
@@ -898,7 +898,7 @@
</div> </div>
</div> </div>
<!-- <div class="footbtn"> <div class="footbtn">
<div class="btnbox"> <div class="btnbox">
<div class="btn btn2" @click="temporaryStorage"> <div class="btn btn2" @click="temporaryStorage">
<div class="btnText">暂存</div> <div class="btnText">暂存</div>
@@ -910,7 +910,7 @@
<div class="btnText">取消</div> <div class="btnText">取消</div>
</div> </div>
</div> </div>
</div> --> </div>
<!-- 添加学员抽屉 --> <!-- 添加学员抽屉 -->
<add-stu v-model:AddSvisible="AddSvisible" /> <add-stu v-model:AddSvisible="AddSvisible" />
<!-- 导入学员抽屉 --> <!-- 导入学员抽屉 -->
@@ -1087,7 +1087,7 @@ import { editTask } from "../../api/indexTaskadd";
// import { RouterEditTask } from "@/api/indexTask"; // import { RouterEditTask } from "@/api/indexTask";
import { useRouter } from "vue-router"; import { useRouter } from "vue-router";
// import UnlockMode from "../../components/drawers/UnlockMode.vue"; import UnlockMode from "../../components/drawers/UnlockMode.vue";
export default { export default {
name: "LevelAddDetail", name: "LevelAddDetail",
components: { components: {
@@ -1105,7 +1105,7 @@ export default {
AddLive, AddLive,
AddRef, AddRef,
draggable, draggable,
// UnlockMode, UnlockMode,
AddFaceteach, AddFaceteach,
AddProject, AddProject,
}, },

View File

@@ -91,7 +91,34 @@
:scroll="{ x: 700 }" :scroll="{ x: 700 }"
@expand="expandTable" @expand="expandTable"
:pagination="false" :pagination="false"
:header-cell-style="{'text-align':'center'}"
> >
<template #bodyCell="{ record, column }">
<template v-if="column.key === 'operation'">
<a-space align="start">
<a-button v-button-per="record.permissions" v-if="record.status===0 || record.status===2 || record.status===-5" @click="handleEdit(record)" type="link">编辑</a-button>
<a-button v-button-per="record.permissions" v-if="record.type===1" @click="createSub(record)" type="link">创建子项目</a-button>
<a-button v-button-per="record.permissions" v-if="record.type===2" @click="createClass(record)" type="link">创建班级</a-button>
<a-button v-button-per="record.permissions" v-if="record.status===0 && record.type===3" @click="showReviewModal(record.projectId)" type="link">提交审核</a-button>
<a-button v-button-per="record.permissions" v-if="record.status===1 && record.type===3" @click="showRecallReviewModal(record.projectId)" type="link">撤回审核</a-button>
<a-button v-button-per="record.permissions" v-if="record.status===2 && record.type===3" @click="push(record)" type="link">发布</a-button>
<a-button v-button-per="record.permissions" v-if="record.status===3 && record.type===3" @click="showBackModal(record.projectId)" type="link">撤回发布</a-button>
<a-button v-if="record.status!==3 && record.type===3" @click="baseInfo(record)" type="link">管理</a-button>
<DropDown v-button-per="record.permissions" value="授权">
<OwnerTableModelStudent :types="[4,5,6]" :id="record.projectId" :type="6">权限名单</OwnerTableModelStudent>
<CommonStudent :type="4" :id="record.projectId" title="查看权">查看权</CommonStudent>
<CommonStudent :type="5" :id="record.projectId" title="管理权">管理权</CommonStudent>
</DropDown>
<DropDown v-button-per="record.permissions" value="更多">
<a-button @click="showCopyModal(record.projectId)" type="link">复制</a-button>
<a-button v-if="record.status!==3" @click="showDeleteModal(record.projectId)" type="link" danger>删除</a-button>
<a-button v-if="record.status===3" @click="showStartModal(record.projectId)" type="link">存为模版</a-button>
<a-button v-if="record.status===3 && record.type===3" @click="showStopModal(record.projectId)" type="link">结束</a-button>
<a-button v-if="record.status===-1 && record.type===3" @click="showBackFinashModal(record.projectId)" type="link">撤回</a-button>
</DropDown>
</a-space>
</template>
</template>
</a-table> </a-table>
<div class="tableBox"> <div class="tableBox">
<div class="pa"> <div class="pa">
@@ -837,7 +864,8 @@ import * as moment from "moment";
import NameInput from "@/components/project/NameInput"; import NameInput from "@/components/project/NameInput";
import { validateName } from "@/api/index1"; import { validateName } from "@/api/index1";
import CommonStudent from "@/components/student/CommonStudent"; import CommonStudent from "@/components/student/CommonStudent";
import TableModelStudent from "@/components/student/TableModelStudent"; import OwnerTableModelStudent from "@/components/student/OwnerTableModelStudent";
import DropDown from "@/components/common/DropDown";
export default { export default {
name: "projectManage", name: "projectManage",
@@ -847,10 +875,11 @@ export default {
ProjCheckShip, ProjCheckShip,
NameInput, NameInput,
ProjectManager, ProjectManager,
// ProjectClass,
OrgClass, OrgClass,
TrainClass, TrainClass,
// ProjManageShip CommonStudent,
OwnerTableModelStudent,
DropDown,
}, },
setup() { setup() {
const state = reactive({ const state = reactive({
@@ -991,8 +1020,7 @@ export default {
message.destroy(); message.destroy();
return message.warning("项目名称重复,请重新填写"); return message.warning("项目名称重复,请重新填写");
} }
api.createProject(state.projectInfo).then((res) => { api.createProject(state.projectInfo).then(() => {
console.log("res", res);
state.doublepro = false; state.doublepro = false;
message.destroy(); message.destroy();
message.success("创建成功"); message.success("创建成功");
@@ -1398,278 +1426,9 @@ export default {
dataIndex: "operation", dataIndex: "operation",
key: "operation", key: "operation",
width: 300, width: 300,
align: "center", align: "right",
fixed: "right", fixed: "right",
customRender: (value) => { scopedSlots: {customRender: "action"}
// console.log("value", value.record.type, value.record.status);
return (
<div className="operation">
{value.record.status === 0 ||
value.record.status === 2 ||
value.record.status === -5 ? (
<span
onClick={() => {
if (value.record.type === 1 || value.record.type === 2) {
state.doublepro = true;
state.projectInfo = value.record;
} else {
console.log(value.record);
router.push({
path: "/projectadd",
query: {
projectId: value.record.projectId,
parentId: value.record.parentId,
parentName: value.record.parentName,
},
});
}
}}
style="cursor:pointer;"
className="operation1"
>
编辑
</span>
) : (
""
)}
{value.record.status === 0 && value.record.type === 3 ? (
<span
onClick={() => {
showReviewModal(value.record.projectId);
}}
style="cursor:pointer"
class="operation3"
>
提交审核
</span>
) : (
""
)}
{value.record.status === 1 && value.record.type === 3 ? (
<span
onClick={() => {
showRecallReviewModal(value.record.projectId);
}}
style="cursor:pointer"
class="operation3"
>
撤回审核
</span>
) : (
""
)}
{value.record.status === 2 && value.record.type === 3 ? (
<span
onClick={() => {
let time =
value.record.beginTime + "-" + value.record.endTime;
let obj = {
projectId: value.record.projectId,
name: value.record.name,
time: time,
};
showProjectPub(obj);
}}
style="cursor:pointer"
class="operation3"
>
发布
</span>
) : (
""
)}
{value.record.status === 3 && value.record.type === 3 ? (
<div
onClick={() => {
router.push({
path: "/taskpage",
query: { projectId: value.record.projectId },
});
storage.set("projectId", value.record.projectId);
}}
>
管理
</div>
) : (
""
)}
{value.record.status === 3 && value.record.type === 3 ? (
<span
onClick={() => {
showBackModal(value.record.projectId);
}}
style="cursor:pointer; margin-left: 21px; width:70px;"
class="operation3"
>
撤回发布
</span>
) : (
""
)}
{
<div className="tableSelect">
<a-select
style="width: 50px;"
value="授权"
dropdownClassName="tabledropdown"
>
<a-select-option value="权限名单" label="权限名单">
<TableModelStudent
types={[4, 5, 6]}
id={value.record.projectId}
>
权限名单
</TableModelStudent>
</a-select-option>
<a-select-option value="查看权" label="查看权">
<CommonStudent type={4} id={value.record.projectId}>
查看权
</CommonStudent>
</a-select-option>
<a-select-option value="管理权" label="管理权">
<CommonStudent type={5} id={value.record.projectId}>
管理权
</CommonStudent>
</a-select-option>
</a-select>
</div>
}
{value.record.type === 1 ? (
<span
className="operation3"
style="cursor: pointer"
onClick={() => {
state.projectInfo = {
parentName: value.record.name,
parentId: value.record.projectId,
name: "",
sourceBelongId: value.record.sourceBelongId,
sourceBelongName: value.record.sourceBelongName,
manager: value.record.manager,
managerId: value.record.managerId,
systemId: value.record.systemId,
type: 2,
};
state.estabish = true;
}}
>
创建子项目
</span>
) : (
""
)}
{value.record.type === 2 ? (
<span
className="operation3"
style="cursor: pointer"
onClick={() => {
router.push({
path: "/projectadd",
query: {
parentId: value.record.projectId,
parentName:
value.record.parentName + "——" + value.record.name,
ptojectType: 3,
},
});
}}
>
创建班级
</span>
) : (
""
)}
<div className="tableSelect">
<a-select
style="width: 50px"
value="更多"
// options={state.projectNameList}
dropdownClassName="tabledropdown"
>
<a-select-option value="复制" label="复制">
<div
onClick={() => {
showCopyModal(value.record.projectId);
}}
>
复制
</div>
</a-select-option>
{value.record.status !== 3 ? (
<a-select-option value="删除" label="删除">
<div
onClick={() => {
showDeleteModal(value.record.projectId);
}}
>
删除
</div>
</a-select-option>
) : (
""
)}
{value.record.type === 3 ? (
<a-select-option value="存为模版" label="存为模版">
<div
onClick={() => {
showStartModal(value.record.projectId);
}}
>
存为模版
</div>
</a-select-option>
) : (
""
)}
{value.record.status === 3 && value.record.type === 3 ? (
<a-select-option value="结束" label="结束">
<div
onClick={() => {
showStopModal(value.record.projectId);
}}
>
结束
</div>
</a-select-option>
) : (
""
)}
{value.record.status === -1 && value.record.type === 3 ? (
<a-select-option value="撤回" label="撤回">
<div
onClick={() => {
showBackFinashModal(value.record.projectId);
}}
>
撤回
</div>
</a-select-option>
) : (
""
)}
{value.record.status !== 3 && value.record.type === 3 ? (
<a-select-option value="基础信息" label="基础信息">
<div
onClick={() => {
router.push({
path: "/taskpage",
query: { projectId: value.record.projectId },
});
storage.set("projectId", value.record.projectId);
}}
>
基础信息
</div>
</a-select-option>
) : (
""
)}
</a-select>
</div>
</div>
);
},
}, },
]); ]);
const getTableDate = () => { const getTableDate = () => {
@@ -1713,6 +1472,21 @@ export default {
}); });
} }
} }
function handleEdit(record){
if (record.type === 1 || record.type === 2) {
state.doublepro = true;
state.projectInfo = record;
} else {
router.push({
path: "/projectadd",
query: {
projectId: record.projectId,
parentId: record.parentId,
parentName: record.parentName,
},
});
}
}
getTableDate(); getTableDate();
// 翻页 // 翻页
@@ -1803,10 +1577,65 @@ export default {
state.projectInfo.sourceBelongName = t; state.projectInfo.sourceBelongName = t;
state.projectInfo.sourceBelongFullName = orgName; state.projectInfo.sourceBelongFullName = orgName;
} }
function push(record){
showProjectPub({
projectId: record.projectId,
name: record.name,
time: record.beginTime + "-" + record.endTime,
});
}
function manage(record){
router.push({
path: "/taskpage",
query: { projectId: record.projectId },
});
storage.set("projectId", record.projectId);
}
function createSub(record){
state.projectInfo = {
parentName: record.name,
parentId: record.projectId,
name: "",
sourceBelongId: record.sourceBelongId,
sourceBelongName: record.sourceBelongName,
manager: record.manager,
managerId: record.managerId,
systemId: record.systemId,
type: 2,
};
state.estabish = true;
}
function createClass(record){
router.push({
path: "/projectadd",
query: {
parentId: record.projectId,
parentName: record.parentName + "——" + record.name,
ptojectType: 3,
}
})
}
function baseInfo(record){
router.push({
path: "/taskpage",
query: { projectId: record.projectId },
});
storage.set("projectId", record.projectId);
}
return { return {
...toRefs(state), ...toRefs(state),
dayjs, dayjs,
handleEdit,
baseInfo,
createClass,
createSub,
manage,
push,
moment, moment,
managerChange, managerChange,
reFinashedProject, reFinashedProject,
@@ -2060,6 +1889,10 @@ export default {
.ant-table-thead > tr > th { .ant-table-thead > tr > th {
background-color: #eff4fc; background-color: #eff4fc;
} }
th {
background-color: #eff4fc !important;
text-align: center !important;
}
} }
.tableBox { .tableBox {

View File

@@ -105,16 +105,16 @@
</div> </div>
<div class="rightt"> <div class="rightt">
<!-- 2022-11-30注释 后面放开 --> <!-- 2022-11-30注释 后面放开 -->
<!-- <div class="select"> <div class="select" style="margin-right:90px;">
<span>学习模式</span> <span>学习模式</span>
<div class="inputbox"> <div class="inputbox">
<input type="text" placeholder="按学习时间解锁" /> <input type="text" placeholder="按学习时间解锁" style="padding-left:12px;" />
<div class="bottonbox" @click="showModeVisible"> <div class="bottonbox" @click="showModeVisible">
<div class="btnText">切换模式</div> <div class="btnText">切换模式</div>
</div> </div>
<unlock-mode v-model:unlockModeVisible="unlockModeVisible" /> <unlock-mode v-model:unlockModeVisible="unlockModeVisible" />
</div> </div>
</div> --> </div>
<div class="line"></div> <div class="line"></div>
<!-- <img class="img2" src="../../assets/images/projectadd/keep.png" /> <!-- <img class="img2" src="../../assets/images/projectadd/keep.png" />
<div class="pub">保存</div> <div class="pub">保存</div>
@@ -570,7 +570,7 @@
</div> </div>
</div> </div>
<!-- <div class="footbtn"> <div class="footbtn">
<div class="btnbox"> <div class="btnbox">
<div class="btn btn2" @click="temporaryStorage"> <div class="btn btn2" @click="temporaryStorage">
<div class="btnText">暂存</div> <div class="btnText">暂存</div>
@@ -582,7 +582,7 @@
<div class="btnText">取消</div> <div class="btnText">取消</div>
</div> </div>
</div> </div>
</div> --> </div>
<!-- 添加阶段弹窗 --> <!-- 添加阶段弹窗 -->
<div> <div>
@@ -841,6 +841,7 @@ import * as api from "../../api/indexTaskadd";
import * as apistage from "../../api/indexStage"; import * as apistage from "../../api/indexStage";
import * as apimove from "../../api/indexMovetask"; import * as apimove from "../../api/indexMovetask";
import draggable from "vuedraggable"; import draggable from "vuedraggable";
import UnlockMode from "../../components/drawers/UnlockMode.vue";
import { useRoute, useRouter } from "vue-router"; import { useRoute, useRouter } from "vue-router";
@@ -860,7 +861,7 @@ export default {
AddEval, AddEval,
AddInvist, AddInvist,
AddVote, AddVote,
// UnlockMode, UnlockMode,
}, },
setup() { setup() {
const router = useRouter(); const router = useRouter();

View File

@@ -195,7 +195,7 @@
<div class="onerow"> <div class="onerow">
<div class="taskmain">快速创建项目详情</div> <div class="taskmain">快速创建项目详情</div>
</div> </div>
<div class="second"> <div v-button-per="permissions" class="second">
<!-- @click="totask" --> <!-- @click="totask" -->
<div <div
class="taskbox" class="taskbox"
@@ -423,6 +423,7 @@
批量面授报名 批量面授报名
</button> --> </button> -->
<router-link <router-link
v-button-per="permissions"
:to="{ path: `/taskadd`, query: { projectId: projectId } }" :to="{ path: `/taskadd`, query: { projectId: projectId } }"
> >
<button class="edit"> <button class="edit">
@@ -570,7 +571,7 @@
> >
</div> </div>
</div> </div>
<div class="operations"> <div v-button-per="permissions" class="operations">
<div <div
class="operation" class="operation"
style="cursor: pointer" style="cursor: pointer"
@@ -672,7 +673,7 @@
</router-link> </router-link>
<!-- 无数据创建任务 --> <!-- 无数据创建任务 -->
</div> </div>
<div v-else> <div v-button-per="permissions" v-else>
<div <div
class="taskbox" class="taskbox"
@click=" @click="
@@ -710,6 +711,7 @@
<a-tabs v-model:activeKey="activeKey1"> <a-tabs v-model:activeKey="activeKey1">
<a-tab-pane key="8" tab="学员管理"> <a-tab-pane key="8" tab="学员管理">
<TableStudent <TableStudent
:permissions="permissions"
:type="1" :type="1"
:id="projectId" :id="projectId"
:columns="stuColumns" :columns="stuColumns"
@@ -750,7 +752,7 @@
</div> </div>
</div> </div>
</div> </div>
<div class="second2"> <div class="second2" v-button-per="permissions">
<div class="btn1" @click="showModal2(1, null)"> <div class="btn1" @click="showModal2(1, null)">
<img src="../../assets/images/courseManage/add0.png" /> <img src="../../assets/images/courseManage/add0.png" />
<span class="btn1text">创建小组</span> <span class="btn1text">创建小组</span>
@@ -781,7 +783,7 @@
style="color: rgba(0, 0, 0, 0.45); cursor: pointer" style="color: rgba(0, 0, 0, 0.45); cursor: pointer"
>. . .</span >. . .</span
> >
<div class="moreItems"> <div class="moreItems" v-button-per="permissions">
<div class="sammo" @click="showModal2(2, item)"> <div class="sammo" @click="showModal2(2, item)">
编辑 编辑
</div> </div>
@@ -838,7 +840,7 @@
<div class="split"></div> <div class="split"></div>
<a-tabs v-model:activeKey="activeKeyNotice"> <a-tabs v-model:activeKey="activeKeyNotice">
<a-tab-pane key="11" tab="公告"> <a-tab-pane key="11" tab="公告">
<NoticePub v-model:projectId="projectId"></NoticePub> <NoticePub :permissions="permissions" v-model:projectId="projectId"></NoticePub>
</a-tab-pane> </a-tab-pane>
<a-tab-pane key="12" tab="历史公告" force-render> <a-tab-pane key="12" tab="历史公告" force-render>
<NoticeHis <NoticeHis
@@ -849,7 +851,7 @@
</a-tabs> </a-tabs>
</a-tab-pane> </a-tab-pane>
<a-tab-pane key="5" tab="项目积分"> <a-tab-pane key="5" tab="项目积分">
<ProjectScore :projectId="projectId"></ProjectScore> <ProjectScore :permissions="permissions" :projectId="projectId"></ProjectScore>
</a-tab-pane> </a-tab-pane>
<a-tab-pane key="6" tab="排行榜"> <a-tab-pane key="6" tab="排行榜">
<div class="split"></div> <div class="split"></div>
@@ -1096,7 +1098,7 @@
<div class="img"></div> <div class="img"></div>
<div class="ed">编辑</div> <div class="ed">编辑</div>
</div> --> </div> -->
<div class="edit" v-if="status != 3" @click="toEdit"> <div v-button-per="permissions" class="edit" v-if="status != 3" @click="toEdit">
<div class="img"></div> <div class="img"></div>
<div class="ed">编辑</div> <div class="ed">编辑</div>
</div> </div>
@@ -2143,6 +2145,7 @@ export default {
const store = useStore(); const store = useStore();
const route = useRoute(); const route = useRoute();
const state = reactive({ const state = reactive({
permissions:'',
screenHeight: document.body.clientHeight, screenHeight: document.body.clientHeight,
screenWidth: document.body.clientWidth, screenWidth: document.body.clientWidth,
editRecord: {}, editRecord: {},
@@ -3853,6 +3856,7 @@ export default {
name: e.name, name: e.name,
})); }));
let info = res.data.data.projectInfo; let info = res.data.data.projectInfo;
state.permissions = info.permissions;
// let start = toDate(info.beginTime / 1000, "Y-M-D h:m"); // let start = toDate(info.beginTime / 1000, "Y-M-D h:m");
let start = info.beginTime; let start = info.beginTime;
// let end = toDate(info.endTime / 1000, "Y-M-D h:m"); // let end = toDate(info.endTime / 1000, "Y-M-D h:m");

View File

@@ -134,16 +134,16 @@
</div> </div>
<div class="rightt"> <div class="rightt">
<!-- 2022-11-30注释 后面放开 --> <!-- 2022-11-30注释 后面放开 -->
<!-- <div class="select"> <div class="select" style="margin-right:90px;">
<span>学习模式</span> <span>学习模式</span>
<div class="inputbox"> <div class="inputbox">
<input type="text" placeholder="按学习时间解锁" /> <input type="text" placeholder="按学习时间解锁" style="padding-left:12px;"/>
<div class="bottonbox" @click="showModeVisible"> <div class="bottonbox" @click="showModeVisible">
<div class="btnText">切换模式</div> <div class="btnText">切换模式</div>
</div> </div>
<unlock-mode v-model:unlockModeVisible="unlockModeVisible" /> <unlock-mode v-model:unlockModeVisible="unlockModeVisible" />
</div> </div>
</div> --> </div>
<div class="line"></div> <div class="line"></div>
<!-- <img class="img2" src="../../assets/images/projectadd/keep.png" /> <!-- <img class="img2" src="../../assets/images/projectadd/keep.png" />
<div class="pub">保存</div> <div class="pub">保存</div>
@@ -735,7 +735,7 @@
</div> </div>
</div> </div>
<!-- <div class="footbtn"> <div class="footbtn">
<div class="btnbox"> <div class="btnbox">
<div class="btn btn2" @click="temporaryStorage"> <div class="btn btn2" @click="temporaryStorage">
<div class="btnText">暂存</div> <div class="btnText">暂存</div>
@@ -747,7 +747,7 @@
<div class="btnText">取消</div> <div class="btnText">取消</div>
</div> </div>
</div> </div>
</div> --> </div>
<!-- 添加阶段弹窗 --> <!-- 添加阶段弹窗 -->
<div> <div>
@@ -1091,7 +1091,7 @@ import { message } from "ant-design-vue";
import * as api from "../../api/indexTemplate"; import * as api from "../../api/indexTemplate";
import draggable from "vuedraggable"; import draggable from "vuedraggable";
import { storage } from "../../api/storage"; import { storage } from "../../api/storage";
// import UnlockMode from "../../components/drawers/UnlockMode.vue"; import UnlockMode from "../../components/drawers/UnlockMode.vue";
// import * as api1 from "../../api/index1"; // import * as api1 from "../../api/index1";
import { useRouter, useRoute } from "vue-router"; import { useRouter, useRoute } from "vue-router";
const drawercolumns = [ const drawercolumns = [
@@ -1149,7 +1149,7 @@ export default {
AddEval, AddEval,
AddInvist, AddInvist,
AddVote, AddVote,
// UnlockMode, UnlockMode,
}, },
setup() { setup() {
const route = useRoute(); const route = useRoute();