index.vue 9.1 KB

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