634c45885a6c7b54a439b16462f437f0-js.php 46 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157
  1. <?php /*a:2:{s:65:"D:\phpEnv\www\Gong-Ying-Lian-API\app\admin\view\develop\crud.html";i:1751866917;s:63:"D:\phpEnv\www\Gong-Ying-Lian-API\app\admin\view\layout\vue.html";i:1751866917;}*/ ?>
  2. import selectpage from "http://yun.cn/assets/js/components/SelectPage.js";
  3. import fieldlist from "http://yun.cn/assets/js/components/Fieldlist.js";
  4. import {inArray} from "http://yun.cn/assets/js/util.js";
  5. function isImage(name)
  6. {
  7. if(
  8. name.indexOf('imgs')!=-1 ||
  9. name.indexOf('images')!=-1 ||
  10. name.indexOf('logos')!=-1 ||
  11. name.indexOf('photos')!=-1 ||
  12. name.indexOf('pictures')!=-1 ||
  13. name.indexOf('icons')!=-1
  14. ){
  15. return 'images';
  16. }
  17. if(
  18. name.indexOf('img')!=-1 ||
  19. name.indexOf('image')!=-1 ||
  20. name.indexOf('logo')!=-1 ||
  21. name.indexOf('photo')!=-1 ||
  22. name.indexOf('picture')!=-1 ||
  23. name.indexOf('icon')!=-1
  24. ){
  25. return 'image';
  26. }
  27. return false;
  28. }
  29. function getAccept()
  30. {
  31. let mimetype=Yunqi.config.upload.mimetype.split(',');
  32. let accept=[];
  33. mimetype.forEach(res=>{
  34. accept.push('.'+res);
  35. });
  36. accept=accept.join(',');
  37. return accept;
  38. }
  39. function parseShort(data){
  40. let short=data.short;
  41. switch (short){
  42. case '=':
  43. data.form='input';
  44. data.type='text';
  45. data.filter='=';
  46. break;
  47. case '<>':
  48. data.form='input';
  49. data.type='text';
  50. data.filter='<>';
  51. break;
  52. case 'like':
  53. data.form='input';
  54. data.type='text';
  55. data.filter='LIKE';
  56. break;
  57. case 'not like':
  58. data.form='input';
  59. data.type='text';
  60. data.filter='NOT LIKE';
  61. break;
  62. case 'null':
  63. data.form='hidden';
  64. data.filter='IS NULL';
  65. break;
  66. case 'not null':
  67. data.form='hidden';
  68. data.filter='IS NOT NULL';
  69. break;
  70. case 'select':
  71. data.form='select';
  72. data.filter='=';
  73. break;
  74. case 'selects':
  75. data.form='select';
  76. data.filter='IN';
  77. data.multiple=1;
  78. data.value='[]';
  79. break;
  80. case 'checkbox':
  81. data.form='checkbox';
  82. data.filter='IN';
  83. data.value='[]';
  84. break;
  85. case 'radio':
  86. data.form='radio';
  87. data.filter='=';
  88. break;
  89. case 'find_in_set':
  90. data.form='select';
  91. data.filter='FIND_IN_SET';
  92. break;
  93. case 'between':
  94. data.form='between';
  95. data.filter='BETWEEN';
  96. data.value='[]';
  97. break;
  98. case 'not between':
  99. data.form='between';
  100. data.filter='NOT BETWEEN';
  101. data.value='[]';
  102. break;
  103. case 'date':
  104. data.form='date-picker';
  105. data.type='date';
  106. data.filter='=';
  107. break;
  108. case 'datetime':
  109. data.form='date-picker';
  110. data.type='datetime';
  111. data.filter='=';
  112. break;
  113. case 'daterange':
  114. data.form='date-picker';
  115. data.type='daterange';
  116. data.filter='BETWEEN TIME';
  117. break;
  118. case 'time':
  119. data.form='time-picker';
  120. data.type='time';
  121. data.filter='=';
  122. break;
  123. case 'timerange':
  124. data.form='time-picker';
  125. data.type='timerange';
  126. data.filter='BETWEEN';
  127. break;
  128. case 'selectpage':
  129. data.form='selectpage';
  130. data.filter='=';
  131. data.keyField='id';
  132. data.labelField='name';
  133. data.url='';
  134. break;
  135. case 'cascader':
  136. data.form='cascader';
  137. data.filter='=';
  138. data.cascaderType='url';
  139. data.level=2;
  140. data.url='';
  141. break;
  142. case 'area':
  143. data.form='cascader';
  144. data.filter='=';
  145. data.cascaderType='url';
  146. data.level=3;
  147. data.url='ajax/area';
  148. break;
  149. case 'category':
  150. data.form='cascader';
  151. data.filter='=';
  152. data.cascaderType='url';
  153. data.level=2;
  154. data.url='ajax/category';
  155. break;
  156. case 'hidden':
  157. data.form='input';
  158. data.type='hidden';
  159. break;
  160. case 'text':
  161. data.form='input';
  162. data.type='text';
  163. break;
  164. case 'password':
  165. data.form='input';
  166. data.type='password';
  167. break;
  168. case 'readonly':
  169. data.form='input';
  170. data.type='text';
  171. data.readonly=1;
  172. break;
  173. case 'number':
  174. data.form='input';
  175. data.type='number';
  176. break;
  177. case 'textarea':
  178. data.form='input';
  179. data.type='textarea';
  180. data.rows=4;
  181. break;
  182. case 'editor':
  183. data.form='editor';
  184. data.width='100%';
  185. data.height='350px';
  186. break;
  187. case 'switch':
  188. data.form='switch';
  189. break;
  190. case 'image':
  191. data.form='attachment';
  192. data.limit=1;
  193. break;
  194. case 'images':
  195. data.form='attachment';
  196. data.limit=10;
  197. break;
  198. case 'file':
  199. data.form='files';
  200. data.limit=1;
  201. break;
  202. case 'files':
  203. data.form='files';
  204. data.limit=10;
  205. break;
  206. case 'fieldlist':
  207. data.form='fieldlist';
  208. data.label=['键名','键值'];
  209. data.value='{}';
  210. break;
  211. case 'slot':
  212. data.form='slot';
  213. break;
  214. }
  215. }
  216. export default{
  217. components:{'SelectPage':selectpage,'FieldList':fieldlist},
  218. data:{
  219. fields:[],
  220. actions:[],
  221. operateDialog:{
  222. show:false,
  223. row:'',
  224. filter:[],
  225. searchList: '',
  226. data:''
  227. },
  228. searchListDialog:{
  229. show: false,
  230. row: '',
  231. searchList: ''
  232. },
  233. relationDialog:{
  234. show: false,
  235. row: '',
  236. fields:[],
  237. data:{
  238. table:'',
  239. relationField:'',
  240. filterField:'',
  241. showField:'',
  242. ralationType:'one'
  243. }
  244. },
  245. formDialog:{
  246. show:false,
  247. row:'',
  248. searchList: '',
  249. data:''
  250. },
  251. codeDialog:{
  252. show:false,
  253. row:[],
  254. },
  255. formatter:{
  256. text:__('文本'),
  257. image:__('图片'),
  258. images:__('多图'),
  259. date:__('日期'),
  260. datetime:__('日期时间'),
  261. tag:__('标签'),
  262. tags:__('多标签'),
  263. switch:__('开关'),
  264. select:__('下拉框'),
  265. link:__('链接'),
  266. html:__('HTML'),
  267. slot:__('自定义插槽'),
  268. },
  269. short:{
  270. table:[
  271. {key:'=',label:__('单行文本框,field等于输入值')},
  272. {key:'<>',label:__('单行文本框,field不等于输入值')},
  273. {key:'like',label:__('单行文本框,field文本包含输入值')},
  274. {key:'not like',label:__('单行文本框,field文本不包含输入值')},
  275. {key:'null',label:__('隐藏过滤器,field字段为空值')},
  276. {key:'not null',label:__('隐藏过滤器,field字段为非空值')},
  277. {key:'select',label:__('下拉框(单选),field等于选项')},
  278. {key:'selects',label:__('下拉框(多选),field包含于选项,如2包含于[1,2,3]')},
  279. {key:'checkbox',label:__('多选输入框,field包含于选项,,如2包含于[1,2,3]')},
  280. {key:'radio',label:__('单选输入框,field等于选项')},
  281. {key:'find_in_set',label:__('下拉框(单选),field文本包含选项,如“1,2,3”包含2')},
  282. {key:'between',label:__('并排输入框,field介于两个数字之间')},
  283. {key:'not between',label:__('并排输入框,field介于两个数字之外')},
  284. {key:'date',label:__('日期选择框,field等于选项')},
  285. {key:'datetime',label:__('日期+时间选择框,field等于选项')},
  286. {key:'daterange',label:__('日期区间选择框,field介于两个日期之间')},
  287. {key:'time',label:__('时间选择框,field等于选项')},
  288. {key:'timerange',label:__('时间区间选择框,field介于两个时间之间')},
  289. {key:'selectpage',label:__('关联表分页选择框,field等于表的keyField')},
  290. {key:'cascader',label:__('多级树形选择框,field等于最后一级的id')},
  291. {key:'area',label:__('省/市/区县选择框,field等于最后一级的id')},
  292. {key:'category',label:__('分类表category选择框,field等于最后一级的id')}
  293. ],
  294. form:[
  295. {key:'hidden',label:__('隐藏表单')},
  296. {key:'text',label:__('单行文本输入框')},
  297. {key:'number',label:__('数字输入框')},
  298. {key:'readonly',label:__('单行只读文本输入框')},
  299. {key:'password',label:__('密码输入框')},
  300. {key:'textarea',label:__('多行文本输入框')},
  301. {key:'editor',label:__('富文本输入框')},
  302. {key:'select',label:__('下拉框(单选)')},
  303. {key:'selects',label:__('下拉框(多选)')},
  304. {key:'radio',label:__('单选框')},
  305. {key:'checkbox',label:__('复选框')},
  306. {key:'switch',label:__('开关')},
  307. {key:'date',label:__('选择日期')},
  308. {key:'datetime',label:__('选择日期+时间')},
  309. {key:'daterange',label:__('选择日期区间')},
  310. {key:'time',label:__('选择时间')},
  311. {key:'timerange',label:__('选择时间区间')},
  312. {key:'selectpage',label:__('关联表分页选择框')},
  313. {key:'cascader',label:__('多级树形选择框')},
  314. {key:'image',label:__('选择单张图片')},
  315. {key:'images',label:__('选择多张图片')},
  316. {key:'file',label:__('选择单个文件')},
  317. {key:'files',label:__('选择多个文件')},
  318. {key:'fieldlist',label:__('JSON输入框')},
  319. {key:'area',label:__('选择省/市/区县')},
  320. {key:'category',label:__('分类表category选择框')},
  321. {key:'slot',label:__('自定义插槽')},
  322. ]
  323. },
  324. formtype:{
  325. table:[
  326. {key:'hidden',label:__('隐藏表单')},
  327. {key:'input',label:__('文本输入框')},
  328. {key:'select',label:__('下拉框')},
  329. {key:'radio',label:__('单选框')},
  330. {key:'checkbox',label:__('复选框')},
  331. {key:'between',label:__('并排输入框')},
  332. {key:'date-picker',label:__('日期选择框')},
  333. {key:'time-picker',label:__('时间选择框')},
  334. {key:'cascader',label:__('多级树形选择框')},
  335. {key:'selectpage',label:__('关联表分页选择框')},
  336. ],
  337. form:[
  338. {key:'input',label:__('文本输入框')},
  339. {key:'select',label:__('下拉框')},
  340. {key:'radio',label:__('单选框')},
  341. {key:'checkbox',label:__('复选框')},
  342. {key:'editor',label:__('富文本输入框')},
  343. {key:'switch',label:__('开关')},
  344. {key:'date-picker',label:__('日期选择框')},
  345. {key:'time-picker',label:__('时间选择框')},
  346. {key:'cascader',label:__('多级树形选择框')},
  347. {key:'selectpage',label:__('关联表分页选择框')},
  348. {key:'attachment',label:__('相册')},
  349. {key:'files',label:__('上传文件')},
  350. {key:'fieldlist',label:__('输入JSON')},
  351. {key:'slot',label:__('自定义插槽')},
  352. ]
  353. },
  354. filter:[
  355. {key:'=',label:__('等于')},
  356. {key:'<>',label:__('不等于')},
  357. {key:'>',label:__('大于')},
  358. {key:'>=',label:__('大于等于')},
  359. {key:'<',label:__('小于')},
  360. {key:'<=',label:__('小于等于')},
  361. {key:'< TIME',label:__('早于')},
  362. {key:'<= TIME',label:__('早于等于')},
  363. {key:'> TIME',label:__('晚于')},
  364. {key:'>= TIME',label:__('晚于等于')},
  365. {key:'BETWEEN TIME',label:__('时间介于')},
  366. {key:'NOT BETWEEN TIME',label:__('时间不介于')},
  367. {key:'LIKE',label:__('包含字符')},
  368. {key:'NOT LIKE',label:__('不包含字符')},
  369. {key:'FIND_IN_SET',label:__('序列包含')},
  370. {key:'NOT FIND_IN_SET',label:__('序列不包含')},
  371. {key:'IN',label:__('包含于数组')},
  372. {key:'NOT IN',label:__('不包含于数组')},
  373. {key:'BETWEEN',label:__('介于')},
  374. {key:'NOT BETWEEN',label:__('不介于')},
  375. {key:'IS NULL',label:__('为空')},
  376. {key:'IS NOT NULL',label:__('不为空')},
  377. ],
  378. tableData:'',
  379. crudForm:{
  380. table:'',
  381. controller:'',
  382. model:'',
  383. reduced:false,
  384. isTree:false,
  385. treeTitle:'',
  386. pagination:false,
  387. summary:false,
  388. expand:false,
  389. tabs:'',
  390. actionList:'',
  391. recyclebin:false
  392. }
  393. },
  394. methods:{
  395. inArray:inArray,
  396. havaPid:function (){
  397. if(!this.tableData){
  398. return false;
  399. }
  400. for(let k in this.tableData){
  401. if(this.tableData[k].field=='pid'){
  402. return true;
  403. }
  404. }
  405. return false;
  406. },
  407. changeTable:function (table){
  408. this.crudForm.table=table;
  409. Yunqi.ajax.get('develop/getFields',{table:table}).then(res=>{
  410. this.fields=res;
  411. this.parseAction();
  412. this.parseController();
  413. this.parseModel();
  414. this.parseTable();
  415. });
  416. },
  417. parseTable:function (){
  418. this.tableData='';
  419. let list=[];
  420. for(let k in this.fields){
  421. let item=this.fields[k];
  422. let obj={
  423. field:item.name,
  424. title:this.parseTitle(item),
  425. type:item.type,
  426. visible:this.parseVisible(item),
  427. formatter:this.parseFormatter(item),
  428. operate:'',
  429. searchList:'',
  430. relation:'',
  431. sortable:[],
  432. search:[],
  433. edit:'',
  434. rules:'',
  435. recyclebin:[]
  436. };
  437. this.parseFields(obj);
  438. list.push(obj);
  439. }
  440. Vue.nextTick(()=>{
  441. this.tableData=list;
  442. });
  443. },
  444. parseTitle:function (row){
  445. if(row.title){
  446. return row.title;
  447. }
  448. if(row.name=='deletetime'){
  449. return __('删除时间');
  450. }
  451. if(row.name=='createtime'){
  452. return __('创建时间');
  453. }
  454. if(row.name=='updatetime'){
  455. return __('修改时间');
  456. }
  457. if(row.name=='pid'){
  458. return __('父级');
  459. }
  460. if(row.name=='status'){
  461. return __('状态');
  462. }
  463. if(row.name=='id'){
  464. return __('ID');
  465. }
  466. if(row.name=='weigh'){
  467. return __('权重');
  468. }
  469. return row.name;
  470. },
  471. parseController:function (){
  472. let table=this.crudForm.table.replace(Yunqi.data.tablePrefix,'');
  473. table=table.replace(table[0],table[0].toUpperCase());
  474. table=table.replace(/_([a-z])/g,function (all,letter){
  475. return letter.toUpperCase();
  476. });
  477. this.crudForm.controller='app\\admin\\controller\\'+table;
  478. },
  479. parseModel:function (){
  480. let table=this.crudForm.table.replace(Yunqi.data.tablePrefix,'');
  481. table=table.replace(table[0],table[0].toUpperCase());
  482. table=table.replace(/_([a-z])/g,function (all,letter){
  483. return letter.toUpperCase();
  484. });
  485. this.crudForm.model='app\\common\\model\\'+table;
  486. },
  487. parseAction:function (){
  488. this.crudForm.actionList='';
  489. let list={index:__('查看'),add:__('添加'),edit:__('编辑'),multi:__('更新'),del:__('删除'),import:__('导入'),download:__('下载')};
  490. for(let k in this.fields){
  491. let item=this.fields[k];
  492. if(item.name=='deletetime'){
  493. list.recyclebin=__('回收站');
  494. this.crudForm.recyclebin=true;
  495. }
  496. }
  497. Vue.nextTick(()=>{
  498. this.crudForm.actionList=list;
  499. });
  500. },
  501. parseFormatter:function (row){
  502. if(row.name.endsWith('time')){
  503. return 'datetime';
  504. }
  505. let image=isImage(row.name);
  506. if(image){
  507. return image;
  508. }
  509. if(row.name=='status'){
  510. return 'switch';
  511. }
  512. if(row.type=='tinyint'){
  513. return 'select';
  514. }
  515. return 'text';
  516. },
  517. parseVisible:function (row){
  518. if(row.name=='deletetime'){
  519. return 'none';
  520. }
  521. if(row.name=='updatetime'){
  522. return false;
  523. }
  524. return true;
  525. },
  526. parseFields:function (obj){
  527. obj.operate=this.parseOperate(obj);
  528. obj.searchList=this.parseSearchList(obj);
  529. obj.edit=this.parseEdit(obj);
  530. obj.rules=this.parseRules(obj);
  531. },
  532. parseEdit:function (row){
  533. if(row.field=='id'){
  534. return 'hidden';
  535. }
  536. if(row.field=='pid'){
  537. return 'slot';
  538. }
  539. if(row.field=='createtime' || row.field=='updatetime' || row.field=='deletetime'){
  540. return '';
  541. }
  542. let image=isImage(row.field);
  543. if(image){
  544. return image;
  545. }
  546. if(row.field=='status'){
  547. return 'switch';
  548. }
  549. if(row.searchList){
  550. return 'select';
  551. }
  552. if(row.type=='tinyint' || row.type=='int'){
  553. return 'number';
  554. }
  555. return 'text';
  556. },
  557. parseRules:function (row){
  558. if(row.edit=='hidden' || !row.edit){
  559. return '';
  560. }
  561. if(row.field=='pid'){
  562. return 'required';
  563. }
  564. if(row.field=='status' || row.type=='int'){
  565. return '';
  566. }
  567. return 'required';
  568. },
  569. parseOperate:function (row){
  570. if(row.field=='pid' || row.field=='id'){
  571. return '';
  572. }
  573. if(row.formatter=='text'){
  574. return '=';
  575. }
  576. if(row.formatter=='date'){
  577. return 'date';
  578. }
  579. if(row.formatter=='datetime'){
  580. return 'daterange';
  581. }
  582. if(row.formatter=='tag'){
  583. return 'like';
  584. }
  585. if(row.formatter=='tags'){
  586. return 'find_in_set';
  587. }
  588. if(row.formatter=='switch' || row.formatter=='select'){
  589. return 'select';
  590. }
  591. return '';
  592. },
  593. parseSearchList:function (row){
  594. let r='';
  595. if(row.visible=='none'){
  596. return r;
  597. }
  598. if(row.formatter=='switch' || row.formatter=='select'){
  599. if(row.field=='status'){
  600. r={'normal':__('正常'),'hidden':__('隐藏')};
  601. }else if(row.type=='tinyint' || row.type=='int'){
  602. r={'1':__('是'),'0':__('否')};
  603. }else{
  604. r={'key1':'选项1','key2':'选项2'};
  605. }
  606. }
  607. if(!r && (
  608. row.operate=='SELECT' ||
  609. row.operate=='SELECTS' ||
  610. row.operate=='RADIO' ||
  611. row.operate=='FIND_IN_SET' ||
  612. row.operate=='CHECKBOX')
  613. ){
  614. r={'key1':'选项1','key2':'选项2'};
  615. }
  616. if(r){
  617. r=JSON.stringify(r);
  618. }
  619. return r;
  620. },
  621. parseOperateForm:function (){
  622. let data=this.operateDialog.data;
  623. let showFilter=[];
  624. let form=data.form;
  625. switch (form){
  626. case 'hidden':
  627. showFilter='all';
  628. break;
  629. case 'input':
  630. if(!inArray(['text','number','password','color'],data.type)){
  631. data.type='text';
  632. }
  633. showFilter=['=','<>','>','>=','<','<=','LIKE','NOT LIKE','FIND_IN_SET','NOT FIND_IN_SET'];
  634. break;
  635. case 'select':
  636. case 'cascader':
  637. case 'selectpage':
  638. if(data.multiple){
  639. showFilter=['IN','NOT IN'];
  640. }else{
  641. showFilter=['=','<>','>','>=','<','<=','LIKE','NOT LIKE','FIND_IN_SET','NOT FIND_IN_SET'];
  642. }
  643. break;
  644. case 'radio':
  645. showFilter=['=','<>','>','>=','<','<=','LIKE','NOT LIKE','FIND_IN_SET','NOT FIND_IN_SET'];
  646. break;
  647. case 'checkbox':
  648. showFilter=['IN','NOT IN'];
  649. break;
  650. case 'between':
  651. showFilter=['BETWEEN','NOT BETWEEN'];
  652. break;
  653. case 'date-picker':
  654. if(!inArray(['date','datetime','daterange'],data.type)){
  655. data.type='date';
  656. }
  657. if(data.type=='date' || data.type=='datetime'){
  658. showFilter=['=','< TIME','<= TIME','> TIME','>= TIME'];
  659. }
  660. if(data.type=='daterange'){
  661. showFilter=['BETWEEN TIME','NOT BETWEEN TIME'];
  662. }
  663. break;
  664. case 'time-picker':
  665. if(!inArray(['time','timerange'],data.type)){
  666. data.type='time';
  667. }
  668. if(data.type=='time'){
  669. showFilter=['=','< TIME','<= TIME','> TIME','>= TIME'];
  670. }
  671. if(data.type=='timerange'){
  672. showFilter=['BETWEEN TIME','NOT BETWEEN TIME'];
  673. }
  674. break;
  675. }
  676. this.operateDialog.searchList='';
  677. if(form=='checkbox' || form=='select' || form=='radio'){
  678. Vue.nextTick(()=>{
  679. let searchList=this.operateDialog.row.searchList?JSON.parse(this.operateDialog.row.searchList): {};
  680. this.operateDialog.searchList=searchList;
  681. });
  682. }
  683. this.operateDialog.filter=this.parseFilter(showFilter);
  684. },
  685. parseFilter:function (arr){
  686. if(arr=='all'){
  687. return this.filter;
  688. }else{
  689. let filter=[];
  690. for(let i=0;i<this.filter.length;i++){
  691. if(inArray(arr,this.filter[i].key)){
  692. filter.push(this.filter[i]);
  693. }
  694. }
  695. return filter;
  696. }
  697. },
  698. showOperate:function (row){
  699. this.operateDialog.row=row;
  700. let obj={
  701. short:row.operate,
  702. form:'',
  703. type:'',
  704. filter:'',
  705. placeholder:'',
  706. size:'default',
  707. append:'',
  708. prepend:'',
  709. value:'',
  710. url:'',
  711. labelField:'name',
  712. keyField:'id',
  713. cascaderType:'url',
  714. options:'',
  715. level:2,
  716. multiple:0
  717. };
  718. if(row.operate.startsWith("{") && row.operate.endsWith("}")){
  719. let operate=JSON.parse(row.operate);
  720. if(operate.multiple){
  721. operate.multiple=1;
  722. }
  723. this.operateDialog.data=Object.assign(obj,operate);
  724. }else{
  725. this.operateDialog.data=obj;
  726. parseShort(this.operateDialog.data);
  727. this.parseOperateForm();
  728. }
  729. this.operateDialog.show=true;
  730. },
  731. changeShort:function (type){
  732. if(type=='table'){
  733. this.operateDialog.data.value='';
  734. parseShort(this.operateDialog.data);
  735. this.parseOperateForm();
  736. }
  737. if(type=='form'){
  738. this.formDialog.data.value='';
  739. this.formDialog.data.readonly=0;
  740. parseShort(this.formDialog.data);
  741. this.parseForm();
  742. }
  743. },
  744. changeForm:function (type){
  745. if(type=='table'){
  746. this.parseOperateForm();
  747. this.operateDialog.data.value='';
  748. this.operateDialog.data.filter=this.operateDialog.filter[0].key;
  749. if(this.operateDialog.data.form=='select' || this.operateDialog.data.form=='selectpage' || this.operateDialog.data.form=='cascader'){
  750. if(this.operateDialog.data.multiple){
  751. this.operateDialog.data.value='[]';
  752. }
  753. }
  754. if(this.operateDialog.data.form=='date-picker' || this.operateDialog.data.form=='time-picker'){
  755. if(this.operateDialog.data.type=='daterange' || this.operateDialog.data.type=='timerange'){
  756. this.operateDialog.data.value='[]';
  757. }
  758. }
  759. if(this.operateDialog.data.form=='checkbox' || this.operateDialog.data.form=='between'){
  760. this.operateDialog.data.value='[]';
  761. }
  762. }
  763. if(type=='form'){
  764. this.parseForm();
  765. this.formDialog.data.value='';
  766. if(this.formDialog.data.form=='select' || this.formDialog.data.form=='selectpage' || this.formDialog.data.form=='cascader'){
  767. if(this.formDialog.data.multiple){
  768. this.formDialog.data.value='[]';
  769. }
  770. }
  771. if(this.formDialog.data.form=='date-picker' || this.formDialog.data.form=='time-picker'){
  772. if(this.formDialog.data.type=='daterange' || this.formDialog.data.type=='timerange'){
  773. this.formDialog.data.value='[]';
  774. }
  775. }
  776. if(this.formDialog.data.form=='checkbox'){
  777. this.formDialog.data.value='[]';
  778. }
  779. if(this.formDialog.data.form=='fieldlist'){
  780. this.formDialog.data.value='{}';
  781. }
  782. }
  783. },
  784. parseForm:function (){
  785. let data=this.formDialog.data;
  786. let form=data.form;
  787. this.formDialog.searchList='';
  788. if(form=='input' && !inArray(['text','number','hidden','textarea','password','color'],data.type)){
  789. data.type='text';
  790. }
  791. if(form=='date-picker' && !inArray(['date','datetime','daterange'],data.type)){
  792. data.type='date';
  793. }
  794. if(form=='time-picker' && !inArray(['time','timerange'],data.type)){
  795. data.type='time';
  796. }
  797. if(form=='checkbox' || form=='select' || form=='radio'){
  798. Vue.nextTick(()=>{
  799. let searchList=this.formDialog.row.searchList?JSON.parse(this.formDialog.row.searchList): {};
  800. this.formDialog.searchList=searchList;
  801. });
  802. }else if(form=='switch'){
  803. Vue.nextTick(()=>{
  804. let json={'normal':'正常','hidden':'隐藏'};
  805. data.value='normal';
  806. let type=this.formDialog.row.type;
  807. if(type=='int'){
  808. json={'0':'否','1':'是'};
  809. data.value='1';
  810. }
  811. let searchList=this.formDialog.row.searchList?JSON.parse(this.formDialog.row.searchList):json;
  812. this.formDialog.searchList=searchList;
  813. });
  814. }
  815. },
  816. confirmFilter:function (){
  817. let data=this.operateDialog.data;
  818. let row=this.operateDialog.row;
  819. let field=[];
  820. switch (data.form){
  821. case 'hidden':
  822. field=['form','filter','value'];
  823. break;
  824. case 'input':
  825. field=['form','type','filter','placeholder','size','append','prepend','value'];
  826. break;
  827. case 'select':
  828. field=['form','filter','placeholder','size','value','multiple'];
  829. break;
  830. case 'cascader':
  831. if(data.cascaderType=='url'){
  832. field=['form','filter','placeholder','size','value','url','level','multiple'];
  833. }
  834. if(data.cascaderType=='options'){
  835. field=['form','filter','placeholder','size','value','options','multiple'];
  836. }
  837. break;
  838. case 'selectpage':
  839. field=['form','filter','placeholder','size','value','url','labelField','keyField','multiple'];
  840. break;
  841. case 'radio':
  842. field=['form','filter','size','value'];
  843. break;
  844. case 'checkbox':
  845. field=['form','filter','size','value'];
  846. break;
  847. case 'between':
  848. field=['form','filter','size','value'];
  849. break;
  850. case 'date-picker':
  851. field=['form','type','placeholder','filter','size','value'];
  852. break;
  853. case 'time-picker':
  854. field=['form','type','placeholder','filter','size','value'];
  855. break;
  856. }
  857. let r={};
  858. for(let key in data){
  859. if(inArray(field,key)){
  860. if(!data[key]){
  861. continue;
  862. }
  863. if(key=='multiple'){
  864. if(!data[key]){
  865. continue;
  866. }else{
  867. data[key]=true;
  868. }
  869. }
  870. if(key=='size' && data[key]=='default'){
  871. continue;
  872. }
  873. r[key]=data[key];
  874. }
  875. }
  876. row.operate=JSON.stringify(r);
  877. if(this.operateDialog.searchList && Object.keys(this.operateDialog.searchList).length>0){
  878. row.searchList=JSON.stringify(this.operateDialog.searchList);
  879. }else{
  880. row.searchList='';
  881. }
  882. this.operateDialog.show=false;
  883. },
  884. changeSearchList:function (row){
  885. if(row.field=='searchlist'){
  886. this.searchListDialog.searchList=row.value;
  887. }
  888. if(row.field=='operate'){
  889. this.operateDialog.searchList=row.value;
  890. }
  891. if(row.field=='form'){
  892. this.formDialog.searchList=row.value;
  893. }
  894. },
  895. showSearchList:function (row){
  896. this.searchListDialog.searchList='';
  897. Vue.nextTick(()=>{
  898. this.searchListDialog.searchList=row.searchList?JSON.parse(row.searchList): {};
  899. });
  900. this.searchListDialog.row=row;
  901. this.searchListDialog.show=true;
  902. },
  903. confirmSearchList:function (){
  904. let row= this.searchListDialog.row;
  905. if(this.searchListDialog.searchList && Object.keys(this.searchListDialog.searchList).length>0){
  906. row.searchList=JSON.stringify(this.searchListDialog.searchList);
  907. }else{
  908. row.searchList='';
  909. }
  910. this.searchListDialog.show=false;
  911. },
  912. showRelation:function (row){
  913. this.relationDialog.row=row;
  914. this.relationDialog.show=true;
  915. },
  916. changeRelationTable:function (table){
  917. this.relationDialog.data.table=table;
  918. Yunqi.ajax.get('develop/getFields',{table:table}).then(res=>{
  919. this.relationDialog.fields=res;
  920. this.relationDialog.data.relationField=res[0].name;
  921. });
  922. },
  923. confirmRelation:function (){
  924. let row=this.relationDialog.row;
  925. let data=this.relationDialog.data;
  926. for(let k in data){
  927. if(!data[k]){
  928. Yunqi.message.error(__('每一项都必须填写完整'));
  929. return;
  930. }
  931. }
  932. row.relation=JSON.stringify(data);
  933. if(row.operate.startsWith('{') && row.operate.endsWith('}')){
  934. let operate=JSON.parse(row.operate);
  935. let table=data.table.replace(Yunqi.data.tablePrefix,'');
  936. operate.name=table+'.'+data.filterField;
  937. row.operate=JSON.stringify(operate);
  938. }else{
  939. let obj={
  940. short:row.operate
  941. };
  942. parseShort(obj);
  943. let table=data.table.replace(Yunqi.data.tablePrefix,'');
  944. obj.name=table+'.'+data.filterField;
  945. delete obj.short;
  946. row.operate=JSON.stringify(obj);
  947. }
  948. this.relationDialog.show=false;
  949. this.relationDialog.data={
  950. table:'',
  951. relationField:'',
  952. filterField:'',
  953. showField:'',
  954. ralationType:'one'
  955. };
  956. },
  957. showFormDialog:function (row){
  958. this.formDialog.row=row;
  959. let obj={
  960. short:row.edit,
  961. form:'',
  962. type:'',
  963. placeholder:'',
  964. append:'',
  965. prepend:'',
  966. readonly:0,
  967. value:'',
  968. url:'',
  969. labelField:'name',
  970. keyField:'id',
  971. cascaderType:'url',
  972. options:'',
  973. level:2,
  974. width:'100%',
  975. height:'400px',
  976. limit:1,
  977. disks:'local_public',
  978. accept:getAccept(),
  979. multiple:0,
  980. label:['键名','键值']
  981. };
  982. if(row.edit.startsWith("{") && row.edit.endsWith("}")){
  983. let edit=JSON.parse(row.edit);
  984. if(edit.multiple){
  985. edit.multiple=1;
  986. }
  987. if(edit.readonly){
  988. edit.readonly=1;
  989. }
  990. this.formDialog.data=Object.assign(obj,edit);
  991. }else{
  992. this.formDialog.data=obj;
  993. parseShort(this.formDialog.data);
  994. this.parseForm();
  995. }
  996. this.formDialog.show=true;
  997. },
  998. confirmForm:function (){
  999. let data=this.formDialog.data;
  1000. let row=this.formDialog.row;
  1001. let field=[];
  1002. switch (data.form){
  1003. case 'input':
  1004. field=['form','type','placeholder','append','prepend','readonly','value'];
  1005. break;
  1006. case 'select':
  1007. field=['form','placeholder','placeholder','value','multiple'];
  1008. break;
  1009. case 'radio':
  1010. case 'checkbox':
  1011. case 'switch':
  1012. field=['form','value'];
  1013. break;
  1014. case 'editor':
  1015. field=['form','width','height','value'];
  1016. break;
  1017. case 'date-picker':
  1018. case 'time-picker':
  1019. field=['form','type','placeholder','value'];
  1020. break;
  1021. case 'cascader':
  1022. if(data.cascaderType=='url'){
  1023. field=['form','placeholder','url','level','multiple','value'];
  1024. }
  1025. if(data.cascaderType=='options'){
  1026. field=['form','placeholder','options','multiple','value'];
  1027. }
  1028. break;
  1029. case 'selectpage':
  1030. field=['form','placeholder','url','labelField','keyField','multiple','value'];
  1031. break;
  1032. case 'attachment':
  1033. field=['form','limit','value'];
  1034. break;
  1035. case 'files':
  1036. if(data.limit>1){
  1037. data.multiple=1;
  1038. }
  1039. field=['form','limit','accept','disks','value','multiple'];
  1040. break;
  1041. case 'fieldlist':
  1042. field=['form','label','value'];
  1043. break;
  1044. case 'slot':
  1045. field=['form'];
  1046. break;
  1047. }
  1048. let r={};
  1049. for(let key in data){
  1050. if(inArray(field,key)){
  1051. if(!data[key]){
  1052. continue;
  1053. }
  1054. if(key=='multiple' || key=='readonly'){
  1055. if(!data[key]){
  1056. continue;
  1057. }else{
  1058. data[key]=true;
  1059. }
  1060. }
  1061. r[key]=data[key];
  1062. }
  1063. }
  1064. row.edit=JSON.stringify(r);
  1065. if(this.formDialog.searchList && Object.keys(this.formDialog.searchList).length>0){
  1066. row.searchList=JSON.stringify(this.formDialog.searchList);
  1067. }else{
  1068. row.searchList='';
  1069. }
  1070. this.formDialog.show=false;
  1071. },
  1072. changeAction:function (action){
  1073. let recyclebin=false;
  1074. for(let k in action){
  1075. if(k=='recyclebin'){
  1076. recyclebin=true;
  1077. break;
  1078. }
  1079. }
  1080. this.crudForm.recyclebin=recyclebin;
  1081. this.crudForm.actionList=action;
  1082. },
  1083. isShowEdit:function (row){
  1084. if(!row.edit){
  1085. return false;
  1086. }
  1087. if(row.edit=='hidden'){
  1088. return false
  1089. }
  1090. if(row.edit.startsWith("{") && row.edit.endsWith("}")){
  1091. let edit=JSON.parse(row.edit);
  1092. if(edit.form=='input' && edit.type=='hidden'){
  1093. return false;
  1094. }
  1095. }
  1096. return true;
  1097. },
  1098. openIconPanel:function (){
  1099. this.$refs.checkicon.open();
  1100. },
  1101. clear:function (){
  1102. Yunqi.confirm(__('支持清除一个小时内的操作,你确定要清除吗')).then(res=>{
  1103. let postdata={
  1104. table:this.crudForm.table,
  1105. controller:this.crudForm.controller,
  1106. model:this.crudForm.model,
  1107. fields:this.tableData,
  1108. actionList:this.crudForm.actionList,
  1109. actions:{table:0,form:0}
  1110. };
  1111. Yunqi.ajax.json('develop/clear',postdata,true,true);
  1112. });
  1113. },
  1114. submit:function (type){
  1115. let postdata={
  1116. table:this.crudForm.table,
  1117. controller:this.crudForm.controller,
  1118. model:this.crudForm.model,
  1119. reduced:this.crudForm.reduced,
  1120. actionList:this.crudForm.actionList,
  1121. fields:this.tableData,
  1122. isTree:this.crudForm.isTree,
  1123. treeTitle:this.crudForm.treeTitle,
  1124. pagination:!this.crudForm.pagination,
  1125. tabs:this.crudForm.tabs,
  1126. summary:this.crudForm.summary,
  1127. expand:this.crudForm.expand,
  1128. type:type,
  1129. actions:{
  1130. table:0,
  1131. form:0
  1132. }
  1133. };
  1134. if(inArray(this.actions,'table')){
  1135. postdata.actions.table=1;
  1136. }
  1137. if(inArray(this.actions,'form')){
  1138. postdata.actions.form=1;
  1139. }
  1140. Yunqi.ajax.json('develop/crud',postdata,true,true).then(res=>{
  1141. if(type=='file'){
  1142. Yunqi.api.addtabs({
  1143. url:res,
  1144. title:__('查看'),
  1145. icon:'fa fa-th-large',
  1146. });
  1147. }
  1148. if(type=='code'){
  1149. this.codeDialog.row=res;
  1150. this.codeDialog.show=true;
  1151. }
  1152. });
  1153. }
  1154. }
  1155. }