beiyong.vue 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723
  1. <template>
  2. <div class="layout">
  3. <h1 style="margin-top: 10px;margin-bottom: 10px;">页面配置</h1>
  4. <div style="color: #505050;margin-bottom: 20px;">将表单内容进行分步可以提高用户处理的专注度,降低页面的复杂性</div>
  5. <el-card class="mt8" shadow="never" :body-style="{ paddingBottom: '0' }">
  6. <div>
  7. <el-form :inline="true" @submit.stop.prevent>
  8. <el-form-item label="接口地址" style="width: 60%;">
  9. <el-input v-model="state.filter.name" placeholder="请输入接口地址" @keyup.enter="onQuery" />
  10. </el-form-item>
  11. <el-form-item>
  12. <el-button type="primary" icon="ele-Search" @click="onQuery"> 查询 </el-button>
  13. </el-form-item>
  14. </el-form>
  15. </div>
  16. <div>
  17. <el-form :inline="true" @submit.stop.prevent>
  18. <el-form-item label="查询页面接口来源" style="width: 70%;">
  19. <el-select v-model="state.filter.api" placeholder="请选择页面接口来源" @change="onChange(state.filter.api)">
  20. <el-option v-for="(value, key) in state.api" :key="key" :label="value.api+' '+value.summary" :value="value.api" />
  21. </el-select>
  22. </el-form-item>
  23. </el-form>
  24. </div>
  25. </el-card>
  26. <el-card class="mt8" shadow="never" :body-style="{ paddingBottom: '0' }">
  27. <div>
  28. <el-form :inline="true" @submit.stop.prevent>
  29. <el-form-item label="查询按钮" style="width: 100%;"></el-form-item>
  30. <el-form-item label="">
  31. <el-row :gutter="70">
  32. <el-col :xs="6" :sm="6" :md="6" :lg="6" :xl="4" v-for="(v, k) in state.selectBtn" :key="k">
  33. <span style="margin-right: 10px;">{{ v.name }}</span>
  34. <el-switch v-model="v.value" @change="change(k)"></el-switch>
  35. </el-col>
  36. </el-row>
  37. </el-form-item>
  38. </el-form>
  39. </div>
  40. <div>
  41. <el-form :inline="true" @submit.stop.prevent>
  42. <el-form-item label="查询条件配置" style="width: 100%;"></el-form-item>
  43. <el-form-item label="">
  44. <el-row :gutter="100">
  45. <el-col :span="100" :xl="4" v-for="(v, k) in state.selectVal" :key="k">
  46. <span style="margin-right: 10px;">{{ v.description }}</span>
  47. <el-switch v-model="v.value" @change="change(k)"></el-switch>
  48. </el-col>
  49. </el-row>
  50. </el-form-item>
  51. </el-form>
  52. </div>
  53. </el-card>
  54. <el-card class="mt8" shadow="never" :body-style="{ paddingBottom: '0' }">
  55. <div>
  56. <el-form :inline="true" @submit.stop.prevent>
  57. <el-form-item label="列表操作栏" style="width: 100%;"></el-form-item>
  58. <el-form-item label="">
  59. <el-row :gutter="100">
  60. <el-col :span="100" v-for="(v, k) in state.tableBtn" :key="k">
  61. <span style="margin-right: 10px;">{{ v.name }}</span>
  62. <el-switch v-model="v.value" @change="change(k)"></el-switch>
  63. </el-col>
  64. </el-row>
  65. </el-form-item>
  66. </el-form>
  67. </div>
  68. <div>
  69. <el-form :inline="true" @submit.stop.prevent>
  70. <el-form-item label="列表元素配置" style="width: 100%;"></el-form-item>
  71. <el-form-item label="">
  72. <el-row :gutter="100">
  73. <el-col :span="100" v-for="(v, k) in state.tableVal" :key="k">
  74. <span style="margin-right: 10px;">{{ v.description }}</span>
  75. <el-switch v-model="v.value" @change="change(k)"></el-switch>
  76. </el-col>
  77. </el-row>
  78. </el-form-item>
  79. </el-form>
  80. </div>
  81. </el-card>
  82. <div style="display: flex;justify-content: center;align-items: center;">
  83. <el-button style="margin-top: 20px;width: 264px;height: 42px;" type="primary" @click="onsubmit()">生成页面</el-button>
  84. </div>
  85. </div>
  86. </template>
  87. <script lang="ts" setup name="admin/code">
  88. import { ref,reactive, onMounted, onBeforeMount } from 'vue'
  89. import eventBus from '/@/utils/mitt'
  90. import { ElMessage } from 'element-plus'
  91. const state = reactive({
  92. loading: false,
  93. orgFormTitle: '',
  94. filter: {
  95. name: 'http://dev.hsfuel.com:8070/app/swagger/app/swagger.json',
  96. // name: 'http://192.168.0.203:8003/app/swagger/app/swagger.json',
  97. api:''
  98. },
  99. api:[],
  100. selectBtn:[{value:false,name:'查询',method:'onQuery'},
  101. {value:false,name:'添加',method:'onAdd'},
  102. {value:false,name:'批量删除',method:'ondelete'},
  103. {value:false,name:'重置',method:'onReset'},
  104. {value:false,name:'上传',method:'onUpload'},
  105. {value:false,name:'导出',method:'onExport'},
  106. {value:false,name:'批量导入',method:'onBatImport'},
  107. {value:false,name:'批量导出',method:'onBatExport'},
  108. {value:false,name:'批量审核',method:'onBatReview'}],
  109. selectVal:[],
  110. tableBtn:[{value:false,name:'编辑',method:'onDateUpdate'},
  111. {value:false,name:'详情',method:'onDataDetail'},
  112. {value:false,name:'删除',method:'onDataDelete'}],
  113. tableVal:[],
  114. isPage:false
  115. })
  116. const dataJson=ref('')
  117. onMounted(() => {
  118. onQuery()
  119. eventBus.off('refreshOrg')
  120. eventBus.on('refreshOrg', () => {
  121. onQuery()
  122. })
  123. })
  124. onBeforeMount(() => {
  125. eventBus.off('refreshOrg')
  126. })
  127. const change=(k)=>{
  128. // console.log(k)
  129. // console.log(state.selectVal[k].value,state.selectVal[k].description)
  130. }
  131. //解析页面接口数据
  132. const onQuery = async () => {
  133. fetch(state.filter.name)
  134. .then(response=>response.json())
  135. .then(swaggerJson=>{
  136. // console.log(swaggerJson)
  137. dataJson.value=swaggerJson
  138. const {paths} =dataJson.value
  139. // console.log(paths)
  140. for(const path in paths){
  141. if('get' in paths[path]){
  142. let api:any=path
  143. let summary:any=paths[path].get.summary?paths[path].get.summary:''
  144. let methods:any='GET'
  145. let isQuery:any=false
  146. let isBody:any=false
  147. if('parameters' in paths[path].get){
  148. isQuery=true
  149. }
  150. if('requestBody' in paths[path].get){
  151. isBody=true
  152. }
  153. state.api.push({api:api,summary:summary,methods:methods,isQuery:isQuery,isBody:isBody})
  154. //console.log(path)
  155. //console.log(paths[path].get.responses['200'].content['application/json'].schema['$ref'])
  156. }
  157. if('post' in paths[path]){
  158. let summary:any=paths[path].post.summary?paths[path].post.summary:''
  159. // if(summary===''||summary.includes('查询')||summary.includes('获取')||summary.includes('管理')||summary.includes('表')||summary.includes('')){
  160. let api:any=path
  161. let methods:any='POST'
  162. let isQuery:any=false
  163. let isBody:any=false
  164. if('parameters' in paths[path].post){
  165. isQuery=true
  166. }
  167. if('requestBody' in paths[path].post){
  168. isBody=true
  169. }
  170. state.api.push({api:api,summary:summary,methods:methods,isQuery:isQuery,isBody:isBody})
  171. //console.log(paths[path].post.responses['200'].content['application/json'].schema['$ref'])
  172. //console.log(paths[path].post.requestBody)
  173. }
  174. //console.log(path)
  175. //console.log(paths[path])
  176. }
  177. }
  178. //console.log(state.api)
  179. )
  180. .catch(error=>{
  181. console.log('Error fetch Swagger Json :',error)
  182. })
  183. }
  184. //解析查询页面查询条件及列表元素
  185. const onChange=(api)=>{
  186. state.selectVal=[]
  187. state.tableVal=[]
  188. state.selectBtn=state.selectBtn.map(item=>{
  189. item.value=false
  190. return item
  191. })
  192. state.tableBtn=state.tableBtn.map(item=>{
  193. item.value=false
  194. return item
  195. })
  196. let data=dataJson.value.paths[api]
  197. const tableData=dataJson.value.components.schemas
  198. //console.log(data)
  199. if('get' in data){
  200. data=data.get
  201. }else{
  202. data=data.post
  203. //console.log(data)
  204. }
  205. if('parameters' in data){
  206. const parameters=data['parameters']
  207. //console.log(parameters)
  208. for(const val in parameters){
  209. if(!parameters[val].name.includes('Page')&&!parameters[val].name.includes('DynamicFilter')){
  210. let value:any=false
  211. let name:any=parameters[val].name
  212. let description:any=(parameters[val].description&&!parameters[val].description.includes(1)&&!(parameters[val].description===''))?parameters[val].description:parameters[val].name
  213. let type:any=parameters[val].schema.type
  214. let isDate:any=parameters[val].schema.format==='date-time'?true:false
  215. if(parameters[val].name.includes('.')){
  216. let s=parameters[val].name.split('.')
  217. let p=s[1].trim()
  218. name=p
  219. description=(parameters[val].description&&!parameters[val].description.includes(1)&&!(parameters[val].description===''))?parameters[val].description:p
  220. }
  221. state.selectVal.push({value:value,name:name,description:description,type:type,isDate:isDate})
  222. }
  223. }
  224. }
  225. if('requestBody' in data){
  226. const requestBody=data['requestBody']['content']['application/json'].schema['$ref']
  227. let s=requestBody.split('/')
  228. let p=s[3].trim()
  229. let properties=tableData[p]['properties']
  230. if('dynamicFilter' in properties){
  231. properties=properties.filter['$ref']
  232. s=properties.split('/')
  233. p=s[3].trim()
  234. properties=tableData[p]['properties']
  235. }
  236. //console.log(properties)
  237. for(const val in properties){
  238. let value:any=false
  239. let name:any=val
  240. let description:any=(properties[val].description&&!properties[val].description.includes(1)&&!(properties[val].description===''))?properties[val].description:val
  241. let type:any=properties[val].type
  242. let isDate:any=false
  243. if(properties[val].format==='date-time'||val.includes('Time')||val.includes('Date')){
  244. isDate=true
  245. }
  246. //console.log(value,name,description,type,isDate)
  247. state.selectVal.push({value:value,name:name,description:description,type:type,isDate:isDate})
  248. }
  249. }
  250. let form=data.responses['200'].content['application/json'].schema['$ref']
  251. let f=form.split('/')
  252. let r=f[3].trim()
  253. let formData=tableData[r].properties.data
  254. let dataName:any=r
  255. let list:any=''
  256. if(!('type' in formData)||formData.type==='array'){
  257. if(!('type' in formData)||'$ref' in formData.items){
  258. if(!('type' in formData)){
  259. formData=formData['$ref']
  260. }else{
  261. formData=formData.items['$ref']
  262. }
  263. f=formData.split('/')
  264. r=f[3].trim()
  265. list=r
  266. formData=tableData[r]['properties']
  267. let isList:any=false
  268. let isArray:any=true
  269. if('total' in formData){
  270. formData=formData.list.items['$ref']
  271. f=formData.split('/')
  272. r=f[3].trim()
  273. formData=tableData[r]['properties']
  274. isList=true
  275. state.isPage=true
  276. }
  277. for(const val in formData){
  278. let value:any=false
  279. let name:any=val
  280. let description:any=(formData[val].description&&!formData[val].description.includes(1)&&!(formData[val].description===''))?formData[val].description:val
  281. let type:any=formData[val].type
  282. //console.log(value,name,description,type)
  283. state.tableVal.push({value:value,name:name,description:description,type:type,belong:r,isList:isList,isArray:isArray,dataName:dataName,list:list})
  284. }
  285. }else{
  286. let value:any=false
  287. let isList:any=false
  288. let isArray:any=true
  289. let name:any=r
  290. let description:any=(formData.description&&!formData.description.includes(1)&&!(formData.description===''))?formData.description:r
  291. let type:any=formData.type
  292. //console.log(value,name,description,type)
  293. state.tableVal.push({value:value,name:name,description:description,type:type,belong:r,isList:isList,isArray:isArray,dataName:dataName,list:list})
  294. }
  295. }else{
  296. let value:any=false
  297. let name:any=r
  298. let isList:any=false
  299. let isArray:any=false
  300. let description:any=(formData.description&&!formData.description.includes(1)&&!(formData.description===''))?formData.description:r
  301. let type:any=formData.type
  302. //console.log(value,name,description,type)
  303. state.tableVal.push({value:value,name:name,description:description,type:type,belong:r,isList:isList,isArray:isArray,dataName:dataName,list:list})
  304. }
  305. }
  306. //生成查询页面主要代码文件
  307. const onsubmit=()=>{
  308. let api=''
  309. if(state.filter.api===''){
  310. ElMessage.error('请选择查询页面接口来源')
  311. }else{
  312. api=state.api.filter(item=>item.api===state.filter.api)
  313. }
  314. let selBtn=state.selectBtn.filter(item=>item.value===true)
  315. let selVal=state.selectVal.filter(item=>item.value===true)
  316. let tabBtn=state.tableBtn.filter(item=>item.value===true)
  317. let tabVal=state.tableVal.filter(item=>item.value===true)
  318. //console.log(tabVal)
  319. let apiCode=`import { AxiosResponse } from 'axios'
  320. import { ContentType, HttpClient, RequestParams } from '/@/api/admin/http-client'
  321. export class Api<SecurityDataType = unknown> extends HttpClient<SecurityDataType> {
  322. /**
  323. * No description
  324. *
  325. * @tags
  326. * @name GetList
  327. * @summary 查询列表
  328. * @request ${api[0].methods}:'${api[0].api}'
  329. * @secure
  330. */\n`
  331. if(api[0].methods==='GET'){
  332. apiCode=apiCode+`getList = (query:any ,params: RequestParams = {}) : any =>
  333. this.request<AxiosResponse,any>({
  334. path:'${api[0].api}',
  335. method: 'GET',
  336. query:query,`
  337. }else{
  338. if(api[0].isQuery===true&&api[0].isBody===true){
  339. apiCode=apiCode+`getList = (data:any ,query:any ,params: RequestParams = {}) : any =>
  340. this.request<AxiosResponse,any>({
  341. path:'${api[0].api}',
  342. method: 'POST',
  343. body:data,
  344. query:query,
  345. type: ContentType.Json,`
  346. }else if(api[0].isQuery===false&&api[0].isBody===true){
  347. apiCode=apiCode+`getList = (data:any ,params: RequestParams = {}) : any =>
  348. this.request<AxiosResponse,any>({
  349. path:'${api[0].api}',
  350. method: 'POST',
  351. body:data,
  352. type: ContentType.Json,`
  353. }else{
  354. apiCode=apiCode+`getList = (query:any ,params: RequestParams = {}) : any =>
  355. this.request<AxiosResponse,any>({
  356. path:'${api[0].api}',
  357. method: 'POST',
  358. query:query,
  359. type: ContentType.Json,`
  360. }
  361. }
  362. apiCode=apiCode+`
  363. secure: true,
  364. format: 'json',
  365. ...params
  366. })
  367. }`
  368. //console.log(apiCode)
  369. let dataCode=`/** 查询信息输出 */
  370. export interface ${state.tableVal[0].dataName}{
  371. /** 是否成功标记 */
  372. success?: boolean
  373. /** 编码 */
  374. code?: string | null
  375. /** 消息 */
  376. msg?: string | null
  377. /** 数据 */\n`
  378. if(state.tableVal[0].isArray===false&&state.tableVal[0].isList===false){
  379. dataCode=dataCode+` data?:${state.tableVal[0].type} | null\n}`
  380. //console.log(dataCode)
  381. }else if(state.tableVal[0].isArray===true&&state.tableVal[0].isList===false){
  382. if(state.tableVal[0].list===''){
  383. dataCode=dataCode+` data?:${state.tableVal[0].list}[] | null\n}`
  384. }else{
  385. dataCode=dataCode+` data?:${state.tableVal[0].list}[] | null\n}
  386. export interface ${state.tableVal[0].list}{\n`
  387. for(let i=0;i<state.tableVal.length;i++){
  388. dataCode=dataCode+` /** ${state.tableVal[i].description} */
  389. ${state.tableVal[i].name}?: ${state.tableVal[i].type}\n`
  390. }
  391. dataCode=dataCode+`\n}`
  392. }
  393. //console.log(dataCode)
  394. }else{
  395. dataCode=dataCode+` data?:${state.tableVal[0].list}[] | null\n}
  396. export interface ${state.tableVal[0].list}{
  397. /**
  398. * 数据总数
  399. * @format int64
  400. */
  401. total?: number
  402. /** 数据 */
  403. list?: ${state.tableVal[0].belong}[] | null
  404. }
  405. export interface ${state.tableVal[0].belong}{\n`
  406. for(let i=0;i<state.tableVal.length;i++){
  407. dataCode=dataCode+` /** ${state.tableVal[i].description} */
  408. ${state.tableVal[i].name}?: ${state.tableVal[i].type}\n`
  409. }
  410. dataCode=dataCode+`\n}`
  411. //console.log(dataCode)
  412. }
  413. if(state.isPage===true){
  414. dataCode=dataCode+`\nexport interface pageInput {
  415. /**当前页数 */
  416. CurrentPage: number | any
  417. /**展示页数 */
  418. PageSize: number | any
  419. }`
  420. }
  421. let selection=false
  422. let indexCode=`\n<template>
  423. <div class="layout-pd">
  424. <el-row>`
  425. if(selBtn.length>0||selVal.length>0){
  426. indexCode=indexCode+`\n<!--操作-->
  427. <el-col :xs="24" >
  428. <el-card class="mt8" shadow="hover" >`
  429. if(selVal.length>0){
  430. indexCode=indexCode+`\n<el-form :model="state.filter" :inline="true" @submit.stop.prevent style="margin-bottom: -3vh;">
  431. <el-form-item prop="name" style="width: 100%">`
  432. for(let i=0;i<selVal.length;i++){
  433. if(selVal[i].type==='interger'){
  434. indexCode=indexCode+`\n<el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6" class="mb20">
  435. <el-form-item label="${selVal[i].description}">
  436. <el-input-number v-model="state.filter.${selVal[i].name}" />
  437. </el-form-item>
  438. </el-col>`
  439. }else if(selVal[i].isDate===true){
  440. indexCode=indexCode+`\n<el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6" class="mb20">
  441. <el-form-item label="选择时间">
  442. <el-date-picker
  443. v-model="state.filter.${selVal[i].name}"
  444. type="datetimerange"
  445. value-format="YYYY-MM-DD HH:mm:ss"
  446. range-separator="To"
  447. start-placeholder="开始日期"
  448. end-placeholder="结束日期"
  449. />
  450. </el-form-item>
  451. </el-col>`
  452. }else{
  453. indexCode=indexCode+`\n<el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6" class="mb20">
  454. <el-form-item label="${selVal[i].description}">
  455. <el-input v-model="state.filter.${selVal[i].name}" placeholder="单行输入" clearable></el-input>
  456. </el-form-item>
  457. </el-col>`
  458. }
  459. }
  460. indexCode=indexCode+`\n</el-form-item>
  461. </el-form>
  462. <hr>
  463. `
  464. }
  465. if(selBtn.length > 0) {
  466. const iconMap = [
  467. { keyword: '批量导入', icon: 'ele-UploadFilled' },
  468. { keyword: '审核', icon: 'ele-Tickets' },
  469. { keyword: '导出', icon: 'ele-Document' },
  470. { keyword: '查询', icon: 'ele-Search' },
  471. { keyword: '添加', icon: 'ele-Plus' },
  472. { keyword: '重置', icon: 'ele-RefreshRight' },
  473. { keyword: '上传', icon: 'ele-Upload' },
  474. { keyword: '删除', icon: 'ele-Delete' },
  475. ];
  476. indexCode += `\n<el-row justify="space-between" class="submit-button" style="margin-bottom: -9px;">`;
  477. selBtn.forEach(btn => {
  478. const match = iconMap.find(item => btn.name.includes(item.keyword));
  479. const icon = match?.icon || '';
  480. if (match) selection = true;
  481. indexCode += `\n<el-button type="primary" icon="${icon}" @click="${btn.method}"> ${btn.name} </el-button>`;
  482. });
  483. indexCode += `\n</el-row>`;
  484. }
  485. indexCode=indexCode+`\n</el-card>
  486. </el-col>`
  487. }
  488. if(tabVal.length>0){
  489. indexCode=indexCode+`\n<!--表格-->
  490. <el-col :xs="24" >
  491. <el-card style="height: 70vh" class="my-fill mt8" shadow="hover">`
  492. if(selection){
  493. indexCode=indexCode+`\n<el-table-column type="selection" width="50"></el-table-column>`
  494. }
  495. indexCode=indexCode+`\n<el-table v-loading="state.loading" stripe :data="state.tableModel" row-key="id" style="width: 100%">
  496. <el-table-column v-for="column in state.dynamicColumns" :key="column.prop" :prop="column.prop" :label="column.label" >
  497. </el-table-column>`
  498. if(tabBtn.length>0){
  499. indexCode=indexCode+` \n<el-table-column label="操作" fixed="right" header-align="center" align="center" class="right-operation" width="140">
  500. <template #default="{ row }" >`
  501. for(let i=0;i<tabBtn.length;i++){
  502. indexCode=indexCode+`\n<el-link
  503. class="my-el-link mr12 ml12"
  504. type="primary"
  505. icon="ele-Delete"
  506. @click="${tabBtn[i].method}(row)"
  507. :underline="false"
  508. target="_blank"
  509. >${tabBtn[i].name}</el-link>`
  510. }
  511. indexCode=indexCode+`\n</template>
  512. </el-table-column>`
  513. }
  514. indexCode=indexCode+`\n</el-table>`
  515. if(state.isPage){
  516. indexCode=indexCode+`\n<div class="my-flex my-flex-end" style="margin-top: 20px">
  517. <el-pagination
  518. v-model:currentPage="pageState.pageInput.currentPage"
  519. v-model:page-size="pageState.pageInput.pageSize"
  520. :total="state.total"
  521. :page-sizes="[10, 15, 20, 50, 100]"
  522. small
  523. background
  524. @size-change="onSizeChange"
  525. @current-change="onCurrentChange"
  526. layout="total, sizes, prev, pager, next, jumper"
  527. />
  528. </div>`
  529. }
  530. indexCode=indexCode+`\n</el-card>
  531. </el-col>`
  532. }
  533. indexCode=indexCode+`\n</el-row>
  534. </div>
  535. </template>
  536. <script setup lang="ts">
  537. import {onBeforeMount, onMounted, reactive, ref, watch} from "vue";
  538. import eventBus from "/@/utils/mitt";
  539. import {Api} from "/@/api/code/api";
  540. import { useDynamicPageSize } from "/@/composables/useDynamicPageSize";
  541. // 使用组合式函数获取分页状态
  542. const pageState = useDynamicPageSize(10, 15);`
  543. if(state.isPage&&tabVal.length>0){
  544. indexCode=indexCode+`\nimport { pageInput,${tabVal[0].belong} } from "/@/api/code/dto";`
  545. }else if(tabVal.length>0){
  546. indexCode=indexCode+`\nimport { ${tabVal[0].belong} } from "/@/api/code/dto";`
  547. }
  548. indexCode=indexCode+`\n/**数据对象*/
  549. const state = reactive({
  550. /**加载显示 */
  551. loading: false,
  552. /**条件查询模块 */
  553. filter: {`
  554. if(selVal.length>0){
  555. for(let i=0;i<selVal.length;i++){
  556. indexCode=indexCode+`\n/**${selVal[i].description} */
  557. ${selVal[i].name}: "",`
  558. }
  559. }
  560. indexCode=indexCode+`},
  561. /**表格信息 */`
  562. if(tabVal.length>0){
  563. indexCode=indexCode+`\ntableModel: [] as ${tabVal[0].belong},
  564. /**动态表头 */
  565. dynamicColumns: [`
  566. for(let i=0;i<tabVal.length;i++){
  567. indexCode=indexCode+`\n{ prop: '${tabVal[i].name}', label: '${tabVal[i].description}' },`
  568. }
  569. indexCode =indexCode+`],`
  570. }else{
  571. indexCode=indexCode+`\ntableModel: [],
  572. /**动态表头 */
  573. dynamicColumns: [],`
  574. }
  575. if(state.isPage){
  576. indexCode=indexCode+`\n/**分页标识 */
  577. pageInput:{
  578. CurrentPage: 1,
  579. PageSize: 10,
  580. } as pageInput,
  581. /**分页总数 */
  582. total: 0,`
  583. }
  584. indexCode=indexCode+`\n})
  585. onMounted(() => {
  586. // 初始化分页大小
  587. Data.pageInput.pageSize = pageState.pageInput.pageSize;
  588. init()
  589. eventBus.off('refreshView')
  590. eventBus.on('refreshView', async () => {
  591. await init()
  592. })
  593. console.log()
  594. })
  595. onBeforeMount(() => {
  596. eventBus.off('refreshView')
  597. })
  598. /**
  599. * 监听变换
  600. */
  601. watch(() => {})`
  602. let isSel=false
  603. if(selBtn.length>0){
  604. for(let i=0;i<selBtn.length;i++){
  605. if(selBtn[i].name==='查询'){
  606. isSel=true
  607. indexCode=indexCode+`\n/**条件查询 */
  608. const onQuery = () => {
  609. init()
  610. }
  611. /**初始化 */
  612. const init = async () => {
  613. state.loading = true`
  614. if(state.isPage){
  615. indexCode=indexCode+`\nconst res:any = await new Api().getList({...state.pageInput, Filter:state.filter})
  616. state.total = res?.data?.total ?? 0`
  617. }else{
  618. indexCode=indexCode+`\nconst res:any = await new Api().getList({...state.filter})`
  619. }
  620. indexCode=indexCode+`\nstate.tableModel = res?.data?.list ?? []
  621. state.loading = false
  622. }`
  623. }else{
  624. indexCode=indexCode+`\n/**${selBtn[i].name} */
  625. const ${selBtn[i].method}=()=>{}`
  626. }
  627. }
  628. }
  629. if(!isSel){
  630. indexCode=indexCode+`\n/**初始化 */
  631. const init = async () => {
  632. state.loading = true
  633. state.loading = false
  634. }`
  635. }
  636. if(tabBtn.length>0){
  637. for(let i=0;i<tabBtn.length;i++){
  638. indexCode=indexCode+`\n/**${tabBtn[i].name} */
  639. const ${tabBtn[i].method}=(row)=>{}`
  640. }
  641. }
  642. indexCode=indexCode+`\n
  643. /**
  644. * 页条变化
  645. * @param val
  646. */
  647. const onSizeChange = (val: number) => {
  648. Data.pageInput.pageSize = val
  649. //需按照页面对象修改Data
  650. init()
  651. }
  652. /**
  653. * 页数 变化
  654. * @param val
  655. */
  656. const onCurrentChange = (val: number) => {
  657. Data.pageInput.currentPage = val
  658. //需按照页面对象修改Data
  659. init()
  660. }
  661. </`+`script>`+`\n<style scoped lang="scss">
  662. .el-input,
  663. .el-select {
  664. width: 240px;
  665. }
  666. /* 输入框标签固定四个字符宽度 */
  667. ::v-deep .el-form-item__label {
  668. // 字体大小14,4个字符,12px右间距
  669. width: 14*4px+12px;
  670. justify-content: start;
  671. }
  672. /* 数据表头 设置灰色样式 */
  673. ::v-deep .el-table th.el-table__cell {
  674. background-color: #F6F6F6;
  675. }
  676. </style>`
  677. //console.log(indexCode)
  678. getCodeFile('api.ts',apiCode)
  679. getCodeFile('dto.ts',dataCode)
  680. getCodeFile('index.vue',indexCode)
  681. }
  682. const getCodeFile=(fileName,code) =>{
  683. const blob = new Blob([code], { type: 'text/plain' });
  684. const url = URL.createObjectURL(blob);
  685. // 创建一个a标签并设置href为新文件的URL
  686. const downloadLink = document.createElement('a');
  687. downloadLink.href = url;
  688. downloadLink.download = fileName; // 设置下载文件名
  689. // 触发下载
  690. document.body.appendChild(downloadLink);
  691. downloadLink.click();
  692. // 清理
  693. document.body.removeChild(downloadLink);
  694. URL.revokeObjectURL(url);
  695. }
  696. </script>
  697. <style scoped lang="scss">
  698. .layout {
  699. position: absolute;
  700. left: 0;
  701. top: 0;
  702. overflow: hidden;
  703. padding: 0px 8px 8px 8px;
  704. display: flex;
  705. flex-direction: column;
  706. }
  707. </style>