index.vue 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. <template>
  2. <view class="yd-page-container">
  3. <!-- 顶部导航栏 -->
  4. <wd-navbar
  5. :title="getTitle"
  6. left-arrow placeholder safe-area-inset-top fixed
  7. @click-left="handleBack"
  8. />
  9. <!-- 表单区域 -->
  10. <view>
  11. <wd-form ref="formRef" :model="formData" :rules="formRules">
  12. <wd-cell-group border>
  13. <wd-input
  14. v-model="formData.signature"
  15. label="短信签名"
  16. label-width="200rpx"
  17. prop="signature"
  18. clearable
  19. placeholder="请输入短信签名"
  20. />
  21. <wd-cell title="渠道编码" title-width="200rpx" prop="code" center>
  22. <wd-picker
  23. v-model="formData.code"
  24. :columns="getStrDictOptions(DICT_TYPE.SYSTEM_SMS_CHANNEL_CODE)"
  25. label-key="label"
  26. value-key="value"
  27. placeholder="请选择渠道编码"
  28. />
  29. </wd-cell>
  30. <wd-cell title="启用状态" title-width="200rpx" prop="status" center>
  31. <wd-radio-group v-model="formData.status" shape="button">
  32. <wd-radio
  33. v-for="dict in getIntDictOptions(DICT_TYPE.COMMON_STATUS)"
  34. :key="dict.value"
  35. :value="dict.value"
  36. >
  37. {{ dict.label }}
  38. </wd-radio>
  39. </wd-radio-group>
  40. </wd-cell>
  41. <wd-input
  42. v-model="formData.apiKey"
  43. label="API 账号"
  44. label-width="200rpx"
  45. prop="apiKey"
  46. clearable
  47. placeholder="请输入短信 API 账号"
  48. />
  49. <wd-input
  50. v-model="formData.apiSecret"
  51. label="API 密钥"
  52. label-width="200rpx"
  53. prop="apiSecret"
  54. clearable
  55. placeholder="请输入短信 API 密钥"
  56. />
  57. <wd-input
  58. v-model="formData.callbackUrl"
  59. label="回调 URL"
  60. label-width="200rpx"
  61. prop="callbackUrl"
  62. clearable
  63. placeholder="请输入短信发送回调 URL"
  64. />
  65. <wd-textarea
  66. v-model="formData.remark"
  67. label="备注"
  68. label-width="200rpx"
  69. prop="remark"
  70. clearable
  71. placeholder="请输入备注"
  72. />
  73. </wd-cell-group>
  74. </wd-form>
  75. </view>
  76. <!-- 底部保存按钮 -->
  77. <view class="fixed bottom-0 left-0 right-0 bg-white p-24rpx">
  78. <wd-button
  79. type="primary"
  80. block
  81. :loading="formLoading"
  82. @click="handleSubmit"
  83. >
  84. 保存
  85. </wd-button>
  86. </view>
  87. </view>
  88. </template>
  89. <script lang="ts" setup>
  90. import type { SmsChannel } from '@/api/system/sms/channel'
  91. import { computed, onMounted, ref } from 'vue'
  92. import { useToast } from 'wot-design-uni'
  93. import { createSmsChannel, getSmsChannel, updateSmsChannel } from '@/api/system/sms/channel'
  94. import { getIntDictOptions, getStrDictOptions } from '@/hooks/useDict'
  95. import { navigateBackPlus } from '@/utils'
  96. import { CommonStatusEnum, DICT_TYPE } from '@/utils/constants'
  97. const props = defineProps<{
  98. id?: number | any
  99. }>()
  100. definePage({
  101. style: {
  102. navigationBarTitleText: '',
  103. navigationStyle: 'custom',
  104. },
  105. })
  106. const toast = useToast()
  107. const getTitle = computed(() => props.id ? '编辑短信渠道' : '新增短信渠道')
  108. const formLoading = ref(false)
  109. const formData = ref<SmsChannel>({
  110. id: undefined,
  111. signature: '',
  112. code: '',
  113. status: CommonStatusEnum.ENABLE,
  114. apiKey: '',
  115. apiSecret: '',
  116. callbackUrl: '',
  117. remark: '',
  118. })
  119. const formRules = {
  120. signature: [{ required: true, message: '短信签名不能为空' }],
  121. code: [{ required: true, message: '渠道编码不能为空' }],
  122. status: [{ required: true, message: '启用状态不能为空' }],
  123. apiKey: [{ required: true, message: 'API 账号不能为空' }],
  124. }
  125. const formRef = ref()
  126. /** 返回上一页 */
  127. function handleBack() {
  128. navigateBackPlus('/pages-system/sms/index')
  129. }
  130. /** 加载详情 */
  131. async function getDetail() {
  132. if (!props.id) {
  133. return
  134. }
  135. formData.value = await getSmsChannel(props.id)
  136. }
  137. /** 提交表单 */
  138. async function handleSubmit() {
  139. const { valid } = await formRef.value.validate()
  140. if (!valid) {
  141. return
  142. }
  143. formLoading.value = true
  144. try {
  145. if (props.id) {
  146. await updateSmsChannel(formData.value)
  147. toast.success('修改成功')
  148. } else {
  149. await createSmsChannel(formData.value)
  150. toast.success('新增成功')
  151. }
  152. setTimeout(() => {
  153. handleBack()
  154. }, 500)
  155. } finally {
  156. formLoading.value = false
  157. }
  158. }
  159. /** 初始化 */
  160. onMounted(() => {
  161. getDetail()
  162. })
  163. </script>
  164. <style lang="scss" scoped>
  165. </style>