index.vue 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372
  1. <template>
  2. <div class="mainContentBox">
  3. <avue-crud
  4. ref="crudRef"
  5. v-model:search="search"
  6. v-model="form"
  7. :data="data"
  8. :option="option"
  9. v-model:page="page"
  10. @row-save="createRow"
  11. @row-update="updateRow"
  12. @row-del="deleteRow"
  13. @search-change="searchChange"
  14. @search-reset="resetChange"
  15. @size-change="dataList"
  16. @current-change="dataList"
  17. @selection-change="selectionChange"
  18. >
  19. <template #menu-left="{ size }">
  20. <el-button
  21. type="primary"
  22. icon="el-icon-plus"
  23. :size="size"
  24. @click="messageDialog"
  25. >新增</el-button
  26. >
  27. </template>
  28. <template #menu="{ size, row, index }">
  29. <el-button
  30. v-if="row.state === '0' || (row.type === '5' && row.state !== '2')"
  31. type="primary"
  32. link
  33. size="small"
  34. @click="handleEdit(row, 0)"
  35. ><i-ep-edit />编辑
  36. </el-button>
  37. <el-button
  38. v-if="row.state === '1' && row.type === '5'"
  39. type="danger"
  40. size="small"
  41. @click="overMessage(row.id)"
  42. >过期
  43. </el-button>
  44. <el-button
  45. type="primary"
  46. link
  47. v-if="row.state === '0'"
  48. size="small"
  49. @click="handleSend(row, 0)"
  50. ><i-ep-edit />发送
  51. </el-button>
  52. </template>
  53. </avue-crud>
  54. <el-dialog
  55. v-model="dialog.visible"
  56. :title="dialog.title"
  57. width="800px"
  58. @close="dialog.visible = false"
  59. >
  60. <el-form
  61. ref="userFormRef"
  62. :model="message"
  63. :rules="rules"
  64. label-width="90px"
  65. >
  66. <el-row :gutter="22">
  67. <el-col :span="11">
  68. <el-form-item label="标题" prop="title">
  69. <el-input
  70. class="!w-[220px]"
  71. v-model="message.title"
  72. placeholder="请输入标题"
  73. maxlength="18"
  74. />
  75. </el-form-item>
  76. </el-col>
  77. <el-col :span="11">
  78. <el-form-item label="类型" prop="type">
  79. <el-select
  80. v-model="message.type"
  81. placeholder="类型"
  82. clearable
  83. class="!w-[220px]"
  84. >
  85. <el-option
  86. v-for="item in messageTypes"
  87. :key="item.dictValue"
  88. :label="item.dictLabel"
  89. :value="item.dictValue"
  90. />
  91. </el-select>
  92. </el-form-item>
  93. </el-col>
  94. </el-row>
  95. <el-row :gutter="22" v-if="message.type === '1'">
  96. <el-col :span="22">
  97. <el-form-item label="接收人员" prop="receiveUsers">
  98. <el-select
  99. v-model="message.receiveUsers"
  100. placeholder="类型"
  101. clearable
  102. multiple
  103. filterable
  104. class="!w-[500px]"
  105. >
  106. <el-option
  107. v-for="item in userList"
  108. :key="item.id"
  109. :label="item.userName"
  110. :value="item.id"
  111. />
  112. </el-select>
  113. </el-form-item>
  114. </el-col>
  115. </el-row>
  116. <el-row :gutter="22">
  117. <el-col :span="22">
  118. <el-form-item label="内容" prop="content">
  119. <Editor :value="editorContent" @updateValue="getMsg" />
  120. </el-form-item>
  121. </el-col>
  122. </el-row>
  123. </el-form>
  124. <div class="dialog-footer" align="center">
  125. <el-button type="primary" @click="handleSubmit">确 定</el-button>
  126. <el-button @click="dialog.visible = false">取 消</el-button>
  127. </div>
  128. </el-dialog>
  129. </div>
  130. </template>
  131. <script setup>
  132. import { ref, getCurrentInstance } from "vue";
  133. import { useCrud } from "@/hooks/userCrud";
  134. import Editor from "@/views/system/message/editor/index.vue";
  135. import {addMessage, updateMessage, overEnd} from "@/api/system/message";
  136. import { useCommonStoreHook } from "@/store";
  137. import { getUserList } from "@/api/system/user";
  138. import { queryDictDataByType } from "@/api/system/dict";
  139. import { useDictionaryStore } from "@/store";
  140. const { dicts } = useDictionaryStore();
  141. const { isShowTable, tableType } = toRefs(useCommonStoreHook());
  142. const userFormRef = ref(ElForm); // 用户表单
  143. const message = ref({
  144. title: "",
  145. content: "",
  146. type: "0",
  147. receiveUsers: [],
  148. });
  149. const test = () => {
  150. isShowTable.value = true;
  151. tableType.value = tableType.value == 1 ? 2 : 1;
  152. };
  153. const handleSubmit = () => {
  154. userFormRef.value.validate((valid) => {
  155. if (valid) {
  156. if (message.value.id) {
  157. updateMessage(message.value).then((data) => {
  158. if (data.code === "200") {
  159. ElMessage.success(data.msg);
  160. dialog.visible = false;
  161. dataList();
  162. } else {
  163. ElMessage.error(data.msg);
  164. }
  165. });
  166. } else {
  167. addMessage(message.value).then((data) => {
  168. if (data.code === "200") {
  169. ElMessage.success(data.msg);
  170. dialog.visible = false;
  171. dataList();
  172. } else {
  173. ElMessage.error(data.msg);
  174. }
  175. });
  176. }
  177. }
  178. });
  179. };
  180. const overMessage = (id) => {
  181. ElMessageBox.confirm("确定要过期吗?", "提示", {
  182. confirmButtonText: "确定",
  183. cancelButtonText: "取消",
  184. type: "warning",
  185. lockScroll: false,
  186. }).then(() => {
  187. overEnd(id).then((data) => {
  188. if (data.code === "200") {
  189. ElMessage.success(data.msg);
  190. dataList();
  191. } else {
  192. ElMessage.error(data.msg);
  193. }
  194. })
  195. });
  196. };
  197. const handleEdit = (row, index) => {
  198. message.value = row;
  199. editorContent.value = row.content;
  200. dialog.visible = true;
  201. };
  202. const handleSend = (row, index) => {
  203. ElMessageBox.confirm("确定要发送吗?", "提示", {
  204. confirmButtonText: "确定",
  205. cancelButtonText: "取消",
  206. type: "warning",
  207. lockScroll: false,
  208. }).then(() => {
  209. row.state = 1;
  210. updateMessage(row).then((data) => {
  211. if (data.code === "200") {
  212. ElMessage.success(data.msg);
  213. dialog.visible = false;
  214. dataList();
  215. } else {
  216. ElMessage.error(data.msg);
  217. }
  218. });
  219. });
  220. };
  221. const editorContent = ref(null);
  222. const crudRef = ref(null); //crudRef.value 获取avue-crud对象
  223. const dialog = reactive({
  224. title: "消息管理",
  225. visible: false,
  226. type: "0",
  227. state: "0",
  228. });
  229. const rules = reactive({
  230. title: [{required: true, message: "标题不能为空", trigger: "blur"}, {
  231. max: 18,
  232. message: '标题长度不能超过18个字符',
  233. trigger: 'blur'
  234. }],
  235. content: [{ required: true, message: "内容不能为空", trigger: "blur" }],
  236. receiveUsers: [{ required: true, message: "人员不能为空", trigger: "blur" }],
  237. });
  238. // 传入一个url,后面不带/
  239. const { form, data, option, search, page, toDeleteIds, Methords, Utils } =
  240. useCrud({
  241. src: "/api/v1/sys/message",
  242. });
  243. const { dataList, createRow, updateRow, deleteRow, searchChange, resetChange } =
  244. Methords; //增删改查
  245. const { selectionChange, multipleDelete } = Methords; //选中和批量删除事件
  246. const { checkBtnPerm, downloadTemplate, exportData } = Utils; //按钮权限等工具
  247. const getMsg = (val) => {
  248. message.value.content = val;
  249. };
  250. const messageDialog = () => {
  251. message.value.title = "";
  252. message.value.content = "";
  253. message.value.receiveUsers = [];
  254. editorContent.value = "";
  255. dialog.visible = true;
  256. };
  257. const messageTypes = ref([]);
  258. const userList = ref([]);
  259. const queryUserList = () => {
  260. getUserList({}).then((data) => {
  261. userList.value = data.data;
  262. });
  263. queryDictDataByType("system_message_type").then((data) => {
  264. messageTypes.value = data.data;
  265. });
  266. };
  267. // 设置表格列或者其他自定义的option
  268. option.value = Object.assign(option.value, {
  269. searchEnter: true,
  270. delBtn: true,
  271. selection: false,
  272. addBtn: false,
  273. editBtn: false,
  274. viewBtn: false,
  275. column: [
  276. {
  277. label: "标题",
  278. prop: "title",
  279. rules: [
  280. {
  281. required: true,
  282. message: "标题不能为空",
  283. trigger: "trigger",
  284. },
  285. {
  286. max: 18,
  287. message: "标题长度不能超过18个字符",
  288. trigger: "blur" // 建议使用 blur 或 change 触发
  289. }
  290. ],
  291. },
  292. {
  293. label: "内容",
  294. prop: "content",
  295. width: 300,
  296. overHidden: true,
  297. rules: [
  298. {
  299. required: true,
  300. message: "内容不能为空",
  301. trigger: "trigger",
  302. },
  303. ],
  304. html: true,
  305. formatter: (val) => {
  306. return val.content;
  307. },
  308. },
  309. {
  310. label: "类型",
  311. prop: "type",
  312. overHidden: true,
  313. type: "select",
  314. width: 150,
  315. dicData: dicts.system_message_type,
  316. props: { label: "dictLabel", value: "dictValue" },
  317. rules: [
  318. {
  319. required: true,
  320. message: "类型不能为空",
  321. trigger: "trigger",
  322. },
  323. ],
  324. html: true,
  325. },
  326. {
  327. label: "状态",
  328. prop: "state",
  329. display: false,
  330. width: 150,
  331. dicData: [
  332. { label: "暂存", value: "0" },
  333. { label: "已发送", value: "1" },
  334. {label: "过期", value: "2"},
  335. ],
  336. html: true,
  337. formatter: (val) => {
  338. if (val.state === "0") {
  339. return '<b class="el-tag el-tag--warning el-tag--light">暂存</b>';
  340. } else if (val.state === "1") {
  341. return '<b class="el-tag el-tag--success el-tag--light">已发送</b>';
  342. } else if (val.state === "2") {
  343. return '<b class="el-tag el-tag--danger el-tag--light">过期</b>';
  344. }
  345. },
  346. },
  347. {
  348. label: "创建人",
  349. prop: "creator",
  350. display: false,
  351. },
  352. {
  353. label: "创建时间",
  354. prop: "created",
  355. display: false,
  356. },
  357. ],
  358. });
  359. onMounted(() => {
  360. // console.log("crudRef", crudRef)
  361. //0:系统消息 5:消息公告
  362. search.value.types = [0, 5];
  363. search.value.msgId = "0";
  364. dataList();
  365. queryUserList();
  366. });
  367. </script>