feat: 知识报送页面开发路由缓存

dev_1.0.0
xiangcongshuai 11 months ago
parent d4cb3d99f5
commit 51fc1a2b6d

@ -0,0 +1,50 @@
import { http } from "@/utils/http";
/** 查询知识库分页 */
export const queryKnowledgePage = (data?: object) => {
return http.request("get", "/know-sub/knowledge/queryKnowledgePage", {
params: data
});
};
/** 新增知识库*/
export const saveKnowledge = (data?: object) => {
return http.request("post", "/know-sub/knowledge/saveKnowledge", {
data
});
};
/** 修改知识库(*/
export const updateKnowledge = (data?: object) => {
return http.request("post", "/know-sub/knowledge/updateKnowledge", {
data
});
};
/** 分页查询部门信息列表 */
export const queryDeptManageList = (data?: object) => {
return http.request("get", "/know-sub/deptManage/list", {
params: data
});
};
/** 分页查询应用子库 */
export const queryApplicationSubLibrary = (data?: object) => {
return http.request("get", "/know-sub/applicationSubLibrary/list", {
params: data
});
};
/** 删除知识库 */
export const deleteKnowledge = (data?: object) => {
return http.request("get", "/know-sub/knowledge/deleteKnowledge", {
params: data
});
};
/** 查看知识的详细信息 */
export const queryKnowledgeDetail = (data?: object) => {
return http.request("get", "/know-sub/knowledge/queryKnowledgeDetail", {
params: data
});
};

@ -24,7 +24,7 @@ export type RefreshTokenResult = {
/** 登录 */
export const getLogin = (data?: object) => {
return http.request<UserResult>("post", "/virtual-patient/user/login", {
return http.request<UserResult>("post", "/know-sub/user/login", {
data
});
};

@ -15,7 +15,7 @@ export const queryCommonDictTree = (data?: object) => {
export const uploadFile = (data?: object) => {
return http.request(
"post",
"/virtual-patient-manage/fileManage/uploadFile",
"/know-sub/file/uploade",
{ data },
{ headers: { "Content-Type": "multipart/form-data" } }
);

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 MiB

After

Width:  |  Height:  |  Size: 2.0 MiB

@ -1,26 +1,37 @@
<template>
<div>
<div style="margin-top: 10px; border: 1px solid #ccc">
<Toolbar
:editor="editorRef"
:defaultConfig="toolbarConfig"
:mode="mode"
style="border-bottom: 1px solid #ccc"
/>
<Editor
:defaultConfig="editorConfig"
:mode="mode"
v-model="valueHtml"
style="height: 400px; overflow-y: auto"
@onCreated="handleCreated"
@onChange="handleChange"
@onDestroyed="handleDestroyed"
@onFocus="handleFocus"
@onBlur="handleBlur"
@customAlert="customAlert"
@customPaste="customPaste"
<div class="editor-main">
<Toolbar
:editor="editorRef"
:defaultConfig="toolbarConfig"
:mode="mode"
style="border-bottom: 1px solid #ccc"
/>
<div class="title">
<el-input
v-model="title"
class="title_input borderless-input"
maxlength="50"
placeholder="请输入标题"
show-word-limit
type="text"
/>
<div :class="[isError ? 'error_tip' : 'tip']">
<span v-if="isError"></span>
</div>
</div>
<Editor
class="editor-content"
:defaultConfig="editorConfig"
:mode="mode"
v-model="valueHtml"
@onCreated="handleCreated"
@onChange="handleChange"
@onDestroyed="handleDestroyed"
@onFocus="handleFocus"
@onBlur="handleBlur"
@customAlert="customAlert"
@customPaste="customPaste"
/>
</div>
</template>
@ -33,6 +44,8 @@ export default {
components: { Editor, Toolbar },
setup() {
const title = ref("");
const isError = ref(false);
// shallowRef
const editorRef = shallowRef();
@ -173,9 +186,14 @@ export default {
if (editor == null) return;
valueHtml.value = val;
};
const initTitle = val => {
title.value = val;
};
return {
editorRef,
mode: "simple",
title,
isError,
valueHtml,
toolbarConfig,
editorConfig,
@ -189,8 +207,49 @@ export default {
insertText,
printHtml,
disable,
initText
initText,
initTitle
};
}
};
</script>
<style lang="scss" scoped>
.editor-main {
.title {
height: 120px;
z-index: 9999999;
padding: 56px 80px 0 80px;
.title_input {
font-size: 28px;
color: #999999;
}
}
:deep(.el-input__wrapper) {
cursor: default;
border: none !important;
box-shadow: 0 0 0 0 var(--el-input-border-color, var(--el-border-color))
inset;
}
.error_tip {
width: 100%;
height: 24px;
border-bottom: 1px solid #ff3429;
display: flex;
flex-direction: row-reverse;
span {
font-size: 12px;
color: #ff3429;
}
}
.tip {
width: 100%;
height: 24px;
border-bottom: 1px solid #999999;
}
.editor-content {
margin: 0 80px;
height: 600px !important;
overflow: auto;
}
}
</style>

@ -9,8 +9,12 @@ import { onMounted } from "vue";
import { useRouter } from "vue-router";
import { getParentPaths } from "@/router/utils";
import { useTabsStore } from "@/store/modules/tabs";
import { da } from "element-plus/es/locale";
import IconParkOutline from "@iconify-icons/icon-park-outline/logout";
import { getUserInfo } from "@/utils/auth";
const { logout, userAvatar } = useNav();
import { CaretBottom } from "@element-plus/icons-vue";
const { route } = useNav();
const userName = ref("");
const router = useRouter();
const defaultActive = computed(() =>
!isAllEmpty(route.meta?.activePath) ? route.meta.activePath : route.path
@ -21,7 +25,8 @@ const menuData = computed(() => {
id: 0,
meta: {
title: "首页",
icon: 0
icon: 0,
showLink: true
},
children: [],
path: "/home"
@ -106,6 +111,21 @@ watch(
() => route.path,
() => {
getCurrentRoute();
if (route.path === "/home") return;
let flag = false;
for (const data of tabs.list) {
if (route.fullPath === data.path) {
flag = true;
}
}
if (!flag) {
tabs.setTabsItem({
name: route.name,
title: route.meta.title,
path: route.fullPath
});
}
},
{
deep: true
@ -114,21 +134,11 @@ watch(
const tabs = useTabsStore();
const changeRouter = item => {
router.push(item.path);
if (item.path === "/home") return;
let flag = false;
for (const data of tabs.list) {
if (item.path === data.path) {
flag = true;
}
}
if (!flag) {
tabs.setTabsItem({
name: item.name,
title: item.meta.title,
path: item.path
});
}
};
onMounted(() => {
const userInfo: any = getUserInfo();
userName.value = JSON.parse(userInfo).name;
});
</script>
<template>
@ -160,7 +170,9 @@ const changeRouter = item => {
v-for="(items, i) in item.children"
:key="i"
>
<span>{{ items.meta.title }}</span>
<span v-if="items?.meta?.showLink">{{
items.meta.title
}}</span>
</div>
</div>
</template>
@ -176,6 +188,22 @@ const changeRouter = item => {
</div>
</div>
</div>
<el-dropdown class="user-set" trigger="click">
<span class="user-set-main">
<!-- <img class="head" :src="userAvatar" :style="avatarsStyle" /> -->
<el-avatar :size="36" :src="userAvatar" />
<p>{{ "欢迎您,凯迪凯迪" }}</p>
<el-icon><CaretBottom /></el-icon>
</span>
<template #dropdown>
<el-dropdown-menu class="logout">
<el-dropdown-item @click="logout">
<IconifyIconOffline :icon="IconParkOutline" style="margin: 5px" />
退出系统
</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
</div>
</div>
</template>
@ -202,6 +230,8 @@ const changeRouter = item => {
}
.content {
margin-left: 116px;
position: relative;
flex: 1;
.meun_list {
display: flex;
.meun_item {
@ -225,6 +255,22 @@ const changeRouter = item => {
color: #0052d9;
}
}
.user-set {
position: absolute;
right: 0;
top: 0;
height: 36px;
.user-set-main {
display: flex;
align-items: center;
font-weight: 400;
font-size: 12px;
color: #333333;
span {
margin-left: 6px;
}
}
}
}
}
</style>

@ -3,7 +3,9 @@ import { useGlobal } from "@pureadmin/utils";
import backTop from "@/assets/svg/back_top.svg?component";
import { h, computed, Transition, defineComponent } from "vue";
import { usePermissionStoreHook } from "@/store/modules/permission";
import { useTabsStore } from "@/store/modules/tabs";
import { onMounted } from "vue";
const tabs = useTabsStore();
const props = defineProps({
fixedHeader: Boolean
});
@ -53,27 +55,19 @@ const transitionMain = defineComponent({
}
}
});
onMounted(() => {
console.log(tabs.nameList);
});
</script>
<template>
<section class="app-main">
<router-view>
<template #default="{ Component, route }">
<el-scrollbar>
<el-backtop title="回到顶部" target=".app-main .el-scrollbar__wrap">
<backTop />
</el-backtop>
<transitionMain :route="route">
<keep-alive>
<component
:is="Component"
:key="route.fullPath"
class="main-content"
/>
</keep-alive>
</transitionMain>
</el-scrollbar>
</template>
<router-view v-slot="{ Component }">
<transition name="move" mode="out-in">
<keep-alive :include="tabs.nameList">
<component :is="Component" />
</keep-alive>
</transition>
</router-view>
</section>
</template>

@ -34,6 +34,7 @@ const setTags = (route: any) => {
const isExist = tabs.list.some(item => {
return item.path === route.fullPath;
});
if (!isExist) {
tabs.setTabsItem({
name: route.name,

@ -100,7 +100,7 @@ onBeforeMount(() => {
min-width: 1500px;
height: 100vh;
min-height: 100%;
overflow-y: hidden;
/* main-content 属性动画 */
transition: margin-left var(--pure-transition-duration);

@ -124,7 +124,7 @@ router.beforeEach((to: ToRouteType, _from, next) => {
function toCorrectRoute() {
whiteList.includes(to.fullPath) ? next(_from.fullPath) : next();
}
if (userInfo?.roleCode) {
if (userInfo?.id) {
// 无权限跳转403页面
if (to.meta?.roles && !isOneOfArray(to.meta?.roles, userInfo?.roles)) {
next({ path: "/error/403" });

@ -1,5 +1,6 @@
export default {
path: "/knowledgeCentre",
name: "knowledgeCentre",
redirect: "/knowledgeCentre/submission",
meta: {
title: "知识中心",
@ -13,7 +14,44 @@ export default {
component: () => import("@/views/knowledgeCentre/submission/index.vue"),
meta: {
title: "知识报送",
showLink: true,
showParent: true,
roles: ["admin", "common"]
}
},
{
path: "/knowledgeCentre/addSubmission",
name: "addSubmission",
component: () =>
import("@/views/knowledgeCentre/submission/add/index.vue"),
meta: {
title: "新增",
showLink: false,
showParent: false,
roles: ["admin", "common"]
}
},
{
path: "/knowledgeCentre/editSubmission",
name: "editSubmission",
component: () =>
import("@/views/knowledgeCentre/submission/edit/index.vue"),
meta: {
title: "编辑",
showLink: false,
showParent: false,
roles: ["admin", "common"]
}
},
{
path: "/knowledgeCentre/approval",
name: "approval",
component: () => import("@/views/knowledgeCentre/approval/index.vue"),
meta: {
title: "知识审批",
showLink: true,
showParent: true,
roles: ["admin", "common"]

@ -0,0 +1,21 @@
import { defineStore } from "pinia";
import { store } from "@/store";
export const useKnowledgeCentreStore = defineStore({
id: "knowledgeCentre",
state: () => ({
departmentList: [],
applicationSubLibrary: []
}),
actions: {
getDepartmentList(data) {
this.departmentList = data;
},
getApplicationSubLibrary(data) {
this.applicationSubLibrary = data;
}
}
});
export function useKnowledgeCentreStoreHooks() {
return useKnowledgeCentreStore(store);
}

@ -186,3 +186,7 @@
overflow: auto;
}
.el-dialog__header {
padding: 0 !important;
margin: 0 !important;
}

@ -257,12 +257,28 @@ div:focus {
}
}
.footer-btn {
width: 188px;
height: 48px;
margin-bottom: 24px;
display: flex;
margin-top: 32px;
align-items: center;
justify-content: center;
.cancel_btn {
width: 140px;
height: 40px;
background: #FFFFFF;
box-shadow: 0px 2px 0px 0px rgba(0,0,0,0.04);
border-radius: 6px 6px 6px 6px;
border: 1px solid #0052D9;
font-size: 16px;
color: #0052D9;
line-height: 40px;
text-align: center;
margin-right: 32px;
cursor: pointer;
}
}
.el-dialog {
border-radius: 20px 20px 20px 20px !important;
border-radius: 6px 6px 6px 6px !important;
}
.el-dialog__footer {
text-align: center !important;

@ -75,7 +75,7 @@ class PureHttp {
return config;
}
/** 请求白名单放置一些不需要token的接口通过设置请求白名单防止token过期后再请求造成的死循环问题 */
const whiteList = ["/virtual-patient/user/login"];
const whiteList = ["/know-sub/user/login"];
return whiteList.some(v => config.url.indexOf(v) > -1)
? config
: new Promise(resolve => {

@ -0,0 +1,71 @@
<template>
<el-dialog
width="500"
append-to-body
v-model="dialogVisible"
:center="true"
custom-class="Approved"
><!-- 使用自定义头部组件 -->
<template v-slot:header>
<div class="Approved-header">
<img :src="successIcon" alt="" />
<span>确认审批通过</span>
</div>
</template>
<div class="Approved-content">
<div class="label">确定批量审批通过选中的报送内容</div>
<div class="footer-btn">
<div class="cancel_btn" @click="dialogVisible = false">取消</div>
<!-- <div class="determine_btn">确定</div> -->
<el-button
size="large"
@click="submit"
style="width: 140px; margin: 0"
class="footer-btn"
type="primary"
>确定</el-button
>
</div>
</div>
</el-dialog>
</template>
<script setup lang="ts">
import { ref } from "vue";
import successIcon from "@/assets/knowledge/success.png";
const dialogVisible = ref(false);
const reason = ref("");
defineExpose({
open(row) {
dialogVisible.value = true;
}
});
const closeDialog = () => {
dialogVisible.value = false;
};
</script>
<style lang="scss" scoped>
.Approved-header {
display: flex;
align-items: center;
padding: 0 24px;
height: 76px;
border-bottom: 1px solid rgba(91, 139, 255, 0.3);
position: relative;
width: 100%;
span {
font-weight: bold;
font-size: 20px;
color: #333333;
}
img {
width: 28px;
height: 28px;
margin-right: 16px;
}
}
:deep(.el-dialog__header) {
padding: 0;
margin: 0;
}
</style>

@ -0,0 +1,236 @@
<script setup lang="ts">
import { reactive, ref } from "vue";
import { ArrowDown } from "@element-plus/icons-vue";
import { useRouter } from "vue-router";
import TransferRecords from "../compontents/TransferRecords.vue";
import Details from "../compontents/Details.vue";
defineOptions({
name: "approval"
});
const loading = ref(false);
const seachForm = reactive({
title: "",
publishDeptName: "",
status: ""
});
const TransferRecordRef = ref();
const DetailsRef = ref();
const tabList = ref([
{
title: "待审批",
id: ""
},
{
title: "已审批",
id: "1"
}
]);
const pagination = reactive({
total: 0,
pageSize: 10,
currentPage: 1,
background: true
});
const columns: TableColumnList = [
{
type: "selection",
width: 55
},
{
label: "ID",
prop: "diseaseName"
},
{
label: "知识标题",
prop: "title",
slot: "titleSlot"
},
{
label: "发文部门",
prop: "diseaseName"
},
{
label: "状态",
prop: "diseaseName"
},
{
label: "最新时间",
prop: "diseaseName"
},
{
label: "操作",
fixed: "right",
width: 350,
slot: "operation"
}
];
const router = useRouter();
const dataList = ref([
{
title: "企业职工退休网上办理"
}
]);
const getData = async () => {
// const params = {
// pageNum: pagination.currentPage,
// pageSize: pagination.pageSize,
// diseaseName: seachForm.diseaseName,
// diseaseType: seachForm.diseaseType
// };
// const res: any = await queryPageList(params);
// dataList.value = res.data.records;
// pagination.total = res.data.total;
};
function handleSizeChange(val: number) {
pagination.pageSize = val;
getData();
}
function handleCurrentChange(val: number) {
pagination.currentPage = val;
getData();
}
const search = () => {
pagination.currentPage = 1;
pagination.pageSize = 10;
getData();
};
const reset = () => {
seachForm.title = "";
seachForm.publishDeptName = "";
search();
};
const handleCommand = command => {
console.log("Command", command);
};
const changeStatus = item => {
seachForm.status = item.id;
};
const add = () => {
router.push("/knowledgeCentre/addSubmission");
};
const openRecords = () => {
TransferRecordRef.value.open();
};
const openDetails = row => {
DetailsRef.value.open(row);
};
</script>
<template>
<div class="submission app-main-content">
<div class="seach">
<div class="seach-title"><span>知识审批</span></div>
<el-form :model="seachForm">
<el-row>
<el-form-item label="知识标题">
<el-input v-model="seachForm.title" />
</el-form-item>
<el-form-item class="ml-4" label="发文部门">
<el-input v-model="seachForm.publishDeptName" />
</el-form-item>
<el-button class="ml-8" @click="search" type="primary"
>搜索</el-button
>
<el-button @click="reset"></el-button>
</el-row>
</el-form>
</div>
<div class="main-table">
<div class="main-table-header">
<div class="tab-list">
<div
class="tab-list-item"
:class="[seachForm.status === item.id ? 'actived' : '']"
v-for="(item, index) in tabList"
:key="index"
@click="changeStatus(item)"
>
<span>{{ item.title }}</span>
</div>
</div>
<div class="header-btn">
<el-button @click="add" type="primary">批量通过</el-button>
<el-button @click="add" type="primary">批量驳回</el-button>
</div>
</div>
<pure-table
showOverflowTooltip
:data="dataList"
:columns="columns"
:header-cell-style="{
background: 'var(--el-table-row-hover-bg-color)',
color: 'var(--el-text-color-primary)'
}"
>
<template #operation="{ row }">
<el-button link type="primary" @click="openRecords(row)">
流转记录
</el-button>
</template>
<template #titleSlot="{ row }">
<span class="table-title" @click="openDetails(row)">{{
row.title
}}</span>
</template>
</pure-table>
</div>
<TransferRecords ref="TransferRecordRef" />
<Details ref="DetailsRef" />
</div>
</template>
<style lang="scss" scoped>
.submission {
.main-table-header {
display: flex;
margin-bottom: 24px;
justify-content: space-between;
border-bottom: 1px solid #dfe1e2;
.tab-list {
display: flex;
align-items: center;
position: relative;
top: 1px;
.tab-list-item {
padding: 16px 34px;
border: 1px solid #dfe1e2;
border-bottom: 0;
background: #f5f7f9;
font-size: 18px;
color: #333333;
cursor: pointer;
}
.actived {
background: #ffffff;
color: #0052d9;
border: 0;
border-top: 3px solid #0052d9;
}
}
.header-btn {
display: flex;
align-items: center;
}
.header-tabs {
}
.main-btn {
width: 142px;
height: 32px;
display: flex;
align-items: center;
justify-content: center;
background: #0052d9;
border-radius: 6px 6px 6px 6px;
font-size: 14px;
color: #ffffff;
}
}
.table-title {
font-size: 16px;
color: #0052d9;
cursor: pointer;
}
}
</style>

@ -0,0 +1,182 @@
<script setup lang="ts">
import { ref } from "vue";
defineOptions({
name: "SubmissionDetails"
});
const dialogVisible = ref(false);
const annexList = ref([
{
name: "PDF附件名称显示全部点击下载附件"
}
]);
defineExpose({
open(row) {
dialogVisible.value = true;
}
});
const closeDialog = () => {
dialogVisible.value = false;
};
</script>
<template>
<div>
<el-drawer
:size="1200"
append-to-body
v-model="dialogVisible"
:show-close="false"
:with-header="false"
:before-close="closeDialog"
custom-class="submission-details"
>
<div class="submission-details">
<div class="header-title">
<div class="tip" />
<span>知识详情</span>
</div>
<div class="line" />
<div class="main">
<div class="basicInfo">
<div class="basicInfo_title">基本信息</div>
<div class="basicInfo_item">
<span>{{ `发文部门部门1` }}</span>
</div>
<div class="basicInfo_item">
<span>{{ `显示来源:暂无` }}</span>
</div>
<div class="basicInfo_item">
<span>{{ `所属地区:深圳` }}</span>
</div>
<div class="basicInfo_item">
<span>{{ `发布日期2023年2月23日` }}</span>
</div>
<div class="basicInfo_item">
<span>{{ `时效性:长期有效` }}</span>
</div>
<div class="basicInfo_item">
<span>{{ `执行期限:系统带出` }}</span>
</div>
<div class="basicInfo_item">
<span>{{
`知识标签:系统带出系统带出系统带出系统带出系统带出系统带出`
}}</span>
</div>
<div class="basicInfo_item">
<span>{{ `政策类型:系统带出` }}</span>
</div>
<div class="basicInfo_item">
<span>{{ `公开范围:公开` }}</span>
</div>
</div>
<div class="main-content">
<div class="content-title">标题打造高效物流体系 畅通经济发展</div>
<div class="text">
知识详情市第十四次代表大会中指出以数字经济蓄势赋能推进数字产业化加快发展大数据云计算网络技术等产业打造一批工业互联网平台和数字经济园区大力发展现代服务业加快推进现代服务业与先进制造业深度融合完善现代物流体系今年以来高唐经济开发区以市场为导向以企业为主体着眼于未来发展和区位优势结合实际谋划好物流产业发展规划全面推进现代物流与产业融合发展
市第十四次代表大会中指出以数字经济蓄势赋能推进数字产业化加快发展大数据云计算网络技术等产业打造一批工业互联网平台和数字经济园区大力发展现代服务业加快推进现代服务业与先进制造业深度融合完善现代物流体系今年以来高唐经济开发区以市场为导向以企业为主体着眼于未来发展和区位优势结合实际谋划好物流产业发展规划全面推进现代物流与产业融合发展
市第十四次代表大会中指出以数字经济蓄势赋能推进数字产业化加快发展大数据云计算网络技术等产业打造一批工业互联网平台和数字经济园区大力发展现代服务业加快推进现代服务业与先进制造业深度融合完善现代物流体系今年以来高唐经济开发区以市场为导向以企业为主体着眼于未来发展和区位优势结合实际谋划好物流产业发展规划全面推进现代物流与产业融合发展
市第十四次代表大会中指出以数字经济蓄势赋能推进数字产业化加快发展大数据云计算网络技术等产业打造一批工业互联网平台和数字经济园区大力发展现代服务业加快推进现代服务业与先进制造业深度融合完善现代物流体系今年以来高唐经济开发区以市场为导向市第十四次代表大会中指出以数字经济蓄势赋能推进数字产业化加快发展大数据云计算网络技术等产业打造一批工业互联网平台和数字经济园区大力发展现代服务业加快推进现代服务业与先进制造业深度融合完善现代物流体系今年以来高唐经济开发区以市场为导向以企业为主体着眼于未来发展和区位优势结合实际谋划好物流产业发展规划全面推进现代物流与产业融合发展
市第十四次代表大会中指出以数字经济蓄势赋能推进数字产业化加快发展大数据云计算网络技术等产业打造一批工业互联网平台和数字经济园区大力发展现代服务业加快推进现代服务业与先进制造业深度融合完善现代物流体系今年以来高唐经济开发区以市场为导向
市第十四次代表大会中指出以数字经济蓄势赋能推进数字产业化加快发展大数据云计算网络技术等产业打造一批工业互联网平台和数字经济园区大力发展现代服务业加快推进现代服务业与先进制造业深度融合完善现代物流体系今年以来高唐经济开发区以市场为导向
今年以来高唐经济开发区以市场为导向
市第十四次代表大会中指出以数字经济蓄势赋能推进数字产业化加快发展大数据云计算网络技术等产业打造一批工业互联网平台和数字经济园区大力发展现代服务业加快推进现代服务业与先进制造业深度融合完善现代物流体系今年以来高唐经济开发区以市场为导向
</div>
<div class="annex">
<div
class="annex_item"
v-for="(item, index) in annexList"
:key="index"
>
<span>{{ `附件${index + 1}: ` }}</span>
<span class="link">{{ item.name }}</span>
</div>
</div>
</div>
</div>
</div>
</el-drawer>
</div>
</template>
<style lang="scss" scoped>
.submission-details {
padding-left: 16px;
height: 100%;
.header-title {
display: flex;
align-items: center;
// border-left: 6px solid #4287ff;
font-size: 20px;
font-weight: bold;
color: #2b3f54;
.tip {
width: 6px;
height: 20px;
margin-right: 10px;
line-height: 20px;
background: #4287ff;
}
}
.line {
position: relative;
left: -20px;
width: 1160px;
height: 1px;
margin-top: 24px;
background: rgb(91 139 255 / 30%);
}
.main {
display: flex;
height: 100%;
.basicInfo {
width: 350px;
padding: 24px 16px;
border-right: 1px solid rgba(91, 139, 255, 0.3);
height: 100%;
.basicInfo_title {
font-size: 20px;
color: #333333;
margin-bottom: 24px;
}
.basicInfo_item {
font-size: 16px;
color: #333333;
display: flex;
flex-wrap: wrap;
margin-bottom: 24px;
}
}
.main-content {
flex: 1;
padding: 32px 50px;
.content-title {
font-size: 36px;
color: #000000;
width: 100%;
text-align: center;
}
.text {
font-size: 16px;
color: #666666;
margin-top: 32px;
}
.annex {
margin-top: 75px;
.annex_item {
display: flex;
font-size: 16px;
color: #333333;
.link {
color: #0052d9;
}
}
}
}
}
}
</style>

@ -0,0 +1,102 @@
<template>
<el-dialog
width="600"
append-to-body
v-model="dialogVisible"
:center="true"
custom-class="KnowledgeDelete"
><!-- 使用自定义头部组件 -->
<template v-slot:header>
<div class="KnowledgeDelete-header">
<img :src="delIcon" alt="" />
<span>知识删除</span>
</div>
</template>
<div class="withdraw-content">
<div class="label">删除原因</div>
<el-input
v-model="reason"
maxlength="200"
:rows="4"
placeholder="请输入"
show-word-limit
type="textarea"
/>
<div class="footer-btn">
<div class="cancel_btn" @click="dialogVisible = false">取消</div>
<!-- <div class="determine_btn">确定</div> -->
<el-button
size="large"
@click="submit"
style="width: 140px; margin: 0"
class="footer-btn"
type="primary"
>确定</el-button
>
</div>
</div>
</el-dialog>
</template>
<script setup lang="ts">
import { ref } from "vue";
import delIcon from "@/assets/knowledge/del.png";
import { message } from "@/utils/message";
const dialogVisible = ref(false);
const reason = ref("");
defineExpose({
open(val) {
id.value = val;
dialogVisible.value = true;
}
});
const id = ref("");
const closeDialog = () => {
dialogVisible.value = false;
};
const emit = defineEmits(["delOk"]);
const submit = () => {
if (reason.value) {
emit("delOk", id.value, reason.value);
closeDialog();
} else {
message("请填写原因", { type: "error" });
}
};
</script>
<style lang="scss" scoped>
.KnowledgeDelete-header {
display: flex;
align-items: center;
padding: 0 24px;
height: 76px;
border-bottom: 1px solid rgba(91, 139, 255, 0.3);
position: relative;
width: 100%;
span {
font-weight: bold;
font-size: 20px;
color: #333333;
}
img {
width: 28px;
height: 28px;
margin-right: 16px;
}
}
:deep(.el-dialog__header) {
padding: 0;
margin: 0;
}
.withdraw-content {
.label {
font-size: 16px;
color: #333333;
margin-bottom: 16px;
}
.desc {
margin-top: 8px;
font-size: 14px;
color: #b4b4b4;
}
}
</style>

@ -0,0 +1,274 @@
<script setup lang="ts">
import { ref } from "vue";
defineOptions({
name: "TransferRecords"
});
const dialogVisible = ref(false);
const recordList = ref([
{
title: "知识报送",
status: 0,
time: "2024-03-12 12:24:23",
name: "刘小华",
department: "深圳市人力资源和社会保障局",
desc: "说明说明说明说明说明说明说明说明说明"
},
{
title: "驳回",
status: 1,
time: "2024-03-12 12:24:23",
name: "刘小华",
department: "深圳市人力资源和社会保障局",
desc: "说明说明说明说明说明说明说明说明说明"
},
{
title: "知识报送",
status: 0,
time: "2024-03-12 12:24:23",
name: "刘小华",
department: "深圳市人力资源和社会保障局",
desc: "说明说明说明说明说明说明说明说明说明"
},
{
title: "通过",
status: 2,
time: "2024-03-12 12:24:23",
name: "刘小华",
department: "深圳市人力资源和社会保障局",
desc: "说明说明说明说明说明说明说明说明说明"
},
{
title: "知识撤回",
status: 3,
time: "2024-03-12 12:24:23",
name: "刘小华",
department: "深圳市人力资源和社会保障局",
desc: "说明说明说明说明说明说明说明说明说明"
}
]);
defineExpose({
open() {
dialogVisible.value = true;
}
});
const closeDialog = () => {
dialogVisible.value = false;
};
const colorList = ["#0052D9", "#FF3429", "#00975E", "#FF9311"];
const getStatusColor = index => {
return {
borderColor: colorList[index]
};
};
</script>
<template>
<div>
<el-drawer
:size="900"
append-to-body
v-model="dialogVisible"
:show-close="false"
:with-header="false"
:before-close="closeDialog"
custom-class="TransferRecords"
>
<div class="TransferRecords">
<div class="header-title">
<div class="tip" />
<span>流转记录</span>
</div>
<div class="line" />
<div class="content">
<div class="content-title">知识标题知识标题</div>
<div class="record_list">
<div
class="record_list_item"
v-for="(item, index) in recordList"
:key="index"
>
<div class="step_item">
<div
:style="getStatusColor(item.status)"
class="step_item_drop"
/>
<div
v-if="index !== recordList.length - 1"
class="step_item_line"
/>
</div>
<div class="step_content">
<div class="step_content_head">
<span>{{ item.title }}</span>
<span class="time">{{ item.time }}</span>
</div>
<div class="step_content_item">
<span class="label">姓名</span>
<div class="value">{{ item.name }}</div>
</div>
<div class="step_content_item">
<span class="label">部门</span>
<div class="value">{{ item.department }}</div>
</div>
<div class="step_content_item">
<span class="label">说明</span>
<div class="value">{{ item.desc }}</div>
</div>
</div>
</div>
</div>
</div>
</div>
</el-drawer>
</div>
</template>
<style lang="scss" scoped>
.TransferRecords {
padding-left: 16px;
:deep(.el-form-item__label) {
font-weight: 400;
color: #333;
}
:deep(.hide .el-upload--picture-card) {
display: none;
}
.header-title {
display: flex;
align-items: center;
// border-left: 6px solid #4287ff;
font-size: 20px;
font-weight: bold;
color: #2b3f54;
.tip {
width: 6px;
height: 20px;
margin-right: 10px;
line-height: 20px;
background: #4287ff;
}
}
.line {
position: relative;
left: -20px;
width: 860px;
height: 1px;
margin: 24px 0;
background: rgb(91 139 255 / 30%);
}
.content {
margin-top: 20px;
.content-title {
font-size: 20px;
color: #333333;
margin-bottom: 40px;
}
.record_list {
margin-top: 40px;
.record_list_item {
display: flex;
.step_item {
display: flex;
flex-direction: column;
}
.step_item_drop {
width: 14px;
height: 14px;
background: #ffffff;
border-radius: 50%;
border: 3px solid #0052d9;
}
.step_item_line {
width: 1px;
flex: 1;
background: #d9d9d9;
position: relative;
left: 6px;
}
.step_content {
margin-left: 40px;
padding-bottom: 40px;
.step_content_head {
font-size: 18px;
color: #333333;
.time {
margin-left: 8px;
font-size: 16px;
color: #999999;
}
}
.step_content_item {
display: flex;
font-size: 16px;
color: #666666;
margin-top: 10px;
.label {
width: 48px;
}
.value {
flex: 1;
}
}
}
}
}
}
.footer_btn {
display: flex;
align-items: center;
justify-content: flex-end;
margin-top: 16px;
.reset {
width: 188px;
height: 48px;
margin-right: 24px;
font-size: 16px;
font-weight: 400;
line-height: 48px;
color: #4287ff;
text-align: center;
cursor: pointer;
background: #fff;
border: 1px solid #4287ff;
border-radius: 6px;
}
.main {
width: 188px;
height: 48px;
font-size: 16px;
line-height: 48px;
color: #fff;
text-align: center;
cursor: pointer;
background: #4287ff;
border: 1px solid #4287ff;
border-radius: 6px;
}
}
.upload_img {
position: relative;
width: 100%;
.tip {
position: absolute;
top: 50px;
left: 200px;
font-size: 12px;
font-weight: 400;
color: #b4b4b4;
}
}
}
</style>

@ -0,0 +1,93 @@
<template>
<el-dialog
width="600"
append-to-body
v-model="dialogVisible"
:center="true"
custom-class="withdraw"
><!-- 使用自定义头部组件 -->
<template v-slot:header>
<div class="withdraw-header">
<img :src="warnIcon" alt="" />
<span>知识撤回</span>
</div>
</template>
<div class="withdraw-content">
<div class="label">撤回原因</div>
<el-input
v-model="reason"
maxlength="200"
:rows="4"
placeholder="请输入"
show-word-limit
type="textarea"
/>
<div class="desc">
撤回内容将进入待审批状态支持编辑知识重新提交报送
</div>
<div class="footer-btn">
<div class="cancel_btn" @click="dialogVisible = false">取消</div>
<!-- <div class="determine_btn">确定</div> -->
<el-button
size="large"
@click="submit"
style="width: 140px; margin: 0"
class="footer-btn"
type="primary"
>确定</el-button
>
</div>
</div>
</el-dialog>
</template>
<script setup lang="ts">
import { ref } from "vue";
import warnIcon from "@/assets/knowledge/warn.png";
const dialogVisible = ref(false);
const reason = ref("");
defineExpose({
open(row) {
dialogVisible.value = true;
}
});
const closeDialog = () => {
dialogVisible.value = false;
};
</script>
<style lang="scss" scoped>
.withdraw-header {
display: flex;
align-items: center;
padding: 0 24px;
height: 76px;
border-bottom: 1px solid rgba(91, 139, 255, 0.3);
position: relative;
width: 100%;
span {
font-weight: bold;
font-size: 20px;
color: #333333;
}
img {
width: 28px;
height: 28px;
margin-right: 16px;
}
}
:deep(.el-dialog__header) {
padding: 0;
margin: 0;
}
.withdraw-content {
.label {
font-size: 16px;
color: #333333;
margin-bottom: 16px;
}
.desc {
margin-top: 8px;
font-size: 14px;
color: #b4b4b4;
}
}
</style>

@ -0,0 +1,513 @@
<script setup lang="ts">
import { ElMessage, UploadProps } from "element-plus";
import { computed, reactive, ref } from "vue";
import { Plus } from "@element-plus/icons-vue";
import WangEditor from "@/components/WangEditor/index.vue";
import { useKnowledgeCentreStoreHooks } from "@/store/modules/knowledgeCentre";
import { message } from "@/utils/message";
const ruleFormRef = ref();
const formData = reactive({
operate: "",
linkList: [
{
linkName: "",
linkUrl: ""
}
],
baseId: "",
execTime: undefined,
fileIdList: [],
excerpt: "",
publishDeptId: "",
knowledgeInfo: {
timeliness: undefined,
execTimeBegin: "",
execTimeEnd: "",
autoLoseEffect: undefined,
territory: "",
knowledgeTag: "",
policyType: "",
publishScope: "",
publishDate: undefined
},
fileList: []
});
defineExpose({
getDetails(data) {
refWangEditor.value.initText(data.knowledgeContext.context);
refWangEditor.value.initTitle(data.knowledge.title);
const fileIdList = [];
const fileList = [];
data.fileInfoList.forEach(e => {
fileIdList.push(e.fileBlobId);
fileList.push({
name: e.fileName
});
});
const { baseId, excerpt, publishDeptId } = data.knowledge;
const obj = {
operate: "",
linkList: data.knowledgeLinkList,
baseId,
execTime: [
data.knowledgeInfo.execTimeBegin,
data.knowledgeInfo.execTimeEnd
],
fileIdList,
excerpt,
publishDeptId,
knowledgeInfo: data.knowledgeInfo,
fileList
};
for (const key in obj) {
// eslint-disable-next-line no-prototype-builtins
if (formData.hasOwnProperty(key)) {
formData[key] = obj[key];
}
}
console.log(formData);
}
});
const departmentList = computed(() => {
return useKnowledgeCentreStoreHooks().departmentList;
});
const applicationSubLibrary = computed(() => {
return useKnowledgeCentreStoreHooks().applicationSubLibrary;
});
const refWangEditor = ref();
const rules = {
publishDeptId: [{ required: true, message: "请选择", trigger: "change" }],
baseId: [{ required: true, message: "请选择", trigger: "change" }],
"knowledgeInfo.publishDate": [
{ required: true, message: "请选择", trigger: "change" }
],
"knowledgeInfo.timeliness": [
{ required: true, message: "请选择", trigger: "change" }
]
};
const handleSuccess: UploadProps["onSuccess"] = response => {
if (response.code === 200) {
formData.fileIdList.push(response.data);
}
};
const handleRemove: UploadProps["onRemove"] = (file, uploadFiles) => {
console.log(file, uploadFiles);
const list = [];
for (const item of uploadFiles) {
list.push(item.response.data);
}
formData.fileIdList = list;
};
const beforeUpload: UploadProps["beforeUpload"] = async rawFile => {
// png|jpg 10M
const type = rawFile.name.split(".")[rawFile.name.split(".").length - 1];
if (rawFile.size / 1024 / 1024 > 10) {
ElMessage.error("大小不能大于10M");
return false;
}
// fileInfo.fileName = rawFile.name;
return true;
};
const addUrl = () => {
formData.linkList.push({
linkName: "",
linkUrl: ""
});
};
const delUrl = index => {
formData.linkList.splice(index, 1);
};
const emit = defineEmits(["save"]);
const save = async (type, formEl) => {
if (!refWangEditor.value.title || !refWangEditor.value.valueHtml) {
message("请填写标题和正文", { type: "error" });
return;
}
const { excerpt, fileIdList, linkList, publishDeptId, execTime, baseId } =
formData;
if (execTime && execTime.length > 0) {
formData.knowledgeInfo.execTimeBegin = execTime[0];
formData.knowledgeInfo.execTimeEnd = execTime[1];
}
const params = {
operate: type,
title: refWangEditor.value.title,
content: refWangEditor.value.valueHtml,
excerpt,
fileIdList,
linkList,
publishDeptId,
baseId,
knowledgeInfo: formData.knowledgeInfo
};
if (type === 2) {
formEl.validate(async (valid, fields) => {
if (valid) {
emit("save", params);
} else {
return fields;
}
});
} else {
emit("save", params);
}
};
const changeType = val => {
if (val === 1) {
formData.execTime = [];
}
};
const reset = () => {
ruleFormRef.value.resetFields();
formData.linkList = [
{
linkName: "",
linkUrl: ""
}
];
refWangEditor.value.initText("");
refWangEditor.value.initTitle("");
};
</script>
<template>
<div class="template-submission">
<el-scrollbar class="main-content" :show-scrollbar="false">
<el-form
ref="ruleFormRef"
:model="formData"
:rules="rules"
label-width="100px"
>
<div class="main-card">
<div class="main-card-title">
<span>报送知识</span>
</div>
<el-row>
<!-- <el-form-item class="ml-2" label="报送人姓名" prop="normalResult">
<el-input v-model="formData.normalResult" placeholder="请输入" />
</el-form-item>
<el-form-item class="ml-8" label="报送人部门" prop="normalResult">
<el-input v-model="formData.normalResult" placeholder="请输入" />
</el-form-item> -->
</el-row>
</div>
<div class="Editortext">
<WangEditor ref="refWangEditor" />
</div>
<div class="main-card">
<el-row>
<el-col :span="24">
<el-form-item label="摘要" prop="excerpt">
<el-input
size="large"
v-model="formData.excerpt"
placeholder="请输入"
/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="相关附件" prop="fileList">
<el-upload
:file-list="formData.fileList"
:limit="5"
multiple
action="/know-sub/file/upload"
:on-success="handleSuccess"
:on-remove="handleRemove"
:before-upload="beforeUpload"
>
<div class="upload-btn">
<el-icon><Plus class="upload-btn-icon" /></el-icon>
<span>上传素材</span>
</div>
</el-upload>
</el-form-item>
</el-col>
</el-row>
<el-form-item label="相关链接">
<div
class="url_list"
v-for="(item, index) in formData.linkList"
:key="index"
>
<el-row class="url_list_item">
<el-input
size="large"
style="width: 500px"
v-model="formData.linkList[index].linkName"
placeholder="请输入链接标题"
/>
<el-input
style="width: 600px; margin-left: 16px"
size="large"
v-model="formData.linkList[index].linkUrl"
placeholder="请输入链接"
><template #append>URL</template></el-input
>
<div v-if="index === 0" class="add_url" @click="addUrl">
<el-icon><Plus class="upload-btn-icon" /></el-icon>
<span>添加链接</span>
</div>
<div v-else @click="delUrl(index)" class="del_url">
<span>删除</span>
</div>
</el-row>
</div>
</el-form-item>
</div>
<div class="main-card">
<el-row>
<el-col :span="24">
<el-form-item label="发文部门" prop="publishDeptId">
<el-select
size="large"
filterable
v-model="formData.publishDeptId"
placeholder="请选择"
>
<el-option
v-for="item in departmentList"
:key="item.id"
:label="item.deptName"
:value="item.id"
/>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="应用子库" prop="baseId">
<el-select
size="large"
filterable
v-model="formData.baseId"
placeholder="请选择"
>
<el-option
v-for="item in applicationSubLibrary"
:key="item.id"
:label="item.baseName"
:value="item.id"
/>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="发布日期" prop="knowledgeInfo.publishDate">
<el-date-picker
v-model="formData.knowledgeInfo.publishDate"
type="date"
value-format="YYYY-MM-DD"
placeholder="请选择"
size="large"
/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-form-item label="有效日期" prop="knowledgeInfo.timeliness">
<el-radio-group
@change="changeType"
v-model="formData.knowledgeInfo.timeliness"
class="ml-4"
>
<el-radio :label="1" size="large">长期有效</el-radio>
<el-radio :label="2" size="large">临时有效</el-radio>
</el-radio-group>
<el-date-picker
v-if="formData.knowledgeInfo.timeliness === 2"
class="ml-4"
v-model="formData.execTime"
value-format="YYYY-MM-DD"
type="daterange"
range-separator="至"
start-placeholder="有效开始时间"
end-placeholder="有效结束时间"
size="large"
/>
<!-- <el-checkbox
class="ml-4"
:true-label="1"
:false-label="0"
v-model="formData.knowledgeInfo.autoLoseEffect"
label="到期自动失效"
size="large"
/> -->
</el-form-item>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="所属地域" prop="knowledgeInfo.territory">
<el-input
size="large"
v-model="formData.knowledgeInfo.territory"
placeholder="请输入"
/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="知识标签" prop="knowledgeInfo.knowledgeTag">
<el-input
size="large"
v-model="formData.knowledgeInfo.knowledgeTag"
placeholder="请输入"
/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="政策类型" prop="knowledgeInfo.policyType">
<el-input
size="large"
v-model="formData.knowledgeInfo.policyType"
placeholder="请输入"
/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="公开范围" prop="knowledgeInfo.publishScope">
<el-radio-group
v-model="formData.knowledgeInfo.publishScope"
class="ml-4"
>
<el-radio :label="0" size="large">公开</el-radio>
<el-radio :label="1" size="large">不公开</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
</el-row>
</div>
</el-form>
</el-scrollbar>
<div class="footer-content">
<el-button
@click="save(2, ruleFormRef)"
size="large"
style="width: 150px; height: 50px"
type="primary"
>发布</el-button
>
<div class="normal_btn" @click="save(1, ruleFormRef)">存草稿</div>
<span class="reset_btn" @click="reset"></span>
</div>
</div>
</template>
<style lang="scss" scoped>
.template-submission {
margin: 0 80px;
.main-content {
height: calc(100vh - 280px);
overflow: auto;
.main-card {
width: 100%;
background: #ffffff;
border-radius: 6px 6px 6px 6px;
margin-bottom: 16px;
padding: 24px;
.main-card-title {
margin-bottom: 24px;
span {
font-size: 24px;
color: #333333;
padding-left: 8px;
border-left: 6px solid #0052d9;
}
}
.upload-btn {
width: 140px;
height: 50px;
background: #ffffff;
border-radius: 6px 6px 6px 6px;
border: 1px solid #0052d9;
font-size: 16px;
color: #0052d9;
display: flex;
align-items: center;
justify-content: center;
.upload-btn-icon {
color: #0052d9;
}
}
}
}
.url_list {
.url_list_item {
display: flex;
margin-bottom: 32px;
.add_url {
display: flex;
align-items: center;
justify-content: center;
margin-left: 16px;
font-size: 16px;
color: #0052d9;
cursor: pointer;
}
.del_url {
display: flex;
align-items: center;
justify-content: center;
margin-left: 16px;
font-size: 16px;
color: #999999;
cursor: pointer;
}
}
}
.footer-content {
width: 100%;
height: 99px;
box-shadow: 0px 0px 16px 0px rgba(0, 0, 0, 0.1);
background: #ffffff;
border-radius: 6px 6px 6px 6px;
display: flex;
align-items: center;
flex-direction: row-reverse;
padding: 24px;
margin-top: 16px;
.normal_btn {
width: 150px;
height: 50px;
border-radius: 6px 6px 6px 6px;
border: 1px solid #0052d9;
line-height: 50px;
text-align: center;
font-size: 16px;
color: #0052d9;
margin-right: 40px;
cursor: pointer;
}
.reset_btn {
margin-right: 40px;
font-size: 16px;
color: #999999;
cursor: pointer;
}
}
.Editortext {
background: #ffffff;
border-radius: 6px 6px 6px 6px;
margin-bottom: 16px;
}
}
</style>

@ -0,0 +1,13 @@
<script setup lang="ts">
import WangEditor from "@/components/WangEditor/index.vue";
import { ref } from "vue";
const refWangEditor = ref();
</script>
<template>
<div class="Editortext">
<WangEditor ref="refWangEditor" />
</div>
</template>
<style lang="scss" scoped></style>

@ -0,0 +1,29 @@
<script setup lang="ts">
import MainTemplate from "../MainTemplate.vue";
import { saveKnowledge } from "@/api/knowledgeCentre";
import { useTabsStore } from "@/store/modules/tabs";
import { message } from "@/utils/message";
import { useRoute, useRouter } from "vue-router";
defineOptions({
name: "addSubmission"
});
const router = useRouter();
const route = useRoute();
const tabs = useTabsStore();
const save = async params => {
const res: any = await saveKnowledge(params);
if (res.code === 200) {
message("新增成功", { type: "success" });
tabs.closeCurrentTag({
$router: router,
$route: route
});
}
};
</script>
<template>
<div>
<MainTemplate @save="save" />
</div>
</template>

@ -0,0 +1,44 @@
<script setup lang="ts">
import MainTemplate from "../MainTemplate.vue";
import { updateKnowledge, queryKnowledgeDetail } from "@/api/knowledgeCentre";
import { useTabsStore } from "@/store/modules/tabs";
import { message } from "@/utils/message";
import { onMounted, ref } from "vue";
import { useRoute, useRouter } from "vue-router";
defineOptions({
name: "editSubmission"
});
const router = useRouter();
const route = useRoute();
const tabs = useTabsStore();
const MainTemplateRef = ref();
const save = async params => {
const res: any = await updateKnowledge({
...params,
knowledgeId: route.query.id
});
if (res.code === 200) {
message("编辑成功", { type: "success" });
tabs.closeCurrentTag({
$router: router,
$route: route
});
}
};
const getDeatils = async () => {
const res: any = await queryKnowledgeDetail({
knowledgeId: route.query.id
});
MainTemplateRef.value.getDetails(res.data);
};
onMounted(() => {
getDeatils();
});
</script>
<template>
<div>
<MainTemplate ref="MainTemplateRef" @save="save" />
</div>
</template>

@ -1,12 +1,81 @@
<script setup lang="ts">
import { reactive, ref } from "vue";
import { ArrowDown } from "@element-plus/icons-vue";
import { useRouter } from "vue-router";
import TransferRecords from "../compontents/TransferRecords.vue";
import Details from "../compontents/Details.vue";
import withdraw from "../compontents/withdraw.vue";
import KnowledgeDelete from "../compontents/KnowledgeDelete.vue";
import { useKnowledgeCentreStoreHooks } from "@/store/modules/knowledgeCentre";
import {
queryKnowledgePage,
queryDeptManageList,
queryApplicationSubLibrary,
deleteKnowledge
} from "@/api/knowledgeCentre";
import { clearObject } from "@/utils/auth";
import { onMounted } from "vue";
import { onActivated } from "vue";
import { message } from "@/utils/message";
defineOptions({
name: "submission"
});
const loading = ref(false);
const seachForm = reactive({
title: "",
publishDeptName: "",
status: ""
publishDeptId: "",
submittedDeptId: "",
status: "",
baseId: "",
publishDateBegin: "",
publishDateEnd: "",
time: []
});
const statusList = [
{
key: 1,
name: "草稿"
},
{
key: 2,
name: "通过"
},
{
key: 3,
name: "驳回"
},
{
key: 4,
name: "已撤回"
},
{
key: 5,
name: "已失效"
},
{
key: 6,
name: "已删除"
},
{
key: 10,
name: "待审批(新增)"
},
{
key: 11,
name: "待审批(删除)"
},
{
key: 12,
name: "待审批(撤回)"
}
];
const departmentList = ref([]);
const applicationSubLibrary = ref([]);
const TransferRecordRef = ref();
const DetailsRef = ref();
const withdrawRef = ref();
const KnowledgeDeleteRef = ref();
const tabList = ref([
{
title: "全部",
@ -45,24 +114,44 @@ const columns: TableColumnList = [
width: 55
},
{
label: "ID",
prop: "diseaseName"
label: "序号",
type: "index",
width: 80
},
{
label: "知识标题",
prop: "diseaseName"
prop: "title",
slot: "titleSlot"
},
{
label: "发文部门",
prop: "diseaseName"
prop: "publishDeptName"
},
{
label: "应用子库",
prop: "baseName"
},
{
label: "知识来源",
prop: "diseaseName",
formatter: ({ knowledgeFrom }) => {
return knowledgeFrom === 1 ? "人工添加" : "";
}
},
{
label: "状态",
prop: "diseaseName"
prop: "diseaseName",
formatter: ({ status }) => {
return getStatusName(status);
}
},
{
label: "报送部门",
prop: "submitDeptName"
},
{
label: "最新时间",
prop: "diseaseName"
prop: "updateTime"
},
{
label: "操作",
@ -71,17 +160,35 @@ const columns: TableColumnList = [
slot: "operation"
}
];
const dataList = ref([{}]);
const getStatusName = key => {
for (const item of statusList) {
if (key === item.key) {
return item.name;
}
}
};
const router = useRouter();
const dataList = ref([
{
title: "企业职工退休网上办理"
}
]);
const getData = async () => {
// const params = {
// pageNum: pagination.currentPage,
// pageSize: pagination.pageSize,
// diseaseName: seachForm.diseaseName,
// diseaseType: seachForm.diseaseType
// };
// const res: any = await queryPageList(params);
// dataList.value = res.data.records;
// pagination.total = res.data.total;
if (seachForm.time && seachForm.time.length > 0) {
seachForm.publishDateBegin = seachForm.time[0];
seachForm.publishDateEnd = seachForm.time[1];
} else {
seachForm.publishDateBegin = "";
seachForm.publishDateEnd = "";
}
const params = {
pageNum: pagination.currentPage,
pageSize: pagination.pageSize,
...seachForm
};
const res: any = await queryKnowledgePage(params);
dataList.value = res.data.records;
pagination.total = res.data.total;
};
function handleSizeChange(val: number) {
pagination.pageSize = val;
@ -99,34 +206,145 @@ const search = () => {
};
const reset = () => {
seachForm.diseaseName = "";
seachForm.diseaseType = "";
clearObject(seachForm);
search();
};
const handleCommand = command => {
console.log("Command", command);
};
const changeStatus = item => {
seachForm.status = item.id;
};
const add = () => {
router.push("/knowledgeCentre/addSubmission");
};
const handleEdit = row => {
router.push({
path: "/knowledgeCentre/editSubmission",
query: {
id: row.id
}
});
};
const openRecords = () => {
TransferRecordRef.value.open();
};
const openDetails = row => {
DetailsRef.value.open(row);
};
const openWithdraw = row => {
withdrawRef.value.open(row);
};
const handleDelete = row => {
KnowledgeDeleteRef.value.open(row.id);
};
const getDepartmentList = async () => {
const res: any = await queryDeptManageList({
pageNum: 1,
pageSize: 999999
});
if (res.code === 200) {
departmentList.value = res.data.records;
useKnowledgeCentreStoreHooks().getDepartmentList(departmentList.value);
}
};
const getApplicationSubLibrary = async () => {
const res: any = await queryApplicationSubLibrary({
pageNum: 1,
pageSize: 999999
});
if (res.code === 200) {
applicationSubLibrary.value = res.data.records;
useKnowledgeCentreStoreHooks().getApplicationSubLibrary(
applicationSubLibrary.value
);
}
};
const del = async (id, val) => {
const res: any = await deleteKnowledge({
knowledgeId: id,
remark: val
});
if (res.code === 200) {
message("删除成功", { type: "success" });
search();
}
};
onActivated(() => {
search();
});
onMounted(() => {
getDepartmentList();
getApplicationSubLibrary();
getData();
});
</script>
<template>
<div class="submission app-main-content">
<div class="seach">
<div class="seach-title"><span>全量知识</span></div>
<el-form :model="seachForm">
<el-form label-width="100px" :model="seachForm">
<el-row>
<el-col :span="8">
<el-form-item label="知识标题">
<el-input
style="width: 390px"
size="large"
v-model="seachForm.title"
/> </el-form-item
></el-col>
<el-col :span="8"
><el-form-item label="发文部门">
<el-select
size="large"
style="width: 390px"
filterable
v-model="seachForm.publishDeptId"
placeholder="请选择"
>
<el-option
v-for="item in departmentList"
:key="item.id"
:label="item.deptName"
:value="item.id"
/>
</el-select> </el-form-item
></el-col>
<el-col :span="8"
><el-form-item label="应用子库">
<el-select
size="large"
style="width: 390px"
filterable
v-model="seachForm.baseId"
placeholder="请选择"
>
<el-option
v-for="item in applicationSubLibrary"
:key="item.id"
:label="item.baseName"
:value="item.id"
/>
</el-select> </el-form-item
></el-col>
</el-row>
<el-row>
<el-form-item label="知识标题">
<el-input v-model="seachForm.title" />
</el-form-item>
<el-form-item class="ml-4" label="发文部门">
<el-input v-model="seachForm.publishDeptName" />
</el-form-item>
<el-button class="ml-8" @click="search" type="primary"
<el-col :span="8">
<el-form-item label="发文时间">
<el-date-picker
style="width: 390px"
start-placeholder="开始时间"
end-placeholder="结束时间"
format="YYYY-MM-DD HH:mm:ss"
v-model="seachForm.time"
type="datetimerange"
value-format="YYYY-MM-DD HH:mm:ss"
placeholder="请选择"
size="large" /></el-form-item
></el-col>
<el-button size="large" class="ml-8" @click="search" type="primary"
>搜索</el-button
>
<el-button @click="reset"></el-button>
<el-button size="large" @click="reset"></el-button>
</el-row>
</el-form>
</div>
@ -144,15 +362,17 @@ const changeStatus = item => {
</div>
</div>
<div class="header-btn">
<el-button @click="search" type="primary">新建报送</el-button>
<el-button @click="add" size="large" type="primary"
>新建报送</el-button
>
<el-dropdown trigger="click" class="ml-6">
<div class="main-btn">
<span class="mr-4">批量操作</span>
<span class="mr-3">批量操作</span>
<el-icon><ArrowDown style="color: #ffffff" /></el-icon>
</div>
<template #dropdown>
<el-dropdown-menu class="logout">
<el-dropdown-item @click="del"> </el-dropdown-item>
<el-dropdown-item> 删除 </el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
@ -168,16 +388,37 @@ const changeStatus = item => {
}"
>
<template #operation="{ row }">
<el-button link type="primary" @click="openRecords(row)">
流转记录
</el-button>
<el-button link type="primary" @click="handleEdit(row)">
编辑
</el-button>
<el-button link type="primary" @click="openWithdraw(row)">
撤回
</el-button>
<el-button link type="danger" @click="handleDelete(row)">
删除
</el-button>
</template></pure-table
>
</template>
<template #titleSlot="{ row }">
<span class="table-title" @click="openDetails(row)">{{
row.title
}}</span>
</template>
</pure-table>
</div>
<TransferRecords ref="TransferRecordRef" />
<Details ref="DetailsRef" />
<withdraw ref="withdrawRef" />
<KnowledgeDelete @delOk="del" ref="KnowledgeDeleteRef" />
</div>
</template>
<style lang="scss" scoped>
.submission {
:deep(.el-form-item) {
align-items: center;
}
.main-table-header {
display: flex;
margin-bottom: 24px;
@ -213,7 +454,7 @@ const changeStatus = item => {
}
.main-btn {
width: 142px;
height: 32px;
height: 40px;
display: flex;
align-items: center;
justify-content: center;
@ -223,5 +464,10 @@ const changeStatus = item => {
color: #ffffff;
}
}
.table-title {
font-size: 16px;
color: #0052d9;
cursor: pointer;
}
}
</style>

@ -43,37 +43,30 @@ const onLogin = async (formEl: FormInstance | undefined) => {
if (!formEl) return;
await formEl.validate((valid, fields) => {
if (valid) {
setUserInfo({
roleCode: "1"
});
initRouter().then(() => {
router.push("/home");
});
// useUserStoreHook()
// .loginByUsername({
// userAccount: ruleForm.username,
// password: ruleForm.password
// })
// .then((res: any) => {
// loading.value = false;
// if (res.code === 200) {
// if (res.data.roleCode === "1") {
// // initRouter().then(() => {
// // router.push("/selectCase");
// // });
// } else {
// // initRouter().then(() => {
// // router.push("/inquiryCase");
// // });
// }
// message("", { type: "success" });
// }
// })
// .catch(() => {
// loading.value = false;
// message("", { type: "error" });
// });
// initRouter().then(() => {
// router.push("/home");
// });
useUserStoreHook()
.loginByUsername({
userAccount: ruleForm.username,
password: ruleForm.password
})
.then((res: any) => {
loading.value = false;
if (res.code === 200) {
// setUserInfo({
// roleId: res.data.userRoleDTOList[0].roleId
// });
initRouter().then(() => {
router.push("/home");
});
message("登录成功", { type: "success" });
}
})
.catch(() => {
loading.value = false;
message("登录失败", { type: "error" });
});
} else {
loading.value = false;
return fields;
@ -116,13 +109,13 @@ onBeforeUnmount(() => {
<div class="login-container">
<div class="login-left">
<span class="login-left-title">欢迎使用</span>
<span class="systeam-name">虚拟病人系统</span>
<span class="desc">Welcome to the Virtual Patient System</span>
<span class="systeam-name">深圳知识报送系统</span>
<span class="desc">Welcome to the system</span>
</div>
<div class="login-box">
<div class="login-form">
<div class="top">
<p class="title">欢迎登录虚拟病人系统</p>
<p class="title">欢迎登录</p>
<p class="top_desc">Welcome to login</p>
</div>

@ -45,8 +45,8 @@ export default ({ command, mode }: ConfigEnv): UserConfigExport => {
// 本地跨域代理 https://cn.vitejs.dev/config/server-options.html#server-proxy
proxy: {
// 类型: Record<string, string | ProxyOp 为开发服务器配置自定义代理规则
"/virtual-patient-manage/": {
target: "http://192.168.10.137:8891/",
"/know-sub/": {
target: "http://192.168.10.27:9201/",
changeOrigin: true,
secure: false
// eslint-disable-next-line no-shadow

Loading…
Cancel
Save