sms-config-app.tsx 9.5 KB

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