wip: 🚧 通知公告开发临时提交

通知公告开发临时提交
This commit is contained in:
Theo
2024-09-02 00:01:47 +08:00
parent 0850359002
commit 099ed1454a
3 changed files with 112 additions and 42 deletions

View File

@@ -1,4 +1,5 @@
import request from "@/utils/request";
import { AxiosPromise, AxiosResponse } from "axios";
const USER_BASE_URL = "/api/v1/users";
@@ -194,6 +195,16 @@ class UserAPI {
data: data,
});
}
/**
* 获取用户下拉列表
*/
static getOptions(): AxiosPromise<OptionType[]> {
return request({
url: `${USER_BASE_URL}/options`,
method: "get",
});
}
}
export default UserAPI;

View File

@@ -30,6 +30,10 @@ const props = defineProps({
type: [String],
default: "",
},
excludeKeys: {
type: Array<string>,
default: [],
},
});
const emit = defineEmits(["update:modelValue"]);
@@ -37,8 +41,10 @@ const emit = defineEmits(["update:modelValue"]);
const modelValue = useVModel(props, "modelValue", emit);
const editorRef = shallowRef(); // 编辑器实例,必须用 shallowRef
const mode = ref("default"); // 编辑器模式
const toolbarConfig = ref({}); // 工具条配置
const mode = ref("simple"); // 编辑器模式
const toolbarConfig = ref({
excludeKeys: props.excludeKeys,
}); // 工具条配置
// 编辑器配置
const editorConfig = ref({
placeholder: "请输入内容...",

View File

@@ -80,7 +80,7 @@
align="center"
key="noticeType"
label="通知类型"
prop="noticeType"
prop="noticeTypeLabel"
min-width="150"
/>
<el-table-column
@@ -211,48 +211,66 @@
<el-dialog
v-model="dialog.visible"
:title="dialog.title"
width="70%"
top="4vh"
width="60%"
@close="handleCloseDialog"
>
<div style="max-height: calc(100vh - 200px)">
<el-form
ref="dataFormRef"
:model="formData"
:rules="rules"
label-width="100px"
<el-form
ref="dataFormRef"
:model="formData"
:rules="rules"
label-width="100px"
>
<el-form-item label="通知标题" prop="title">
<el-input v-model="formData.title" placeholder="通知标题" clearable />
</el-form-item>
<el-form-item label="通知内容" prop="content">
<editor
v-model="formData.content"
:excludeKeys="['headerSelect', 'blockquote']"
style="min-height: 480px; max-height: 500px"
/>
</el-form-item>
<el-form-item label="通知类型" prop="noticeType">
<dictionary
type="button"
v-model="formData.noticeType"
code="notice_type"
/>
</el-form-item>
<el-form-item label="优先级" prop="priority">
<el-radio-group v-model="formData.priority">
<el-radio :value="0"></el-radio>
<el-radio :value="1"></el-radio>
<el-radio :value="2"></el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="目标类型" prop="tarType">
<el-radio-group v-model="formData.tarType">
<el-radio :value="0">全体</el-radio>
<el-radio :value="1">指定</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item
label="指定用户"
prop="tarType"
v-if="formData.tarType == 1"
>
<el-form-item label="通知标题" prop="title">
<el-input
v-model="formData.title"
placeholder="通知标题"
clearable
<el-select
v-model="formData.tarIds"
multiple
search
placeholder="请选择指定用户"
>
<el-option
v-for="item in userOptions"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-form-item>
<el-form-item label="通知内容" prop="content">
<editor v-model="formData.content" style="height: 500px" />
</el-form-item>
<el-form-item label="通知类型" prop="noticeType">
<el-input
v-model="formData.noticeType"
placeholder="通知类型"
clearable
/>
</el-form-item>
<el-form-item label="优先级" prop="priority">
<el-radio-group v-model="formData.priority">
<el-radio :value="0"></el-radio>
<el-radio :value="1"></el-radio>
<el-radio :value="2"></el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="目标类型" prop="tarType">
<el-radio-group v-model="formData.tarType">
<el-radio :value="0">全体</el-radio>
<el-radio :value="1">指定</el-radio>
</el-radio-group>
</el-form-item>
</el-form>
</div>
</el-select>
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button type="primary" @click="handleSubmit()">确定</el-button>
@@ -275,6 +293,7 @@ import NoticeAPI, {
NoticeForm,
NoticePageQuery,
} from "@/api/notice";
import UserAPI from "@/api/user";
const queryFormRef = ref(ElForm);
const dataFormRef = ref(ElForm);
@@ -288,6 +307,7 @@ const queryParams = reactive<NoticePageQuery>({
pageSize: 10,
});
const userOptions = ref<OptionType[]>([]);
// 通知公告表格数据
const pageData = ref<NoticePageVO[]>([]);
@@ -306,7 +326,25 @@ const formData = reactive<NoticeForm>({
// 通知公告表单校验规则
const rules = reactive({
title: [{ required: true, message: "请输入通知标题", trigger: "blur" }],
content: [{ required: true, message: "请输入通知内容", trigger: "blur" }],
// content: [{ required: true, message: "请输入通知内容", trigger: "blur" }],
// 写一个content的校验规则去掉html标签如果为空则提示
content: [
{
required: true,
message: "请输入通知内容",
trigger: "blur",
validator: (rule: any, value: string, callback: any) => {
if (!value.replace(/<[^>]+>/g, "").trim()) {
callback(new Error("请输入通知内容"));
} else {
callback();
}
},
},
],
noticeType: [
{ required: true, message: "请选择通知类型", trigger: "change" },
],
});
/** 查询通知公告 */
@@ -336,6 +374,7 @@ function handleSelectionChange(selection: any) {
/** 打开通知公告弹窗 */
function handleOpenDialog(id?: number) {
getUserOptions();
dialog.visible = true;
if (id) {
dialog.title = "修改通知公告";
@@ -343,6 +382,7 @@ function handleOpenDialog(id?: number) {
Object.assign(formData, data);
});
} else {
Object.assign(formData, { priority: 0, tarType: 0 });
dialog.title = "新增通知公告";
}
}
@@ -424,7 +464,20 @@ function handleDelete(id?: number) {
);
}
function getUserOptions() {
if (userOptions.value.length == 0) {
UserAPI.getOptions().then((res) => {
userOptions.value = res;
});
}
}
onMounted(() => {
handleQuery();
});
</script>
<style>
.editor-wrapper {
border: 1px solid #dcdfe6;
}
</style>