VueEditServer.php 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711
  1. <?php
  2. namespace app\common\model\base\models;
  3. /**
  4. * @title : vue的Edit页面生成
  5. * @desc :
  6. * @Author : Rock
  7. * @Date : 2023-06-14 11:03:40
  8. */
  9. use app\common\model\base\menu\Menu;
  10. use app\common\model\base\menu\Menurequest;
  11. use think\facade\Db;
  12. class VueEditServer extends VueServer
  13. {
  14. /**
  15. * @title: 生成编辑弹窗文件
  16. * @desc: 描述
  17. * @param {int} {model_id} {} {模型ID}
  18. * @return {*}
  19. * @author: Rock
  20. * @method: POST
  21. * @Date: 2023-04-23 15:11:30
  22. */
  23. static public function createEditFile(int $model_id)
  24. {
  25. $info = ModelManage::where('id',$model_id)->find();
  26. $name = $info->name;
  27. $dirname = self::parseDirname($info->dirname);// 文件保存位置
  28. $fieldList = ModelFields::where('model_name',$name)->where('status',1)->order('weigh ASC')->select()->toArray();// 获取字段列表
  29. $classname = self::getCamel($info->name);// 获取类名
  30. if(!empty($dirname)){
  31. $path = root_path()."public".DS."vue".DS."src".DS."views".DS.$dirname.DS.$classname.DS.'components'.DS;
  32. }else{
  33. $path = root_path()."public".DS."vue".DS."src".DS."views".DS.$classname.DS.'components'.DS;
  34. }
  35. if(!is_dir($path)){
  36. mkdir($path,0777,true);
  37. }
  38. $apiJS = "@/api/$dirname/$classname";
  39. $filename = $path.'Edit.vue';
  40. $EditFormItem = self::createEditForm($fieldList);
  41. $EditImport = self::createEditImportFile($apiJS,$fieldList);
  42. $jsonJs = self::createEditFromJsonJs($fieldList);
  43. $defaultFormData = self::createDefaultFormData($fieldList);
  44. $updateFile = self::createUpdateFile($fieldList);
  45. $components = self::createEditComponents($fieldList);
  46. $rules = self::createRules($fieldList);
  47. $content = <<<EDIT
  48. <template>
  49. <el-dialog
  50. v-if="dialogFormVisible"
  51. :close-on-click-modal="false"
  52. :title="title"
  53. :visible.sync="dialogFormVisible"
  54. width="60%"
  55. @close="close"
  56. >
  57. <el-form ref="form" label-width="120px" :model="form" :rules="rules">
  58. $EditFormItem
  59. </el-form>
  60. <template #footer>
  61. <el-button @click="close">取 消</el-button>
  62. <el-button type="primary" @click="save">确 定</el-button>
  63. </template>
  64. </el-dialog>
  65. </template>
  66. <script>
  67. $EditImport
  68. export default {
  69. name:'{$classname}Edit',
  70. components:$components,
  71. data(){
  72. return {
  73. options:{},
  74. form:$defaultFormData,
  75. rules:$rules,
  76. title:'',
  77. dialogFormVisible:false,
  78. }
  79. },
  80. mounted(){
  81. this.fetchOptions()
  82. },
  83. methods:{
  84. /** 获取可选项 */
  85. async fetchOptions(){
  86. const {data} = await getOptions()
  87. this.options = data
  88. },
  89. /** 显示添加/编辑窗口 */
  90. show(row) {
  91. if (!row) {
  92. this.title = '添加'
  93. } else {
  94. this.title = '编辑'
  95. this.form = Object.assign({}, row)
  96. }
  97. this.dialogFormVisible = true
  98. },
  99. /** 关闭添加/编辑窗口 */
  100. close() {
  101. this.\$refs['form'].resetFields()
  102. this.form = this.\$options.data().form
  103. this.dialogFormVisible = false
  104. },
  105. /** 保存数据 */
  106. save() {
  107. this.\$refs['form'].validate(async (valid) => {
  108. if (valid) {
  109. const { code, msg } = await doEdit(this.form)
  110. if (1 == code) {
  111. this.\$baseMessage(msg, 'success')
  112. this.\$emit('fetch-data')
  113. this.close()
  114. }
  115. } else {
  116. return false
  117. }
  118. })
  119. },
  120. $jsonJs
  121. $updateFile
  122. }
  123. }
  124. </script>
  125. EDIT;
  126. FileServer::writeLine($filename,$content);
  127. }
  128. /**
  129. * @title: 文件或图片上传的方法
  130. * @desc: 描述
  131. * @param {*} $fieldList
  132. * @return {*}
  133. * @author: Rock
  134. * @method: POST
  135. * @Date: 2023-04-24 20:04:41
  136. */
  137. static public function createUpdateFile($fieldList)
  138. {
  139. $str = "";
  140. $types = ['image','images','file','files'];
  141. foreach($fieldList as $item){
  142. $fieldType = $item['field_type'];
  143. if(in_array($fieldType,$types)){
  144. $str .="/** 文件更新 */\n";
  145. $str .="\t\t\tupdateFile(name,data){\n";
  146. $str .="\t\t\t\tthis.form[name] = data\n";
  147. $str .="\t\t\t},\n";
  148. break;
  149. }
  150. }
  151. return $str;
  152. }
  153. /**
  154. * @title: 创建编辑弹窗的form表单代码
  155. * @desc: 描述
  156. * @param {array} $fieldList
  157. * @return {*}
  158. * @author: Rock
  159. * @method: POST
  160. * @Date: 2023-04-20 14:34:09
  161. */
  162. static public function createEditForm(array $fieldList)
  163. {
  164. $queryStr = "";
  165. $str = '';
  166. foreach($fieldList as $index=>$item){
  167. $title = $item['title'];
  168. $field = $item['field'];
  169. $camel = self::getCamel($field);
  170. $fieldType = $item['field_type'];
  171. $extra_rule = $item['extra_rule'];
  172. if(!in_array($fieldType,['user_auto','org_auto'])){
  173. if($index==0){
  174. $str .="<el-form-item label=\"{$title}\" prop=\"{$field}\">\n";
  175. }else{
  176. $str .="\t\t\t<el-form-item label=\"{$title}\" prop=\"{$field}\">\n";
  177. }
  178. }
  179. switch($fieldType){
  180. case 'string':
  181. $extra_rule['placeholder'] = $extra_rule['placeholder']??'请输入信息';
  182. $str .= "\t\t\t\t<el-input v-model.trim=\"form.$field\"";
  183. $queryStr .="$field:'',\n";
  184. break;
  185. case 'text':
  186. $extra_rule['rows'] = !empty($extra_rule['rows'])?intval($extra_rule['rows']):8;
  187. $extra_rule['placeholder'] = $extra_rule['placeholder']??'请输入信息';
  188. $extra_rule['type'] = 'textarea';
  189. $str .= "\t\t\t\t<el-input v-model.trim=\"form.$field\"";
  190. $queryStr .="$field:'',\n";
  191. break;
  192. case 'editor':
  193. $extra_rule['placeholder'] = $extra_rule['placeholder']??'请输入信息';
  194. $extra_rule['height'] = $extra_rule['height']?intval($extra_rule['height']):400;
  195. $str .="\t\t\t\t<vab-editor v-model=\"form.$field\"";
  196. $queryStr .="$field:'',\n";
  197. break;
  198. case 'number':
  199. $extra_rule['placeholder'] = $extra_rule['placeholder']??'请输入信息';
  200. if(isset($extra_rule['step']))$extra_rule['step'] = intval($extra_rule['step']);
  201. if(isset($extra_rule['min']))$extra_rule['min'] = intval($extra_rule['min']);
  202. if(isset($extra_rule['max']))$extra_rule['max'] = intval($extra_rule['max']);
  203. $str .="\t\t\t\t<el-input-number v-model.number=\"form.$field\"";
  204. $queryStr .="$field:0,\n";
  205. break;
  206. case 'year':
  207. $extra_rule['placeholder'] = $extra_rule['placeholder']??'请选择年度';
  208. $extra_rule['format'] = $extra_rule['format']??'yyyy';
  209. $extra_rule['value-format'] = $extra_rule['format']??'yyyy';
  210. $extra_rule['aligh'] = 'right';
  211. $extra_rule['style'] = 'width:100%';
  212. $extra_rule['type'] = 'year';
  213. $str .="\t\t\t\t<el-date-picker v-model=\"form.$field\"";
  214. $queryStr .="$field:'',\n";
  215. break;
  216. case 'month':
  217. $extra_rule['placeholder'] = $extra_rule['placeholder']??'请选择月份';
  218. $extra_rule['format'] = $extra_rule['format']??'yyyy-MM';
  219. $extra_rule['value-format'] = $extra_rule['format']??'yyyy-MM';
  220. $extra_rule['aligh'] = 'right';
  221. $extra_rule['style'] = 'width:100%';
  222. $extra_rule['type'] = 'month';
  223. $str .="\t\t\t\t<el-date-picker v-model=\"form.$field\"";
  224. $queryStr .="$field:'',\n";
  225. break;
  226. case 'date':
  227. $extra_rule['placeholder'] = $extra_rule['placeholder']??'请输入信息';
  228. $extra_rule['format'] = $extra_rule['format']??'yyyy-MM-dd';
  229. $extra_rule['value-format'] = $extra_rule['format']??'yyyy-MM-dd';
  230. $extra_rule['aligh'] = 'right';
  231. $extra_rule['style'] = 'width:100%';
  232. $extra_rule['type'] = 'date';
  233. $str .="\t\t\t\t<el-date-picker v-model=\"form.$field\"";
  234. $queryStr .="$field:'',\n";
  235. break;
  236. case 'time':
  237. $extra_rule['placeholder'] = $extra_rule['placeholder']??'请输入信息';
  238. $extra_rule['format'] = $extra_rule['format']??'HH:mm:ss';
  239. $extra_rule['value-format'] = $extra_rule['format']??'HH:mm:ss';
  240. $extra_rule['align'] = 'right';
  241. $extra_rule['style'] = 'width:100%';
  242. $str .="\t\t\t\t<el-time-picker v-model=\"form.$field\"";
  243. $queryStr .="$field:'',\n";
  244. break;
  245. case 'datetime':
  246. $extra_rule['placeholder'] = $extra_rule['placeholder']??'请输入信息';
  247. $extra_rule['format'] = $extra_rule['format']??'yyyy-MM-dd HH:mm:ss';
  248. $extra_rule['value-format'] = $extra_rule['format']??'yyyy-MM-dd HH:mm:ss';
  249. $extra_rule['align'] = 'right';
  250. $extra_rule['style'] = 'width:100%';
  251. $extra_rule['type'] = 'datetime';
  252. $str .="\t\t\t\t<el-date-picker v-model=\"form.$field\"";
  253. $queryStr .="$field:'',\n";
  254. break;
  255. case 'datetimerange':
  256. $extra_rule['start-placeholder'] = $extra_rule['start_placeholder']??'开始时间';unset($extra_rule['start_placeholder']);
  257. $extra_rule['end-placeholder'] = $extra_rule['end_placeholder']??'结束时间';unset($extra_rule['end_placeholder']);
  258. $extra_rule['range-separator'] = $extra_rule['separator']??'至';unset($extra_rule['separator']);
  259. $extra_rule['format'] = $extra_rule['format']??'yyyy-MM-dd HH:mm:ss';
  260. $extra_rule['value-format'] = $extra_rule['format']??'yyyy-MM-dd HH:mm:ss';
  261. $extra_rule['align'] = 'right';
  262. $extra_rule['style'] = 'width:100%';
  263. $extra_rule['type'] = 'datetimerange';
  264. $str .="\t\t\t\t<el-date-picker v-model=\"form.$field\"";
  265. $queryStr .="$field:[],\n";
  266. break;
  267. case 'select':
  268. $str .= "\t\t\t\t<el-select v-model=\"form.$field\" style=\"width:100%\">\n";
  269. $str .= "\t\t\t\t\t<el-option v-for=\"(item,key) in options.{$camel}List \" :key=\"key\" :label=\"item\" :value=\"key\" />\n";
  270. $str .= "\t\t\t\t</el-select>\n";
  271. $val = $item['db_type']=='enum'?'':0;
  272. $queryStr .="$field:$val,\n";
  273. break;
  274. case 'selects':
  275. $str .= "\t\t\t\t<el-select v-model=\"form.$field\" multiple style=\"width:100%\">\n";
  276. $str .= "\t\t\t\t\t<el-option v-for=\"(item,key) in options.{$camel}List \" :key=\"key\" :label=\"item\" :value=\"key\" />\n";
  277. $str .= "\t\t\t\t</el-select>\n";
  278. $queryStr .= "$field:[],\n";
  279. break;
  280. case 'image':
  281. $extra_rule['accept'] = $extra_rule['accept']??'jpg,jpeg,png,gif';
  282. $extra_rule['size'] = !empty($extra_rule['size'])?intval($extra_rule['size']):2;
  283. $extra_rule['limit'] = !empty($extra_rule['limit'])?intval($extra_rule['limit']):1;
  284. $extra_rule['name'] = $field;
  285. $extra_rule['show-title'] = is_bool($extra_rule['showTitle'])?$extra_rule['showTitle']:false;unset($extra_rule['showTitle']);
  286. $extra_rule['@fetch-data'] = 'updateFile';
  287. $str .= "\t\t\t\t<vab-uploader v-model=\"form.$field\"";
  288. $queryStr .="$field:'',\n";
  289. break;
  290. case 'images':
  291. $extra_rule['accept'] = $extra_rule['accept']??'jpg,jpeg,png,gif';
  292. $extra_rule['size'] = !empty($extra_rule['size'])?intval($extra_rule['size']):2;
  293. $extra_rule['limit'] = !empty($extra_rule['limit'])?intval($extra_rule['limit']):3;
  294. $extra_rule['name'] = $field;
  295. $extra_rule['show-title'] = is_bool($extra_rule['showTitle'])?$extra_rule['showTitle']:false;unset($extra_rule['showTitle']);
  296. $extra_rule['@fetch-data'] = 'updateFile';
  297. $str .= "\t\t\t\t<vab-uploader v-model=\"form.$field\"";
  298. $queryStr .="$field:[],\n";
  299. break;
  300. case 'file':
  301. $extra_rule['accept'] = $extra_rule['accept']??'doc,xls,docx,xlsx,pdf';
  302. $extra_rule['size'] = !empty($extra_rule['size'])?intval($extra_rule['size']):2;
  303. $extra_rule['limit'] = !empty($extra_rule['limit'])?intval($extra_rule['limit']):1;
  304. $extra_rule['name'] = $field;
  305. $extra_rule['show-title'] = is_bool($extra_rule['showTitle'])?$extra_rule['showTitle']:false;unset($extra_rule['showTitle']);
  306. $extra_rule['@fetch-data'] = 'updateFile';
  307. $str .= "\t\t\t\t<vab-uploader v-model=\"form.$field\"";
  308. $queryStr .="$field:'',\n";
  309. break;
  310. case 'files':
  311. $extra_rule['accept'] = $extra_rule['accept']??'doc,xls,docx,xlsx,pdf';
  312. $extra_rule['size'] = !empty($extra_rule['size'])?intval($extra_rule['size']):2;
  313. $extra_rule['limit'] = !empty($extra_rule['limit'])?intval($extra_rule['limit']):3;
  314. $extra_rule['name'] = $field;
  315. $extra_rule['show-title'] = is_bool($extra_rule['showTitle'])?$extra_rule['showTitle']:false;unset($extra_rule['showTitle']);
  316. $extra_rule['@fetch-data'] = 'updateFile';
  317. $str .= "\t\t\t\t<vab-uploader v-model=\"form.$field\"";
  318. $queryStr .="$field:[],\n";
  319. break;
  320. case 'switch':
  321. $extra_rule['active-text'] = !empty($extra_rule['active_text'])?$extra_rule['active_text']:'开';unset($extra_rule['active_text']);
  322. $extra_rule['inactive-text'] = !empty($extra_rule['inactive_text'])?$extra_rule['inactive_text']:'关';unset($extra_rule['inactive_text']);
  323. $extra_rule['active-value'] = !empty($extra_rule['active_value'])?intval($extra_rule['active_value']):1;unset($extra_rule['active_value']);
  324. $extra_rule['inactive-value'] = !empty($extra_rule['inactive_value'])?intval($extra_rule['inactive_value']):2;unset($extra_rule['inactive_value']);
  325. $extra_rule['active-color'] = !empty($extra_rule['active_color'])?intval($extra_rule['active_color']):'#13ce66';unset($extra_rule['active_color']);
  326. $extra_rule['inactive-color'] = !empty($extra_rule['inactive_color'])?intval($extra_rule['inactive_color']):'#ff4949';unset($extra_rule['inactive_color']);
  327. $extra_rule['style'] = "display: block";
  328. $str .="\t\t\t\t<el-switch v-model=\"form.$field\"";
  329. $queryStr .="$field:1,\n";
  330. break;
  331. case 'checkbox':
  332. $str .="\t\t\t\t<el-checkbox-group v-model=\"form.$field\">\n\t\t\t\t\t<el-checkbox v-for=\"(item,key) in options.{$camel}List\" :key=\"key\" :label=\"key\">{{ item }}</el-checkbox>\n\t\t\t\t</el-checkbox-group>\n";
  333. $queryStr .="$field:[],\n";
  334. break;
  335. case 'radio':
  336. $str .= "\t\t\t\t<el-radio-group v-model=\"form.$field\">\n\t\t\t\t\t<el-radio v-for=\"(item,key) in options.{$camel}List\" :key=\"key\" :label=\"key\" >{{ item }}</el-radio>\n\t\t\t\t</el-radio-group>\n";
  337. $queryStr .="$field:0,\n";
  338. break;
  339. case 'color':
  340. $extra_rule['color-format'] = !empty($extra_rule['format'])?$extra_rule['format']:'hex';unset($extra_rule['format']);
  341. $extra_rule['show-alpha'] = !empty($extra_rule['showAlpha'])?$extra_rule['showAlpha']:'false';unset($extra_rule['showAlpha']);
  342. $default = !empty($extra_rule['default'])?$extra_rule['default']:'#FFFFFF';
  343. $str .="\t\t\t\t<el-color-picker v-model=\"form.$field\"";
  344. $queryStr .="$field:'$default',\n";
  345. break;
  346. case 'json':
  347. $str .= self::createEditFormJson($field,$item['content']);
  348. $queryStr .="$field:[],\n";
  349. break;
  350. case 'slider':
  351. if(isset($extra_rule['step']))$extra_rule['step'] = intval($extra_rule['step']);
  352. if(isset($extra_rule['min']))$extra_rule['min'] = intval($extra_rule['min']);
  353. if(isset($extra_rule['max']))$extra_rule['max'] = intval($extra_rule['max']);
  354. $extra_rule['style'] = "width:100%";
  355. $str .= "\t\t\t\t<el-slider v-model=\"form.$field\"";
  356. $queryStr .="$field:0,\n";
  357. break;
  358. case 'relate_single':
  359. case 'relate_multiple':
  360. case 'relate_self':
  361. $extra_rule['label-field'] = $item['relation_show'];
  362. $lineName = self::getLine($item['relation_model']).'-selector';
  363. $str .="\t\t\t\t<$lineName v-model=\"form.$field\"";
  364. break;
  365. case 'relate_dic':
  366. $extra_rule['group'] = $item['relation_dic_group'];
  367. $extra_rule['label-field'] = 'title';
  368. $str .="\t\t\t\t<dic-selector v-model=\"form.$field\"";
  369. break;
  370. case 'user_select':
  371. $str .="\t\t\t\t<user-selector v-model=\"form.$field\"";
  372. break;
  373. case 'org_select':
  374. $str .="\t\t\t\t<org-selector v-model=\"form.$field\"";
  375. break;
  376. }
  377. if(!in_array($fieldType,['radio','checkbox','json','selects','select','user_auto','org_auto'])){
  378. ksort($extra_rule);
  379. $methodAry = [];
  380. foreach($extra_rule as $key=>$val){
  381. if(strpos($key,'@')===0){
  382. $methodAry[$key] = $val;
  383. }elseif(is_int($val)){
  384. $str .=" :$key=\"$val\"";
  385. }elseif(is_bool($val) || in_array($val,['true','false'])){
  386. $value = $val===true||$val==='true'?'true':'false';
  387. $str .=" :$key=\"$value\"";
  388. }else{
  389. $str .=" :$key=\"'$val'\"";
  390. }
  391. }
  392. foreach($methodAry as $key => $val){
  393. $str .=" $key=\"$val\"";
  394. }
  395. $str .=" />\n";
  396. }
  397. if(!in_array($fieldType,['user_auto','org_auto'])){
  398. $str .="\t\t\t</el-form-item>\n";
  399. }
  400. }
  401. return $str;
  402. }
  403. /**
  404. * @title: 创建data数据中,form的默认数据
  405. * @desc: 描述
  406. * @param {*} $fieldList
  407. * @return {*}
  408. * @author: Rock
  409. * @method: POST
  410. * @Date: 2023-04-21 17:26:27
  411. */
  412. static public function createDefaultFormData(array $fieldList)
  413. {
  414. $str = "{\n";
  415. foreach($fieldList as $item){
  416. $field = $item['field'];
  417. $fieldType = $item['field_type'];
  418. $dbType = $item['db_type'];
  419. switch($fieldType){
  420. case 'string':
  421. case 'text':
  422. case 'editor':
  423. case 'year':
  424. case 'month':
  425. case 'date':
  426. case 'time':
  427. case 'datetime':
  428. case 'image':
  429. case 'file':
  430. $str .= "\t\t\t\t\t$field:'',\n";
  431. break;
  432. case 'number':
  433. case 'slider':
  434. $str .= "\t\t\t\t\t$field:0,\n";
  435. break;
  436. case 'datetimerange':
  437. case 'selects':
  438. case 'images':
  439. case 'files':
  440. case 'json':
  441. $str .="\t\t\t\t\t$field:[],\n";
  442. break;
  443. case 'switch':
  444. $str .="\t\t\t\t\t$field:1,\n";;
  445. break;
  446. case 'select':
  447. case 'radio':
  448. $value = $item['db_type']=='enum'||$item['db_type']=='varchar'?'\'\'':0;
  449. $str .="\t\t\t\t\t$field:$value,\n";
  450. break;
  451. case 'color':
  452. $str .= "\t\t\t\t\t$field:'#ffffff',\n";
  453. break;
  454. case 'relate_single':
  455. case 'relate_self':
  456. $str .="\t\t\t\t\t$field:'',\n";
  457. break;
  458. case 'checkbox':
  459. case 'relate_multiple':
  460. $str .="\t\t\t\t\t$field:[],\n";
  461. break;
  462. case 'relate_dic':
  463. case 'user_select':
  464. case 'org_select':
  465. $multiple = $item['extra_rule']&&$item['extra_rule']['multiple'];
  466. $tmp = $multiple?"[]":"''";
  467. $str .="\t\t\t\t\t$field:$tmp,\n";
  468. default:break;
  469. }
  470. }
  471. $str = rtrim($str,",\n")."\n\t\t\t\t}";
  472. return $str;
  473. }
  474. /**
  475. * @title: 创建编辑弹窗引入的文件
  476. * @desc: 描述
  477. * @param {string} $apiJS
  478. * @return {*}
  479. * @author: Rock
  480. * @method: POST
  481. * @Date: 2023-04-20 14:44:58
  482. */
  483. static public function createEditImportFile(string $apiJS,array $fieldList)
  484. {
  485. $str = "import {doEdit,getOptions} from '$apiJS'\n";
  486. $uploadVabs = ['image','images','file','files'];
  487. $relations = ['relate_single','relate_multiple','relate_self'];
  488. $hasUpload = false;
  489. $hasEditor = false;
  490. $importAry = [];
  491. $hasValidator = false;
  492. foreach($fieldList as $item){
  493. $fieldType = $item['field_type'];
  494. if(in_array($fieldType,$uploadVabs)){
  495. $importAry['VabUploader'] = "@/components/VabUploader/index.vue";
  496. }
  497. if(in_array($fieldType,['editor'])){
  498. $importAry['VabEditor'] = "@/components/VabEditor/index.vue";
  499. }
  500. if(in_array($fieldType,$relations)){
  501. $modelInfo = ModelManage::where('name',$item['relation_model'])->find();
  502. $dirname = self::parseDirname($modelInfo->dirname??'');
  503. $classname = self::getCamel($item['relation_model']);
  504. $importAry[$classname.'Selector'] = "@/views/$dirname/$classname/components/Selector.vue";
  505. }
  506. if($fieldType=='relate_dic'){
  507. $importAry['DicSelector'] = "@/components/VabDicSelector/index.vue";
  508. }
  509. if($fieldType=='user_select'){
  510. $importAry['UserSelector'] = "@/components/VabUserSelector/index.vue";
  511. }
  512. if($fieldType == 'org_select'){
  513. $importAry['OrgSelector'] = "@/components/VabOrgSelector/index.vue";
  514. }
  515. // 判断是否需要引入验证器
  516. $rule = $item['rule'];
  517. $ruleList = explode('|',$rule);
  518. $ruleList = array_filter($ruleList);
  519. foreach($ruleList as $ruleItem){
  520. if($ruleItem!='require'){
  521. $hasValidator = true;
  522. break;
  523. }
  524. }
  525. if($hasValidator){
  526. $importAry['{validator}'] = '@/utils/validateRule';
  527. }
  528. }
  529. foreach($importAry as $importKey => $importItem){
  530. $str .= "import {$importKey} from '$importItem'\n";
  531. }
  532. return $str;
  533. }
  534. /**
  535. * @title: 创建编辑弹窗的json类型表单代码
  536. * @desc: 描述
  537. * @param {array} {content} {} {JSON数据的key和title对应关系对象}
  538. * @param {array} {data} {} {JSON实际数据}
  539. * @return {*}
  540. * @author: Rock
  541. * @method: POST
  542. * @Date: 2023-04-20 18:13:01
  543. */
  544. static public function createEditFormJson(string $field,array $content,array $data = [])
  545. {
  546. $str = "<el-row>";
  547. // 写添加按钮
  548. $str .="<el-row size=\"mini\"><el-col :span=\"24\"><el-button size=\"mini\" type=\"primary\" @click=\"addValueRow(form.$field)\">添加</el-button></el-col></el-row>";
  549. // 写表头
  550. $str .="<el-row type=\"flex\">";
  551. $span = intval(24/(count($content) + 1));
  552. foreach($content as $item){
  553. $key = $item['key'];
  554. $title = $item['value'];
  555. $str .="<el-col align=\"center\" :span=\"$span\">$title</el-col>";
  556. if(empty($data)){
  557. $data[$key] = '';
  558. }
  559. }
  560. $str .="<el-col align=\"center\" :span=\"$span\">操作</el-col></el-row>";
  561. // 写内容
  562. $str .="<el-row v-for=\"(valueItem, valueIndex) in form.$field\" :key=\"valueIndex\" type=\"flex\">";
  563. foreach($content as $item){
  564. $key = $item['key'];
  565. $str .="<el-col :span=\"$span\"><el-input v-model.trim=\"valueItem.{$key}\" /></el-col>";
  566. }
  567. $str .="<el-col align=\"center\" :span=\"$span\">";
  568. $str .="<el-button v-if=\"valueIndex > 0\" size=\"mini\" type=\"text\" @click=\"delValueRow(form.$field, valueIndex)\">删除</el-button>";
  569. $str .="</el-col>";
  570. $str .="</el-row></el-row>";
  571. return $str;
  572. }
  573. /**
  574. * @title: 创建json表单的新增和删除功能的方法
  575. * @desc: 描述
  576. * @param {array} {fieldList} {} {字段数组}
  577. * @return {*}
  578. * @author: Rock
  579. * @method: POST
  580. * @Date: 2023-04-21 10:47:05
  581. */
  582. static public function createEditFromJsonJs(array $fieldList)
  583. {
  584. $str = "";
  585. foreach($fieldList as $item){
  586. if($item['field_type']=='json'){
  587. $field = $item['field'];
  588. $content = $item['content'];
  589. $str ="addValueRow(row) {\n";
  590. $str .="row.push({";
  591. foreach($content as $con){
  592. $key = $con['key'];
  593. $str .="$key:'',";
  594. }
  595. $str = rtrim($str,',');
  596. $str.="})},";
  597. $str.="delValueRow(json, index) {
  598. json.splice(index, 1)
  599. },";
  600. break;
  601. }
  602. }
  603. return $str;
  604. }
  605. /**
  606. * @title: 创建编辑页需要导入的组件
  607. * @desc: 描述
  608. * @param {array} {fieldList} {} {字段列表}
  609. * @return {*}
  610. * @author: Rock
  611. * @method: POST
  612. * @Date: 2023-06-14 09:44:51
  613. */
  614. static public function createEditComponents (array $fieldList)
  615. {
  616. $components = [];
  617. $txt = "{";
  618. foreach($fieldList as $item){
  619. if($item['field_type']=='editor'){
  620. $components[] = 'VabEditor';
  621. }
  622. if(in_array($item['field_type'],['image','images','file','files'])){
  623. $components[] = 'VabUploader';
  624. }
  625. if(in_array($item['field_type'],['relate_single','relate_multiple','relate_self'])){
  626. $camel = self::getCamel($item['relation_model']);
  627. $components[] = $camel.'Selector';
  628. }
  629. if($item['field_type']=='relate_dic'){
  630. $components[] = 'DicSelector';
  631. }
  632. if($item['field_type']=='user_select'){
  633. $components[] = 'UserSelector';
  634. }
  635. if($item['field_type']=='org_select'){
  636. $components[] = 'OrgSelector';
  637. }
  638. }
  639. $txt .= implode(',',array_unique($components));
  640. $txt .= "}";
  641. return $txt;
  642. }
  643. /**
  644. * @title: 删除模型的新增/编辑弹窗文件
  645. * @desc: 描述
  646. * @param {int} $model_id
  647. * @return {*}
  648. * @author: Rock
  649. * @method: POST
  650. * @Date: 2023-04-23 17:30:13
  651. */
  652. static public function deleteEdit(int $model_id)
  653. {
  654. $info = ModelManage::where('id',$model_id)->find();
  655. $name = $info->name;
  656. $dirname = self::parseDirname($info->dirname);// 文件保存位置
  657. $classname = self::getCamel($info->name);// 获取类名
  658. if(!empty($dirname)){
  659. $path = root_path()."public".DS."vue".DS."src".DS."views".DS.$dirname.DS.$classname.DS.'components'.DS;
  660. }else{
  661. $path = root_path()."public".DS."vue".DS."src".DS."views".DS.$classname.DS.'components'.DS;
  662. }
  663. $filename = $path.'Edit.vue';
  664. if(file_exists($filename)){
  665. @unlink($filename);
  666. }
  667. }
  668. /**
  669. * @title: 创建编辑页面的验证规则
  670. * @desc: 描述
  671. * @param {array} {fieldList} {} {字段列表}
  672. * @return {*}
  673. * @author: Rock
  674. * @method: POST
  675. * @Date: 2023-07-26 16:07:59
  676. */
  677. static public function createRules(array $fieldList)
  678. {
  679. $str = "{\n";
  680. foreach($fieldList as $item){
  681. $field = $item['field'];
  682. $rule = $item['rule'];
  683. $title = $item['title'];
  684. if(!empty($rule) && !in_array($item['field_type'],['user_auto','org_auto'])){
  685. $str.="\t\t\t\t$field:[\n";
  686. $ruleList = explode('|',$rule);
  687. $ruleList = array_filter($ruleList);
  688. foreach($ruleList as $ruleItem){
  689. if($ruleItem=='require'){
  690. $str.="\t\t\t\t\t{ required: true, trigger: 'blur', message: '{$title}不能为空' },\n";
  691. }else{
  692. $str .= "\t\t\t\t\t{validator: validator,trigger:'blur',rule:'$ruleItem',title:'$title'";
  693. if(false!==strpos($ruleItem,':')){
  694. $ruleItemArr = explode(':',$ruleItem);
  695. $key = $ruleItemArr[0];
  696. $val = $ruleItemArr[1];
  697. if($key=='confirm' || $key=='different'){
  698. $str .= ",form:()=>{return this.form}";
  699. }
  700. }
  701. $str .="},\n";
  702. }
  703. }
  704. $str.="\t\t\t\t],\n";
  705. }
  706. }
  707. $str .="\t\t\t}";
  708. return $str;
  709. }
  710. }