This commit is contained in:
zhaoyz 2024-04-28 18:08:16 +08:00
parent 7a6a21c52b
commit 0ef6c81f36
9 changed files with 395 additions and 245 deletions

View File

@ -28,7 +28,7 @@ export function handleHttpUploadUrl(options: any, url: string | undefined) {
let formData = new FormData();
formData.append('file', options.file);
formData.append('dir', options.dir)
return new Promise((resolve, reject) => {
return new Promise((resolve) => {
try {
request({
url: url,
@ -41,7 +41,7 @@ export function handleHttpUploadUrl(options: any, url: string | undefined) {
resolve(res.data)
});
} catch (error) {
reject(error)
resolve(error)
}
})
}

View File

@ -27,6 +27,16 @@ export function addRole(role: any) {
})
}
export function updateRole(role: any) {
return new Promise(resolve => {
request.put(roleUrl, role).then(res => {
resolve(res.data);
}).catch(err => {
resolve(err);
})
})
}
export function saveRoleMenus(roleId: string, menuIds: string) {
return new Promise(resolve => {
request.put(saveRoleMenuUrl, {roleId, menuIds})
@ -48,3 +58,14 @@ export function getDetails(id: string) {
})
}
export function deleteById(ids: []) {
return new Promise(resolve => {
request.delete(roleUrl, {data: ids})
.then(res => {
resolve(res.data)
}).catch(err => {
resolve(err);
});
})
}

29
src/api/sys-message.ts Normal file
View File

@ -0,0 +1,29 @@
import request from "@/utils/request";
const saveUrl = "/admin/sysMessage/save";
const pageUrl = "/admin/sysMessage/page";
export function save(message: any, organization?: [], permissions?: []) {
return new Promise(resolve => {
request.postForm(saveUrl, message).then(res => {
resolve(res.data);
}).catch(err => {
resolve(err);
})
})
}
export function page(current: number, size: number, condition?: {category: string, message: string}) {
return new Promise(resolve => {
request.postForm(pageUrl, {
current: current,
size: size,
category: condition?.category,
message: condition?.message
}).then(res => {
resolve(res.data)
}).catch(err => {
resolve(err);
})
})
}

View File

@ -62,15 +62,19 @@ const importData = () => {
return
}
uploadRef.value.submit()
ElMessage.success('上传成功')
close()
emit('success')
// emit('error')
}
function handleUpload(options: any) {
handleHttpUploadUrl(options, props.importUrl).then((res: any) => {
console.log(res)
if (res.code == 0) {
ElMessage.success('上传成功')
close()
emit('success')
} else {
ElMessage.error(res.msg ? res.msg : "上传失败")
emit("error");
}
})
}

View File

@ -1,139 +1,153 @@
<template>
<el-form ref="formRef" :model="formData" :rules="rules" label-width="100">
<el-form-item label="消息类型" prop="type">
<el-select v-model="formData.type" placeholder="请选择消息类型">
<el-option v-for="item in getMessageType()" :key="item.value" :label="item.label"
:value="item.value" />
</el-select>
</el-form-item>
<el-form-item label="所在医院" prop="hospital">
<el-select v-model="formData.hospital" placeholder="请选择医院">
<el-option v-for="item in hospitals" :key="item.value" :label="item.label"
:value="item.value" />
</el-select>
</el-form-item>
<el-form-item label="消息内容" prop="content">
<el-input v-model="formData.content" type="textarea" :rows="4" placeholder="请输入消息内容"></el-input>
</el-form-item>
<el-form-item label="可见组织" prop="showDept">
<el-select v-model="formData.showDept" multiple placeholder="请选择组织">
<el-option v-for="item in hospitals" :key="item.value" :label="item.label"
:value="item.value" />
</el-select>
</el-form-item>
<el-form-item label="组织权限" prop="permissions">
<el-select v-model="formData.permissions" placeholder="请选择组织权限">
<el-option v-for="item in [{value: 'default', label: '当前组织和下一组织可见'}]" :key="item.value" :label="item.label"
:value="item.value" />
</el-select>
</el-form-item>
<el-form-item label="跳转链接" prop="link">
<el-input v-model="formData.link" placeholder="跳转链接"></el-input>
</el-form-item>
<el-form-item label="是否热点" prop="isHot">
<el-switch v-model="formData.isHot" />
</el-form-item>
<el-form ref="formRef" :model="formData" :rules="rules" label-width="100">
<el-form-item label="消息类型" prop="category">
<el-select v-model="formData.category" placeholder="请选择消息类型">
<el-option v-for="item in getMessageType()" :key="item.value" :label="item.label"
:value="item.value"/>
</el-select>
</el-form-item>
<!-- <el-form-item label="所在医院" prop="hospital">
<el-select v-model="formData.hospital" placeholder="请选择医院">
<el-option v-for="item in hospitals" :key="item.id" :label="item.name"
:value="item.id"/>
</el-select>
</el-form-item>-->
<el-form-item label="消息内容" prop="message">
<el-input v-model="formData.message" type="textarea" :rows="4" placeholder="请输入消息内容"></el-input>
</el-form-item>
<!-- <el-form-item label="可见组织" prop="organization">
<el-select v-model="formData.organization" multiple placeholder="请选择组织">
<el-option v-for="item in hospitals" :key="item.id" :label="item.name"
:value="item.id"/>
</el-select>
</el-form-item>-->
<!-- <el-form-item label="组织权限" prop="permissions">
<el-select v-model="formData.permissions" placeholder="请选择组织权限">
<el-option v-for="item in [{value: 'default', label: '当前组织和下一组织可见'}]" :key="item.value"
:label="item.label"
:value="item.value"/>
</el-select>
</el-form-item>-->
<el-form-item label="跳转链接" prop="href">
<el-input v-model="formData.href" placeholder="跳转链接"></el-input>
</el-form-item>
<el-form-item label="是否热点" prop="hotspots">
<el-switch v-model="formData.hotspots"/>
</el-form-item>
<div style="text-align: right;">
<el-button class="f18" @click="close">取消</el-button>
<el-button class="f18" type="primary" @click="saveData">确认</el-button>
</div>
</el-form>
<div style="text-align: right;">
<el-button class="f18" @click="close">取消</el-button>
<el-button class="f18" type="primary" @click="saveData">确认</el-button>
</div>
</el-form>
</template>
<script lang='ts' setup>
import { onMounted, reactive, ref, toRefs, watch } from 'vue'
import { ElMessage, ElMessageBox } from 'element-plus'
import { getHospitalsData, getMessageType } from '@/static-data/core'
import {onMounted, reactive, ref} from 'vue'
import {ElMessage} from 'element-plus'
import {getMessageType} from '@/static-data/core'
import * as hospitalApi from "@/api/hospital";
import * as sysMessageApi from "@/api/sys-message";
const emit = defineEmits(['close'])
const props = defineProps({
type: String
type: String
})
const rules = reactive({
type: [
{ required: true, message: '请选择类型', trigger: ['blur', 'change'] },
],
hospital: [
{ required: true, message: '请选择医院', trigger: ['blur', 'change'] },
],
content: [
{ required: true, message: '请输入消息内容', trigger: ['blur', 'change'] },
],
showDept: [
{ required: true, message: '请选择可见组织', trigger: ['blur', 'change'] },
],
permissions: [
{ required: true, message: '请选择组织权限', trigger: ['blur', 'change'] },
],
category: [
{required: true, message: '请选择类型', trigger: ['blur', 'change']},
],
hospital: [
{required: true, message: '请选择医院', trigger: ['blur', 'change']},
],
message: [
{required: true, message: '请输入消息内容', trigger: ['blur', 'change']},
],
// organization: [
// {required: true, message: '', trigger: ['blur', 'change']},
// ],
// permissions: [
// {required: true, message: '', trigger: ['blur', 'change']},
// ],
})
const formRef = ref()
const formData = ref({
type: '',
hospital: '',
content: '',
showDept: '',
permissions: '',
link: '',
isHot: true,
category: '',
hospital: '',
message: '',
organization: '',
permissions: '',
href: '',
hotspots: false,
} as any)
const hospitals = ref([] as any)
getHospitalsData().then((res: any) => {
hospitals.value = res
// console.log(res)
})
onMounted(() => {
resetData()
resetData()
})
defineExpose({
formData,
resetData,
formData,
resetData,
})
function close() {
emit('close')
emit('close')
}
function resetData() {
formRef.value.resetFields()
formData.value = {
type: '',
hospital: '',
content: '',
showDept: '',
permissions: '',
link: '',
isHot: true,
}
getHospitalList()
formRef.value.resetFields()
formData.value = {
category: '',
hospital: '',
message: '',
organization: '',
permissions: '',
href: '',
hotspots: false,
}
}
const saveData = async () => {
await formRef.value.validate((valid: any, fields: any) => {
if (valid) {
ElMessage.success('保存成功!')
close()
} else {
// console.log('error submit!', fields)
}
})
const saveData = () => {
formRef.value.validate((valid: any, fields: any) => {
if (valid) {
sysMessageApi.save(formData.value).then((res: any) => {
if (res.code == 0 && res.data) {
ElMessage.success('保存成功!')
close()
} else {
ElMessage.error(res.msg ? res.msg : "保存失败");
}
})
} else {
// console.log('error submit!', fields)
}
})
}
const getHospitalList = () => {
hospitalApi.getHospitalList().then((res: any) => {
if (res.code == 0) {
hospitals.value = res.data;
}
});
}
</script>
<style lang='scss' scoped>
:deep(.el-form-item) {
.el-form-item__label {
display: block;
text-align: right;
// text-align: justify;
// text-align-last: justify;
// padding: 0 10px 0 20px;
.el-form-item__label {
display: block;
text-align: right;
// text-align: justify;
// text-align-last: justify;
// padding: 0 10px 0 20px;
&:before {
display: none;
}
}
&:before {
display: none;
}
}
}
</style>

View File

@ -1,69 +1,68 @@
<template>
<div class="table-page custom-table-table">
<h3 class="main-color" style="font-size: 24px;line-height: 1;padding: 28px 0;">消息管理</h3>
<div class="search-part " v-show="isSearch">
<div class="search-cell">
<span class="label">消息类型</span>
<el-select v-model="queryParams.type" placeholder="请选择消息类型">
<el-option v-for="item in getMessageType()" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</div>
<div class="search-cell">
<span class="label">消息内容</span>
<el-input v-model="queryParams.content" placeholder="请输入消息内容"></el-input>
</div>
<el-button type="primary" icon="Search" @click="queryData(queryParams)">查询</el-button>
<!-- <el-button icon="Refresh" @click="queryParams = {}">重置</el-button> -->
</div>
<div class="button-part" style="justify-content: space-between;">
<el-button type="primary" icon="FirstAidKit" @click="addData">新增</el-button>
<TableAbility :isDownload="false" @searchBtn="isSearch = !isSearch" @refreshBtn="queryData({})"></TableAbility>
</div>
<div class="table-part">
<el-table ref="tableRef" v-loading="loading" :data="tableData" height="100%" border show-overflow-tooltip>
<el-table-column property="type" label="消息类型" width="120" align="center" />
<el-table-column property="content" label="消息内容" width="120" align="center" />
<el-table-column property="creator" label="创建人" width="120" align="center" />
<el-table-column label="创建时间" width="220" align="center">
<template #default="scope">{{ dateFormater('yyyy-MM-dd HH:mm:ss', scope.row.creatTime) }}</template>
</el-table-column>
<el-table-column property="editor" label="修改人" width="120" align="center" />
<el-table-column label="修改时间" width="220" align="center">
<template #default="scope">{{ dateFormater('yyyy-MM-dd HH:mm:ss', scope.row.editTime) }}</template>
</el-table-column>
<el-table-column label="操作" align="center">
<template #default="scope">
<div class="table-page custom-table-table">
<h3 class="main-color" style="font-size: 24px;line-height: 1;padding: 28px 0;">消息管理</h3>
<div class="search-part " v-show="isSearch">
<div class="search-cell">
<span class="label">消息类型</span>
<el-select v-model="queryParams.type" placeholder="请选择消息类型">
<el-option v-for="item in getMessageType()" :key="item.value" :label="item.label" :value="item.value"/>
</el-select>
</div>
<div class="search-cell">
<span class="label">消息内容</span>
<el-input v-model="queryParams.content" placeholder="请输入消息内容"></el-input>
</div>
<el-button type="primary" icon="Search" @click="queryData(queryParams)">查询</el-button>
<!-- <el-button icon="Refresh" @click="queryParams = {}">重置</el-button> -->
</div>
<div class="button-part" style="justify-content: space-between;">
<el-button type="primary" icon="FirstAidKit" @click="addData">新增</el-button>
<TableAbility :isDownload="false" @searchBtn="isSearch = !isSearch" @refreshBtn="queryData({})"></TableAbility>
</div>
<div class="table-part">
<el-table ref="tableRef" v-loading="loading" :data="tableData" height="100%" border show-overflow-tooltip>
<el-table-column property="type" label="消息类型" width="120" align="center"/>
<el-table-column property="content" label="消息内容" width="120" align="center"/>
<el-table-column property="creator" label="创建人" width="120" align="center"/>
<el-table-column label="创建时间" width="220" align="center">
<template #default="scope">{{ dateFormater('yyyy-MM-dd HH:mm:ss', scope.row.creatTime) }}</template>
</el-table-column>
<el-table-column property="editor" label="修改人" width="120" align="center"/>
<el-table-column label="修改时间" width="220" align="center">
<template #default="scope">{{ dateFormater('yyyy-MM-dd HH:mm:ss', scope.row.editTime) }}</template>
</el-table-column>
<el-table-column label="操作" align="center">
<template #default="scope">
<span @click.stop>
<el-button link icon="EditPen" @click="editData(scope.row)">修改</el-button>
<el-button link icon="Delete" @click="removeData(scope.row)">删除</el-button>
</span>
</template>
</el-table-column>
</el-table>
</div>
<div class="pagination-part">
<CommonPagination :total="100" @paginationChange="paginationChange" />
</div>
</template>
</el-table-column>
</el-table>
</div>
<el-dialog v-model="isFormDialog" :title="formDialogTitle" width="40%">
<MessageForm ref="messageFormRef" :type="formDialogTitle === '新增消息' ? 'add' : 'edit'"
@close="isFormDialog = false" />
</el-dialog>
<div class="pagination-part">
<CommonPagination :total="100" @paginationChange="paginationChange"/>
</div>
</div>
<el-dialog v-model="isFormDialog" :title="formDialogTitle" width="40%">
<MessageForm ref="messageFormRef" :type="formDialogTitle === '新增消息' ? 'add' : 'edit'"
@close="isFormDialog = false"/>
</el-dialog>
</template>
<script lang='ts' setup>
import { onMounted, reactive, ref, toRefs, watch } from 'vue'
import { ElMessage, ElMessageBox } from 'element-plus'
import { useRouter, useRoute } from 'vue-router'
import {onMounted, ref} from 'vue'
import {useRoute, useRouter} from 'vue-router'
import CommonPagination from '@/components/common-pagination.vue'
import MessageForm from './form/message-form.vue'
import { tableRemoveRow } from '@/utils/table-util'
import { getMessageType } from '@/static-data/core'
import { dateFormater } from '@/utils/date-util'
import {tableRemoveRow} from '@/utils/table-util'
import {getMessageType} from '@/static-data/core'
import {dateFormater} from '@/utils/date-util'
import * as sysMessageApi from "@/api/sys-message";
const router = useRouter()
const route = useRoute()
const tableRef = ref()
const messageFormRef = ref()
const isSearch = ref(true)
@ -72,80 +71,108 @@ const isFormDialog = ref(false)
const formDialogTitle = ref('')
const queryParams = ref({} as any)
const tableData = ref([] as any)
let current = 0;
let size = 10;
const total = ref(0);
queryData({ type: '公告', content: '测试测试测试' })
onMounted(() => {
init();
})
const init = () => {
total.value = 0;
current = 0;
tableData.value = [];
getMessageList();
}
const getMessageList = () => {
sysMessageApi.page(current, size).then((res: any) => {
if (res.code == 0) {
total.value = res.data.total
tableData.value = res.data.records
}
})
}
queryData({type: '公告', content: '测试测试测试'})
function queryData(e: any) {
loading.value = true
tableData.value = []
setTimeout(() => {
while (tableData.value.length < 10) {
tableData.value.push({
type: e.type || '公告',
content: e.content || '测试测试测试',
creator: 'admin',
creatTime: new Date(),
editor: 'admin',
editTime: new Date(),
hospital: '',
showDept: '',
permissions: '',
link: '',
isHot: true,
})
}
loading.value = false
}, 200);
loading.value = true
tableData.value = []
setTimeout(() => {
while (tableData.value.length < 10) {
tableData.value.push({
type: e.type || '公告',
content: e.content || '测试测试测试',
creator: 'admin',
creatTime: new Date(),
editor: 'admin',
editTime: new Date(),
hospital: '',
showDept: '',
permissions: '',
link: '',
isHot: true,
})
}
loading.value = false
}, 200);
}
const addData = () => {
isFormDialog.value = true
formDialogTitle.value = '新增消息'
setTimeout(() => {
messageFormRef.value.resetData()
}, 0)
isFormDialog.value = true
formDialogTitle.value = '新增消息'
setTimeout(() => {
messageFormRef.value.resetData()
}, 0)
}
const editData = (e: any) => {
isFormDialog.value = true
formDialogTitle.value = '修改'
setTimeout(() => {
messageFormRef.value.resetData()
messageFormRef.value.formData = JSON.parse(JSON.stringify(e))
}, 0)
}
const removeData = (e?: any) => {
const selectRow = e || tableRef.value.getSelectionRows()
tableRemoveRow({ data: selectRow }, (res: boolean) => {
if (res) {
// console.log('', selectRow)
}
})
}
const paginationChange = (page: number, size: number) => {
const editData = (e: any) => {
isFormDialog.value = true
formDialogTitle.value = '修改'
setTimeout(() => {
messageFormRef.value.resetData()
messageFormRef.value.formData = JSON.parse(JSON.stringify(e))
}, 0)
}
const removeData = (e?: any) => {
const selectRow = e || tableRef.value.getSelectionRows()
tableRemoveRow({data: selectRow}, (res: boolean) => {
if (res) {
// console.log('', selectRow)
}
})
}
const paginationChange = (page: number, s: number) => {
current = page;
size = s;
getMessageList();
}
</script>
<style lang='scss' scoped>
.table-page.custom-table-table {
.search-part {
padding: 40px 30px;
border: 1px solid $border-color;
.search-part {
padding: 40px 30px;
border: 1px solid $border-color;
&>.search-cell~.search-cell {
margin-left: 50px;
}
.search-cell {
flex-grow: 1;
}
&>.el-button {
margin-left: 100px;
}
& > .search-cell ~ .search-cell {
margin-left: 50px;
}
.table-part {
height: calc(100% - 292px);
.search-cell {
flex-grow: 1;
}
& > .el-button {
margin-left: 100px;
}
}
.table-part {
height: calc(100% - 292px);
}
}</style>

View File

@ -64,7 +64,8 @@
@save="doctorFormSave"/>
</el-dialog>
<ImportDialog ref="importDialogRef" title="用户导入"
templateUrl="/admin/sys-file/local/file/user.xlsx" importUrl="/admin/user/import"/>
templateUrl="/admin/sys-file/local/file/user.xlsx"
importUrl="/admin/user/import"/>
</template>
<script lang='ts' setup>

View File

@ -79,34 +79,72 @@ function close() {
emit('close')
}
function resetData() {
function resetData(form?: any) {
formRef.value.resetFields()
formData.value = {
roleId: '',
roleName: '',
roleCode: '',
roleDesc: '',
dataPermissions: '',
if (form) {
form.menuIds = [];
formData.value = form;
getRoleMenu(form.roleId);
} else {
formData.value = {
roleId: '',
roleName: '',
roleCode: '',
roleDesc: '',
menuIds: []
}
}
}
const getRoleMenu = (roleId: string) => {
menuApi.getRoleTree(roleId).then((res: any) => {
treeRef.value.setCheckedKeys(res.data);
})
}
const saveData = async () => {
await formRef.value.validate((valid: any, fields: any) => {
if (valid) {
const form = Object.assign({}, formData.value);
form.menuIds = form.menuIds.join(",");
roleApi.addRole(form).then((res: any) => {
if (res.code == 0) {
ElMessage.success('保存成功!');
close();
} else {
ElMessage.error(res.msg ? res.msg : "保存失败");
}
});
if (props.type == "edit") {
updateRole(form);
} else {
addRole(form);
}
}
})
}
const addRole = (form: any) => {
form.menuIds = form.menuIds.join(",");
roleApi.addRole(form).then((res: any) => {
if (res.code == 0) {
ElMessage.success('保存成功!');
close();
} else {
ElMessage.error(res.msg ? res.msg : "保存失败");
}
});
}
const updateRole = async (form: any) => {
const menuIds = form.menuIds.join(",");
delete form.menuIds;
const res: any = await roleApi.updateRole(form);
const res1: any = await roleApi.saveRoleMenus(form.roleId, menuIds);
if (res.code == 0 && res1.code == 0) {
ElMessage.success("保存成功");
close();
} else {
if (res.code == 1) {
ElMessage.error(res.msg ? res.msg : "更新失败");
}
if (res1.code == 1) {
ElMessage.error(res.msg ? res.msg : "授权失败");
}
}
}
const checkChange = () => {
formData.value.menuIds = treeRef.value.getCheckedKeys();
}

View File

@ -60,7 +60,8 @@
<el-dialog v-model="isFormDialog" :title="formDialogTitle" width="30%">
<RoleForm ref="RoleFormRef" :type="formDialogTitle === '添加' ? 'add' : 'edit'" @close="isFormDialog = false"/>
</el-dialog>
<ImportDialog ref="importDialogRef" title="角色导入" templateUrl="#" importUrl="#"/>
<ImportDialog ref="importDialogRef" title="角色导入" templateUrl="/admin/sys-file/local/file/role.xlsx"
importUrl="/admin/role/import" @success="importSuccessEvent"/>
<EmpowerDialog ref="empowerDialogRef"/>
</template>
@ -73,6 +74,7 @@ import RoleForm from './form/role-form.vue'
import ImportDialog from '@/components/import-dialog.vue'
import EmpowerDialog from './form/empower-dialog.vue'
import * as roleApi from "@/api/role";
import {ElMessage} from "element-plus";
const tableRef = ref()
const RoleFormRef = ref()
@ -132,10 +134,21 @@ const importData = () => {
}, 0);
}
const removeData = (e?: any) => {
const selectRow = e || tableRef.value.getSelectionRows()
const selectRow = [e] || tableRef.value.getSelectionRows();
tableRemoveRow({data: selectRow}, (res: boolean) => {
if (res) {
// console.log('', selectRow)
const ids: any = [];
selectRow.forEach((row: any) => {
ids.push(row.roleId);
})
roleApi.deleteById(ids).then((res: any) => {
if (res.code == 0) {
ElMessage.success("删除成功");
init();
} else {
ElMessage.error(res.msg ? res.msg : "删除失败");
}
})
}
})
}
@ -148,8 +161,7 @@ const editData = (e: any) => {
isFormDialog.value = true
formDialogTitle.value = '修改'
setTimeout(() => {
RoleFormRef.value.resetData()
// RoleFormRef.value.formData = JSON.parse(JSON.stringify(e))
RoleFormRef.value.resetData(JSON.parse(JSON.stringify(e)))
}, 0)
}
const tableRowClick = (row: any) => {
@ -161,6 +173,10 @@ const paginationChange = (page: number, s: number) => {
size = s
getRoleList()
}
const importSuccessEvent = () => {
init();
}
</script>
<style lang='scss' scoped>