This commit is contained in:
quhongwei
2022-12-23 09:05:16 +08:00
27 changed files with 854 additions and 945 deletions

View File

@@ -113,20 +113,7 @@ export default defineComponent({
.then((res) => res.data.data.rows); .then((res) => res.data.data.rows);
//获取组织树 //获取组织树
const getOrgTree = () => { const getOrgTree = () => {
const orgtreeList = localStorage.getItem("orgtreeList"); api.getOrgTreeInfo().then((res) => {
if (orgtreeList) {
store.commit("getOrgtreeList", JSON.parse(orgtreeList));
return;
}
api
.getOrgInfo({
keyWord: "",
id: -1,
pageNo: 1,
pageSize: 20,
})
.then((res) => {
localStorage.setItem("orgtreeList", JSON.stringify(res.data.data));
store.commit("getOrgtreeList", res.data.data); store.commit("getOrgtreeList", res.data.data);
}); });
}; };

View File

@@ -6,7 +6,7 @@
* @FilePath: /fe-manage/src/api/config.js * @FilePath: /fe-manage/src/api/config.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
*/ */
import { message } from "ant-design-vue"; import {message} from "ant-design-vue";
import axios from "axios"; import axios from "axios";
import router from "@/router"; import router from "@/router";
// import { getCookie } from '../api/method' // import { getCookie } from '../api/method'
@@ -14,13 +14,13 @@ import router from "@/router";
// axios.defaults.headers.post["Content-Type"] = // axios.defaults.headers.post["Content-Type"] =
// "application/x-www-form-urlencoded"; // "application/x-www-form-urlencoded";
export const FILE_UPLOAD_URL = process.env.VUE_APP_BASE_API + '/file/upload'
axios.defaults.withCredentials = true; axios.defaults.withCredentials = true;
const http = axios.create({ const http = axios.create({
baseURL: process.env.VUE_APP_BASE_API, baseURL: process.env.VUE_APP_BASE_API,
timeout: 1000 * 15, timeout: 1000 * 15,
// headers: { "Content-Type": "multipart/form-data" }, // headers: { "Content-Type": "multipart/form-data" },
headers: { "Content-Type": "application/json" }, headers: {"Content-Type": "application/json"},
}); });
http.interceptors.request.use( http.interceptors.request.use(
@@ -50,14 +50,14 @@ http.interceptors.response.use(
(response) => { (response) => {
// console.log('response', response) // console.log('response', response)
const { const {
data: { code, msg }, data: {code, msg},
} = response; } = response;
// console.log('code', code) // console.log('code', code)
if (code === 0 || code === 200) { if (code === 0 || code === 200) {
return response; return response;
} else { } else {
if (code === 1000) { if (code === 1000) {
process.env.NODE_ENV === 'development' ? router.push({ path: 'login' }) : (window.location.href = process.env.VUE_APP_LOGIN_URL) process.env.NODE_ENV === 'development' ? router.push({path: 'login'}) : (window.location.href = process.env.VUE_APP_LOGIN_URL)
} }
console.log("api %o", msg); console.log("api %o", msg);
} }

View File

@@ -111,6 +111,7 @@ export const searchUsersByOrgId = (obj) => http.post('/admin/router/searchUsersB
//获取组织信息(修改版) //获取组织信息(修改版)
export const getOrgInfo = (obj) => http.post('/admin/orgStruct/getOrgInfo', obj) export const getOrgInfo = (obj) => http.post('/admin/orgStruct/getOrgInfo', obj)
export const getOrgTreeInfo = (obj) => http.get('/org/initOrg', {params: obj})
//获取员工(修改版) //获取员工(修改版)
export const getMemberInfo = (obj) => http.post('/admin/orgStruct/getMemberInfo', obj) export const getMemberInfo = (obj) => http.post('/admin/orgStruct/getMemberInfo', obj)
//获取受众(修改版) //获取受众(修改版)
@@ -131,6 +132,7 @@ export const addStudentCourse = (obj) => http.post("/admin/offcourse/addStudent"
// 获取组织结构树 // 获取组织结构树
export const orgtree = () => http.get("/org/tree"); export const orgtree = () => http.get("/org/tree");
export const saveStu = obj => http.post("/admin/student/addStudent", obj); export const saveStu = obj => http.post("/admin/student/addStudent", obj);
export const moveStudent = obj => http.post("/admin/student/moveStudent", obj);
export const getStuPage = obj => http.get("/admin/student/getStudent", {params: obj}); export const getStuPage = obj => http.get("/admin/student/getStudent", {params: obj});
export const delStudentList = obj => http.post("/admin/student/delStudent", obj); export const delStudentList = obj => http.post("/admin/student/delStudent", obj);
export const validateName = obj => http.post("/admin/validate/validateName", obj); export const validateName = obj => http.post("/admin/validate/validateName", obj);

View File

@@ -1,7 +1,7 @@
<template> <template>
<a-upload <a-upload
:file-list="files" :file-list="files"
action="/manageApi/file/upload" :action="FILE_UPLOAD_URL"
:show-upload-list="showUploadList" :show-upload-list="showUploadList"
:multiple="multiple" :multiple="multiple"
:before-upload="beforeUpload" :before-upload="beforeUpload"
@@ -16,6 +16,7 @@
<script setup> <script setup>
import {defineProps, defineEmits, defineExpose, ref, watch} from "vue"; import {defineProps, defineEmits, defineExpose, ref, watch} from "vue";
import {message} from "ant-design-vue"; import {message} from "ant-design-vue";
import {FILE_UPLOAD_URL} from "@/api/config";
const props = defineProps({ const props = defineProps({
value: { value: {

View File

@@ -51,7 +51,7 @@
</div> </div>
<div class="btnbox"> <div class="btnbox">
<a-range-picker <a-range-picker
show-time :show-time="{ format: 'HH:mm' }"
format="YYYY-MM-DD HH:mm" format="YYYY-MM-DD HH:mm"
style="width: 400px; height: 40px; border-radius: 8px;" style="width: 400px; height: 40px; border-radius: 8px;"
v-model:value="time" v-model:value="time"

View File

@@ -50,7 +50,7 @@
</div> </div>
<div class="btnbox"> <div class="btnbox">
<a-range-picker <a-range-picker
show-time :show-time="{ format: 'HH:mm' }"
style="width: 400px; height: 40px; border-radius: 8px;" v-model:value="time" format="YYYY-MM-DD HH:mm" style="width: 400px; height: 40px; border-radius: 8px;" v-model:value="time" format="YYYY-MM-DD HH:mm"
:placeholder="[' 开始时间', ' 结束时间']" /> :placeholder="[' 开始时间', ' 结束时间']" />
</div> </div>

View File

@@ -102,7 +102,7 @@
</div> </div>
<div class="select" > <div class="select" >
<a-range-picker style="width: 400px;" <a-range-picker style="width: 400px;"
show-time :show-time="{ format: 'HH:mm' }"
format="YYYY/MM/DD HH:mm" format="YYYY/MM/DD HH:mm"
v-model:value="chooseTime" v-model:value="chooseTime"
:placeholder="[' 开始时间', ' 结束时间']" :placeholder="[' 开始时间', ' 结束时间']"
@@ -354,7 +354,7 @@
<div class="btnbox"> <div class="btnbox">
<a-upload <a-upload
@change="handleChange" @change="handleChange"
action="/manageApi/file/upload" :action="FILE_UPLOAD_URL"
v-model:file-list="fileList" v-model:file-list="fileList"
> >
<button class="xkbtn">上传附件</button> <button class="xkbtn">上传附件</button>
@@ -392,6 +392,7 @@ import { detail } from "../../api/indexCourse";
import { queryAppraiseDetailById } from "../../api/indexInvist"; import { queryAppraiseDetailById } from "../../api/indexInvist";
import { queryWorkDetailById } from "@/api/indexWork"; import { queryWorkDetailById } from "@/api/indexWork";
import { queryExaminationDetailById } from "@/api/indexExam"; import { queryExaminationDetailById } from "@/api/indexExam";
import {FILE_UPLOAD_URL} from "@/api/config";
export default { export default {
name: "AddFaceteach", name: "AddFaceteach",
components: { components: {
@@ -841,6 +842,7 @@ export default {
}; };
return { return {
...toRefs(state), ...toRefs(state),
FILE_UPLOAD_URL,
showDrawerSelFacet, showDrawerSelFacet,
showDrawerAddHomework, showDrawerAddHomework,
showDrawerAddTest, showDrawerAddTest,

View File

@@ -45,7 +45,7 @@
<span style="margin-right: 3px">附件</span> <span style="margin-right: 3px">附件</span>
</div> </div>
<div class="btnbox"> <div class="btnbox">
<a-upload v-model:file-list="fileList" name="file" action="/manageApi/file/upload" <a-upload v-model:file-list="fileList" name="file" :action="FILE_UPLOAD_URL"
@change="handleChange"> @change="handleChange">
<button class="xkbtn" type="button">上传附件</button> <button class="xkbtn" type="button">上传附件</button>
</a-upload> </a-upload>
@@ -82,6 +82,7 @@ import {
import { ProjectEditTask, RouterEditTask } from "@/api/indexTask"; import { ProjectEditTask, RouterEditTask } from "@/api/indexTask";
import dayjs from "dayjs"; import dayjs from "dayjs";
import { addTempTask } from "../../api/indexTaskadd"; import { addTempTask } from "../../api/indexTaskadd";
import {FILE_UPLOAD_URL} from "@/api/config";
export default { export default {
name: "AddHomework", name: "AddHomework",
@@ -513,6 +514,7 @@ export default {
disabledDate, disabledDate,
disabledDateTime, disabledDateTime,
afterVisibleChange, afterVisibleChange,
FILE_UPLOAD_URL,
closeDrawer, closeDrawer,
closeDrawer2, closeDrawer2,
handleChange, handleChange,

View File

@@ -70,7 +70,7 @@
</div> </div>
<div class="btnbox"> <div class="btnbox">
<a-range-picker <a-range-picker
show-time :show-time="{ format: 'HH:mm' }"
style="width: 400px; height: 40px; border-radius: 8px" style="width: 400px; height: 40px; border-radius: 8px"
v-model:value="time" v-model:value="time"
format="YYYY/MM/DD HH:mm" format="YYYY/MM/DD HH:mm"

View File

@@ -130,6 +130,26 @@
<span style="color: #999999; margin-left: 8px">分钟</span> <span style="color: #999999; margin-left: 8px">分钟</span>
</div> </div>
</div> </div>
<div class="main_item">
<div class="signbox">
<div class="sign">
<img
src="@/assets/images/coursewareManage/asterisk.png"
alt=""
/>
</div>
<span style="margin-right: 3px">及格线</span>
</div>
<div class="btnbox">
<a-input
v-model:value="test.passLine"
type="number"
style="width: 400px; height: 40px; border-radius: 8px"
/>
<span style="color: #999999; margin-left: 8px"></span>
</div>
</div>
<div class="main_item2"> <div class="main_item2">
<div class="signbox"> <div class="signbox">
<span style="margin-right: 3px">考试说明</span> <span style="margin-right: 3px">考试说明</span>
@@ -147,7 +167,7 @@
</div> </div>
<div class="main_item2"> <div class="main_item2">
<div class="signbox"> <div class="signbox">
<span style="margin-right: 3px">考试限制</span> <span style="margin-right: 3px;margin-top: 10px;">考试限制</span>
</div> </div>
<div class="kqszbox"> <div class="kqszbox">
<div class="setbox"> <div class="setbox">
@@ -227,27 +247,8 @@
</a-radio-group> </a-radio-group>
</div> </div>
</div> </div>
<div class="main_item">
<div class="signbox">
<div class="sign">
<img
src="@/assets/images/coursewareManage/asterisk.png"
alt=""
/>
</div>
<span style="margin-right: 3px">及格线</span>
</div>
<div class="btnbox">
<a-input
v-model:value="test.passLine"
type="number"
style="width: 400px; height: 40px; border-radius: 8px"
/>
<span style="color: #999999; margin-left: 8px"></span>
</div>
</div>
<div class="main_item">
<div class="main_item"> <div class="main_item">
<div class="signbox"> <div class="signbox">
<span style="margin-right: 3px">试题排列</span> <span style="margin-right: 3px">试题排列</span>
@@ -284,7 +285,7 @@
</a-radio-group> </a-radio-group>
</div> </div>
</div> </div>
</div> <div class="main_item" style="height: 20px;"></div>
</div> </div>
</div> </div>
<div class="main_btns"> <div class="main_btns">
@@ -811,8 +812,7 @@ export default {
.setbox { .setbox {
display: flex; display: flex;
flex-wrap: wrap; flex-wrap: wrap;
margin-top: 10px;
margin-bottom: 24px;
.timerbox { .timerbox {
margin-top: 6px; margin-top: 6px;

View File

@@ -86,45 +86,23 @@ function validateProName() {
} }
</script> </script>
<style lang="scss"> <style lang="scss">
.in {
.pro { .pro {
.ant-input-affix-wrapper { .ant-input-affix-wrapper {
position: relative;
display: inline-block;
width: 99%;
min-width: 0;
padding: 4px 8px; padding: 4px 8px;
color: rgba(0, 0, 0, 0.85);
font-size: 14px;
line-height: 1.5715;
background-color: #fff;
background-image: none;
border: 1px solid #d9d9d9;
border-radius: 8px; border-radius: 8px;
transition: all 0.3s;
display: inline-flex;
}
}
}
.in {
.ant-input-affix-wrapper {
position: relative;
display: inline-block;
width: 99%;
min-width: 0;
padding: 0px 8px;
color: rgba(0, 0, 0, 0.85);
font-size: 14px;
line-height: 1.5715;
background-color: #fff;
background-image: none;
border: 1px solid #d9d9d9;
border-radius: 8px;
transition: all 0.3s;
display: inline-flex;
} }
} }
.road {
.ant-input-affix-wrapper {
padding: 0px 8px;
border-radius: 8px;
}
}
.b_input, .b_input,
.i1_input { .i1_input {

View File

@@ -2,14 +2,14 @@
* @Author: lixg lixg@dongwu-inc.com * @Author: lixg lixg@dongwu-inc.com
* @Date: 2022-12-20 17:00:37 * @Date: 2022-12-20 17:00:37
* @LastEditors: lixg lixg@dongwu-inc.com * @LastEditors: lixg lixg@dongwu-inc.com
* @LastEditTime: 2022-12-21 17:54:18 * @LastEditTime: 2022-12-20 17:59:40
* @FilePath: /fe-manage/src/components/student/ChangeLevelModal.vue * @FilePath: /fe-manage/src/components/student/ChangeLevelModal.vue
* @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
--> -->
<template> <template>
<a-modal <a-modal
style="padding: 0" style="padding: 0"
:closable="sh" :closable="true"
:visible="visiblene" :visible="visiblene"
:footer="null" :footer="null"
centered="true" centered="true"
@@ -28,13 +28,11 @@
<!-- <div class="cur">当前关卡关卡2</div> --> <!-- <div class="cur">当前关卡关卡2</div> -->
<div class="select"> <div class="select">
<a-select <a-select
v-model:value="chapterSelect" v-model:value="selectStage"
style="width: 100%" style="width: 100%"
placeholder="请选择关卡" placeholder="请选择关卡"
:options="chapterList" :options="option"
@change="changeChapter"
allowClear allowClear
showSearch
></a-select> ></a-select>
</div> </div>
<div class="btn"> <div class="btn">
@@ -58,63 +56,47 @@
</div> </div>
</a-modal> </a-modal>
</template> </template>
<script> <script setup>
import { reactive, toRefs, onMounted } from "vue"; import {computed, defineEmits, defineProps, ref} from "vue";
import { message } from "ant-design-vue"; import {moveStudent} from "@/api/index1";
import { GetRouterDetail } from "../../api/indexTask"; import {message} from "ant-design-vue";
export default {
name: "ChangeLevelModal", const props = defineProps({
props: {
visiblene: { visiblene: {
type: Boolean, type: Boolean,
default: false, default: false,
}, },
id: String, stage: {
type: Array,
default: () => [],
}, },
setup(props, ctx) { ids: {
const state = reactive({ type: Array,
chapterList: [], default: () => [],
chapterSelect: null, //选择的关卡
chapterSelectId: null, //选择关卡的id
});
const closeChangeModal = () => {
ctx.emit("update:visiblene", false);
state.chapterSelect = null; //选择的关卡
state.chapterSelectId = null; //选择关卡的id
};
const changelevel = () => {
console.log("点击调整关卡");
};
//获取关卡列表
const getDetail = () => {
console.log("props.id", props.id);
GetRouterDetail(props.id)
.then((res) => {
//给level赋初始值
state.chapterList = res.data.data.chapterList;
//增加两个字段
state.chapterList.forEach((item) => {
item["value"] = item.chapterId;
item["label"] = item.name;
});
console.log("路径图详情", res);
})
.catch((err) => {
message.error(err);
});
};
const changeChapter = (e, v) => {
console.log("eeeeeeeeeee", e, v);
};
onMounted(() => {
getDetail();
});
return {
...toRefs(state),
closeChangeModal,
changelevel,
changeChapter,
};
}, },
});
const option = computed(() => {
return props.stage.map(e => ({label: e.name, value: e.id}))
})
const selectStage = ref()
const emit = defineEmits({})
const closeChangeModal = () => {
emit("update:visiblene", false);
}; };
const changelevel = () => {
if(!selectStage.value){
message.error("请选择关卡")
return
}
emit("update:visiblene", false);
emit('finash', false)
moveStudent({targetId: selectStage.value, ids: props.ids}).then(()=>{
emit('finash', true)
})
};
//获取关卡列表
</script> </script>

View File

@@ -63,13 +63,12 @@
批量删除 批量删除
</a-button> </a-button>
</a-col> </a-col>
<!-- <a-col :span="1.5" v-if="type === 2">
<a-col :span="1.5" v-if="type == 2">
<a-button class="cus-btn white" @click="showChangeModal"> <a-button class="cus-btn white" @click="showChangeModal">
<template #icon></template> <template #icon></template>
批量调整关卡 批量调整关卡
</a-button> </a-button>
</a-col>--> </a-col>
</a-row> </a-row>
<div style="margin-top: 20px"> <div style="margin-top: 20px">
<a-table <a-table
@@ -81,45 +80,12 @@
:row-selection="stuRowSelection" :row-selection="stuRowSelection"
> >
<template #action="{ record }"> <template #action="{ record }">
<div style="display: flex; justify-content: center">
<!-- <div v-if="type == 2"
@click="del(record.id)"
style="
color: #4ea6ff;
font-size: 14px;
text-align: center;
margin-left: 20px;
cursor: pointer;
"
>
查看
</div>
<div
@click="showChangeModal"
style="
color: #4ea6ff;
font-size: 14px;
text-align: center;
margin-left: 20px;
cursor: pointer;
"
>
调整
</div> -->
<div <div
@click="del(record.id)" @click="del(record.id)"
style=" style="color: #4ea6ff; font-size: 14px; text-align: center;margin-left: 20px;cursor: pointer;"
color: #4ea6ff;
font-size: 14px;
text-align: center;
margin-left: 20px;
cursor: pointer;
"
> >
删除 删除
</div> </div>
</div>
<!-- <a-row gutter="12"> <!-- <a-row gutter="12">
<a-col> <a-col>
<slot name="extension" v-bind:data="{ record }"></slot> <slot name="extension" v-bind:data="{ record }"></slot>
@@ -143,7 +109,7 @@
</div> </div>
</div> </div>
<!-- 批量调整关卡弹窗 --> <!-- 批量调整关卡弹窗 -->
<ChangeLevelModal v-model:visiblene="visiblene" :id="id" /> <ChangeLevelModal v-model:visiblene="visiblene" :stage="stage" :ids="stuSelectKeys" @finash="submitCall"/>
<!-- 批量调整关卡弹窗 --> <!-- 批量调整关卡弹窗 -->
</template> </template>
<script setup> <script setup>
@@ -151,7 +117,7 @@ import { computed, defineProps, onMounted, ref, watch } from "vue";
import { delStudentList, getStuPage } from "@/api/index1"; import { delStudentList, getStuPage } from "@/api/index1";
import CommonStudent from "@/components/student/CommonStudent"; import CommonStudent from "@/components/student/CommonStudent";
import ChangeLevelModal from "./ChangeLevelModal.vue"; import ChangeLevelModal from "./ChangeLevelModal.vue";
import { message } from "ant-design-vue"; import {message} from "ant-design-vue";
const props = defineProps({ const props = defineProps({
type: Number, type: Number,
id: String, id: String,
@@ -269,11 +235,12 @@ function getStuList() {
function reset() { function reset() {
tableParam.value.studentName=""; tableParam.value.studentName="";
getStuList();
} }
function bathDel() { function bathDel() {
if( stuSelectKeys.value && if( stuSelectKeys.value &&
stuSelectKeys.value.length == 0){ stuSelectKeys.value.length === 0){
message.destroy(); message.destroy();
return message.warning("请先选中学员"); return message.warning("请先选中学员");
} }
@@ -302,9 +269,13 @@ function submitCall(flag) {
// 调整关卡; // 调整关卡;
const visiblene = ref(false); const visiblene = ref(false);
//const showChangeModal = () => { const showChangeModal = () => {
// visiblene.value = true; if(!stuSelectKeys.value.length){
//}; message.error("请选择学员")
return
}
visiblene.value = true;
};
</script> </script>
<style> <style>
.studentopea1 { .studentopea1 {
@@ -339,5 +310,4 @@ const visiblene = ref(false);
height: 40px; height: 40px;
border-radius: 8px; border-radius: 8px;
} }
</style> </style>

View File

@@ -104,7 +104,7 @@
</div> </div>
<div class="select" > <div class="select" >
<a-range-picker <a-range-picker
show-time :show-time="{ format: 'HH:mm' }"
format="YYYY-MM-DD HH:mm" format="YYYY-MM-DD HH:mm"
style="width: 424px" style="width: 424px"
v-model:value="time" v-model:value="time"

View File

@@ -3281,11 +3281,11 @@ const columns7 = [
key: "5", key: "5",
align: "center", align: "center",
customRender: ({ record }) => { customRender: ({ record }) => {
switch (String(record.source)) { switch (String(record.status)) {
case "0": case "0":
return "待审核";
case "1":
return "审核通过"; return "审核通过";
case "1":
return "待审核";
case "2": case "2":
return "审核拒绝"; return "审核拒绝";
} }
@@ -3403,11 +3403,11 @@ export default defineComponent({
key: "5", key: "5",
align: "center", align: "center",
customRender: ({ record }) => { customRender: ({ record }) => {
switch (String(record.source)) { switch (String(record.status)) {
case "0": case "0":
return "待审核";
case "1":
return "审核通过"; return "审核通过";
case "1":
return "待审核";
case "2": case "2":
return "审核拒绝"; return "审核拒绝";
} }

View File

@@ -150,7 +150,7 @@
/> />
</div> </div>
<div class="inname">路径图名称</div> <div class="inname">路径图名称</div>
<div class="in"> <div class="in road">
<!-- <a-input--> <!-- <a-input-->
<!-- v-model:value="pathName"--> <!-- v-model:value="pathName"-->
<!-- maxlength="20"--> <!-- maxlength="20"-->

View File

@@ -425,19 +425,19 @@
</div> </div>
<div class="progress"> <div class="progress">
<div class="progresstext"> <div class="progresstext">
{{ item.complete ? item.complete : 0 }}/{{ {{ item.finishStuNum }}/{{
item.total ? item.total : 0 item.totalStuNum
}} }}
</div> </div>
<div style="display: flex"> <div style="display: flex">
<a-progress <a-progress
:showInfo="false" :showInfo="false"
:percent="item.percent" :percent="parseInt(item.finishStuNum / item.totalStuNum * 100)"
strokeColor="#FFC067" strokeColor="#FFC067"
trailColor="rgba(253, 209, 98, 0.2)" trailColor="rgba(253, 209, 98, 0.2)"
/> />
<span class="progresstext" style="margin-left: 10px" <span class="progresstext" style="margin-left: 10px"
>{{ item.percent ? item.percent : 0 }}%</span >{{ parseInt(item.finishStuNum / item.totalStuNum * 100) }}%</span
> >
</div> </div>
</div> </div>

View File

@@ -99,8 +99,8 @@
<div class="in"> <div class="in">
<a-range-picker <a-range-picker
show-time
separator="至" separator="至"
:show-time="{ format: 'HH:mm' }"
:placeholder="[' 开始时间', ' 结束时间']" :placeholder="[' 开始时间', ' 结束时间']"
v-model:value="projectInfo.rangeTime" v-model:value="projectInfo.rangeTime"
style="width: 100%; height: 40px; border-radius: 5px" style="width: 100%; height: 40px; border-radius: 5px"
@@ -503,13 +503,8 @@ export default {
}; };
function managerChange(e, l, d, t) { function managerChange(e, l, d, t) {
if (routers.query.parentId) { state.projectInfo.sourceBelongId = d
return; state.projectInfo.sourceBelongName = t
}
!state.projectInfo.sourceBelongId &&
(state.projectInfo.sourceBelongId = d);
!state.projectInfo.sourceBelongName &&
(state.projectInfo.sourceBelongName = t);
} }
return { return {

View File

@@ -36,7 +36,7 @@
</div> </div>
<div class="select"> <div class="select">
<a-select <a-select
v-model:value="searchParam.status" v-model:value="searchParam.searchStatus"
style="width: 270px" style="width: 270px"
placeholder="请选择状态" placeholder="请选择状态"
:options="sProjectStateList" :options="sProjectStateList"
@@ -46,7 +46,7 @@
<div class="select addTimeBox"> <div class="select addTimeBox">
<div class="addTime">创建时间</div> <div class="addTime">创建时间</div>
<a-range-picker <a-range-picker
show-time :show-time="{ format: 'HH:mm' }"
v-model:value="searchParam.valueDate" v-model:value="searchParam.valueDate"
format="YYYY-MM-DD" format="YYYY-MM-DD"
style="border-radius: 8px; height: 40px; margin-left: 5px" style="border-radius: 8px; height: 40px; margin-left: 5px"
@@ -78,7 +78,7 @@
<a-table <a-table
:columns="columns" :columns="columns"
:data-source="tableData" :data-source="tableData"
:loading="tableDataTotal === -1 ? true : false" :loading="tableLoading"
:scroll="{ x: 700 }" :scroll="{ x: 700 }"
@expand="expandTable" @expand="expandTable"
:pagination="false" :pagination="false"
@@ -109,13 +109,13 @@
style="background: linear-gradient(180deg, #ddeaff, #f0f8fe)" style="background: linear-gradient(180deg, #ddeaff, #f0f8fe)"
> >
<div class="leftt"> <div class="leftt">
<img src="../../assets/images/taskpage/left2.png" /> <img src="../../assets/images/taskpage/left2.png"/>
</div> </div>
<div class="photo"> <div class="photo">
<img src="../../assets/images/projectadd/nopro.png" /> <img src="../../assets/images/projectadd/nopro.png"/>
</div> </div>
<div class="rightt"> <div class="rightt">
<img src="../../assets/images/taskpage/right2.png" /> <img src="../../assets/images/taskpage/right2.png"/>
</div> </div>
<div class="centerbox" style="color: rgba(78, 166, 255, 1)"> <div class="centerbox" style="color: rgba(78, 166, 255, 1)">
创建项目 创建项目
@@ -283,13 +283,13 @@
" "
> >
<div class="leftt"> <div class="leftt">
<img src="../../assets/images/taskpage/left2.png" /> <img src="../../assets/images/taskpage/left2.png"/>
</div> </div>
<div class="photo"> <div class="photo">
<img src="../../assets/images/taskpage/picture4.png" /> <img src="../../assets/images/taskpage/picture4.png"/>
</div> </div>
<div class="rightt"> <div class="rightt">
<img src="../../assets/images/taskpage/right2.png" /> <img src="../../assets/images/taskpage/right2.png"/>
</div> </div>
<div class="centerbox" style="color: rgba(78, 166, 255, 1)"> <div class="centerbox" style="color: rgba(78, 166, 255, 1)">
单层子项目 单层子项目
@@ -303,13 +303,13 @@
" "
> >
<div class="leftt"> <div class="leftt">
<img src="../../assets/images/taskpage/left1.png" /> <img src="../../assets/images/taskpage/left1.png"/>
</div> </div>
<div class="photo"> <div class="photo">
<img src="../../assets/images/taskpage/picture5.png" /> <img src="../../assets/images/taskpage/picture5.png"/>
</div> </div>
<div class="rightt"> <div class="rightt">
<img src="../../assets/images/taskpage/right1.png" /> <img src="../../assets/images/taskpage/right1.png"/>
</div> </div>
<div class="centerbox" style="color: rgba(255, 182, 78, 1)"> <div class="centerbox" style="color: rgba(255, 182, 78, 1)">
多层子项目 多层子项目
@@ -370,13 +370,13 @@
" "
> >
<div class="leftt"> <div class="leftt">
<img src="../../assets/images/taskpage/left2.png" /> <img src="../../assets/images/taskpage/left2.png"/>
</div> </div>
<div class="photo"> <div class="photo">
<img src="../../assets/images/taskpage/picture6.png" /> <img src="../../assets/images/taskpage/picture6.png"/>
</div> </div>
<div class="rightt"> <div class="rightt">
<img src="../../assets/images/taskpage/right2.png" /> <img src="../../assets/images/taskpage/right2.png"/>
</div> </div>
<div class="centerbox" style="color: rgba(78, 166, 255, 1)"> <div class="centerbox" style="color: rgba(78, 166, 255, 1)">
单层{{ projectInfo.parentId ? "子" : "" }}项目 单层{{ projectInfo.parentId ? "子" : "" }}项目
@@ -395,13 +395,13 @@
" "
> >
<div class="leftt"> <div class="leftt">
<img src="../../assets/images/taskpage/left3.png" /> <img src="../../assets/images/taskpage/left3.png"/>
</div> </div>
<div class="photo"> <div class="photo">
<img src="../../assets/images/taskpage/picture7.png" /> <img src="../../assets/images/taskpage/picture7.png"/>
</div> </div>
<div class="rightt"> <div class="rightt">
<img src="../../assets/images/taskpage/right3.png" /> <img src="../../assets/images/taskpage/right3.png"/>
</div> </div>
<div class="centerbox1" style="color: rgba(93, 201, 136, 1)"> <div class="centerbox1" style="color: rgba(93, 201, 136, 1)">
多层{{ projectInfo.parentId ? "子" : "" }}项目 多层{{ projectInfo.parentId ? "子" : "" }}项目
@@ -623,7 +623,7 @@
class="aeLoading" class="aeLoading"
:style="{ display: projectPubLoading ? 'flex' : 'none' }" :style="{ display: projectPubLoading ? 'flex' : 'none' }"
> >
<a-spin :spinning="projectPubLoading" /> <a-spin :spinning="projectPubLoading"/>
</div> </div>
</a-modal> </a-modal>
<!-- 撤回路径弹窗 --> <!-- 撤回路径弹窗 -->
@@ -810,24 +810,24 @@
</div> </div>
</template> </template>
<script> <script>
import { reactive, toRefs, ref, watch } from "vue"; import {reactive, toRefs, ref, watch} from "vue";
import { message, Modal } from "ant-design-vue"; import {message, Modal} from "ant-design-vue";
import { useRouter } from "vue-router"; import {useRouter} from "vue-router";
import ProjOwnerShip from "../../components/drawers/ProjectOwn"; import ProjOwnerShip from "../../components/drawers/ProjectOwn";
import ProjPowerList from "../../components/drawers/ProjPowerList"; import ProjPowerList from "../../components/drawers/ProjPowerList";
import ProjCheckShip from "../../components/drawers/ProjCheckPower"; import ProjCheckShip from "../../components/drawers/ProjCheckPower";
import * as api from "../../api/index"; import * as api from "../../api/index";
import * as api1 from "../../api/index1"; import * as api1 from "../../api/index1";
import { storage } from "../../api/storage"; import {storage} from "../../api/storage";
import ProjectManager from "@/components/project/ProjectManagerNew"; import ProjectManager from "@/components/project/ProjectManagerNew";
// import ProjectClass from "@/components/project/ProjectClass"; // import ProjectClass from "@/components/project/ProjectClass";
import TrainClass from "@/components/project/TrainClass"; import TrainClass from "@/components/project/TrainClass";
import OrgClass from "@/components/project/OrgClass"; import OrgClass from "@/components/project/OrgClass";
import dayjs from "dayjs"; import dayjs from "dayjs";
import * as moment from "moment"; import * as moment from "moment";
import { changeOwnership } from "@/api/method"; import {changeOwnership} from "@/api/method";
import NameInput from "@/components/project/NameInput"; import NameInput from "@/components/project/NameInput";
import { validateName } from "@/api/index1"; import {validateName} from "@/api/index1";
//import { toDate } from "../../api/method"; //import { toDate } from "../../api/method";
export default { export default {
@@ -845,6 +845,7 @@ export default {
}, },
setup() { setup() {
const state = reactive({ const state = reactive({
tableLoading:false,
projectName: null, projectName: null,
selectTime: null, selectTime: null,
sonproject: false, sonproject: false,
@@ -917,15 +918,12 @@ export default {
// 数据接入 - start - // 数据接入 - start -
const router = useRouter(); const router = useRouter();
const sProjectStateList = ref([ const sProjectStateList = ref([
{ value: 0, label: "草稿" }, {value: 0, label: "草稿"},
{ value: 1, label: "审核中" }, {value: 1, label: "进行中"},
{ value: 2, label: "审核通过" }, {value: 2, label: "已结束"},
{ value: 3, label: "已发布" },
{ value: -5, label: "未通过" },
{ value: -1, label: "已结束" },
]); ]);
const searchReset = () => { const searchReset = () => {
state.searchParam = { pageNo: 1, pageSize: 10 }; state.searchParam = {pageNo: 1, pageSize: 10};
getTableDate(); getTableDate();
}; };
const searchSubmit = () => { const searchSubmit = () => {
@@ -991,7 +989,7 @@ export default {
state.currentPage = 1; state.currentPage = 1;
state.projectInfo.projectId || state.projectInfo.projectId ||
changeOwnership("project", res.data.data.projectId, [ changeOwnership("project", res.data.data.projectId, [
{ id: res.data.data.createId, name: res.data.data.createName }, {id: res.data.data.createId, name: res.data.data.createName},
]); ]);
getTableDate(); getTableDate();
}); });
@@ -1049,7 +1047,7 @@ export default {
//获取学员总数 //获取学员总数
api.projectStudentCount({ api.projectStudentCount({
pid: object.projectId, pid: object.projectId,
type:1 type: 1
}).then((res) => { }).then((res) => {
state.projectStudentsNum = res.data.data state.projectStudentsNum = res.data.data
state.projectPubLoading = false; state.projectPubLoading = false;
@@ -1209,7 +1207,7 @@ export default {
message.success("模版保存成功"); message.success("模版保存成功");
return; return;
} }
Modal.error({ title: res.data.msg }); Modal.error({title: res.data.msg});
}); });
}; };
//关闭存为模版弹窗 //关闭存为模版弹窗
@@ -1345,12 +1343,7 @@ export default {
0: () => "草稿", 0: () => "草稿",
1: () => "草稿", 1: () => "草稿",
2: () => "草稿", 2: () => "草稿",
3: () => 3: () => "进行中",
dayjs().isBefore(value.record.beginTime)
? "未开始"
: "进行中",
4: () =>
dayjs().isBefore(value.record.end) ? "进行中" : "已结束",
"-1": () => "已结束", "-1": () => "已结束",
"-5": () => "草稿", "-5": () => "草稿",
}[value.record.status + ""]() || "" }[value.record.status + ""]() || ""
@@ -1661,7 +1654,7 @@ export default {
onClick={() => { onClick={() => {
router.push({ router.push({
path: "/taskpage", path: "/taskpage",
query: { projectId: value.record.projectId }, query: {projectId: value.record.projectId},
}); });
storage.set("projectId", value.record.projectId); storage.set("projectId", value.record.projectId);
}} }}
@@ -1679,9 +1672,9 @@ export default {
}, },
}, },
]); ]);
const getTableDate = () => const getTableDate = () =>{
api state.tableLoading = true
.getProjectList({ api.getProjectList({
...state.searchParam, ...state.searchParam,
beginTime: beginTime:
state.searchParam.valueDate && state.searchParam.valueDate &&
@@ -1698,12 +1691,15 @@ export default {
.then((res) => { .then((res) => {
// console.log("搜索", res, state.searchParam); // console.log("搜索", res, state.searchParam);
state.tableDataTotal = Number(res.data.data.total); state.tableDataTotal = Number(res.data.data.total);
state.tableLoading = false
const data = res.data.data.rows; const data = res.data.data.rows;
initDataSublist("", data); initDataSublist("", data);
console.log(data); console.log(data);
tableData.value = data; tableData.value = data;
console.log("tableData", tableData); console.log("tableData", tableData);
}); });
}
function initDataSublist(parentName, data) { function initDataSublist(parentName, data) {
if (data && data.length) { if (data && data.length) {
@@ -1804,14 +1800,8 @@ export default {
); );
function managerChange(e, l, d, t) { function managerChange(e, l, d, t) {
if (state.projectInfo.parentId) { state.projectInfo.sourceBelongId = d
return; state.projectInfo.sourceBelongName = t
}
!state.projectInfo.sourceBelongId &&
(state.projectInfo.sourceBelongId = d);
!state.projectInfo.sourceBelongName &&
(state.projectInfo.sourceBelongName = t);
} }
return { return {
@@ -1875,7 +1865,7 @@ export default {
okReminderModal, okReminderModal,
}; };
}, },
}; };
</script> </script>
<style lang="scss"> <style lang="scss">
.projectManage { .projectManage {

View File

@@ -89,7 +89,7 @@
<div class="in"> <div class="in">
<a-range-picker <a-range-picker
show-time :show-time="{ format: 'HH:mm' }"
separator="至" separator="至"
:placeholder="[' 开始时间', ' 结束时间']" :placeholder="[' 开始时间', ' 结束时间']"
v-model:value="projectInfo.rangeTime" v-model:value="projectInfo.rangeTime"
@@ -387,10 +387,8 @@ export default {
}; };
function managerChange(e, l, d, t) { function managerChange(e, l, d, t) {
!state.projectInfo.sourceBelongId && state.projectInfo.sourceBelongId = d
(state.projectInfo.sourceBelongId = d); state.projectInfo.sourceBelongName = t
!state.projectInfo.sourceBelongName &&
(state.projectInfo.sourceBelongName = t);
} }
return { return {

View File

@@ -6,7 +6,7 @@
<div class="tagname">问答题</div> <div class="tagname">问答题</div>
<div class="deleteop" @click="handleTypesDel(3)"> <div class="deleteop" @click="handleTypesDel(3)">
<div><img src="../../../assets/images/projectadd/delete.png" /></div> <div><img src="../../../assets/images/projectadd/delete.png" /></div>
<div class="del_text">删除选项</div> <div class="del_text">删除题目</div>
</div> </div>
</div> </div>
<div class="name"> <div class="name">

View File

@@ -17,6 +17,7 @@
</div> </div>
<div class="delete" @click="handleDel">删除</div> <div class="delete" @click="handleDel">删除</div>
</div> </div>
<!--
<div class="name uploadContent"> <div class="name uploadContent">
<a-upload <a-upload
v-show="!curItem.imgVal" v-show="!curItem.imgVal"
@@ -43,6 +44,7 @@
/> />
</div> </div>
</div> </div>
-->
</div> </div>
</template> </template>
<script> <script>

View File

@@ -6,7 +6,7 @@
<div class="tagname">多选题</div> <div class="tagname">多选题</div>
<div class="deleteop" @click="handleTypesDel(2)"> <div class="deleteop" @click="handleTypesDel(2)">
<div><img src="../../../assets/images/projectadd/delete.png" /></div> <div><img src="../../../assets/images/projectadd/delete.png" /></div>
<div class="del_text">删除选项</div> <div class="del_text">删除题目</div>
</div> </div>
</div> </div>
<div class="name"> <div class="name">

View File

@@ -6,7 +6,7 @@
<div class="tagname">评分题</div> <div class="tagname">评分题</div>
<div class="deleteop" @click="handleTypesDel(4)"> <div class="deleteop" @click="handleTypesDel(4)">
<div><img src="../../../assets/images/projectadd/delete.png" /></div> <div><img src="../../../assets/images/projectadd/delete.png" /></div>
<div class="del_text">删除选项</div> <div class="del_text">删除题目</div>
</div> </div>
</div> </div>
<div class="name"> <div class="name">

View File

@@ -6,7 +6,7 @@
<div class="tagname">单选题</div> <div class="tagname">单选题</div>
<div class="deleteop" @click="handleTypesDel(1)"> <div class="deleteop" @click="handleTypesDel(1)">
<div><img src="../../../assets/images/projectadd/delete.png" /></div> <div><img src="../../../assets/images/projectadd/delete.png" /></div>
<div class="del_text">删除选项</div> <div class="del_text">删除题目</div>
</div> </div>
</div> </div>
<div class="name"> <div class="name">

View File

@@ -2,14 +2,14 @@
* @Author: lixg lixg@dongwu-inc.com * @Author: lixg lixg@dongwu-inc.com
* @Date: 2022-11-21 14:32:52 * @Date: 2022-11-21 14:32:52
* @LastEditors: lixg lixg@dongwu-inc.com * @LastEditors: lixg lixg@dongwu-inc.com
* @LastEditTime: 2022-11-21 15:15:30 * @LastEditTime: 2022-12-14 17:38:38
* @FilePath: /fe-manage/vue.config.js * @FilePath: /fe-manage/vue.config.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
*/ */
const {defineConfig} = require("@vue/cli-service"); const { defineConfig } = require("@vue/cli-service");
module.exports = defineConfig({ module.exports = defineConfig({
publicPath: "/manage", publicPath: "/manage-release",
// transpileDependencies: true, // transpileDependencies: true,
devServer: { devServer: {
port: 8080, port: 8080,