wechat-config-template-message.tsx 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332
  1. import {NButton, NDataTable, NFormItem, NInput, NModal, NPageHeader, NSelect, NSpace, NTag, useDialog, useMessage} from 'naive-ui'
  2. import {defineComponent, onMounted, reactive, ref} from 'vue'
  3. import {useRoute, useRouter} from 'vue-router'
  4. import {useTabsViewStore} from '@/store/modules/tabsView'
  5. import SaveForm from "@components/save-form";
  6. import Pagination from "@components/pagination";
  7. import deepClone from "@/utils/deep.clone";
  8. import WechatConfigTemplateEdit from "@views/message/message-config/wechat/modal/wechat-config-template-edit";
  9. import {wxTemplateConfigDetail, wxTemplateConfigRemove, wxTemplateConfigStatus, wxTemplateMessagePage} from "@views/message/api";
  10. export default defineComponent({
  11. name: 'wechat-config-template',
  12. setup(props, ctx) {
  13. const route = useRoute()
  14. const router = useRouter()
  15. const dialog = useDialog()
  16. const message = useMessage()
  17. const state = reactive({
  18. loading: false,
  19. pagination: {
  20. page: 1,
  21. rows: 10,
  22. pageTotal: 0
  23. },
  24. searchForm: {
  25. keyword: null, //关键字
  26. status: null // 状态
  27. },
  28. dataList: [],
  29. showEdit: false,
  30. editMode: 'add',
  31. editRowData: {} as any,
  32. appid: null as any,
  33. wxTemplateConfigId: null as any,
  34. })
  35. const tabsViewStore = useTabsViewStore()
  36. const gotoBack = () => {
  37. tabsViewStore.closeCurrentTab(route)
  38. router.push({
  39. path: '/message/wxTemplateConfig',
  40. query: state.appid
  41. })
  42. }
  43. onMounted(async () => {
  44. state.wxTemplateConfigId = route.query
  45. if (!state.wxTemplateConfigId) {
  46. return
  47. }
  48. {
  49. const {data} = await wxTemplateConfigDetail(state.wxTemplateConfigId)
  50. if (data) {
  51. state.appid = data.appid
  52. } else {
  53. return
  54. }
  55. }
  56. getList()
  57. })
  58. const saveForm = ref()
  59. const onSearch = () => {
  60. saveForm.value?.submit()
  61. }
  62. const onBtnReset = () => {
  63. saveForm.value?.reset()
  64. }
  65. const onSubmit = () => {
  66. state.pagination.page = 1
  67. getList()
  68. }
  69. const getList = async () => {
  70. if (!state.appid) {
  71. return
  72. }
  73. try {
  74. state.loading = true
  75. const {data} = await wxTemplateMessagePage({
  76. ...state.pagination,
  77. ...state.searchForm,
  78. appid: state.appid
  79. })
  80. state.pagination.pageTotal = Number(data.total)
  81. state.dataList = data.rows || []
  82. } catch {
  83. }
  84. state.loading = false
  85. }
  86. const onChangeStatus = (row: any) => {
  87. const statusStr = row.status ? '停用' : '启用'
  88. dialog.warning({
  89. title: '提示',
  90. content: `是否${statusStr}?`,
  91. positiveText: '确定',
  92. negativeText: '取消',
  93. onPositiveClick: async () => {
  94. try {
  95. await wxTemplateConfigStatus({
  96. id: row.id,
  97. status: !row.status
  98. })
  99. getList()
  100. message.success(`${statusStr}成功`)
  101. } catch {
  102. }
  103. }
  104. })
  105. }
  106. const onRmove = (row: any): void => {
  107. dialog.warning({
  108. title: '提示',
  109. content: `删除"${row.name}",是否继续?`,
  110. positiveText: '确定',
  111. negativeText: '取消',
  112. onPositiveClick: async () => {
  113. try {
  114. await wxTemplateConfigRemove(row.id)
  115. getList()
  116. message.success('删除成功')
  117. } catch {
  118. }
  119. }
  120. })
  121. }
  122. const columns = (): any => {
  123. return [
  124. {
  125. title: '编号',
  126. key: 'id'
  127. },
  128. {
  129. title: '应用标志',
  130. key: 'command'
  131. },
  132. {
  133. title: '指令',
  134. key: 'wxTemplateId'
  135. },
  136. {
  137. title: '标题',
  138. key: 'url'
  139. },
  140. {
  141. title: '内容',
  142. key: 'description'
  143. },
  144. {
  145. title: '版本',
  146. key: 'description'
  147. },
  148. {
  149. title: '类型WECHAT',
  150. key: 'description'
  151. },
  152. {
  153. title: 'APP',
  154. key: 'description'
  155. },
  156. {
  157. title: '描述',
  158. key: 'description'
  159. },
  160. {
  161. title: '状态',
  162. key: 'status',
  163. render(row: any) {
  164. return (
  165. <NTag type={row.status ? 'primary' : 'default'}>{row.status ? '启用' : '停用'}</NTag>
  166. )
  167. }
  168. },
  169. {
  170. title: '操作',
  171. key: 'operation',
  172. fixed: 'right',
  173. render(row: any) {
  174. return (
  175. <NSpace>
  176. <NButton
  177. type="primary"
  178. size="small"
  179. text
  180. onClick={() => {
  181. onChangeStatus(row)
  182. }}
  183. >
  184. {row.status ? '停用' : '启用'}
  185. </NButton>
  186. <NButton
  187. type="primary"
  188. size="small"
  189. text
  190. onClick={() => {
  191. state.showEdit = true
  192. state.editRowData = deepClone(row)
  193. state.editMode = 'edit'
  194. }}
  195. >
  196. 修改
  197. </NButton>
  198. <NButton
  199. type="primary"
  200. size="small"
  201. text
  202. disabled={!!row.status}
  203. onClick={() => {
  204. onRmove(row)
  205. }}
  206. >
  207. 删除
  208. </NButton>
  209. </NSpace>
  210. )
  211. }
  212. }
  213. ]
  214. }
  215. return () => (
  216. <div class="system-menu-container">
  217. <NPageHeader
  218. on-back={() => gotoBack()}
  219. title={state.wxTemplateConfigId}
  220. ></NPageHeader>
  221. <div class={['section-container']}>
  222. <div class="system-menu-container">
  223. <SaveForm
  224. ref={saveForm}
  225. model={state.searchForm}
  226. onSubmit={onSubmit}
  227. saveKey="wechat-config-template"
  228. onSetModel={(val: any) => (state.searchForm = val)}
  229. >
  230. <NFormItem label="关键字" path="keyword">
  231. <NInput
  232. placeholder="平台编号/名称"
  233. v-model:value={state.searchForm.keyword}
  234. clearable
  235. />
  236. </NFormItem>
  237. <NFormItem label="状态" path="status">
  238. <NSelect
  239. v-model:value={state.searchForm.status}
  240. clearable
  241. options={
  242. [
  243. {
  244. label: '启用',
  245. value: 1
  246. },
  247. {
  248. label: '停用',
  249. value: 0
  250. }
  251. ] as any
  252. }
  253. placeholder="全部状态"
  254. />
  255. </NFormItem>
  256. <NFormItem>
  257. <NSpace>
  258. <NButton type="primary" onClick={onSearch}>
  259. 搜索
  260. </NButton>
  261. <NButton type="default" onClick={onBtnReset}>
  262. 重置
  263. </NButton>
  264. </NSpace>
  265. </NFormItem>
  266. </SaveForm>
  267. <NSpace style={{paddingBottom: '12px'}}>
  268. <NButton
  269. type="primary"
  270. onClick={() => {
  271. state.showEdit = true
  272. state.editMode = 'add'
  273. }}
  274. >
  275. 新增消息内容
  276. </NButton>
  277. </NSpace>
  278. <div class={['section-container']}>
  279. <NDataTable
  280. loading={state.loading}
  281. columns={columns()}
  282. data={state.dataList}
  283. rowKey={(row: any) => row.id}
  284. scrollX={'1400'}
  285. ></NDataTable>
  286. <Pagination
  287. v-model:page={state.pagination.page}
  288. v-model:pageSize={state.pagination.rows}
  289. v-model:pageTotal={state.pagination.pageTotal}
  290. onList={getList}
  291. sync
  292. saveKey="wechat-config-template"
  293. ></Pagination>
  294. </div>
  295. <NModal
  296. blockScroll={true}
  297. v-model:show={state.showEdit}
  298. preset="dialog"
  299. showIcon={false}
  300. title={(state.editMode == 'add' ? '新增' : '编辑') + '模板'}
  301. style={{width: 'auto'}}
  302. >
  303. <WechatConfigTemplateEdit
  304. editMode={state.editMode}
  305. rowData={state.editRowData}
  306. style={{width: '450'}}
  307. onClose={() => (state.showEdit = false)}
  308. onGetList={() => {
  309. state.pagination.page = 1
  310. getList()
  311. }}
  312. />
  313. </NModal>
  314. </div>
  315. </div>
  316. </div>
  317. )
  318. }
  319. })