EventMangeTable.vue 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323
  1. <script setup lang="ts">
  2. import Table from '@/components/Table.vue'
  3. import Dialog from '@/components/common/Dialog.vue'
  4. import { useRequest } from '@/hooks/useRequest'
  5. import { useCommonStore } from '@/stores/useCommon'
  6. import type { TablePaginationSetting, TableFieldInfo, QueryInfo, SelectInfo } from '@/types/table'
  7. import { FieldSpecialEffectType, FilterType } from '@/types/table'
  8. import type { ReqConfig } from '@/types/dataAnalysis'
  9. import type { FormRules } from 'element-plus'
  10. import { type DialogConfig } from '@/types/dialog'
  11. import { FormFieldType } from '@/types/form'
  12. import type { FormField } from '@/types/form'
  13. import { reactive, ref, watch } from 'vue'
  14. import router from '@/router'
  15. const { selectInfo } = useCommonStore()
  16. const { AllApi } = useRequest()
  17. const eventDialog = ref()
  18. const eventTable = ref<InstanceType<typeof Table> | null>(null)
  19. // 主要为了给面包屑导航提供信息
  20. const emits = defineEmits(['enterDetail', 'upload'])
  21. // 表格分页设置
  22. const pagingConfig = reactive<TablePaginationSetting>({
  23. limit: 20,
  24. currentPage: 1,
  25. total: 0,
  26. pagesizeList: [20, 30]
  27. })
  28. // 表格字段信息
  29. const tableFieldsInfo = reactive<Array<TableFieldInfo>>([
  30. {
  31. name: 'id',
  32. cnName: 'ID',
  33. isShow: true,
  34. needSort: true
  35. },
  36. {
  37. name: 'gid',
  38. cnName: '游戏ID',
  39. isShow: true,
  40. needSort: false
  41. },
  42. {
  43. name: 'actionId',
  44. cnName: '事件ID',
  45. isShow: true,
  46. needSort: false
  47. },
  48. {
  49. name: 'actionName',
  50. cnName: '事件名称',
  51. isShow: true,
  52. needSort: false
  53. },
  54. {
  55. name: 'status',
  56. cnName: '事件状态',
  57. isShow: true,
  58. needSort: false,
  59. specialEffect: {
  60. type: FieldSpecialEffectType.STATE,
  61. othnerInfo: {
  62. text: ['已使用', '已停用']
  63. }
  64. }
  65. },
  66. {
  67. name: 'remark',
  68. cnName: '备注',
  69. isShow: true,
  70. needSort: false
  71. },
  72. {
  73. name: 'createdAt',
  74. cnName: '创建时间',
  75. isShow: true,
  76. needSort: false
  77. },
  78. {
  79. name: 'updatedAt',
  80. cnName: '更新时间',
  81. isShow: true,
  82. needSort: false
  83. }
  84. ])
  85. // 表格请求配置
  86. const requestConfig = reactive<ReqConfig>({
  87. url: AllApi.gameActionList,
  88. otherOptions: {
  89. gid: selectInfo.gid
  90. }
  91. })
  92. // 事件类型查询信息
  93. const eventStatus: Array<SelectInfo> = [
  94. {
  95. name: 'all',
  96. cnName: '全部',
  97. value: ''
  98. },
  99. {
  100. name: 'use',
  101. cnName: '启用',
  102. value: '1'
  103. },
  104. {
  105. name: 'nouse',
  106. cnName: '禁用',
  107. value: '0'
  108. }
  109. ]
  110. // 查询字段设置
  111. const queryInfo: Array<QueryInfo> = [
  112. {
  113. name: 'search',
  114. label: '',
  115. type: FilterType.INPUT,
  116. placeholder: '请输入事件名搜索',
  117. default: ''
  118. },
  119. {
  120. name: 'status',
  121. label: '事件状态',
  122. type: FilterType.SELECT,
  123. placeholder: '请选择事件类型',
  124. otherOption: eventStatus,
  125. default: ''
  126. }
  127. ]
  128. // 对话框表单规则字段
  129. const dilogRuleForm = reactive({
  130. actionId: '',
  131. actionName: '',
  132. remark: '',
  133. status: ''
  134. })
  135. // 对话表单规则
  136. const dialogRules = reactive<FormRules<typeof dilogRuleForm>>({
  137. actionId: [
  138. { required: true, message: '事件ID是必填项', trigger: 'blur' },
  139. { min: 1, max: 10, message: '事件ID长度必须在1到10之间', trigger: 'blur' }
  140. ],
  141. actionName: [
  142. { required: true, message: '事件名称是必填项', trigger: 'blur' },
  143. { min: 5, max: 20, message: '事件名称长度必须在5到20之间', trigger: 'blur' }
  144. ],
  145. remark: [
  146. { required: false, message: '备注是可选项', trigger: 'blur' },
  147. { max: 100, message: '备注长度不能超过100个字符', trigger: 'blur' }
  148. ],
  149. status: [
  150. { required: true, message: '是否启用是必选项', trigger: 'change' },
  151. { type: 'number', message: '启用状态必须是数字', trigger: 'change' }
  152. ]
  153. })
  154. // 对话框请求参数
  155. const dialogReq = reactive<ReqConfig>({
  156. url: AllApi.setGameAction,
  157. otherOptions: {
  158. formData: {
  159. gid: selectInfo.gid
  160. }
  161. }
  162. })
  163. // 对话框表单字段信息
  164. const FormFields: Array<FormField> = [
  165. {
  166. name: 'actionId',
  167. cnName: '事件ID',
  168. type: FormFieldType.INPUT
  169. },
  170. {
  171. name: 'actionName',
  172. cnName: '事件名称',
  173. type: FormFieldType.INPUT
  174. },
  175. {
  176. name: 'remark',
  177. cnName: '备注',
  178. type: FormFieldType.RICHTEXT
  179. },
  180. {
  181. name: 'status',
  182. cnName: '是否启用',
  183. type: FormFieldType.SELECT,
  184. otherOptions: {
  185. placeholder: '请选择启用状态',
  186. options: [
  187. {
  188. name: 'use',
  189. label: '启用',
  190. value: 1
  191. },
  192. {
  193. name: 'nouse',
  194. label: '禁用',
  195. value: 0
  196. }
  197. ]
  198. }
  199. }
  200. ]
  201. // 对话框需要的props
  202. const dialogInfo = reactive<DialogConfig>({
  203. title: '新增事件',
  204. rules: dialogRules,
  205. reqConfig: dialogReq,
  206. fieldsInfo: FormFields
  207. })
  208. /**
  209. * @description: 查看详情,同时触发事件给面包屑导航
  210. * @param {*} row 行信息
  211. * @return {*}
  212. */
  213. const viewDetails = (row: any) => {
  214. if (row.id) {
  215. emits('enterDetail', {
  216. name: row.actionName,
  217. pathName: 'EventDetail'
  218. })
  219. router.push({
  220. name: 'EventDetail',
  221. query: { id: row.id }
  222. })
  223. } else {
  224. throw new Error('no id')
  225. }
  226. }
  227. /**
  228. * @description: 触发新增
  229. * @return {*}
  230. */
  231. const addNewEvent = () => {
  232. eventDialog.value.addForm()
  233. }
  234. /**
  235. * @description: 表单提交
  236. * @return {*}
  237. */
  238. const subForm = () => {
  239. if (eventTable.value) {
  240. eventTable.value.getData()
  241. }
  242. }
  243. /**
  244. * @description: 更新表格数据
  245. * @return {*}
  246. */
  247. const updateData = () => {
  248. eventTable.value?.getData()
  249. }
  250. watch(
  251. () => selectInfo.gid,
  252. (val: string) => {
  253. requestConfig.otherOptions.gid = val
  254. dialogReq.otherOptions.formData.gid = val // 把对话框的form表单的gid也改了
  255. // requestConfig.otherOptions.formData.gid = val
  256. }
  257. )
  258. defineExpose({
  259. updateData
  260. })
  261. </script>
  262. <template>
  263. <div>
  264. <Table
  265. ref="eventTable"
  266. :need-rowindex="false"
  267. :request-config="requestConfig"
  268. :open-page-query="true"
  269. :pagination-config="pagingConfig"
  270. :table-fields-info="tableFieldsInfo"
  271. :query-info="queryInfo"
  272. :need-left-tools="true"
  273. :open-filter-query="true"
  274. :need-right-tools="true"
  275. @add-new-item="addNewEvent"
  276. >
  277. <template #tableOperation>
  278. <el-table-column label="操作" align="center">
  279. <template #default="scope">
  280. <el-text class="operationBtn" type="primary" @click="viewDetails(scope.row)"
  281. >详情</el-text
  282. >
  283. </template>
  284. </el-table-column>
  285. </template>
  286. </Table>
  287. <div class="eventDialog">
  288. <Dialog ref="eventDialog" @form-submit="subForm" :config="dialogInfo"></Dialog>
  289. </div>
  290. </div>
  291. </template>
  292. <style scoped>
  293. .operationBtn {
  294. cursor: pointer;
  295. }
  296. </style>