index.vue 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  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.name"
  15. label="模板名称"
  16. label-width="200rpx"
  17. prop="name"
  18. clearable
  19. placeholder="请输入模板名称"
  20. />
  21. <wd-input
  22. v-model="formData.code"
  23. label="模板编码"
  24. label-width="200rpx"
  25. prop="code"
  26. clearable
  27. placeholder="请输入模板编码"
  28. />
  29. <wd-input
  30. v-model="formData.nickname"
  31. label="发送人名称"
  32. label-width="200rpx"
  33. prop="nickname"
  34. clearable
  35. placeholder="请输入发送人名称"
  36. />
  37. <wd-cell title="模板类型" title-width="200rpx" prop="type" center>
  38. <wd-picker
  39. v-model="formData.type"
  40. :columns="templateTypeOptions"
  41. placeholder="请选择模板类型"
  42. />
  43. </wd-cell>
  44. <wd-cell title="状态" title-width="200rpx" prop="status" center>
  45. <wd-radio-group v-model="formData.status" shape="button">
  46. <wd-radio
  47. v-for="dict in getIntDictOptions(DICT_TYPE.COMMON_STATUS)"
  48. :key="dict.value"
  49. :value="dict.value"
  50. >
  51. {{ dict.label }}
  52. </wd-radio>
  53. </wd-radio-group>
  54. </wd-cell>
  55. <wd-textarea
  56. v-model="formData.content"
  57. label="模板内容"
  58. label-width="200rpx"
  59. prop="content"
  60. clearable
  61. placeholder="请输入模板内容"
  62. :rows="4"
  63. />
  64. <wd-textarea
  65. v-model="formData.remark"
  66. label="备注"
  67. label-width="200rpx"
  68. prop="remark"
  69. clearable
  70. placeholder="请输入备注"
  71. />
  72. </wd-cell-group>
  73. </wd-form>
  74. </view>
  75. <!-- 底部保存按钮 -->
  76. <view class="yd-detail-footer">
  77. <wd-button
  78. type="primary"
  79. block
  80. :loading="formLoading"
  81. @click="handleSubmit"
  82. >
  83. 保存
  84. </wd-button>
  85. </view>
  86. </view>
  87. </template>
  88. <script lang="ts" setup>
  89. import type { NotifyTemplate } from '@/api/system/notify/template'
  90. import { computed, onMounted, ref } from 'vue'
  91. import { useToast } from 'wot-design-uni'
  92. import { createNotifyTemplate, getNotifyTemplate, updateNotifyTemplate } from '@/api/system/notify/template'
  93. import { getIntDictOptions } from '@/hooks/useDict'
  94. import { navigateBackPlus } from '@/utils'
  95. import { CommonStatusEnum, DICT_TYPE } from '@/utils/constants'
  96. const props = defineProps<{
  97. id?: number | any
  98. }>()
  99. definePage({
  100. style: {
  101. navigationBarTitleText: '',
  102. navigationStyle: 'custom',
  103. },
  104. })
  105. const toast = useToast()
  106. const getTitle = computed(() => props.id ? '编辑站内信模板' : '新增站内信模板')
  107. const formLoading = ref(false)
  108. const formData = ref<NotifyTemplate>({
  109. id: undefined,
  110. name: '',
  111. code: '',
  112. nickname: '',
  113. content: '',
  114. type: undefined,
  115. status: CommonStatusEnum.ENABLE,
  116. remark: '',
  117. })
  118. const formRules = {
  119. name: [{ required: true, message: '模板名称不能为空' }],
  120. code: [{ required: true, message: '模板编码不能为空' }],
  121. nickname: [{ required: true, message: '发送人名称不能为空' }],
  122. type: [{ required: true, message: '模板类型不能为空' }],
  123. status: [{ required: true, message: '状态不能为空' }],
  124. content: [{ required: true, message: '模板内容不能为空' }],
  125. }
  126. const formRef = ref()
  127. /** 模板类型选项 */
  128. const templateTypeOptions = computed(() => {
  129. return getIntDictOptions(DICT_TYPE.SYSTEM_NOTIFY_TEMPLATE_TYPE).map(item => ({
  130. value: item.value,
  131. label: item.label,
  132. }))
  133. })
  134. /** 返回上一页 */
  135. function handleBack() {
  136. navigateBackPlus('/pages-system/notify/index')
  137. }
  138. /** 加载详情 */
  139. async function getDetail() {
  140. if (!props.id) {
  141. return
  142. }
  143. formData.value = await getNotifyTemplate(props.id)
  144. }
  145. /** 提交表单 */
  146. async function handleSubmit() {
  147. const { valid } = await formRef.value.validate()
  148. if (!valid) {
  149. return
  150. }
  151. formLoading.value = true
  152. try {
  153. if (props.id) {
  154. await updateNotifyTemplate(formData.value)
  155. toast.success('修改成功')
  156. } else {
  157. await createNotifyTemplate(formData.value)
  158. toast.success('新增成功')
  159. }
  160. setTimeout(() => {
  161. handleBack()
  162. }, 500)
  163. } finally {
  164. formLoading.value = false
  165. }
  166. }
  167. /** 初始化 */
  168. onMounted(() => {
  169. getDetail()
  170. })
  171. </script>
  172. <style lang="scss" scoped>
  173. </style>