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
VUE_APP_BASE=/manage
VUE_APP_BASE_API=/manageApi
# 专业力必修API前缀
VUE_APP_BASE_API_GROWTH=/growth
VUE_APP_LOGIN_URL=//u-pre.boe.com/web?returnUrl=
VUE_APP_BOE_API_URL=//u-pre.boe.com

View File

@@ -9,195 +9,197 @@
title="添加活动"
placement="right"
>
<div class="drawerMain" v-if="visible">
<div class="header">
<div class="headerTitle">{{ formData.id ? "编辑" : "添加" }}活动</div>
<img
style="width: 29px; height: 29px; cursor: pointer"
src="../../assets/images/basicinfo/close.png"
@click="closeDrawer"
/>
</div>
<div class="contentMain">
<div class="main_left">
<div class="main_item">
<div class="signbox">
<div class="sign">
<img
src="@/assets/images/coursewareManage/asterisk.png"
alt=""
<a-spin :spinning="spinning">
<div class="drawerMain" v-if="visible">
<div class="header">
<div class="headerTitle">{{ formData.id ? "编辑" : "添加" }}活动</div>
<img
style="width: 29px; height: 29px; cursor: pointer"
src="../../assets/images/basicinfo/close.png"
@click="closeDrawer"
/>
</div>
<div class="contentMain">
<div class="main_left">
<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.activityName"
style="width: 400px; height: 40px; border-radius: 8px"
placeholder="请输入活动名称"
maxlength="20"
/>
</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>
<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' }"
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"
<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"
>分钟允许签到</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="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=""
/>
<span style="color: #999999; margin-left: 8px"
>分钟允许签到</span
>
</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 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 class="main_item" style="height: 40px">
<div class="signbox">
<span style="margin-right: 3px"></span>
<div class="main_item" style="height: 40px">
<div class="signbox">
<span style="margin-right: 3px"></span>
</div>
<div class="btnbox"></div>
</div>
<div class="btnbox"></div>
</div>
</div>
<div class="main_btns">
<button class="btn2" @click="closeDrawer">取消</button>
<button class="btn2" @click="confirm">确定</button>
</div>
</div>
<div class="main_btns">
<button class="btn2" @click="closeDrawer">取消</button>
<button class="btn2" @click="confirm">确定</button>
</div>
</div>
</a-spin>
</a-drawer>
</template>
<script setup>
@@ -300,7 +302,7 @@ function timeChange(time, timeStr) {
const disabledDate = (current) => {
return current && current < dayjs().startOf("day");
};
const spinning = ref(false);
async function confirm() {
// debugger
await validate().catch(({ errorFields }) => {
@@ -326,24 +328,30 @@ async function confirm() {
} else {
formData.value.duration = formData.value.info.activityDuration;
}
saveTask(formData.value).then((res) => {
if (res.data.code == 200) {
if (formData.value.id) {
message.success("编辑成功");
spinning.value = true;
saveTask(formData.value)
.then((res) => {
if (res.data.code == 200) {
if (formData.value.id) {
message.success("编辑成功");
} else {
message.success("添加成功");
}
emit("refresh");
} else {
message.success("添加成功");
message.error(res.msg);
}
emit("refresh");
} else {
message.error(res.msg);
}
closeDrawer();
});
closeDrawer();
})
.finally(() => {
spinning.value = false;
});
return;
}
function openDrawer(row) {
row && (formData.value = reactive(row));
row && (row = JSON.parse(JSON.stringify(row)));
row && (formData.value = row);
row &&
(dateTime.value = [
dayjs(row.info.activityStartTime, "YYYY-MM-DD HH:mm"),

View File

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

View File

@@ -9,80 +9,82 @@
title="添加案例"
placement="right"
>
<div class="drawerMain">
<div class="header">
<div v-if="taskIndex >= 0" class="headerTitle">编辑案例</div>
<div v-else class="headerTitle">添加案例</div>
<img
style="width: 29px; height: 29px; cursor: pointer"
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>
<a-spin :spinning="spinning">
<div class="drawerMain">
<div class="header">
<div v-if="taskIndex >= 0" class="headerTitle">编辑案例</div>
<div v-else class="headerTitle">添加案例</div>
<img
style="width: 29px; height: 29px; cursor: pointer"
src="../../assets/images/basicinfo/close.png"
@click="closeDrawer"
/>
</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
>
<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 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>
</a-table>
</a-table>
</div>
</div>
</div>
</div>
</a-spin>
</a-drawer>
</template>
<script setup>
@@ -157,7 +159,7 @@ function search() {
}
function reset() {
params.reset()
params.reset();
fetch();
}
@@ -167,29 +169,43 @@ const closeDrawer = () => {
reset();
};
const spinning = ref(false);
function confirm(row) {
dialog({
content: "确定选择该案例吗",
ok: async () => {
// 新增
spinning.value = true;
if (!selectedRows?.value?.id) {
await saveTask({
saveTask({
growthId: props.growId,
taskName: row.title,
taskType: props.type,
taskId: row.id,
type: props.activeKey,
});
message.success("添加成功");
})
.then((res) => {
message.success("添加成功");
closeDrawer();
emit("refresh");
})
.finally(() => {
spinning.value = false;
});
} else {
// 编辑
selectedRows.value.taskName = row.title;
selectedRows.value.taskId = row.id;
await saveTask(selectedRows.value);
message.success("编辑成功");
saveTask(selectedRows.value)
.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/require-v-for-key -->
<template>
<div class="CommonStudent">
<div class="drawer-content" style="">
<div class="tabs" style="min-width: 800px">
<a-tabs v-model:activeKey="activeKey">
<template v-if="type == 2">
<a-tab-pane :key="2" tab="项目内学员">
<a-spin :spinning="spinning">
<div class="CommonStudent">
<div class="drawer-content" style="">
<div class="tabs" style="min-width: 800px">
<a-tabs v-model:activeKey="activeKey">
<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>
<a-form-item label="姓名">
<div class="tab1">
<a-form-item label="姓名">
<a-input
v-model:value="projectParams.userNickName"
style="width: 260px; height: 40px; border-radius: 8px"
v-model:value="nameSearch.keyword"
style="width: 270px; height: 40px; border-radius: 8px"
placeholder="请输入姓名"
/>
<a-button
type="primary"
@click="getProjectStu"
@click="onSearchStu"
style="margin-left: 20px; border-radius: 4px"
>
<template #icon>
@@ -27,181 +69,151 @@
</a-button>
<a-button
type="primary"
@click="resetProjectStu"
@click="resetStu"
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
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>
</template>
<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>
</a-tabs>
</div>
<div
:style="{ 'max-height': screenHeight - 235 + 'px' }"
style="overflow-y: auto; padding-bottom: 10px"
>
<div class="selecteds" v-if="type == 2">
<div class="person">项目内学员</div>
<div v-for="(item, i) in projectSelectRows" :key="i">
<div v-if="i < 11">
<div class="chose">
{{ item.userNickName }}
<div class="ch" @click="projectStuTableRef.remove(i)"></div>
</div>
</div>
<div v-else>
<div v-if="person">
<div class="right1" style="min-width: 200px">
<div class="onerow">
<div class="onleft">
<div class="already">已选</div>
</div>
</div>
<div
:style="{ 'max-height': screenHeight - 235 + 'px' }"
style="overflow-y: auto; padding-bottom: 10px"
>
<div class="selecteds" v-if="type == 2">
<div class="person">项目内学员</div>
<div v-for="(item, i) in projectSelectRows" :key="i">
<div v-if="i < 11">
<div class="chose">
{{ item.userNickName }}
<div class="ch" @click="projectStuTableRef.remove(i)"></div>
</div>
</div>
</div>
</div>
<div 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">
{{ item.realName }}
<div class="ch" @click="stuTableRef.remove(i)"></div>
<div v-else>
<div v-if="person">
<div class="chose">
{{ item.userNickName }}
<div
class="ch"
@click="projectStuTableRef.remove(i)"
></div>
</div>
</div>
</div>
</div>
<div v-else>
<div v-if="person">
<div
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">
{{ item.realName }}
<div class="ch" @click="stuTableRef.remove(i)"></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 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 class="btnn">
<button class="btn2" @click="closeDrawer">取消</button>
<button class="btn2" @click="confirm">确定</button>
</div>
</div>
<div class="btnn">
<button class="btn2" @click="closeDrawer">取消</button>
<button class="btn2" @click="confirm">确定</button>
</div>
</div>
</a-spin>
</template>
<script setup>
import { message } from "ant-design-vue";
@@ -232,7 +244,12 @@ const props = defineProps({
type: [String, Number],
default: 1,
},
autoClose: {
type: Boolean,
default: true,
},
});
const spinning = ref(false)
const projectStuTableRef = ref(null);
// 项目内学员获取列表
const getProjectStu = () => projectStuTableRef.value.fetch();
@@ -394,7 +411,9 @@ const confirm = () => {
}
visiable.value = false;
emit("confirm", stuSelectRows.value, projectSelectRows.value);
closeDrawer();
if (props.autoClose) {
closeDrawer();
}
};
onMounted(() => {
@@ -410,6 +429,10 @@ onMounted(() => {
stuTableRef.value && stuTableRef.value.reset({ keyword: "", departId: "" });
}
});
defineExpose({
spinning
})
</script>
<style lang="scss" scoped>
.CommonStudent > .ant-drawer-content-wrapper {

View File

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

View File

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

View File

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

View File

@@ -9,102 +9,105 @@
placement="right"
destroyOnClose
>
<div class="drawerMain">
<div class="header">
<div class="headerTitle">
{{ title }}
</div>
<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>
<a-spin :spinning="spinning">
<div class="drawerMain">
<div class="header">
<div class="headerTitle">
{{ title }}
</div>
<img
style="width: 29px; height: 29px; cursor: pointer"
src="../../assets/images/basicinfo/close.png"
@click="closeDrawer"
/>
</div>
<div v-if="formData.info.examType === 1" class="contentMain">
<div class="main_left">
<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.examinationName"
style="width: 400px; height: 40px; border-radius: 8px"
placeholder="请输入考试名称"
:maxlength="20"
showCount
/>
</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>
<div class="main_item">
<div class="signbox">
<div class="sign">
<img
src="@/assets/images/coursewareManage/asterisk.png"
alt=""
<div v-if="formData.info.examType === 1" class="contentMain">
<div class="main_left">
<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.examinationName"
style="width: 400px; height: 40px; border-radius: 8px"
placeholder="请输入考试名称"
:maxlength="20"
showCount
/>
</div>
<span style="margin-right: 3px">选择试卷</span>
</div>
<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 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>
</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-model:id="formData.examinationPaperId"
v-model:name="formData.examinationTestName"
@@ -115,269 +118,270 @@
</button>
</div>
</GrowthSelectTest> -->
</div>
</div>
<div class="main_item">
<div class="signbox">
<div class="sign">
<img
src="@/assets/images/coursewareManage/asterisk.png"
alt=""
<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
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>
<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>
<div class="main_item">
<div class="signbox">
<div class="sign">
<img
src="@/assets/images/coursewareManage/asterisk.png"
alt=""
/>
<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>
<span style="margin-right: 3px">考试时长</span>
</div>
<div class="select">
<a-input-number
:min="0"
:disabled="formData.id"
:max="999999"
:precision="0"
style="width: 400px; height: 40px; border-radius: 8px"
v-model:value="formData.info.examinationDuration"
></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 class="select">
<a-input-number
:min="0"
:disabled="formData.id"
:max="999999"
:precision="0"
style="width: 400px; height: 40px; border-radius: 8px"
v-model:value="formData.info.examinationDuration"
></a-input-number>
<span style="color: #999999; margin-left: 8px">分钟</span>
</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"
/>
<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"
: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 class="main_item2">
<div class="signbox">
<span style="margin-right: 3px">考试说明</span>
<div class="main_item2">
<div class="signbox">
<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 class="textarea">
<a-textarea
:disabled="formData.id"
v-model:value="formData.info.examinationExplain"
placeholder="请输入考试说明"
show-count
:maxlength="200"
:rows="6"
/>
</div>
</div>
<div class="main_item2">
<div class="signbox">
<span style="margin-right: 3px; margin-top: 10px"
>考试限制</span
>
</div>
<div class="kqszbox">
<div class="setbox">
<div class="timerbox">
<span>允许重复考试</span>
<a-input-number
:min="-1"
:disabled="formData.id"
:max="999999"
:precision="0"
style="
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 class="main_item2">
<div class="signbox">
<span style="margin-right: 3px; margin-top: 10px"
>考试限制</span
>
</div>
<div class="kqszbox">
<div class="setbox">
<div class="timerbox">
<span>允许重复考试</span>
<a-input-number
:min="-1"
:disabled="formData.id"
:max="999999"
:precision="0"
style="
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 class="main_item">
<div class="signbox">
<span style="margin-right: 3px">显示答案</span>
<div class="main_item">
<div class="signbox">
<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 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 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.showAnalysis"
>
<a-radio :value="'1'">允许查看</a-radio>
<a-radio :value="'2'">不允许查看</a-radio>
</a-radio-group>
</div>
</div>
</div>
<div class="main_item">
<div class="signbox">
<span style="margin-right: 3px">显示解析</span>
<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="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="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.questionArrangement"
>
<a-radio :value="'1'">试题乱序</a-radio>
<a-radio :value="'2'">选项乱序</a-radio>
<a-radio :value="'3'">全部乱序</a-radio>
<a-radio :value="'4'">不乱序</a-radio>
</a-radio-group>
<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.questionArrangement"
>
<a-radio :value="'1'">试题乱序</a-radio>
<a-radio :value="'2'">选项乱序</a-radio>
<a-radio :value="'3'">全部乱序</a-radio>
<a-radio :value="'4'">不乱序</a-radio>
</a-radio-group>
</div>
</div>
<div class="main_item" style="height: 20px"></div>
</div>
<div class="main_item" style="height: 20px"></div>
</div>
</div>
<div v-else class="contentMain">
<div class="main_left">
<div class="main_item">
<div class="signbox">
<div class="sign">
<img
src="@/assets/images/coursewareManage/asterisk.png"
alt=""
<div v-else class="contentMain">
<div class="main_left">
<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.examinationName"
style="width: 400px; height: 40px; border-radius: 8px"
placeholder="请输入考试名称"
:maxlength="20"
showCount
/>
</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>
<div class="main_item">
<div class="signbox">
<div class="sign">
<img
src="@/assets/images/coursewareManage/asterisk.png"
alt=""
<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.source"
style="width: 400px; height: 40px; border-radius: 8px"
placeholder="请输入数据来源"
show-count
:maxlength="420"
/>
</div>
<span style="margin-right: 3px">数据来源</span>
</div>
<div class="btnbox">
<a-input
v-model:value="formData.info.source"
style="width: 400px; height: 40px; border-radius: 8px"
placeholder="请输入数据来源"
show-count
:maxlength="420"
/>
</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.examinationExplain"
placeholder="请输入考试说明"
show-count
:maxlength="200"
:rows="6"
/>
<div class="main_item2">
<div class="signbox">
<span style="margin-right: 3px">考试说明</span>
</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 class="main_btns">
<a-button class="btn2" @click="closeDrawer">取消</a-button>
<a-button class="btn2" @click="confirm">确定</a-button>
<div class="main_btns">
<a-button class="btn2" @click="closeDrawer">取消</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>
</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>
</a-spin>
</a-drawer>
</template>
<script setup>
@@ -538,6 +542,7 @@ function timeChange(time, timeStr) {
formData.value.info.examinationEndTime = timeStr[1];
}
const spinning = ref(false);
// 系统考试
async function confirm() {
console.log(formData.value);
@@ -569,22 +574,28 @@ async function confirm() {
formData.value.taskName = formData.value.info.examinationName;
// 任务时长
formData.value.duration = formData.value.info.examinationDuration;
saveTask(formData.value).then((res) => {
if (res.data.code == 200) {
if (formData.value.id) {
message.success("编辑成功");
spinning.value = true;
saveTask(formData.value)
.then((res) => {
if (res.data.code == 200) {
if (formData.value.id) {
message.success("编辑成功");
} else {
message.success("添加成功");
}
emit("refresh");
} else {
message.success("添加成功");
message.error(res.msg);
}
emit("refresh");
} else {
message.error(res.msg);
}
closeDrawer();
});
closeDrawer();
})
.finally(() => {
spinning.value = false;
});
}
function openDrawer(row) {
console.log(row, "irow");
row && (row = JSON.parse(JSON.stringify(row)));
row &&
(dateTime.value = [
row.info.examinationStartTime,

View File

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

View File

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

View File

@@ -9,73 +9,75 @@
title="添加评估"
placement="right"
>
<div class="drawerMain">
<div class="header">
<div v-if="formData.id" class="headerTitle">编辑评估</div>
<div v-else class="headerTitle">添加评估</div>
<img
style="width: 29px; height: 29px; cursor: pointer"
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>
<a-spin :spinning="spinning">
<div class="drawerMain">
<div class="header">
<div v-if="formData.id" class="headerTitle">编辑评估</div>
<div v-else class="headerTitle">添加评估</div>
<img
style="width: 29px; height: 29px; cursor: pointer"
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 class="main_item">
<button class="xkbtn" style="margin: 0" @click="goResearchmanage">
新建评估
</button>
</div>
<div class="main_item">
<button class="xkbtn" style="margin: 0" @click="goResearchmanage">
新建评估
</button>
</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: formData.taskId == record.id ? '#999' : null,
}"
@click="confirm(record)"
>选择</a
>
<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: formData.taskId == record.id ? '#999' : null,
}"
@click="confirm(record)"
>选择</a
>
</template>
</template>
</template>
</a-table>
</a-table>
</div>
</div>
</div>
</div>
</a-spin>
</a-drawer>
</template>
<script setup lang="jsx">
@@ -194,29 +196,42 @@ const closeDrawer = () => {
visible.value = false;
formData.reset();
};
const spinning = ref(false);
async function confirm(record) {
dialog({
content: "确定选择该评估吗",
ok: async () => {
spinning.value = true;
if (!formData?.value?.id) {
await saveTask({
saveTask({
growthId: props.growId,
taskName: record.assessmentName,
taskType: props.type,
taskId: record.id,
type: props.activeKey,
});
message.success("添加成功");
})
.then((res) => {
message.success("添加成功");
closeDrawer();
emit("refresh");
})
.finally(() => {
spinning.value = false;
});
} else {
// 编辑
formData.value.taskName = record.assessmentName;
formData.value.taskId = record.id;
await saveTask(formData.value);
message.success("编辑成功");
saveTask(formData.value)
.then((res) => {
message.success("编辑成功");
closeDrawer();
emit("refresh");
})
.finally(() => {
spinning.value = false;
});
}
closeDrawer();
emit("refresh");
},
});
}

View File

@@ -9,26 +9,30 @@
title="添加在线"
placement="right"
>
<div class="drawerMain">
<div class="header">
<div class="headerTitle">{{ selectData.id ? "编辑" : "添加" }}在线</div>
<img
style="width: 29px; height: 29px; cursor: pointer"
src="../../assets/images/basicinfo/close.png"
@click="closeDrawer"
/>
<a-spin :spinning="spinning">
<div class="drawerMain">
<div class="header">
<div class="headerTitle">
{{ selectData.id ? "编辑" : "添加" }}在线
</div>
<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>
<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>
</a-spin>
</a-drawer>
</template>
<script setup lang="jsx">
@@ -50,27 +54,47 @@ const closeDrawer = () => {
visible.value = false;
selectData.value = {};
};
const spinning = ref(false);
async function confirm(row) {
console.log(row);
// 新增
if (!selectData.value?.id) {
await saveTask({
growthId: props.growId,
taskName: row.name,
taskType: props.type,
taskId: row.id,
type: props.activeKey,
});
message.success("添加成功");
} else {
// 编辑
selectData.value.taskName = row.name;
selectData.value.taskId = row.id;
await saveTask(selectData.value);
message.success("编辑成功");
}
closeDrawer();
emit("refresh");
dialog({
content: "确定选择该案例吗?",
ok: async () => {
// 新增
spinning.value = true;
if (!selectData.value?.id) {
saveTask({
growthId: props.growId,
taskName: row.name,
taskType: props.type,
taskId: row.id,
type: props.activeKey,
})
.then((res) => {
message.success("添加成功");
closeDrawer();
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) {

View File

@@ -10,319 +10,321 @@
title="添加直播"
placement="right"
>
<div class="drawerMain">
<div class="header">
<div class="headerTitle">{{ formData.id ? "编辑" : "添加" }}直播</div>
<img
style="width: 29px; height: 29px; cursor: pointer"
src="../../assets/images/basicinfo/close.png"
@click="closeDrawer"
/>
</div>
<template v-if="step == 1">
<div class="contentMain">
<div class="main_left">
<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.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">
<a-spin :spinning="spinning">
<div class="drawerMain">
<div class="header">
<div class="headerTitle">{{ formData.id ? "编辑" : "添加" }}直播</div>
<img
style="width: 29px; height: 29px; cursor: pointer"
src="../../assets/images/basicinfo/close.png"
@click="closeDrawer"
/>
</div>
<template v-if="step == 1">
<div class="contentMain">
<div class="main_left">
<div class="main_item">
<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-input
v-model:value="formData.info.livePlaybackLink"
v-model:value="formData.info.liveName"
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"
/>
</div>
</div>
</div>
<div class="main_item2">
<div class="signbox">
<span style="margin-right: 3px">直播说明</span>
<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="textarea">
<a-textarea
v-model:value="formData.info.liveExplain"
placeholder="请输入直播说明"
allow-clear
show-count
:maxlength="200"
:rows="6"
/>
<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>
<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 class="main_item">
<div class="signbox">
<span style="margin-right: 3px">回放设置</span>
</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 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="signbox">
<span style="margin-right: 3px">回放链接</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 class="btnbox">
<a-input
v-model:value="formData.info.livePlaybackLink"
style="width: 400px; height: 40px; border-radius: 8px"
placeholder="请输入回放链接"
:maxlength="100"
/>
</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 class="main_item2">
<div class="signbox">
<span style="margin-right: 3px">直播说明</span>
</div>
<div class="textarea">
<a-textarea
v-model:value="formData.info.liveExplain"
placeholder="请输入直播说明"
allow-clear
show-count
:maxlength="200"
:rows="6"
/>
</div>
</div>
</div>
<div class="main_item" style="height: 30px">
<div class="signbox">
<span style="margin-right: 3px"></span>
<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"
></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 class="btnbox"></div>
</div>
</div>
</div>
<div class="main_btns">
<button class="btn2" @click="closeDrawer">取消</button>
<button class="btn2" @click="confirm">确定</button>
</div>
</template>
<template v-if="step == 2">
<GrowthInvistRoot
v-model:id="formData.info.assessmentId"
v-model:name="formData.info.assessmentName"
@confirm="step = 1"
>
</GrowthInvistRoot>
</template>
</div>
<div class="main_btns">
<button class="btn2" @click="closeDrawer">取消</button>
<button class="btn2" @click="confirm">确定</button>
</div>
</template>
<template v-if="step == 2">
<GrowthInvistRoot
v-model:id="formData.info.assessmentId"
v-model:name="formData.info.assessmentName"
@confirm="step = 1"
>
</GrowthInvistRoot>
</template>
</div>
</a-spin>
</a-drawer>
</template>
<script setup>
@@ -482,6 +484,7 @@ function timeChange(time, timeStr) {
const disabledDate = (current) => {
return current && current < dayjs().startOf("day");
};
const spinning = ref(false);
async function confirm() {
// debugger;
console.log("确定按钮:");
@@ -505,23 +508,28 @@ async function confirm() {
} else {
formData.value.duration = formData.value.info.liveDuration;
}
saveTask(formData.value).then((res) => {
if (res.data.code == 200) {
if (formData.value.id) {
message.success("编辑成功");
spinning.value = true;
saveTask(formData.value)
.then((res) => {
if (res.data.code == 200) {
if (formData.value.id) {
message.success("编辑成功");
} else {
message.success("添加成功");
}
closeDrawer();
emit("refresh");
} else {
message.success("添加成功");
message.error(res.msg);
}
closeDrawer();
emit("refresh");
} else {
message.error(res.msg);
}
});
})
.finally(() => {
spinning.value = false;
});
}
function openDrawer(row) {
row && (row = JSON.parse(JSON.stringify(row)));
row && (formData.value = row);
row && (dateTime.value = [row.info.liveStartTime, row.info.liveEndTime]);
row && (imageUrl.value = row.info.liveCover);

View File

@@ -8,101 +8,103 @@
width="1300"
placement="right"
>
<div class="drawerMain">
<div class="header">
<div v-if="selectData.id" class="headerTitle">编辑项目</div>
<div v-else class="headerTitle">添加项目</div>
<img
style="width: 29px; height: 29px; cursor: pointer"
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>
<a-spin :spinning="spinning">
<div class="drawerMain">
<div class="header">
<div v-if="selectData.id" class="headerTitle">编辑项目</div>
<div v-else class="headerTitle">添加项目</div>
<img
style="width: 29px; height: 29px; cursor: pointer"
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 class="main_item">
<button class="xkbtn" @click="goProjectmanage">新建项目</button>
</div>
<div class="main_table">
<div class="drawerbox">
<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: selectData.taskId == record.id ? '#999' : null,
}"
@click="confirm(record)"
>选择</a
>
<div class="main_item">
<button class="xkbtn" @click="goProjectmanage">新建项目</button>
</div>
<div class="main_table">
<div class="drawerbox">
<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: selectData.taskId == record.id ? '#999' : null,
}"
@click="confirm(record)"
>选择</a
>
</template>
</template>
</template>
</a-table>
</a-table>
</div>
</div>
</div>
</div>
</div>
</a-spin>
</a-drawer>
</template>
<script setup lang="jsx">
@@ -235,30 +237,43 @@ const closeDrawer = () => {
visible.value = false;
reset();
};
const spinning = ref(false);
async function confirm(record) {
dialog({
content: "确定选择该项目吗",
ok: async () => {
spinning.value = true;
// 新增
if (!selectData?.value?.id) {
await saveTask({
saveTask({
growthId: props.growId,
taskName: record.name,
taskType: props.type,
taskId: record.id,
type: props.activeKey,
});
message.success("添加成功");
})
.then((res) => {
message.success("添加成功");
closeDrawer();
emit("refresh");
})
.finally(() => {
spinning.value = false;
});
} else {
// 编辑
selectData.value.taskName = record.name;
selectData.value.taskId = record.id;
await saveTask(selectData.value);
message.success("编辑成功");
await saveTask(selectData.value)
.then((res) => {
message.success("编辑成功");
closeDrawer();
emit("refresh");
})
.finally(() => {
spinning.value = false;
});
}
closeDrawer();
emit("refresh");
},
});
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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