123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647 |
- <template>
- <div class="common-box">
- <!--条件-->
- <el-form :model="listQuery" ref="queryForm" :inline="true">
- <el-form-item label="公告标题">
- <el-input
- v-model="listQuery.msgTitle"
- placeholder="请输入公告标题"
- ></el-input>
- </el-form-item>
- <el-form-item label="公告类型">
- <el-select v-model="listQuery.msgType" placeholder="请选择公告类型">
- <el-option
- v-for="item in typeList"
- :key="item.dicCode"
- :label="item.dicVal"
- :value="item.dicCode"
- >
- </el-option>
- </el-select>
- </el-form-item>
- <el-form-item>
- <el-button type="primary" @click="getData('search')"> 查询 </el-button>
- <el-button @click="reset()">重置</el-button>
- </el-form-item>
- <el-form-item>
- <el-button
- type="primary"
- class="lake-Blue"
- icon="el-icon-plus"
- @click="handleAddOrEdit(0, null, 'create')"
- >
- 新增
- </el-button>
- </el-form-item>
- </el-form>
- <el-tabs v-model="activeName" @tab-click="handleClick">
- <el-tab-pane
- :label="item.label"
- :name="item.id"
- v-for="item in tabs"
- :key="item.id"
- >
- <el-table
- v-loading="listLoading"
- :data="list"
- element-loading-text="加载中"
- fit
- stripe
- >
- <template slot="empty">
- <img src="@/assets/nopage.png" alt />
- <p>暂无数据</p>
- </template>
- <el-table-column
- fixed
- type="index"
- label="序号"
- width="60"
- ></el-table-column>
- <el-table-column label="公告标题" prop="msgTitle" />
- <el-table-column label="公告类型" width="200">
- <template slot-scope="scope">{{
- reversedMessage(scope.row.msgType)
- }}</template>
- </el-table-column>
- <el-table-column label="发布者" width="200" prop="msgPubdUser" />
- <el-table-column
- v-if="activeName == '1'"
- label="发布时间"
- width="200"
- >
- <template slot-scope="scope">
- <span>{{ scope.row.msgPubdTime | formatDate }}</span>
- </template>
- </el-table-column>
- <el-table-column fixed="right" label="操作" width="180">
- <template slot-scope="scope">
- <el-button
- v-if="activeName == '0'"
- icon="el-icon-edit"
- style="color: #52C8CC;"
- :disabled="scope.row.state === 'deleted'"
- type="text"
- @click="handleAddOrEdit(scope.$index, scope.row, 'update')"
- >编辑
- </el-button>
- <el-button
- icon="el-icon-delete"
- style="color: #CE4745;"
- :disabled="scope.row.state === 'deleted'"
- type="text"
- @click="handleDelete(scope.row, 'deleted')"
- >删除
- </el-button>
- </template>
- </el-table-column>
- </el-table>
- <!--分页-->
- <yl-pagination
- v-show="total > 0"
- :total="total"
- :page.sync="listQuery.current"
- :limit.sync="listQuery.size"
- @pagination="getData"
- />
- </el-tab-pane>
- </el-tabs>
- <!--添加/修改-->
- <el-dialog
- v-if="dialogFormVisible"
- :title="textMap[dialogStatus]"
- :visible.sync="dialogFormVisible"
- width="1300px"
- :close-on-click-modal="false"
- >
- <el-form
- ref="dataForm"
- :rules="rules"
- :model="temp"
- label-position="right"
- label-width="80px"
- >
- <el-row>
- <el-col :span="12">
- <el-form-item label="标题" prop="msgTitle">
- <el-input v-model.trim="temp.msgTitle" />
- </el-form-item>
- </el-col>
- <el-col :span="6">
- <el-form-item label="分类" prop="msgType">
- <el-select
- v-model="temp.msgType"
- placeholder="请选择分类"
- style="width: 100%"
- >
- <el-option
- v-for="item in typeList"
- :key="item.dicCode"
- :label="item.dicVal"
- :value="item.dicCode"
- >
- </el-option>
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="6">
- <el-form-item label="发布者">
- <el-input v-model.trim="temp.msgPubder" />
- </el-form-item>
- </el-col>
- </el-row>
- <el-form-item label="发送给">
- <!-- :disabled="noticeDetail.msgStas == 1" -->
- <el-radio-group v-model="temp.forAll">
- <el-radio label="1">全部用户</el-radio>
- <el-radio label="0">部分用户</el-radio>
- </el-radio-group>
- </el-form-item>
- <el-form-item label="接收用户" v-if="temp.forAll == 0">
- <div class="textarea-box">
- <el-tooltip
- :content="tag.id"
- placement="bottom"
- effect="light"
- :key="tag.id"
- v-for="tag in temp.receiveUser"
- popper-class="notice-testtooltip"
- open-delay="500"
- >
- <!-- :closable="noticeDetail.msgStas != 1" -->
- <el-tag
- closable
- @close="handleUsersClose(tag)"
- style="margin-right: 5px"
- >
- {{ tag.name }}
- </el-tag>
- </el-tooltip>
- </div>
- <!-- :disabled="noticeDetail.msgStas == 1" -->
- <el-button type="primary" icon="el-icon-plus" @click="chooseUsers"
- >选择</el-button
- >
- </el-form-item>
- <el-form-item label="接收角色" v-if="temp.forAll == 0">
- <div class="textarea-box">
- <el-tooltip
- :content="tag.id"
- placement="bottom"
- effect="light"
- :key="tag.id"
- v-for="tag in temp.receiveRole"
- popper-class="notice-testtooltip"
- open-delay="500"
- >
- <!-- :closable="noticeDetail.msgStas != 1" -->
- <el-tag
- closable
- @close="handleRolesClose(tag)"
- style="margin-right: 5px"
- >
- {{ tag.name }}
- </el-tag>
- </el-tooltip>
- </div>
- <!-- :disabled="noticeDetail.msgStas == 1" -->
- <el-button type="primary" icon="el-icon-plus" @click="chooseRoles"
- >选择</el-button
- >
- </el-form-item>
- <el-form-item label="内容">
- <div class="editor-css" style="border: 1px solid #ccc">
- <Toolbar
- style="border-bottom: 1px solid #ccc"
- :editor="editor"
- :defaultConfig="toolbarConfig"
- :mode="mode"
- />
- <Editor
- style="height: 500px; overflow-y: hidden"
- v-model="temp.mainText"
- :defaultConfig="editorConfig"
- :mode="mode"
- @onCreated="onCreated"
- />
- </div>
- </el-form-item>
- </el-form>
- <div slot="footer" class="dialog-footer">
- <el-button
- type="success"
- @click="commitData(0)"
- v-if="
- (dialogStatus == 'update' && noticeDetail.msgStas == 0) ||
- dialogStatus == 'create'
- "
- >保存</el-button
- >
- <el-button type="primary" @click="commitData(1)">发布</el-button>
- </div>
- </el-dialog>
- <!--添加接收用户-->
- <el-dialog
- v-if="dialogUsersFormVisible"
- title="选择接收用户"
- :visible.sync="dialogUsersFormVisible"
- width="1300px"
- :close-on-click-modal="false"
- >
- <users
- :checkUser="temp.receiveUser"
- @usersClose="usersClose"
- @usersSubmit="usersSubmit"
- ></users>
- </el-dialog>
- <!--添加接收角色-->
- <el-dialog
- v-if="dialogRolesFormVisible"
- title="选择接收角色"
- :visible.sync="dialogRolesFormVisible"
- width="1300px"
- :close-on-click-modal="false"
- >
- <roles
- :checkRole="temp.receiveRole"
- @rolesClose="rolesClose"
- @rolesSubmit="rolesSubmit"
- ></roles>
- </el-dialog>
- </div>
- </template>
- <script>
- import { Editor, Toolbar } from "@wangeditor/editor-for-vue";
- import {
- addNotice,
- getNotice,
- delNotice,
- editNotice,
- getNoticeDetail
- } from "@/api/system/notice";
- import { getQueryDic } from "@/api/system/dic";
- import users from "@/views/page/system/notice/components/users";
- import roles from "@/views/page/system/notice/components/roles";
- import ylPagination from "@/components/yl-pagination";
- import moment from "moment";
- export default {
- components: { Editor, Toolbar, ylPagination, users, roles },
- data() {
- return {
- // 公告详情
- noticeDetail: {},
- dialogUsersFormVisible: false,
- dialogRolesFormVisible: false,
- // 公告分类
- typeList: [],
- activeName: "0",
- listLoading: false,
- list: null, //列表
- total: 0, //分页
- listQuery: {
- //条件查询
- current: 1,
- size: 10,
- msgTitle: "",
- msgType: "",
- msgStas: 0
- },
- textMap: {
- update: "编辑",
- create: "添加"
- },
- // tab栏
- tabs: [
- {
- id: "0",
- label: "未发布"
- },
- {
- id: "1",
- label: "已发布"
- }
- ],
- dialogFormVisible: false, //是否对话框
- dialogStatus: "",
- temp: {},
- rules: {
- msgType: [
- {
- required: true,
- message: "请选择分类",
- trigger: "change"
- }
- ],
- msgTitle: [
- {
- required: true,
- message: "标题不能为空",
- trigger: "blur"
- }
- ]
- },
- // 富文本编辑器
- editor: null,
- toolbarConfig: {
- excludeKeys: ["group-video", "codeBlock", "undo", "redo", "emotion"]
- },
- editorConfig: {
- placeholder: "请输入内容...",
- // 所有的菜单配置,都要在 MENU_CONF 属性下
- MENU_CONF: {
- // 配置上传图片
- uploadImage: {
- customUpload: this.update,
- base64LimitSize: 1024 * 1024 // 5*1024 = 5kb
- }
- // 继续其他菜单配置...
- }
- },
- mode: "default" // or 'simple'
- };
- },
- filters: {
- formatDate(status) {
- if (status) {
- var time = moment(time).format("YYYY-MM-DD HH:mm:ss");
- }
- return time;
- }
- },
- created() {
- this.getNoticeType();
- this.getData();
- },
- mounted() {},
- beforeDestroy() {
- const editor = this.editor;
- if (editor == null) return;
- editor.destroy(); // 组件销毁时,及时销毁编辑器
- },
- methods: {
- reversedMessage(val) {
- let newVal = this.typeList.find((item) => {
- return item.dicCode == val;
- });
- if (newVal) {
- return newVal.dicVal;
- }
- },
- // 删除用户标签
- handleUsersClose(tag) {
- this.temp.receiveUser.splice(this.temp.receiveUser.indexOf(tag), 1);
- },
- // 删除角色标签
- handleRolesClose(tag) {
- this.temp.receiveRole.splice(this.temp.receiveRole.indexOf(tag), 1);
- },
- // 获取到选中的用户
- usersSubmit(item) {
- this.temp.receiveUser = item;
- this.dialogUsersFormVisible = false;
- },
- // 获取到选中的用户
- rolesSubmit(item) {
- this.temp.receiveRole = item;
- this.dialogRolesFormVisible = false;
- },
- // 关闭用户对话框
- usersClose() {
- this.dialogUsersFormVisible = false;
- },
- // 关闭角色对话框
- rolesClose() {
- this.dialogRolesFormVisible = false;
- },
- // 选择用户对话框
- chooseUsers() {
- this.dialogUsersFormVisible = true;
- },
- // 选择角色对话框
- chooseRoles() {
- this.dialogRolesFormVisible = true;
- },
- // 获取公告分类
- getNoticeType() {
- getQueryDic({ dicCode: "noticeType" }).then((response) => {
- this.typeList = response.data;
- });
- },
- // 上传图片
- update(file, insertFn) {
- this.$message({
- message: "上传图片不能超过1MB!",
- type: "info"
- });
- // file 即选中的文件
- // 自己实现上传,并得到图片 url alt href
- // let name = md5(file.name);
- // let suffix = file.type.split("/")[1];
- // name = name + "." + suffix;
- // uploadFile(name, file).then((res) => {
- // if (res.statusCode == 200) {
- // // 最后插入图片
- // insertFn(
- // "http://" + res.Location,
- // file.name,
- // "http://" + res.Location
- // );
- // } else {
- // }
- // });
- },
- // 富文本编辑器
- onCreated(editor) {
- this.editor = Object.seal(editor); // 一定要用 Object.seal() ,否则会报错
- },
- // tab栏跳转
- handleClick(tab, event) {
- this.activeName = tab.name;
- this.listQuery.current = 1;
- this.list = [];
- if (this.activeName == 0) {
- this.listQuery.msgStas = 0;
- } else {
- this.listQuery.msgStas = 1;
- }
- this.getData();
- },
- // 重置页面
- reset() {
- this.listQuery.msgType = "";
- this.listQuery.msgTitle = "";
- this.getData();
- },
- //获取列表数据
- getData(type) {
- if (type == "search") {
- this.listQuery.current = 1;
- }
- this.listLoading = true;
- getNotice(this.listQuery)
- .then((response) => {
- this.list = response.data.records;
- this.total = response.data.total;
- this.listLoading = false;
- })
- .catch((err) => {
- this.listLoading = false;
- });
- },
- //提交表单数据
- commitData(type) {
- if (this.temp.forAll == "1") {
- delete this.temp.receiveUser;
- delete this.temp.receiveRole;
- } else {
- if (this.temp.receiveUser.length == 0 && this.temp.receiveRole == 0) {
- this.$message({
- message: "请选择接收用户或者角色",
- type: "info"
- });
- return false;
- }
- }
- this.$refs["dataForm"].validate((valid) => {
- if (valid) {
- this.$confirm("确认提交", "提示", {
- confirmButtonText: "确定",
- cancelButtonText: "取消",
- type: "warning"
- }).then(() => {
- this.temp.msgStas = type;
- if (this.dialogStatus === "create") {
- addNotice(this.temp).then((response) => {
- this.$message({
- message: "操作成功",
- type: "success"
- });
- this.dialogFormVisible = false;
- this.getData();
- });
- } else {
- editNotice(this.temp).then((response) => {
- this.$message({
- message: "操作成功",
- type: "success"
- });
- this.dialogFormVisible = false;
- this.getData();
- });
- }
- });
- }
- });
- },
- // 打开添加/修改对话框
- handleAddOrEdit(index, row, type) {
- this.temp = {};
- this.noticeDetail = {};
- //修改对话框
- if (type === "update") {
- getNoticeDetail({ id: row.id })
- .then((response) => {
- this.noticeDetail = response.data;
- this.temp = {
- id: row.id,
- msgTitle: this.noticeDetail.msgTitle,
- mainText: this.noticeDetail.mainText,
- msgType: this.noticeDetail.msgType,
- msgPubder: this.noticeDetail.msgPubdUser,
- forAll: this.noticeDetail.forAll + "",
- receiveUser: this.noticeDetail.receiveUser,
- receiveRole: this.noticeDetail.receiveRole
- };
- })
- .catch((err) => {});
- } else {
- this.temp = {
- id: "",
- msgTitle: "",
- msgType: "",
- msgPubder: "",
- mainText: "",
- receiveUser: [],
- receiveRole: [],
- forAll: "1"
- };
- }
- this.dialogStatus = type;
- this.dialogFormVisible = true;
- this.$nextTick(() => {
- this.$refs["dataForm"].clearValidate();
- });
- },
- //删除
- handleDelete(row, status) {
- this.$confirm("确认删除", "提示", {
- confirmButtonText: "确定",
- cancelButtonText: "取消",
- type: "warning"
- }).then(() => {
- this.temp = {
- msgIds: [row.id]
- };
- delNotice(this.temp).then((response) => {
- this.$message({
- message: "操作成功",
- type: "success"
- });
- // 解决element el-pagination分页最后一页数据清空了页码显示正确,但是列表为空
- const totalPage = Math.ceil((this.total - 1) / this.listQuery.size);
- const currentPage =
- this.listQuery.current > totalPage
- ? totalPage
- : this.listQuery.current;
- this.listQuery.current = currentPage < 1 ? 1 : currentPage;
- this.getData();
- });
- });
- }
- }
- };
- </script>
- <style src="@wangeditor/editor/dist/css/style.css"></style>
- <style scoped type="scss">
- .textarea-box {
- float: left;
- box-sizing: border-box;
- border-radius: 4px;
- background-color: #f5f7fa;
- border: 1px solid #dfe4ed;
- color: #c0c4cc;
- padding: 0px 15px;
- width: 1100px;
- min-height: 30px;
- margin-right: 5px;
- }
- </style>
|