This commit is contained in:
Pengxiansen
2025-02-25 19:35:24 +08:00
parent a6f5212a8a
commit 353458e050
23 changed files with 1984 additions and 1800 deletions

View File

@@ -1,6 +1,7 @@
NODE_ENV=boe NODE_ENV=boe
VUE_APP_BASE=/manage VUE_APP_BASE=/manage
VUE_APP_BASE_API=/manageApi VUE_APP_BASE_API=/manageApi
# 专业力必修API前缀
VUE_APP_BASE_API_GROWTH=/growth VUE_APP_BASE_API_GROWTH=/growth
VUE_APP_LOGIN_URL=//u-pre.boe.com/web?returnUrl= VUE_APP_LOGIN_URL=//u-pre.boe.com/web?returnUrl=
VUE_APP_BOE_API_URL=//u-pre.boe.com VUE_APP_BOE_API_URL=//u-pre.boe.com

View File

@@ -9,195 +9,197 @@
title="添加活动" title="添加活动"
placement="right" placement="right"
> >
<div class="drawerMain" v-if="visible"> <a-spin :spinning="spinning">
<div class="header"> <div class="drawerMain" v-if="visible">
<div class="headerTitle">{{ formData.id ? "编辑" : "添加" }}活动</div> <div class="header">
<img <div class="headerTitle">{{ formData.id ? "编辑" : "添加" }}活动</div>
style="width: 29px; height: 29px; cursor: pointer" <img
src="../../assets/images/basicinfo/close.png" style="width: 29px; height: 29px; cursor: pointer"
@click="closeDrawer" src="../../assets/images/basicinfo/close.png"
/> @click="closeDrawer"
</div> />
<div class="contentMain"> </div>
<div class="main_left"> <div class="contentMain">
<div class="main_item"> <div class="main_left">
<div class="signbox"> <div class="main_item">
<div class="sign"> <div class="signbox">
<img <div class="sign">
src="@/assets/images/coursewareManage/asterisk.png" <img
alt="" src="@/assets/images/coursewareManage/asterisk.png"
alt=""
/>
</div>
<span style="margin-right: 3px">活动名称</span>
</div>
<div class="btnbox">
<a-input
v-model:value="formData.info.activityName"
style="width: 400px; height: 40px; border-radius: 8px"
placeholder="请输入活动名称"
maxlength="20"
/> />
</div> </div>
<span style="margin-right: 3px">活动名称</span>
</div> </div>
<div class="btnbox">
<a-input
v-model:value="formData.info.activityName"
style="width: 400px; height: 40px; border-radius: 8px"
placeholder="请输入活动名称"
maxlength="20"
/>
</div>
</div>
<div class="main_item"> <div class="main_item">
<div class="signbox"> <div class="signbox">
<div class="sign"> <div class="sign">
<img <img
src="@/assets/images/coursewareManage/asterisk.png" src="@/assets/images/coursewareManage/asterisk.png"
alt="" alt=""
/>
</div>
<span style="margin-right: 3px">活动时间</span>
</div>
<div class="btnbox">
<a-range-picker
:show-time="{ format: 'HH:mm' }"
format="YYYY-MM-DD HH:mm"
style="width: 400px; height: 40px; border-radius: 8px"
v-model:value="dateTime"
@change="timeChange"
:placeholder="[' 开始时间', ' 结束时间']"
/>
</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-number
:min="0"
:max="999999"
:precision="0"
style="width: 400px; height: 40px; border-radius: 8px"
:placeholder="durationText"
v-model:value="formData.info.activityDuration"
/>
<span style="color: #999999; margin-left: 8px">分钟</span>
</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="formData.info.activityAddress"
style="width: 400px; height: 40px; border-radius: 8px"
placeholder="请输入活动地点"
maxlength="100"
/>
</div>
</div>
<div class="main_item2">
<div class="signbox">
<div class="sign">
<img
src="@/assets/images/coursewareManage/asterisk.png"
alt=""
/>
</div>
<span style="margin-right: 3px">活动公告</span>
</div>
<div class="textarea">
<a-textarea
v-model:value="formData.info.activityNotice"
placeholder="请输入活动公告"
allow-clear
:rows="6"
show-count
:maxlength="200"
/>
</div>
</div>
<div class="main_item2">
<div class="signbox">
<span style="margin-right: 3px">活动说明</span>
</div>
<div class="textarea">
<a-textarea
v-model:value="formData.info.activityExplain"
placeholder="请输入活动说明"
allow-clear
:rows="6"
show-count
:maxlength="200"
/>
</div>
</div>
<div class="main_item2">
<div class="signbox">
<span style="margin-right: 3px">考勤设置</span>
</div>
<div class="kqszbox">
<div class="qdqtbox">
<div class="qdbtn">
<div class="btntext">签到</div>
</div>
</div>
<div class="setbox">
<div class="timerbox">
<span>活动开始前</span>
<a-input-number
:min="0"
:max="999999"
:precision="0"
style="
width: 88px;
height: 32px;
border-radius: 8px;
overflow: hidden;
"
v-model:value="formData.info.beforeSignIn"
/> />
<span style="color: #999999; margin-left: 8px"
>分钟允许签到</span
>
</div> </div>
<div class="timerbox"> <span style="margin-right: 3px">活动时间</span>
<span>活动开始后</span> </div>
<a-input-number <div class="btnbox">
:min="0" <a-range-picker
:max="999999" :show-time="{ format: 'HH:mm' }"
:precision="0" format="YYYY-MM-DD HH:mm"
style=" style="width: 400px; height: 40px; border-radius: 8px"
width: 88px; v-model:value="dateTime"
height: 32px; @change="timeChange"
border-radius: 8px; :placeholder="[' 开始时间', ' 结束时间']"
overflow: hidden; />
" </div>
v-model:value="formData.info.afterSignIn" </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-number
:min="0"
:max="999999"
:precision="0"
style="width: 400px; height: 40px; border-radius: 8px"
:placeholder="durationText"
v-model:value="formData.info.activityDuration"
/>
<span style="color: #999999; margin-left: 8px">分钟</span>
</div>
</div>
<div class="main_item">
<div class="signbox">
<div class="sign">
<img
src="@/assets/images/coursewareManage/asterisk.png"
alt=""
/> />
<span style="color: #999999; margin-left: 8px" </div>
>分钟允许签到</span <span style="margin-right: 3px">活动地点</span>
> </div>
<div class="btnbox">
<a-input
v-model:value="formData.info.activityAddress"
style="width: 400px; height: 40px; border-radius: 8px"
placeholder="请输入活动地点"
maxlength="100"
/>
</div>
</div>
<div class="main_item2">
<div class="signbox">
<div class="sign">
<img
src="@/assets/images/coursewareManage/asterisk.png"
alt=""
/>
</div>
<span style="margin-right: 3px">活动公告</span>
</div>
<div class="textarea">
<a-textarea
v-model:value="formData.info.activityNotice"
placeholder="请输入活动公告"
allow-clear
:rows="6"
show-count
:maxlength="200"
/>
</div>
</div>
<div class="main_item2">
<div class="signbox">
<span style="margin-right: 3px">活动说明</span>
</div>
<div class="textarea">
<a-textarea
v-model:value="formData.info.activityExplain"
placeholder="请输入活动说明"
allow-clear
:rows="6"
show-count
:maxlength="200"
/>
</div>
</div>
<div class="main_item2">
<div class="signbox">
<span style="margin-right: 3px">考勤设置</span>
</div>
<div class="kqszbox">
<div class="qdqtbox">
<div class="qdbtn">
<div class="btntext">签到</div>
</div>
</div>
<div class="setbox">
<div class="timerbox">
<span>活动开始前</span>
<a-input-number
:min="0"
:max="999999"
:precision="0"
style="
width: 88px;
height: 32px;
border-radius: 8px;
overflow: hidden;
"
v-model:value="formData.info.beforeSignIn"
/>
<span style="color: #999999; margin-left: 8px"
>分钟允许签到</span
>
</div>
<div class="timerbox">
<span>活动开始后</span>
<a-input-number
:min="0"
:max="999999"
:precision="0"
style="
width: 88px;
height: 32px;
border-radius: 8px;
overflow: hidden;
"
v-model:value="formData.info.afterSignIn"
/>
<span style="color: #999999; margin-left: 8px"
>分钟允许签到</span
>
</div>
</div> </div>
</div> </div>
</div> </div>
</div> <div class="main_item" style="height: 40px">
<div class="main_item" style="height: 40px"> <div class="signbox">
<div class="signbox"> <span style="margin-right: 3px"></span>
<span style="margin-right: 3px"></span> </div>
<div class="btnbox"></div>
</div> </div>
<div class="btnbox"></div>
</div> </div>
</div> </div>
<div class="main_btns">
<button class="btn2" @click="closeDrawer">取消</button>
<button class="btn2" @click="confirm">确定</button>
</div>
</div> </div>
<div class="main_btns"> </a-spin>
<button class="btn2" @click="closeDrawer">取消</button>
<button class="btn2" @click="confirm">确定</button>
</div>
</div>
</a-drawer> </a-drawer>
</template> </template>
<script setup> <script setup>
@@ -300,7 +302,7 @@ function timeChange(time, timeStr) {
const disabledDate = (current) => { const disabledDate = (current) => {
return current && current < dayjs().startOf("day"); return current && current < dayjs().startOf("day");
}; };
const spinning = ref(false);
async function confirm() { async function confirm() {
// debugger // debugger
await validate().catch(({ errorFields }) => { await validate().catch(({ errorFields }) => {
@@ -326,24 +328,30 @@ async function confirm() {
} else { } else {
formData.value.duration = formData.value.info.activityDuration; formData.value.duration = formData.value.info.activityDuration;
} }
saveTask(formData.value).then((res) => { spinning.value = true;
if (res.data.code == 200) { saveTask(formData.value)
if (formData.value.id) { .then((res) => {
message.success("编辑成功"); if (res.data.code == 200) {
if (formData.value.id) {
message.success("编辑成功");
} else {
message.success("添加成功");
}
emit("refresh");
} else { } else {
message.success("添加成功"); message.error(res.msg);
} }
emit("refresh"); closeDrawer();
} else { })
message.error(res.msg); .finally(() => {
} spinning.value = false;
closeDrawer(); });
});
return; return;
} }
function openDrawer(row) { function openDrawer(row) {
row && (formData.value = reactive(row)); row && (row = JSON.parse(JSON.stringify(row)));
row && (formData.value = row);
row && row &&
(dateTime.value = [ (dateTime.value = [
dayjs(row.info.activityStartTime, "YYYY-MM-DD HH:mm"), dayjs(row.info.activityStartTime, "YYYY-MM-DD HH:mm"),

View File

@@ -139,10 +139,10 @@
</div> </div>
</div> </div>
</div> </div>
<div class="btnn"> <!-- <div class="btnn">
<button class="btn1" @click="closeDrawer">取消</button> <button class="btn1" @click="closeDrawer">取消</button>
<button class="btn2" @click="closeDrawer">确定</button> <button class="btn2" @click="closeDrawer">确定</button>
</div> </div> -->
</div> </div>
</a-drawer> </a-drawer>
<!-- 批量签到弹窗 --> <!-- 批量签到弹窗 -->

View File

@@ -9,80 +9,82 @@
title="添加案例" title="添加案例"
placement="right" placement="right"
> >
<div class="drawerMain"> <a-spin :spinning="spinning">
<div class="header"> <div class="drawerMain">
<div v-if="taskIndex >= 0" class="headerTitle">编辑案例</div> <div class="header">
<div v-else class="headerTitle">添加案例</div> <div v-if="taskIndex >= 0" class="headerTitle">编辑案例</div>
<img <div v-else class="headerTitle">添加案例</div>
style="width: 29px; height: 29px; cursor: pointer" <img
src="../../assets/images/basicinfo/close.png" style="width: 29px; height: 29px; cursor: pointer"
@click="closeDrawer" src="../../assets/images/basicinfo/close.png"
/> @click="closeDrawer"
</div> />
<div class="contentMain">
<div class="main_items">
<div class="mi_ipts">
<div class="mii_ipt">
<div class="ipt_name"></div>
<div class="fi_input">
<a-input
v-model:value="params.keyWord"
style="
width: 200px;
height: 40px;
border-radius: 8px;
margin-right: 24px;
"
placeholder="请输入案例标题"
/>
</div>
<div class="fi_input">
<a-input
v-model:value="params.authorName"
style="width: 200px; height: 40px; border-radius: 8px"
placeholder="请输入作者名字"
/>
</div>
</div>
</div>
<div class="mi_btns">
<div class="btn btn1" @click="search">
<div class="search"></div>
<div class="btnText">搜索</div>
</div>
<div class="btn btn2" @click="reset">
<div class="search"></div>
<div class="btnText">重置</div>
</div>
</div>
</div> </div>
<div class="main_table"> <div class="contentMain">
<a-table <div class="main_items">
class="ant-table-striped" <div class="mi_ipts">
:row-class-name=" <div class="mii_ipt">
(_, index) => (index % 2 === 1 ? 'table-striped' : null) <div class="ipt_name"></div>
" <div class="fi_input">
row-key="id" <a-input
:columns="columns" v-model:value="params.keyWord"
:data-source="data" style="
:loading="loading" width: 200px;
:pagination="pagination" height: 40px;
> border-radius: 8px;
<template #bodyCell="{ column, record }"> margin-right: 24px;
<template v-if="column.dataIndex === 'select'"> "
<a placeholder="请输入案例标题"
:style="{ />
color: selectedRows?.taskId == record.id ? '#999' : null, </div>
}" <div class="fi_input">
@click="confirm(record)" <a-input
>选择</a v-model:value="params.authorName"
> style="width: 200px; height: 40px; border-radius: 8px"
placeholder="请输入作者名字"
/>
</div>
</div>
</div>
<div class="mi_btns">
<div class="btn btn1" @click="search">
<div class="search"></div>
<div class="btnText">搜索</div>
</div>
<div class="btn btn2" @click="reset">
<div class="search"></div>
<div class="btnText">重置</div>
</div>
</div>
</div>
<div class="main_table">
<a-table
class="ant-table-striped"
:row-class-name="
(_, index) => (index % 2 === 1 ? 'table-striped' : null)
"
row-key="id"
:columns="columns"
:data-source="data"
:loading="loading"
:pagination="pagination"
>
<template #bodyCell="{ column, record }">
<template v-if="column.dataIndex === 'select'">
<a
:style="{
color: selectedRows?.taskId == record.id ? '#999' : null,
}"
@click="confirm(record)"
>选择</a
>
</template>
</template> </template>
</template> </a-table>
</a-table> </div>
</div> </div>
</div> </div>
</div> </a-spin>
</a-drawer> </a-drawer>
</template> </template>
<script setup> <script setup>
@@ -157,7 +159,7 @@ function search() {
} }
function reset() { function reset() {
params.reset() params.reset();
fetch(); fetch();
} }
@@ -167,29 +169,43 @@ const closeDrawer = () => {
reset(); reset();
}; };
const spinning = ref(false);
function confirm(row) { function confirm(row) {
dialog({ dialog({
content: "确定选择该案例吗", content: "确定选择该案例吗",
ok: async () => { ok: async () => {
// 新增 // 新增
spinning.value = true;
if (!selectedRows?.value?.id) { if (!selectedRows?.value?.id) {
await saveTask({ saveTask({
growthId: props.growId, growthId: props.growId,
taskName: row.title, taskName: row.title,
taskType: props.type, taskType: props.type,
taskId: row.id, taskId: row.id,
type: props.activeKey, type: props.activeKey,
}); })
message.success("添加成功"); .then((res) => {
message.success("添加成功");
closeDrawer();
emit("refresh");
})
.finally(() => {
spinning.value = false;
});
} else { } else {
// 编辑 // 编辑
selectedRows.value.taskName = row.title; selectedRows.value.taskName = row.title;
selectedRows.value.taskId = row.id; selectedRows.value.taskId = row.id;
await saveTask(selectedRows.value); saveTask(selectedRows.value)
message.success("编辑成功"); .then((res) => {
message.success("编辑成功");
closeDrawer();
emit("refresh");
})
.finally(() => {
spinning.value = false;
});
} }
closeDrawer();
emit("refresh");
}, },
}); });
} }

View File

@@ -1,23 +1,65 @@
<!-- eslint-disable vue/no-parsing-error --> <!-- eslint-disable vue/no-parsing-error -->
<!-- eslint-disable vue/require-v-for-key --> <!-- eslint-disable vue/require-v-for-key -->
<template> <template>
<div class="CommonStudent"> <a-spin :spinning="spinning">
<div class="drawer-content" style=""> <div class="CommonStudent">
<div class="tabs" style="min-width: 800px"> <div class="drawer-content" style="">
<a-tabs v-model:activeKey="activeKey"> <div class="tabs" style="min-width: 800px">
<template v-if="type == 2"> <a-tabs v-model:activeKey="activeKey">
<a-tab-pane :key="2" tab="项目内学员"> <template v-if="type == 2">
<a-tab-pane :key="2" tab="项目内学员">
<div :style="{ height: screenHeight - 235 + 'px' }">
<div>
<a-form-item label="姓名:">
<a-input
v-model:value="projectParams.userNickName"
style="width: 260px; height: 40px; border-radius: 8px"
placeholder="请输入姓名"
/>
<a-button
type="primary"
@click="getProjectStu"
style="margin-left: 20px; border-radius: 4px"
>
<template #icon>
<SearchOutlined />
</template>
搜索
</a-button>
<a-button
type="primary"
@click="resetProjectStu"
style="margin-left: 20px; border-radius: 4px"
>重置
</a-button>
</a-form-item>
</div>
<div class="tableBox tabb">
<BaseTable
ref="projectStuTableRef"
:columns="projectStuColumns"
:url="GROWTH_STUDENT_LIST"
v-model:params="projectParams"
v-model:selectedRows="projectSelectRows"
:request="growthRequest"
type="checkbox"
></BaseTable>
</div>
</div>
</a-tab-pane>
</template>
<a-tab-pane :key="1" tab="快速选人">
<div :style="{ height: screenHeight - 235 + 'px' }"> <div :style="{ height: screenHeight - 235 + 'px' }">
<div> <div class="tab1">
<a-form-item label="姓名"> <a-form-item label="姓名">
<a-input <a-input
v-model:value="projectParams.userNickName" v-model:value="nameSearch.keyword"
style="width: 260px; height: 40px; border-radius: 8px" style="width: 270px; height: 40px; border-radius: 8px"
placeholder="请输入姓名" placeholder="请输入姓名"
/> />
<a-button <a-button
type="primary" type="primary"
@click="getProjectStu" @click="onSearchStu"
style="margin-left: 20px; border-radius: 4px" style="margin-left: 20px; border-radius: 4px"
> >
<template #icon> <template #icon>
@@ -27,181 +69,151 @@
</a-button> </a-button>
<a-button <a-button
type="primary" type="primary"
@click="resetProjectStu" @click="resetStu"
style="margin-left: 20px; border-radius: 4px" style="margin-left: 20px; border-radius: 4px"
>重置 >重置
</a-button> </a-button>
</a-form-item> </a-form-item>
</div> </div>
<div class="tableBox tabb"> <div
<BaseTable class="chooseLeft"
ref="projectStuTableRef" style="display: grid; grid-template-columns: 250px auto"
:columns="projectStuColumns" >
:url="GROWTH_STUDENT_LIST" <a-spin :spinning="treeSpin">
v-model:params="projectParams" <div
v-model:selectedRows="projectSelectRows" style="border: 1px solid #f0f0f0"
:request="growthRequest" :style="{
type="checkbox" height: screenHeight - 180 + 'px',
></BaseTable> overflowY: 'auto',
}"
>
<a-input-search
v-model:value="nameSearch.departName"
placeholder="请输入部门名称"
@search="getOrgList"
allowClear
/>
<div
class="tree"
style="margin: 10px 4px 0 10px"
v-if="!treeSpin"
>
<a-tree
allow-clear
tree-default-expand-all
:tree-data="treeData"
:load-data="onLoadData"
v-model:selectedKeys="stuTreeSelectKeys"
v-model:expandedKeys="stuTreeExpandedKeys"
:fieldNames="{
children: 'treeChildList',
key: 'id',
title: 'name',
value: 'name',
}"
@select="stuStuOrgSelect"
>
</a-tree>
</div>
</div>
</a-spin>
<div
class="tableBox tabb"
style="margin: 0px 4px 0 10px; border: 1px solid #f0f0f0"
>
<BaseTable
ref="stuTableRef"
:columns="stuColumns"
:url="USER_LIST_PAGE"
pageKey="pageNo"
v-model:params="nameSearch"
:request="useNewRowsPageNoInit"
v-model:selectedRows="stuSelectRows"
type="checkbox"
></BaseTable>
</div>
</div> </div>
</div> </div>
</a-tab-pane> </a-tab-pane>
</template> </a-tabs>
<a-tab-pane :key="1" tab="快速选人">
<div :style="{ height: screenHeight - 235 + 'px' }">
<div class="tab1">
<a-form-item label="姓名">
<a-input
v-model:value="nameSearch.keyword"
style="width: 270px; height: 40px; border-radius: 8px"
placeholder="请输入姓名"
/>
<a-button
type="primary"
@click="onSearchStu"
style="margin-left: 20px; border-radius: 4px"
>
<template #icon>
<SearchOutlined />
</template>
搜索
</a-button>
<a-button
type="primary"
@click="resetStu"
style="margin-left: 20px; border-radius: 4px"
>重置
</a-button>
</a-form-item>
</div>
<div
class="chooseLeft"
style="display: grid; grid-template-columns: 250px auto"
>
<a-spin :spinning="treeSpin">
<div
style="border: 1px solid #f0f0f0"
:style="{
height: screenHeight - 180 + 'px',
overflowY: 'auto',
}"
>
<a-input-search
v-model:value="nameSearch.departName"
placeholder="请输入部门名称"
@search="getOrgList"
allowClear
/>
<div class="tree" style="margin: 10px 4px 0 10px" v-if="!treeSpin">
<a-tree
allow-clear
tree-default-expand-all
:tree-data="treeData"
:load-data="onLoadData"
v-model:selectedKeys="stuTreeSelectKeys"
v-model:expandedKeys="stuTreeExpandedKeys"
:fieldNames="{
children: 'treeChildList',
key: 'id',
title: 'name',
value: 'name',
}"
@select="stuStuOrgSelect"
>
</a-tree>
</div>
</div>
</a-spin>
<div
class="tableBox tabb"
style="margin: 0px 4px 0 10px; border: 1px solid #f0f0f0"
>
<BaseTable
ref="stuTableRef"
:columns="stuColumns"
:url="USER_LIST_PAGE"
pageKey="pageNo"
v-model:params="nameSearch"
:request="useNewRowsPageNoInit"
v-model:selectedRows="stuSelectRows"
type="checkbox"
></BaseTable>
</div>
</div>
</div>
</a-tab-pane>
</a-tabs>
</div>
<div class="right1" style="min-width: 200px">
<div class="onerow">
<div class="onleft">
<div class="already">已选</div>
</div>
</div> </div>
<div <div class="right1" style="min-width: 200px">
:style="{ 'max-height': screenHeight - 235 + 'px' }" <div class="onerow">
style="overflow-y: auto; padding-bottom: 10px" <div class="onleft">
> <div class="already">已选</div>
<div class="selecteds" v-if="type == 2"> </div>
<div class="person">项目内学员</div> </div>
<div v-for="(item, i) in projectSelectRows" :key="i"> <div
<div v-if="i < 11"> :style="{ 'max-height': screenHeight - 235 + 'px' }"
<div class="chose"> style="overflow-y: auto; padding-bottom: 10px"
{{ item.userNickName }} >
<div class="ch" @click="projectStuTableRef.remove(i)"></div> <div class="selecteds" v-if="type == 2">
</div> <div class="person">项目内学员</div>
</div> <div v-for="(item, i) in projectSelectRows" :key="i">
<div v-else> <div v-if="i < 11">
<div v-if="person">
<div class="chose"> <div class="chose">
{{ item.userNickName }} {{ item.userNickName }}
<div class="ch" @click="projectStuTableRef.remove(i)"></div> <div class="ch" @click="projectStuTableRef.remove(i)"></div>
</div> </div>
</div> </div>
</div> <div v-else>
</div> <div v-if="person">
<div v-if="!member && projectSelectRows?.length > 10" class="ifsw"> <div class="chose">
<div @click="member = !member" class="“sw”">查看更多></div> {{ item.userNickName }}
</div> <div
<div v-if="member && projectSelectRows?.length > 10" class="ifsw"> class="ch"
<div @click="member = !member" class="sw">收起&lt;</div> @click="projectStuTableRef.remove(i)"
</div> ></div>
</div> </div>
<div class="selecteds"> </div>
<div class="person">快速选人</div>
<div v-for="(item, i) in stuSelectRows" :key="i">
<div v-if="i < 11">
<div class="chose">
{{ item.realName }}
<div class="ch" @click="stuTableRef.remove(i)"></div>
</div> </div>
</div> </div>
<div v-else> <div
<div v-if="person"> v-if="!member && projectSelectRows?.length > 10"
class="ifsw"
>
<div @click="member = !member" class="“sw”">查看更多></div>
</div>
<div v-if="member && projectSelectRows?.length > 10" class="ifsw">
<div @click="member = !member" class="sw">收起&lt;</div>
</div>
</div>
<div class="selecteds">
<div class="person">快速选人</div>
<div v-for="(item, i) in stuSelectRows" :key="i">
<div v-if="i < 11">
<div class="chose"> <div class="chose">
{{ item.realName }} {{ item.realName }}
<div class="ch" @click="stuTableRef.remove(i)"></div> <div class="ch" @click="stuTableRef.remove(i)"></div>
</div> </div>
</div> </div>
<div v-else>
<div v-if="person">
<div class="chose">
{{ item.realName }}
<div class="ch" @click="stuTableRef.remove(i)"></div>
</div>
</div>
</div>
</div>
<div v-if="!person && stuSelectRows.length > 10" class="ifsw">
<div @click="person = !person" class="“sw”">查看更多></div>
</div>
<div v-if="person && stuSelectRows.length > 10" class="ifsw">
<div @click="person = !person" class="sw">收起&lt;</div>
</div> </div>
</div>
<div v-if="!person && stuSelectRows.length > 10" class="ifsw">
<div @click="person = !person" class="“sw”">查看更多></div>
</div>
<div v-if="person && stuSelectRows.length > 10" class="ifsw">
<div @click="person = !person" class="sw">收起&lt;</div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<div class="btnn">
<button class="btn2" @click="closeDrawer">取消</button>
<button class="btn2" @click="confirm">确定</button>
</div>
</div> </div>
<div class="btnn"> </a-spin>
<button class="btn2" @click="closeDrawer">取消</button>
<button class="btn2" @click="confirm">确定</button>
</div>
</div>
</template> </template>
<script setup> <script setup>
import { message } from "ant-design-vue"; import { message } from "ant-design-vue";
@@ -232,7 +244,12 @@ const props = defineProps({
type: [String, Number], type: [String, Number],
default: 1, default: 1,
}, },
autoClose: {
type: Boolean,
default: true,
},
}); });
const spinning = ref(false)
const projectStuTableRef = ref(null); const projectStuTableRef = ref(null);
// 项目内学员获取列表 // 项目内学员获取列表
const getProjectStu = () => projectStuTableRef.value.fetch(); const getProjectStu = () => projectStuTableRef.value.fetch();
@@ -394,7 +411,9 @@ const confirm = () => {
} }
visiable.value = false; visiable.value = false;
emit("confirm", stuSelectRows.value, projectSelectRows.value); emit("confirm", stuSelectRows.value, projectSelectRows.value);
closeDrawer(); if (props.autoClose) {
closeDrawer();
}
}; };
onMounted(() => { onMounted(() => {
@@ -410,6 +429,10 @@ onMounted(() => {
stuTableRef.value && stuTableRef.value.reset({ keyword: "", departId: "" }); stuTableRef.value && stuTableRef.value.reset({ keyword: "", departId: "" });
} }
}); });
defineExpose({
spinning
})
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.CommonStudent > .ant-drawer-content-wrapper { .CommonStudent > .ant-drawer-content-wrapper {

View File

@@ -8,77 +8,79 @@
width="800" width="800"
placement="right" placement="right"
> >
<div class="drawerMain"> <a-spin :spinning="spinning">
<div class="header"> <div class="drawerMain">
<div class="headerTitle">{{ formData.id ? "编辑" : "添加" }}讨论</div> <div class="header">
<img <div class="headerTitle">{{ formData.id ? "编辑" : "添加" }}讨论</div>
style="width: 29px; height: 29px; cursor: pointer" <img
src="../../assets/images/basicinfo/close.png" style="width: 29px; height: 29px; cursor: pointer"
@click="closeDrawer" src="../../assets/images/basicinfo/close.png"
/> @click="closeDrawer"
</div> />
<div class="contentMain"> </div>
<div class="main_left"> <div class="contentMain">
<div class="main_item"> <div class="main_left">
<div class="signbox"> <div class="main_item">
<div class="sign"> <div class="signbox">
<img <div class="sign">
src="@/assets/images/coursewareManage/asterisk.png" <img
alt="" src="@/assets/images/coursewareManage/asterisk.png"
alt=""
/>
</div>
<span style="margin-right: 3px">讨论名称</span>
</div>
<div class="btnbox">
<a-input
v-model:value="formData.info.discussName"
style="width: 424px; height: 32px"
placeholder="请输入讨论名称"
show-count
:maxlength="20"
/> />
</div> </div>
<span style="margin-right: 3px">讨论名称</span>
</div> </div>
<div class="btnbox"> <div class="main_item2">
<a-input <div class="signbox">
v-model:value="formData.info.discussName" <div class="sign">
style="width: 424px; height: 32px" <img
placeholder="请输入讨论名称" src="@/assets/images/coursewareManage/asterisk.png"
show-count alt=""
:maxlength="20" />
/> </div>
</div> <span style="margin-right: 3px">讨论说明</span>
</div> </div>
<div class="main_item2"> <div class="textarea">
<div class="signbox"> <a-textarea
<div class="sign"> v-model:value="formData.info.discussExplain"
<img placeholder="请输入讨论说明"
src="@/assets/images/coursewareManage/asterisk.png" allow-clear
alt="" :rows="6"
show-count
:maxlength="200"
/> />
</div> </div>
<span style="margin-right: 3px">讨论说明</span>
</div> </div>
<div class="textarea"> <div class="main_item">
<a-textarea <div class="signbox">
v-model:value="formData.info.discussExplain" <span style="margin-right: 3px">讨论设置</span>
placeholder="请输入讨论说明" </div>
allow-clear <div class="btnbox">
:rows="6" <a-checkbox
show-count v-model:checked="formData.info.discussSettings"
:maxlength="200" @click="discussSettings"
/> >允许评论</a-checkbox
</div> >
</div> </div>
<div class="main_item">
<div class="signbox">
<span style="margin-right: 3px">讨论设置</span>
</div>
<div class="btnbox">
<a-checkbox
v-model:checked="formData.info.discussSettings"
@click="discussSettings"
>允许评论</a-checkbox
>
</div> </div>
</div> </div>
</div> </div>
<div class="main_btns">
<button class="btn2" @click="closeDrawer">取消</button>
<button class="btn2" @click="confirm">确定</button>
</div>
</div> </div>
<div class="main_btns"> </a-spin>
<button class="btn2" @click="closeDrawer">取消</button>
<button class="btn2" @click="confirm">确定</button>
</div>
</div>
</a-drawer> </a-drawer>
</template> </template>
<script setup> <script setup>
@@ -130,7 +132,7 @@ const closeDrawer = () => {
}, },
}; };
}; };
const spinning = ref(false);
async function confirm() { async function confirm() {
await validate().catch(({ errorFields }) => { await validate().catch(({ errorFields }) => {
message.warning(errorFields[0].errors.join()); message.warning(errorFields[0].errors.join());
@@ -144,22 +146,28 @@ async function confirm() {
formData.value.type = props.activeKey; formData.value.type = props.activeKey;
// 任务名称 // 任务名称
formData.value.taskName = formData.value.info.discussName; formData.value.taskName = formData.value.info.discussName;
saveTask(formData.value).then((res) => { spinning.value = true;
if (res.data.code == 200) { saveTask(formData.value)
if (formData.value.id) { .then((res) => {
message.success("编辑成功"); if (res.data.code == 200) {
if (formData.value.id) {
message.success("编辑成功");
} else {
message.success("添加成功");
}
emit("refresh");
} else { } else {
message.success("添加成功"); message.error(res.msg);
} }
emit("refresh"); closeDrawer();
} else { })
message.error(res.msg); .finally(() => {
} spinning.value = false;
closeDrawer(); });
});
} }
function openDrawer(row) { function openDrawer(row) {
row && (row = JSON.parse(JSON.stringify(row)));
row && (formData.value = row); row && (formData.value = row);
row && row &&
(formData.value.info.discussSettings = (formData.value.info.discussSettings =

View File

@@ -6,19 +6,21 @@
destroyOnClose destroyOnClose
:width="width" :width="width"
> >
<div class="drawerMain" style=""> <a-spin :spinning="spinning">
<div class="header"> <div class="drawerMain" style="">
<div class="headerTitle"> <div class="header">
{{ { 1: "添加学员", 2: "添加学员", 3: "添加学员" }[type] || title }} <div class="headerTitle">
{{ { 1: "添加学员", 2: "添加学员", 3: "添加学员" }[type] || title }}
</div>
<img
style="width: 29px; height: 29px; cursor: pointer"
src="../../assets/images/basicinfo/close.png"
@click="closeDrawer"
/>
</div> </div>
<img <slot></slot>
style="width: 29px; height: 29px; cursor: pointer"
src="../../assets/images/basicinfo/close.png"
@click="closeDrawer"
/>
</div> </div>
<slot></slot> </a-spin>
</div>
</a-drawer> </a-drawer>
</template> </template>
<script setup> <script setup>
@@ -35,7 +37,7 @@ const props = defineProps({
}, },
}); });
const visiable = ref(false); const visiable = ref(false);
const spinning = ref(false);
const openDrawer = () => { const openDrawer = () => {
visiable.value = true; visiable.value = true;
}; };
@@ -45,5 +47,6 @@ const closeDrawer = () => {
defineExpose({ defineExpose({
openDrawer, openDrawer,
closeDrawer, closeDrawer,
spinning
}); });
</script> </script>

View File

@@ -10,116 +10,118 @@
placement="right" placement="right"
destroyOnClose destroyOnClose
> >
<div class="drawerMain"> <a-spin :spinning="spinning">
<div class="header"> <div class="drawerMain">
<div class="headerTitle"> <div class="header">
{{ title }} <div class="headerTitle">
{{ title }}
</div>
<img
style="width: 29px; height: 29px; cursor: pointer"
src="../../assets/images/basicinfo/close.png"
@click="closeDrawer"
/>
</div> </div>
<img <template v-if="step == 1">
style="width: 29px; height: 29px; cursor: pointer" <div class="contentMain">
src="../../assets/images/basicinfo/close.png" <div class="main_left">
@click="closeDrawer" <div class="main_item">
/> <div class="signbox">
</div> <div class="sign">
<template v-if="step == 1"> <img
<div class="contentMain"> src="@/assets/images/coursewareManage/asterisk.png"
<div class="main_left"> alt=""
<div class="main_item"> />
<div class="signbox"> </div>
<div class="sign"> <span style="margin-right: 3px">测评名称</span>
<img </div>
src="@/assets/images/coursewareManage/asterisk.png" <div class="btnbox">
alt="" <a-input
v-model:value="formData.info.evaluationName"
style="width: 400px; height: 40px; border-radius: 8px"
placeholder="请输入测评名称"
show-count
:maxlength="20"
/> />
</div> </div>
<span style="margin-right: 3px">测评名称</span>
</div> </div>
<div class="btnbox"> <div class="main_item">
<a-input <div class="signbox">
v-model:value="formData.info.evaluationName" <div class="sign">
style="width: 400px; height: 40px; border-radius: 8px" <img
placeholder="请输入测评名称" src="@/assets/images/coursewareManage/asterisk.png"
show-count alt=""
:maxlength="20" />
/> </div>
</div> <span style="margin-right: 3px">测评</span>
</div>
<div class="main_item">
<div class="signbox">
<div class="sign">
<img
src="@/assets/images/coursewareManage/asterisk.png"
alt=""
/>
</div> </div>
<span style="margin-right: 3px">测评</span> <div class="btnbox" @click="selectEval">
</div> <button class="checkEval">
<div class="btnbox" @click="selectEval"> {{ formData.info.evaluationTypeName ? "修改" : "选择" }}测评
<button class="checkEval"> </button>
{{ formData.info.evaluationTypeName ? "修改" : "选择" }}测评
</button>
<div <div
v-if="formData.info.evaluationTypeName" v-if="formData.info.evaluationTypeName"
style="margin-left: 20px" style="margin-left: 20px"
> >
<a-tag closable @close="delTag" color="processing"> <a-tag closable @close="delTag" color="processing">
<span style="font-size: 14px; line-height: 33px">{{ <span style="font-size: 14px; line-height: 33px">{{
formData.info.evaluationTypeName formData.info.evaluationTypeName
}}</span> }}</span>
</a-tag> </a-tag>
</div>
</div> </div>
</div> </div>
</div> <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> </div>
<div class="btnbox">
<a-range-picker
:show-time="{ format: 'HH:mm' }"
style="width: 400px; height: 40px; border-radius: 8px"
v-model:value="dateTime"
format="YYYY-MM-DD HH:mm"
valueFormat="YYYY-MM-DD HH:mm"
@change="timeChange"
:placeholder="[' 开始时间', ' 结束时间']"
/>
</div>
</div> </div>
<div class="btnbox"> <div class="main_item2">
<a-range-picker <div class="signbox">
:show-time="{ format: 'HH:mm' }" <span style="margin-right: 3px">测评说明</span>
style="width: 400px; height: 40px; border-radius: 8px" </div>
v-model:value="dateTime" <div class="textarea">
format="YYYY-MM-DD HH:mm" <a-textarea
valueFormat="YYYY-MM-DD HH:mm" show-count
@change="timeChange" :maxlength="200"
:placeholder="[' 开始时间', ' 结束时间']" v-model:value="formData.info.evaluationExplain"
/> placeholder="请输入测评说明"
</div> style="width: 400px"
</div> allowClear
<div class="main_item2"> :rows="6"
<div class="signbox"> />
<span style="margin-right: 3px">测评说明</span> </div>
</div>
<div class="textarea">
<a-textarea
show-count
:maxlength="200"
v-model:value="formData.info.evaluationExplain"
placeholder="请输入测评说明"
style="width: 400px"
allowClear
:rows="6"
/>
</div> </div>
</div> </div>
</div> </div>
</div> <div class="main_btns">
<div class="main_btns"> <button class="btn2" @click="closeDrawer">取消</button>
<button class="btn2" @click="closeDrawer">取消</button> <button class="btn2" @click="confirm">确定</button>
<button class="btn2" @click="confirm">确定</button> </div>
</div> </template>
</template>
<div v-show="step == 2"> <div v-show="step == 2">
<EvList <EvList
:selectId="formData.info.evaluationTypeId" :selectId="formData.info.evaluationTypeId"
ref="EvListRef" ref="EvListRef"
@confirm="selectEvalConfirm" @confirm="selectEvalConfirm"
> >
</EvList> </EvList>
</div>
</div> </div>
</div> </a-spin>
</a-drawer> </a-drawer>
</template> </template>
<script setup> <script setup>
@@ -239,6 +241,7 @@ function delTag() {
} }
// 验证方法 // 验证方法
let validate = null; let validate = null;
const spinning = ref(false);
async function confirm() { async function confirm() {
await validate().catch(({ errorFields }) => { await validate().catch(({ errorFields }) => {
message.warning(errorFields[0].errors.join()); message.warning(errorFields[0].errors.join());
@@ -252,22 +255,28 @@ async function confirm() {
formData.value.type = props.activeKey; formData.value.type = props.activeKey;
// 任务名称 // 任务名称
formData.value.taskName = formData.value.info.evaluationName; formData.value.taskName = formData.value.info.evaluationName;
saveTask(formData.value).then((res) => { spinning.value = true;
if (res.data.code == 200) { saveTask(formData.value)
if (formData.value.id) { .then((res) => {
message.success("编辑成功"); if (res.data.code == 200) {
if (formData.value.id) {
message.success("编辑成功");
} else {
message.success("添加成功");
}
emit("refresh");
} else { } else {
message.success("添加成功"); message.error(res.msg);
} }
emit("refresh"); closeDrawer();
} else { })
message.error(res.msg); .finally(() => {
} spinning.value = false;
closeDrawer(); });
});
} }
function openDrawer(row) { function openDrawer(row) {
row && (row = JSON.parse(JSON.stringify(row)));
row && (formData.value = row); row && (formData.value = row);
if (row && row.info.evaluationEndTime) { if (row && row.info.evaluationEndTime) {
dateTime.value = [ dateTime.value = [

View File

@@ -9,102 +9,105 @@
placement="right" placement="right"
destroyOnClose destroyOnClose
> >
<div class="drawerMain"> <a-spin :spinning="spinning">
<div class="header"> <div class="drawerMain">
<div class="headerTitle"> <div class="header">
{{ title }} <div class="headerTitle">
</div> {{ title }}
<img
style="width: 29px; height: 29px; cursor: pointer"
src="../../assets/images/basicinfo/close.png"
@click="closeDrawer"
/>
</div>
<template v-if="step == 1">
<div
style="
display: flex;
flex-direction: row;
padding-top: 0px;
margin-top: 20px;
margin-left: 32px;
"
>
<div>
<button
v-show="formData.info.examType === 1 || !formData.id"
@click="changeExamType(1)"
style="width: 100px; cursor: pointer"
:class="formData.info.examType === 1 ? 'outer' : 'notOuter'"
>
系统考试
</button>
<button
v-show="formData.info.examType === 2 || !formData.id"
@click="changeExamType(2)"
style="width: 100px; cursor: pointer"
:class="formData.info.examType === 2 ? 'outer' : 'notOuter'"
>
外部考试
</button>
</div> </div>
<img
style="width: 29px; height: 29px; cursor: pointer"
src="../../assets/images/basicinfo/close.png"
@click="closeDrawer"
/>
</div> </div>
<template v-if="step == 1">
<div v-if="formData.info.examType === 1" class="contentMain"> <div
<div class="main_left"> style="
<div class="main_item"> display: flex;
<div class="signbox"> flex-direction: row;
<div class="sign"> padding-top: 0px;
<img margin-top: 20px;
src="@/assets/images/coursewareManage/asterisk.png" margin-left: 32px;
alt="" "
/> >
</div> <div>
<span style="margin-right: 3px">考试名称</span> <button
</div> v-show="formData.info.examType === 1 || !formData.id"
<div class="btnbox"> @click="changeExamType(1)"
<a-input style="width: 100px; cursor: pointer"
v-model:value="formData.info.examinationName" :class="formData.info.examType === 1 ? 'outer' : 'notOuter'"
style="width: 400px; height: 40px; border-radius: 8px" >
placeholder="请输入考试名称" 系统考试
:maxlength="20" </button>
showCount <button
/> v-show="formData.info.examType === 2 || !formData.id"
</div> @click="changeExamType(2)"
style="width: 100px; cursor: pointer"
:class="formData.info.examType === 2 ? 'outer' : 'notOuter'"
>
外部考试
</button>
</div> </div>
</div>
<div class="main_item"> <div v-if="formData.info.examType === 1" class="contentMain">
<div class="signbox"> <div class="main_left">
<div class="sign"> <div class="main_item">
<img <div class="signbox">
src="@/assets/images/coursewareManage/asterisk.png" <div class="sign">
alt="" <img
src="@/assets/images/coursewareManage/asterisk.png"
alt=""
/>
</div>
<span style="margin-right: 3px">考试名称</span>
</div>
<div class="btnbox">
<a-input
v-model:value="formData.info.examinationName"
style="width: 400px; height: 40px; border-radius: 8px"
placeholder="请输入考试名称"
:maxlength="20"
showCount
/> />
</div> </div>
<span style="margin-right: 3px">选择试卷</span>
</div> </div>
<div v-if="formData.info.examinationPaperId"> <div class="main_item">
<a-tag <div class="signbox">
closable <div class="sign">
color="processing" <img
@close="delTag" src="@/assets/images/coursewareManage/asterisk.png"
:closeIcon="true" alt=""
> />
<span style="font-size: 14px; line-height: 33px">{{ </div>
formData.info.examinationTestName <span style="margin-right: 3px">选择试卷</span>
}}</span>
</a-tag>
</div>
<template v-if="!formData.id">
<div class="btnbox" @click="selectTest">
<button class="xkbtn" style="margin: 0">
{{ formData.info.examinationPaperId ? "重选" : "选择" }}试卷
</button>
</div> </div>
</template>
<!-- <GrowthSelectTest <div v-if="formData.info.examinationPaperId">
<a-tag
closable
color="processing"
@close="delTag"
:closeIcon="true"
>
<span style="font-size: 14px; line-height: 33px">{{
formData.info.examinationTestName
}}</span>
</a-tag>
</div>
<template v-if="!formData.id">
<div class="btnbox" @click="selectTest">
<button class="xkbtn" style="margin: 0">
{{
formData.info.examinationPaperId ? "重选" : "选择"
}}试卷
</button>
</div>
</template>
<!-- <GrowthSelectTest
v-if="taskIndex < 0 || (taskIndex >= 0 && isEdit == false)" v-if="taskIndex < 0 || (taskIndex >= 0 && isEdit == false)"
v-model:id="formData.examinationPaperId" v-model:id="formData.examinationPaperId"
v-model:name="formData.examinationTestName" v-model:name="formData.examinationTestName"
@@ -115,269 +118,270 @@
</button> </button>
</div> </div>
</GrowthSelectTest> --> </GrowthSelectTest> -->
</div> </div>
<div class="main_item"> <div class="main_item">
<div class="signbox"> <div class="signbox">
<div class="sign"> <div class="sign">
<img <img
src="@/assets/images/coursewareManage/asterisk.png" src="@/assets/images/coursewareManage/asterisk.png"
alt="" alt=""
/>
</div>
<span style="margin-right: 3px">考试时间</span>
</div>
<div class="btnbox">
<a-range-picker
style="width: 400px; height: 40px; border-radius: 8px"
:show-time="{ format: 'hh:mm' }"
format="YYYY-MM-DD HH:mm"
valueFormat="YYYY-MM-DD HH:mm"
v-model:value="dateTime"
@change="timeChange"
:placeholder="[' 开始时间', ' 结束时间']"
/> />
</div> </div>
<span style="margin-right: 3px">考试时间</span>
</div> </div>
<div class="btnbox"> <div class="main_item">
<a-range-picker <div class="signbox">
style="width: 400px; height: 40px; border-radius: 8px" <div class="sign">
:show-time="{ format: 'hh:mm' }" <img
format="YYYY-MM-DD HH:mm" src="@/assets/images/coursewareManage/asterisk.png"
valueFormat="YYYY-MM-DD HH:mm" alt=""
v-model:value="dateTime" />
@change="timeChange" </div>
:placeholder="[' 开始时间', ' 结束时间']" <span style="margin-right: 3px">考试时长</span>
/>
</div>
</div>
<div class="main_item">
<div class="signbox">
<div class="sign">
<img
src="@/assets/images/coursewareManage/asterisk.png"
alt=""
/>
</div> </div>
<span style="margin-right: 3px">考试时长</span> <div class="select">
</div> <a-input-number
<div class="select"> :min="0"
<a-input-number :disabled="formData.id"
:min="0" :max="999999"
:disabled="formData.id" :precision="0"
:max="999999" style="width: 400px; height: 40px; border-radius: 8px"
:precision="0" v-model:value="formData.info.examinationDuration"
style="width: 400px; height: 40px; border-radius: 8px" ></a-input-number>
v-model:value="formData.info.examinationDuration" <span style="color: #999999; margin-left: 8px">分钟</span>
></a-input-number>
<span style="color: #999999; margin-left: 8px">分钟</span>
</div>
</div>
<div class="main_item">
<div class="signbox">
<div class="sign">
<img
src="@/assets/images/coursewareManage/asterisk.png"
alt=""
/>
</div> </div>
<span style="margin-right: 3px">及格线</span>
</div> </div>
<div class="btnbox"> <div class="main_item">
<a-input-number <div class="signbox">
min="0" <div class="sign">
:disabled="formData.id" <img
v-model:value="formData.info.passLine" src="@/assets/images/coursewareManage/asterisk.png"
style="width: 400px; height: 40px; border-radius: 8px" alt=""
/> />
</div>
<span style="margin-right: 3px">及格线</span>
</div>
<div class="btnbox">
<a-input-number
min="0"
:disabled="formData.id"
v-model:value="formData.info.passLine"
style="width: 400px; height: 40px; border-radius: 8px"
/>
<span style="color: #999999; margin-left: 8px"></span> <span style="color: #999999; margin-left: 8px"></span>
</div>
</div> </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> </div>
<div class="textarea">
<a-textarea
:disabled="formData.id"
v-model:value="formData.info.examinationExplain"
placeholder="请输入考试说明"
show-count
:maxlength="200"
:rows="6"
/>
</div>
</div> </div>
<div class="textarea"> <div class="main_item2">
<a-textarea <div class="signbox">
:disabled="formData.id" <span style="margin-right: 3px; margin-top: 10px"
v-model:value="formData.info.examinationExplain" >考试限制</span
placeholder="请输入考试说明" >
show-count </div>
:maxlength="200" <div class="kqszbox">
:rows="6" <div class="setbox">
/> <div class="timerbox">
</div> <span>允许重复考试</span>
</div> <a-input-number
<div class="main_item2"> :min="-1"
<div class="signbox"> :disabled="formData.id"
<span style="margin-right: 3px; margin-top: 10px" :max="999999"
>考试限制</span :precision="0"
> style="
</div> width: 100px;
<div class="kqszbox"> height: 32px;
<div class="setbox"> border-radius: 8px;
<div class="timerbox"> overflow: hidden;
<span>允许重复考试</span> "
<a-input-number v-model:value="formData.info.examinationLimit"
:min="-1" ></a-input-number>
:disabled="formData.id" <span style="color: #999999; margin-left: 8px"
:max="999999" >,-1表示无限制</span
:precision="0" >
style=" </div>
width: 100px;
height: 32px;
border-radius: 8px;
overflow: hidden;
"
v-model:value="formData.info.examinationLimit"
></a-input-number>
<span style="color: #999999; margin-left: 8px"
>,-1表示无限制</span
>
</div> </div>
</div> </div>
</div> </div>
</div>
<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>
</div>
<div class="btnbox">
<a-radio-group
style="margin-right: 12px"
v-model:value="formData.info.showAnswers"
:disabled="formData.id"
>
<a-radio :value="'1'">允许查看</a-radio>
<a-radio :value="'2'">不允许查看</a-radio>
</a-radio-group>
</div>
</div> </div>
<div class="btnbox"> <div class="main_item">
<a-radio-group <div class="signbox">
style="margin-right: 12px" <span style="margin-right: 3px">显示解析</span>
v-model:value="formData.info.showAnswers" </div>
:disabled="formData.id" <div class="btnbox">
> <a-radio-group
<a-radio :value="'1'">允许查看</a-radio> style="margin-right: 12px"
<a-radio :value="'2'">不允许查看</a-radio> :disabled="formData.id"
</a-radio-group> v-model:value="formData.info.showAnalysis"
>
<a-radio :value="'1'">允许查看</a-radio>
<a-radio :value="'2'">不允许查看</a-radio>
</a-radio-group>
</div>
</div> </div>
</div> <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> </div>
<div class="btnbox">
<a-radio-group
style="margin-right: 12px"
:disabled="formData.id"
v-model:value="formData.info.scoringModel"
>
<a-radio :value="'1'">最高一次</a-radio>
<a-radio :value="'2'">最后一次</a-radio>
</a-radio-group>
</div>
</div> </div>
<div class="btnbox">
<a-radio-group
style="margin-right: 12px"
:disabled="formData.id"
v-model:value="formData.info.showAnalysis"
>
<a-radio :value="'1'">允许查看</a-radio>
<a-radio :value="'2'">不允许查看</a-radio>
</a-radio-group>
</div>
</div>
<div class="main_item">
<div class="signbox">
<span style="margin-right: 3px">评分模式</span>
</div>
<div class="btnbox">
<a-radio-group
style="margin-right: 12px"
:disabled="formData.id"
v-model:value="formData.info.scoringModel"
>
<a-radio :value="'1'">最高一次</a-radio>
<a-radio :value="'2'">最后一次</a-radio>
</a-radio-group>
</div>
</div>
<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>
</div> </div>
<div class="btnbox"> <div class="btnbox">
<a-radio-group <a-radio-group
style="margin-right: 12px" style="margin-right: 12px"
:disabled="formData.id" :disabled="formData.id"
v-model:value="formData.info.questionArrangement" v-model:value="formData.info.questionArrangement"
> >
<a-radio :value="'1'">试题乱序</a-radio> <a-radio :value="'1'">试题乱序</a-radio>
<a-radio :value="'2'">选项乱序</a-radio> <a-radio :value="'2'">选项乱序</a-radio>
<a-radio :value="'3'">全部乱序</a-radio> <a-radio :value="'3'">全部乱序</a-radio>
<a-radio :value="'4'">不乱序</a-radio> <a-radio :value="'4'">不乱序</a-radio>
</a-radio-group> </a-radio-group>
</div>
</div> </div>
<div class="main_item" style="height: 20px"></div>
</div> </div>
<div class="main_item" style="height: 20px"></div>
</div> </div>
</div> <div v-else class="contentMain">
<div v-else class="contentMain"> <div class="main_left">
<div class="main_left"> <div class="main_item">
<div class="main_item"> <div class="signbox">
<div class="signbox"> <div class="sign">
<div class="sign"> <img
<img src="@/assets/images/coursewareManage/asterisk.png"
src="@/assets/images/coursewareManage/asterisk.png" alt=""
alt="" />
</div>
<span style="margin-right: 3px">考试名称</span>
</div>
<div class="btnbox">
<a-input
v-model:value="formData.info.examinationName"
style="width: 400px; height: 40px; border-radius: 8px"
placeholder="请输入考试名称"
:maxlength="20"
showCount
/> />
</div> </div>
<span style="margin-right: 3px">考试名称</span>
</div> </div>
<div class="btnbox"> <div class="main_item">
<a-input <div class="signbox">
v-model:value="formData.info.examinationName" <div class="sign">
style="width: 400px; height: 40px; border-radius: 8px" <img
placeholder="请输入考试名称" src="@/assets/images/coursewareManage/asterisk.png"
:maxlength="20" alt=""
showCount />
/> </div>
</div> <span style="margin-right: 3px">数据来源</span>
</div> </div>
<div class="main_item"> <div class="btnbox">
<div class="signbox"> <a-input
<div class="sign"> v-model:value="formData.info.source"
<img style="width: 400px; height: 40px; border-radius: 8px"
src="@/assets/images/coursewareManage/asterisk.png" placeholder="请输入数据来源"
alt="" show-count
:maxlength="420"
/> />
</div> </div>
<span style="margin-right: 3px">数据来源</span>
</div> </div>
<div class="btnbox"> <div class="main_item2">
<a-input <div class="signbox">
v-model:value="formData.info.source" <span style="margin-right: 3px">考试说明</span>
style="width: 400px; height: 40px; border-radius: 8px" </div>
placeholder="请输入数据来源" <div class="textarea">
show-count <a-textarea
:maxlength="420" v-model:value="formData.info.examinationExplain"
/> placeholder="请输入考试说明"
</div> show-count
</div> :maxlength="200"
<div class="main_item2"> :rows="6"
<div class="signbox"> />
<span style="margin-right: 3px">考试说明</span> </div>
</div>
<div class="textarea">
<a-textarea
v-model:value="formData.info.examinationExplain"
placeholder="请输入考试说明"
show-count
:maxlength="200"
:rows="6"
/>
</div> </div>
</div> </div>
</div> </div>
</div>
<div class="main_btns"> <div class="main_btns">
<a-button class="btn2" @click="closeDrawer">取消</a-button> <a-button class="btn2" @click="closeDrawer">取消</a-button>
<a-button class="btn2" @click="confirm">确定</a-button> <a-button class="btn2" @click="confirm">确定</a-button>
</div>
</template>
<div v-show="step == 2">
<GrowthSelectTest
ref="GrowthSelectTestRef"
:selectId="formData.info.examinationPaperId"
@confirm="selectTestConfirm"
@addTest="addTest"
>
</GrowthSelectTest>
</div>
<!-- 新建考试 -->
<div class="iframe-container" v-if="step == 3">
<iframe
id="iframe"
style="width: 100%; height: 100%; border: none"
:src="iframeUrl + '/exam/papers?addnew=true'"
name="myframe"
sandbox="allow-forms allow-downloads allow-scripts allow-same-origin allow-popups"
></iframe>
</div> </div>
</template>
<div v-show="step == 2">
<GrowthSelectTest
ref="GrowthSelectTestRef"
:selectId="formData.info.examinationPaperId"
@confirm="selectTestConfirm"
@addTest="addTest"
>
</GrowthSelectTest>
</div> </div>
<!-- 新建考试 --> </a-spin>
<div class="iframe-container" v-if="step == 3">
<iframe
id="iframe"
style="width: 100%; height: 100%; border: none"
:src="iframeUrl + '/exam/papers?addnew=true'"
name="myframe"
sandbox="allow-forms allow-downloads allow-scripts allow-same-origin allow-popups"
></iframe>
</div>
</div>
</a-drawer> </a-drawer>
</template> </template>
<script setup> <script setup>
@@ -538,6 +542,7 @@ function timeChange(time, timeStr) {
formData.value.info.examinationEndTime = timeStr[1]; formData.value.info.examinationEndTime = timeStr[1];
} }
const spinning = ref(false);
// 系统考试 // 系统考试
async function confirm() { async function confirm() {
console.log(formData.value); console.log(formData.value);
@@ -569,22 +574,28 @@ async function confirm() {
formData.value.taskName = formData.value.info.examinationName; formData.value.taskName = formData.value.info.examinationName;
// 任务时长 // 任务时长
formData.value.duration = formData.value.info.examinationDuration; formData.value.duration = formData.value.info.examinationDuration;
saveTask(formData.value).then((res) => {
if (res.data.code == 200) { spinning.value = true;
if (formData.value.id) { saveTask(formData.value)
message.success("编辑成功"); .then((res) => {
if (res.data.code == 200) {
if (formData.value.id) {
message.success("编辑成功");
} else {
message.success("添加成功");
}
emit("refresh");
} else { } else {
message.success("添加成功"); message.error(res.msg);
} }
emit("refresh"); closeDrawer();
} else { })
message.error(res.msg); .finally(() => {
} spinning.value = false;
closeDrawer(); });
});
} }
function openDrawer(row) { function openDrawer(row) {
console.log(row, "irow"); row && (row = JSON.parse(JSON.stringify(row)));
row && row &&
(dateTime.value = [ (dateTime.value = [
row.info.examinationStartTime, row.info.examinationStartTime,

View File

@@ -9,39 +9,41 @@
title="添加面授" title="添加面授"
placement="right" placement="right"
> >
<div class="drawerMain"> <a-spin :spinning="spinning">
<div class="header"> <div class="drawerMain">
<div class="headerTitle">{{ title }}</div> <div class="header">
<div class="headerTitle">{{ title }}</div>
<img <img
style="width: 29px; height: 29px; cursor: pointer" style="width: 29px; height: 29px; cursor: pointer"
src="../../assets/images/basicinfo/close.png" src="../../assets/images/basicinfo/close.png"
@click="closeDrawer" @click="closeDrawer"
/> />
</div> </div>
<div class="contentMain"> <div class="contentMain">
<div class="main"> <div class="main">
<div class="main_left"> <div class="main_left">
<div v-show="step == 1"> <div v-show="step == 1">
<FaceClassAll <FaceClassAll
ref="FaceClassAllRef" ref="FaceClassAllRef"
v-model:id="formData.taskId" v-model:id="formData.taskId"
v-model:name="formData.taskName" v-model:name="formData.taskName"
@addData="addData" @addData="addData"
@select="confirm" @select="confirm"
/> />
</div> </div>
<div v-show="step == 2"> <div v-show="step == 2">
<GrowthCourseModal <GrowthCourseModal
@noEdit="noEdit" @noEdit="noEdit"
@visibleClose="visibleClose" @visibleClose="visibleClose"
ref="CourseModalRef" ref="CourseModalRef"
/> />
</div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </a-spin>
</a-drawer> </a-drawer>
</template> </template>
<script setup> <script setup>
@@ -96,27 +98,40 @@ const closeDrawer = () => {
formData.reset(); formData.reset();
} }
}; };
const spinning = ref(false);
async function confirm(row) { async function confirm(row) {
// 新增 // 新增
spinning.value = true;
if (!formData.value?.id) { if (!formData.value?.id) {
await saveTask({ saveTask({
growthId: props.growId, growthId: props.growId,
taskName: row.name, taskName: row.name,
taskType: props.type, taskType: props.type,
taskId: row.id, taskId: row.id,
type: props.activeKey, type: props.activeKey,
}); })
message.success("添加成功"); .then((res) => {
message.success("添加成功");
closeDrawer();
emit("refresh");
})
.finally(() => {
spinning.value = false;
});
} else { } else {
// 编辑 // 编辑
formData.value.taskName = row.name; formData.value.taskName = row.name;
formData.value.taskId = row.id; formData.value.taskId = row.id;
await saveTask(formData.value); saveTask(formData.value)
message.success("编辑成功"); .then((res) => {
message.success("编辑成功");
closeDrawer();
emit("refresh");
})
.finally(() => {
spinning.value = false;
});
} }
closeDrawer();
emit("refresh");
} }
function openDrawer(row) { function openDrawer(row) {

View File

@@ -8,100 +8,102 @@
width="800" width="800"
placement="right" placement="right"
> >
<div class="drawerMain"> <a-spin :spinning="spinning">
<div class="header"> <div class="drawerMain">
<div class="headerTitle">{{ formData.id ? "编辑" : "添加" }}作业</div> <div class="header">
<img <div class="headerTitle">{{ formData.id ? "编辑" : "添加" }}作业</div>
style="width: 29px; height: 29px; cursor: pointer" <img
src="../../assets/images/basicinfo/close.png" style="width: 29px; height: 29px; cursor: pointer"
@click="closeDrawer" src="../../assets/images/basicinfo/close.png"
/> @click="closeDrawer"
</div> />
<div class="contentMain"> </div>
<div class="main_left"> <div class="contentMain">
<div class="main_item"> <div class="main_left">
<div class="signbox"> <div class="main_item">
<div class="sign"> <div class="signbox">
<img <div class="sign">
src="@/assets/images/coursewareManage/asterisk.png" <img
alt="" src="@/assets/images/coursewareManage/asterisk.png"
alt=""
/>
</div>
<span style="margin-right: 3px">作业名称</span>
</div>
<div class="btnbox">
<a-input
v-model:value="formData.info.workName"
style="width: 400px; height: 40px; border-radius: 8px"
placeholder="请输入作业名称"
autocomplete="off"
show-count
:maxlength="20"
/> />
</div> </div>
<span style="margin-right: 3px">作业名称</span>
</div> </div>
<div class="btnbox">
<a-input
v-model:value="formData.info.workName"
style="width: 400px; height: 40px; border-radius: 8px"
placeholder="请输入作业名称"
autocomplete="off"
show-count
:maxlength="20"
/>
</div>
</div>
<div class="main_item"> <div class="main_item">
<div class="signbox"> <div class="signbox">
<div class="sign"> <div class="sign">
<img <img
src="@/assets/images/coursewareManage/asterisk.png" src="@/assets/images/coursewareManage/asterisk.png"
alt="" alt=""
/>
</div>
<span style="margin-right: 3px">开始时间</span>
</div>
<div class="btnbox">
<a-range-picker
style="width: 400px; height: 40px; border-radius: 8px"
:show-time="{ format: 'hh:mm' }"
v-model:value="dateTime"
format="YYYY-MM-DD HH:mm"
@change="timeChange"
:placeholder="[' 开始时间', ' 结束时间']"
/> />
</div> </div>
<span style="margin-right: 3px">开始时间</span>
</div> </div>
<div class="btnbox"> <div class="main_item2">
<a-range-picker <div class="signbox">
style="width: 400px; height: 40px; border-radius: 8px" <div class="sign">
:show-time="{ format: 'hh:mm' }" <img
v-model:value="dateTime" src="@/assets/images/coursewareManage/asterisk.png"
format="YYYY-MM-DD HH:mm" alt=""
@change="timeChange" />
:placeholder="[' 开始时间', ' 结束时间']" </div>
/> <span style="margin-right: 3px">作业要求</span>
</div> </div>
</div> <div class="textarea">
<div class="main_item2"> <a-textarea
<div class="signbox"> v-model:value="formData.info.workRequirement"
<div class="sign"> placeholder="请输入作业要求"
<img autocomplete="off"
src="@/assets/images/coursewareManage/asterisk.png" allow-clear
alt="" :rows="6"
show-count
:maxlength="200"
/> />
</div> </div>
<span style="margin-right: 3px">作业要求</span>
</div> </div>
<div class="textarea"> <div class="mbl_items">
<a-textarea <div class="item_nam">
v-model:value="formData.info.workRequirement" <span style="margin-right: 10px"></span>
placeholder="请输入作业要求" </div>
autocomplete="off" <div class="item_inp">
allow-clear <FJUpload v-model:value="formData.info.workEnclosureAddress" />
:rows="6" </div>
show-count
:maxlength="200"
/>
</div> </div>
<div style="width: 100%; height: 80px"></div>
</div> </div>
<div class="mbl_items"> </div>
<div class="item_nam"> <div class="main_btns" style="background: #fff">
<span style="margin-right: 10px"></span> <a-button class="btn2" @click="closeDrawer">取消</a-button>
</div> <a-button class="btn2" html-type="submit" @click="confirm"
<div class="item_inp"> >确定</a-button
<FJUpload v-model:value="formData.info.workEnclosureAddress" /> >
</div>
</div>
<div style="width: 100%; height: 80px"></div>
</div> </div>
</div> </div>
<div class="main_btns" style="background: #fff"> </a-spin>
<a-button class="btn2" @click="closeDrawer">取消</a-button>
<a-button class="btn2" html-type="submit" @click="confirm"
>确定</a-button
>
</div>
</div>
</a-drawer> </a-drawer>
</template> </template>
<script setup> <script setup>
@@ -117,7 +119,7 @@ const props = defineProps({
activeKey: String, activeKey: String,
}); });
const visible = ref(false); const visible = ref(false);
const formData = useResetRef({ const formData = ref({
info: { info: {
workName: "", workName: "",
submitStartTime: "", submitStartTime: "",
@@ -156,8 +158,14 @@ const rulesRef = ref({
const closeDrawer = () => { const closeDrawer = () => {
visible.value = false; visible.value = false;
formData.reset(); formData.value = {
formData.value.info = {}; info: {
workName: "",
submitStartTime: "",
submitEndTime: "",
workRequirement: "",
},
};
dateTime.value = []; dateTime.value = [];
}; };
@@ -165,7 +173,7 @@ function timeChange(time, timeStr) {
formData.value.info.submitStartTime = timeStr[0]; formData.value.info.submitStartTime = timeStr[0];
formData.value.info.submitEndTime = timeStr[1]; formData.value.info.submitEndTime = timeStr[1];
} }
const spinning = ref(false);
async function confirm() { async function confirm() {
// 表单校验 // 表单校验
await validate().catch(({ errorFields }) => { await validate().catch(({ errorFields }) => {
@@ -190,24 +198,28 @@ async function confirm() {
formData.value.info.submitStartTime, formData.value.info.submitStartTime,
"minutes" "minutes"
); );
spinning.value = true
saveTask(formData.value).then((res) => { saveTask(formData.value)
if (res.data.code == 200) { .then((res) => {
if (formData.value.id) { if (res.data.code == 200) {
message.success("编辑成功"); if (formData.value.id) {
message.success("编辑成功");
} else {
message.success("添加成功");
}
closeDrawer();
emit("refresh");
} else { } else {
message.success("添加成功"); message.error(res.msg);
} }
closeDrawer(); })
emit("refresh"); .finally(() => {
} else { spinning.value = false;
message.error(res.msg); });
}
});
} }
let validate = null; let validate = null;
function openDrawer(row) { function openDrawer(row) {
row && (row = JSON.parse(JSON.stringify(row)));
row && (formData.value = row); row && (formData.value = row);
row && row &&
(dateTime.value = [ (dateTime.value = [

View File

@@ -9,73 +9,75 @@
title="添加评估" title="添加评估"
placement="right" placement="right"
> >
<div class="drawerMain"> <a-spin :spinning="spinning">
<div class="header"> <div class="drawerMain">
<div v-if="formData.id" class="headerTitle">编辑评估</div> <div class="header">
<div v-else class="headerTitle">添加评估</div> <div v-if="formData.id" class="headerTitle">编辑评估</div>
<img <div v-else class="headerTitle">添加评估</div>
style="width: 29px; height: 29px; cursor: pointer" <img
src="../../assets/images/basicinfo/close.png" style="width: 29px; height: 29px; cursor: pointer"
@click="closeDrawer" src="../../assets/images/basicinfo/close.png"
/> @click="closeDrawer"
</div> />
<div class="contentMain">
<div class="main_item">
<div class="fi_input">
<a-input
v-model:value="params.assessmentName"
style="width: 424px; height: 40px; border-radius: 8px"
placeholder="请输入评估名称"
maxlength="20"
/>
</div>
<div class="btns" @click="search">
<div class="search"></div>
<div class="btnText">搜索</div>
</div>
<div class="btnsn" @click="reset">
<div class="search"></div>
<div class="btnText">重置</div>
</div>
<div class="btnsn" @click="reset">
<div class="search"></div>
<div class="btnText">刷新</div>
</div>
</div> </div>
<div class="contentMain">
<div class="main_item">
<div class="fi_input">
<a-input
v-model:value="params.assessmentName"
style="width: 424px; height: 40px; border-radius: 8px"
placeholder="请输入评估名称"
maxlength="20"
/>
</div>
<div class="btns" @click="search">
<div class="search"></div>
<div class="btnText">搜索</div>
</div>
<div class="btnsn" @click="reset">
<div class="search"></div>
<div class="btnText">重置</div>
</div>
<div class="btnsn" @click="reset">
<div class="search"></div>
<div class="btnText">刷新</div>
</div>
</div>
<div class="main_item"> <div class="main_item">
<button class="xkbtn" style="margin: 0" @click="goResearchmanage"> <button class="xkbtn" style="margin: 0" @click="goResearchmanage">
新建评估 新建评估
</button> </button>
</div> </div>
<div class="main_table"> <div class="main_table">
<a-table <a-table
class="ant-table-striped" class="ant-table-striped"
:row-class-name=" :row-class-name="
(_, index) => (index % 2 === 1 ? 'table-striped' : null) (_, index) => (index % 2 === 1 ? 'table-striped' : null)
" "
row-key="id" row-key="id"
:columns="columns" :columns="columns"
:data-source="data" :data-source="data"
:loading="loading" :loading="loading"
:pagination="pagination" :pagination="pagination"
> >
<template #bodyCell="{ column, record }"> <template #bodyCell="{ column, record }">
<template v-if="column.dataIndex === 'select'"> <template v-if="column.dataIndex === 'select'">
<a <a
:style="{ :style="{
color: formData.taskId == record.id ? '#999' : null, color: formData.taskId == record.id ? '#999' : null,
}" }"
@click="confirm(record)" @click="confirm(record)"
>选择</a >选择</a
> >
</template>
</template> </template>
</template> </a-table>
</a-table> </div>
</div> </div>
</div> </div>
</div> </a-spin>
</a-drawer> </a-drawer>
</template> </template>
<script setup lang="jsx"> <script setup lang="jsx">
@@ -194,29 +196,42 @@ const closeDrawer = () => {
visible.value = false; visible.value = false;
formData.reset(); formData.reset();
}; };
const spinning = ref(false);
async function confirm(record) { async function confirm(record) {
dialog({ dialog({
content: "确定选择该评估吗", content: "确定选择该评估吗",
ok: async () => { ok: async () => {
spinning.value = true;
if (!formData?.value?.id) { if (!formData?.value?.id) {
await saveTask({ saveTask({
growthId: props.growId, growthId: props.growId,
taskName: record.assessmentName, taskName: record.assessmentName,
taskType: props.type, taskType: props.type,
taskId: record.id, taskId: record.id,
type: props.activeKey, type: props.activeKey,
}); })
message.success("添加成功"); .then((res) => {
message.success("添加成功");
closeDrawer();
emit("refresh");
})
.finally(() => {
spinning.value = false;
});
} else { } else {
// 编辑 // 编辑
formData.value.taskName = record.assessmentName; formData.value.taskName = record.assessmentName;
formData.value.taskId = record.id; formData.value.taskId = record.id;
await saveTask(formData.value); saveTask(formData.value)
message.success("编辑成功"); .then((res) => {
message.success("编辑成功");
closeDrawer();
emit("refresh");
})
.finally(() => {
spinning.value = false;
});
} }
closeDrawer();
emit("refresh");
}, },
}); });
} }

View File

@@ -9,26 +9,30 @@
title="添加在线" title="添加在线"
placement="right" placement="right"
> >
<div class="drawerMain"> <a-spin :spinning="spinning">
<div class="header"> <div class="drawerMain">
<div class="headerTitle">{{ selectData.id ? "编辑" : "添加" }}在线</div> <div class="header">
<img <div class="headerTitle">
style="width: 29px; height: 29px; cursor: pointer" {{ selectData.id ? "编辑" : "添加" }}在线
src="../../assets/images/basicinfo/close.png" </div>
@click="closeDrawer" <img
/> style="width: 29px; height: 29px; cursor: pointer"
src="../../assets/images/basicinfo/close.png"
@click="closeDrawer"
/>
</div>
<iframe
id="iframe"
style="width: 100%; height: 100%; border: none"
:src="`${iframeUrl}/course/manages?f=choose&refId=${
props.id
}&refType=${14}&courseIds=&projectId=${props.growId}`"
name="myframe"
security="restricted"
sandbox="allow-forms allow-downloads allow-scripts allow-same-origin allow-popups"
></iframe>
</div> </div>
<iframe </a-spin>
id="iframe"
style="width: 100%; height: 100%; border: none"
:src="`${iframeUrl}/course/manages?f=choose&refId=${
props.id
}&refType=${14}&courseIds=&projectId=${props.growId}`"
name="myframe"
security="restricted"
sandbox="allow-forms allow-downloads allow-scripts allow-same-origin allow-popups"
></iframe>
</div>
</a-drawer> </a-drawer>
</template> </template>
<script setup lang="jsx"> <script setup lang="jsx">
@@ -50,27 +54,47 @@ const closeDrawer = () => {
visible.value = false; visible.value = false;
selectData.value = {}; selectData.value = {};
}; };
const spinning = ref(false);
async function confirm(row) { async function confirm(row) {
console.log(row); console.log(row);
// 新增
if (!selectData.value?.id) { dialog({
await saveTask({ content: "确定选择该案例吗?",
growthId: props.growId, ok: async () => {
taskName: row.name, // 新增
taskType: props.type, spinning.value = true;
taskId: row.id, if (!selectData.value?.id) {
type: props.activeKey, saveTask({
}); growthId: props.growId,
message.success("添加成功"); taskName: row.name,
} else { taskType: props.type,
// 编辑 taskId: row.id,
selectData.value.taskName = row.name; type: props.activeKey,
selectData.value.taskId = row.id; })
await saveTask(selectData.value); .then((res) => {
message.success("编辑成功"); message.success("添加成功");
} closeDrawer();
closeDrawer(); emit("refresh");
emit("refresh"); })
.finally(() => {
spinning.value = false;
});
} else {
// 编辑
selectData.value.taskName = row.name;
selectData.value.taskId = row.id;
saveTask(selectData.value)
.then((res) => {
message.success("编辑成功");
closeDrawer();
emit("refresh");
})
.finally(() => {
spinning.value = false;
});
}
},
});
} }
function selectCourse(row) { function selectCourse(row) {

View File

@@ -10,319 +10,321 @@
title="添加直播" title="添加直播"
placement="right" placement="right"
> >
<div class="drawerMain"> <a-spin :spinning="spinning">
<div class="header"> <div class="drawerMain">
<div class="headerTitle">{{ formData.id ? "编辑" : "添加" }}直播</div> <div class="header">
<img <div class="headerTitle">{{ formData.id ? "编辑" : "添加" }}直播</div>
style="width: 29px; height: 29px; cursor: pointer" <img
src="../../assets/images/basicinfo/close.png" style="width: 29px; height: 29px; cursor: pointer"
@click="closeDrawer" src="../../assets/images/basicinfo/close.png"
/> @click="closeDrawer"
</div> />
<template v-if="step == 1"> </div>
<div class="contentMain"> <template v-if="step == 1">
<div class="main_left"> <div class="contentMain">
<div class="main_item"> <div class="main_left">
<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="formData.info.liveName"
style="width: 400px; height: 40px; border-radius: 8px"
placeholder="请输入直播名称"
:maxlength="20"
/>
</div>
</div>
<div class="main_item" style="margin-top: -10px">
<div class="signbox">
<div class="asterisk_icon">
<img
src="@/assets/images/coursewareManage/asterisk.png"
alt=""
/>
</div>
<span style="margin-right: 3px">直播链接</span>
</div>
<div class="btnbox">
<a-input
v-model:value="formData.info.liveLink"
style="width: 400px; height: 40px; border-radius: 8px"
placeholder="请输入直播链接"
:maxlength="100"
/>
</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-range-picker
:show-time="{ format: 'HH:mm' }"
style="width: 400px; height: 40px; border-radius: 8px"
v-model:value="dateTime"
format="YYYY-MM-DD HH:mm"
valueFormat="YYYY-MM-DD HH:mm"
@change="timeChange"
:placeholder="[' 开始时间', ' 结束时间']"
/>
</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-number
:min="0"
:max="999999"
:precision="0"
style="width: 400px; height: 40px; border-radius: 8px"
:placeholder="durationText"
v-model:value="formData.info.liveDuration"
></a-input-number>
<span style="color: #999999; margin-left: 8px">分钟</span>
</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="select" style="width: 400px">
<ProjectManager
v-model:value="formData.info.liveTeacherId"
v-model:name="formData.info.liveTeacherName"
>
</ProjectManager>
</div>
</div>
<div class="mbl_items2">
<div class="item_nam">
<div class="asterisk_icon">
<img
src="@/assets/images/coursewareManage/asterisk.png"
alt=""
/>
</div>
<span style="margin-right: 2px">直播封面</span>
</div>
<div class="item_inp" style="background-color: #fff">
<a-upload
name="avatar"
list-type="picture-card"
class="avatar-uploader"
:show-upload-list="false"
:headers="headers"
:before-upload="beforeUpload"
>
<img
class="i_upload_img"
v-if="imageUrl"
:src="imageUrl"
alt="avatar"
/>
<div class="i_upload" v-else>
<div class="addimg">
<div class="heng"></div>
<div class="shu"></div>
</div>
</div>
</a-upload>
<div class="i_bottom">
<div class="tip">
<span style="color: #999999; margin-left: 8px"
>支持图片格式为jpg/jpeg/png 图片最大为2MB</span
>
</div>
</div>
</div>
</div>
<div class="main_item2">
<div class="signbox">
<div class="asterisk_icon">
<img
src="@/assets/images/coursewareManage/asterisk.png"
alt=""
/>
</div>
<span style="margin-right: 3px">直播公告</span>
</div>
<div class="textarea">
<a-textarea
v-model:value="formData.info.liveNotice"
placeholder="请输入直播公告"
allow-clear
show-count
:maxlength="200"
:rows="6"
/>
</div>
</div>
<div class="main_item">
<div class="signbox">
<span style="margin-right: 3px">回放设置</span>
</div>
<div class="btnbox">
<a-switch
v-model:checked="formData.info.livePlayback"
@change="getchange(formData.livePlayback)"
/>
</div>
</div>
<div v-if="formData.info.livePlayback">
<div class="main_item"> <div class="main_item">
<div class="signbox"> <div class="signbox">
<span style="margin-right: 3px">回放链接</span> <div class="sign">
<img
src="@/assets/images/coursewareManage/asterisk.png"
alt=""
/>
</div>
<span style="margin-right: 3px">直播名称</span>
</div> </div>
<div class="btnbox"> <div class="btnbox">
<a-input <a-input
v-model:value="formData.info.livePlaybackLink" v-model:value="formData.info.liveName"
style="width: 400px; height: 40px; border-radius: 8px" style="width: 400px; height: 40px; border-radius: 8px"
placeholder="请输入回放链接" placeholder="请输入直播名称"
:maxlength="20"
/>
</div>
</div>
<div class="main_item" style="margin-top: -10px">
<div class="signbox">
<div class="asterisk_icon">
<img
src="@/assets/images/coursewareManage/asterisk.png"
alt=""
/>
</div>
<span style="margin-right: 3px">直播链接</span>
</div>
<div class="btnbox">
<a-input
v-model:value="formData.info.liveLink"
style="width: 400px; height: 40px; border-radius: 8px"
placeholder="请输入直播链接"
:maxlength="100" :maxlength="100"
/> />
</div> </div>
</div> </div>
</div>
<div class="main_item2"> <div class="main_item">
<div class="signbox"> <div class="signbox">
<span style="margin-right: 3px">直播说明</span> <div class="sign">
<img
src="@/assets/images/coursewareManage/asterisk.png"
alt=""
/>
</div>
<span style="margin-right: 3px">直播时间</span>
</div>
<div class="btnbox">
<a-range-picker
:show-time="{ format: 'HH:mm' }"
style="width: 400px; height: 40px; border-radius: 8px"
v-model:value="dateTime"
format="YYYY-MM-DD HH:mm"
valueFormat="YYYY-MM-DD HH:mm"
@change="timeChange"
:placeholder="[' 开始时间', ' 结束时间']"
/>
</div>
</div> </div>
<div class="textarea"> <div class="main_item">
<a-textarea <div class="signbox">
v-model:value="formData.info.liveExplain" <!-- <div class="sign">-->
placeholder="请输入直播说明" <!-- <img src="@/assets/images/coursewareManage/asterisk.png" alt="" />-->
allow-clear <!-- </div>-->
show-count <span style="margin-right: 3px">持续时间</span>
:maxlength="200" </div>
:rows="6" <div class="btnbox">
/> <a-input-number
:min="0"
:max="999999"
:precision="0"
style="width: 400px; height: 40px; border-radius: 8px"
:placeholder="durationText"
v-model:value="formData.info.liveDuration"
></a-input-number>
<span style="color: #999999; margin-left: 8px">分钟</span>
</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="select" style="width: 400px">
<ProjectManager
v-model:value="formData.info.liveTeacherId"
v-model:name="formData.info.liveTeacherName"
>
</ProjectManager>
</div>
</div>
<div class="mbl_items2">
<div class="item_nam">
<div class="asterisk_icon">
<img
src="@/assets/images/coursewareManage/asterisk.png"
alt=""
/>
</div>
<span style="margin-right: 2px">直播封面</span>
</div>
<div class="item_inp" style="background-color: #fff">
<a-upload
name="avatar"
list-type="picture-card"
class="avatar-uploader"
:show-upload-list="false"
:headers="headers"
:before-upload="beforeUpload"
>
<img
class="i_upload_img"
v-if="imageUrl"
:src="imageUrl"
alt="avatar"
/>
<div class="i_upload" v-else>
<div class="addimg">
<div class="heng"></div>
<div class="shu"></div>
</div>
</div>
</a-upload>
<div class="i_bottom">
<div class="tip">
<span style="color: #999999; margin-left: 8px"
>支持图片格式为jpg/jpeg/png 图片最大为2MB</span
>
</div>
</div>
</div>
</div>
<div class="main_item2">
<div class="signbox">
<div class="asterisk_icon">
<img
src="@/assets/images/coursewareManage/asterisk.png"
alt=""
/>
</div>
<span style="margin-right: 3px">直播公告</span>
</div>
<div class="textarea">
<a-textarea
v-model:value="formData.info.liveNotice"
placeholder="请输入直播公告"
allow-clear
show-count
:maxlength="200"
:rows="6"
/>
</div>
</div> </div>
</div>
<div class="main_item2"> <div class="main_item">
<div class="signbox"> <div class="signbox">
<span style="margin-right: 3px">考勤设置</span> <span style="margin-right: 3px">回放设置</span>
</div>
<div class="kqszbox">
<div class="qdqtbox">
<div class="qdbtn">
<div class="btntext">签到</div>
</div>
</div> </div>
<div class="setbox"> <div class="btnbox">
<div class="timerbox"> <a-switch
<span>直播开始前</span> v-model:checked="formData.info.livePlayback"
<a-input-number @change="getchange(formData.livePlayback)"
:min="0" />
:max="999999" </div>
:precision="0" </div>
style=" <div v-if="formData.info.livePlayback">
width: 88px; <div class="main_item">
height: 32px; <div class="signbox">
border-radius: 8px; <span style="margin-right: 3px">回放链接</span>
overflow: hidden;
"
v-model:value="formData.info.beforeSignIn"
></a-input-number>
<span style="color: #999999; margin-left: 8px"
>分钟允许签到</span
>
</div> </div>
<div class="timerbox"> <div class="btnbox">
<span>直播开始后</span> <a-input
<a-input-number v-model:value="formData.info.livePlaybackLink"
:min="0" style="width: 400px; height: 40px; border-radius: 8px"
:max="999999" placeholder="请输入回放链接"
:precision="0" :maxlength="100"
style=" />
width: 88px;
height: 32px;
border-radius: 8px;
overflow: hidden;
"
v-model:value="formData.info.afterSignIn"
></a-input-number>
<span style="color: #999999; margin-left: 8px"
>分钟允许签到</span
>
</div> </div>
</div> </div>
</div> </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>
</div> </div>
<div class="btnbox2"> <div class="textarea">
<a-checkbox <a-textarea
v-model:checked="formData.info.isEvaluate" v-model:value="formData.info.liveExplain"
@change="getchanges(formData.info.isEvaluate)" placeholder="请输入直播说明"
>需要评估 allow-clear
</a-checkbox> show-count
</div> :maxlength="200"
</div> :rows="6"
<div v-if="formData.info.isEvaluate" class="main_item"> />
<div class="signbox"></div>
<div class="btnbox">
<button class="xkbtn" @click="step = 2">选择评估</button>
<div v-if="formData.info.assessmentId">
<a-tag closable @close="removePG" color="processing">
<span style="font-size: 14px; line-height: 33px">{{
formData.info.assessmentName
}}</span>
</a-tag>
</div> </div>
</div> </div>
</div>
<div class="main_item" style="height: 30px"> <div class="main_item2">
<div class="signbox"> <div class="signbox">
<span style="margin-right: 3px"></span> <span style="margin-right: 3px">考勤设置</span>
</div>
<div class="kqszbox">
<div class="qdqtbox">
<div class="qdbtn">
<div class="btntext">签到</div>
</div>
</div>
<div class="setbox">
<div class="timerbox">
<span>直播开始前</span>
<a-input-number
:min="0"
:max="999999"
:precision="0"
style="
width: 88px;
height: 32px;
border-radius: 8px;
overflow: hidden;
"
v-model:value="formData.info.beforeSignIn"
></a-input-number>
<span style="color: #999999; margin-left: 8px"
>分钟允许签到</span
>
</div>
<div class="timerbox">
<span>直播开始后</span>
<a-input-number
:min="0"
:max="999999"
:precision="0"
style="
width: 88px;
height: 32px;
border-radius: 8px;
overflow: hidden;
"
v-model:value="formData.info.afterSignIn"
></a-input-number>
<span style="color: #999999; margin-left: 8px"
>分钟允许签到</span
>
</div>
</div>
</div>
</div>
<div class="main_item2">
<div class="signbox">
<span style="margin-right: 3px">评估</span>
</div>
<div class="btnbox2">
<a-checkbox
v-model:checked="formData.info.isEvaluate"
@change="getchanges(formData.info.isEvaluate)"
>需要评估
</a-checkbox>
</div>
</div>
<div v-if="formData.info.isEvaluate" class="main_item">
<div class="signbox"></div>
<div class="btnbox">
<button class="xkbtn" @click="step = 2">选择评估</button>
<div v-if="formData.info.assessmentId">
<a-tag closable @close="removePG" color="processing">
<span style="font-size: 14px; line-height: 33px">{{
formData.info.assessmentName
}}</span>
</a-tag>
</div>
</div>
</div>
<div class="main_item" style="height: 30px">
<div class="signbox">
<span style="margin-right: 3px"></span>
</div>
<div class="btnbox"></div>
</div> </div>
<div class="btnbox"></div>
</div> </div>
</div> </div>
</div> <div class="main_btns">
<div class="main_btns"> <button class="btn2" @click="closeDrawer">取消</button>
<button class="btn2" @click="closeDrawer">取消</button> <button class="btn2" @click="confirm">确定</button>
<button class="btn2" @click="confirm">确定</button> </div>
</div> </template>
</template> <template v-if="step == 2">
<template v-if="step == 2"> <GrowthInvistRoot
<GrowthInvistRoot v-model:id="formData.info.assessmentId"
v-model:id="formData.info.assessmentId" v-model:name="formData.info.assessmentName"
v-model:name="formData.info.assessmentName" @confirm="step = 1"
@confirm="step = 1" >
> </GrowthInvistRoot>
</GrowthInvistRoot> </template>
</template> </div>
</div> </a-spin>
</a-drawer> </a-drawer>
</template> </template>
<script setup> <script setup>
@@ -482,6 +484,7 @@ function timeChange(time, timeStr) {
const disabledDate = (current) => { const disabledDate = (current) => {
return current && current < dayjs().startOf("day"); return current && current < dayjs().startOf("day");
}; };
const spinning = ref(false);
async function confirm() { async function confirm() {
// debugger; // debugger;
console.log("确定按钮:"); console.log("确定按钮:");
@@ -505,23 +508,28 @@ async function confirm() {
} else { } else {
formData.value.duration = formData.value.info.liveDuration; formData.value.duration = formData.value.info.liveDuration;
} }
spinning.value = true;
saveTask(formData.value).then((res) => { saveTask(formData.value)
if (res.data.code == 200) { .then((res) => {
if (formData.value.id) { if (res.data.code == 200) {
message.success("编辑成功"); if (formData.value.id) {
message.success("编辑成功");
} else {
message.success("添加成功");
}
closeDrawer();
emit("refresh");
} else { } else {
message.success("添加成功"); message.error(res.msg);
} }
closeDrawer(); })
emit("refresh"); .finally(() => {
} else { spinning.value = false;
message.error(res.msg); });
}
});
} }
function openDrawer(row) { function openDrawer(row) {
row && (row = JSON.parse(JSON.stringify(row)));
row && (formData.value = row); row && (formData.value = row);
row && (dateTime.value = [row.info.liveStartTime, row.info.liveEndTime]); row && (dateTime.value = [row.info.liveStartTime, row.info.liveEndTime]);
row && (imageUrl.value = row.info.liveCover); row && (imageUrl.value = row.info.liveCover);

View File

@@ -8,101 +8,103 @@
width="1300" width="1300"
placement="right" placement="right"
> >
<div class="drawerMain"> <a-spin :spinning="spinning">
<div class="header"> <div class="drawerMain">
<div v-if="selectData.id" class="headerTitle">编辑项目</div> <div class="header">
<div v-else class="headerTitle">添加项目</div> <div v-if="selectData.id" class="headerTitle">编辑项目</div>
<img <div v-else class="headerTitle">添加项目</div>
style="width: 29px; height: 29px; cursor: pointer" <img
src="../../assets/images/basicinfo/close.png" style="width: 29px; height: 29px; cursor: pointer"
@click="closeDrawer" src="../../assets/images/basicinfo/close.png"
/> @click="closeDrawer"
</div> />
<div class="contentMain">
<div class="main_items">
<div class="mi_ipts">
<div class="mii_ipt">
<div class="ipt_name"></div>
<div class="fi_input">
<a-input
v-model:value="params.name"
style="width: 210px; height: 40px; border-radius: 8px"
placeholder="请输入项目名称"
maxlength="20"
/>
</div>
</div>
<div class="mii_ipt">
<div class="ipt_name"></div>
<div class="fi_input">
<a-input
v-model:value="params.manager"
style="width: 210px; height: 40px; border-radius: 8px"
placeholder="请输入项目经理"
maxlength="20"
/>
</div>
</div>
<div class="mii_ipt">
<div class="ipt_name"></div>
<div class="fi_input">
<a-input
v-model:value="params.createName"
style="width: 210px; height: 40px; border-radius: 8px"
placeholder="请输入创建人"
maxlength="20"
/>
</div>
</div>
</div>
<div class="mi_btns" style="margin-left: 0px">
<div class="btn btn1" @click="search">
<div class="search"></div>
<div class="btnText">搜索</div>
</div>
<div class="btn btn2" @click="reset">
<div class="search"></div>
<div class="btnText">重置</div>
</div>
<div class="btn btn2" @click="reset">
<div class="search"></div>
<div class="btnText">刷新</div>
</div>
</div>
</div> </div>
<div class="contentMain">
<div class="main_items">
<div class="mi_ipts">
<div class="mii_ipt">
<div class="ipt_name"></div>
<div class="fi_input">
<a-input
v-model:value="params.name"
style="width: 210px; height: 40px; border-radius: 8px"
placeholder="请输入项目名称"
maxlength="20"
/>
</div>
</div>
<div class="mii_ipt">
<div class="ipt_name"></div>
<div class="fi_input">
<a-input
v-model:value="params.manager"
style="width: 210px; height: 40px; border-radius: 8px"
placeholder="请输入项目经理"
maxlength="20"
/>
</div>
</div>
<div class="mii_ipt">
<div class="ipt_name"></div>
<div class="fi_input">
<a-input
v-model:value="params.createName"
style="width: 210px; height: 40px; border-radius: 8px"
placeholder="请输入创建人"
maxlength="20"
/>
</div>
</div>
</div>
<div class="mi_btns" style="margin-left: 0px">
<div class="btn btn1" @click="search">
<div class="search"></div>
<div class="btnText">搜索</div>
</div>
<div class="btn btn2" @click="reset">
<div class="search"></div>
<div class="btnText">重置</div>
</div>
<div class="btn btn2" @click="reset">
<div class="search"></div>
<div class="btnText">刷新</div>
</div>
</div>
</div>
<div class="main_item"> <div class="main_item">
<button class="xkbtn" @click="goProjectmanage">新建项目</button> <button class="xkbtn" @click="goProjectmanage">新建项目</button>
</div> </div>
<div class="main_table"> <div class="main_table">
<div class="drawerbox"> <div class="drawerbox">
<a-table <a-table
class="ant-table-striped" class="ant-table-striped"
:row-class-name=" :row-class-name="
(_, index) => (index % 2 === 1 ? 'table-striped' : null) (_, index) => (index % 2 === 1 ? 'table-striped' : null)
" "
row-key="id" row-key="id"
:columns="columns" :columns="columns"
:data-source="data" :data-source="data"
:loading="loading" :loading="loading"
:pagination="pagination" :pagination="pagination"
> >
<template #bodyCell="{ column, record }"> <template #bodyCell="{ column, record }">
<template v-if="column.dataIndex === 'select'"> <template v-if="column.dataIndex === 'select'">
<a <a
:style="{ :style="{
color: selectData.taskId == record.id ? '#999' : null, color: selectData.taskId == record.id ? '#999' : null,
}" }"
@click="confirm(record)" @click="confirm(record)"
>选择</a >选择</a
> >
</template>
</template> </template>
</template> </a-table>
</a-table> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </a-spin>
</a-drawer> </a-drawer>
</template> </template>
<script setup lang="jsx"> <script setup lang="jsx">
@@ -235,30 +237,43 @@ const closeDrawer = () => {
visible.value = false; visible.value = false;
reset(); reset();
}; };
const spinning = ref(false);
async function confirm(record) { async function confirm(record) {
dialog({ dialog({
content: "确定选择该项目吗", content: "确定选择该项目吗",
ok: async () => { ok: async () => {
spinning.value = true;
// 新增 // 新增
if (!selectData?.value?.id) { if (!selectData?.value?.id) {
await saveTask({ saveTask({
growthId: props.growId, growthId: props.growId,
taskName: record.name, taskName: record.name,
taskType: props.type, taskType: props.type,
taskId: record.id, taskId: record.id,
type: props.activeKey, type: props.activeKey,
}); })
message.success("添加成功"); .then((res) => {
message.success("添加成功");
closeDrawer();
emit("refresh");
})
.finally(() => {
spinning.value = false;
});
} else { } else {
// 编辑 // 编辑
selectData.value.taskName = record.name; selectData.value.taskName = record.name;
selectData.value.taskId = record.id; selectData.value.taskId = record.id;
await saveTask(selectData.value); await saveTask(selectData.value)
message.success("编辑成功"); .then((res) => {
message.success("编辑成功");
closeDrawer();
emit("refresh");
})
.finally(() => {
spinning.value = false;
});
} }
closeDrawer();
emit("refresh");
}, },
}); });
} }

View File

@@ -8,79 +8,81 @@
width="1000" width="1000"
placement="right" placement="right"
> >
<div class="drawerMain"> <a-spin :spinning="spinning">
<div class="header"> <div class="drawerMain">
<div class="headerTitle">{{ formData.id ? "编辑" : "添加" }}外链</div> <div class="header">
<img <div class="headerTitle">{{ formData.id ? "编辑" : "添加" }}外链</div>
style="width: 29px; height: 29px; cursor: pointer" <img
src="../../assets/images/basicinfo/close.png" style="width: 29px; height: 29px; cursor: pointer"
@click="closeDrawer" src="../../assets/images/basicinfo/close.png"
/> @click="closeDrawer"
</div> />
<div class="contentMain"> </div>
<div class="main_left"> <div class="contentMain">
<div class="main_item"> <div class="main_left">
<div class="signbox"> <div class="main_item">
<div class="sign"> <div class="signbox">
<img <div class="sign">
src="@/assets/images/coursewareManage/asterisk.png" <img
alt="" src="@/assets/images/coursewareManage/asterisk.png"
alt=""
/>
</div>
<span style="margin-right: 3px">外链名称</span>
</div>
<div class="btnbox">
<a-input
v-model:value="formData.info.linkName"
style="width: 400px; height: 40px; border-radius: 8px"
placeholder="请输入外链名称"
show-count
:maxlength="20"
/> />
</div> </div>
<span style="margin-right: 3px">外链名称</span>
</div> </div>
<div class="btnbox"> <div class="main_item">
<a-input <div class="signbox">
v-model:value="formData.info.linkName" <div class="sign">
style="width: 400px; height: 40px; border-radius: 8px" <img
placeholder="请输入外链名称" src="@/assets/images/coursewareManage/asterisk.png"
show-count alt=""
:maxlength="20" />
/> </div>
</div> <span style="margin-right: 3px">链接</span>
</div> </div>
<div class="main_item"> <div class="btnbox">
<div class="signbox"> <a-input
<div class="sign"> v-model:value="formData.info.linkAddress"
<img style="width: 400px; height: 40px; border-radius: 8px"
src="@/assets/images/coursewareManage/asterisk.png" placeholder="请输入链接"
alt="" show-count
:maxlength="100"
/> />
</div> </div>
<span style="margin-right: 3px">链接</span>
</div> </div>
<div class="btnbox"> <div class="main_item2">
<a-input <div class="signbox">
v-model:value="formData.info.linkAddress" <span style="margin-right: 3px">外链说明</span>
style="width: 400px; height: 40px; border-radius: 8px" </div>
placeholder="请输入链接" <div class="textarea" style="width: 400px">
show-count <a-textarea
:maxlength="100" v-model:value="formData.info.linkDescription"
/> placeholder="请输入外链说明"
</div> allow-clear
</div> :rows="6"
<div class="main_item2"> show-count
<div class="signbox"> :maxlength="200"
<span style="margin-right: 3px">外链说明</span> />
</div> </div>
<div class="textarea" style="width: 400px">
<a-textarea
v-model:value="formData.info.linkDescription"
placeholder="请输入外链说明"
allow-clear
:rows="6"
show-count
:maxlength="200"
/>
</div> </div>
</div> </div>
</div> </div>
<div class="main_btns">
<button class="btn2" @click="closeDrawer">取消</button>
<button class="btn2" @click="confirm">确定</button>
</div>
</div> </div>
<div class="main_btns"> </a-spin>
<button class="btn2" @click="closeDrawer">取消</button>
<button class="btn2" @click="confirm">确定</button>
</div>
</div>
</a-drawer> </a-drawer>
</template> </template>
<script setup> <script setup>
@@ -135,6 +137,7 @@ const closeDrawer = () => {
}; };
}; };
const spinning = ref(false);
async function confirm() { async function confirm() {
await validate().catch(({ errorFields }) => { await validate().catch(({ errorFields }) => {
message.warning(errorFields[0].errors.join()); message.warning(errorFields[0].errors.join());
@@ -148,22 +151,28 @@ async function confirm() {
formData.value.type = props.activeKey; formData.value.type = props.activeKey;
// 任务名称 // 任务名称
formData.value.taskName = formData.value.info.linkName; formData.value.taskName = formData.value.info.linkName;
saveTask(formData.value).then((res) => { spinning.value = true;
if (res.data.code == 200) { saveTask(formData.value)
if (formData.value.id) { .then((res) => {
message.success("编辑成功"); if (res.data.code == 200) {
if (formData.value.id) {
message.success("编辑成功");
} else {
message.success("添加成功");
}
emit("refresh");
} else { } else {
message.success("添加成功"); message.error(res.msg);
} }
emit("refresh"); closeDrawer();
} else { })
message.error(res.msg); .finally(() => {
} spinning.value = false;
closeDrawer(); });
});
} }
function openDrawer(row) { function openDrawer(row) {
row && (row = JSON.parse(JSON.stringify(row)));
row && (formData.value = row); row && (formData.value = row);
validate = Form.useForm(formData.value.info, rulesRef).validate; validate = Form.useForm(formData.value.info, rulesRef).validate;
visible.value = true; visible.value = true;

View File

@@ -273,7 +273,7 @@ export default {
state.fileList = []; state.fileList = [];
state.uploadpercent = -1; state.uploadpercent = -1;
message.destroy(); message.destroy();
message.error(`当前开课暂无作业,无法导入成绩`); // message.error(`当前开课暂无作业,无法导入成绩`);
clearInterval(timer); clearInterval(timer);
clearTimeout(timeouts); clearTimeout(timeouts);
return; return;

View File

@@ -9,115 +9,117 @@
title="添加投票" title="添加投票"
placement="right" placement="right"
> >
<div class="drawerMain"> <a-spin :spinning="spinning">
<div class="header"> <div class="drawerMain">
<div class="headerTitle">{{ title }}</div> <div class="header">
<div class="headerTitle">{{ title }}</div>
<img <img
style="width: 29px; height: 29px; cursor: pointer" style="width: 29px; height: 29px; cursor: pointer"
src="../../assets/images/basicinfo/close.png" src="../../assets/images/basicinfo/close.png"
@click="closeDrawer" @click="closeDrawer"
/> />
</div> </div>
<template v-if="step == 1"> <template v-if="step == 1">
<div class="contentMain"> <div class="contentMain">
<div class="main_left"> <div class="main_left">
<div class="main_item"> <div class="main_item">
<div class="signbox"> <div class="signbox">
<div class="sign"> <div class="sign">
<img <img
src="@/assets/images/coursewareManage/asterisk.png" src="@/assets/images/coursewareManage/asterisk.png"
alt="" alt=""
/>
</div>
<span style="margin-right: 3px">任务名称</span>
</div>
<div class="btnbox">
<a-input
v-model:value="formData.info.voteName"
style="width: 424px; height: 40px; border-radius: 8px"
placeholder="请输入投票任务名称"
maxlength="20"
/> />
</div> </div>
<span style="margin-right: 3px">任务名称</span>
</div> </div>
<div class="btnbox"> <div class="main_item">
<a-input <div class="signbox">
v-model:value="formData.info.voteName" <div class="sign">
style="width: 424px; height: 40px; border-radius: 8px" <img
placeholder="请输入投票任务名称" src="@/assets/images/coursewareManage/asterisk.png"
maxlength="20" alt=""
/> />
</div> </div>
</div> <span style="margin-right: 3px">起止时间</span>
<div class="main_item"> </div>
<div class="signbox"> <div class="select">
<div class="sign"> <a-range-picker
<img :show-time="{ format: 'HH:mm' }"
src="@/assets/images/coursewareManage/asterisk.png" format="YYYY-MM-DD HH:mm"
alt="" style="width: 424px"
v-model:value="dateTime"
@change="timeChange"
:placeholder="[' 开始时间', ' 结束时间']"
/> />
</div> </div>
<span style="margin-right: 3px">起止时间</span>
</div> </div>
<div class="select"> <div class="main_item">
<a-range-picker <div class="signbox">
:show-time="{ format: 'HH:mm' }" <div class="sign">
format="YYYY-MM-DD HH:mm" <img
style="width: 424px" src="@/assets/images/coursewareManage/asterisk.png"
v-model:value="dateTime" alt=""
@change="timeChange" />
:placeholder="[' 开始时间', ' 结束时间']" </div>
/> <span>创建投票题干</span>
</div>
</div>
<div class="main_item">
<div class="signbox">
<div class="sign">
<img
src="@/assets/images/coursewareManage/asterisk.png"
alt=""
/>
</div> </div>
<span>创建投票题干</span> <div class="btnbox">
</div> <button class="xkbtn" @click="step = 2">
<div class="btnbox"> {{
<button class="xkbtn" @click="step = 2"> formData.info.voteStemDtoList.length ? "编辑" : "创建"
{{ }}投票题干
formData.info.voteStemDtoList.length ? "编辑" : "创建" </button>
}}投票题干
</button>
<div v-if="formData.info.voteStemDtoList.length"> <div v-if="formData.info.voteStemDtoList.length">
<a-tag closable color="processing" @close="handleDel"> <a-tag closable color="processing" @close="handleDel">
<span style="font-size: 14px; line-height: 33px" <span style="font-size: 14px; line-height: 33px"
>删除投票题干</span >删除投票题干</span
> >
</a-tag> </a-tag>
</div>
</div> </div>
</div> </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> </div>
</div> <div class="textarea">
<div class="textarea"> <a-textarea
<a-textarea v-model:value="formData.info.voteExplain"
v-model:value="formData.info.voteExplain" placeholder="请输入投票说明"
placeholder="请输入投票说明" allow-clear
allow-clear :rows="6"
:rows="6" maxlength="150"
maxlength="150" />
/> </div>
</div> </div>
</div> </div>
</div> </div>
</div> <div class="main_btns">
<div class="main_btns"> <button class="btn2" @click="closeDrawer">取消</button>
<button class="btn2" @click="closeDrawer">取消</button> <button class="btn2" @click="confirm">确定</button>
<button class="btn2" @click="confirm">确定</button> </div>
</div> </template>
</template> <template v-if="step == 2">
<template v-if="step == 2"> <CreateVote
<CreateVote v-model:options="formData.info.voteStemDtoList"
v-model:options="formData.info.voteStemDtoList" @close="step = 1"
@close="step = 1" @confirm="step = 1"
@confirm="step = 1" >
> </CreateVote>
</CreateVote> </template>
</template> </div>
</div> </a-spin>
</a-drawer> </a-drawer>
</template> </template>
<script setup> <script setup>
@@ -210,7 +212,7 @@ function timeChange(time, timeStr) {
const disabledDate = (current) => { const disabledDate = (current) => {
return current && current < dayjs().startOf("day"); return current && current < dayjs().startOf("day");
}; };
const spinning = ref(false);
async function confirm() { async function confirm() {
await validate().catch(({ errorFields }) => { await validate().catch(({ errorFields }) => {
message.warning(errorFields[0].errors.join()); message.warning(errorFields[0].errors.join());
@@ -228,22 +230,28 @@ async function confirm() {
formData.value.type = props.activeKey; formData.value.type = props.activeKey;
// 任务名称 // 任务名称
formData.value.taskName = formData.value.info.voteName; formData.value.taskName = formData.value.info.voteName;
saveTask(formData.value).then((res) => { spinning.value = true;
if (res.data.code == 200) { saveTask(formData.value)
if (formData.value.id) { .then((res) => {
message.success("编辑成功"); if (res.data.code == 200) {
if (formData.value.id) {
message.success("编辑成功");
} else {
message.success("添加成功");
}
emit("refresh");
} else { } else {
message.success("添加成功"); message.error(res.msg);
} }
emit("refresh"); closeDrawer();
} else { })
message.error(res.msg); .finally(() => {
} spinning.value = false;
closeDrawer(); });
});
} }
function openDrawer(row) { function openDrawer(row) {
row && (row = JSON.parse(JSON.stringify(row)));
row && (formData.value = row); row && (formData.value = row);
row && row &&
(dateTime.value = [ (dateTime.value = [

View File

@@ -276,7 +276,6 @@
</a-table> </a-table>
</div> </div>
</div> </div>
<!-- 查看学员 传入查看学员的id--> <!-- 查看学员 传入查看学员的id-->
<see-stu :permissions="permissions" ref="seeStuRef" /> <see-stu :permissions="permissions" ref="seeStuRef" />
@@ -294,6 +293,7 @@
:growthId="growId" :growthId="growId"
@confirm="confirmDrawer" @confirm="confirmDrawer"
@close="closeDrawer" @close="closeDrawer"
:autoClose="false"
></GrowthCommonStudent> ></GrowthCommonStudent>
</GrowthDrawer> </GrowthDrawer>
</template> </template>
@@ -704,7 +704,7 @@ function closeDrawer() {
GrowthDrawerRef.value.closeDrawer(); GrowthDrawerRef.value.closeDrawer();
} }
function confirmDrawer(selectList) { function confirmDrawer(selectList) {
closeDrawer(); GrowthDrawerRef.value.spinning = true
tableData.value.loading = true; tableData.value.loading = true;
addLearners({ addLearners({
growthId: props.id, growthId: props.id,
@@ -712,11 +712,14 @@ function confirmDrawer(selectList) {
}) })
.then((res) => { .then((res) => {
tableData.value.loading = false; tableData.value.loading = false;
GrowthDrawerRef.value.spinning = false
message.success("添加成功"); message.success("添加成功");
closeDrawer();
getStuList(); getStuList();
}) })
.catch((err) => { .catch((err) => {
tableData.value.loading = false; tableData.value.loading = false;
GrowthDrawerRef.value.spinning = false
}); });
} }

View File

@@ -14,20 +14,13 @@
</div> </div>
</div> </div>
<div class="rightt"> <div class="rightt">
<router-link <div style="display: flex" @click="goBack">
:to="{ <img
path: '/pathmanage', class="img2"
query: { id: growId, routerEdit: true, pre: pre }, src="../../assets/images/leveladd/back.png"
}" />
> <div class="return">返回</div>
<div style="display: flex"> </div>
<img
class="img2"
src="../../assets/images/leveladd/back.png"
/>
<div class="return">返回</div>
</div>
</router-link>
</div> </div>
</div> </div>
</div> </div>
@@ -230,7 +223,10 @@
</template> </template>
<template v-else> <template v-else>
<span <span
v-if="element.status == '1' && checkMenu('growthTaskWithdraw')" v-if="
element.status == '1' &&
checkMenu('growthTaskWithdraw')
"
style="color: #4ea6ff; cursor: pointer" style="color: #4ea6ff; cursor: pointer"
@click="withdraw(element, index)" @click="withdraw(element, index)"
> >
@@ -302,6 +298,7 @@ import {
withdrawTask, withdrawTask,
deleteTask, deleteTask,
} from "@/api/growthpath"; } from "@/api/growthpath";
import router from "@/router";
const { const {
query: { growId, pre, name }, query: { growId, pre, name },
} = useRoute(); } = useRoute();
@@ -400,7 +397,10 @@ const getBasicInfoData = () => {
} }
}); });
}; };
// 返回
const goBack = () => {
router.go(-1);
};
// 发布 // 发布
const published = (element) => { const published = (element) => {
// if(basicData.value.isPublished){ // if(basicData.value.isPublished){

View File

@@ -757,9 +757,6 @@ export default {
listDatas(); listDatas();
} }
}) })
.catch((err) => {
message.error(err.data.msg);
});
} else { } else {
saveGrowth(params) saveGrowth(params)
.then((res) => { .then((res) => {
@@ -769,9 +766,6 @@ export default {
listDatas(); listDatas();
} }
}) })
.catch((err) => {
message.error(err.data.msg);
});
} }
}; };
const of_exit = () => { const of_exit = () => {

View File

@@ -578,6 +578,8 @@
:id="routerId" :id="routerId"
:growId="routerId" :growId="routerId"
:visable="tabFlag" :visable="tabFlag"
@loading="spinning = true"
@closeLoading="spinning = false"
:permissions="preId" :permissions="preId"
> >
<template #extension="{ data: { record } }"> <template #extension="{ data: { record } }">

View File

@@ -18,16 +18,16 @@ module.exports = defineConfig({
overlay: false,// 解决代码抛出异常 overlay: false,// 解决代码抛出异常
}, },
proxy: { proxy: {
"/professional": { // "/professional": {
target: 'http://192.168.31.211:32002', // target: 'http://192.168.31.211:32002',
// target: 'http://192.168.50.195:32002', // // target: 'http://192.168.50.195:32002',
// target: 'http://192.168.86.195:32002', // // target: 'http://192.168.86.195:32002',
changeOrigin: true,
},
// "/growth": {
// target: 'https:' + process.env.VUE_APP_BOE_API_URL,
// changeOrigin: true, // changeOrigin: true,
// }, // },
"/growth": {
target: 'https:' + process.env.VUE_APP_BOE_API_URL,
changeOrigin: true,
},
"/manageApi": { "/manageApi": {
target: 'https:' + process.env.VUE_APP_PROXY_URL, target: 'https:' + process.env.VUE_APP_PROXY_URL,
changeOrigin: true, //表示是否改变原域名 changeOrigin: true, //表示是否改变原域名