no message

This commit is contained in:
小陌 2024-01-30 23:24:43 +08:00
parent 58c8f4f633
commit 075ecae03c
23 changed files with 361 additions and 332 deletions

2
dist/index.html vendored
View File

@ -1,4 +1,4 @@
<!doctype html><html lang="en"><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta content="IE=edge,chrome=1" http-equiv="X-UA-Compatible"/><meta content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=0" name="viewport"/><link rel="icon" href="https://ansnid.oss-cn-shenzhen.aliyuncs.com/x-Admin/favicon.ico"><title>X-PHP</title><script>document.write("<script src='config.js'><\/script>");</script><script defer="defer" src="https://ansnid.oss-cn-shenzhen.aliyuncs.com/x-Admin/static/js/echarts.49558cc4.js"></script><script defer="defer" src="https://ansnid.oss-cn-shenzhen.aliyuncs.com/x-Admin/static/js/elicons.4bccae06.js"></script><script defer="defer" src="https://ansnid.oss-cn-shenzhen.aliyuncs.com/x-Admin/static/js/modules.af2834df.js"></script><script defer="defer" src="https://ansnid.oss-cn-shenzhen.aliyuncs.com/x-Admin/static/js/app.9e64d7b4.js"></script><link href="https://ansnid.oss-cn-shenzhen.aliyuncs.com/x-Admin/static/css/modules.34563575.css" rel="stylesheet"><link href="https://ansnid.oss-cn-shenzhen.aliyuncs.com/x-Admin/static/css/app.8a627c74.css" rel="stylesheet"></head><body><noscript><strong>We're sorry but X-PHP doesn't work properly without JavaScript enabled.</strong></noscript><div id="app" class="adminui"><div class="app-loading"><div class="app-loading__logo"><img src="https://ansnid.oss-cn-shenzhen.aliyuncs.com/x-Admin/logo.png"/></div><div class="app-loading-text"><span class="app-loading-preloader">X</span> <span class="app-loading-preloader">-</span> <span class="app-loading-preloader">A</span> <span class="app-loading-preloader">d</span> <span class="app-loading-preloader">m</span> <span class="app-loading-preloader">i</span> <span class="app-loading-preloader">n</span><div class="app-loading-viewtext-container"><span class="app-loading-viewtext">X</span> <span class="app-loading-viewtext">-</span> <span class="app-loading-viewtext">A</span> <span class="app-loading-viewtext">d</span> <span class="app-loading-viewtext">m</span> <span class="app-loading-viewtext">i</span> <span class="app-loading-viewtext">n</span></div></div></div></div></body><div id="versionCheck" class="versionCheck"><h2>当前浏览器内核版本过低</h2><p>当前版本:<span id="versionCheck-type">--</span> <span id="versionCheck-version">--</span></p><p>最低版本要求Chrome 71+、Firefox 65+、Safari 12+、Edge 97+。</p><p>请升级浏览器版本,或更换现代浏览器,如果你使用的是双核浏览器,请切换到极速/高速模式。</p></div><style>html,
<!doctype html><html lang="en"><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta content="IE=edge,chrome=1" http-equiv="X-UA-Compatible"/><meta content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=0" name="viewport"/><link rel="icon" href="https://ansnid.oss-cn-shenzhen.aliyuncs.com/x-Admin/favicon.ico"><title>X-PHP</title><script>document.write("<script src='config.js'><\/script>");</script><script defer="defer" src="https://ansnid.oss-cn-shenzhen.aliyuncs.com/x-Admin/static/js/echarts.49558cc4.js"></script><script defer="defer" src="https://ansnid.oss-cn-shenzhen.aliyuncs.com/x-Admin/static/js/elicons.4bccae06.js"></script><script defer="defer" src="https://ansnid.oss-cn-shenzhen.aliyuncs.com/x-Admin/static/js/modules.af2834df.js"></script><script defer="defer" src="https://ansnid.oss-cn-shenzhen.aliyuncs.com/x-Admin/static/js/app.d9acf3ba.js"></script><link href="https://ansnid.oss-cn-shenzhen.aliyuncs.com/x-Admin/static/css/modules.34563575.css" rel="stylesheet"><link href="https://ansnid.oss-cn-shenzhen.aliyuncs.com/x-Admin/static/css/app.cac8c39f.css" rel="stylesheet"></head><body><noscript><strong>We're sorry but X-PHP doesn't work properly without JavaScript enabled.</strong></noscript><div id="app" class="adminui"><div class="app-loading"><div class="app-loading__logo"><img src="https://ansnid.oss-cn-shenzhen.aliyuncs.com/x-Admin/logo.png"/></div><div class="app-loading-text"><span class="app-loading-preloader">X</span> <span class="app-loading-preloader">-</span> <span class="app-loading-preloader">A</span> <span class="app-loading-preloader">d</span> <span class="app-loading-preloader">m</span> <span class="app-loading-preloader">i</span> <span class="app-loading-preloader">n</span><div class="app-loading-viewtext-container"><span class="app-loading-viewtext">X</span> <span class="app-loading-viewtext">-</span> <span class="app-loading-viewtext">A</span> <span class="app-loading-viewtext">d</span> <span class="app-loading-viewtext">m</span> <span class="app-loading-viewtext">i</span> <span class="app-loading-viewtext">n</span></div></div></div></div></body><div id="versionCheck" class="versionCheck"><h2>当前浏览器内核版本过低</h2><p>当前版本:<span id="versionCheck-type">--</span> <span id="versionCheck-version">--</span></p><p>最低版本要求Chrome 71+、Firefox 65+、Safari 12+、Edge 97+。</p><p>请升级浏览器版本,或更换现代浏览器,如果你使用的是双核浏览器,请切换到极速/高速模式。</p></div><style>html,
body,
#app {
transition-property: filter;

4
dist/report.html vendored

File diff suppressed because one or more lines are too long

View File

@ -1 +0,0 @@
.setting[data-v-6bfa3f9c]{height:100%}.setting[data-v-6bfa3f9c] .el-tabs--left .el-tabs__nav.is-left{width:100%}.setting[data-v-6bfa3f9c] .el-card__body{height:100%;padding:0}.x-page-header[data-v-6bfa3f9c]{padding:10px 25px}.setting[data-v-6bfa3f9c] .el-tabs__item.is-active{background-color:var(--el-menu-background)}.setting[data-v-6bfa3f9c] .el-tabs--left{height:calc(100% - 78px)}.setting[data-v-6bfa3f9c] .el-tabs__content{padding:20px;overflow-y:scroll;height:100%}.setting[data-v-6bfa3f9c] .el-tabs{--el-tabs-header-height:50px}.setting[data-v-6bfa3f9c] .el-tabs--left .el-tabs__header.is-left{margin:0;min-width:120px}.el-footer[data-v-6bfa3f9c]{padding:10px;height:51px;margin:0;text-align:center}.setting[data-v-6bfa3f9c] .el-tabs--top .el-tabs__item{padding:0 20px}

1
dist/static/css/444.55741c84.css vendored Normal file
View File

@ -0,0 +1 @@
.setting[data-v-c77bcd06]{height:100%}.setting[data-v-c77bcd06] .el-tabs--left .el-tabs__nav.is-left{width:100%}.setting[data-v-c77bcd06] .el-card__body{height:100%;padding:0}.x-page-header[data-v-c77bcd06]{padding:10px 25px}.setting[data-v-c77bcd06] .el-tabs__item.is-active{background-color:var(--el-menu-background)}.setting[data-v-c77bcd06] .el-tabs--left{height:calc(100% - 78px)}.setting[data-v-c77bcd06] .el-tabs__content{padding:20px;overflow-y:scroll;height:100%}.setting[data-v-c77bcd06] .el-tabs{--el-tabs-header-height:50px}.setting[data-v-c77bcd06] .el-tabs--left .el-tabs__header.is-left{margin:0;min-width:120px}.el-footer[data-v-c77bcd06]{padding:10px;height:51px;margin:0;text-align:center}.setting[data-v-c77bcd06] .el-tabs--top .el-tabs__item{padding:0 20px}

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
"use strict";(self["webpackChunkx_php_admin"]=self["webpackChunkx_php_admin"]||[]).push([[251],{251:function(e,t,a){a.r(t),a.d(t,{default:function(){return m}});var r=a(6808),l=a(9511);const n={class:"left-panel"},i={class:"right-panel"},s={class:"right-panel-search"};function c(e,t,a,c,o,u){const h=(0,r.up)("el-date-picker"),p=(0,r.up)("el-input"),d=(0,r.up)("el-button"),m=(0,r.up)("el-header"),g=(0,r.up)("el-table-column"),f=(0,r.up)("xTable"),w=(0,r.up)("el-main"),b=(0,r.up)("el-container");return(0,r.wg)(),(0,r.j4)(b,{class:"container"},{default:(0,r.w5)((()=>[(0,r.Wm)(m,null,{default:(0,r.w5)((()=>[(0,r._)("div",n,[(0,r.Wm)(h,{modelValue:o.date,"onUpdate:modelValue":t[0]||(t[0]=e=>o.date=e),type:"datetimerange","range-separator":"至","start-placeholder":"开始日期","end-placeholder":"结束日期"},null,8,["modelValue"])]),(0,r._)("div",i,[(0,r._)("div",s,[(0,r.Wm)(p,{modelValue:o.search.keyword,"onUpdate:modelValue":t[1]||(t[1]=e=>o.search.keyword=e),placeholder:"输入关键词",clearable:""},null,8,["modelValue"]),(0,r.Wm)(d,{type:"primary",icon:"el-icon-search",onClick:u.upsearch},null,8,["onClick"])])])])),_:1}),(0,r.Wm)(w,{class:"nopadding"},{default:(0,r.w5)((()=>[(0,r.Wm)(f,{ref:"table",api:o.api,params:o.search,tableColumn:o.tableColumn,stripe:"",highlightCurrentRow:"",onRowClick:u.rowClick},{default:(0,r.w5)((()=>[(0,r.Wm)(g,{type:"index",width:"60",align:"center"},{default:(0,r.w5)((e=>[(0,r._)("span",null,(0,l.zw)(e.$index+(o.currentPage-1)*o.limit+1),1)])),_:1})])),_:1},8,["api","params","tableColumn","onRowClick"])])),_:1})])),_:1})}var o=a(7062),u=a(1843),h={name:"log",components:{columnItem:o.Z,xMenuItem:u.Z},data(){return{infoDrawer:!1,chartoption:{},typeList:[],date:[],data:[],search:{},api:"",current:"",config:{},tableColumn:{},column:"default",currentPage:1,limit:20}},mounted(){this.getType()},watch:{current(){this.search.type=this.current,this.getCurrent()}},methods:{sideClick(e){this.info=e,this.search.type=e.value,this.current=e.value,this.column=e.column||"column"},changeURLArg(e,t,a){var r=t+"=([^&]*)";if(""===a)return e=e.replace(new RegExp("&?"+r,"gi"),""),e=e.replace(new RegExp("\\??"+r+"&?","gi"),"?"),e;var l=t+"="+a;if(e.match(r)){var n="("+t+"=)([^&]*)";return n=e.replace(new RegExp(n,"gi"),l),n}return e.match("[?]")?e+"&"+l:e+"?"+l},nodeClick(e){if(e.disabled)return!1;this.current=e.label,this.column=e.column||"column"},getType(){this.$http.get("log/admin/types",{type:this.$route.query.type},{cacheparameters:!0}).then((e=>{if(200==e.code){Object.assign(this.$data,e.data);for(const e in this.search)Object.prototype.hasOwnProperty.call(this.$route.query,e)&&(this.search[e]=this.$route.query[e])}}))},getCurrent(){this.tableColumn=this.config[this.column]||this.config.default,this.api||(this.api="log/admin/lists"),this.$refs.table.reload(this.search);let e=window.location.href;for(const[t,a]of Object.entries(this.search))e=this.changeURLArg(e,t,a);history.replaceState(Object.assign({},window.history.state,{url:e}),"null",e)},upsearch(){this.getCurrent()},rowClick(e){this.infoDrawer=!0,this.$nextTick((()=>{this.$refs.info.setData(e)}))}}},p=a(8700);const d=(0,p.Z)(h,[["render",c],["__scopeId","data-v-eba8b6d4"]]);var m=d}}]);
"use strict";(self["webpackChunkx_php_admin"]=self["webpackChunkx_php_admin"]||[]).push([[251],{251:function(e,t,a){a.r(t),a.d(t,{default:function(){return m}});var r=a(6808),l=a(9511);const n={class:"left-panel"},i={class:"right-panel"},s={class:"right-panel-search"};function c(e,t,a,c,o,u){const h=(0,r.up)("el-date-picker"),p=(0,r.up)("el-input"),d=(0,r.up)("el-button"),m=(0,r.up)("el-header"),g=(0,r.up)("el-table-column"),f=(0,r.up)("xTable"),w=(0,r.up)("el-main"),b=(0,r.up)("el-container");return(0,r.wg)(),(0,r.j4)(b,{class:"container"},{default:(0,r.w5)((()=>[(0,r.Wm)(m,null,{default:(0,r.w5)((()=>[(0,r._)("div",n,[(0,r.Wm)(h,{modelValue:o.date,"onUpdate:modelValue":t[0]||(t[0]=e=>o.date=e),type:"datetimerange","range-separator":"至","start-placeholder":"开始日期","end-placeholder":"结束日期"},null,8,["modelValue"])]),(0,r._)("div",i,[(0,r._)("div",s,[(0,r.Wm)(p,{modelValue:o.search.keyword,"onUpdate:modelValue":t[1]||(t[1]=e=>o.search.keyword=e),placeholder:"输入关键词",clearable:""},null,8,["modelValue"]),(0,r.Wm)(d,{type:"primary",icon:"el-icon-search",onClick:u.upsearch},null,8,["onClick"])])])])),_:1}),(0,r.Wm)(w,{class:"nopadding"},{default:(0,r.w5)((()=>[(0,r.Wm)(f,{ref:"table",api:o.api,params:o.search,tableColumn:o.tableColumn,stripe:"",highlightCurrentRow:"",onRowClick:u.rowClick},{default:(0,r.w5)((()=>[(0,r.Wm)(g,{type:"index",width:"60",align:"center"},{default:(0,r.w5)((e=>[(0,r._)("span",null,(0,l.zw)(e.$index+(o.currentPage-1)*o.limit+1),1)])),_:1})])),_:1},8,["api","params","tableColumn","onRowClick"])])),_:1})])),_:1})}var o=a(9565),u=a(1843),h={name:"log",components:{columnItem:o.Z,xMenuItem:u.Z},data(){return{infoDrawer:!1,chartoption:{},typeList:[],date:[],data:[],search:{},api:"",current:"",config:{},tableColumn:{},column:"default",currentPage:1,limit:20}},mounted(){this.getType()},watch:{current(){this.search.type=this.current,this.getCurrent()}},methods:{sideClick(e){this.info=e,this.search.type=e.value,this.current=e.value,this.column=e.column||"column"},changeURLArg(e,t,a){var r=t+"=([^&]*)";if(""===a)return e=e.replace(new RegExp("&?"+r,"gi"),""),e=e.replace(new RegExp("\\??"+r+"&?","gi"),"?"),e;var l=t+"="+a;if(e.match(r)){var n="("+t+"=)([^&]*)";return n=e.replace(new RegExp(n,"gi"),l),n}return e.match("[?]")?e+"&"+l:e+"?"+l},nodeClick(e){if(e.disabled)return!1;this.current=e.label,this.column=e.column||"column"},getType(){this.$http.get("log/admin/types",{type:this.$route.query.type},{cacheparameters:!0}).then((e=>{if(200==e.code){Object.assign(this.$data,e.data);for(const e in this.search)Object.prototype.hasOwnProperty.call(this.$route.query,e)&&(this.search[e]=this.$route.query[e])}}))},getCurrent(){this.tableColumn=this.config[this.column]||this.config.default,this.api||(this.api="log/admin/lists"),this.$refs.table.reload(this.search);let e=window.location.href;for(const[t,a]of Object.entries(this.search))e=this.changeURLArg(e,t,a);history.replaceState(Object.assign({},window.history.state,{url:e}),"null",e)},upsearch(){this.getCurrent()},rowClick(e){this.infoDrawer=!0,this.$nextTick((()=>{this.$refs.info.setData(e)}))}}},p=a(8700);const d=(0,p.Z)(h,[["render",c],["__scopeId","data-v-eba8b6d4"]]);var m=d}}]);

View File

@ -1 +0,0 @@
"use strict";(self["webpackChunkx_php_admin"]=self["webpackChunkx_php_admin"]||[]).push([[322],{3322:function(e,t,a){a.r(t),a.d(t,{default:function(){return r}});var l=a(6808);const i={key:0};function n(e,t,a,n,o,d){const s=(0,l.up)("x-page-header"),r=(0,l.up)("el-alert"),u=(0,l.up)("el-option"),p=(0,l.up)("el-select"),m=(0,l.up)("el-input"),c=(0,l.up)("el-table-column"),g=(0,l.up)("x-form-table"),h=(0,l.up)("el-button"),w=(0,l.up)("x-form"),f=(0,l.up)("el-tab-pane"),y=(0,l.up)("el-tabs"),b=(0,l.up)("el-card"),v=(0,l.up)("el-main"),k=(0,l.up)("el-footer"),x=(0,l.up)("el-container"),_=(0,l.Q2)("loading");return(0,l.wg)(),(0,l.j4)(x,null,{default:(0,l.w5)((()=>[(0,l.Wm)(v,null,{default:(0,l.w5)((()=>[(0,l.Wm)(b,{shadow:"never",class:"setting"},{default:(0,l.w5)((()=>[(0,l.Wm)(s,{title:"系统设置",description:"可以修改网站及应用的各种配置",icon:"el-icon-setting"}),(0,l.wy)(((0,l.wg)(),(0,l.j4)(y,{"tab-position":o.tabposition,modelValue:o.activename,"onUpdate:modelValue":t[1]||(t[1]=e=>o.activename=e)},{default:(0,l.w5)((()=>[((0,l.wg)(!0),(0,l.iD)(l.HY,null,(0,l.Ko)(o.settingList,(e=>((0,l.wg)(),(0,l.j4)(f,{key:e.key,label:e.name,name:e.key},{default:(0,l.w5)((()=>["extend"==e.type?((0,l.wg)(),(0,l.iD)("div",i,[e.tips?((0,l.wg)(),(0,l.j4)(r,{key:0,title:e.tips,type:"warning",style:{"margin-bottom":"15px"}},null,8,["title"])):(0,l.kq)("",!0),(0,l.Wm)(g,{modelValue:o.extend[e.key],"onUpdate:modelValue":t=>o.extend[e.key]=t,hideAdd:!0,"drag-sort":"",placeholder:"暂无数据"},{default:(0,l.w5)((()=>[((0,l.wg)(!0),(0,l.iD)(l.HY,null,(0,l.Ko)(e.column,(e=>((0,l.wg)(),(0,l.j4)(c,{label:e.label,prop:e.prop,width:e.width,key:e.prop},{default:(0,l.w5)((t=>["select"==e.component?((0,l.wg)(),(0,l.j4)(p,(0,l.dG)({key:0,modelValue:t.row[e.prop],"onUpdate:modelValue":a=>t.row[e.prop]=a},e.options,{clearable:"",filterable:"",style:{width:"100%"}}),{default:(0,l.w5)((()=>[((0,l.wg)(!0),(0,l.iD)(l.HY,null,(0,l.Ko)(e.options.items,(e=>((0,l.wg)(),(0,l.j4)(u,{key:e.value,label:e.label||e.name,value:e.value},null,8,["label","value"])))),128))])),_:2},1040,["modelValue","onUpdate:modelValue"])):((0,l.wg)(),(0,l.j4)(m,{key:1,modelValue:t.row[e.prop],"onUpdate:modelValue":a=>t.row[e.prop]=a,placeholder:e.placeholder},null,8,["modelValue","onUpdate:modelValue","placeholder"]))])),_:2},1032,["label","prop","width"])))),128))])),_:2},1032,["modelValue","onUpdate:modelValue"]),(0,l.Wm)(h,{type:"primary",icon:"el-icon-plus",onClick:t=>d.table_add(e),style:{"margin-top":"20px"}},null,8,["onClick"])])):((0,l.wg)(),(0,l.j4)(w,{key:1,ref_for:!0,ref:"formref",config:o.formList[e.key],modelValue:o.info,"onUpdate:modelValue":t[0]||(t[0]=e=>o.info=e),loading:o.loading},null,8,["config","modelValue","loading"]))])),_:2},1032,["label","name"])))),128))])),_:1},8,["tab-position","modelValue"])),[[_,o.loading]])])),_:1})])),_:1}),(0,l.Wm)(k,null,{default:(0,l.w5)((()=>[(0,l.Wm)(h,{type:"primary",onClick:d.submit,style:{"max-width":"500px",width:"100%"},loading:o.submitloading},{default:(0,l.w5)((()=>[(0,l.Uk)("保存")])),_:1},8,["onClick","loading"])])),_:1})])),_:1})}a(8311);var o={name:"setting",data(){return{info:{},activename:"init",tabposition:"left",settingList:[],extend:[],formList:{},loading:!1,submitloading:!1}},watch:{activename(){let e=window.location.href;e=this.changeURLArg(e,"type",this.activename),history.replaceState(Object.assign({},window.history.state,{url:e}),"null",e)}},mounted(){this.render()},created(){this.onLayoutResize(),window.addEventListener("resize",this.onLayoutResize)},methods:{onLayoutResize(){this.tabposition=document.body.clientWidth<992?"top":"left"},changeURLArg(e,t,a){var l=t+"=([^&]*)";if(""===a)return e=e.replace(new RegExp("&?"+l,"gi"),""),e=e.replace(new RegExp("\\??"+l+"&?","gi"),"?"),e;var i=t+"="+a;if(e.match(l)){var n="("+t+"=)([^&]*)";return n=e.replace(new RegExp(n,"gi"),i),n}return e.match("[?]")?e+"&"+i:e+"?"+i},async render(){this.loading=!0;var e=await this.$http.get("setting/get",this.$route.query);if(200!=e.code)return this.$message.warning(e.message),!1;this.settingList=e.data.settingList,this.info=e.data.info,this.formList=e.data.formList,this.extend=e.data.extend||[],this.loading=!1,e.data.activename&&(this.activename=e.data.activename)},async submit(){this.submitloading=!0;var e=this.$http.post("setting/submit",{info:this.info,extend:this.extend});this.submitloading=!1,200!=e.code?this.$alert(e.message,"提示",{type:"error"}):this.$message.success(e.message||"操作成功")},table_add(e){var t={};e.column.forEach((function(e){t[e.prop]=""})),this.extend[e.key].push(t)}}},d=a(8700);const s=(0,d.Z)(o,[["render",n],["__scopeId","data-v-6bfa3f9c"]]);var r=s}}]);

File diff suppressed because one or more lines are too long

1
dist/static/js/444.fe195afe.js vendored Normal file
View File

@ -0,0 +1 @@
"use strict";(self["webpackChunkx_php_admin"]=self["webpackChunkx_php_admin"]||[]).push([[444],{2444:function(e,t,a){a.r(t),a.d(t,{default:function(){return r}});var i=a(6808);const l={key:0};function n(e,t,a,n,o,d){const s=(0,i.up)("x-page-header"),r=(0,i.up)("el-alert"),u=(0,i.up)("el-option"),p=(0,i.up)("el-select"),m=(0,i.up)("el-input"),c=(0,i.up)("el-table-column"),g=(0,i.up)("x-form-table"),h=(0,i.up)("el-button"),w=(0,i.up)("x-form"),f=(0,i.up)("el-tab-pane"),y=(0,i.up)("el-tabs"),b=(0,i.up)("el-card"),k=(0,i.up)("el-main"),v=(0,i.up)("el-footer"),x=(0,i.up)("el-container"),_=(0,i.Q2)("loading");return(0,i.wg)(),(0,i.j4)(x,null,{default:(0,i.w5)((()=>[(0,i.Wm)(k,null,{default:(0,i.w5)((()=>[(0,i.Wm)(b,{shadow:"never",class:"setting"},{default:(0,i.w5)((()=>[(0,i.Wm)(s,{title:"系统设置",description:"可以修改网站及应用的各种配置",icon:"el-icon-setting"}),(0,i.wy)(((0,i.wg)(),(0,i.j4)(y,{"tab-position":o.tabposition,modelValue:o.activename,"onUpdate:modelValue":t[1]||(t[1]=e=>o.activename=e)},{default:(0,i.w5)((()=>[((0,i.wg)(!0),(0,i.iD)(i.HY,null,(0,i.Ko)(o.settingList,(e=>((0,i.wg)(),(0,i.j4)(f,{key:e.key,label:e.name,name:e.key},{default:(0,i.w5)((()=>["extend"==e.type?((0,i.wg)(),(0,i.iD)("div",l,[e.tips?((0,i.wg)(),(0,i.j4)(r,{key:0,title:e.tips,type:"warning",style:{"margin-bottom":"15px"}},null,8,["title"])):(0,i.kq)("",!0),(0,i.Wm)(g,{modelValue:o.extend[e.key],"onUpdate:modelValue":t=>o.extend[e.key]=t,hideAdd:!0,"drag-sort":"",placeholder:"暂无数据"},{default:(0,i.w5)((()=>[((0,i.wg)(!0),(0,i.iD)(i.HY,null,(0,i.Ko)(e.column,((e,t)=>((0,i.wg)(),(0,i.j4)(c,{label:e.label,prop:e.prop,width:e.width,key:t},{default:(0,i.w5)((t=>["select"==e.component?((0,i.wg)(),(0,i.j4)(p,(0,i.dG)({key:0,modelValue:t.row[e.prop],"onUpdate:modelValue":a=>t.row[e.prop]=a},e.bind,{clearable:"",filterable:"",style:{width:"100%"}}),{default:(0,i.w5)((()=>[((0,i.wg)(!0),(0,i.iD)(i.HY,null,(0,i.Ko)(e.options,((e,t)=>((0,i.wg)(),(0,i.j4)(u,(0,i.dG)({key:t},e),null,16)))),128))])),_:2},1040,["modelValue","onUpdate:modelValue"])):((0,i.wg)(),(0,i.j4)(m,{key:1,modelValue:t.row[e.prop],"onUpdate:modelValue":a=>t.row[e.prop]=a,placeholder:e.placeholder},null,8,["modelValue","onUpdate:modelValue","placeholder"]))])),_:2},1032,["label","prop","width"])))),128))])),_:2},1032,["modelValue","onUpdate:modelValue"]),(0,i.Wm)(h,{type:"primary",icon:"el-icon-plus",onClick:t=>d.table_add(e),style:{"margin-top":"20px"}},null,8,["onClick"])])):((0,i.wg)(),(0,i.j4)(w,{key:1,ref_for:!0,ref:"formref",config:o.formList[e.key],modelValue:o.info,"onUpdate:modelValue":t[0]||(t[0]=e=>o.info=e),loading:o.loading},null,8,["config","modelValue","loading"]))])),_:2},1032,["label","name"])))),128))])),_:1},8,["tab-position","modelValue"])),[[_,o.loading]])])),_:1})])),_:1}),(0,i.Wm)(v,null,{default:(0,i.w5)((()=>[(0,i.Wm)(h,{type:"primary",onClick:d.submit,style:{"max-width":"500px",width:"100%"},loading:o.submitloading},{default:(0,i.w5)((()=>[(0,i.Uk)("保存")])),_:1},8,["onClick","loading"])])),_:1})])),_:1})}a(8311);var o={name:"setting",data(){return{info:{},activename:"init",tabposition:"left",settingList:[],extend:[],formList:{},loading:!1,submitloading:!1}},watch:{activename(){let e=window.location.href;e=this.changeURLArg(e,"type",this.activename),history.replaceState(Object.assign({},window.history.state,{url:e}),"null",e)}},mounted(){this.render()},created(){this.onLayoutResize(),window.addEventListener("resize",this.onLayoutResize)},methods:{onLayoutResize(){this.tabposition=document.body.clientWidth<992?"top":"left"},changeURLArg(e,t,a){var i=t+"=([^&]*)";if(""===a)return e=e.replace(new RegExp("&?"+i,"gi"),""),e=e.replace(new RegExp("\\??"+i+"&?","gi"),"?"),e;var l=t+"="+a;if(e.match(i)){var n="("+t+"=)([^&]*)";return n=e.replace(new RegExp(n,"gi"),l),n}return e.match("[?]")?e+"&"+l:e+"?"+l},async render(){this.loading=!0;var e=await this.$http.get("setting/get",this.$route.query);if(200!=e.code)return this.$message.warning(e.message),!1;this.settingList=e.data.settingList,this.info=e.data.info,this.formList=e.data.formList,this.extend=e.data.extend||[],this.loading=!1,e.data.activename&&(this.activename=e.data.activename)},async submit(){this.submitloading=!0;var e=await this.$http.post("setting/submit",{info:this.info,extend:this.extend});this.submitloading=!1,200!=e.code?this.$alert(e.message,"提示",{type:"error"}):this.$message.success(e.message||"操作成功")},table_add(e){var t={};e.column.forEach((function(e){t[e.prop]=""})),this.extend[e.key].push(t)}}},d=a(8700);const s=(0,d.Z)(o,[["render",n],["__scopeId","data-v-c77bcd06"]]);var r=s}}]);

View File

@ -1 +1 @@
"use strict";(self["webpackChunkx_php_admin"]=self["webpackChunkx_php_admin"]||[]).push([[601],{5596:function(e,t,n){n.r(t),n.d(t,{default:function(){return p}});var i=n(6808),a=n(9511),r=n(1441);function h(e,t,n,h,l,o){return(0,i.wg)(),(0,i.iD)("div",{class:"x-code-editor",style:(0,a.j5)({height:o._height})},[(0,i.wy)((0,i._)("textarea",{ref:"textarea","onUpdate:modelValue":t[0]||(t[0]=e=>l.contentValue=e)},null,512),[[r.nr,l.contentValue]])],4)}var l=n(3839),o=n(7353),u=n.n(o),s=(n(5935),n(8881),n(2876),{props:{modelValue:{type:String,default:""},mode:{type:String,default:"javascript"},height:{type:[String,Number],default:300},options:{type:Object,default:()=>{}},theme:{type:String,default:"idea"},readOnly:{type:Boolean,default:!1}},data(){return{contentValue:this.modelValue,coder:null,opt:{theme:this.theme,styleActiveLine:!0,lineNumbers:!0,lineWrapping:!1,tabSize:4,indentUnit:4,indentWithTabs:!0,mode:this.mode,readOnly:this.readOnly,...this.options}}},computed:{_height(){return Number(this.height)?Number(this.height)+"px":this.height}},watch:{modelValue(e){this.contentValue=e,e!==this.coder.getValue()&&this.coder.setValue(e)}},mounted(){this.init()},methods:{init(){this.coder=(0,l.Xl)(u().fromTextArea(this.$refs.textarea,this.opt)),this.coder.on("change",(e=>{this.contentValue=e.getValue(),this.$emit("update:modelValue",this.contentValue)}))},formatStrInJson(e){return JSON.stringify(JSON.parse(e),null,4)}}}),d=n(8700);const c=(0,d.Z)(s,[["render",h],["__scopeId","data-v-1c04bc3c"]]);var p=c}}]);
"use strict";(self["webpackChunkx_php_admin"]=self["webpackChunkx_php_admin"]||[]).push([[601],{5596:function(e,t,n){n.r(t),n.d(t,{default:function(){return p}});var i=n(6808),a=n(9511),r=n(1441);function h(e,t,n,h,l,o){return(0,i.wg)(),(0,i.iD)("div",{class:"x-code-editor",style:(0,a.j5)({height:o._height})},[(0,i.wy)((0,i._)("textarea",{ref:"textarea","onUpdate:modelValue":t[0]||(t[0]=e=>l.contentValue=e)},null,512),[[r.nr,l.contentValue]])],4)}var l=n(3839),o=n(3322),u=n.n(o),s=(n(5935),n(8881),n(2876),{props:{modelValue:{type:String,default:""},mode:{type:String,default:"javascript"},height:{type:[String,Number],default:300},options:{type:Object,default:()=>{}},theme:{type:String,default:"idea"},readOnly:{type:Boolean,default:!1}},data(){return{contentValue:this.modelValue,coder:null,opt:{theme:this.theme,styleActiveLine:!0,lineNumbers:!0,lineWrapping:!1,tabSize:4,indentUnit:4,indentWithTabs:!0,mode:this.mode,readOnly:this.readOnly,...this.options}}},computed:{_height(){return Number(this.height)?Number(this.height)+"px":this.height}},watch:{modelValue(e){this.contentValue=e,e!==this.coder.getValue()&&this.coder.setValue(e)}},mounted(){this.init()},methods:{init(){this.coder=(0,l.Xl)(u().fromTextArea(this.$refs.textarea,this.opt)),this.coder.on("change",(e=>{this.contentValue=e.getValue(),this.$emit("update:modelValue",this.contentValue)}))},formatStrInJson(e){return JSON.stringify(JSON.parse(e),null,4)}}}),d=n(8700);const c=(0,d.Z)(s,[["render",h],["__scopeId","data-v-1c04bc3c"]]);var p=c}}]);

1
dist/static/js/81.af51a1bc.js vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

1
dist/static/js/app.d9acf3ba.js vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -28,7 +28,7 @@
<colgroup>
<col width="30">
<col width="40">
<col width="140">
<col width="140">
<col>
<col width="110">
</colgroup>
@ -67,7 +67,7 @@
<el-button @click="clear">清空过滤</el-button>
</span>
</template>
</el-dialog>
</el-dialog>
</template>
<script>
@ -114,8 +114,8 @@
if (this.data[item.name] === undefined || this.data[item.name] === '' || JSON.stringify(this.data[item.name]) === '') {
return ; //
}
if (item.options && item.options.items && item.options.items.length>0) {
const foundItem = item.options.items.find(o => o.value === this.data[item.name]);
if (item.options && item.options && item.options.length>0) {
const foundItem = item.options.find(o => o.value === this.data[item.name]);
if (foundItem?.operator) {
item.operator = foundItem.operator;
}

View File

@ -4,118 +4,118 @@
<template>
<!-- input -->
<template v-if="item.component == 'input'">
<el-input v-model="data[item.name]" v-bind="item.options" show-word-limit></el-input>
<el-input v-model="data[item.name]" v-bind="item.bind || item.options" show-word-limit></el-input>
</template>
<!-- textarea -->
<template v-else-if="item.component == 'textarea'">
<el-input v-model="data[item.name]" v-bind="item.options" type="textarea" show-word-limit></el-input>
<el-input v-model="data[item.name]" v-bind="item.bind || item.options" type="textarea" show-word-limit></el-input>
</template>
<!-- checkbox -->
<template v-else-if="item.component == 'checkbox'">
<el-checkbox v-model="data[item.name]" :label="_item.value" v-for="(_item, _index) in item.options.items" :key="_index">{{ _item.label }}</el-checkbox>
<el-checkbox v-model="data[item.name]" v-for="(_item, _index) in options" :key="_index" v-bind="_item">{{ _item.label }}</el-checkbox>
</template>
<!-- checkboxGroup -->
<template v-else-if="item.component == 'checkboxGroup'">
<el-checkbox-group v-model="data[item.name]" v-bind="item.bind">
<el-checkbox v-for="(_item, index) in options" :key="index" v-bind="_item">
{{ _item.label }}
</el-checkbox>
</el-checkbox-group>
</template>
<!-- radio -->
<template v-else-if="item.component == 'radio'">
<el-radio-group v-model="data[item.name]">
<el-radio v-for="_item in item.options.items" :key="_item.value" :label="_item.value">
<el-radio-group v-model="data[item.name]" v-bind="item.bind">
<el-radio v-for="(_item, index) in options" :key="index" v-bind="_item">
{{ _item.label }}
</el-radio>
</el-radio-group>
</template>
<!-- select -->
<template v-else-if="item.component == 'select'">
<el-select v-model="data[item.name]" v-bind="item.options" clearable filterable style="width: 100%;">
<el-option v-for="option in item.options.items" :key="option.value" :label="option.label || option.name" :value="option.value"></el-option>
<el-select v-model="data[item.name]" v-bind="item.bind" clearable filterable style="width: 100%;">
<el-option v-for="(option, index) in options" :key="index" v-bind="option"></el-option>
</el-select>
</template>
<!-- selectgroup -->
<template v-else-if="item.component == 'selectgroup'">
<el-select v-model="data[item.name]" v-bind="item.bind" clearable filterable style="width: 100%;">
<el-option-group v-for="group in item.options" :key="group.label" :label="group.label">
<el-option v-for="item in group.options" :key="item.value" :label="item.label" :value="item.value" />
<el-option-group v-for="(group, gindex) in options" :key="gindex" :label="group.label">
<el-option v-for="(item, index) in group.options" :key="index" v-bind="item" />
</el-option-group>
</el-select>
</template>
<!-- checkboxGroup -->
<template v-else-if="item.component == 'checkboxGroup'">
<el-checkbox-group v-model="data[item.name]">
<el-checkbox v-for="_item in item.options.items" :key="_item.value" :label="_item.value">
{{ _item.label }}
</el-checkbox>
</el-checkbox-group>
</template>
<!-- upload -->
<template v-else-if="item.component == 'upload'">
<x-upload v-model="data[item.name]" v-bind="item.options"></x-upload>
<x-upload v-model="data[item.name]" v-bind="item.bind || item.options"></x-upload>
</template>
<!-- uploadfile -->
<template v-else-if="item.component == 'uploadfile'">
<x-upload-file v-model="data[item.name]" draggable v-bind="item.options"></x-upload-file>
<x-upload-file v-model="data[item.name]" draggable v-bind="item.bind || item.options"></x-upload-file>
</template>
<!-- updatemultiple -->
<template v-else-if="item.component == 'updatemultiple'">
<x-upload-multiple v-model="data[item.name]" draggable v-bind="item.options"></x-upload-multiple>
<x-upload-multiple v-model="data[item.name]" draggable v-bind="item.bind || item.options"></x-upload-multiple>
</template>
<!-- switch -->
<template v-else-if="item.component == 'switch'">
<el-switch v-model="data[item.name]" v-bind="item.options" />
<el-switch v-model="data[item.name]" v-bind="item.bind || item.options" />
</template>
<!-- cascader -->
<template v-else-if="item.component == 'cascader'">
<el-cascader v-model="data[item.name]" :options="item.options.items" clearable></el-cascader>
<el-cascader v-model="data[item.name]" :options="item.options" v-bind="item.bind" clearable></el-cascader>
</template>
<!-- date -->
<template v-else-if="item.component == 'date'">
<el-date-picker v-model="data[item.name]" v-bind="item.options"></el-date-picker>
<el-date-picker v-model="data[item.name]" v-bind="item.bind || item.options"></el-date-picker>
</template>
<!-- number -->
<template v-else-if="item.component == 'number'">
<el-input-number v-model="data[item.name]" controls-position="right"></el-input-number>
<el-input-number v-model="data[item.name]" v-bind="item.bind"></el-input-number>
</template>
<!-- color -->
<template v-else-if="item.component == 'color'">
<el-color-picker v-model="data[item.name]" v-bind="item.options"></el-color-picker>
<el-color-picker v-model="data[item.name]" v-bind="item.bind"></el-color-picker>
</template>
<!-- rate -->
<template v-else-if="item.component == 'rate'">
<el-rate style="margin-top: 6px;" v-model="data[item.name]" v-bind="item.options"></el-rate>
<el-rate style="margin-top: 6px;" v-model="data[item.name]" v-bind="item.bind"></el-rate>
</template>
<!-- slider -->
<template v-else-if="item.component == 'slider'">
<el-slider v-model="data[item.name]" v-bind="item.options"></el-slider>
<el-slider v-model="data[item.name]" v-bind="item.bind"></el-slider>
</template>
<!-- tableselect -->
<template v-else-if="item.component == 'tableselect'">
<tableselect-render v-model="computedValue" :item="item"></tableselect-render>
<tableselect-render v-model="computedValue" :item="item" v-bind="item.bind"></tableselect-render>
</template>
<!-- editor -->
<template v-else-if="item.component == 'editor'">
<x-editor v-model="data[item.name]" v-bind="item.options"></x-editor>
<x-editor v-model="data[item.name]" v-bind="item.bind"></x-editor>
</template>
<template v-else-if="item.component == 'text'">
<el-text v-bind="item.options" v-copy="data[item.name]">{{ data[item.name] }}</el-text>
<el-text v-bind="item.bind || item.options" v-copy="data[item.name]">{{ data[item.name] }}</el-text>
</template>
<template v-else-if="item.component == 'link'">
<el-link v-bind="item.options">{{ data[item.name] }}</el-link>
<el-link v-bind="item.bind || item.options">{{ data[item.name] }}</el-link>
</template>
<template v-else-if="item.component == 'button'">
<el-button v-bind="item.options">{{ data[item.name] }}</el-button>
<el-button v-bind="item.bind || item.options">{{ data[item.name] }}</el-button>
</template>
<!-- avatar -->
<template v-else-if="item.component == 'avatar'">
<x-avatar :data="data" :options="item.options" size="small"></x-avatar>
</template>
<template v-else-if="item.component == 'formtable'">
<x-form-table ref="videostable" v-model="data[item.name]" v-bind="item.options"> </x-form-table>
<x-form-table ref="xformtable" v-model="data[item.name]" v-bind="item.bind || item.options"> </x-form-table>
</template>
<template v-else-if="item.component == 'tabs'">
<el-tabs v-model="tabsValue" :type="item.options.type || 'border-card'" :tab-position="item.options.position" class="formtabs">
<el-tab-pane v-for="t in item.options.items" :key="t.value" :label="t.label" :name="t.value">
<el-tabs v-model="tabsValue" v-bind="item.bind" class="formtabs">
<el-tab-pane v-for="(t, index) in options" :key="index" v-bind="t">
<template #label>
<el-badge is-dot v-if="data[item.name][t.value]"> </el-badge>
<span>{{ t.label }}</span>
</template>
<el-input v-model="data[item.name][t.value]" type="textarea" :rows="item.options.rows || 6" show-word-limit></el-input>
<el-input v-model="data[item.name][t.value]" type="textarea" v-bind="item.options" show-word-limit></el-input>
</el-tab-pane>
</el-tabs>
</template>
@ -166,9 +166,12 @@ export default {
xEditor
},
computed: {
options() {
return this.item.options.items || this.item.options; //
},
tabsValue() {
if (this.item.options && this.item.component == 'tabs') {
return this.item.options.value || this.item.options.items[0].value;
if (this.options && this.item.component == 'tabs') {
return this.item.value || this.options[0].value;
}
return '';
},

View File

@ -47,7 +47,8 @@ export default {
},
data: {},
search: {},
date: []
date: [],
hasBeenActivated: false,
}
},
watch: {
@ -58,6 +59,15 @@ export default {
return this.config.type == 'containe' ? 'el-containe' : (this.config.type == 'drawer' ? 'el-drawer' : 'x-dialog');
}
},
activated() {
if (this.hasBeenActivated) {
this.handleSearchUpdated(this.search);
return true;
}
this.hasBeenActivated = true;
},
mounted() {
},

View File

@ -3,7 +3,7 @@
<el-badge v-if="item.status && item.status.key && row[item.status.key]" is-dot class="item" :type="item.status.type || 'primary'" style="width: 10px;cursor: pointer;margin-top: 10px;"></el-badge>
<x-avatar v-if="item.columntype == 'avatar' || item.component == 'avatar'" :name="item.name" :options="item.options" :data="row"></x-avatar>
<el-badge v-else-if="item.columntype == 'badge' || item.columntype == 'imagegroup'" :value="getType(row[item.name])" @click="handleClick(row, item)" v-bind="item.options" style="cursor: pointer; "></el-badge>
<el-link v-else-if="item.columntype == 'link'" v-bind="item.options" @click="handleClick(row, item)"> {{ row[item.name] }} </el-link>
<el-link v-else-if="item.columntype == 'link'" v-bind="item.bind || item.options" @click="handleClick(row, item)"> {{ row[item.name] }} </el-link>
<el-image v-else-if="item.columntype == 'image'" :preview-src-list="[getImg(row[item.name])]" :preview-teleported="true" hide-on-click-modal="true" lazy="true" style="max-width: 60px; height: 26px; border-radius: 2px;" fit="cover" :src="getImg(row[item.name])">
<template #error>
<div class="image-slot">
@ -13,27 +13,27 @@
</el-image>
<input v-else-if="item.columntype == 'input'" @click="handleClick(row, item)" style="cursor: pointer; " class="el-input__inner" type="text" readonly :value="row[item.name]">
<p v-else-if="item.columntype == 'status'">
<template v-for="{ value, type = 'success', label, options={} } in item.options.items">
<template v-for="{ value, type = 'success', label, options={} } in options">
<x-status-indicator :style="item.style" :key="value" pulse :type="type" :label="label" @click="handleClick(row, options || item)" v-if="value == row[item.name]"></x-status-indicator>
</template>
</p>
<p v-else-if="item.columntype == 'button'">
<span v-if="item.options.items && item.options.items.length > 0">
<template v-for="op in item.options.items">
<el-button @click="handleClick(row, op.options || item)" :key="op.value" :type="op.type || 'warning'" :size="op.size || 'small'" v-bind="op" v-if="op.value == row[item.name]">
<span v-if="options && options.length > 0">
<template v-for="(op, index) in options">
<el-button @click="handleClick(row, op.options || item)" :key="index" :type="op.type || 'warning'" :size="op.size || 'small'" v-bind="op" v-if="op.value == row[item.name]">
{{ op.label }}
</el-button>
</template>
</span>
<el-button v-else @click="handleClick(row, item)" :type="item.options.type || 'warning'" v-bind="item.options"> {{ row[item.name] }} </el-button>
<el-button v-else @click="handleClick(row, item)" :type="item.bind.type || 'warning'" v-bind="item.bind"> {{ row[item.name] }} </el-button>
</p>
<p v-else-if="item.columntype == 'text'">
<el-text v-bind="item.options" v-if="item.copy" v-copy="row[item.copy]" style="cursor: pointer;display: inline;"> {{ row[item.name] }} </el-text>
<el-text v-bind="item.options" v-else @click="handleClick(row, item)" style="cursor: pointer;display: inline;"> {{ row[item.name] }} </el-text>
<el-text v-bind="item.bind || item.options" v-if="item.copy" v-copy="row[item.copy]" style="cursor: pointer;display: inline;"> {{ row[item.name] }} </el-text>
<el-text v-bind="item.bind || item.options" v-else @click="handleClick(row, item)" style="cursor: pointer;display: inline;"> {{ row[item.name] }} </el-text>
</p>
<p v-else-if="item.columntype == 'tag' || item.columntype == 'time'" @click="handleClick(row, item)" v-time.tip="row[item.name]"></p>
<slot v-else :name="item.name">
{{ item.columntype == 'select' && item.options && item.options.items ? getNameByValue(row[item.name], item.options.items) : row[item.name] }}
{{ item.columntype == 'select' && options && options ? getNameByValue(row[item.name], options) : row[item.name] }}
</slot>
</div>
</template>
@ -53,6 +53,11 @@ export default {
},
row: { type: Object, default: () => { } },
},
computed: {
options() {
return this.item.options.items || this.item.options; //
},
},
methods: {
handleClick(row, item) {

View File

@ -1,304 +1,315 @@
<template>
<div class="adminui-tags">
<ul ref="tags">
<li v-for="tag in tagList" v-bind:key="tag" :class="[isActive(tag)?'active':'',tag.meta.affix?'affix':'' ]" @contextmenu.prevent="openContextMenu($event, tag)">
<li v-for="tag in tagList" v-bind:key="tag" :class="[isActive(tag) ? 'active' : '', tag.meta.affix ? 'affix' : '']" @contextmenu.prevent="openContextMenu($event, tag)">
<router-link :to="tag">
<span>{{ tag.meta.title }}</span>
<el-icon v-if="!tag.meta.affix" @click.prevent.stop='closeSelectedTag(tag)'><el-icon-close/></el-icon>
<span>{{ tag.meta.title }}</span>
<el-icon v-if="!tag.meta.affix" @click.prevent.stop='closeSelectedTag(tag)'><el-icon-close /></el-icon>
</router-link>
</li>
</ul>
</div>
<transition name="el-zoom-in-top">
<ul v-if="contextMenuVisible" :style="{left:left+'px',top:top+'px'}" class="contextmenu" id="contextmenu">
<li @click="refreshTab()"><el-icon><el-icon-refresh/></el-icon></li>
<ul v-if="contextMenuVisible" :style="{ left: left + 'px', top: top + 'px' }" class="contextmenu" id="contextmenu">
<li @click="refreshTab()"><el-icon><el-icon-refresh /></el-icon></li>
<hr>
<li @click="closeTabs()" :class="contextMenuItem.meta.affix?'disabled':''"><el-icon><el-icon-close/></el-icon></li>
<li @click="closeOtherTabs()"><el-icon><el-icon-folder-delete/></el-icon></li>
<li @click="closeTabs()" :class="contextMenuItem.meta.affix ? 'disabled' : ''"><el-icon><el-icon-close /></el-icon></li>
<li @click="closeOtherTabs()"><el-icon><el-icon-folder-delete /></el-icon></li>
<hr>
<li @click="maximize()"><el-icon><el-icon-full-screen/></el-icon></li>
<li @click="openWindow()"><el-icon><el-icon-copy-document/></el-icon></li>
<li @click="maximize()"><el-icon><el-icon-full-screen /></el-icon></li>
<li @click="openWindow()"><el-icon><el-icon-copy-document /></el-icon></li>
</ul>
</transition>
</template>
<script>
import Sortable from 'sortablejs'
import Sortable from 'sortablejs'
export default {
name: "tags",
data() {
return {
contextMenuVisible: false,
contextMenuItem: null,
left: 0,
top: 0,
tagList: this.$store.state.viewTags.viewTags,
tipDisplayed: false
export default {
name: "tags",
data() {
return {
contextMenuVisible: false,
contextMenuItem: null,
left: 0,
top: 0,
tagList: this.$store.state.viewTags.viewTags,
tipDisplayed: false
}
},
props: {},
watch: {
$route(e) {
this.addViewTags(e);
//
this.$nextTick(() => {
const tags = this.$refs.tags
if (tags && tags.scrollWidth > tags.clientWidth) {
//
let targetTag = tags.querySelector(".active")
targetTag.scrollIntoView()
//
if (!this.tipDisplayed) {
this.$msgbox({
type: 'warning',
center: true,
title: '提示',
message: '当前标签数量过多,可通过鼠标滚轴滚动标签栏。关闭标签数量可减少系统性能消耗。',
confirmButtonText: '知道了'
})
this.tipDisplayed = true
}
}
})
},
contextMenuVisible(value) {
const cm = (e) => {
const sp = document.getElementById("contextmenu");
if (sp && !sp.contains(e.target)) {
this.closeMenu()
}
}
if (value) {
document.body.addEventListener('click', e => cm(e))
} else {
document.body.removeEventListener('click', e => cm(e))
}
}
},
created() {
var menu = this.$router.x_getMenu()
var dashboardRoute = this.treeFind(menu, node => node.path == this.$config.DASHBOARD_URL)
if (dashboardRoute) {
dashboardRoute.fullPath = dashboardRoute.path
this.addViewTags(dashboardRoute)
this.addViewTags(this.$route)
}
},
mounted() {
this.tagDrop();
this.scrollInit()
},
methods: {
//
treeFind(tree, func) {
for (const data of tree) {
if (func(data)) return data
if (data.children) {
const res = this.treeFind(data.children, func)
if (res) return res
}
}
return null
},
//
tagDrop() {
const target = this.$refs.tags
Sortable.create(target, {
draggable: 'li',
animation: 300
})
},
//tag
addViewTags(route) {
if (route.name && !route.meta.fullpage) {
this.$store.commit("pushViewTags", route)
!route.meta.disablecache && this.$store.commit("pushKeepLive", route.name)
}
},
props: {},
watch: {
$route(e) {
this.addViewTags(e);
//
this.$nextTick(() => {
const tags = this.$refs.tags
if(tags && tags.scrollWidth > tags.clientWidth){
//
let targetTag = tags.querySelector(".active")
targetTag.scrollIntoView()
//
if(!this.tipDisplayed){
this.$msgbox({
type: 'warning',
center: true,
title: '提示',
message: '当前标签数量过多,可通过鼠标滚轴滚动标签栏。关闭标签数量可减少系统性能消耗。',
confirmButtonText: '知道了'
})
this.tipDisplayed = true
}
}
})
},
contextMenuVisible(value) {
const cm = (e) => {
const sp = document.getElementById("contextmenu");
if (sp && !sp.contains(e.target)) {
this.closeMenu()
}
}
if (value) {
document.body.addEventListener('click', e => cm(e))
//tag
isActive(route) {
return route.fullPath === this.$route.fullPath
},
//tag
closeSelectedTag(tag, autoPushLatestView = true) {
const nowTagIndex = this.tagList.findIndex(item => item.fullPath == tag.fullPath)
this.$store.commit("removeViewTags", tag)
this.$store.commit("removeIframeList", tag)
this.$store.commit("removeKeepLive", tag.name)
if (autoPushLatestView && this.isActive(tag)) {
const leftView = this.tagList[nowTagIndex - 1]
if (leftView) {
this.$router.push(leftView)
} else {
document.body.removeEventListener('click', e => cm(e))
this.$router.push('/')
}
}
},
created() {
var menu = this.$router.x_getMenu()
var dashboardRoute = this.treeFind(menu, node => node.path==this.$config.DASHBOARD_URL)
if(dashboardRoute){
dashboardRoute.fullPath = dashboardRoute.path
this.addViewTags(dashboardRoute)
this.addViewTags(this.$route)
}
},
mounted() {
this.tagDrop();
this.scrollInit()
},
methods: {
//
treeFind(tree, func){
for (const data of tree) {
if (func(data)) return data
if (data.children) {
const res = this.treeFind(data.children, func)
if (res) return res
}
}
return null
},
//
tagDrop(){
const target = this.$refs.tags
Sortable.create(target, {
draggable: 'li',
animation: 300
})
},
//tag
addViewTags(route) {
if(route.name && !route.meta.fullpage){
this.$store.commit("pushViewTags",route)
this.$store.commit("pushKeepLive",route.name)
}
},
//tag
isActive(route) {
return route.fullPath === this.$route.fullPath
},
//tag
closeSelectedTag(tag, autoPushLatestView=true) {
const nowTagIndex = this.tagList.findIndex(item => item.fullPath == tag.fullPath)
this.$store.commit("removeViewTags", tag)
this.$store.commit("removeIframeList", tag)
this.$store.commit("removeKeepLive", tag.name)
if (autoPushLatestView && this.isActive(tag)) {
const leftView = this.tagList[nowTagIndex - 1]
if (leftView) {
this.$router.push(leftView)
} else {
this.$router.push('/')
}
}
},
//tag
openContextMenu(e, tag){
this.contextMenuItem = tag;
this.contextMenuVisible = true;
this.left = e.clientX + 1;
this.top = e.clientY + 1;
//tag
openContextMenu(e, tag) {
this.contextMenuItem = tag;
this.contextMenuVisible = true;
this.left = e.clientX + 1;
this.top = e.clientY + 1;
//FIX
//FIX
this.$nextTick(() => {
let sp = document.getElementById("contextmenu");
if (document.body.offsetWidth - e.clientX < sp.offsetWidth) {
this.left = document.body.offsetWidth - sp.offsetWidth + 1;
this.top = e.clientY + 1;
}
})
},
//
closeMenu() {
this.contextMenuItem = null;
this.contextMenuVisible = false
},
//TAB
refreshTab() {
this.contextMenuVisible = false
const nowTag = this.contextMenuItem;
//
if (this.$route.fullPath !== nowTag.fullPath) {
this.$router.push({
path: nowTag.fullPath,
query: nowTag.query
})
}
this.$store.commit("refreshIframe", nowTag)
setTimeout(() => {
this.$store.commit("removeKeepLive", nowTag.name)
this.$store.commit("setRouteShow", false)
this.$nextTick(() => {
let sp = document.getElementById("contextmenu");
if(document.body.offsetWidth - e.clientX < sp.offsetWidth){
this.left = document.body.offsetWidth - sp.offsetWidth + 1;
this.top = e.clientY + 1;
}
!this.$route.meta.disablecache && this.$store.commit("pushKeepLive", nowTag.name)
this.$store.commit("setRouteShow", true)
})
},
//
closeMenu() {
this.contextMenuItem = null;
}, 0);
},
//TAB
closeTabs() {
var nowTag = this.contextMenuItem;
if (!nowTag.meta.affix) {
this.closeSelectedTag(nowTag)
this.contextMenuVisible = false
},
//TAB
refreshTab() {
this.contextMenuVisible = false
const nowTag = this.contextMenuItem;
//
if (this.$route.fullPath !== nowTag.fullPath) {
this.$router.push({
path: nowTag.fullPath,
query: nowTag.query
})
}
this.$store.commit("refreshIframe", nowTag)
setTimeout(() => {
this.$store.commit("removeKeepLive", nowTag.name)
this.$store.commit("setRouteShow", false)
this.$nextTick(() => {
this.$store.commit("pushKeepLive", nowTag.name)
this.$store.commit("setRouteShow", true)
})
}, 0);
},
//TAB
closeTabs(){
var nowTag = this.contextMenuItem;
if(!nowTag.meta.affix){
this.closeSelectedTag(nowTag)
this.contextMenuVisible = false
}
},
//TAB
closeOtherTabs(){
var nowTag = this.contextMenuItem;
//
if(this.$route.fullPath != nowTag.fullPath){
this.$router.push({
path: nowTag.fullPath,
query: nowTag.query
})
}
var tags = [...this.tagList];
tags.forEach(tag => {
if(tag.meta&&tag.meta.affix || nowTag.fullPath==tag.fullPath){
return true
}else{
this.closeSelectedTag(tag, false)
}
}
},
//TAB
closeOtherTabs() {
var nowTag = this.contextMenuItem;
//
if (this.$route.fullPath != nowTag.fullPath) {
this.$router.push({
path: nowTag.fullPath,
query: nowTag.query
})
this.contextMenuVisible = false
},
//TAB
maximize(){
var nowTag = this.contextMenuItem;
this.contextMenuVisible = false
//
if(this.$route.fullPath != nowTag.fullPath){
this.$router.push({
path: nowTag.fullPath,
query: nowTag.query
})
}
var tags = [...this.tagList];
tags.forEach(tag => {
if (tag.meta && tag.meta.affix || nowTag.fullPath == tag.fullPath) {
return true
} else {
this.closeSelectedTag(tag, false)
}
document.getElementById('app').classList.add('main-maximize')
},
//
openWindow(){
var nowTag = this.contextMenuItem;
var url = nowTag.href || '/';
if(!nowTag.meta.affix){
this.closeSelectedTag(nowTag)
}
window.open(url);
this.contextMenuVisible = false
},
//
scrollInit(){
const scrollDiv = this.$refs.tags;
scrollDiv.addEventListener('mousewheel', handler, false) || scrollDiv.addEventListener("DOMMouseScroll", handler, false)
function handler(event) {
const detail = event.wheelDelta || event.detail;
//-3 3120 -120
const moveForwardStep = 1;
const moveBackStep = -1;
let step = 0;
if (detail == 3 || detail < 0 && detail != -3) {
step = moveForwardStep * 50;
}else{
step = moveBackStep * 50;
}
scrollDiv.scrollLeft += step;
})
this.contextMenuVisible = false
},
//TAB
maximize() {
var nowTag = this.contextMenuItem;
this.contextMenuVisible = false
//
if (this.$route.fullPath != nowTag.fullPath) {
this.$router.push({
path: nowTag.fullPath,
query: nowTag.query
})
}
document.getElementById('app').classList.add('main-maximize')
},
//
openWindow() {
var nowTag = this.contextMenuItem;
var url = nowTag.href || '/';
if (!nowTag.meta.affix) {
this.closeSelectedTag(nowTag)
}
window.open(url);
this.contextMenuVisible = false
},
//
scrollInit() {
const scrollDiv = this.$refs.tags;
scrollDiv.addEventListener('mousewheel', handler, false) || scrollDiv.addEventListener("DOMMouseScroll", handler, false)
function handler(event) {
const detail = event.wheelDelta || event.detail;
//-3 3120 -120
const moveForwardStep = 1;
const moveBackStep = -1;
let step = 0;
if (detail == 3 || detail < 0 && detail != -3) {
step = moveForwardStep * 50;
} else {
step = moveBackStep * 50;
}
scrollDiv.scrollLeft += step;
}
}
}
}
</script>
<style>
.contextmenu {
position: fixed;
width: 200px;
margin:0;
border-radius: 0px;
background: var(--el-bg-color-overlay);
border: 1px solid var(--el-border-color-light);
box-shadow: 0 2px 12px 0 rgba(0,0,0,.1);
z-index: 3000;
list-style-type: none;
padding: 10px 0;
}
.contextmenu hr {
margin:5px 0;
border: none;
height: 1px;
font-size: 0px;
background-color: var(--el-border-color-light);
}
.contextmenu li {
display: flex;
align-items: center;
margin:0;
cursor: pointer;
line-height: 30px;
padding: 0 17px;
color: #606266;
}
.contextmenu li i {
font-size: 14px;
margin-right: 10px;
}
.contextmenu li:hover {
background-color: #ecf5ff;
color: #66b1ff;
}
.contextmenu li.disabled {
cursor: not-allowed;
color: #bbb;
background: transparent;
}
.contextmenu {
position: fixed;
width: 200px;
margin: 0;
border-radius: 0px;
background: var(--el-bg-color-overlay);
border: 1px solid var(--el-border-color-light);
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, .1);
z-index: 3000;
list-style-type: none;
padding: 10px 0;
}
.tags-tip {padding:5px;}
.tags-tip p {margin-bottom: 10px;}
.contextmenu hr {
margin: 5px 0;
border: none;
height: 1px;
font-size: 0px;
background-color: var(--el-border-color-light);
}
.dark .contextmenu li {color: var(--el-text-color-primary);}
.contextmenu li {
display: flex;
align-items: center;
margin: 0;
cursor: pointer;
line-height: 30px;
padding: 0 17px;
color: #606266;
}
.contextmenu li i {
font-size: 14px;
margin-right: 10px;
}
.contextmenu li:hover {
background-color: #ecf5ff;
color: #66b1ff;
}
.contextmenu li.disabled {
cursor: not-allowed;
color: #bbb;
background: transparent;
}
.tags-tip {
padding: 5px;
}
.tags-tip p {
margin-bottom: 10px;
}
.dark .contextmenu li {
color: var(--el-text-color-primary);
}
</style>

View File

@ -13,7 +13,7 @@ export default {
store.commit("removeKeepLive", route.name)
store.commit("setRouteShow", false)
nextTick(() => {
store.commit("pushKeepLive", route.name)
!route.meta.disablecache && store.commit("pushKeepLive", route.name)
store.commit("setRouteShow", true)
NProgress.done()
})

View File

@ -8,10 +8,10 @@
<div v-if="item.type == 'extend'">
<el-alert :title="item.tips" v-if="item.tips" type="warning" style="margin-bottom: 15px;"></el-alert>
<x-form-table v-model="extend[item.key]" :hideAdd="true" drag-sort placeholder="暂无数据">
<el-table-column :label="c.label" :prop="c.prop" :width="c.width" :key="c.prop" v-for="c in item.column">
<el-table-column :label="c.label" :prop="c.prop" :width="c.width" :key="index" v-for="(c, index) in item.column">
<template #default="scope">
<el-select v-if="c.component == 'select'" v-model="scope.row[c.prop]" v-bind="c.options" clearable filterable style="width: 100%;">
<el-option v-for="option in c.options.items" :key="option.value" :label="option.label || option.name" :value="option.value"></el-option>
<el-select v-if="c.component == 'select'" v-model="scope.row[c.prop]" v-bind="c.bind" clearable filterable style="width: 100%;">
<el-option v-for="(option, index) in c.options" :key="index" v-bind="option"></el-option>
</el-select>
<el-input v-else v-model="scope.row[c.prop]" :placeholder="c.placeholder"></el-input>
</template>
@ -156,7 +156,7 @@ export default {
},
async submit() {
this.submitloading = true;
var res = this.$http.post('setting/submit', { info: this.info, extend: this.extend });
var res = await this.$http.post('setting/submit', { info: this.info, extend: this.extend });
this.submitloading = false;
if (res.code == 200) {
this.$message.success(res.message || "操作成功")