genInfoForm.vue 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294
  1. <template>
  2. <el-form ref="genInfoForm" :model="infoForm" :rules="rules" label-width="150px">
  3. <el-row>
  4. <el-col :span="12">
  5. <el-form-item prop="tplCategory">
  6. <template #label>生成模板</template>
  7. <el-select v-model="infoForm.tplCategory" @change="tplSelectChange">
  8. <el-option label="单表(增删改查)" value="crud" />
  9. <el-option label="树表(增删改查)" value="tree" />
  10. </el-select>
  11. </el-form-item>
  12. </el-col>
  13. <el-col :span="12">
  14. <el-form-item prop="packageName">
  15. <template #label>
  16. 生成包路径
  17. <el-tooltip content="生成在哪个java包下,例如 com.ruoyi.system" placement="top">
  18. <el-icon><question-filled /></el-icon>
  19. </el-tooltip>
  20. </template>
  21. <el-input v-model="infoForm.packageName" />
  22. </el-form-item>
  23. </el-col>
  24. <el-col :span="12">
  25. <el-form-item prop="moduleName">
  26. <template #label>
  27. 生成模块名
  28. <el-tooltip content="可理解为子系统名,例如 system" placement="top">
  29. <el-icon><question-filled /></el-icon>
  30. </el-tooltip>
  31. </template>
  32. <el-input v-model="infoForm.moduleName" />
  33. </el-form-item>
  34. </el-col>
  35. <el-col :span="12">
  36. <el-form-item prop="businessName">
  37. <template #label>
  38. 生成业务名
  39. <el-tooltip content="可理解为功能英文名,例如 user" placement="top">
  40. <el-icon><question-filled /></el-icon>
  41. </el-tooltip>
  42. </template>
  43. <el-input v-model="infoForm.businessName" />
  44. </el-form-item>
  45. </el-col>
  46. <el-col :span="12">
  47. <el-form-item prop="functionName">
  48. <template #label>
  49. 生成功能名
  50. <el-tooltip content="用作类描述,例如 用户" placement="top">
  51. <el-icon><question-filled /></el-icon>
  52. </el-tooltip>
  53. </template>
  54. <el-input v-model="infoForm.functionName" />
  55. </el-form-item>
  56. </el-col>
  57. <el-col :span="12">
  58. <el-form-item>
  59. <template #label>
  60. 上级菜单
  61. <el-tooltip content="分配到指定菜单下,例如 系统管理" placement="top">
  62. <el-icon><question-filled /></el-icon>
  63. </el-tooltip>
  64. </template>
  65. <el-tree-select
  66. v-model="infoForm.parentMenuId"
  67. :data="menuOptions"
  68. :props="{ value: 'menuId', label: 'menuName', children: 'children' }"
  69. value-key="menuId"
  70. node-key="menuId"
  71. placeholder="选择上级菜单"
  72. check-strictly
  73. filterable
  74. clearable
  75. highlight-current
  76. />
  77. </el-form-item>
  78. </el-col>
  79. <el-col :span="12">
  80. <el-form-item prop="genType">
  81. <template #label>
  82. 生成代码方式
  83. <el-tooltip content="默认为zip压缩包下载,也可以自定义生成路径" placement="top">
  84. <el-icon><question-filled /></el-icon>
  85. </el-tooltip>
  86. </template>
  87. <el-radio v-model="infoForm.genType" label="0">zip压缩包</el-radio>
  88. <el-radio v-model="infoForm.genType" label="1">自定义路径</el-radio>
  89. </el-form-item>
  90. </el-col>
  91. <el-col v-if="infoForm.genType == '1'" :span="24">
  92. <el-form-item prop="genPath">
  93. <template #label>
  94. 自定义路径
  95. <el-tooltip content="填写磁盘绝对路径,若不填写,则生成到当前Web项目下" placement="top">
  96. <el-icon><question-filled /></el-icon>
  97. </el-tooltip>
  98. </template>
  99. <el-input v-model="infoForm.genPath">
  100. <template #append>
  101. <el-dropdown>
  102. <el-button type="primary">
  103. 最近路径快速选择
  104. <i class="el-icon-arrow-down el-icon--right"></i>
  105. </el-button>
  106. <template #dropdown>
  107. <el-dropdown-menu>
  108. <el-dropdown-item @click="infoForm.genPath = '/'">恢复默认的生成基础路径</el-dropdown-item>
  109. </el-dropdown-menu>
  110. </template>
  111. </el-dropdown>
  112. </template>
  113. </el-input>
  114. </el-form-item>
  115. </el-col>
  116. </el-row>
  117. <template v-if="info.tplCategory == 'tree'">
  118. <h4 class="form-header">其他信息</h4>
  119. <el-row v-show="info.tplCategory == 'tree'">
  120. <el-col :span="12">
  121. <el-form-item>
  122. <template #label>
  123. 树编码字段
  124. <el-tooltip content="树显示的编码字段名, 如:dept_id" placement="top">
  125. <el-icon><question-filled /></el-icon>
  126. </el-tooltip>
  127. </template>
  128. <el-select v-model="infoForm.treeCode" placeholder="请选择">
  129. <el-option
  130. v-for="(column, index) in info.columns"
  131. :key="index"
  132. :label="column.columnName + ':' + column.columnComment"
  133. :value="column.columnName"
  134. ></el-option>
  135. </el-select>
  136. </el-form-item>
  137. </el-col>
  138. <el-col :span="12">
  139. <el-form-item>
  140. <template #label>
  141. 树父编码字段
  142. <el-tooltip content="树显示的父编码字段名, 如:parent_Id" placement="top">
  143. <el-icon><question-filled /></el-icon>
  144. </el-tooltip>
  145. </template>
  146. <el-select v-model="infoForm.treeParentCode" placeholder="请选择">
  147. <el-option
  148. v-for="(column, index) in infoForm.columns"
  149. :key="index"
  150. :label="column.columnName + ':' + column.columnComment"
  151. :value="column.columnName"
  152. ></el-option>
  153. </el-select>
  154. </el-form-item>
  155. </el-col>
  156. <el-col :span="12">
  157. <el-form-item>
  158. <template #label>
  159. 树名称字段
  160. <el-tooltip content="树节点的显示名称字段名, 如:dept_name" placement="top">
  161. <el-icon><question-filled /></el-icon>
  162. </el-tooltip>
  163. </template>
  164. <el-select v-model="infoForm.treeName" placeholder="请选择">
  165. <el-option
  166. v-for="(column, index) in info.columns"
  167. :key="index"
  168. :label="column.columnName + ':' + column.columnComment"
  169. :value="column.columnName"
  170. ></el-option>
  171. </el-select>
  172. </el-form-item>
  173. </el-col>
  174. </el-row>
  175. </template>
  176. <template v-if="info.tplCategory == 'sub'">
  177. <h4 class="form-header">关联信息</h4>
  178. <el-row>
  179. <el-col :span="12">
  180. <el-form-item>
  181. <template #label>
  182. 关联子表的表名
  183. <el-tooltip content="关联子表的表名, 如:sys_user" placement="top">
  184. <el-icon><question-filled /></el-icon>
  185. </el-tooltip>
  186. </template>
  187. <el-select v-model="infoForm.subTableName" placeholder="请选择" @change="subSelectChange">
  188. <el-option v-for="(t, index) in table" :key="index" :label="t.tableName + ':' + t.tableComment" :value="t.tableName"></el-option>
  189. </el-select>
  190. </el-form-item>
  191. </el-col>
  192. <el-col :span="12">
  193. <el-form-item>
  194. <template #label>
  195. 子表关联的外键名
  196. <el-tooltip content="子表关联的外键名, 如:user_id" placement="top">
  197. <el-icon><question-filled /></el-icon>
  198. </el-tooltip>
  199. </template>
  200. <el-select v-model="infoForm.subTableFkName" placeholder="请选择">
  201. <el-option
  202. v-for="(column, index) in subColumns"
  203. :key="index"
  204. :label="column.columnName + ':' + column.columnComment"
  205. :value="column.columnName"
  206. ></el-option>
  207. </el-select>
  208. </el-form-item>
  209. </el-col>
  210. </el-row>
  211. </template>
  212. </el-form>
  213. </template>
  214. <script setup lang="ts">
  215. import { listMenu } from '@/api/system/menu';
  216. import { propTypes } from '@/utils/propTypes';
  217. interface MenuOptionsType {
  218. menuId: number | string;
  219. menuName: string;
  220. children: MenuOptionsType[] | undefined;
  221. }
  222. const subColumns = ref<any>([]);
  223. const menuOptions = ref<Array<MenuOptionsType>>([]);
  224. const { proxy } = getCurrentInstance();
  225. const props = defineProps({
  226. info: propTypes.any.def(null),
  227. tables: propTypes.any.def(null)
  228. });
  229. const infoForm = computed(() => props.info);
  230. const table = computed(() => props.tables);
  231. // 表单校验
  232. const rules = ref({
  233. tplCategory: [{ required: true, message: '请选择生成模板', trigger: 'blur' }],
  234. packageName: [{ required: true, message: '请输入生成包路径', trigger: 'blur' }],
  235. moduleName: [{ required: true, message: '请输入生成模块名', trigger: 'blur' }],
  236. businessName: [{ required: true, message: '请输入生成业务名', trigger: 'blur' }],
  237. functionName: [{ required: true, message: '请输入生成功能名', trigger: 'blur' }]
  238. });
  239. const subSelectChange = () => {
  240. infoForm.value.subTableFkName = '';
  241. };
  242. const tplSelectChange = (value: string) => {
  243. if (value !== 'sub') {
  244. infoForm.value.subTableName = '';
  245. infoForm.value.subTableFkName = '';
  246. }
  247. };
  248. const setSubTableColumns = (value: string) => {
  249. table.value.forEach((item: any) => {
  250. const name = item.tableName;
  251. if (value === name) {
  252. subColumns.value = item.columns;
  253. return;
  254. }
  255. });
  256. };
  257. /** 查询菜单下拉树结构 */
  258. const getMenuTreeselect = async () => {
  259. const res = await listMenu();
  260. res.data.forEach((m) => (m.menuId = m.menuId.toString()));
  261. const data = proxy?.handleTree<MenuOptionsType>(res.data, 'menuId');
  262. if (data) {
  263. menuOptions.value = data;
  264. }
  265. };
  266. watch(
  267. () => props.info.subTableName,
  268. (val) => {
  269. setSubTableColumns(val);
  270. }
  271. );
  272. onMounted(() => {
  273. getMenuTreeselect();
  274. });
  275. </script>