index.vue 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  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. <DeptPicker
  14. v-model="formData.parentId"
  15. label="上级部门"
  16. :show-root="true"
  17. />
  18. <wd-input
  19. v-model="formData.name"
  20. label="部门名称"
  21. label-width="180rpx"
  22. prop="name"
  23. clearable
  24. placeholder="请输入部门名称"
  25. />
  26. <wd-cell title="显示顺序" title-width="180rpx" prop="sort" center>
  27. <wd-input-number
  28. v-model="formData.sort"
  29. :min="0"
  30. />
  31. </wd-cell>
  32. <UserPicker
  33. v-model="formData.leaderUserId"
  34. type="radio"
  35. />
  36. <wd-input
  37. v-model="formData.phone"
  38. label="联系电话"
  39. label-width="180rpx"
  40. prop="phone"
  41. clearable
  42. placeholder="请输入联系电话"
  43. />
  44. <wd-input
  45. v-model="formData.email"
  46. label="邮箱"
  47. label-width="180rpx"
  48. prop="email"
  49. clearable
  50. placeholder="请输入邮箱"
  51. />
  52. <wd-cell title="状态" title-width="180rpx" prop="status" center>
  53. <wd-switch
  54. v-model="formData.status"
  55. :active-value="CommonStatusEnum.ENABLE"
  56. :inactive-value="CommonStatusEnum.DISABLE"
  57. />
  58. </wd-cell>
  59. </wd-cell-group>
  60. </wd-form>
  61. </view>
  62. <!-- 底部保存按钮 -->
  63. <view class="yd-detail-footer">
  64. <wd-button
  65. type="primary"
  66. block
  67. :loading="formLoading"
  68. @click="handleSubmit"
  69. >
  70. 保存
  71. </wd-button>
  72. </view>
  73. </view>
  74. </template>
  75. <script lang="ts" setup>
  76. import type { FormInstance } from 'wot-design-uni/components/wd-form/types'
  77. import type { Dept } from '@/api/system/dept'
  78. import { computed, onMounted, ref } from 'vue'
  79. import { useToast } from 'wot-design-uni'
  80. import { createDept, getDept, updateDept } from '@/api/system/dept'
  81. import UserPicker from '@/components/system-select/user-picker.vue'
  82. import { navigateBackPlus } from '@/utils'
  83. import { CommonStatusEnum } from '@/utils/constants'
  84. import DeptPicker from './components/dept-picker.vue'
  85. const props = defineProps<{
  86. id?: number | any
  87. parentId?: number
  88. }>()
  89. definePage({
  90. style: {
  91. navigationBarTitleText: '',
  92. navigationStyle: 'custom',
  93. },
  94. })
  95. const toast = useToast()
  96. const getTitle = computed(() => props.id ? '编辑部门' : '新增部门')
  97. const formLoading = ref(false)
  98. const formData = ref<Dept>({
  99. id: undefined,
  100. name: '',
  101. parentId: props.parentId || 0,
  102. sort: 0,
  103. status: CommonStatusEnum.ENABLE,
  104. leaderUserId: undefined,
  105. phone: '',
  106. email: '',
  107. })
  108. const formRules = {
  109. parentId: [{ required: true, message: '上级部门不能为空' }],
  110. name: [{ required: true, message: '部门名称不能为空' }],
  111. sort: [{ required: true, message: '显示顺序不能为空' }],
  112. status: [{ required: true, message: '状态不能为空' }],
  113. }
  114. const formRef = ref<FormInstance>()
  115. /** 返回上一页 */
  116. function handleBack() {
  117. navigateBackPlus('/pages-system/dept/index')
  118. }
  119. /** 加载部门详情 */
  120. async function getDetail() {
  121. if (!props.id) {
  122. return
  123. }
  124. formData.value = await getDept(props.id)
  125. }
  126. /** 提交表单 */
  127. async function handleSubmit() {
  128. const { valid } = await formRef.value.validate()
  129. if (!valid) {
  130. return
  131. }
  132. formLoading.value = true
  133. try {
  134. if (props.id) {
  135. await updateDept(formData.value)
  136. toast.success('修改成功')
  137. } else {
  138. await createDept(formData.value)
  139. toast.success('新增成功')
  140. }
  141. setTimeout(() => {
  142. handleBack()
  143. }, 500)
  144. } finally {
  145. formLoading.value = false
  146. }
  147. }
  148. /** 初始化 */
  149. onMounted(async () => {
  150. // 获取详情
  151. await getDetail()
  152. })
  153. </script>
  154. <style lang="scss" scoped>
  155. </style>