index.vue 9.6 KB

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