email-config.tsx 10 KB

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