mirror of
https://codeup.aliyun.com/67762337eccfc218f6110e0e/vue/fe-manage.git
synced 2025-12-14 05:16:45 +08:00
feat: 模板列表获取,查看撤回操作,模板详情
This commit is contained in:
@@ -1,10 +0,0 @@
|
|||||||
import http from "./config";
|
|
||||||
|
|
||||||
// 获取模板库列表
|
|
||||||
export const templateList = obj => http.post('/admin/project/template/list', obj);
|
|
||||||
|
|
||||||
// 获取模板详情
|
|
||||||
export const templateDetail = id => http.get(`/admin/project/template/detail?projectTemplateId=${id}`);
|
|
||||||
|
|
||||||
// 操作模板(撤回,发布,删除)
|
|
||||||
export const templateHadle = obj => http.post(`/admin/project/template/handle`,obj);
|
|
||||||
@@ -15,3 +15,7 @@ export const moveTask = (obj) => http.post('/admin/project/template/moveTask',ob
|
|||||||
export const editStage = (obj) => http.post('/admin/project/template/editStage',obj);
|
export const editStage = (obj) => http.post('/admin/project/template/editStage',obj);
|
||||||
// 新建或编辑阶段任务
|
// 新建或编辑阶段任务
|
||||||
export const editTask = (obj) => http.post('/admin/project/template/editTask',obj);
|
export const editTask = (obj) => http.post('/admin/project/template/editTask',obj);
|
||||||
|
// 操作模板(撤回,发布,删除)
|
||||||
|
export const handleTemplates = (obj) => http.post('/admin/project/template/handle',obj);
|
||||||
|
// 模板库列表
|
||||||
|
export const templateList = (obj) => http.post(`/admin/project/template/list`,obj);
|
||||||
|
|||||||
@@ -5,11 +5,11 @@
|
|||||||
<img class="img" src="../../assets/images/projectadd/picture.png" />
|
<img class="img" src="../../assets/images/projectadd/picture.png" />
|
||||||
</div>
|
</div>
|
||||||
<div class="imgfor">
|
<div class="imgfor">
|
||||||
<div class="forz">管理者进阶-腾飞班1备份</div>
|
<div class="forz">{{projectInfo.name || '-'}}</div>
|
||||||
<div class="fort">
|
<div class="fort">
|
||||||
<div class="fort1">项目经理:黄华、刘俊备份</div>
|
<div class="fort1">项目经理:{{projectInfo.manager || '-'}}</div>
|
||||||
<div class="fort2">
|
<div class="fort2">
|
||||||
起止时间:2022-09-21 00:00 至 2022-10-21 00:00
|
起止时间:{{projectInfo.beginTime || '-'}} 至 {{projectInfo.endTime || '-'}}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -395,11 +395,9 @@
|
|||||||
<div class="set_content">
|
<div class="set_content">
|
||||||
<div class="setc_name"><span>模板名称:</span></div>
|
<div class="setc_name"><span>模板名称:</span></div>
|
||||||
<div class="setc_main">
|
<div class="setc_main">
|
||||||
<a-input
|
<a-input v-model:value="formData.name"
|
||||||
v-model:value="formData.name"
|
:bordered="isEdit" :disabled="!isEdit"
|
||||||
:bordered="isEdit"
|
style="width:300px;"
|
||||||
:disabled="!isEdit"
|
|
||||||
style="width: 300px"
|
|
||||||
></a-input>
|
></a-input>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -413,35 +411,27 @@
|
|||||||
@change="handleChange"
|
@change="handleChange"
|
||||||
:disabled="!isEdit"
|
:disabled="!isEdit"
|
||||||
>
|
>
|
||||||
<img
|
<img src="@/assets/images/projectadd/picture.png" alt="" />
|
||||||
src="@/assets/images/projectadd/picture.png"
|
|
||||||
alt=""
|
|
||||||
/>
|
|
||||||
</a-upload>
|
</a-upload>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="set_content">
|
<div class="set_content">
|
||||||
<div class="setc_name"><span>模板时间:</span></div>
|
<div class="setc_name"><span>模板时间:</span></div>
|
||||||
<div class="setc_main">
|
<div class="setc_main">
|
||||||
<a-range-picker
|
<a-range-picker v-model:value="formData.time"
|
||||||
v-model:value="formData.time"
|
|
||||||
:bordered="isEdit"
|
:bordered="isEdit" :disabled="!isEdit" />
|
||||||
:disabled="!isEdit"
|
|
||||||
/>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="set_content">
|
<div class="set_content">
|
||||||
<div class="setc_name"><span>项目经理:</span></div>
|
<div class="setc_name"><span>项目经理:</span></div>
|
||||||
<div class="setc_main">
|
<div class="setc_main">
|
||||||
<a-select
|
<a-select
|
||||||
v-model:value="formData.manager"
|
v-model:value="formData.manager" mode="multiple"
|
||||||
mode="multiple"
|
|
||||||
placeholder="请选择项目经理"
|
placeholder="请选择项目经理"
|
||||||
:size="large"
|
:size="large" :bordered="isEdit" :disabled="!isEdit"
|
||||||
:bordered="isEdit"
|
style="width: 200px;color: #999999;" :options="managerOptions"
|
||||||
:disabled="!isEdit"
|
|
||||||
style="width: 200px; color: #999999"
|
|
||||||
:options="managerOptions"
|
|
||||||
></a-select>
|
></a-select>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -451,32 +441,25 @@
|
|||||||
<a-select
|
<a-select
|
||||||
v-model:value="formData.sourceBelongId"
|
v-model:value="formData.sourceBelongId"
|
||||||
placeholder="请选择资源归属"
|
placeholder="请选择资源归属"
|
||||||
:size="large"
|
:size="large" :bordered="isEdit" :disabled="!isEdit"
|
||||||
:bordered="isEdit"
|
style="width: 200px;color: #999999;" :options="sourceBelongOptions"
|
||||||
:disabled="!isEdit"
|
|
||||||
style="width: 200px; color: #999999"
|
|
||||||
:options="sourceBelongOptions"
|
|
||||||
></a-select>
|
></a-select>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="set_content">
|
<div class="set_content">
|
||||||
<div class="setc_name"><span>模板说明:</span></div>
|
<div class="setc_name"><span>模板说明:</span></div>
|
||||||
<div class="setc_main">
|
<div class="setc_main">
|
||||||
<a-input
|
<a-input v-model:value="formData.remark"
|
||||||
v-model:value="formData.remark"
|
style="width:300px;"
|
||||||
style="width: 300px"
|
:bordered="isEdit" :disabled="!isEdit"
|
||||||
:bordered="isEdit"
|
|
||||||
:disabled="!isEdit"
|
|
||||||
></a-input>
|
></a-input>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="set_content">
|
<div class="set_content">
|
||||||
<div class="setc_name"><span>同步学习记录:</span></div>
|
<div class="setc_name"><span>同步学习记录:</span></div>
|
||||||
<div class="setc_main" @click="changecheck2">
|
<div class="setc_main" @click="changecheck2">
|
||||||
<a-radio
|
<a-radio v-model:checked="formData.courseSyncFlag"
|
||||||
v-model:checked="formData.courseSyncFlag"
|
:bordered="isEdit" :disabled="!isEdit"
|
||||||
:bordered="isEdit"
|
|
||||||
:disabled="!isEdit"
|
|
||||||
><span style="color: #333333"
|
><span style="color: #333333"
|
||||||
>同步课程学习记录(如学员在课程库中拥有课程的学习记录,自动免修该课程)</span
|
>同步课程学习记录(如学员在课程库中拥有课程的学习记录,自动免修该课程)</span
|
||||||
></a-radio
|
></a-radio
|
||||||
@@ -489,11 +472,8 @@
|
|||||||
<a-select
|
<a-select
|
||||||
v-model:value="formData.level"
|
v-model:value="formData.level"
|
||||||
placeholder="请选择项目级别"
|
placeholder="请选择项目级别"
|
||||||
:size="large"
|
:size="large" :bordered="isEdit" :disabled="!isEdit"
|
||||||
:bordered="isEdit"
|
style="width: 200px;color: #999999;" :options="levelOptions"
|
||||||
:disabled="!isEdit"
|
|
||||||
style="width: 200px; color: #999999"
|
|
||||||
:options="levelOptions"
|
|
||||||
></a-select>
|
></a-select>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -503,36 +483,23 @@
|
|||||||
<a-select
|
<a-select
|
||||||
v-model:value="formData.systemId"
|
v-model:value="formData.systemId"
|
||||||
placeholder="请选择培训分类"
|
placeholder="请选择培训分类"
|
||||||
:size="large"
|
:size="large" :bordered="isEdit" :disabled="!isEdit"
|
||||||
:bordered="isEdit"
|
style="width: 200px;color: #999999;" :options="systemOptions"
|
||||||
:disabled="!isEdit"
|
|
||||||
style="width: 200px; color: #999999"
|
|
||||||
:options="systemOptions"
|
|
||||||
></a-select>
|
></a-select>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="set_content">
|
<div class="set_content">
|
||||||
<div class="setc_name"><span>是否BOEU实施:</span></div>
|
<div class="setc_name"><span>是否BOEU实施:</span></div>
|
||||||
<div class="setc_main" @click="changecheck3">
|
<div class="setc_main" @click="changecheck3">
|
||||||
<a-radio
|
<a-radio v-model:checked="formData.boeFlag"
|
||||||
v-model:checked="formData.boeFlag"
|
:bordered="isEdit" :disabled="!isEdit"
|
||||||
:bordered="isEdit"
|
|
||||||
:disabled="!isEdit"
|
|
||||||
><span style="color: #333333">BOEU实施</span></a-radio
|
><span style="color: #333333">BOEU实施</span></a-radio
|
||||||
>
|
>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div v-if="isEdit" style="transform: translateX(50%)">
|
<div v-if="isEdit" style="transform: translateX(50%)">
|
||||||
<a-button
|
<a-button @click="cancelEdit" style="background-color: #f9f9f9">取消</a-button>
|
||||||
@click="cancelEdit"
|
<a-button @click="confirmEdit" style="background-color: #f5faff">保存</a-button>
|
||||||
style="background-color: #f9f9f9"
|
|
||||||
>取消</a-button
|
|
||||||
>
|
|
||||||
<a-button
|
|
||||||
@click="confirmEdit"
|
|
||||||
style="background-color: #f5faff"
|
|
||||||
>保存</a-button
|
|
||||||
>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -549,48 +516,29 @@
|
|||||||
<a-switch v-model:checked="docChecked" ></a-switch>
|
<a-switch v-model:checked="docChecked" ></a-switch>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="btnbox" style="margin: 20px">
|
<div class="btnbox" style="margin:20px;">
|
||||||
<a-upload
|
<a-upload
|
||||||
v-model:file-list="fileList"
|
v-model:file-list="fileList"
|
||||||
name="file"
|
name="file"
|
||||||
action="/api/file/upload"
|
action="/api/file/upload"
|
||||||
@change="handleChange"
|
@change="handleChange"
|
||||||
>
|
>
|
||||||
<span
|
<span class="xkbtn" style="cursor: pointer; font-size: 17px" >上传</span>
|
||||||
class="xkbtn"
|
<img src="@/assets/images/basicinfo/cloud.png" style="cursor: pointer;
|
||||||
style="cursor: pointer; font-size: 17px"
|
width:34px;height:34px;
|
||||||
>上传</span
|
" alt="">
|
||||||
>
|
|
||||||
<img
|
|
||||||
src="@/assets/images/basicinfo/cloud.png"
|
|
||||||
style="cursor: pointer; width: 34px; height: 34px"
|
|
||||||
alt=""
|
|
||||||
/>
|
|
||||||
</a-upload>
|
</a-upload>
|
||||||
<div class="btnbox" style="margin: 20px">
|
<div class="btnbox" style="margin:20px;">
|
||||||
<span style="color: #999999">
|
<span style="color: #999999">
|
||||||
支持:pdf.ppt.pptx.doc.docx.xls.xlsx.jpeg.png.gif.zip
|
支持:pdf.ppt.pptx.doc.docx.xls.xlsx.jpeg.png.gif.zip
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div v-for="item in docList" :key="item.src" class="docListStyle">
|
||||||
v-for="item in docList"
|
<img src="@/assets/images/basicinfo/download.png" style="cursor: pointer;
|
||||||
:key="item.src"
|
width:40px;height:40px;margin-right:40px;
|
||||||
class="docListStyle"
|
" alt="">
|
||||||
>
|
<span style="font: oblique 16px Sans-serif">{{item.name}}</span>
|
||||||
<img
|
<span style="color: #4ea6ff;float:right;">删除</span>
|
||||||
src="@/assets/images/basicinfo/download.png"
|
|
||||||
style="
|
|
||||||
cursor: pointer;
|
|
||||||
width: 40px;
|
|
||||||
height: 40px;
|
|
||||||
margin-right: 40px;
|
|
||||||
"
|
|
||||||
alt=""
|
|
||||||
/>
|
|
||||||
<span style="font: oblique 16px Sans-serif">{{
|
|
||||||
item.name
|
|
||||||
}}</span>
|
|
||||||
<span style="color: #4ea6ff; float: right">删除</span>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -644,7 +592,7 @@
|
|||||||
<script>
|
<script>
|
||||||
import { ref, reactive, defineComponent, toRefs, onMounted} from "vue";
|
import { ref, reactive, defineComponent, toRefs, onMounted} from "vue";
|
||||||
import { message } from "ant-design-vue";
|
import { message } from "ant-design-vue";
|
||||||
import * as api from "@/api/indexTemplate";
|
import * as api from "@/api/indexTemplate"
|
||||||
import { useRouter } from "vue-router";
|
import { useRouter } from "vue-router";
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
name: "LibraryAdd",
|
name: "LibraryAdd",
|
||||||
@@ -814,17 +762,17 @@ export default defineComponent({
|
|||||||
// 共享文档列表
|
// 共享文档列表
|
||||||
docList:[
|
docList:[
|
||||||
{
|
{
|
||||||
name: "测试文档1.doc",
|
name:'测试文档1.doc',
|
||||||
src:"",
|
src:"",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "测试文档2.doc",
|
name:'测试文档2.doc',
|
||||||
src:"",
|
src:"",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "测试文档3.doc",
|
name:'测试文档3.doc',
|
||||||
src:"",
|
src:"",
|
||||||
},
|
}
|
||||||
],
|
],
|
||||||
// 基本信息
|
// 基本信息
|
||||||
formData:{
|
formData:{
|
||||||
@@ -839,6 +787,12 @@ export default defineComponent({
|
|||||||
boeFlag: false,
|
boeFlag: false,
|
||||||
},
|
},
|
||||||
isEdit:false, // 是否处于编辑状态
|
isEdit:false, // 是否处于编辑状态
|
||||||
|
projectInfo:{
|
||||||
|
beginTime:null,
|
||||||
|
endTime:null,
|
||||||
|
name: null,
|
||||||
|
manager: null,
|
||||||
|
}
|
||||||
});
|
});
|
||||||
const value = ref("");
|
const value = ref("");
|
||||||
const value2 = ref("");
|
const value2 = ref("");
|
||||||
@@ -859,182 +813,153 @@ export default defineComponent({
|
|||||||
};
|
};
|
||||||
const confirmEdit = () => {
|
const confirmEdit = () => {
|
||||||
state.isEdit = false;
|
state.isEdit = false;
|
||||||
editTemplate();
|
editTemplate()
|
||||||
getDetail();
|
getDetail();
|
||||||
};
|
};
|
||||||
onMounted(() => {
|
onMounted(() => {getDetail()});
|
||||||
getDetail();
|
|
||||||
});
|
|
||||||
// 获取详情
|
// 获取详情
|
||||||
const getDetail = () => {
|
const getDetail = () => {
|
||||||
api
|
api.templateDetail(1).then(res => {
|
||||||
.templateDetail(0)
|
console.log(res)
|
||||||
.then((res) => {
|
state.formData.name = res.data.data.projectInfo.name
|
||||||
console.log(res);
|
state.formData.time = res.data.data.projectInfo.startTime+res.data.data.projectInfo.endTime;
|
||||||
state.formData.name = res.data.data.projectInfo.name;
|
state.formData.manager = res.data.data.projectInfo.manager
|
||||||
state.formData.time =
|
state.formData.sourceBelongId = res.data.data.projectInfo.sourceBelongId
|
||||||
res.data.data.projectInfo.startTime +
|
state.formData.remark = res.data.data.stageList.remark
|
||||||
res.data.data.projectInfo.endTime;
|
state.formData.courseSyncFlag = res.data.data.projectInfo.courseSyncFlag
|
||||||
state.formData.manager = res.data.data.projectInfo.manager;
|
state.formData.level = res.data.data.projectInfo.level
|
||||||
state.formData.sourceBelongId =
|
state.formData.systemId = res.data.data.projectInfo.systemId
|
||||||
res.data.data.projectInfo.sourceBelongId;
|
state.formData.boeFlag = res.data.data.projectInfo.boeFlag
|
||||||
state.formData.remark = res.data.data.stageList.remark;
|
state.value2 = res.data.data.projectInfo.notice
|
||||||
state.formData.courseSyncFlag =
|
}).catch(err => {
|
||||||
res.data.data.projectInfo.courseSyncFlag;
|
message.error("操作失败"+err)
|
||||||
state.formData.level = res.data.data.projectInfo.level;
|
console.log(err)
|
||||||
state.formData.systemId = res.data.data.projectInfo.systemId;
|
|
||||||
state.formData.boeFlag = res.data.data.projectInfo.boeFlag;
|
|
||||||
state.value2 = res.data.data.projectInfo.notice;
|
|
||||||
})
|
})
|
||||||
.catch((err) => {
|
}
|
||||||
message.error("操作失败" + err);
|
|
||||||
console.log(err);
|
|
||||||
});
|
|
||||||
};
|
|
||||||
// 编辑项目模板
|
// 编辑项目模板
|
||||||
const editTemplate = () => {
|
const editTemplate = () => {
|
||||||
let obj = {
|
let obj = {
|
||||||
beginTime: state.formData.time,
|
"beginTime": state.formData.time,
|
||||||
boeFlag: state.formData.boeFlag,
|
"boeFlag": state.formData.boeFlag,
|
||||||
category: 0,
|
"category": 0,
|
||||||
courseSyncFlag: state.formData.courseSyncFlag,
|
"courseSyncFlag": state.formData.courseSyncFlag,
|
||||||
endTime: state.formData.time,
|
"endTime": state.formData.time,
|
||||||
level: state.formData.level,
|
"level": state.formData.level,
|
||||||
manager: state.formData.manager,
|
"manager": state.formData.manager,
|
||||||
managerId: "",
|
"managerId": "",
|
||||||
name: state.formData.name,
|
"name": state.formData.name,
|
||||||
notice: "",
|
"notice": "",
|
||||||
noticeFlag: 0,
|
"noticeFlag": 0,
|
||||||
picUrl: "",
|
"picUrl": "",
|
||||||
projectTemplateId: 0,
|
"projectTemplateId": 0,
|
||||||
remark: state.formData.remark,
|
"remark": state.formData.remark,
|
||||||
sourceBelongId: state.formData.sourceBelongId,
|
"sourceBelongId": state.formData.sourceBelongId,
|
||||||
status: 0,
|
"status": 0,
|
||||||
systemId: state.formData.systemId,
|
"systemId": state.formData.systemId
|
||||||
};
|
};
|
||||||
api
|
api.templateEdit(obj).methods(obj).then(res => {
|
||||||
.templateEdit(obj)
|
message.success("编辑成功")
|
||||||
.methods(obj)
|
console.log(res)
|
||||||
.then((res) => {
|
}).catch(err => {
|
||||||
message.success("编辑成功");
|
message.error("编辑失败"+err)
|
||||||
console.log(res);
|
console.log(err)
|
||||||
})
|
})
|
||||||
.catch((err) => {
|
}
|
||||||
message.error("编辑失败" + err);
|
|
||||||
console.log(err);
|
|
||||||
});
|
|
||||||
};
|
|
||||||
// 发布公告
|
// 发布公告
|
||||||
const addNotice = () => {
|
const addNotice = () => {
|
||||||
let obj = {
|
let obj = {
|
||||||
beginTime: 0,
|
"beginTime": 0,
|
||||||
boeFlag: 0,
|
"boeFlag": 0,
|
||||||
category: 0,
|
"category": 0,
|
||||||
courseSyncFlag: 0,
|
"courseSyncFlag": 0,
|
||||||
endTime: 0,
|
"endTime": 0,
|
||||||
level: 0,
|
"level": 0,
|
||||||
manager: "",
|
"manager": "",
|
||||||
managerId: "",
|
"managerId": "",
|
||||||
name: "",
|
"name": "",
|
||||||
notice: state.value2,
|
"notice": state.value2,
|
||||||
noticeFlag: 0,
|
"noticeFlag": 0,
|
||||||
picUrl: "",
|
"picUrl": "",
|
||||||
projectTemplateId: 0,
|
"projectTemplateId": 0,
|
||||||
remark: "",
|
"remark": "",
|
||||||
sourceBelongId: 0,
|
"sourceBelongId": 0,
|
||||||
status: 0,
|
"status": 0,
|
||||||
systemId: 0,
|
"systemId": 0
|
||||||
};
|
};
|
||||||
api
|
api.templateEdit(obj).methods(obj).then(res => {
|
||||||
.templateEdit(obj)
|
message.success("公告发布成功")
|
||||||
.methods(obj)
|
console.log(res)
|
||||||
.then((res) => {
|
}).catch(err => {
|
||||||
message.success("公告发布成功");
|
message.error("公告发布失败"+err)
|
||||||
console.log(res);
|
console.log(err)
|
||||||
})
|
})
|
||||||
.catch((err) => {
|
}
|
||||||
message.error("公告发布失败" + err);
|
|
||||||
console.log(err);
|
|
||||||
});
|
|
||||||
};
|
|
||||||
// 删除阶段
|
// 删除阶段
|
||||||
const stateDel = (id) => {
|
const stateDel = (id) => {
|
||||||
api
|
api.deleteStage(id).then(res => {
|
||||||
.deleteStage(id)
|
message.success("删除阶段成功")
|
||||||
.then((res) => {
|
console.log(res)
|
||||||
message.success("删除阶段成功");
|
}).catch(err => {
|
||||||
console.log(res);
|
message.error("删除阶段失败"+err)
|
||||||
|
console.log(err)
|
||||||
})
|
})
|
||||||
.catch((err) => {
|
}
|
||||||
message.error("删除阶段失败" + err);
|
|
||||||
console.log(err);
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
// 删除任务
|
// 删除任务
|
||||||
const taskDel = (id) => {
|
const taskDel = (id) => {
|
||||||
api
|
api.deleteTask(id).then(res => {
|
||||||
.deleteTask(id)
|
message.success("删除任务成功")
|
||||||
.then((res) => {
|
console.log(res)
|
||||||
message.success("删除任务成功");
|
}).catch(err => {
|
||||||
console.log(res);
|
message.error("删除任务失败"+err)
|
||||||
|
console.log(err)
|
||||||
})
|
})
|
||||||
.catch((err) => {
|
}
|
||||||
message.error("删除任务失败" + err);
|
|
||||||
console.log(err);
|
|
||||||
});
|
|
||||||
};
|
|
||||||
const toEdit = () => {
|
const toEdit = () => {
|
||||||
routered.push({
|
routered.push({
|
||||||
path: "/manage/templateAdd",
|
path: "/templateAdd",
|
||||||
query: {
|
query: {
|
||||||
projectId: state.projectId,
|
projectId: state.projectId,
|
||||||
name: state.name,
|
name: state.name,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
};
|
}
|
||||||
// 新建或编辑阶段
|
// 新建或编辑阶段
|
||||||
const stateEdit = () => {
|
const stateEdit = () => {
|
||||||
let obj={
|
let obj={
|
||||||
name: "",
|
"name": "",
|
||||||
projectTemplateId: 0,
|
"projectTemplateId": 0,
|
||||||
remark: "",
|
"remark": "",
|
||||||
stageId: 0,
|
"stageId": 0
|
||||||
};
|
}
|
||||||
api
|
api.editStagek(obj).then(res => {
|
||||||
.editStagek(obj)
|
message.success("编辑阶段成功")
|
||||||
.then((res) => {
|
console.log(res)
|
||||||
message.success("编辑阶段成功");
|
}).catch(err => {
|
||||||
console.log(res);
|
message.error("编辑阶段失败"+err)
|
||||||
|
console.log(err)
|
||||||
})
|
})
|
||||||
.catch((err) => {
|
}
|
||||||
message.error("编辑阶段失败" + err);
|
|
||||||
console.log(err);
|
|
||||||
});
|
|
||||||
};
|
|
||||||
//新建或编辑阶段任务
|
//新建或编辑阶段任务
|
||||||
const taskEdit = () => {
|
const taskEdit = () => {
|
||||||
let obj = {
|
let obj = {
|
||||||
courseId: 0,
|
"courseId": 0,
|
||||||
duration: 0,
|
"duration": 0,
|
||||||
flag: true,
|
"flag": true,
|
||||||
name: "",
|
"name": "",
|
||||||
projectTaskId: 0,
|
"projectTaskId": 0,
|
||||||
projectTemplateId: 0,
|
"projectTemplateId": 0,
|
||||||
stageId: 0,
|
"stageId": 0,
|
||||||
type: 0,
|
"type": 0
|
||||||
};
|
}
|
||||||
api
|
api.editTask(obj).then(res => {
|
||||||
.editTask(obj)
|
message.success("编辑任务成功")
|
||||||
.then((res) => {
|
console.log(res)
|
||||||
message.success("编辑任务成功");
|
}).catch(err => {
|
||||||
console.log(res);
|
message.error("编辑任务失败"+err)
|
||||||
|
console.log(err)
|
||||||
})
|
})
|
||||||
.catch((err) => {
|
}
|
||||||
message.error("编辑任务失败" + err);
|
|
||||||
console.log(err);
|
|
||||||
});
|
|
||||||
};
|
|
||||||
return {
|
return {
|
||||||
...toRefs(state),
|
...toRefs(state),
|
||||||
value,
|
value,
|
||||||
@@ -1474,12 +1399,14 @@ export default defineComponent({
|
|||||||
}
|
}
|
||||||
|
|
||||||
.notice {
|
.notice {
|
||||||
|
|
||||||
.ntc_tit {
|
.ntc_tit {
|
||||||
padding-top:22px;
|
padding-top:22px;
|
||||||
margin-left: 34px;
|
margin-left: 34px;
|
||||||
font-size: 18px;
|
font-size: 18px;
|
||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
color: #232425;
|
color: #232425;
|
||||||
|
|
||||||
}
|
}
|
||||||
.ntc_body {
|
.ntc_body {
|
||||||
margin-left: 34px;
|
margin-left: 34px;
|
||||||
@@ -1501,6 +1428,7 @@ export default defineComponent({
|
|||||||
.btnarea {
|
.btnarea {
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: flex-end;
|
justify-content: flex-end;
|
||||||
|
|
||||||
}
|
}
|
||||||
.area_btn {
|
.area_btn {
|
||||||
width: 100px;
|
width: 100px;
|
||||||
|
|||||||
@@ -6,30 +6,21 @@
|
|||||||
<div class="inpbox">
|
<div class="inpbox">
|
||||||
<div class="inpbox1">
|
<div class="inpbox1">
|
||||||
<span>模版名称:</span>
|
<span>模版名称:</span>
|
||||||
<a-input
|
<a-input v-model:value="value1" style="
|
||||||
v-model:value="value1"
|
|
||||||
style="
|
|
||||||
width: 270px;
|
width: 270px;
|
||||||
height: 40px;
|
height: 40px;
|
||||||
border-radius: 8px;
|
border-radius: 8px;
|
||||||
margin-right: 14px;
|
margin-right: 14px;
|
||||||
"
|
" placeholder="请输入项目名称" />
|
||||||
placeholder="请输入项目名称"
|
|
||||||
/>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="inpbox1">
|
<div class="inpbox1">
|
||||||
<span>创建时间:</span>
|
<span>创建时间:</span>
|
||||||
<a-date-picker
|
<a-date-picker v-model="selectTime" type="date" placeholder="创建时间" style="
|
||||||
v-model="selectTime"
|
|
||||||
type="date"
|
|
||||||
placeholder="创建时间"
|
|
||||||
style="
|
|
||||||
width: 270px;
|
width: 270px;
|
||||||
height: 40px;
|
height: 40px;
|
||||||
border-radius: 8px;
|
border-radius: 8px;
|
||||||
margin-right: 14px;
|
margin-right: 14px;
|
||||||
"
|
" />
|
||||||
/>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -46,14 +37,8 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="tmpl_body">
|
<div class="tmpl_body">
|
||||||
<div class="tmpl_tabbox">
|
<div class="tmpl_tabbox">
|
||||||
<a-table
|
<a-table :columns="columns1" :data-source="tableData1" :loading="tableDataTotal === -1 ? true : false"
|
||||||
:columns="columns1"
|
expandRowByClick="true" @expand="expandTable" :pagination="pagination" />
|
||||||
:data-source="tableData1"
|
|
||||||
:loading="tableDataTotal === -1 ? true : false"
|
|
||||||
expandRowByClick="true"
|
|
||||||
@expand="expandTable"
|
|
||||||
:pagination="false"
|
|
||||||
/>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -62,7 +47,7 @@
|
|||||||
<script>
|
<script>
|
||||||
import { reactive, defineComponent, toRefs, onMounted } from "vue";
|
import { reactive, defineComponent, toRefs, onMounted } from "vue";
|
||||||
import { message } from "ant-design-vue";
|
import { message } from "ant-design-vue";
|
||||||
import * as api from "@/api/indexLibrary";
|
import * as api from "@/api/indexTemplate"
|
||||||
const columns1 = [
|
const columns1 = [
|
||||||
{
|
{
|
||||||
title: "模版名称",
|
title: "模版名称",
|
||||||
@@ -115,6 +100,7 @@ export default defineComponent({
|
|||||||
creator: "李部长",
|
creator: "李部长",
|
||||||
stutime: "2022-10-31 23:12:00",
|
stutime: "2022-10-31 23:12:00",
|
||||||
operation: "operation",
|
operation: "operation",
|
||||||
|
projectTemplateId: 1,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
key: "2",
|
key: "2",
|
||||||
@@ -123,9 +109,9 @@ export default defineComponent({
|
|||||||
creator: "李部长",
|
creator: "李部长",
|
||||||
stutime: "2022-10-31 23:12:00",
|
stutime: "2022-10-31 23:12:00",
|
||||||
operation: "operation",
|
operation: "operation",
|
||||||
},
|
projectTemplateId: 2,
|
||||||
|
}
|
||||||
],
|
],
|
||||||
// state
|
|
||||||
});
|
});
|
||||||
const getTableDate1 = () => {
|
const getTableDate1 = () => {
|
||||||
let data = state.tableData1;
|
let data = state.tableData1;
|
||||||
@@ -146,17 +132,9 @@ export default defineComponent({
|
|||||||
</router-link>
|
</router-link>
|
||||||
</div>
|
</div>
|
||||||
<div class="ops3">
|
<div class="ops3">
|
||||||
<div
|
<div class="jc"
|
||||||
class="jc"
|
onClick={() => { templateHadler({ "projectTemplateId": value.projectTemplateId, "type": 0 }) }}
|
||||||
onClick={() => {
|
>撤回</div>
|
||||||
templateHadler({
|
|
||||||
projectTemplateId: value.projectTemplateId,
|
|
||||||
type: 0,
|
|
||||||
});
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
撤回
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
) : (
|
) : (
|
||||||
@@ -165,15 +143,8 @@ export default defineComponent({
|
|||||||
{value.status === "未发布" ? (
|
{value.status === "未发布" ? (
|
||||||
<div class="nselect">
|
<div class="nselect">
|
||||||
<div class="ops1">
|
<div class="ops1">
|
||||||
<div
|
<div class="jc"
|
||||||
class="jc"
|
onClick={() => { templateHadler({ "projectTemplateId": value.projectTemplateId, "type": 1 }) }}>
|
||||||
onClick={() => {
|
|
||||||
templateHadler({
|
|
||||||
projectTemplateId: value.projectTemplateId,
|
|
||||||
type: 1,
|
|
||||||
});
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
发布
|
发布
|
||||||
<span style="color:#E9E9E9;margin-left:15px;">|</span>
|
<span style="color:#E9E9E9;margin-left:15px;">|</span>
|
||||||
</div>
|
</div>
|
||||||
@@ -187,17 +158,9 @@ export default defineComponent({
|
|||||||
</router-link>
|
</router-link>
|
||||||
</div>
|
</div>
|
||||||
<div class="ops3">
|
<div class="ops3">
|
||||||
<div
|
<div class="jc"
|
||||||
class="jc"
|
onClick={() => { templateHadler({ "projectTemplateId": value.projectTemplateId, "type": -1 }) }}
|
||||||
onClick={() => {
|
>删除</div>
|
||||||
templateHadler({
|
|
||||||
projectTemplateId: value.projectTemplateId,
|
|
||||||
type: -1,
|
|
||||||
});
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
删除
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
) : (
|
) : (
|
||||||
@@ -210,67 +173,86 @@ export default defineComponent({
|
|||||||
});
|
});
|
||||||
state.tableData = data;
|
state.tableData = data;
|
||||||
};
|
};
|
||||||
|
const pagination = reactive({
|
||||||
|
current: 1,
|
||||||
|
total: 50,
|
||||||
|
defaultPageSize: 10,
|
||||||
|
onChange: (id) => { pagination.current = id; getLibraryList() },
|
||||||
|
})
|
||||||
getTableDate1();
|
getTableDate1();
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
getLibraryList();
|
getLibraryList();
|
||||||
});
|
})
|
||||||
|
|
||||||
|
// 获取模板列表
|
||||||
const getLibraryList = () => {
|
const getLibraryList = () => {
|
||||||
let obj = {
|
let obj = {
|
||||||
beginTime: 0,
|
"beginTime": 0,
|
||||||
endTime: 0,
|
"endTime": 0,
|
||||||
name: "",
|
"name": "",
|
||||||
pageNo: 0,
|
"pageNo": pagination.current,
|
||||||
pageSize: 0,
|
"pageSize": 10,
|
||||||
status: 0,
|
"status": 0 || 1
|
||||||
};
|
}
|
||||||
api
|
api.templateList(obj).then((res) => {
|
||||||
.templateList(obj)
|
|
||||||
.then((res) => {
|
|
||||||
console.log(res);
|
console.log(res);
|
||||||
let resData = res.data.data.rows;
|
let resData = res.data.data.rows
|
||||||
if (resData.length) {
|
if (resData.length) {
|
||||||
for (let i in resData) {
|
for (let i in resData) {
|
||||||
state.tableData1[i].id = i + 1;
|
state.tableData1[i].id = i + 1;
|
||||||
state.tableData1[i].projectTemplateId =
|
state.tableData1[i].projectTemplateId = resData[i].projectTemplateId;
|
||||||
resData[i].projectTemplateId;
|
state.tableData1[i].status = resData[i].status ? "已发布" : "未发布";
|
||||||
state.tableData1[i].status = resData[i].status
|
|
||||||
? "已发布"
|
|
||||||
: "未发布";
|
|
||||||
state.tableData1[i].name = resData[i].name;
|
state.tableData1[i].name = resData[i].name;
|
||||||
state.tableData1[i].creator = resData[i].createName;
|
state.tableData1[i].creator = resData[i].createName;
|
||||||
state.tableData1[i].stutime = resData[i].publishTime;
|
state.tableData1[i].stutime = resData[i].publishTime;
|
||||||
state.tableData1[i].operation = "operation";
|
state.tableData1[i].operation = "operation";
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
message.warning("获取的列表数据为空值");
|
message.warning("获取的列表数据为空值")
|
||||||
}
|
}
|
||||||
})
|
}).catch((error) => {
|
||||||
.catch((error) => {
|
message.error(`获取模板列表失败` + error)
|
||||||
message.error(`获取模板列表失败` + error);
|
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
const templateHadler = (obj) => {
|
const templateHadler = (obj) => {
|
||||||
api
|
api.handleTemplates(obj).then((res) => {
|
||||||
.templateHadle(obj)
|
|
||||||
.then((res) => {
|
|
||||||
if (res.data.success) {
|
if (res.data.success) {
|
||||||
message.success(`模板操作成功`);
|
message.success(`模板${obj.type == 1 ? '发布' : obj.type == 0 ? '撤回' : '删除'}成功`)
|
||||||
getLibraryList();
|
getLibraryList();
|
||||||
}
|
}
|
||||||
|
}).catch((error) => {
|
||||||
|
message.error(`模板${obj.type == 1 ? '发布' : obj.type == 0 ? '撤回' : '删除'}失败` + error)
|
||||||
})
|
})
|
||||||
.catch((error) => {
|
}
|
||||||
message.error(`模板操作失败` + error);
|
|
||||||
});
|
|
||||||
};
|
|
||||||
const searchLevel = () => {
|
const searchLevel = () => {
|
||||||
const result = state.tableData1.filter(
|
state.tableData1 = [
|
||||||
(item) => item.name == state.value1
|
{
|
||||||
);
|
key: "1",
|
||||||
|
name: "测试模板1",
|
||||||
|
status: "已发布",
|
||||||
|
creator: "李部长",
|
||||||
|
stutime: "2022-10-31 23:12:00",
|
||||||
|
operation: "operation",
|
||||||
|
projectTemplateId: 1,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: "2",
|
||||||
|
name: "测试模板2",
|
||||||
|
status: "未发布",
|
||||||
|
creator: "李部长",
|
||||||
|
stutime: "2022-10-31 23:12:00",
|
||||||
|
operation: "operation",
|
||||||
|
projectTemplateId: 2,
|
||||||
|
}
|
||||||
|
];
|
||||||
|
const result = state.tableData1.filter(item => item.name.includes(state.value1))
|
||||||
state.tableData1 = result;
|
state.tableData1 = result;
|
||||||
|
getTableDate1()
|
||||||
};
|
};
|
||||||
const resetLevel = () => {
|
const resetLevel = () => {
|
||||||
state.value1 = "";
|
state.value1 = '';
|
||||||
// getLibraryList();
|
// getLibraryList();
|
||||||
state.tableData1 = [
|
state.tableData1 = [
|
||||||
{
|
{
|
||||||
@@ -280,6 +262,7 @@ export default defineComponent({
|
|||||||
creator: "李部长",
|
creator: "李部长",
|
||||||
stutime: "2022-10-31 23:12:00",
|
stutime: "2022-10-31 23:12:00",
|
||||||
operation: "operation",
|
operation: "operation",
|
||||||
|
projectTemplateId: 1,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
key: "2",
|
key: "2",
|
||||||
@@ -288,8 +271,10 @@ export default defineComponent({
|
|||||||
creator: "李部长",
|
creator: "李部长",
|
||||||
stutime: "2022-10-31 23:12:00",
|
stutime: "2022-10-31 23:12:00",
|
||||||
operation: "operation",
|
operation: "operation",
|
||||||
},
|
projectTemplateId: 2,
|
||||||
];
|
}
|
||||||
|
]
|
||||||
|
getTableDate1()
|
||||||
};
|
};
|
||||||
|
|
||||||
return {
|
return {
|
||||||
@@ -298,6 +283,7 @@ export default defineComponent({
|
|||||||
templateHadler,
|
templateHadler,
|
||||||
searchLevel,
|
searchLevel,
|
||||||
resetLevel,
|
resetLevel,
|
||||||
|
pagination,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
@@ -305,8 +291,10 @@ export default defineComponent({
|
|||||||
<style lang="scss">
|
<style lang="scss">
|
||||||
.templatelibrary {
|
.templatelibrary {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
|
||||||
.tmpl {
|
.tmpl {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
|
||||||
.tmpl_header {
|
.tmpl_header {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-wrap: wrap;
|
flex-wrap: wrap;
|
||||||
@@ -315,25 +303,30 @@ export default defineComponent({
|
|||||||
|
|
||||||
margin-left: 32px;
|
margin-left: 32px;
|
||||||
margin-right: 32px;
|
margin-right: 32px;
|
||||||
|
|
||||||
.tmplh_inp {
|
.tmplh_inp {
|
||||||
.inpbox {
|
.inpbox {
|
||||||
display: flex;
|
display: flex;
|
||||||
margin-top: 32px;
|
margin-top: 32px;
|
||||||
|
|
||||||
.inpbox1 {
|
.inpbox1 {
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
margin-right: 24px;
|
margin-right: 24px;
|
||||||
|
|
||||||
span {
|
span {
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.tmplh_btn {
|
.tmplh_btn {
|
||||||
display: flex;
|
display: flex;
|
||||||
margin-left: 38px;
|
margin-left: 38px;
|
||||||
margin-top: 32px;
|
margin-top: 32px;
|
||||||
|
|
||||||
.btn {
|
.btn {
|
||||||
padding: 0px 26px 0px 26px;
|
padding: 0px 26px 0px 26px;
|
||||||
height: 38px;
|
height: 38px;
|
||||||
@@ -344,72 +337,90 @@ export default defineComponent({
|
|||||||
margin-left: 14px;
|
margin-left: 14px;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
flex-shrink: 0;
|
flex-shrink: 0;
|
||||||
|
|
||||||
.search {
|
.search {
|
||||||
background-size: 100%;
|
background-size: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.btnText {
|
.btnText {
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
font-weight: 400;
|
font-weight: 400;
|
||||||
line-height: 36px;
|
line-height: 36px;
|
||||||
margin-left: 5px;
|
margin-left: 5px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.btnText1 {
|
.btnText1 {
|
||||||
color: rgb(255, 255, 255);
|
color: rgb(255, 255, 255);
|
||||||
}
|
}
|
||||||
|
|
||||||
.btnText2 {
|
.btnText2 {
|
||||||
color: rgba(64, 158, 255, 1);
|
color: rgba(64, 158, 255, 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.btn1 {
|
.btn1 {
|
||||||
background: #409eff;
|
background: #409eff;
|
||||||
|
|
||||||
.search {
|
.search {
|
||||||
width: 15px;
|
width: 15px;
|
||||||
height: 17px;
|
height: 17px;
|
||||||
background-image: url("../../assets/images/courseManage/search0.png");
|
background-image: url("../../assets/images/courseManage/search0.png");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.btn2 {
|
.btn2 {
|
||||||
background: #ffffff;
|
background: #ffffff;
|
||||||
border: 1px solid #388be1;
|
border: 1px solid #388be1;
|
||||||
|
|
||||||
.search {
|
.search {
|
||||||
width: 16px;
|
width: 16px;
|
||||||
height: 18px;
|
height: 18px;
|
||||||
background-image: url("../../assets/images/courseManage/reset1.png");
|
background-image: url("../../assets/images/courseManage/reset1.png");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.btn1:hover {
|
.btn1:hover {
|
||||||
background: rgb(255, 255, 255);
|
background: rgb(255, 255, 255);
|
||||||
border: 1px solid #388be1;
|
border: 1px solid #388be1;
|
||||||
|
|
||||||
.search {
|
.search {
|
||||||
background-image: url("../../assets/images/courseManage/search1.png");
|
background-image: url("../../assets/images/courseManage/search1.png");
|
||||||
}
|
}
|
||||||
|
|
||||||
.btnText {
|
.btnText {
|
||||||
color: rgba(64, 158, 255, 1);
|
color: rgba(64, 158, 255, 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.btn2:hover {
|
.btn2:hover {
|
||||||
background: rgba(64, 158, 255, 1);
|
background: rgba(64, 158, 255, 1);
|
||||||
|
|
||||||
.search {
|
.search {
|
||||||
background-image: url("../../assets/images/courseManage/reset0.png");
|
background-image: url("../../assets/images/courseManage/reset0.png");
|
||||||
}
|
}
|
||||||
|
|
||||||
.btnText {
|
.btnText {
|
||||||
color: #ffffff;
|
color: #ffffff;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.tmpl_body {
|
.tmpl_body {
|
||||||
padding: 0px 30px;
|
padding: 0px 30px;
|
||||||
|
|
||||||
.tmpl_tabbox {
|
.tmpl_tabbox {
|
||||||
.operation {
|
.operation {
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
color: #4ea6ff;
|
color: #4ea6ff;
|
||||||
|
|
||||||
.nselect {
|
.nselect {
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
display: flex;
|
display: flex;
|
||||||
|
|
||||||
.jc {
|
.jc {
|
||||||
margin-left: 20px;
|
margin-left: 20px;
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
|
|||||||
Reference in New Issue
Block a user