This commit is contained in:
Ggysh-7
2022-11-21 13:36:04 +08:00
18 changed files with 1802 additions and 1210 deletions

View File

@@ -18,11 +18,13 @@
<script> <script>
import { computed, defineComponent } from "vue"; import { computed, defineComponent } from "vue";
import { useRouter, useRoute } from "vue-router"; import { useRouter, useRoute } from "vue-router";
import { useStore } 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";
export default defineComponent({ export default defineComponent({
components: { components: {
NavLeft, NavLeft,
@@ -33,13 +35,28 @@ export default defineComponent({
setup() { setup() {
const router = useRouter(); const router = useRouter();
const route = useRoute(); const route = useRoute();
const store = useStore();
// console.log("router", router.getRoutes(), route); // console.log("router", router.getRoutes(), route);
const routes = computed(() => { const routes = computed(() => {
return router.getRoutes().filter((e) => e.meta?.isLink); return router.getRoutes().filter((e) => e.meta?.isLink);
}); });
const currentRouteName = computed(() => route.name); const currentRouteName = computed(() => route.name);
//获取组织树
const orgTree = () => {
api
.orgtree()
.then((res) => {
console.log("获取集团组织成功", res);
if (res.status === 200) {
store.commit("getOrgtreeList", res.data.data);
}
})
.catch((err) => {
console.log("获取集团组织失败", err);
});
};
orgTree();
return { return {
routes, routes,
name: currentRouteName, name: currentRouteName,

View File

@@ -2,7 +2,7 @@
* @Author: lixg lixg@dongwu-inc.com * @Author: lixg lixg@dongwu-inc.com
* @Date: 2022-11-07 17:06:45 * @Date: 2022-11-07 17:06:45
* @LastEditors: lixg lixg@dongwu-inc.com * @LastEditors: lixg lixg@dongwu-inc.com
* @LastEditTime: 2022-11-15 16:43:26 * @LastEditTime: 2022-11-20 17:45:37
* @FilePath: /fe-manage/src/api/index.js * @FilePath: /fe-manage/src/api/index.js
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/ */
@@ -69,3 +69,5 @@ export const getDiscussDetail=(obj)=>http.post('/discuss/getDiscussDetail',obj)
//获取模版列表 //获取模版列表
export const getTemplate = (obj) => http.post('/admin/project/template/list', obj) export const getTemplate = (obj) => http.post('/admin/project/template/list', obj)
//获取项目统计
export const getProjectCount = (projectId) => http.get('/admin/project/projectCount', { params: { projectId: projectId } })

View File

@@ -2,7 +2,7 @@
* @Author: lixg lixg@dongwu-inc.com * @Author: lixg lixg@dongwu-inc.com
* @Date: 2022-11-04 22:45:31 * @Date: 2022-11-04 22:45:31
* @LastEditors: lixg lixg@dongwu-inc.com * @LastEditors: lixg lixg@dongwu-inc.com
* @LastEditTime: 2022-11-17 15:41:45 * @LastEditTime: 2022-11-20 15:39:38
* @FilePath: /fe-manage/src/api/index1.js * @FilePath: /fe-manage/src/api/index1.js
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/ */
@@ -53,13 +53,15 @@ export const createLearnPath = (obj) => http.post('/admin/router/edit', obj);
export const getLearnPath = (obj) => http.post('/admin/router/list', obj); export const getLearnPath = (obj) => http.post('/admin/router/list', obj);
//学习路径图的发布、停用、删除 //学习路径图的发布、停用、删除
export const handleLearnPath = (obj) => http.post('/admin/router/handle', obj); export const handleLearnPath = (obj) => http.post('/admin/router/handle', obj);
//获取路径图统计数据
export const getLearnCount = (routerId) => http.get('/admin/router/getCount', { params: { routerId: routerId } })
//获取关卡 //获取关卡
export const getChapter = (obj) => http.post('/admin/router/detail', { params: obj }); export const getChapter = (obj) => http.post('/admin/router/detail', { params: obj });
//新建或编辑关卡 //新建或编辑关卡
export const editChapter = (obj) => http.post('/admin/router/editChapter', obj); export const editChapter = (obj) => http.post('/admin/router/editChapter', obj);
// 编辑路径图设置
export const setConfig = (obj) => http.post('/admin/router/setConfig', obj);
//获取学员列表 //获取学员列表
export const getStudent = (obj) => http.post('/admin/router/studentList', obj); export const getStudent = (obj) => http.post('/admin/router/studentList', obj);
//获取路径图详情-包含关卡及任务列表 //获取路径图详情-包含关卡及任务列表
@@ -83,6 +85,12 @@ export const scoreRank = (obj) => http.post('/admin/project/scoreRank', obj);
export const billboard = (obj) => http.post('/admin/project/billboard', obj); export const billboard = (obj) => http.post('/admin/project/billboard', obj);
//项目基础信息----------------------------------- //项目基础信息-----------------------------------
// 获取组织结构树
export const orgtree = () => http.get('/org/tree');
// 测试方法 // 测试方法
// import * as api from '../../api/index' // import * as api from '../../api/index'
// api.getLearnPath({}).then(res => { // api.getLearnPath({}).then(res => {
@@ -90,3 +98,6 @@ export const billboard = (obj) => http.post('/admin/project/billboard', obj);
// }).catch(err => { // }).catch(err => {
// console.log(err) // console.log(err)
// }) // })
// export const choiceEvaluation = (obj) => http.post('/evaluation/choiceEvaluation', obj);

View File

@@ -168,205 +168,7 @@ const commonData={
//组织树 //组织树
const organizationalTree= [ const organizationalTree = []
{
title: "京东方",
value: "京东方",
children: [
{
title: "产研部",
value: "产研部",
children: [
{
title: "产品部",
value: "产品部",
},
{
title: "研究部",
value: "研究部",
},
{
title: "研究部2",
value: "研究部2",
},
{
title: "研究3",
value: "研究3",
},
{
title: "研究4",
value: "研究4",
},
{
title: "研究部5",
value: "研究部5",
},
{
title: "研究部6",
value: "研究部6",
},
{
title: "研究部7",
value: "研究部7",
},
{
title: "研究部8",
value: "研究部8",
},
{
title: "研究部9",
value: "研究部9",
},
],
},
{
title: "二级标题",
value: "二级标题",
children: [
{
title: "三级标题",
value: "三级标题",
children: [
{
title: "四级标题",
value: "四级标题",
children: [
{
title: "五级标题",
value: "五级标题",
children: [
{
title: "六级标题",
value: "六级标题",
children: [
{
title: "七级标题",
value: "七级标题",
children: [
{
title: "八级标题",
value: "八级标题",
children: [
{
title: "九级标题",
value: "九级标题",
children: [
{
title: "十级标题",
value: "十级标题",
children: [
{
title: "十一级标题",
value: "十一级标题",
children: [
{
title: "十二级标题",
value: "十二级标题",
children: [
{
title:
"十三级标题十三级标题十三级标题十三级标题",
value: "十三级标题",
children: [
{
title:
"十四级标题",
value:
"十四级标题",
children: [
{
title:
"十五级标题",
value:
"十五级标题",
children: [
{
title:
"十六级标题",
value:
"十六级标题",
children:
[
{
title:
"十七级标题",
value:
"十七级标题",
children:
[
{
title:
"十八级标题",
value:
"十八级标题",
children:
[
{
title:
"十九级标题",
value:
"十九级标题",
children:
[
{
title:
"二十级标题二十级标题",
value:
"二十级标题二十级标题",
},
],
},
],
},
],
},
],
},
],
},
],
},
],
},
],
},
],
},
],
},
],
},
],
},
],
},
],
},
],
},
],
},
],
},
],
},
{
title: "人力资源部",
value: "人力资源部",
children: [
{
title: "人事部",
value: "人事部",
},
{
title: "行政部",
value: "行政部",
},
],
},
],
},
]
export { export {
toDate, toDate,
getWeek, getWeek,

BIN
src/assets/images/doc.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 477 B

View File

@@ -447,9 +447,10 @@ export default {
state.name = ""; state.name = "";
state.projectName = ""; state.projectName = "";
state.tabledata = []; state.tabledata = [];
getManageList(); //getManageList();
}; };
return { return {
...toRefs(state), ...toRefs(state),
selectProjectName, selectProjectName,

View File

@@ -490,8 +490,9 @@ export default {
state.name = ""; state.name = "";
state.projectName = ""; state.projectName = "";
state.tabledata = []; state.tabledata = [];
getManageList(); // getManageList();
}; };
return { return {
...toRefs(state), ...toRefs(state),
selectProjectName, selectProjectName,

View File

@@ -418,8 +418,9 @@ export default {
state.name = ""; state.name = "";
state.projectName = ""; state.projectName = "";
state.tabledata = []; state.tabledata = [];
getManageList(); //getManageList();
}; };
return { return {
...toRefs(state), ...toRefs(state),
selectProjectName, selectProjectName,

View File

@@ -0,0 +1,225 @@
<template>
<a-drawer
:visible="unlockModeVisible"
class="drawerStyle unlockmode"
placement="right"
width="70%"
@after-visible-change="afterVisibleChange"
>
<div class="drawerMain">
<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="main">
<div class="classify">
<div
v-for="(item, index) in classify"
:key="index"
class="classifyItem"
@click="selectClassify(item)"
:style="{
color: item.type === selectClassifyType ? '#FFFFFF' : '#999999',
'background-color':
item.type === selectClassifyType ? '#409EFF' : '#FFFFFF',
border:
item.type === selectClassifyType
? '1px solid #409EFF'
: '1px solid #999999',
}"
>
{{ item.text }}
</div>
</div>
<div v-if="selectClassifyType === 1" class="type1">
<span style="font-weight: 500">描述</span
><span>不设学习限制学员可以在任何时间学习</span>
</div>
<div v-if="selectClassifyType === 2" class="type1 type2">
<div>
<span style="font-weight: 500">描述</span
><span>辩论活动测评调研投票按照设置时间</span>
</div>
<div class="radio">
<span>解锁单元</span>
<a-radio v-model:checked="checked">逐个任务解锁</a-radio>
</div>
</div>
<div v-if="selectClassifyType === 3" class="type1 type3">
<div>
<span style="font-weight: 500">描述</span
><span>前一个阶段达成目标后解锁下一个阶段</span>
</div>
<div class="radio" style="display: flex">
<div style="margin-top: 1px">解锁条件</div>
<a-radio-group v-model:value="radioSelect">
<div>
<a-radio :value="1"
>逐个任务解锁完成一个任务后解锁下一个</a-radio
>
</div>
<div style="margin-top: 24px">
<a-radio :value="2"
>完成当前阶段所有必修任务解锁下一阶段</a-radio
>
</div>
</a-radio-group>
</div>
</div>
</div>
<div class="btnn">
<button class="btn1">取消</button>
<button class="btn2">确定</button>
</div>
</div>
</a-drawer>
</template>
<script>
import { reactive, toRefs } from "vue";
export default {
name: "UnlockMode",
props: {
unlockModeVisible: {
type: Boolean,
default: false,
},
},
setup(props, ctx) {
const state = reactive({
classify: [
{
type: 1,
text: "自由学习模式",
},
{
type: 2,
text: "按学习时间解锁",
},
{
type: 3,
text: "闯关模式",
},
],
selectClassifyType: 1,
checked: true,
radioSelect: 1,
});
const closeDrawer = () => {
state.selectClassifyType = 1;
state.checked = true;
state.radioSelect = 1;
ctx.emit("update:unlockModeVisible", false);
};
const afterVisibleChange = (bool) => {
console.log("state", bool);
};
const selectClassify = (e) => {
state.selectClassifyType = e.type;
};
return {
...toRefs(state),
afterVisibleChange,
closeDrawer,
// change,
selectClassify,
};
},
};
</script>
<style lang="scss">
.unlockmode {
.drawerMain {
min-width: 600px;
margin: 0px 32px 0px 32px;
overflow-x: auto;
display: flex;
flex-direction: column;
.header {
height: 73px;
border-bottom: 1px solid #e8e8e8;
display: flex;
justify-content: space-between;
align-items: center;
// background-color: red;
margin-bottom: 20px;
.headerTitle {
font-size: 18px;
font-weight: 600;
color: #333333;
line-height: 25px;
// margin-left: 24px;
}
}
.main {
display: flex;
flex-direction: column;
.classify {
display: flex;
.classifyItem {
width: 160px;
height: 38px;
display: flex;
align-items: center;
justify-content: center;
border-radius: 4px;
border: 1px solid #999999;
font-size: 16px;
font-weight: 500;
color: #999999;
line-height: 22px;
margin-right: 16px;
cursor: pointer;
}
}
.type1 {
margin-top: 50px;
font-size: 14px;
font-weight: 400;
color: #333333;
line-height: 20px;
}
.radio {
margin-top: 24px;
}
}
.btnn {
height: 72px;
width: 100%;
position: absolute;
bottom: 0;
left: 0;
display: flex;
align-items: center;
justify-content: center;
box-shadow: 0px 1px 35px 0px rgba(118, 136, 166, 0.16);
.btn1 {
width: 100px;
height: 40px;
border: 1px solid #4ea6ff;
border-radius: 8px;
color: #4ea6ff;
background-color: #fff;
cursor: pointer;
}
.btn2 {
cursor: pointer;
width: 100px;
height: 40px;
background: #4ea6ff;
border-radius: 8px;
border: 0;
margin-left: 15px;
color: #fff;
}
}
}
}
</style>

View File

@@ -378,7 +378,7 @@ export default {
state.name = ""; state.name = "";
state.projectName = ""; state.projectName = "";
state.tabledata = []; state.tabledata = [];
getManageList(); // getManageList();
}; };
return { return {

View File

@@ -1,3 +1,11 @@
/*
* @Author: lixg lixg@dongwu-inc.com
* @Date: 2022-11-09 09:26:26
* @LastEditors: lixg lixg@dongwu-inc.com
* @LastEditTime: 2022-11-20 16:06:52
* @FilePath: /fe-manage/src/store/index.js
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/
import { createStore } from "vuex"; import { createStore } from "vuex";
export default createStore({ export default createStore({
@@ -14,6 +22,8 @@ export default createStore({
assessmentName: "", assessmentName: "",
routerId: null, routerId: null,
orgtreeList: [],
}, },
getters: {}, getters: {},
mutations: { mutations: {
@@ -31,6 +41,9 @@ export default createStore({
console.log("state.assessmentName"); console.log("state.assessmentName");
console.log(state.assessmentName); console.log(state.assessmentName);
}, },
getOrgtreeList(state, orgtreeList) {
state.orgtreeList = orgtreeList;
}
}, },
actions: {}, actions: {},
modules: {}, modules: {},

View File

@@ -114,7 +114,7 @@
<!-- 表格 --> <!-- 表格 -->
<!-- 创建路径弹窗 --> <!-- 创建路径弹窗 v-model:visible="out" -->
<a-modal <a-modal
:closable="sh" :closable="sh"
centered="true" centered="true"
@@ -194,18 +194,24 @@
<img class="im" src="../../assets/px.jpg" /> --> <img class="im" src="../../assets/px.jpg" /> -->
<div <div
@click="chooseImg(item)" @click="chooseImg(item)"
v-for="item in imgData" v-for="(item, index) in imgData"
:key="item.key" :key="item.key"
class="learnBgItem" class="learnBgItem"
:style="{ :style="{
border: border:
learnPathBg === item.id learnPathBg === item.id
? '2px solid rgba(78, 166, 255, 1)' ? '2px solid rgba(78, 166, 255, 1)'
: '1px solid #ccc', : '1px solid #C7CBD2',
'background-image': 'url(' + item.source + ')', 'background-image': 'url(' + item.source + ')',
display: index >= 5 ? 'none' : 'flex',
}" }"
></div>
<div
@click="showLearnBgMore"
v-if="imgData.length > 5"
class="learnBgItem learnBgMore"
> >
<!-- <img class="im" :src="item.source" /> --> 查看更多 <img src="../../assets/images/projectadd/go.png" />
</div> </div>
</div> </div>
</div> </div>
@@ -220,7 +226,7 @@
<button class="samtn btn1" @click="handleOut">取消</button> <button class="samtn btn1" @click="handleOut">取消</button>
<button class="samtn btn2" @click="createLearnPath">确定</button> <button class="samtn btn2" @click="createLearnPath">确定</button>
</div> </div>
</div>
<div <div
class="aeLoading" class="aeLoading"
:style="{ display: lpLoading ? 'flex' : 'none' }" :style="{ display: lpLoading ? 'flex' : 'none' }"
@@ -228,6 +234,7 @@
<a-spin :spinning="lpLoading" tip="添加中..." /> <a-spin :spinning="lpLoading" tip="添加中..." />
</div> </div>
</div> </div>
</div>
</a-modal> </a-modal>
<!-- 编辑路径弹窗 --> <!-- 编辑路径弹窗 -->
@@ -310,7 +317,7 @@
<img class="im" src="../../assets/px.jpg" /> --> <img class="im" src="../../assets/px.jpg" /> -->
<div <div
@click="chooseImg2(item)" @click="chooseImg2(item)"
v-for="item in imgData" v-for="(item, index) in imgData"
:key="item.key" :key="item.key"
class="learnBgItem" class="learnBgItem"
:style="{ :style="{
@@ -319,16 +326,17 @@
? '2px solid rgba(78, 166, 255, 1)' ? '2px solid rgba(78, 166, 255, 1)'
: '1px solid #ccc', : '1px solid #ccc',
'background-image': 'url(' + item.source + ')', 'background-image': 'url(' + item.source + ')',
display: index >= 5 ? 'none' : 'flex',
}" }"
> >
<!-- <img class="im" :src="item.source" /> --> <!-- <img class="im" :src="item.source" /> -->
</div> </div>
<div <div
@click="showImgMore" @click="showLearnBgMore"
v-if="imgData.length >= 5" v-if="imgData.length > 5"
class="learnBgItem" class="learnBgItem learnBgMore"
> >
<!-- <img class="im" :src="item.source" /> --> 查看更多 <img src="../../assets/images/projectadd/go.png" />
</div> </div>
</div> </div>
</div> </div>
@@ -344,8 +352,8 @@
<button class="samtn btn2" @click="editLearnPath">确定</button> <button class="samtn btn2" @click="editLearnPath">确定</button>
</div> </div>
</div> </div>
</div></a-modal </div>
> </a-modal>
<!-- 发布弹窗 --> <!-- 发布弹窗 -->
<a-modal <a-modal
v-model:visible="pub" v-model:visible="pub"
@@ -392,7 +400,9 @@
<div class="projectbox"> <div class="projectbox">
<div class="promessage"> <div class="promessage">
<div class="messageme">路径信息</div> <div class="messageme">路径信息</div>
<div class="messagege">当前路径共0个关卡0个任务</div> <div class="messagege">
当前路径共{{ routeChapters }}个关卡{{ routeTasks }}个任务
</div>
</div> </div>
<div class="stumessage"> <div class="stumessage">
<div class="messageme1">学员信息</div> <div class="messageme1">学员信息</div>
@@ -582,6 +592,49 @@
<power-list v-model:PLvisible="PLvisible" /> <power-list v-model:PLvisible="PLvisible" />
<!-- 创建路径loading --> <!-- 创建路径loading -->
<!-- 更多背景图 v-model:visible="learnBgMore" -->
<a-modal
:closable="sh"
centered="true"
v-model:visible="learnBgMore"
:footer="null"
wrapClassName="learnBgMoreModal"
:z-index="9999"
>
<div class="main">
<div class="top">
<div class="topc">路径图背景</div>
<div @click="closeLearnBgMore">
<img
style="width: 20px; height: 20px"
src="../../assets/images/basicinfo/close.png"
/>
</div>
</div>
<div class="imagesBox">
<div
@click="chooseImg2(item)"
v-for="item in imgData"
:key="item.key"
class="learnBgItem"
:style="{
border:
learnPathBg2 === item.id
? '2px solid rgba(78, 166, 255, 1)'
: '1px solid #ccc',
'background-image': 'url(' + item.source + ')',
}"
>
<!-- <img class="im" :src="item.source" /> -->
</div>
</div>
<div class="btn">
<button class="samtn btn1" @click="closeLearnBgMore">取消</button>
<button class="samtn btn2" @click="closeLearnBgMore">确定</button>
</div>
</div>
</a-modal>
</div> </div>
</template> </template>
<script> <script>
@@ -643,6 +696,74 @@ export default {
id: 5, id: 5,
source: require("../../assets/images/leveladd/3.png"), source: require("../../assets/images/leveladd/3.png"),
}, },
{
id: 6,
source: require("../../assets/images/leveladd/3.png"),
},
{
id: 7,
source: require("../../assets/images/leveladd/2.png"),
},
{
id: 5,
source: require("../../assets/images/leveladd/3.png"),
},
{
id: 6,
source: require("../../assets/images/leveladd/3.png"),
},
{
id: 7,
source: require("../../assets/images/leveladd/2.png"),
},
{
id: 5,
source: require("../../assets/images/leveladd/3.png"),
},
{
id: 6,
source: require("../../assets/images/leveladd/3.png"),
},
{
id: 7,
source: require("../../assets/images/leveladd/2.png"),
},
{
id: 5,
source: require("../../assets/images/leveladd/3.png"),
},
{
id: 6,
source: require("../../assets/images/leveladd/3.png"),
},
{
id: 7,
source: require("../../assets/images/leveladd/2.png"),
},
{
id: 5,
source: require("../../assets/images/leveladd/3.png"),
},
{
id: 6,
source: require("../../assets/images/leveladd/3.png"),
},
{
id: 7,
source: require("../../assets/images/leveladd/2.png"),
},
{
id: 5,
source: require("../../assets/images/leveladd/3.png"),
},
{
id: 6,
source: require("../../assets/images/leveladd/3.png"),
},
{
id: 7,
source: require("../../assets/images/leveladd/2.png"),
},
], ],
learnPathBg: null, //创建路径选择的路径图背景 learnPathBg: null, //创建路径选择的路径图背景
learnPathBg2: null, //编辑路径选择的路径图背景 learnPathBg2: null, //编辑路径选择的路径图背景
@@ -728,14 +849,16 @@ export default {
endTime: null, //结束时间 endTime: null, //结束时间
//发布--------------- //发布---------------
releasePathId: null, //发布路径id releasePathId: null, //发布路径id
routeStudentsNum: 0, routeStudentsNum: 0, //学员总数
routeChapters: 0, //关卡总数
routeTasks: 0, //任务总数
recallPathId: null, //撤回路径id recallPathId: null, //撤回路径id
stopPathId: null, //停用路径id stopPathId: null, //停用路径id
copyPathId: null, //复制路径iid copyPathId: null, //复制路径iid
lpLoading: false, lpLoading: false,
learnBgMore: false, //是否显示更多学习路径背景
}); });
const selectProjectName = (value, index) => { const selectProjectName = (value, index) => {
console.log("value", value, index); console.log("value", value, index);
}; };
@@ -773,32 +896,19 @@ export default {
const showPub = (routerId) => { const showPub = (routerId) => {
state.pub = true; state.pub = true;
state.releasePathId = routerId; state.releasePathId = routerId;
//获取学员总数
let obj = {
pageNo: 0,
pageSize: 0,
routerId: routerId,
};
api api
.getStudent(obj) .getLearnCount(routerId)
.then((res) => { .then((res) => {
if (res.status === 200) { if (res.status === 200) {
// console.log("res", res.data.data); // console.log("获取关卡、任务、学员统计数据", res.data);
state.routeStudentsNum = res.data.data.total; state.routeStudentsNum = res.data.students;
state.routeChapters = res.data.chapters;
state.routeTasks = res.data.tasks;
} }
}) })
.catch((err) => { .catch((err) => {
console.log("err", err); console.log("err", err);
}); });
//获取学习路径详细信息
api
.getRouterDetail(routerId)
.then((res) => {
console.log("学习路径详情", res);
})
.catch((err) => {
console.log("学习路径详情获取错误", err);
});
}; };
//确定发布 //确定发布
const releaseLearnPath = () => { const releaseLearnPath = () => {
@@ -1507,10 +1617,33 @@ export default {
state.endTime = null; state.endTime = null;
getLearnPath(); getLearnPath();
}; };
// const choiceEvaluation=()=>{
// let obj={
// keyword: "",
// user_id: 1
// }
// api.choiceEvaluation(obj).then(res=>{
// console.log('获取测评列表',res)
// }).catch(err=>{
// console.log('获取测评列表失败',err)
// })
// }
// choiceEvaluation()
//显示更多路径背景弹窗
const showLearnBgMore = () => {
state.learnBgMore = true;
};
//关闭更多路径背景弹窗
const closeLearnBgMore = () => {
state.learnBgMore = false;
};
onMounted(() => { onMounted(() => {
// console.log("执行"); // console.log("执行");
getLearnPath(); getLearnPath();
}); });
return { return {
...toRefs(state), ...toRefs(state),
selectProjectName, selectProjectName,
@@ -1549,6 +1682,8 @@ export default {
searchTimeChange, searchTimeChange,
searchLearnPath, searchLearnPath,
resetLearnPath, resetLearnPath,
showLearnBgMore,
closeLearnBgMore,
}; };
}, },
}; };
@@ -1683,6 +1818,7 @@ export default {
display: flex; display: flex;
flex-wrap: wrap; flex-wrap: wrap;
min-height: 110px; min-height: 110px;
height: 300px;
.learnBgItem { .learnBgItem {
border-radius: 8px; border-radius: 8px;
width: 136px; width: 136px;
@@ -1692,6 +1828,17 @@ export default {
margin-bottom: 20px; margin-bottom: 20px;
margin-right: 6px; margin-right: 6px;
} }
.learnBgMore {
display: flex;
align-items: center;
justify-content: center;
border: 1px solid #c7cbd2;
font-size: 14px;
font-weight: 400;
color: #4ea6ff;
line-height: 36px;
cursor: pointer;
}
} }
} }
.info { .info {
@@ -1757,6 +1904,84 @@ export default {
} }
} }
} }
.learnBgMoreModal {
.ant-modal {
width: 680px !important;
height: 528px !important;
.ant-modal-content {
width: 680px !important;
height: 528px !important;
.ant-modal-body {
width: 680px !important;
height: 528px !important;
padding: 0 !important;
.main {
display: flex;
flex-direction: column;
.top {
padding-left: 51px;
padding-right: 51px;
padding-top: 28px;
display: flex;
align-items: center;
justify-content: space-between;
cursor: pointer;
.topc {
font-size: 16px;
font-weight: bold;
color: #000000;
line-height: 36px;
}
}
.imagesBox {
display: flex;
// justify-content: space-between;
flex-wrap: wrap;
padding-left: 51px;
padding-right: 39px;
margin-top: 20px;
height: 350px;
overflow-y: auto;
.learnBgItem {
border-radius: 8px;
width: 136px;
height: 106px;
background-size: 100%;
background-repeat: no-repeat;
margin-bottom: 20px;
margin-right: 10px;
}
}
.btn {
width: 100%;
position: absolute;
bottom: 30px;
margin-top: 30px;
display: flex;
justify-content: center;
.samtn {
width: 100px;
height: 40px;
font-size: 14px;
border: 1px solid #4ea6ff;
border-radius: 8px;
cursor: pointer;
}
.btn1 {
background-color: #fff;
color: #4ea6ff;
}
.btn2 {
background-color: #4ea6ff;
color: #fff;
margin-left: 16px;
}
}
}
}
}
}
}
.pub { .pub {
.ant-modal { .ant-modal {
.ant-modal-body { .ant-modal-body {

View File

@@ -625,8 +625,9 @@
:pageSize="pageSize" :pageSize="pageSize"
:current="currentPage" :current="currentPage"
:total="tableDataTotal" :total="tableDataTotal"
@change="pageChange"
class="pagination" class="pagination"
style="display: none" style="display: block"
/> />
</div> </div>
</div> </div>
@@ -762,19 +763,20 @@
<div <div
v-for="item in docList" v-for="item in docList"
:key="item.src" :key="item.src"
style="margin-top: 20px;"
class="docListStyle" class="docListStyle"
> >
<img <img
src="@/assets/images/basicinfo/download.png" src="@/assets/images/doc.png"
style=" style="
cursor: pointer; cursor: pointer;
width: 40px; width: 30px;
height: 40px; height: 25px;
margin-right: 40px; margin-right: 10px;
" "
alt="" alt=""
/> />
<span style="font: oblique 16px Sans-serif">{{ <span style="font: oblique bolder 16px 宋体">{{
item.name item.name
}}</span> }}</span>
<span style="color: #4ea6ff; float: right">删除</span> <span style="color: #4ea6ff; float: right">删除</span>
@@ -1580,7 +1582,7 @@ export default {
const getStudent = () => { const getStudent = () => {
let obj = { let obj = {
name: "", name: "",
pageNo: 1, pageNo: state.currentPage,
pageSize: 10, pageSize: 10,
routerId: 100, routerId: 100,
}; };
@@ -1589,7 +1591,7 @@ export default {
.then((res) => { .then((res) => {
console.log("获取学员列表", res); console.log("获取学员列表", res);
let data = res.data.data.rows || null; let data = res.data.data.rows || null;
// state.tableData = []; state.tableData = [];
if (data.length) { if (data.length) {
for (let i in data) { for (let i in data) {
let _time = new Date(data[i].beginStudyTime * 1000); let _time = new Date(data[i].beginStudyTime * 1000);
@@ -1882,6 +1884,7 @@ export default {
.delStudent({ routerId: 100, studentIds: [id] }) .delStudent({ routerId: 100, studentIds: [id] })
.then((res) => { .then((res) => {
message.success("删除成功"); message.success("删除成功");
getStudent()
console.log(res); console.log(res);
}) })
.catch((err) => { .catch((err) => {
@@ -1914,12 +1917,39 @@ export default {
} }
api.delStudent(obj).then((res) => { api.delStudent(obj).then((res) => {
console.log(res); console.log(res);
getStudent();
message.success("批量删除成功") message.success("批量删除成功")
}).catch(err => { }).catch(err => {
message.error("批量删除失败"+err); message.error("批量删除失败"+err);
console.log(err) console.log(err)
}) })
}; };
const pageChange = (value) => {
state.currentPage = value;
getStudent();
}
const setconfig = () => {
let obj = {
"autoJoinFlag": 0,
"deptBoList": [
{
"deptId": 0,
"deptName": ""
}
],
"preLearnFlag": 0,
"previewFlag": 0,
"routerId": 0,
"showFlag": 0
}
api.setConfig(obj).then((res) => {
message.success("编辑成功")
console.log(res);
}).catch(err => {
console.log(err);
message.error("编辑失败")
})
}
return { return {
...toRefs(state), ...toRefs(state),
...toRefs(levelList), ...toRefs(levelList),
@@ -1967,6 +1997,8 @@ export default {
showStop, showStop,
reget, reget,
stageChange, stageChange,
pageChange,
setconfig,
}; };
}, },
}; };

View File

@@ -1,5 +1,6 @@
<template> <template>
<div class="leveladddetail"> <div class="leveladddetail">
<div style="display: flex">
<div class="left clearfix"> <div class="left clearfix">
<div class="leftmain"> <div class="leftmain">
<div class="tit" style="margin-left: 18px">关卡</div> <div class="tit" style="margin-left: 18px">关卡</div>
@@ -185,13 +186,20 @@
<span>学习模式</span> <span>学习模式</span>
<div class="inputbox"> <div class="inputbox">
<input type="text" placeholder="按学习时间解锁" /> <input type="text" placeholder="按学习时间解锁" />
<div class="bottonbox"><div class="btnText">切换模式</div></div> <div class="bottonbox" @click="showModeVisible">
<div class="btnText">切换模式</div>
</div> </div>
</div> </div>
<!-- 切换模式抽屉 -->
<unlock-mode v-model:unlockModeVisible="unlockModeVisible" />
</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">
<img class="img2" src="../../assets/images/leveladd/back.png" /> <img
class="img2"
src="../../assets/images/leveladd/back.png"
/>
<div class="return">返回</div> <div class="return">返回</div>
</div> </div>
</router-link> </router-link>
@@ -481,7 +489,9 @@
</div> </div>
<div class="btn btn2"> <div class="btn btn2">
<div class="imgIcon"></div> <div class="imgIcon"></div>
<div class="btnText" @click="showDeleteALLModal">批量删除</div> <div class="btnText" @click="showDeleteALLModal">
批量删除
</div>
</div> </div>
</div> </div>
</div> </div>
@@ -534,7 +544,9 @@
<div style="width: 120px; text-align: center">任务名称</div> <div style="width: 120px; text-align: center">任务名称</div>
<div style="width: 120px; text-align: center">必修/选修</div> <div style="width: 120px; text-align: center">必修/选修</div>
<div style="width: 87px; text-align: center">时长</div> <div style="width: 87px; text-align: center">时长</div>
<div style="width: 120px; text-align: center; margin-right: 20px"> <div
style="width: 120px; text-align: center; margin-right: 20px"
>
操作 操作
</div> </div>
</div> </div>
@@ -624,7 +636,11 @@
{{ element.cretime }}分钟 {{ element.cretime }}分钟
</div> </div>
<div <div
style="width: 120px; text-align: center; margin-right: 20px" style="
width: 120px;
text-align: center;
margin-right: 20px;
"
> >
<div class="opa"> <div class="opa">
<div class="opacation"> <div class="opacation">
@@ -658,7 +674,10 @@
</draggable> </draggable>
</div> </div>
<!-- 无数据样式 --> <!-- 无数据样式 -->
<div class="notable" :style="{ display: stm_hs ? 'block' : 'none' }"> <div
class="notable"
:style="{ display: stm_hs ? 'block' : 'none' }"
>
<div class="notablebox"> <div class="notablebox">
<div class="boxbody"> <div class="boxbody">
<div class="boximg"></div> <div class="boximg"></div>
@@ -676,19 +695,7 @@
<!-- 无数据样式 --> <!-- 无数据样式 -->
</div> </div>
</div> </div>
<div class="footbtn">
<div class="btnbox">
<div class="btn btn2">
<div class="btnText">暂存</div>
</div>
<div class="btn btn2">
<div class="btnText">确定</div>
</div>
<div class="btn btn1" @click="gqxy_hShow">
<div class="btnText">下一步</div>
</div>
</div>
</div>
<div class="draw" style="position: relative"> <div class="draw" style="position: relative">
<a-drawer <a-drawer
v-model:visible="addprojvisible" v-model:visible="addprojvisible"
@@ -743,13 +750,20 @@
<span>学习模式</span> <span>学习模式</span>
<div class="inputbox"> <div class="inputbox">
<input type="text" placeholder="按学习时间解锁" /> <input type="text" placeholder="按学习时间解锁" />
<div class="bottonbox"><div class="btnText">切换模式</div></div> <div class="bottonbox" @click="showModeVisible">
<div class="btnText">切换模式</div>
</div> </div>
</div> </div>
<!-- 切换模式抽屉 -->
<unlock-mode v-model:unlockModeVisible="unlockModeVisible" />
</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">
<img class="img2" src="../../assets/images/leveladd/back.png" /> <img
class="img2"
src="../../assets/images/leveladd/back.png"
/>
<div class="return">返回</div> <div class="return">返回</div>
</div> </div>
</router-link> </router-link>
@@ -821,7 +835,9 @@
> >
</div> </div>
<div class="boxtitle2"> <div class="boxtitle2">
<span style="color: #878b92">请添加学员或导入学员</span> <span style="color: #878b92"
>请添加学员或导入学员</span
>
</div> </div>
</div> </div>
<div class="smallleft"></div> <div class="smallleft"></div>
@@ -846,6 +862,21 @@
</div> </div>
</div> </div>
</div> </div>
</div>
<div class="footbtn">
<div class="btnbox">
<div class="btn btn2">
<div class="btnText">暂存</div>
</div>
<div class="btn btn2">
<div class="btnText">确定</div>
</div>
<div class="btn btn1">
<div class="btnText">取消</div>
</div>
</div>
</div>
<!-- 添加学员抽屉 --> <!-- 添加学员抽屉 -->
<add-stu v-model:AddSvisible="AddSvisible" /> <add-stu v-model:AddSvisible="AddSvisible" />
<!-- 导入学员抽屉 --> <!-- 导入学员抽屉 -->
@@ -961,8 +992,8 @@
</div> </div>
</div> </div>
</div> </div>
</div></a-modal </div>
> </a-modal>
<!-- 是否删除关卡弹窗 --> <!-- 是否删除关卡弹窗 -->
<a-modal <a-modal
@@ -1022,6 +1053,7 @@ import * as apiProj from "../../api/index.js";
import { RouterEditTask } from "@/api/indexTask"; import { RouterEditTask } from "@/api/indexTask";
import dayjs from "dayjs"; import dayjs from "dayjs";
import { toDate } from "../../api/method"; import { toDate } from "../../api/method";
import UnlockMode from "../../components/drawers/UnlockMode.vue";
export default { export default {
name: "LevelAddDetail", name: "LevelAddDetail",
components: { components: {
@@ -1039,6 +1071,7 @@ export default {
AddLive, AddLive,
AddRef, AddRef,
draggable, draggable,
UnlockMode,
}, },
setup() { setup() {
const state = reactive({ const state = reactive({
@@ -1303,6 +1336,8 @@ export default {
updateChapterID: null, //编辑关卡id updateChapterID: null, //编辑关卡id
deleteChapterModal: false, //删除关卡弹窗 deleteChapterModal: false, //删除关卡弹窗
deleteChapterId: null, //删除关卡id deleteChapterId: null, //删除关卡id
unlockModeVisible: false, //切换模式抽屉
}); });
const showModal = (element) => { const showModal = (element) => {
@@ -1329,7 +1364,7 @@ export default {
name: state.value1, name: state.value1,
remark: state.value2, remark: state.value2,
routerId: state.routerId, routerId: state.routerId,
chapterId:state.updateChapterID chapterId: state.updateChapterID,
}; };
api api
.updateChapter(obj) .updateChapter(obj)
@@ -1373,14 +1408,14 @@ export default {
}; };
//打开删除关卡弹窗 //打开删除关卡弹窗
const showDeleteChapter = (id) => { const showDeleteChapter = (id) => {
state.deleteChapterId=id state.deleteChapterId = id;
state.deleteChapterModal=true state.deleteChapterModal = true;
} };
//关闭删除关卡弹窗 //关闭删除关卡弹窗
const closeDeleteChapter = () => { const closeDeleteChapter = () => {
state.deleteChapterId=null state.deleteChapterId = null;
state.deleteChapterModal=false state.deleteChapterModal = false;
} };
//删除关卡 //删除关卡
const deleteChapter = () => { const deleteChapter = () => {
console.log("chapterId", state.deleteChapterId); console.log("chapterId", state.deleteChapterId);
@@ -1391,8 +1426,8 @@ const closeDeleteChapter=()=>{
.deleteChapter(obj) .deleteChapter(obj)
.then((res) => { .then((res) => {
console.log("删除关卡成功", res); console.log("删除关卡成功", res);
message.success('删除关卡成功') message.success("删除关卡成功");
closeDeleteChapter() closeDeleteChapter();
getDetail(); getDetail();
}) })
.catch((err) => { .catch((err) => {
@@ -1545,7 +1580,6 @@ const closeDeleteChapter=()=>{
state.visible = false; state.visible = false;
}; };
const afterVisibleChange = (bool) => { const afterVisibleChange = (bool) => {
console.log("visible", bool); console.log("visible", bool);
}; };
@@ -1999,14 +2033,14 @@ const closeDeleteChapter=()=>{
const getAllProjText = () => { const getAllProjText = () => {
apiProj apiProj
.getProjectList({ .getProjectList({
"beginTime": 0, beginTime: 0,
"createName": "", createName: "",
"endTime": 0, endTime: 0,
"manager": "", manager: "",
"name": "", name: "",
"pageNo": 0, pageNo: 0,
"pageSize": 0, pageSize: 0,
"status": 0 status: 0,
}) })
.then((res) => { .then((res) => {
let arr = res.data.data.rows; let arr = res.data.data.rows;
@@ -2017,7 +2051,7 @@ const closeDeleteChapter=()=>{
}) })
.catch((err) => { .catch((err) => {
console.log("获取全部项目信息接口失败", err); console.log("获取全部项目信息接口失败", err);
console.log('+++++++++++++++++++++++++++++++++++++++++++++++'); console.log("+++++++++++++++++++++++++++++++++++++++++++++++");
// state.createLoading = false; // state.createLoading = false;
}); });
}; };
@@ -2041,6 +2075,11 @@ const closeDeleteChapter=()=>{
console.log(err, 1111); console.log(err, 1111);
}); });
}; };
//显示切换模式抽屉
const showModeVisible = () => {
state.unlockModeVisible = true;
};
onMounted(() => { onMounted(() => {
// createCase(); // createCase();
getAllProjText(); getAllProjText();
@@ -2098,10 +2137,11 @@ const closeDeleteChapter=()=>{
getAllProjText, getAllProjText,
updateTask, updateTask,
showDeleteChapter, showDeleteChapter,
closeDeleteChapter, closeDeleteChapter,
deleteChapter, deleteChapter,
showModeVisible,
}; };
}, },
}; };
@@ -2514,6 +2554,7 @@ const closeDeleteChapter=()=>{
.leveladddetail { .leveladddetail {
width: 100%; width: 100%;
display: flex; display: flex;
flex-direction: column;
min-width: 933px; min-width: 933px;
background-color: rgba(245, 247, 250, 1); background-color: rgba(245, 247, 250, 1);
.left { .left {
@@ -3219,49 +3260,49 @@ const closeDeleteChapter=()=>{
} }
} }
} }
.footbtn { // .footbtn {
width: 100%; // width: 100%;
flex: 1; // flex: 1;
background-color: #fff; // background-color: #fff;
box-shadow: 0px 1px 35px 0px rgba(118, 136, 166, 0.07); // box-shadow: 0px 1px 35px 0px rgba(118, 136, 166, 0.07);
display: flex; // display: flex;
justify-content: end; // justify-content: end;
.btnbox { // .btnbox {
display: flex; // display: flex;
margin-right: 36px; // margin-right: 36px;
.btn { // .btn {
padding: 0px 26px 0px 26px; // padding: 0px 26px 0px 26px;
height: 38px; // height: 38px;
border-radius: 8px; // border-radius: 8px;
border: 1px solid rgba(64, 158, 255, 1); // border: 1px solid rgba(64, 158, 255, 1);
display: flex; // display: flex;
align-items: center; // align-items: center;
justify-content: center; // justify-content: center;
flex-shrink: 0; // flex-shrink: 0;
margin: 21px 0px 19px 14px; // margin: 21px 0px 19px 14px;
cursor: pointer; // cursor: pointer;
white-space: nowrap; // white-space: nowrap;
.btnText { // .btnText {
font-size: 14px; // font-size: 14px;
font-weight: 400; // font-weight: 400;
line-height: 36px; // line-height: 36px;
margin-left: 5px; // margin-left: 5px;
} // }
} // }
.btn1 { // .btn1 {
background-color: #409eff; // background-color: #409eff;
.btnText { // .btnText {
color: #ffffff; // color: #ffffff;
} // }
} // }
.btn2 { // .btn2 {
background-color: #ffffff; // background-color: #ffffff;
.btnText { // .btnText {
color: #409eff; // color: #409eff;
} // }
} // }
} // }
} // }
} }
.opat { .opat {
.opacationt { .opacationt {
@@ -3321,6 +3362,52 @@ const closeDeleteChapter=()=>{
margin-left: 10px; margin-left: 10px;
} }
} }
.footbtn {
width: 100%;
height: 80px;
margin-top: 16px;
// flex: 1;
background-color: #fff;
box-shadow: 0px 1px 35px 0px rgba(118, 136, 166, 0.07);
display: flex;
justify-content: end;
.btnbox {
display: flex;
margin-right: 36px;
height: 80px;
.btn {
padding: 0px 26px 0px 26px;
height: 38px;
border-radius: 8px;
border: 1px solid rgba(64, 158, 255, 1);
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
margin: 21px 0px 19px 14px;
cursor: pointer;
white-space: nowrap;
.btnText {
font-size: 14px;
font-weight: 400;
line-height: 36px;
margin-left: 5px;
}
}
.btn1 {
background-color: #409eff;
.btnText {
color: #ffffff;
}
}
.btn2 {
background-color: #ffffff;
.btnText {
color: #409eff;
}
}
}
}
} }
.CopyModal { .CopyModal {
.ant-modal { .ant-modal {

View File

@@ -169,7 +169,34 @@
</div> </div>
<div class="in select"> <div class="in select">
<a-select <a-tree-select
:getPopupContainer="
(triggerNode) => {
return triggerNode.parentNode || document.body;
}
"
v-model:value="classifySelect2"
style="width: 100%"
:dropdown-style="{ maxHeight: '400px', overflow: 'auto' }"
placeholder="自动带出 可修改"
allow-clear
tree-default-expand-all
:tree-data="classifyList2"
:fieldNames="{
children: 'children',
label: 'name',
value: 'id',
}"
:disabled="viewDetail ? true : false"
@change="classificationChange2"
dropdownClassName="treeDropdown"
>
<!-- <template #title="{ value: val, title }">
<b v-if="val === 'parent 1-1'" style="color: #08c">sss</b>
<template v-else>{{ title }}</template>
</template> -->
</a-tree-select>
<!-- <a-select
:getPopupContainer=" :getPopupContainer="
(triggerNode) => { (triggerNode) => {
return triggerNode.parentNode || document.body; return triggerNode.parentNode || document.body;
@@ -179,8 +206,9 @@
placeholder="自动带出 可修改" placeholder="自动带出 可修改"
:options="classifyList2" :options="classifyList2"
@change="classificationChange2" @change="classificationChange2"
:field-names="{ label: 'name', value: 'id', options: 'children' }"
:disabled="viewDetail ? true : false" :disabled="viewDetail ? true : false"
/> /> -->
</div> </div>
</div> </div>
<div class="name name2"> <div class="name name2">
@@ -359,22 +387,24 @@
</div> </div>
</template> </template>
<script> <script>
import { reactive, toRefs, ref, onUnmounted } from "vue"; import { reactive, toRefs, ref, onUnmounted, computed } from "vue";
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 dayjs from "dayjs"; import dayjs from "dayjs";
import * as api from "../../api/index"; import * as api from "../../api/index";
// import * as api1 from "../../api/index1";
import { storage } from "../../api/storage"; import { storage } from "../../api/storage";
import { toDate } from "../../api/method"; import { toDate } from "../../api/method";
import { useStore } from "vuex";
export default { export default {
name: "projectAdd", name: "projectAdd",
setup() { setup() {
const store = useStore();
// 编辑页面跳转过来时候,自动填充表格 // 编辑页面跳转过来时候,自动填充表格
const routers = useRoute(); const routers = useRoute();
const isEdit = ref(false); const isEdit = ref(false);
let peojectID = ""; let peojectID = "";
console.log("store.state.orgtreeList", store.state.orgtreeList);
if (routers.query.projectId) { if (routers.query.projectId) {
storage.set("projectAddId", routers.query.projectId); storage.set("projectAddId", routers.query.projectId);
isEdit.value = true; isEdit.value = true;
@@ -515,7 +545,7 @@ export default {
valueE1: null, valueE1: null,
valueE2: null, valueE2: null,
classifySelect1: [], classifySelect1: [],
classifySelect2: [], classifySelect2: null,
classifySelect3: [], classifySelect3: [],
classifySelect4: [], classifySelect4: [],
rangevalue: [], rangevalue: [],
@@ -690,11 +720,25 @@ export default {
}; };
// 资源归属 sourceBelongId 后续给接口 // 资源归属 sourceBelongId 后续给接口
const classifyList2 = ref([ const classifyList2 = computed(() => {
{ value: 1, label: "项目一" }, return store.state.orgtreeList ? store.state.orgtreeList : ref(null);
{ value: 2, label: "项目二" }, });
{ value: 3, label: "项目三" },
]); // //获取资源归属
// const orgTree = () => {
// api1
// .orgtree()
// .then((res) => {
// console.log("获取集团组织成功", res);
// if (res.status === 200) {
// classifyList2.value = res.data.data;
// }
// })
// .catch((err) => {
// console.log("获取集团组织失败", err);
// });
// };
// orgTree();
let sourceBelongIdC = ""; let sourceBelongIdC = "";
const classificationChange2 = (key) => { const classificationChange2 = (key) => {
@@ -1357,4 +1401,18 @@ export default {
} }
} }
} }
.treeDropdown {
// width: 240px !important;
// border-radius: 5px;
// min-height: 600px !important;
.ant-select-tree-list-scrollbar {
width: 5px !important;
.ant-select-tree-list-scrollbar-thumb {
background-color: #4ea6ff !important;
}
}
.ant-select-tree-indent-unit {
width: 7px !important;
}
}
</style> </style>

View File

@@ -968,7 +968,9 @@
<div class="projectbox"> <div class="projectbox">
<div class="promessage"> <div class="promessage">
<div class="messageme">项目信息</div> <div class="messageme">项目信息</div>
<div class="messagege">当前项目共0个阶段0个任务</div> <div class="messagege">
当前项目共{{ projectStages }}个阶段{{ projectTasks }}个任务
</div>
</div> </div>
<div class="stumessage"> <div class="stumessage">
<div class="messageme1">学员信息</div> <div class="messageme1">学员信息</div>
@@ -1041,7 +1043,9 @@
<div class="close_exit" @click="closeReminderModal"></div> <div class="close_exit" @click="closeReminderModal"></div>
</div> </div>
<div class="body"> <div class="body">
<div style="margin-left:60px;margin-right:60px">请您根据自身需求选择对应项目类别多层项目与单层项目操作不同层级不同</div> <div style="margin-left: 60px; margin-right: 60px">
请您根据自身需求选择对应项目类别多层项目与单层项目操作不同层级不同
</div>
</div> </div>
<div class="del_btnbox"> <div class="del_btnbox">
<div class="del_btn btn2" @click="okReminderModal"> <div class="del_btn btn2" @click="okReminderModal">
@@ -1052,7 +1056,6 @@
</div> </div>
</a-modal> </a-modal>
<!-- 归属权抽屉 --> <!-- 归属权抽屉 -->
<proj-owner-ship v-model:ProjOwnervisible="ProjOwnervisible" /> <proj-owner-ship v-model:ProjOwnervisible="ProjOwnervisible" />
<!-- 授权名单抽屉 --> <!-- 授权名单抽屉 -->
@@ -1061,9 +1064,6 @@
<proj-check-ship v-model:ProjCheckvisible="ProjCheckvisible" /> <proj-check-ship v-model:ProjCheckvisible="ProjCheckvisible" />
<!-- 管理权抽屉 --> <!-- 管理权抽屉 -->
<proj-manage-ship v-model:ProjManagevisible="ProjManagevisible" /> <proj-manage-ship v-model:ProjManagevisible="ProjManagevisible" />
</div> </div>
</template> </template>
<script> <script>
@@ -1118,7 +1118,9 @@ export default {
tableDataTotal: -1, //学习路径列表总数 tableDataTotal: -1, //学习路径列表总数
pageSize: 10, //每页10条数据 pageSize: 10, //每页10条数据
projectStudentsNum: 0, //发布弹窗-学员人 projectStudentsNum: 0, //发布弹窗-学员人
projectStages: 0,
projectTasks: 0,
releaseProjectId: null, //发布的项目id releaseProjectId: null, //发布的项目id
releaseProjectName: null, //发布的项目名称 releaseProjectName: null, //发布的项目名称
releaseProjectTime: null, //发布的项目时间 releaseProjectTime: null, //发布的项目时间
@@ -1800,26 +1802,39 @@ export default {
state.releaseProjectName = object.name; state.releaseProjectName = object.name;
state.releaseProjectTime = object.time; state.releaseProjectTime = object.time;
console.log("object", object); console.log("object", object);
//获取学员总数
let obj = {
pageNo: 0,
pageSize: 0,
projectId: object.projectId,
};
api api
.projectStudent(obj) .getProjectCount(object.projectId)
.then((res) => { .then((res) => {
if (res.status === 200) { if (res.status === 200) {
// console.log("res", res.data); console.log("获取关卡、任务、学员统计数据", res.data);
state.projectStudentsNum = res.data.data.total state.projectStudentsNum = res.data.students;
? res.data.data.total state.projectStages = res.data.stages;
: 0; state.projectTasks = res.data.tasks;
} }
}) })
.catch((err) => { .catch((err) => {
console.log("获取学员人数失败", err); console.log("err", err);
}); });
//获取阶段及任务总数 // //获取学员总数
// let obj = {
// pageNo: 0,
// pageSize: 0,
// projectId: object.projectId,
// };
// api
// .projectStudent(obj)
// .then((res) => {
// if (res.status === 200) {
// // console.log("res", res.data);
// state.projectStudentsNum = res.data.data.total
// ? res.data.data.total
// : 0;
// }
// })
// .catch((err) => {
// console.log("获取学员人数失败", err);
// });
// //获取阶段及任务总数
}; };
//确认发布项目 //确认发布项目
const releaseProject = () => { const releaseProject = () => {
@@ -3071,8 +3086,7 @@ export default {
}; };
const showModal1 = () => { const showModal1 = () => {
state.reminderModal = true;
state.reminderModal=true
}; };
const closeModal1 = () => { const closeModal1 = () => {
state.estabish = false; state.estabish = false;
@@ -3102,13 +3116,12 @@ export default {
}; };
const closeReminderModal = () => { const closeReminderModal = () => {
state.reminderModal=false state.reminderModal = false;
};
}
const okReminderModal = () => { const okReminderModal = () => {
state.reminderModal=false state.reminderModal = false;
state.estabish = true; state.estabish = true;
} };
return { return {
...toRefs(state), ...toRefs(state),
selectProjectName, selectProjectName,

View File

@@ -137,9 +137,12 @@
<span>学习模式</span> <span>学习模式</span>
<div class="inputbox"> <div class="inputbox">
<input type="text" placeholder="按学习时间解锁" /> <input type="text" placeholder="按学习时间解锁" />
<div class="bottonbox"> <!-- v-model:unlockModeVisible="unlockModeVisible" -->
<div class="bottonbox" @click="showModeVisible">
<div class="btnText">切换模式</div> <div class="btnText">切换模式</div>
</div> </div>
<!-- 切换模式抽屉 -->
<unlock-mode v-model:unlockModeVisible="unlockModeVisible" />
</div> </div>
</div> </div>
<div class="line"></div> <div class="line"></div>
@@ -989,7 +992,6 @@
</div></a-modal </div></a-modal
> >
<!-- 是否删除阶段弹窗 --> <!-- 是否删除阶段弹窗 -->
<a-modal <a-modal
v-model:visible="deleteStageModal" v-model:visible="deleteStageModal"
@@ -1044,7 +1046,7 @@ 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 { storage } from "../../api/storage"; import { storage } from "../../api/storage";
import UnlockMode from "../../components/drawers/UnlockMode.vue";
const drawercolumns = [ const drawercolumns = [
{ {
title: "项目名称", title: "项目名称",
@@ -1100,6 +1102,7 @@ export default {
AddEval, AddEval,
AddInvist, AddInvist,
AddVote, AddVote,
UnlockMode,
}, },
setup() { setup() {
const state = reactive({ const state = reactive({
@@ -1291,6 +1294,8 @@ export default {
updateStageID: null, //编辑阶段id updateStageID: null, //编辑阶段id
deleteStageId: null, //删除阶段的id deleteStageId: null, //删除阶段的id
deleteStageModal: false, //删除阶段弹窗 deleteStageModal: false, //删除阶段弹窗
unlockModeVisible: false, //切换模式抽屉
}); });
console.log("projectId", state.projectId); console.log("projectId", state.projectId);
const selectProjectName = (value, index) => { const selectProjectName = (value, index) => {
@@ -1719,7 +1724,7 @@ export default {
console.log("修改阶段成功", res); console.log("修改阶段成功", res);
state.valuesname = ""; state.valuesname = "";
state.valuesnotice = ""; state.valuesnotice = "";
closeModal() closeModal();
state.updateStageID = null; state.updateStageID = null;
message.destroy(); message.destroy();
message.success("修改阶段成功"); message.success("修改阶段成功");
@@ -1738,9 +1743,9 @@ export default {
.editStage(obj) .editStage(obj)
.then((res) => { .then((res) => {
console.log("添加阶段成功", res); console.log("添加阶段成功", res);
state.valuesname = "" state.valuesname = "";
state.valuesnotice = "" state.valuesnotice = "";
closeModal() closeModal();
message.destroy(); message.destroy();
message.success("添加阶段成功"); message.success("添加阶段成功");
getTask(); getTask();
@@ -1751,18 +1756,16 @@ export default {
} }
}; };
//打开删除阶段弹窗 //打开删除阶段弹窗
const showDeleteStage = (id) => { const showDeleteStage = (id) => {
state.deleteStageId = id;
state.deleteStageId=id state.deleteStageModal = true;
state.deleteStageModal=true };
}
//关闭删除阶段弹窗 //关闭删除阶段弹窗
const closeDeleteStage = () => { const closeDeleteStage = () => {
state.deleteStageId=null state.deleteStageId = null;
state.deleteStageModal=false state.deleteStageModal = false;
} };
//删除阶段 //删除阶段
const deleteStage = () => { const deleteStage = () => {
console.log("chapterId", state.deleteStageId); console.log("chapterId", state.deleteStageId);
@@ -1773,8 +1776,8 @@ const closeDeleteStage=()=>{
.deleteStage(obj) .deleteStage(obj)
.then((res) => { .then((res) => {
console.log("删除阶段成功", res); console.log("删除阶段成功", res);
message.success('删除阶段成功') message.success("删除阶段成功");
closeDeleteStage() closeDeleteStage();
getTask(); getTask();
}) })
.catch((err) => { .catch((err) => {
@@ -2021,6 +2024,11 @@ const closeDeleteStage=()=>{
console.log("阶段改变", value, option); console.log("阶段改变", value, option);
state.removeStageId = option.id; state.removeStageId = option.id;
}; };
//显示切换模式抽屉
const showModeVisible = () => {
state.unlockModeVisible = true;
};
return { return {
...toRefs(state), ...toRefs(state),
selectProjectName, selectProjectName,
@@ -2075,6 +2083,8 @@ const closeDeleteStage=()=>{
showDeleteStage, showDeleteStage,
closeDeleteStage, closeDeleteStage,
deleteStage, deleteStage,
showModeVisible,
}; };
}, },
}; };

View File

@@ -77,7 +77,7 @@
</div> </div>
</template> </template>
</draggable> </draggable>
<div id="qrcode" style="display:flex;flex-direction: column;"> <div id="qrcode" style="display: flex; flex-direction: column">
<div>下载二维码</div> <div>下载二维码</div>
<qrcode-vue <qrcode-vue
:value="qrcodeUrl" :value="qrcodeUrl"
@@ -91,10 +91,29 @@
</div> </div>
<div @click="changeCodevisible">显示二维码弹窗</div> <div @click="changeCodevisible">显示二维码弹窗</div>
<two-dimensional-code v-model:codevisible="codevisible" :codeInfo="codeInfo" index="0" type="课程二维码"/> <two-dimensional-code
v-model:codevisible="codevisible"
:codeInfo="codeInfo"
index="0"
type="课程二维码"
/>
<div @click="changeCodevisible2">显示二维码弹窗22</div> <div @click="changeCodevisible2">显示二维码弹窗22</div>
<two-dimensional-code v-model:codevisible="codevisible2" :codeInfo="codeInfo2" index="1" type="签到二维码"/> <two-dimensional-code
v-model:codevisible="codevisible2"
:codeInfo="codeInfo2"
index="1"
type="签到二维码"
/>
<a-table
:columns="columns"
:data-source="data"
:row-selection="{
selectedRowKeys: selectedRowKeys,
onChange: onSelectChange,
}"
/>
</template> </template>
<script> <script>
import { reactive, toRefs } from "vue"; import { reactive, toRefs } from "vue";
@@ -112,7 +131,7 @@ import draggable from "vuedraggable";
import QrcodeVue from "qrcode.vue"; import QrcodeVue from "qrcode.vue";
import html2canvas from "html2canvas"; import html2canvas from "html2canvas";
import TwoDimensionalCode from '../../components/TwoDimensionalCode.vue' import TwoDimensionalCode from "../../components/TwoDimensionalCode.vue";
export default { export default {
name: "SystemManage", name: "SystemManage",
components: { components: {
@@ -121,8 +140,9 @@ export default {
// PlusOutlined, // PlusOutlined,
draggable, draggable,
QrcodeVue, QrcodeVue,
TwoDimensionalCode TwoDimensionalCode,
}, },
setup() { setup() {
const state = reactive({ const state = reactive({
visible: false, visible: false,
@@ -164,7 +184,72 @@ export default {
codevisible: false, codevisible: false,
codeInfo: {}, codeInfo: {},
codevisible2: false, codevisible2: false,
codeInfo2:{} codeInfo2: {},
columns: [
{
title: "Name",
dataIndex: "name",
key: "name",
},
{
title: "Age",
dataIndex: "age",
key: "age",
width: "12%",
},
{
title: "Address",
dataIndex: "address",
width: "30%",
key: "address",
},
],
data: [
{
key: 1,
name: "John Brown sr.",
age: 60,
address: "New York No. 1 Lake Park",
},
{
key: 2,
name: "Joe Black",
age: 32,
address: "Sidney No. 1 Lake Park",
},
{
key: 3,
name: "Joe Black",
age: 32,
address: "Sidney No. 1 Lake Park",
},
{
key: 4,
name: "Joe Black",
age: 32,
address: "Sidney No. 1 Lake Park",
},
{
key: 5,
name: "Joe Black",
age: 32,
address: "Sidney No. 1 Lake Park",
},
{
key: 6,
name: "Joe Black",
age: 32,
address: "Sidney No. 1 Lake Park",
},
{
key: 7,
name: "Joe Black",
age: 32,
address: "Sidney No. 1 Lake Park",
},
],
selectedRowKeys: [],
}); });
const showDrawer = () => { const showDrawer = () => {
@@ -248,12 +333,12 @@ export default {
//下载二维码图片 //下载二维码图片
const downloadQr = (num) => { const downloadQr = (num) => {
console.log("num", num); console.log("num", num);
state.qrcodeSize=num state.qrcodeSize = num;
let filename = `${new Date().getTime()}.png`; let filename = `${new Date().getTime()}.png`;
let canvas=document.getElementsByTagName('canvas')[0] let canvas = document.getElementsByTagName("canvas")[0];
let imageUrl = canvas.toDataURL("image/png") let imageUrl = canvas.toDataURL("image/png");
let canvasBox = document.createElement('canvas'); let canvasBox = document.createElement("canvas");
let ctx = canvasBox.getContext("2d"); let ctx = canvasBox.getContext("2d");
var img = new Image(); var img = new Image();
// 需要添加文字的图片 // 需要添加文字的图片
@@ -261,25 +346,24 @@ let canvasBox = document.createElement('canvas');
// 等待图片加载完成 // 等待图片加载完成
img.onload = function () { img.onload = function () {
// 将图片添加到canvas // 将图片添加到canvas
ctx.drawImage(img, 0, 0, 1240, 2208) ctx.drawImage(img, 0, 0, 1240, 2208);
// 设置字体 // 设置字体
ctx.font = "73px 微软雅黑 bolder" ctx.font = "73px 微软雅黑 bolder";
// 设置字体颜色 // 设置字体颜色
ctx.fillStyle = "#955f17" ctx.fillStyle = "#955f17";
ctx.textAlign = "center" ctx.textAlign = "center";
// 添加文字和位置 // 添加文字和位置
ctx.fillText("微信名", 621, 1050); ctx.fillText("微信名", 621, 1050);
// 导出为图片 // 导出为图片
let url = canvasBox.toDataURL("image/png") let url = canvasBox.toDataURL("image/png");
let a = document.createElement("a"); let a = document.createElement("a");
a.style.display = "none"; a.style.display = "none";
a.download = filename; a.download = filename;
a.href = url; a.href = url;
document.body.appendChild(a); document.body.appendChild(a);
a.click(); a.click();
} };
// let a = document.createElement("a"); // let a = document.createElement("a");
// a.style.display = "none"; // a.style.display = "none";
@@ -288,7 +372,6 @@ let canvasBox = document.createElement('canvas');
// document.body.appendChild(a); // document.body.appendChild(a);
// a.click(); // a.click();
html2canvas(document.querySelector("#qrcode"), { html2canvas(document.querySelector("#qrcode"), {
useCORS: true, //支持图片跨域 useCORS: true, //支持图片跨域
}).then((canvas) => { }).then((canvas) => {
@@ -300,7 +383,7 @@ let canvasBox = document.createElement('canvas');
// let filename = `${new Date().getTime()}.png`; // let filename = `${new Date().getTime()}.png`;
// var imageUrl = extra_canvas.toDataURL("image/png",1.0); // var imageUrl = extra_canvas.toDataURL("image/png",1.0);
console.log('canvas',canvas, canvas.width,canvas.style.width) console.log("canvas", canvas, canvas.width, canvas.style.width);
// // let ctx = canvas.getContext('2d'); // // let ctx = canvas.getContext('2d');
// // ctx.drawImage(canvas,0,0,canvas.width, canvas.height); // // ctx.drawImage(canvas,0,0,canvas.width, canvas.height);
@@ -321,21 +404,30 @@ let canvasBox = document.createElement('canvas');
//显示二维码弹窗 //显示二维码弹窗
const changeCodevisible = () => { const changeCodevisible = () => {
state.codevisible=true state.codevisible = true;
state.codeInfo = { state.codeInfo = {
title: "签到二维码", title: "签到二维码",
name:'管理者进阶面授课程', name: "管理者进阶面授课程",
url: "https://www.baidu.com/", url: "https://www.baidu.com/",
} };
} };
const changeCodevisible2 = () => { const changeCodevisible2 = () => {
state.codevisible2=true state.codevisible2 = true;
state.codeInfo2 = { state.codeInfo2 = {
title: "签到二维码2222", title: "签到二维码2222",
name:'管理者进阶面授课程2222', name: "管理者进阶面授课程2222",
url: "https://blog.csdn.net/qq_44034384/article/details/93612152", url: "https://blog.csdn.net/qq_44034384/article/details/93612152",
};
};
const onSelectChange = (selectedRowKeys) => {
console.log("selectedRowKeys changed: ", selectedRowKeys);
if (selectedRowKeys.length > 2) {
return;
} }
} state.selectedRowKeys = selectedRowKeys;
};
return { return {
...toRefs(state), ...toRefs(state),
showDrawer, showDrawer,
@@ -346,6 +438,8 @@ let canvasBox = document.createElement('canvas');
downloadQr, downloadQr,
changeCodevisible, changeCodevisible,
changeCodevisible2, changeCodevisible2,
onSelectChange,
}; };
}, },
}; };