Commit 1c498865939f76da3b866189617fbd340e26c432

Authored by YunaiV
1 parent 1a232f80

refactor(codegen): 统一移动端搜索全部选项语义

yudao-module-infra/src/main/resources/codegen/vue3_admin_uniapp/components/search-form.vue.vm
@@ -42,23 +42,12 @@ @@ -42,23 +42,12 @@
42 #elseif ($column.htmlType == "datetime" && $listOperationCondition == "BETWEEN") 42 #elseif ($column.htmlType == "datetime" && $listOperationCondition == "BETWEEN")
43 <yd-search-date-range v-model="formData.${javaField}" label="${comment}" /> 43 <yd-search-date-range v-model="formData.${javaField}" label="${comment}" />
44 #elseif (($column.htmlType == "select" || $column.htmlType == "radio") && $dictType && "" != $dictType) 44 #elseif (($column.htmlType == "select" || $column.htmlType == "radio") && $dictType && "" != $dictType)
45 - <view class="yd-search-form-item">  
46 - <view class="yd-search-form-label">  
47 - ${comment}  
48 - </view>  
49 - <wd-radio-group v-model="formData.${javaField}" type="button">  
50 - <wd-radio :value="-1">  
51 - 全部  
52 - </wd-radio>  
53 - <wd-radio  
54 - v-for="dict in $dictMethod(DICT_TYPE.$dictType.toUpperCase())"  
55 - :key="dict.value"  
56 - :value="dict.value"  
57 - >  
58 - {{ dict.label }}  
59 - </wd-radio>  
60 - </wd-radio-group>  
61 - </view> 45 + <yd-search-picker
  46 + v-model="formData.${javaField}"
  47 + label="${comment}"
  48 + :columns="$dictMethod(DICT_TYPE.$dictType.toUpperCase())"
  49 + all-option
  50 + />
62 #else 51 #else
63 <view class="yd-search-form-item"> 52 <view class="yd-search-form-item">
64 <view class="yd-search-form-label"> 53 <view class="yd-search-form-label">
@@ -150,11 +139,11 @@ const formData = reactive({ @@ -150,11 +139,11 @@ const formData = reactive({
150 ${column.javaField}: [undefined, undefined] as [number | undefined, number | undefined], 139 ${column.javaField}: [undefined, undefined] as [number | undefined, number | undefined],
151 #elseif ($column.dictType && "" != $column.dictType) 140 #elseif ($column.dictType && "" != $column.dictType)
152 #if(${javaType} == "string") 141 #if(${javaType} == "string")
153 - ${column.javaField}: -1 as -1 | string, // -1 表示全部 142 + ${column.javaField}: undefined as string | undefined,
154 #elseif(${javaType} == "boolean") 143 #elseif(${javaType} == "boolean")
155 - ${column.javaField}: -1 as -1 | boolean, // -1 表示全部 144 + ${column.javaField}: undefined as boolean | undefined,
156 #else 145 #else
157 - ${column.javaField}: -1, // -1 表示全部 146 + ${column.javaField}: undefined as number | undefined,
158 #end 147 #end
159 #elseif(${javaType} == "long" || ${javaType} == "integer" || ${javaType} == "short" || ${javaType} == "double" || ${javaType} == "bigdecimal" || ${javaType} == "byte") 148 #elseif(${javaType} == "long" || ${javaType} == "integer" || ${javaType} == "short" || ${javaType} == "double" || ${javaType} == "bigdecimal" || ${javaType} == "byte")
160 ${column.javaField}: undefined as number | undefined, 149 ${column.javaField}: undefined as number | undefined,
@@ -181,7 +170,7 @@ const placeholder = computed(() =&gt; { @@ -181,7 +170,7 @@ const placeholder = computed(() =&gt; {
181 conditions.push(`${comment}:#[[${]]#formatDate(formData.${javaField}[0])#[[}]]#~#[[${]]#formatDate(formData.${javaField}[1])#[[}]]#`) 170 conditions.push(`${comment}:#[[${]]#formatDate(formData.${javaField}[0])#[[}]]#~#[[${]]#formatDate(formData.${javaField}[1])#[[}]]#`)
182 } 171 }
183 #elseif ($dictType && "" != $dictType) 172 #elseif ($dictType && "" != $dictType)
184 - if (formData.${javaField} !== -1) { 173 + if (formData.${javaField} !== undefined) {
185 conditions.push(`${comment}:#[[${]]#getDictLabel(DICT_TYPE.${dictType.toUpperCase()}, formData.${javaField})#[[}]]#`) 174 conditions.push(`${comment}:#[[${]]#getDictLabel(DICT_TYPE.${dictType.toUpperCase()}, formData.${javaField})#[[}]]#`)
186 } 175 }
187 #else 176 #else
@@ -207,9 +196,7 @@ function handleSearch() { @@ -207,9 +196,7 @@ function handleSearch() {
207 ...formData, 196 ...formData,
208 #foreach($column in $columns) 197 #foreach($column in $columns)
209 #if ($column.listOperation) 198 #if ($column.listOperation)
210 - #if ($column.dictType && "" != $column.dictType)  
211 - ${column.javaField}: formData.${column.javaField} === -1 ? undefined : formData.${column.javaField},  
212 - #elseif ($column.htmlType == "datetime" && $column.listOperationCondition == "BETWEEN") 199 + #if ($column.htmlType == "datetime" && $column.listOperationCondition == "BETWEEN")
213 ${column.javaField}: formatDateRange(formData.${column.javaField}), 200 ${column.javaField}: formatDateRange(formData.${column.javaField}),
214 #end 201 #end
215 #end 202 #end
@@ -224,7 +211,7 @@ function handleReset() { @@ -224,7 +211,7 @@ function handleReset() {
224 #if ($column.htmlType == "datetime" && $column.listOperationCondition == "BETWEEN") 211 #if ($column.htmlType == "datetime" && $column.listOperationCondition == "BETWEEN")
225 formData.${column.javaField} = [undefined, undefined] 212 formData.${column.javaField} = [undefined, undefined]
226 #elseif ($column.dictType && "" != $column.dictType) 213 #elseif ($column.dictType && "" != $column.dictType)
227 - formData.${column.javaField} = -1 214 + formData.${column.javaField} = undefined
228 #else 215 #else
229 formData.${column.javaField} = undefined 216 formData.${column.javaField} = undefined
230 #end 217 #end
yudao-module-infra/src/test/java/cn/iocoder/yudao/module/infra/service/codegen/inner/CodegenEngineUniappTest.java
@@ -10,6 +10,9 @@ import org.junit.jupiter.api.Test; @@ -10,6 +10,9 @@ import org.junit.jupiter.api.Test;
10 import java.util.List; 10 import java.util.List;
11 import java.util.Map; 11 import java.util.Map;
12 12
  13 +import static org.junit.jupiter.api.Assertions.assertFalse;
  14 +import static org.junit.jupiter.api.Assertions.assertTrue;
  15 +
13 /** 16 /**
14 * {@link CodegenEngine} 的 Vue3 Admin Uniapp + Wot UI 单元测试 17 * {@link CodegenEngine} 的 Vue3 Admin Uniapp + Wot UI 单元测试
15 * 18 *
@@ -31,4 +34,29 @@ public class CodegenEngineUniappTest extends CodegenEngineAbstractTest { @@ -31,4 +34,29 @@ public class CodegenEngineUniappTest extends CodegenEngineAbstractTest {
31 assertResult(result, "/vue3_admin_uniapp_one"); 34 assertResult(result, "/vue3_admin_uniapp_one");
32 } 35 }
33 36
  37 + @Test
  38 + public void testExecute_dictSearch() {
  39 + // 准备参数
  40 + CodegenTableDO table = getTable("student")
  41 + .setFrontType(CodegenFrontTypeEnum.VUE3_ADMIN_UNIAPP_WOT.getType())
  42 + .setTemplateType(CodegenTemplateTypeEnum.ONE.getType());
  43 + List<CodegenColumnDO> columns = getColumnList("student");
  44 +
  45 + // 调用并断言数字、布尔字典
  46 + Map<String, String> result = codegenEngine.execute(DbType.MYSQL, table, columns, null, null);
  47 + String searchForm = result.get("yudao-ui-admin-uniapp/src/pages-infra/demo/components/search-form.vue");
  48 + assertFalse(searchForm.contains("<wd-radio"));
  49 + assertTrue(searchForm.contains("all-option"));
  50 + assertTrue(searchForm.contains(":columns=\"getIntDictOptions(DICT_TYPE.SYSTEM_USER_SEX)\""));
  51 + assertTrue(searchForm.contains(":columns=\"getBoolDictOptions(DICT_TYPE.INFRA_BOOLEAN_STRING)\""));
  52 +
  53 + // 调用并断言字符串字典
  54 + columns.stream().filter(column -> "sex".equals(column.getJavaField())).findFirst().orElseThrow()
  55 + .setJavaType("String");
  56 + result = codegenEngine.execute(DbType.MYSQL, table, columns, null, null);
  57 + searchForm = result.get("yudao-ui-admin-uniapp/src/pages-infra/demo/components/search-form.vue");
  58 + assertTrue(searchForm.contains(":columns=\"getStrDictOptions(DICT_TYPE.SYSTEM_USER_SEX)\""));
  59 + assertTrue(searchForm.contains("sex: undefined as string | undefined,"));
  60 + }
  61 +
34 } 62 }
yudao-module-infra/src/test/resources/codegen/vue3_admin_uniapp_one/vue/search-form
@@ -27,40 +27,18 @@ @@ -27,40 +27,18 @@
27 clearable 27 clearable
28 /> 28 />
29 </view> 29 </view>
30 - <view class="yd-search-form-item">  
31 - <view class="yd-search-form-label">  
32 - 性别  
33 - </view>  
34 - <wd-radio-group v-model="formData.sex" type="button">  
35 - <wd-radio :value="-1">  
36 - 全部  
37 - </wd-radio>  
38 - <wd-radio  
39 - v-for="dict in getIntDictOptions(DICT_TYPE.SYSTEM_USER_SEX)"  
40 - :key="dict.value"  
41 - :value="dict.value"  
42 - >  
43 - {{ dict.label }}  
44 - </wd-radio>  
45 - </wd-radio-group>  
46 - </view>  
47 - <view class="yd-search-form-item">  
48 - <view class="yd-search-form-label">  
49 - 是否有效  
50 - </view>  
51 - <wd-radio-group v-model="formData.enabled" type="button">  
52 - <wd-radio :value="-1">  
53 - 全部  
54 - </wd-radio>  
55 - <wd-radio  
56 - v-for="dict in getBoolDictOptions(DICT_TYPE.INFRA_BOOLEAN_STRING)"  
57 - :key="dict.value"  
58 - :value="dict.value"  
59 - >  
60 - {{ dict.label }}  
61 - </wd-radio>  
62 - </wd-radio-group>  
63 - </view> 30 + <yd-search-picker
  31 + v-model="formData.sex"
  32 + label="性别"
  33 + :columns="getIntDictOptions(DICT_TYPE.SYSTEM_USER_SEX)"
  34 + all-option
  35 + />
  36 + <yd-search-picker
  37 + v-model="formData.enabled"
  38 + label="是否有效"
  39 + :columns="getBoolDictOptions(DICT_TYPE.INFRA_BOOLEAN_STRING)"
  40 + all-option
  41 + />
64 <yd-search-date-range v-model="formData.createTime" label="创建时间" /> 42 <yd-search-date-range v-model="formData.createTime" label="创建时间" />
65 <view class="yd-search-form-actions"> 43 <view class="yd-search-form-actions">
66 <wd-button class="flex-1" plain @click="handleReset"> 44 <wd-button class="flex-1" plain @click="handleReset">
@@ -90,8 +68,8 @@ const visible = ref(false) // 搜索弹窗显示状态 @@ -90,8 +68,8 @@ const visible = ref(false) // 搜索弹窗显示状态
90 const formData = reactive({ 68 const formData = reactive({
91 name: undefined as string | undefined, 69 name: undefined as string | undefined,
92 birthday: undefined as string | undefined, 70 birthday: undefined as string | undefined,
93 - sex: -1, // -1 表示全部  
94 - enabled: -1 as -1 | boolean, // -1 表示全部 71 + sex: undefined as number | undefined,
  72 + enabled: undefined as boolean | undefined,
95 createTime: [undefined, undefined] as [number | undefined, number | undefined], 73 createTime: [undefined, undefined] as [number | undefined, number | undefined],
96 }) // 搜索表单数据 74 }) // 搜索表单数据
97 75
@@ -104,10 +82,10 @@ const placeholder = computed(() =&gt; { @@ -104,10 +82,10 @@ const placeholder = computed(() =&gt; {
104 if (formData.birthday) { 82 if (formData.birthday) {
105 conditions.push(`出生日期:${formData.birthday}`) 83 conditions.push(`出生日期:${formData.birthday}`)
106 } 84 }
107 - if (formData.sex !== -1) { 85 + if (formData.sex !== undefined) {
108 conditions.push(`性别:${getDictLabel(DICT_TYPE.SYSTEM_USER_SEX, formData.sex)}`) 86 conditions.push(`性别:${getDictLabel(DICT_TYPE.SYSTEM_USER_SEX, formData.sex)}`)
109 } 87 }
110 - if (formData.enabled !== -1) { 88 + if (formData.enabled !== undefined) {
111 conditions.push(`是否有效:${getDictLabel(DICT_TYPE.INFRA_BOOLEAN_STRING, formData.enabled)}`) 89 conditions.push(`是否有效:${getDictLabel(DICT_TYPE.INFRA_BOOLEAN_STRING, formData.enabled)}`)
112 } 90 }
113 if (formData.createTime?.[0] && formData.createTime?.[1]) { 91 if (formData.createTime?.[0] && formData.createTime?.[1]) {
@@ -121,8 +99,6 @@ function handleSearch() { @@ -121,8 +99,6 @@ function handleSearch() {
121 visible.value = false 99 visible.value = false
122 emit('search', { 100 emit('search', {
123 ...formData, 101 ...formData,
124 - sex: formData.sex === -1 ? undefined : formData.sex,  
125 - enabled: formData.enabled === -1 ? undefined : formData.enabled,  
126 createTime: formatDateRange(formData.createTime), 102 createTime: formatDateRange(formData.createTime),
127 }) 103 })
128 } 104 }
@@ -131,8 +107,8 @@ function handleSearch() { @@ -131,8 +107,8 @@ function handleSearch() {
131 function handleReset() { 107 function handleReset() {
132 formData.name = undefined 108 formData.name = undefined
133 formData.birthday = undefined 109 formData.birthday = undefined
134 - formData.sex = -1  
135 - formData.enabled = -1 110 + formData.sex = undefined
  111 + formData.enabled = undefined
136 formData.createTime = [undefined, undefined] 112 formData.createTime = [undefined, undefined]
137 visible.value = false 113 visible.value = false
138 emit('reset') 114 emit('reset')