index.html 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327
  1. <template>
  2. <el-card shadow="never">
  3. <template #header>
  4. <el-alert effect="dark" :closable="false" title="使用说明">在此处定义的变量可以在全局通过site_config("组名.变量名")使用</el-alert>
  5. </template>
  6. <el-tabs type="card" v-model="tabValue" @tab-change="tabChange">
  7. <el-tab-pane :name="key" v-for="(label,key) in groupList" :label="label"></el-tab-pane>
  8. {if $app_debug}
  9. <el-tab-pane name="addconfig">
  10. <template #label>
  11. <i class="fa fa-plus"></i>&nbsp;添加配置
  12. </template>
  13. </el-tab-pane>
  14. {/if}
  15. </el-tabs>
  16. <div class="form-container">
  17. <yun-form
  18. label-position="left"
  19. require-asterisk-position="right"
  20. :label-width="200"
  21. @submit="onSubmit"
  22. :append-width="8"
  23. :action="extend.edit_url"
  24. @success="onSuccess"
  25. v-if="columns && tabValue!='addconfig'"
  26. :columns="columns">
  27. <template #default>
  28. <el-form-item>
  29. <template #label><span class="bolderText">变量标题</span></template>
  30. <el-row style="width:100%">
  31. <el-col :span="16">
  32. <span class="bolderText">变量值</span>
  33. </el-col>
  34. {if $app_debug}
  35. <el-col :span="8">
  36. <div class="bolderText" style="padding-left: 50px;">读取方式</div>
  37. </el-col>
  38. {/if}
  39. </el-row>
  40. </el-form-item>
  41. </template>
  42. <template #addons="{value}">
  43. <el-divider>
  44. <el-tag v-if="value.name">{{value.type}}-{{value.name}}</el-tag>
  45. <el-tag v-else type="warning">未安装扩展-{{value.key}}</el-tag>
  46. </el-divider>
  47. </template>
  48. {if $app_debug}
  49. <template #append="item">
  50. <div style="padding-left:30px;">
  51. <span>{{formatVar(item.column.field,item.column.addons)}}</span>
  52. <el-button style="position: absolute;right: 0" @click="delVar(item.column.field)" size="small" type="danger" v-if="item.column.can_delete">{:__('删除')}</el-button>
  53. </div>
  54. </template>
  55. {/if}
  56. </yun-form>
  57. <yun-form
  58. v-if="tabValue=='addconfig'"
  59. :action="extend.add_url"
  60. @success="onSuccess"
  61. ref="yunform"
  62. :columns="addconfig">
  63. </yun-form>
  64. </div>
  65. </el-card>
  66. </template>
  67. <script>
  68. import form from "@components/Form.js";
  69. import {inArray} from "@util.js";
  70. export default{
  71. components:{'YunForm':form},
  72. data:{
  73. extend:{
  74. index_url: 'general/config/index',
  75. add_url: 'general/config/add',
  76. edit_url: 'general/config/edit',
  77. del_url: 'general/config/del'
  78. },
  79. addconfig:[
  80. {field:'group',title:__('分组'),searchList:Yunqi.data.groupList,edit: {form:'select',value:'basic',change:'changeGroup'},rules:'required'},
  81. {field:'addons_pack',title:__('扩展包名'),edit:{form:'input',type:'text'},visible:false},
  82. {field:'type',title:__('类型'),searchList:Yunqi.data.typeList,edit: {form:'select',change:'changeType',value:'text'},rules:'required'},
  83. {field:'title',title:__('变量标题'),edit:'text',rules:'required'},
  84. {field:'name',title:__('变量名'),edit:'text',rules:'required'},
  85. {field:'url',title:__('分页列表Url'),edit: {form:'input',type:'text'},visible:false},
  86. {field:'labelField',title:__('显示字段'),edit: {form:'input',type:'text',placeholder:'请输入显示字段labelField'},visible:false},
  87. {field:'keyField',title:__('存储字段'),edit: {form:'input',type:'text',placeholder:'请输入显示字段keyField'},visible:false},
  88. {field:'options',title:__('选项'),edit: {form:'fieldlist',label:['键名','键值']},visible:false},
  89. {field:'value',title:__('默认值'),edit:'text'},
  90. {field:'label',title:__('JSON标题'),edit: {form:'input',type:'text',placeholder:'请输入Fieldlist的标题label,用“,”隔开'},visible:false},
  91. {field:'keys',title:__('JSON Keys'),edit: {form:'input',type:'text',placeholder:'请输入Fieldlist的标题keys,用“,”隔开'},visible:false},
  92. {field:'tips',title:__('提示信息'),edit:'text'},
  93. {field:'rules',title:__('验证规则'),edit:{form:'input',type:'text',placeholder:'请输入验证规则,多个规则用“,”隔开'}},
  94. ],
  95. groupList:Yunqi.data.groupList,
  96. typeList:Yunqi.data.typeList,
  97. tableList:[],
  98. fieldList:[],
  99. tabValue:'basic',
  100. columns:''
  101. },
  102. onLoad:function (){
  103. this.getSiteList();
  104. },
  105. methods: {
  106. getSiteList:function (){
  107. Yunqi.ajax.get(this.extend.index_url,{group:this.tabValue}).then(res=>{
  108. if(this.tabValue=='addons'){
  109. let columns=[];
  110. for(let i=0;i<res.length;i++){
  111. let value={key:res[i].key,type:res[i].type,name:res[i].name};
  112. columns.push({field:'addons', edit:{form:'slot',value:value}});
  113. let row=this.formatColumns(res[i].list);
  114. columns=columns.concat(row);
  115. }
  116. this.columns=columns;
  117. }else{
  118. this.columns=this.formatColumns(res);
  119. }
  120. });
  121. },
  122. tabChange:function (tab){
  123. this.columns='';
  124. this.tabValue=tab;
  125. this.getSiteList();
  126. },
  127. delVar:function (name){
  128. Yunqi.ajax.post(this.extend.del_url,{group:this.tabValue,name:name}).then(res=>{
  129. location.reload();
  130. });
  131. },
  132. formatVar:function (field,addons){
  133. if(addons){
  134. return 'site_config('+this.tabValue+'.'+addons+'.'+field+'")';
  135. }else{
  136. return 'site_config("'+this.tabValue+'.'+field+'")';
  137. }
  138. },
  139. formatColumns:function (list){
  140. let one=[{field:'group',edit:'hidden'}];
  141. for(let i=0;i<list.length;i++){
  142. let obj={
  143. id:list[i].id,
  144. field:list[i].name,
  145. title:list[i].title,
  146. can_delete:list[i].can_delete,
  147. edit: {}
  148. };
  149. if(list[i].rules){
  150. obj.rules=list[i].rules;
  151. }
  152. if(list[i].type=='text'){
  153. obj.edit.form='input';
  154. obj.edit.type='text';
  155. obj.edit.value=list[i].value;
  156. if(list[i].extend=='readonly'){
  157. obj.edit.readonly=true;
  158. }
  159. }
  160. if(list[i].type=='textarea'){
  161. obj.edit.form='input';
  162. obj.edit.type='textarea';
  163. obj.edit.value=list[i].value;
  164. obj.edit.rows=4;
  165. }
  166. if(list[i].type=='password'){
  167. obj.edit.form='input';
  168. obj.edit.type='password';
  169. obj.edit.value=list[i].value;
  170. }
  171. if(list[i].type=='number'){
  172. obj.edit.form='input';
  173. obj.edit.type='number';
  174. obj.edit.value=list[i].value;
  175. }
  176. if(list[i].type=='date'){
  177. obj.edit.form='date-picker';
  178. obj.edit.type='date';
  179. obj.edit.value=list[i].value;
  180. }
  181. if(list[i].type=='time'){
  182. obj.edit.form='time-picker';
  183. obj.edit.value=list[i].value;
  184. }
  185. if(list[i].type=='datetime'){
  186. obj.edit.form='date-picker';
  187. obj.edit.type='datetime';
  188. obj.edit.value=list[i].value;
  189. }
  190. if(list[i].type=='daterange'){
  191. obj.edit.form='date-picker';
  192. obj.edit.type='daterange';
  193. obj.edit.value=list[i].value;
  194. }
  195. if(list[i].type=='timerange'){
  196. obj.edit.form='time-picker';
  197. obj.edit.isRange=true;
  198. obj.edit.value=list[i].value;
  199. }
  200. if(list[i].type=='select'){
  201. obj.searchList=list[i].extend;
  202. obj.edit.form='select';
  203. obj.edit.value=list[i].value.toString();
  204. }
  205. if(list[i].type=='selects'){
  206. obj.edit.form='select';
  207. obj.searchList=list[i].extend;
  208. obj.edit.multiple=true;
  209. obj.edit.value=list[i].value || [];
  210. }
  211. if(list[i].type=='selectpage'){
  212. obj.edit.form='selectpage';
  213. obj.edit.url='general/config/selectpage?id='+list[i].id;
  214. obj.edit.keyField=list[i].setting.primarykey;
  215. obj.edit.labelField=list[i].setting.field;
  216. obj.edit.value=list[i].value;
  217. }
  218. if(list[i].type=='selectpages'){
  219. obj.edit.form='selectpage';
  220. obj.edit.url='general/config/selectpage?id='+list[i].id;
  221. obj.edit.keyField=list[i].setting.primarykey;
  222. obj.edit.labelField=list[i].setting.field;
  223. obj.edit.multiple=true;
  224. obj.edit.value=list[i].value;
  225. }
  226. if(list[i].type=='radio'){
  227. obj.edit.form='radio';
  228. obj.searchList=list[i].extend;
  229. obj.edit.value=list[i].value.toString();
  230. }
  231. if(list[i].type=='checkbox'){
  232. obj.edit.form='checkbox';
  233. obj.searchList=list[i].extend;
  234. obj.edit.value=list[i].value || [];
  235. }
  236. if(list[i].type=='image'){
  237. obj.edit.form='attachment';
  238. obj.edit.limit=1;
  239. obj.edit.value=list[i].value;
  240. }
  241. if(list[i].type=='images'){
  242. obj.edit.form='attachment';
  243. obj.edit.limit=10;
  244. obj.edit.value=list[i].value;
  245. }
  246. if(list[i].type=='file'){
  247. obj.edit.form='files';
  248. obj.edit.limit=1;
  249. let mimetype=Yunqi.config.upload.mimetype.split(',');
  250. let accept=[];
  251. mimetype.forEach(res=>{
  252. accept.push('.'+res);
  253. });
  254. obj.edit.accept=accept;
  255. obj.edit.multiple=false;
  256. obj.edit.value=list[i].value;
  257. }
  258. if(list[i].type=='files'){
  259. obj.edit.form='files';
  260. let mimetype=Yunqi.config.upload.mimetype.split(',');
  261. let accept=[];
  262. mimetype.forEach(res=>{
  263. accept.push('.'+res);
  264. });
  265. obj.edit.accept=accept;
  266. obj.edit.multiple=true;
  267. obj.edit.value=list[i].value;
  268. }
  269. if(list[i].type=='json'){
  270. obj.edit.form='fieldlist';
  271. obj.edit.value=list[i].value || null;
  272. obj.edit.label=list[i].extend[0];
  273. obj.edit.keys=list[i].extend[1];
  274. }
  275. if(list[i].type=='switch'){
  276. obj.edit.form='switch';
  277. obj.edit.inactiveValue='0';
  278. obj.edit.activeValue='1'
  279. obj.edit.value=list[i].value;
  280. }
  281. if(list[i].tip){
  282. obj.edit.placeholder=list[i].tip;
  283. }
  284. one.push(obj);
  285. }
  286. return one;
  287. },
  288. changeType:function (data,row){
  289. this.$refs.yunform.hideField(['label','url','labelField','keyField','options']);
  290. if(data=='selectpage' || data=='selectpages'){
  291. this.$refs.yunform.showField(['url','labelField','keyField']);
  292. }else if(data=='json'){
  293. this.$refs.yunform.showField(['label','keys']);
  294. }else if(inArray(['select','selects','radio','checkbox'],data)){
  295. this.$refs.yunform.showField('options');
  296. }
  297. },
  298. changeGroup:function (data){
  299. if(data=='addons'){
  300. this.$refs.yunform.showField('addons_pack');
  301. }else{
  302. this.$refs.yunform.hideField('addons_pack');
  303. }
  304. },
  305. onSubmit:function (row){
  306. row.group=this.tabValue;
  307. return true;
  308. },
  309. onSuccess:function (){
  310. if(this.tabValue=='dictionary'){
  311. location.reload();
  312. }
  313. }
  314. }
  315. }
  316. </script>
  317. <style>
  318. .bolderText{
  319. font-weight:bolder;
  320. }
  321. .form-container{
  322. padding: 30px;
  323. border:1px solid var(--el-border-color-light);
  324. border-top: 0;
  325. margin-top: -16px;
  326. }
  327. </style>