Commit 94a1c4636f204c400fabcfffbdbffbbd4eab8f63

Authored by YunaiV
1 parent 33fb112d

feat:【infra】移动端 admin uniapp 的代码生成的优化(api.ts、detail、form 的模版)

yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/inner/CodegenEngine.java
... ... @@ -397,8 +397,8 @@ public class CodegenEngine {
397 397 * @return 格式化后的代码
398 398 */
399 399 private String prettyCode(String content, String vmPath) {
400   - // Vue 界面:去除字段后面多余的 , 逗号,解决前端的 Pretty 代码格式检查的报错(需要排除 vben5)
401   - if (!StrUtil.contains(vmPath, "vben5")) {
  400 + // Vue 界面:去除字段后面多余的 , 逗号,解决前端的 Pretty 代码格式检查的报错(需要排除 vben5、vue3_admin_uniapp)
  401 + if (!StrUtil.containsAny(vmPath, "vben5", "vue3_admin_uniapp")) {
402 402 content = content.replaceAll(",\n}", "\n}").replaceAll(",\n }", "\n }");
403 403 }
404 404 // Vue 界面:去除多的 dateFormatter,只有一个的情况下,说明没使用到
... ...
yudao-module-infra/src/main/resources/codegen/vue3_admin_uniapp/api/api.ts.vm
1 1 import type { PageParam, PageResult } from '@/http/types'
2 2 import { http } from '@/http/http'
3 3  
4   -// TODO @AI:不使用 baseUrl,而是参考之前的,直接写在每个方法里。
5   -#set ($baseURL = "/${table.moduleName}/${simpleClassName_strikeCase}")
6   -const baseUrl = '${baseURL}'
7   -
8 4 #set ($primaryJavaType = $primaryColumn.javaType.toLowerCase())
9 5 #if(${primaryJavaType} == "long" || ${primaryJavaType} == "integer" || ${primaryJavaType} == "short" || ${primaryJavaType} == "double" || ${primaryJavaType} == "bigdecimal" || ${primaryJavaType} == "byte")
10 6 #set ($primaryTsType = "number")
... ... @@ -17,9 +13,12 @@ export interface ${simpleClassName} {
17 13 #foreach ($column in $columns)
18 14 #if ($column.primaryKey || $column.createOperation || $column.updateOperation || $column.listOperationResult)
19 15 #set ($javaType = $column.javaType.toLowerCase())
20   - #set ($optional = $column.nullable || $column.primaryKey)
  16 + #set ($javaFieldLower = $column.javaField.toLowerCase())
  17 + #set ($optional = $column.nullable || $column.primaryKey || $javaFieldLower == "createtime" || $javaFieldLower == "updatetime")
21 18 #if(${javaType} == "long" || ${javaType} == "integer" || ${javaType} == "short" || ${javaType} == "double" || ${javaType} == "bigdecimal" || ${javaType} == "byte")
22 19 ${column.javaField}#if($optional)?#end: number
  20 + #elseif(${javaType} == "date" || ${javaType} == "localdate" || ${javaType} == "localdatetime")
  21 + ${column.javaField}#if($optional)?#end: Date
23 22 #elseif(${javaType} == "boolean")
24 23 ${column.javaField}#if($optional)?#end: boolean
25 24 #else
... ... @@ -31,25 +30,25 @@ export interface ${simpleClassName} {
31 30  
32 31 /** 获取${table.classComment}分页列表 */
33 32 export function get${simpleClassName}Page(params: PageParam) {
34   - return http.get<PageResult<${simpleClassName}>>(baseUrl + '/page', params)
  33 + return http.get<PageResult<${simpleClassName}>>('/${table.moduleName}/${simpleClassName_strikeCase}/page', params)
35 34 }
36 35  
37 36 /** 获取${table.classComment}详情 */
38 37 export function get${simpleClassName}(id: ${primaryTsType}) {
39   - return http.get<${simpleClassName}>(baseUrl + '/get?id=' + id)
  38 + return http.get<${simpleClassName}>('/${table.moduleName}/${simpleClassName_strikeCase}/get?id=' + id)
40 39 }
41 40  
42 41 /** 创建${table.classComment} */
43 42 export function create${simpleClassName}(data: ${simpleClassName}) {
44   - return http.post<number>(baseUrl + '/create', data)
  43 + return http.post<number>('/${table.moduleName}/${simpleClassName_strikeCase}/create', data)
45 44 }
46 45  
47 46 /** 更新${table.classComment} */
48 47 export function update${simpleClassName}(data: ${simpleClassName}) {
49   - return http.put<boolean>(baseUrl + '/update', data)
  48 + return http.put<boolean>('/${table.moduleName}/${simpleClassName_strikeCase}/update', data)
50 49 }
51 50  
52 51 /** 删除${table.classComment} */
53 52 export function delete${simpleClassName}(id: ${primaryTsType}) {
54   - return http.delete<boolean>(baseUrl + '/delete?id=' + id)
  53 + return http.delete<boolean>('/${table.moduleName}/${simpleClassName_strikeCase}/delete?id=' + id)
55 54 }
... ...
yudao-module-infra/src/main/resources/codegen/vue3_admin_uniapp/views/detail/index.vue.vm
1 1 <template>
2 2 <view class="page-container">
  3 + <!-- 顶部导航栏 -->
3 4 <wd-navbar
4 5 title="${table.classComment}详情"
5 6 left-arrow placeholder safe-area-inset-top fixed
6 7 @click-left="handleBack"
7 8 />
8 9  
  10 + <!-- 详情内容 -->
9 11 <view>
10 12 <wd-cell-group border>
11 13 #foreach($column in $columns)
... ... @@ -26,6 +28,7 @@
26 28 </wd-cell-group>
27 29 </view>
28 30  
  31 + <!-- 底部操作按钮 -->
29 32 <view class="fixed bottom-0 left-0 right-0 bg-white p-24rpx">
30 33 <view class="w-full flex gap-24rpx">
31 34 <wd-button
... ... @@ -46,27 +49,27 @@
46 49 </template>
47 50  
48 51 <script lang="ts" setup>
49   -import type { ${simpleClassName} } from '@/api/${table.moduleName}/${table.businessName}'
50   -import { onMounted, ref } from 'vue'
51   -import { useToast } from 'wot-design-uni'
52   -import { delete${simpleClassName}, get${simpleClassName} } from '@/api/${table.moduleName}/${table.businessName}'
53   -import { useAccess } from '@/hooks/useAccess'
54   -import { navigateBackPlus } from '@/utils'
55 52 #set ($hasDict = 0)
56 53 #foreach($column in $columns)
57 54 #if ($hasDict == 0 && $column.dictType && "" != $column.dictType)
58 55 #set ($hasDict = 1)
59 56 #end
60 57 #end
61   -#if ($hasDict == 1)
62   -import { DICT_TYPE } from '@/utils/constants'
63   -#end
64 58 #set ($hasDateTime = 0)
65 59 #foreach($column in $columns)
66 60 #if ($hasDateTime == 0 && $column.javaType == "LocalDateTime")
67 61 #set ($hasDateTime = 1)
68 62 #end
69 63 #end
  64 +import type { ${simpleClassName} } from '@/api/${table.moduleName}/${table.businessName}'
  65 +import { onMounted, ref } from 'vue'
  66 +import { useToast } from 'wot-design-uni'
  67 +import { delete${simpleClassName}, get${simpleClassName} } from '@/api/${table.moduleName}/${table.businessName}'
  68 +import { useAccess } from '@/hooks/useAccess'
  69 +import { navigateBackPlus } from '@/utils'
  70 +#if ($hasDict == 1)
  71 +import { DICT_TYPE } from '@/utils/constants'
  72 +#end
70 73 #if ($hasDateTime == 1)
71 74 import { formatDateTime } from '@/utils/date'
72 75 #end
... ... @@ -84,13 +87,15 @@ definePage({
84 87  
85 88 const { hasAccessByCodes } = useAccess()
86 89 const toast = useToast()
87   -const formData = ref<${simpleClassName}>()
88   -const deleting = ref(false)
  90 +const formData = ref<${simpleClassName}>() // 详情数据
  91 +const deleting = ref(false) // 删除中
89 92  
  93 +/** 返回上一页 */
90 94 function handleBack() {
91 95 navigateBackPlus('/pages-${table.moduleName}/${table.businessName}/index')
92 96 }
93 97  
  98 +/** 加载${table.classComment}详情 */
94 99 async function getDetail() {
95 100 if (!props.id) {
96 101 return
... ... @@ -103,12 +108,14 @@ async function getDetail() {
103 108 }
104 109 }
105 110  
  111 +/** 编辑${table.classComment} */
106 112 function handleEdit() {
107 113 uni.navigateTo({
108   - url: '/pages-${table.moduleName}/${table.businessName}/form/index?id=' + props.id,
  114 + url: `/pages-${table.moduleName}/${table.businessName}/form/index?id=\${props.id}`,
109 115 })
110 116 }
111 117  
  118 +/** 删除${table.classComment} */
112 119 function handleDelete() {
113 120 if (!props.id) {
114 121 return
... ... @@ -134,6 +141,7 @@ function handleDelete() {
134 141 })
135 142 }
136 143  
  144 +/** 初始化 */
137 145 onMounted(() => {
138 146 getDetail()
139 147 })
... ...
yudao-module-infra/src/main/resources/codegen/vue3_admin_uniapp/views/form/index.vue.vm
1 1 <template>
2 2 <view class="page-container">
  3 + <!-- 顶部导航栏 -->
3 4 <wd-navbar
4 5 :title="getTitle"
5 6 left-arrow placeholder safe-area-inset-top fixed
6 7 @click-left="handleBack"
7 8 />
8 9  
  10 + <!-- 表单区域 -->
9 11 <view>
10 12 <wd-form ref="formRef" :model="formData" :rules="formRules">
11 13 <wd-cell-group border>
... ... @@ -23,18 +25,46 @@
23 25 #elseif ($javaType == "Boolean")
24 26 #set ($dictMethod = "getBoolDictOptions")
25 27 #end
26   -
27   - #if (${javaType.toLowerCase()} == "long" || ${javaType.toLowerCase()} == "integer" || ${javaType.toLowerCase()} == "short" || ${javaType.toLowerCase()} == "double" || ${javaType.toLowerCase()} == "bigdecimal" || ${javaType.toLowerCase()} == "byte")
  28 + ## 优先判断是否有字典,有字典则使用 radio-group
  29 + #if (($column.htmlType == "select" || $column.htmlType == "radio") && $dictType && "" != $dictType)
  30 + <wd-cell title="${comment}" title-width="180rpx" prop="${javaField}" center>
  31 + <wd-radio-group v-model="formData.${javaField}" shape="button" size="medium">
  32 + <wd-radio
  33 + v-for="dict in $dictMethod(DICT_TYPE.${dictType.toUpperCase()})"
  34 + :key="dict.value"
  35 + :value="dict.value"
  36 + >
  37 + {{ dict.label }}
  38 + </wd-radio>
  39 + </wd-radio-group>
  40 + </wd-cell>
  41 + ## 数字类型(无字典)
  42 + #elseif (${javaType.toLowerCase()} == "long" || ${javaType.toLowerCase()} == "integer" || ${javaType.toLowerCase()} == "short" || ${javaType.toLowerCase()} == "double" || ${javaType.toLowerCase()} == "bigdecimal" || ${javaType.toLowerCase()} == "byte")
28 43 <wd-cell title="${comment}" title-width="180rpx" prop="${javaField}" center>
29 44 <wd-input-number
30 45 v-model="formData.${javaField}"
31 46 :min="0"
32 47 />
33 48 </wd-cell>
  49 + ## 布尔类型
34 50 #elseif (${javaType.toLowerCase()} == "boolean")
35 51 <wd-cell title="${comment}" title-width="180rpx" prop="${javaField}" center>
36 52 <wd-switch v-model="formData.${javaField}" />
37 53 </wd-cell>
  54 + ## 日期时间类型
  55 + #elseif (${javaType.toLowerCase()} == "date" || ${javaType.toLowerCase()} == "localdate" || ${javaType.toLowerCase()} == "localdatetime")
  56 + #set ($pickerType = "date")
  57 + #if (${javaType.toLowerCase()} == "localdatetime")
  58 + #set ($pickerType = "datetime")
  59 + #end
  60 + <wd-datetime-picker
  61 + v-model="formData.${javaField}"
  62 + type="${pickerType}"
  63 + label="${comment}"
  64 + label-width="180rpx"
  65 + prop="${javaField}"
  66 + />
  67 + ## 文本域
38 68 #elseif ($column.htmlType == "textarea")
39 69 <wd-textarea
40 70 v-model="formData.${javaField}"
... ... @@ -45,18 +75,7 @@
45 75 show-word-limit
46 76 clearable
47 77 />
48   - #elseif (($column.htmlType == "select" || $column.htmlType == "radio") && $dictType && "" != $dictType)
49   - <wd-cell title="${comment}" title-width="180rpx" prop="${javaField}" center>
50   - <wd-radio-group v-model="formData.${javaField}" shape="button" size="medium">
51   - <wd-radio
52   - v-for="dict in $dictMethod(DICT_TYPE.$dictType.toUpperCase())"
53   - :key="dict.value"
54   - :value="dict.value"
55   - >
56   - {{ dict.label }}
57   - </wd-radio>
58   - </wd-radio-group>
59   - </wd-cell>
  78 + ## 默认:文本输入
60 79 #else
61 80 <wd-input
62 81 v-model="formData.${javaField}"
... ... @@ -73,6 +92,7 @@
73 92 </wd-form>
74 93 </view>
75 94  
  95 + <!-- 底部保存按钮 -->
76 96 <view class="fixed bottom-0 left-0 right-0 bg-white p-24rpx">
77 97 <wd-button
78 98 type="primary"
... ... @@ -87,19 +107,12 @@
87 107 </template>
88 108  
89 109 <script lang="ts" setup>
90   -import type { ${simpleClassName} } from '@/api/${table.moduleName}/${table.businessName}'
91   -import { computed, onMounted, ref } from 'vue'
92   -import { useToast } from 'wot-design-uni'
93   -import { create${simpleClassName}, get${simpleClassName}, update${simpleClassName} } from '@/api/${table.moduleName}/${table.businessName}'
94   -import { navigateBackPlus } from '@/utils'
95   -
96 110 #set ($primaryJavaType = $primaryColumn.javaType.toLowerCase())
97 111 #if(${primaryJavaType} == "long" || ${primaryJavaType} == "integer" || ${primaryJavaType} == "short" || ${primaryJavaType} == "double" || ${primaryJavaType} == "bigdecimal" || ${primaryJavaType} == "byte")
98 112 #set ($primaryTsType = "number")
99 113 #else
100 114 #set ($primaryTsType = "string")
101 115 #end
102   -
103 116 #set ($hasDict = 0)
104 117 #set ($hasGetDictOptions = 0)
105 118 #set ($hasGetIntDictOptions = 0)
... ... @@ -121,22 +134,31 @@ import { navigateBackPlus } from &#39;@/utils&#39;
121 134 #end
122 135 #end
123 136 #end
  137 +import type { ${simpleClassName} } from '@/api/${table.moduleName}/${table.businessName}'
  138 +import { computed, onMounted, ref } from 'vue'
  139 +import { useToast } from 'wot-design-uni'
  140 +import { create${simpleClassName}, get${simpleClassName}, update${simpleClassName} } from '@/api/${table.moduleName}/${table.businessName}'
124 141 #if ($hasDict == 1)
125   -import { DICT_TYPE } from '@/utils/constants'
126   -import {
  142 + #set ($dictImportNames = "")
127 143 #if ($hasGetDictOptions == 1)
128   - getDictOptions,
  144 + #set ($dictImportNames = "${dictImportNames}getDictOptions, ")
129 145 #end
130 146 #if ($hasGetIntDictOptions == 1)
131   - getIntDictOptions,
  147 + #set ($dictImportNames = "${dictImportNames}getIntDictOptions, ")
132 148 #end
133 149 #if ($hasGetStrDictOptions == 1)
134   - getStrDictOptions,
  150 + #set ($dictImportNames = "${dictImportNames}getStrDictOptions, ")
135 151 #end
136 152 #if ($hasGetBoolDictOptions == 1)
137   - getBoolDictOptions,
  153 + #set ($dictImportNames = "${dictImportNames}getBoolDictOptions, ")
138 154 #end
139   -} from '@/hooks/useDict'
  155 + #set ($dictImportNames = $dictImportNames.trim())
  156 + #set ($dictImportNames = $dictImportNames.substring(0, $dictImportNames.length() - 1))
  157 +import { $dictImportNames } from '@/hooks/useDict'
  158 +#end
  159 +import { navigateBackPlus } from '@/utils'
  160 +#if ($hasDict == 1)
  161 +import { DICT_TYPE } from '@/utils/constants'
140 162 #end
141 163  
142 164 const props = defineProps<{
... ... @@ -153,39 +175,43 @@ definePage({
153 175 const toast = useToast()
154 176 const getTitle = computed(() => props.id ? '编辑${table.classComment}' : '新增${table.classComment}')
155 177 const formLoading = ref(false)
156   -
157   -// TODO @AI:date + 时间范围,需要特殊处理;参考 /Users/yunai/Java/yudao-ui-admin-uniapp-next-v4/src/pages/message/components/search-form.vue 里的开始结束时间的处理;注意,index.vue.vm 也要调整;
158 178 const formData = ref<${simpleClassName}>({
159 179 #foreach($column in $columns)
160 180 #if (($column.createOperation || $column.updateOperation) || $column.primaryKey)
161 181 #set ($javaType = $column.javaType.toLowerCase())
  182 + #set ($javaFieldLower = $column.javaField.toLowerCase())
  183 + #set ($optional = $column.nullable || $column.primaryKey || $javaFieldLower == "createtime" || $javaFieldLower == "updatetime")
162 184 #if ($column.primaryKey)
163 185 ${column.javaField}: undefined,
164 186 #elseif(${javaType} == "long" || ${javaType} == "integer" || ${javaType} == "short" || ${javaType} == "double" || ${javaType} == "bigdecimal" || ${javaType} == "byte")
165 187 ${column.javaField}: 0,
166 188 #elseif(${javaType} == "boolean")
167 189 ${column.javaField}: false,
  190 + #elseif(${javaType} == "date" || ${javaType} == "localdate" || ${javaType} == "localdatetime")
  191 + ${column.javaField}: undefined,
168 192 #else
169 193 ${column.javaField}: '',
170 194 #end
171 195 #end
172 196 #end
173 197 })
174   -
175 198 const formRules = {
176 199 #foreach($column in $columns)
177   - #if (($column.createOperation || $column.updateOperation) && !$column.nullable && !$column.primaryKey)
  200 + #set ($javaFieldLower = $column.javaField.toLowerCase())
  201 + #if (($column.createOperation || $column.updateOperation) && !$column.nullable && !$column.primaryKey
  202 + && $javaFieldLower != "createtime" && $javaFieldLower != "updatetime")
178 203 ${column.javaField}: [{ required: true, message: '${column.columnComment}不能为空' }],
179 204 #end
180 205 #end
181 206 }
182   -
183 207 const formRef = ref()
184 208  
  209 +/** 返回上一页 */
185 210 function handleBack() {
186 211 navigateBackPlus('/pages-${table.moduleName}/${table.businessName}/index')
187 212 }
188 213  
  214 +/** 加载${table.classComment}详情 */
189 215 async function getDetail() {
190 216 if (!props.id) {
191 217 return
... ... @@ -193,6 +219,7 @@ async function getDetail() {
193 219 formData.value = await get${simpleClassName}(props.id)
194 220 }
195 221  
  222 +/** 提交表单 */
196 223 async function handleSubmit() {
197 224 const { valid } = await formRef.value.validate()
198 225 if (!valid) {
... ... @@ -216,6 +243,7 @@ async function handleSubmit() {
216 243 }
217 244 }
218 245  
  246 +/** 初始化 */
219 247 onMounted(() => {
220 248 getDetail()
221 249 })
... ...