VueIndexServer.php 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583
  1. <?php
  2. namespace app\common\model\base\models;
  3. /**
  4. * @title : vue的Index页面生成
  5. * @desc :
  6. * @Author : Rock
  7. * @Date : 2023-06-14 10:51:01
  8. */
  9. use app\common\model\base\menu\Menu;
  10. use app\common\model\base\menu\Menurequest;
  11. use think\facade\Db;
  12. class VueIndexServer extends VueServer
  13. {
  14. /**
  15. * @title: 生成vue的Index文件
  16. * @desc: 描述
  17. * @return {*}
  18. * @author: Rock
  19. * @method: POST
  20. * @Date: 2023-04-19 19:04:18
  21. */
  22. static public function createIndexFile(int $model_id)
  23. {
  24. $info = ModelManage::where('id',$model_id)->find();
  25. $name = $info->name;
  26. $pk = ModelManage::pk($name);
  27. $dirname = self::parseDirname($info->dirname);// 文件保存位置
  28. $fileTitle = self::createTitle($info->title);// 生成文件注释
  29. $fieldList = ModelFields::where('model_name',$name)->where('status',1)->order('weigh ASC')->select()->toArray();// 获取字段列表
  30. $classname = self::getCamel($info->name);// 获取类名
  31. $authName = strtoupper($classname);
  32. if(!empty($dirname)){
  33. $path = root_path()."public".DS."vue".DS."src".DS."views".DS.$dirname.DS.$classname.DS;
  34. }else{
  35. $path = root_path()."public".DS."vue".DS."src".DS."views".DS.$classname.DS;
  36. }
  37. if(!is_dir($path)){
  38. mkdir($path,0777,true);
  39. }
  40. $filename = $path.'index.vue';
  41. $apiJS = "@/api/$dirname/$classname";
  42. $queryForm = self::createQueryForm($fieldList);
  43. $dataQueryForm = self::createDataQueryForm($fieldList);
  44. $tableBody = self::createTableBody($fieldList);
  45. $operateBtn = self::createOperateBtn($fieldList,$authName);
  46. $importFile = self::createIndexImportFile($apiJS,$fieldList);
  47. $components = self::createIndexComponents($fieldList);
  48. $content = <<<VUEINDEX
  49. $fileTitle
  50. <template>
  51. <div class="{$name}-manage-container">
  52. <vab-query-form>
  53. <vab-query-form-left-panel :span="24">
  54. <el-form :inline="true" :model="queryForm" @submit.native.prevent>
  55. $queryForm
  56. <el-form-item><el-button icon="el-icon-search" size="mini" stype="margin-left:3px;" type="primary" @click="queryData">查询</el-button></el-form-item>
  57. <el-form-item><el-button icon="el-icon-refresh" size="mini" type="primary" @click="queryData">刷新</el-button></el-form-item>
  58. <el-form-item><el-button v-permissions="['$authName:EXPORT']" icon="el-icon-download" size="mini" type="primary" @click="handleExport">导出</el-button></el-form-item>
  59. </el-form>
  60. </vab-query-form-left-panel>
  61. </vab-query-form>
  62. <div class="body">
  63. <div class="operate">
  64. <el-button v-permissions="['$authName:ADD']" icon="el-icon-plus" size="mini" type="primary" @click="handleEdit">添加</el-button>
  65. </div>
  66. <el-table v-loading="listLoading" border :data="list" header-row-class-name="custom-table-row">
  67. $tableBody
  68. <el-table-column align="center" fixed="right" label="操作" width="120">
  69. <template #default="{ row }">
  70. $operateBtn
  71. <el-button v-permissions="['$authName:EDIT']" type="text" @click="handleEdit(row)">编辑</el-button>
  72. <el-button v-permissions="['$authName:DELETE']" type="text" @click="handleDelete(row)">删除</el-button>
  73. </template>
  74. </el-table-column>
  75. </el-table>
  76. <el-pagination background :current-page="queryForm.pageNo" :layout="layout" :page-size="queryForm.pageSize" :total="total" @current-change="handleCurrentChange" @size-change="handleSizeChange"/>
  77. </div>
  78. <edit ref="edit" @fetch-data="queryData" />
  79. </div>
  80. </template>
  81. <script>
  82. $importFile
  83. export default {
  84. name:'$classname',
  85. components:$components,
  86. data(){
  87. return {
  88. listLoading: false,
  89. list: [],
  90. layout: 'total, sizes, prev, pager, next, jumper',
  91. total: 0,
  92. queryForm:$dataQueryForm,
  93. options:{},
  94. }
  95. },
  96. created(){
  97. this.fetchOptions()
  98. },
  99. mounted(){
  100. this.fetchData()
  101. },
  102. methods:{
  103. async fetchOptions(){
  104. const {data} = await getOptions()
  105. this.options = data
  106. },
  107. async fetchData() {
  108. this.listLoading = true
  109. const { totalCount, data } = await getList(this.queryForm)
  110. this.list = data
  111. this.total = totalCount
  112. this.listLoading = false
  113. },
  114. handleEdit(row) {
  115. if (row.$pk) {
  116. this.\$refs['edit'].show(row)
  117. } else {
  118. this.\$refs['edit'].show()
  119. }
  120. },
  121. handleDelete(row) {
  122. if (row.$pk) {
  123. this.\$baseConfirm('你确定要删除当前项吗', null, async () => {
  124. const { msg } = await doDelete(row)
  125. this.\$baseMessage(msg, 'success')
  126. this.fetchData()
  127. })
  128. }
  129. },
  130. queryData() {
  131. this.queryForm.pageNo = 1
  132. this.fetchData()
  133. },
  134. handleSizeChange(val) {
  135. this.queryForm.pageSize = val
  136. this.fetchData()
  137. },
  138. handleCurrentChange(val) {
  139. this.queryForm.pageNo = val
  140. this.fetchData()
  141. },
  142. handleStatus(row) {
  143. const msg = row.status == 1 ? '确定要禁用吗?' : '确定要启用吗?'
  144. this.\$baseConfirm(msg, null, async () => {
  145. const { msg } = await changeStatus({{$pk}:row.{$pk}})
  146. this.\$baseMessage(msg, 'success')
  147. this.fetchData()
  148. })
  149. },
  150. async handleExport() {
  151. this.loading = this.\$loading({
  152. lock: true,
  153. body: true,
  154. text: '正在导出,请稍候...',
  155. spinner: 'el-icon-loading',
  156. background: 'rgba(0,0,0,0.7)',
  157. customClass: 'map-loading-locus',
  158. })
  159. const { code, data } = await doExport(this.queryForm)
  160. if (code == 1) {
  161. let link = document.createElement('a')
  162. link.href = data.url
  163. link.download = data.name
  164. link.click()
  165. }
  166. this.loading.close()
  167. },
  168. }
  169. }
  170. </script>
  171. VUEINDEX;
  172. FileServer::writeLine($filename,$content);
  173. }
  174. /**
  175. * @title: 生成查询表单
  176. * @desc: 描述
  177. * @param {array} {fieldList} {} {字段列表}
  178. * @param {array} {info} {} {模型信息}
  179. * @return {*}
  180. * @author: Rock
  181. * @method: POST
  182. * @Date: 2023-04-19 19:26:34
  183. */
  184. static public function createQueryForm(array $fieldList)
  185. {
  186. $str="";
  187. $keyword = [];
  188. $hasPid = false;
  189. $modelName = '';
  190. foreach($fieldList as $item){
  191. $field = $item['field'];
  192. $title = $item['title'];
  193. $camel = self::getCamel($item['field']);
  194. $searchType = $item['search_type'];
  195. if($searchType!='none'){
  196. switch($searchType){
  197. case 'relation':
  198. if(in_array($item['field_type'],['relate_single','relate_multiple','relate_self'])){
  199. $lineName = self::getLine($item['relation_model']).'-selector';
  200. $multiple = $item['field_type']=='relate_multiple'?'true':'false';
  201. $relationShow = $item['relation_show'];
  202. $str .="<el-form-item label=\"$title\">";
  203. $str .="<$lineName v-model=\"queryForm.$field\" label-field=\"$relationShow\" :multiple=\"$multiple\" />";
  204. $str .="</el-form-item>";
  205. }elseif($item['field_type']=='relate_dic'){
  206. $dic_group_code = $item['relation_dic_group'];
  207. $multiple = $item['extra_rule']&&$item['extra_rule']['multiple']?'true':'false';
  208. $str .="<el-form-item label=\"$title\">";
  209. $str .="<dic-selector v-model=\"queryForm.$field\" :group=\"'$dic_group_code'\" label-field=\"title\" :multiple=\"$multiple\" />";
  210. $str .="</el-form-item>";
  211. }elseif($item['field_type']=='user_auto' || $item['field_type']=='user_select'){
  212. $multiple = $item['extra_rule']&&$item['extra_rule']['multiple']?'true':'false';
  213. $str .="<el-form-item label=\"$title\">";
  214. $str .="<user-selector v-model=\"queryForm.$field\" :multiple=\"$multiple\" />";
  215. $str .="</el-form-item>";
  216. }elseif($item['field_type']=='org_auto' || $item['field_type']=='org_select'){
  217. $str .="<el-form-item label=\"$title\">";
  218. $str .="<org-selector v-model=\"queryForm.$field\"";
  219. ksort($item['extra_rule']);
  220. foreach($item['extra_rule'] as $key=>$val){
  221. if(is_int($val)){
  222. $str .=" :$key=\"$val\"";
  223. }elseif(is_bool($val)){
  224. $value = $val?'true':'false';
  225. $str .=" :$key=\"$value\"";
  226. }else{
  227. $str .=" :$key=\"'$val'\"";
  228. }
  229. }
  230. $str .=" />\n";
  231. $str .="</el-form-item>";
  232. }
  233. break;
  234. case 'list':
  235. $value = $item['db_type']=='enum'||$item['db_type']=='varchar'?"0":0;
  236. $str .="<el-form-item label=\"$title\">";
  237. $str .="<el-select v-model=\"queryForm.{$field}\">";
  238. $str .="<el-option label=\"全部\" :value=\"$value\"/>";
  239. $str .="<el-option v-for=\"(item,key) in options.{$camel}List\" :key=\"key\" :label=\"item\" :value=\"key\"/>";
  240. $str .="</el-select>";
  241. $str .="</el-form-item>";
  242. break;
  243. case 'keyword':
  244. $keyword[] = $title;
  245. break;
  246. case 'year':
  247. $str .="<el-form-item label=\"$title\">";
  248. $str .="<el-date-picker v-model=\"queryForm.{$field}\" align=\"right\" :placeholder=\"'请选择{$title}'\" style=\"width:100%\" type=\"year\" value-format=\"yyyy\" />";
  249. $str .="</el-form-item>";
  250. break;
  251. case 'month':
  252. $str .="<el-form-item label=\"$title\">";
  253. $str .="<el-date-picker v-model=\"queryForm.{$field}\" align=\"right\" :placeholder=\"'请选择{$title}'\" style=\"width:100%\" type=\"month\" value-format=\"yyyy-MM\" />";
  254. $str .="</el-form-item>";
  255. break;
  256. case 'date':
  257. $str .="<el-form-item label=\"$title\">";
  258. $str .="<el-date-picker v-model=\"queryForm.{$field}\" align=\"right\" :placeholder=\"'请选择{$title}'\" style=\"width:100%\" type=\"date\" value-format=\"yyyy-MM-dd\" />";
  259. $str .="</el-form-item>";
  260. break;
  261. case 'daterange':
  262. $str .="<el-form-item label=\"$title\">";
  263. $str .="<el-date-picker v-model=\"queryForm.{$field}\" align=\"right\" end-placeholder=\"结束日期\" :placeholder=\"'请选择{$title}'\" range-separator=\"至\" start-placeholder=\"开始日期\" style=\"width:100%\" type=\"daterange\" value-format=\"yyyy-MM-dd\" />";
  264. $str .="</el-form-item>";
  265. break;
  266. case 'datetime':
  267. $str .="<el-form-item label=\"$title\">";
  268. $str .="<el-date-picker v-model=\"queryForm.{$field}\" align=\"right\" :placeholder=\"'请选择{$title}'\" style=\"width:100%\" type=\"datetime\" value-format=\"yyyy-MM-dd HH:mm:ss\" />";
  269. $str .="</el-form-item>";
  270. break;
  271. case 'datetimerange':
  272. $str .="<el-form-item label=\"$title\">";
  273. $str .="<el-date-picker v-model=\"queryForm.{$field}\" align=\"right\" end-placeholder=\"结束时间\" :placeholder=\"'请选择{$title}'\" range-separator=\"至\" start-placeholder=\"开始时间\" style=\"width:100%\" type=\"datetimerange\" value-format=\"yyyy-MM-dd HH:mm:ss\" />";
  274. $str .="</el-form-item>";
  275. break;
  276. default:break;
  277. }
  278. }
  279. }
  280. if(!empty($keyword)){
  281. $keywordTxt = implode('|',$keyword);
  282. $str .="<el-form-item label=\"搜索\">";
  283. $str .="<el-input v-model=\"queryForm.keyword\" placeholder=\"搜索{$keywordTxt}\" />";
  284. $str .="</el-form-item>";
  285. }
  286. return $str;
  287. }
  288. /**
  289. * @title: 创建JS代码中的queryForm初始值
  290. * @desc: 描述
  291. * @return {*}
  292. * @author: Rock
  293. * @method: POST
  294. * @Date: 2023-04-20 11:16:31
  295. */
  296. static public function createDataQueryForm($fieldList)
  297. {
  298. $str = "{\n";
  299. $str .= "\t\t\t\t\tpageNo:1,\n";
  300. $str .= "\t\t\t\t\tpageSize:10,\n";
  301. $hasKeyWord = false;
  302. foreach($fieldList as $item){
  303. $field = $item['field'];
  304. $searchType = $item['search_type'];
  305. if($searchType!='none'){
  306. switch($searchType){
  307. case 'relation':
  308. $multiple = false;
  309. if('relate_multiple'==$item['field_type']){
  310. $multiple = true;
  311. }elseif(in_array($item['field_type'],['relate_single','relate_self','user_auto','org_auto'])){
  312. $multiple = false;
  313. }elseif(in_array($item['field_type'],['relate_dic','user_select','org_select'])){
  314. $multiple = $item['extra_rule']&&$item['extra_rule']['multiple'];
  315. }
  316. if(!$multiple){
  317. $value = in_array($item['db_type'],['int','tinyint','smallint','bigint'])?0:'\'\'';
  318. $str .= "\t\t\t\t\t$field:$value,\n";
  319. }else{
  320. $str .= "\t\t\t\t\t$field:[],\n";
  321. }
  322. break;
  323. case 'list':
  324. $value = $item['db_type']=='enum'||$item['db_type']=='varchar'?'\'\'':0;
  325. $str .="\t\t\t\t\t$field:$value,\n";
  326. break;
  327. case 'keyword':
  328. $hasKeyWord = true;
  329. break;
  330. case 'year':
  331. case 'month':
  332. case 'date':
  333. $str .="\t\t\t\t\t$field:'',\n";
  334. break;
  335. case 'daterange':
  336. $str .="\t\t\t\t\t$field:[],\n";
  337. break;
  338. case 'datetime':
  339. $str .="\t\t\t\t\t$field:'',\n";
  340. break;
  341. case 'datetimerange':
  342. $str .="\t\t\t\t\t$field:[],\n";
  343. break;
  344. default:break;
  345. }
  346. }
  347. }
  348. if($hasKeyWord){
  349. $str .="\t\t\t\t\tkeyword:'',\n";
  350. }
  351. $str = rtrim($str,",\n")."\n\t\t\t\t}\n";
  352. return $str;
  353. }
  354. /**
  355. * @title: 生成table内容
  356. * @desc: 描述
  357. * @param {array} $fieldList
  358. * @return {*}
  359. * @author: Rock
  360. * @method: POST
  361. * @Date: 2023-04-19 20:14:27
  362. */
  363. static public function createTableBody(array $fieldList)
  364. {
  365. $txt = "<el-table-column align=\"center\" label=\"序号\">\n\t\t\t\t<template #default=\"{\$index}\">{{queryForm.pageSize * (queryForm.pageNo - 1)+\$index+1}}</template>\n\t\t\t</el-table-column>";
  366. foreach($fieldList as $item){
  367. $field = $item['field'];
  368. $title = $item['title'];
  369. if($item['show_in_table']==1){
  370. switch($item['field_type']){
  371. case 'radio':
  372. case 'select':
  373. $txt .="<el-table-column align=\"center\" label=\"{$title}\" prop=\"{$field}\">";
  374. $txt .="<template #default=\"{row}\">{{row.{$field}_txt}}</template>";
  375. $txt .="</el-table-column>";
  376. break;
  377. case 'switch':
  378. $txt .="<el-table-column align=\"center\" label=\"{$title}\" prop=\"{$field}\">";
  379. $txt .="<template #default=\"{row}\"><span v-if=\"row.{$field} == 1\" class=\"vab-dot vab-dot-success\"></span><span v-else class=\"vab-dot vab-dot-error\"></span><span>{{row.{$field}_txt}}</span></template>";
  380. $txt .="</el-table-column>";
  381. break;
  382. case 'text':
  383. case 'editor':
  384. $txt .="<el-table-column align=\"center\" label=\"{$title}\" prop=\"{$field}\">";
  385. $txt .="<template #default=\"{row}\"><el-tooltip :content=\"row.{$field}\" effect=\"dark\"><span style=\"white-space:nowrap;text-overflow:ellipsis;overflow:hidden;\">{{ row.{$field} }}</span></el-tooltip></template>";
  386. $txt .="</el-table-column>";
  387. break;
  388. case 'image':
  389. $txt .="<el-table-column align=\"center\" label=\"{$title}\" prop=\"{$field}\">";
  390. $txt .="<template #default=\"{row}\"><el-image fit='fill' :preview-src-list=\"[row.{$field}]\" :src=\"row.{$field}\" ><div slot=\"error\" class=\"image-slot\"><i class=\"el-icon-picture-outline\"></i></div></el-image></template>";
  391. $txt .="</el-table-column>";
  392. break;
  393. case 'images':
  394. $txt .="<el-table-column align=\"center\" label=\"{$title}\" prop=\"{$field}\">";
  395. $txt .="<template #default=\"{row}\"><el-image v-if=\"row.{$field}.length>0\" fit='fill' :preview-src-list=\"row.{$field}\" :src=\"row.{$field}[0]\"><div slot=\"error\" class=\"image-slot\"><i class=\"el-icon-picture-outline\"></i></div></el-image></template>";
  396. $txt .="</el-table-column>";
  397. break;
  398. case 'files':
  399. $txt .="<el-table-column align=\"center\" label=\"{$title}\" prop=\"{$field}\">";
  400. $txt .="<template #default=\"{row}\">{{row.$field.join(',')}}</template>";
  401. $txt .="</el-table-column>";
  402. break;
  403. case 'selects':
  404. case 'checkbox':
  405. $txt .="<el-table-column align=\"center\" label=\"{$title}\" prop=\"{$field}\">";
  406. $txt .="<template #default=\"{row}\">{{row.{$field}_txt.join(',')}}</template>";
  407. $txt .="</el-table-column>";
  408. break;
  409. case 'relate_single':
  410. $relationName = $item['relation_model'];
  411. $relationShow = $item['relation_show'];
  412. $tbName = explode('_',$relationName);
  413. $lastTbName = end($tbName);
  414. $functionName = $field == $lastTbName.'_id'?self::getCamel($relationName):self::getCamel($field);
  415. $txt .="<el-table-column align=\"center\" label=\"{$title}\" prop=\"{$field}\">";
  416. $txt .="<template #default=\"{row}\">{{row.$functionName?row.$functionName.$relationShow:''}}</template>";
  417. $txt .="</el-table-column>";
  418. break;
  419. case 'relate_multiple':
  420. $txt .="<el-table-column align=\"center\" label=\"{$title}\" prop=\"{$field}\">";
  421. $txt .="<template #default=\"{row}\">{{row.{$field}_txt}}</template>";
  422. $txt .="</el-table-column>";
  423. break;
  424. case 'relate_self':
  425. $relationName = self::getCamel($item['relation_model']);
  426. $relationShow = $item['relation_show'];
  427. $txt .="<el-table-column align=\"center\" label=\"{$title}\" prop=\"{$field}\">";
  428. $txt .="<template #default=\"{row}\">{{row.Father?row.Father.$relationShow:'----'}}</template>";
  429. $txt .="</el-table-column>";
  430. break;
  431. case 'relate_dic':
  432. $txt .="<el-table-column align=\"center\" label=\"{$title}\" prop=\"{$field}\">";
  433. $txt .="<template #default=\"{row}\">{{row.{$field}_txt}}</template>";
  434. $txt .="</el-table-column>";
  435. break;
  436. case 'user_auto':
  437. case 'org_auto':
  438. case 'user_select':
  439. case 'org_select':
  440. $txt .="<el-table-column align=\"center\" label=\"{$title}\" prop=\"{$field}\">";
  441. $txt .="<template #default=\"{row}\">{{row.{$field}_txt}}</template>";
  442. $txt .="</el-table-column>";
  443. break;
  444. case 'daterange':
  445. case 'datetimerange':
  446. $txt .="<el-table-column align=\"center\" label=\"{$title}\" prop=\"{$field}\">";
  447. $txt .="<template #default=\"{row}\"><span>{{row.{$field}?row.{$field}[0]:''}}</span><br /><span>{{row.{$field}?row.{$field}[1]:''}}</span></template>";
  448. $txt .="</el-table-column>";
  449. break;
  450. default:
  451. $txt .="<el-table-column align=\"center\" label=\"{$title}\" prop=\"{$field}\" />";
  452. break;
  453. }
  454. }
  455. }
  456. return $txt;
  457. }
  458. /**
  459. * @title: 创建启用/禁用操作按钮
  460. * @desc: 描述
  461. * @return {*}
  462. * @author: Rock
  463. * @method: POST
  464. * @Date: 2023-04-20 09:54:15
  465. */
  466. static public function createOperateBtn($fieldList,$authName)
  467. {
  468. $str = "";
  469. foreach($fieldList as $item){
  470. if($item['field']=='status' && $item['field_type']=='switch'){
  471. $str .="<el-button v-permissions=\"['$authName:STATUS']\" type=\"text\" @click=\"handleStatus(row)\">{{row.status==1?'禁用':'启用'}}</el-button>";
  472. break;
  473. }
  474. }
  475. return $str;
  476. }
  477. /**
  478. * @title: 创建引入js文件代码
  479. * @desc: 描述
  480. * @param {string} $apiJS
  481. * @return {*}
  482. * @author: Rock
  483. * @method: POST
  484. * @Date: 2023-04-20 10:12:53
  485. */
  486. static public function createIndexImportFile(string $apiJS,array $fieldList)
  487. {
  488. $txt = "import {getList,doDelete,changeStatus,getOptions,doExport} from '$apiJS'\n";
  489. $txt .= "\timport Edit from './components/Edit.vue'\n";
  490. $importAry = [];
  491. foreach($fieldList as $item){
  492. if(in_array($item['field_type'],['relate_single','relate_multiple','relate_self'])){
  493. $modelInfo = ModelManage::where('name',$item['relation_model'])->find();
  494. $dirname = self::parseDirname($modelInfo->dirname??'');
  495. $classname = self::getCamel($item['relation_model']);
  496. $importAry[$classname] = "@/views/$dirname/$classname/components/Selector.vue";
  497. }elseif($item['field_type']=='relate_dic'){
  498. $importAry['Dic'] = "@/components/VabDicSelector/index.vue";
  499. }elseif(in_array($item['field_type'],['user_auto','user_select'])){
  500. $importAry['User'] = "@/components/VabUserSelector/index.vue";
  501. }elseif(in_array($item['field_type'],['org_auto','org_select'])){
  502. $importAry['Org'] = "@/components/VabOrgSelector/index.vue";
  503. }
  504. }
  505. foreach($importAry as $importKey => $importItem){
  506. $txt .= "\t import {$importKey}Selector from '$importItem'\n";
  507. }
  508. return $txt;
  509. }
  510. /**
  511. * @title: 创建列表页需要导入的组件
  512. * @desc: 描述
  513. * @param {array} {fieldList} {} {字段列表}
  514. * @return {*}
  515. * @author: Rock
  516. * @method: POST
  517. * @Date: 2023-05-04 15:30:18
  518. */
  519. static public function createIndexComponents(array $fieldList)
  520. {
  521. $components = ['Edit'];
  522. $txt = "{";
  523. foreach($fieldList as $item){
  524. if(in_array($item['field_type'],['relate_single','relate_multiple','relate_self'])){
  525. $camel = self::getCamel($item['relation_model']);
  526. $components[] = $camel.'Selector';
  527. }elseif($item['field_type']=='relate_dic'){
  528. $components[] = "DicSelector";
  529. }elseif(in_array($item['field_type'],['user_auto','user_select'])){
  530. $components[] = "UserSelector";
  531. }elseif(in_array($item['field_type'],['org_auto','org_select'])){
  532. $components[] = "OrgSelector";
  533. }
  534. }
  535. $txt .= implode(',',array_unique($components));
  536. $txt .="}";
  537. return $txt;
  538. }
  539. /**
  540. * @title: 生成Index文件注释
  541. * @desc: 描述
  542. * @return {*}
  543. * @author: Rock
  544. * @method: POST
  545. * @Date: 2023-04-18 15:13:19
  546. */
  547. static public function createTitle(string $title)
  548. {
  549. $title = <<<EOF
  550. <!--
  551. * @title : $title
  552. * @desc :
  553. * @icon fa fa-leaf
  554. -->
  555. EOF;
  556. return $title;
  557. }
  558. /**
  559. * @title: 删除模型的vue之index文件
  560. * @desc: 描述
  561. * @param {int} $model_id
  562. * @return {*}
  563. * @author: Rock
  564. * @method: POST
  565. * @Date: 2023-04-23 17:29:13
  566. */
  567. static public function deleteIndex(int $model_id)
  568. {
  569. $info = ModelManage::where('id',$model_id)->find();
  570. $name = $info->name;
  571. $dirname = self::parseDirname($info->dirname);// 文件保存位置
  572. $classname = self::getCamel($info->name);// 获取类名
  573. if(!empty($dirname)){
  574. $path = root_path()."public".DS."vue".DS."src".DS."views".DS.$dirname.DS.$classname.DS;
  575. }else{
  576. $path = root_path()."public".DS."vue".DS."src".DS."views".DS.$classname.DS;
  577. }
  578. $filename = $path.'index.vue';
  579. if(file_exists($filename)){
  580. @unlink($filename);
  581. }
  582. }
  583. }