@@ -0,0 +1,15 @@ | |||
{ | |||
"presets": [ | |||
["env", { "modules": false }], | |||
"stage-2" | |||
], | |||
"plugins": ["transform-runtime"], | |||
"comments": false, | |||
"env": { | |||
"test": { | |||
"presets": ["env", "stage-2"], | |||
"plugins": ["istanbul"] | |||
} | |||
} | |||
} |
@@ -0,0 +1,15 @@ | |||
node_modules | |||
logs/* | |||
dataCenter/build/* | |||
!.gitkeep | |||
node_modules/ | |||
bower_components/ | |||
tmp | |||
.DS_Store | |||
.idea/* | |||
.project | |||
dist/* | |||
.vscode/* | |||
dist | |||
*.zip | |||
debug.log |
@@ -0,0 +1,3 @@ | |||
git config --global http.sslVerify false | |||
Path Intellisense |
@@ -0,0 +1,80 @@ | |||
{ | |||
"name": "vue-pro", | |||
"version": "1.7.6", | |||
"description": "A Vue.js project", | |||
"author": "damon05 <damon05@163.com>", | |||
"private": true, | |||
"scripts": { | |||
"dev": "webpack-dev-server --open", | |||
"build": "webpack --progress --env.Generative=true" | |||
}, | |||
"dependencies": { | |||
"clean-webpack-plugin": "^0.1.18", | |||
"echarts": "^4.1.0", | |||
"element-ui": "~2.4.8", | |||
"moment": "^2.24.0", | |||
"popper.js": "^1.14.1", | |||
"q": "^1.5.1", | |||
"vue": "^2.5.2", | |||
"vue-baidu-map": "^0.21.11", | |||
"vue-cropper": "^0.4.0", | |||
"vue-router": "^3.0.1" | |||
}, | |||
"devDependencies": { | |||
"autoprefixer": "^7.1.2", | |||
"babel-core": "^6.22.1", | |||
"babel-helper-vue-jsx-merge-props": "^2.0.3", | |||
"babel-loader": "^7.1.1", | |||
"babel-plugin-syntax-jsx": "^6.18.0", | |||
"babel-plugin-transform-object-rest-spread": "^6.26.0", | |||
"babel-plugin-transform-runtime": "^6.22.0", | |||
"babel-plugin-transform-vue-jsx": "^3.5.0", | |||
"babel-polyfill": "^6.26.0", | |||
"babel-preset-env": "^1.3.2", | |||
"babel-preset-stage-2": "^6.22.0", | |||
"bootstrap": "^3.3.1", | |||
"chalk": "^2.0.1", | |||
"compression-webpack-plugin": "^1.1.12", | |||
"copy-webpack-plugin": "^4.0.1", | |||
"cross-env": "^5.1.3", | |||
"css-loader": "^0.28.0", | |||
"extract-text-webpack-plugin": "^3.0.0", | |||
"file-loader": "^1.1.4", | |||
"friendly-errors-webpack-plugin": "^1.6.1", | |||
"html-loader": "^0.5.5", | |||
"html-webpack-plugin": "^2.30.1", | |||
"install": "^0.10.4", | |||
"jquery": "^3.3.1", | |||
"node-notifier": "^5.1.2", | |||
"npm": "^6.4.0", | |||
"optimize-css-assets-webpack-plugin": "^3.2.0", | |||
"ora": "^1.2.0", | |||
"portfinder": "^1.0.13", | |||
"postcss-import": "^11.0.0", | |||
"postcss-loader": "^2.0.8", | |||
"postcss-url": "^7.2.1", | |||
"rimraf": "^2.6.0", | |||
"semver": "^5.3.0", | |||
"shelljs": "^0.7.6", | |||
"style-loader": "^0.22.0", | |||
"uglifyjs-webpack-plugin": "^1.1.1", | |||
"url-loader": "^1.1.1", | |||
"vue-loader": "^13.3.0", | |||
"vue-style-loader": "^3.0.1", | |||
"vue-template-compiler": "^2.5.2", | |||
"vuex": "^3.0.1", | |||
"webpack": "^3.6.0", | |||
"webpack-bundle-analyzer": "^2.9.0", | |||
"webpack-dev-server": "^2.9.1", | |||
"webpack-merge": "^4.1.0" | |||
}, | |||
"engines": { | |||
"node": ">= 6.0.0", | |||
"npm": ">= 3.0.0" | |||
}, | |||
"browserslist": [ | |||
"> 1%", | |||
"last 2 versions", | |||
"not ie <= 8" | |||
] | |||
} |
@@ -0,0 +1,123 @@ | |||
<template> | |||
<div id="app"> | |||
<router-view v-if="isRouterAlive"></router-view> | |||
</div> | |||
</template> | |||
<script> | |||
import { mapState, mapActions } from "vuex"; | |||
export default { | |||
name: 'App', | |||
provide(){ | |||
return{ | |||
reload: this.reload | |||
} | |||
}, | |||
data () { | |||
return { | |||
isRouterAlive:true | |||
} | |||
}, | |||
methods:{ | |||
...mapActions(["setIndex"]), | |||
reload () { | |||
this.isRouterAlive = false | |||
this.$nextTick(function(){ | |||
this.isRouterAlive =true | |||
}) | |||
} | |||
}, | |||
computed: { | |||
//当前导航状态 | |||
...mapState({ | |||
topNav: state => state.topNav.data, //将 this.topNav 映射为 this.$store.topNav.data | |||
index: state => state.topNav.index, | |||
}) | |||
}, | |||
// created() { | |||
// //在页面加载时读取sessionStorage里的状态信息 | |||
// if (sessionStorage.getItem("index")) { | |||
// this.setIndex(JSON.parse(sessionStorage.getItem("index"))) | |||
// } | |||
// //在页面刷新时将vuex里的信息保存到sessionStorage里 | |||
// window.addEventListener("beforeunload", () => { | |||
// sessionStorage.setItem("index", JSON.stringify(this.index)); | |||
// }) | |||
// }, | |||
} | |||
</script> | |||
<style> | |||
@import url('../node_modules/bootstrap/dist/css/bootstrap.min.css'); | |||
.fl{float: left;} | |||
.fr{float: right;} | |||
.clearfix:after { | |||
content: "."; | |||
display: block; | |||
height: 0; | |||
clear: both; | |||
visibility: hidden; | |||
} | |||
h1, h2 { | |||
font-weight: normal; | |||
} | |||
ul { | |||
list-style-type: none; | |||
padding: 0; | |||
} | |||
li { | |||
display: inline-block; | |||
margin: 0 10px; | |||
} | |||
a { | |||
color: #42b983; | |||
text-decoration: none; | |||
} | |||
#app { | |||
font-family: 'Avenir', Helvetica, Arial, sans-serif; | |||
-webkit-font-smoothing: antialiased; | |||
-moz-osx-font-smoothing: grayscale; | |||
text-align: center; | |||
color: #2c3e50; | |||
position: relative; | |||
} | |||
body::-webkit-scrollbar { | |||
width: 8px; | |||
height: 8px; | |||
} | |||
/*正常情况下滑块的样式*/ | |||
body::-webkit-scrollbar-thumb { | |||
background-color: rgba(0,0,0,.05); | |||
border-radius: 10px; | |||
-webkit-box-shadow: inset 1px 1px 0 rgba(0,0,0,.3); | |||
} | |||
/*鼠标悬浮在该类指向的控件上时滑块的样式*/ | |||
body:hover::-webkit-scrollbar-thumb { | |||
background-color: rgba(0,0,0,.2); | |||
border-radius: 10px; | |||
-webkit-box-shadow: inset 1px 1px 0 rgba(0,0,0,.1); | |||
} | |||
/*鼠标悬浮在滑块上时滑块的样式*/ | |||
body::-webkit-scrollbar-thumb:hover { | |||
background-color: rgba(0,0,0,.4); | |||
-webkit-box-shadow: inset 1px 1px 0 rgba(0,0,0,.1); | |||
} | |||
/*正常时候的主干部分*/ | |||
body::-webkit-scrollbar-track { | |||
border-radius: 10px; | |||
-webkit-box-shadow: inset 0 0 6px rgba(0,0,0,0); | |||
background-color: white; | |||
} | |||
/*鼠标悬浮在滚动条上的主干部分*/ | |||
body::-webkit-scrollbar-track:hover { | |||
-webkit-box-shadow: inset 0 0 6px rgba(0,0,0,.4); | |||
background-color: rgba(0,0,0,.01); | |||
} | |||
.insight,.production,.server,.about,.case,.partner,.copy{ | |||
width: 100%; | |||
position: relative; | |||
} | |||
</style> |
@@ -0,0 +1,399 @@ | |||
<template> | |||
<div class="layout"> | |||
<div class="title"> | |||
<h3>审核列表</h3> | |||
</div> | |||
<div class="layout-content"> | |||
<el-form :inline="true" :model="ruleForm" ref="ruleForm" class="demo-form-inline" label-position="right"> | |||
<el-form-item label="审核状态" prop="auditStatus" class="fx_send"> | |||
<el-select v-model="ruleForm.auditStatus" placeholder="请选择" clearable> | |||
<el-option v-for="(item,index) in auditStatus" :key="index" :value="item.value" :label="item.name"></el-option> | |||
</el-select> | |||
</el-form-item> | |||
<el-form-item label="小程序类型" prop="type" class="fx_send"> | |||
<el-select v-model="ruleForm.type" placeholder="请选择" clearable> | |||
<el-option v-for="(item,index) in appType" :key="index" :value="item.value" :label="item.name"></el-option> | |||
</el-select> | |||
</el-form-item> | |||
<el-form-item label="小程序名称" prop="name" class="fx_title"> | |||
<el-input v-model="ruleForm.name" placeholder="请输入" clearable></el-input> | |||
</el-form-item> | |||
<el-form-item label="小程序版本号" class="fx_send"> | |||
<el-select v-model="ruleForm.userVersion" placeholder="请选择" clearable> | |||
<el-option v-for="(item,index) in version" :key="index" :value="item.version" :label="item.version"></el-option> | |||
</el-select> | |||
</el-form-item> | |||
<el-form-item> | |||
<el-button class="hoverBtn" type="primary" icon="el-icon-search" size="medium" @click.stop="search"></el-button> | |||
</el-form-item> | |||
<div></div> | |||
<el-form-item> | |||
<el-button class="hoverBtn" type="primary" @click.stop="batchRelease">批量发布(8)</el-button> | |||
</el-form-item> | |||
<el-form-item> | |||
<el-button class="hoverBtn" type="primary" @click.stop="batchrevertStatus">批量撤回审核</el-button> | |||
</el-form-item> | |||
<el-form-item> | |||
<el-button class="hoverBtn" type="primary" @click.stop="batchsearchStatus">批量查询审核状态</el-button> | |||
</el-form-item> | |||
<el-form-item> | |||
<el-button class="hoverBtn" type="primary" @click.stop="refresh">刷新</el-button> | |||
</el-form-item> | |||
</el-form> | |||
</div> | |||
<p class="lip">*注:小程序<span>撤回审核按钮</span>需要慎重使用,<span>单个帐号每天审核撤回次数最多不超过1次,一个月不超过10次。</span></p> | |||
<table-list :ref="tk" :options="optionsTable"></table-list> | |||
<!-- 批量发布小程序版本列表 --> | |||
<choose-version-release :ref="tKey1" :t-key="tKey1" :cb="getShopCb"></choose-version-release> | |||
<!-- 撤回审核版本列表 --> | |||
<version-withdraw :ref="tKey2" :t-key="tKey2" :cb="getShopCb"></version-withdraw> | |||
<!-- 批量查询小程序的审核状态 --> | |||
<choose-versioncheck :ref="tKey3" :t-key="tKey2" :cb="getShopCb"></choose-versioncheck> | |||
</div> | |||
</template> | |||
<script> | |||
import alertDialog from "../../core/comps/input/alertDialog.vue"; | |||
import {mapState, mapActions} from "vuex"; | |||
import TableList from "../../core/comps/table/tableList.vue"; | |||
import { CacheData } from "./../../service/couponData/data.js"; | |||
import { configUrl } from "./../../utils/config.js"; | |||
import versionWithdraw from "./../../components/marketing/businessComp/versionWithdraw.vue"; | |||
import chooseVersionRelease from "./../../components/marketing/businessComp/chooseVersionRelease.vue"; | |||
import chooseVersioncheck from "./../../components/marketing/businessComp/chooseVersioncheck.vue"; | |||
export default { | |||
name: 'audit', | |||
components: {TableList,versionWithdraw,chooseVersionRelease,chooseVersioncheck}, | |||
data(){ | |||
return { | |||
listNavKey:"checkNavKey", | |||
tk:"checkKey", | |||
params:"", | |||
src: '', | |||
version:[], | |||
tKey2:"versionWithdraw", | |||
tKey1:"chooseVersionRelease", | |||
tKey3:"chooseVersioncheck", | |||
ruleForm:{ | |||
auditStatus:"", | |||
releaseStatus:"", | |||
codeStatus:"", | |||
type:"", | |||
appId:"", | |||
name:"", | |||
userVersion:"", | |||
}, | |||
optionsTable:{ | |||
actions :[ | |||
{key:"edit",val:"体验二维码(6)",action:this.goErCode,show:(item)=>{ | |||
if(item.codeStatus == 0){ | |||
return true; | |||
} | |||
return false; | |||
}}, | |||
{key:"edit",val:"查询",action:this.checkStatus,show:(item)=>{ | |||
return true; | |||
}}, | |||
{key:"edit",val:"发布(8)",action:this.goSubmit,show:(item)=>{ | |||
if(item.auditStatus == 0){ | |||
return true; | |||
} | |||
return false; | |||
}}, | |||
{key:"edit",val:"撤回",action:this.auditCancel,show:(item)=>{ | |||
if((item.auditStatus == 2||item.auditStatus == 0)){ | |||
return true; | |||
} | |||
return false; | |||
}} | |||
], | |||
map: [ | |||
{ key: "name", val: "小程序名称"}, | |||
{ key: "appId", val: "授权方appid"}, | |||
{ key:"type", val:"类型",convert:this.cAppType}, | |||
{ key:"userVersion", val:"版本号"}, | |||
{ key:"versionDesc", val:"版本描述"}, | |||
{ key:"auditStatus", val:"审核状态",convert:this.cAuditStatus}, | |||
{ key:"auditTime", val:"提交审核时间",type:"dateTime"}, | |||
{ key:"auditErrCode", val:"错误码"} | |||
], | |||
getUrl:()=>{ | |||
let auditStatus = this.ruleForm.auditStatus; | |||
let type = this.ruleForm.type; | |||
let name = this.ruleForm.name; | |||
let userVersion = this.ruleForm.userVersion; | |||
if(userVersion){ | |||
return configUrl.auditStatusList+"?auditStatus="+auditStatus+"&type="+type+"&name="+name+"&userVersion="+userVersion; | |||
}else{ | |||
return configUrl.auditStatusList+"?auditStatus="+auditStatus+"&type="+type+"&name="+name; | |||
} | |||
}, | |||
pageOption:{ | |||
sizeKey:"pageSize", | |||
indexKey:"pageNum", | |||
index:1, | |||
size:10 | |||
}, | |||
analysis:(data)=>{ | |||
return { | |||
data:data.data.list, | |||
count:data.data.total | |||
}; | |||
} | |||
} | |||
} | |||
}, | |||
computed:{ | |||
appType:()=>{ | |||
return CacheData.appType; | |||
}, | |||
auditStatus:()=>{ | |||
return CacheData.auditStatus; | |||
}, | |||
...mapState({ | |||
topNav:state=>state.topNav.data, //将 this.topNav 映射为 this.$store.topNav.data | |||
channels:state=>state.couponStore.channels, | |||
navigationInfo:state=>state.topNav.navigationInfo | |||
}) | |||
}, | |||
created() { | |||
this.setIndex("6"); | |||
}, | |||
mounted(){ | |||
//获得小程序的版本号 | |||
this.getFetch(configUrl.auditVersionList).then(res=>{ | |||
console.log(res) | |||
this.version = res.data; | |||
}).catch(error=>{ | |||
console.log(error); | |||
}) | |||
}, | |||
methods:{ | |||
...mapActions([ | |||
"setIndex" | |||
]), | |||
//选择版本号或者小程序 | |||
getShopCb(items) { | |||
this.shopTableData = []; | |||
items.data.map((item, index) => { | |||
let haveIf = false; | |||
this.shopTableData.map((item01, index01) => { | |||
if(item.id == item01.id) { | |||
haveIf = true | |||
} | |||
}) | |||
if (haveIf == false) { | |||
item.merchantName = item.name; | |||
item.merchantLinkPhone = item.linkPhone | |||
this.shopTableData.push(item); | |||
} | |||
}) | |||
}, | |||
//批量撤回小程序 | |||
batchrevertStatus() { | |||
this.$refs[this.tKey2].openDialog(); | |||
}, | |||
//批量发布小程序 | |||
batchRelease(){ | |||
this.$refs[this.tKey1].openDialog(); | |||
}, | |||
//批量查询审核状态 | |||
batchsearchStatus(){ | |||
this.$refs[this.tKey3].openDialog(); | |||
}, | |||
//撤回审核 | |||
auditCancel(item){ | |||
this.getFetch(configUrl.undoCodeAudit+"?appId="+item.appId).then(res=>{ | |||
this.search(); | |||
this.$message({ | |||
type:"success", | |||
message:"撤回审核成功" | |||
}) | |||
}).catch(err=>{ | |||
console.log(err) | |||
if(typeof(err.data)=="string"){ | |||
var errcode = JSON.parse(err.data).errcode; | |||
}else{ | |||
var errcode = err.data.errcode; | |||
console.log(typeof(err.data)) | |||
} | |||
if(errcode == 0){ | |||
this.$message({ | |||
type: "error", | |||
message: "系统繁忙" | |||
}); | |||
}else if(errcode == -1){ | |||
this.$message({ | |||
type: "error", | |||
message: "系统繁忙" | |||
}); | |||
}else if(errcode == 87013){ | |||
this.$message({ | |||
type: "error", | |||
message: "撤回次数达到上限(每天一次,每个月10次)" | |||
}); | |||
}else if(errcode == 45009){ | |||
this.$message({ | |||
type: "error", | |||
message: "公众号接口访问次数到达了上限" | |||
}); | |||
} | |||
}) | |||
}, | |||
//发布单个小程序 | |||
goSubmit(item){ | |||
this.getFetch(configUrl.releaseAudited+"?appId="+item.appId).then(res=>{ | |||
console.log(res); | |||
this.$message({ | |||
type: "success", | |||
message: "小程序发布成功" | |||
}); | |||
this.search(); | |||
}).catch(err=>{ | |||
console.log(err) | |||
this.$message({ | |||
type: "error", | |||
message: err.data | |||
}); | |||
}) | |||
}, | |||
//查看审核状态 | |||
checkStatus(item){ | |||
this.getFetch(configUrl.getLatestAuditstatus+"?appId="+item.appId).then(res=>{ | |||
console.log(res); | |||
this.$message({ | |||
type: "success", | |||
message: "查询状态成功" | |||
}); | |||
this.search(); | |||
}).catch(err=>{ | |||
console.log(err) | |||
this.$message({ | |||
type: "error", | |||
message: err.data | |||
}); | |||
}) | |||
}, | |||
//刷新 | |||
refresh(){ | |||
this.search(); | |||
}, | |||
search:function(){ | |||
let tk = this.$refs[this.tk]; | |||
tk.search(tk.getParams().index); | |||
}, | |||
//小程序提交审核 | |||
submitcheck: function (item) { | |||
let parmer = { | |||
apps:item.appId, | |||
userVersion:item.userVersion | |||
} | |||
this.postFetch(configUrl.batchCodeAudit,parmer).then(res=>{ | |||
this.$message({ | |||
type: "success", | |||
message:"提交审核成功" | |||
}) | |||
}).catch(error=>{ | |||
console.log(error) | |||
this.$message({ | |||
type: "error", | |||
message:error.data | |||
}) | |||
}) | |||
}, | |||
//小程序的类型 | |||
cAppType(col, item) { | |||
console.log(item) | |||
let res = CacheData.appType.filter(e => { | |||
return e.value == item.type; | |||
})[0]; | |||
console.log(res) | |||
if (res) { | |||
return res.name; | |||
} else { | |||
console.log("error:异常券id:", item.id); | |||
return ""; | |||
} | |||
return res.name; | |||
}, | |||
//小程序审核状态 | |||
cAuditStatus(col, item){ | |||
console.log(item) | |||
let res = CacheData.auditStatus.filter(e => { | |||
return e.value == item.auditStatus; | |||
})[0]; | |||
console.log(res) | |||
if (res) { | |||
return res.name; | |||
} else { | |||
return ""; | |||
} | |||
return res.name; | |||
}, | |||
}, | |||
} | |||
</script> | |||
<style scoped> | |||
.lip{ | |||
padding-top: 30px; | |||
} | |||
.lip span{ | |||
color: red; | |||
} | |||
.title{ | |||
margin-bottom: 10px; | |||
} | |||
.title h3{ | |||
font-size: 18px; | |||
font-weight: bold; | |||
} | |||
.content span{ | |||
font-size: 15px; | |||
} | |||
.content span:nth-of-type(1){ | |||
color: #19ce00; | |||
font-weight:bold; | |||
margin-right: 20px; | |||
} | |||
.content span:nth-of-type(2){ | |||
margin-right: 20px; | |||
cursor: pointer; | |||
} | |||
.layout-content{ | |||
margin-top: 20px; | |||
background: #f6f6f6; | |||
padding: 29px 20px 0; | |||
border-radius:6px; | |||
} | |||
.el-select-dropdown__item{ | |||
display: block; | |||
} | |||
.tableContainer{ | |||
width: 100%; | |||
margin-top: 23px; | |||
} | |||
</style> | |||
<style> | |||
.el-message-box{ | |||
width:300px; | |||
padding:0 0 20px; | |||
} | |||
.el-message-box img{ | |||
width:200px; | |||
height: 200px; | |||
display:block; | |||
margin:0 auto; | |||
} | |||
.el-message-box__header{ | |||
text-align:center; | |||
font-size:14px!important; | |||
} | |||
.el-message-box__btns button{ | |||
width:100px!important; | |||
} | |||
.el-message-box__title{ | |||
font-size:16px; | |||
} | |||
</style> | |||
@@ -0,0 +1,33 @@ | |||
import Util from "../../core/tool/commonUtil.js"; | |||
function AuthHOC(Component){ | |||
return { | |||
mounted (){ | |||
}, | |||
props:Component.props, | |||
render(h){ | |||
let uname = Util.cookie.getCookie("uname"); | |||
if(!uname){ | |||
this.$router.push({path:"/login"}); | |||
return h(); | |||
} | |||
const slots = Object.keys(this.$slots); | |||
slots.reduce((arr, key) => arr.concat(this.$slots[key]), []) | |||
.map(vnode => { | |||
vnode.context = this._self | |||
return vnode | |||
}) | |||
return h(Component,{ | |||
on: this.$listeners, | |||
props: this.$props, | |||
scopedSlots: this.$scopedSlots, | |||
attrs: this.$attrs | |||
},slots) | |||
} | |||
} | |||
} | |||
export default AuthHOC |
@@ -0,0 +1,284 @@ | |||
<template> | |||
<div class="layout server"> | |||
<div class="title"> | |||
<h3>基础设置</h3> | |||
</div> | |||
<div class="content" v-for="(item, index) in set" :key="index"> | |||
<el-form :model="ruleForm" :rules="rules" ref="ruleForm" label-width="162px" class="demo-ruleForm sever" label-position="right"> | |||
<h3 v-if="item.type == 1">B端</h3> | |||
<h3 v-if="item.type == 2">C端</h3> | |||
<div> | |||
<div class="sever"> | |||
<h3>服务器域名配置</h3> | |||
<div class="layout-content wdbFormBox wdbFormBox1"> | |||
<el-form-item label="request 合法域名" prop="subTitle"> | |||
<span>{{item.domainUrl.url.requestdomain}}</span> | |||
</el-form-item> | |||
<el-form-item label="socket 合法域名" prop="subTitle"> | |||
<span>{{item.domainUrl.url.wsrequestdomain}}</span> | |||
</el-form-item> | |||
<el-form-item label="uploadFile 合法域名" prop="subTitle"> | |||
<span>{{item.domainUrl.url.uploaddomain}}</span> | |||
</el-form-item> | |||
<el-form-item label="downloadFile 合法域名" prop="subTitle"> | |||
<span>{{item.domainUrl.url.downloaddomain}}</span> | |||
</el-form-item> | |||
</div> | |||
</div> | |||
<div class="sever"> | |||
<h3>业务域名配置</h3> | |||
<div class="layout-content wdbFormBox wdbFormBox1"> | |||
<div class="edit-item" v-for="(yewuitemUrl,index) in item.domainUrl.web" :key="index"> | |||
<el-form-item label="合法业务域名" prop="subTitle"> | |||
<span>{{yewuitemUrl}}</span> | |||
</el-form-item> | |||
</div> | |||
</div> | |||
</div> | |||
<div class="sever"> | |||
<h3>版本号</h3> | |||
<div class="layout-content wdbFormBox wdbFormBox1"> | |||
<div class="edit-item"> | |||
<el-form-item label="基础库版本号" prop="subTitle"> | |||
<span>{{item.version}}</span> | |||
</el-form-item> | |||
</div> | |||
</div> | |||
</div> | |||
</div> | |||
</el-form> | |||
</div> | |||
</div> | |||
</template> | |||
<script> | |||
import TableList from "./../../core/comps/table/tableList.vue"; | |||
import commonUtil from './../../core/tool/commonUtil'; | |||
import { configUrl } from "./../../utils/config.js"; | |||
import { mapState, mapActions } from "vuex"; | |||
export default { | |||
name: 'server', | |||
components: {TableList}, | |||
data () { | |||
return { | |||
data:[], | |||
set:[], | |||
ruleForm: { | |||
version: "", | |||
}, | |||
rules:{ | |||
subTitle: [ | |||
{ | |||
min: 1, | |||
max: 50, | |||
message: "副标题最大50个字符!", | |||
trigger: "blur" | |||
} | |||
], | |||
} | |||
} | |||
}, | |||
computed:{ | |||
sendMethods:()=>{ | |||
return CouponCacheData.sendMethods; | |||
}, | |||
...mapState({ | |||
topNav:state=>state.topNav.data, //将 this.topNav 映射为 this.$store.topNav.data | |||
channels:state=>state.couponStore.channels, | |||
index:state=>state.topNav.index | |||
}) | |||
}, | |||
methods:{ | |||
...mapActions([ | |||
"setIndex" | |||
]), | |||
addCol(){ | |||
this.data.push({points:"",level:"",description:"",discountEnable:0}); | |||
}, | |||
delItem(item){ | |||
if(item.points == "" && item.level == "" ){ | |||
this.data = commonUtil.arrayServer.removeItems(this.data,[item]); | |||
return; | |||
} | |||
this.showConfirm("是否删除?",(d)=>{ | |||
this.postFetch(MemberUrl.CZZ.LEVEL.DELETE,{id:item.id}).then(d=>{ | |||
this.showAlertMsg(); | |||
this.data = commonUtil.arrayServer.removeItems(this.data,[item]); | |||
}) | |||
}) | |||
}, | |||
}, | |||
mounted(){ | |||
this.getFetch(configUrl.weappBasicSetList+"?pageNum=1&pageSize=100").then(res=>{ | |||
this.set = res.data.list; | |||
this.set.map(file=>{ | |||
file.domainUrl = JSON.parse(file.domainUrl); | |||
console.log(file.domainUrl) | |||
}) | |||
}).catch(err=>{ | |||
console.log(err); | |||
}) | |||
}, | |||
created() { | |||
this.setIndex("2"); | |||
} | |||
} | |||
</script> | |||
<!-- Add "scoped" attribute to limit CSS to this component only --> | |||
<style scoped> | |||
.sever{ | |||
border-radius: 4px; | |||
border:1px solid #e7e7eb; | |||
padding: 0 20px 10px; | |||
margin-bottom: 20px; | |||
} | |||
.content{ | |||
width: 630px; | |||
margin: 30px 0; | |||
} | |||
.title{ | |||
margin-bottom: 10px; | |||
} | |||
.title h3{ | |||
font-size: 18px; | |||
font-weight: bold; | |||
} | |||
.layout-content{ | |||
background: #fff; | |||
overflow: hidden; | |||
} | |||
.btn-group{ | |||
text-align: center; | |||
margin-top: 26px; | |||
} | |||
.layout-content table{ | |||
width:100%; | |||
} | |||
.layout-content table tr td{ | |||
padding:17px 0; | |||
text-align:left; | |||
} | |||
.layout-content table tr td:nth-child(1){ | |||
padding:17px 0 17px 18px; | |||
width:200px; | |||
text-align:center; | |||
} | |||
.layout-content table tr td:nth-child(2){ | |||
padding:17px 15px; | |||
width:10px; | |||
text-align:center; | |||
} | |||
.layout-content table tr td:nth-child(3){ | |||
padding:17px 10px 17px 0; | |||
width:180px; | |||
text-align:center; | |||
} | |||
.layout-content table tr td:nth-child(4){ | |||
padding:17px 10px; | |||
width:240px; | |||
text-align:center; | |||
} | |||
.layout-content table tr td:nth-child(5){ | |||
padding:17px 10px; | |||
text-align:left; | |||
} | |||
.layout-content table tr:hover{ | |||
cursor:pointer; | |||
background:#F4F7F9; | |||
} | |||
.editBox,.delBox{ | |||
width:40px; | |||
height:40px; | |||
text-align:center; | |||
line-height:40px; | |||
display:inline-block; | |||
color:#fff; | |||
font-size:14px; | |||
border-radius:3px; | |||
margin-right:20px; | |||
display:none; | |||
} | |||
.editBox{ | |||
background:#51A9C9; | |||
} | |||
.delBox{ | |||
background:#EE7653; | |||
} | |||
.layout-content table tr:hover .editBox{ | |||
display:inline-block; | |||
} | |||
.layout-content table tr:hover .delBox{ | |||
display:inline-block; | |||
} | |||
.btnGroupBox{ | |||
margin-top:20px; | |||
} | |||
.addBox{ | |||
width:146px; | |||
height:40px; | |||
text-align:center; | |||
line-height:40px; | |||
display:inline-block; | |||
color:#fff; | |||
font-size:14px; | |||
border-radius:3px; | |||
margin-right:20px; | |||
background:#6B5EC9; | |||
cursor:pointer; | |||
} | |||
.addBox i{ | |||
margin-right:5px; | |||
} | |||
.saveBox{ | |||
width:91px; | |||
height:40px; | |||
text-align:center; | |||
line-height:40px; | |||
display:block; | |||
color:#fff; | |||
font-size:14px; | |||
border-radius:3px; | |||
background:#409EFF; | |||
margin: 0 auto!important; | |||
cursor:pointer; | |||
} | |||
.addBox:hover{ | |||
background:#7A6CE1; | |||
} | |||
.addBox:active{ | |||
background:#6357BB; | |||
} | |||
.editBox:hover{ | |||
background:#5DC1E5; | |||
} | |||
.editBox:active{ | |||
background:#4490AB; | |||
} | |||
.saveBox:hover{ | |||
background:#5DC1E5; | |||
} | |||
.saveBox:active{ | |||
background:#4490AB; | |||
} | |||
.delBox:hover{ | |||
background:#FF8460; | |||
} | |||
.delBox:active{ | |||
background:#DF6F4E; | |||
} | |||
</style> | |||
<style> | |||
.save{ | |||
display: block; | |||
width:90px; | |||
margin:0 auto; | |||
} | |||
.tips{ | |||
color:red; | |||
text-align:center; | |||
margin-top:10px; | |||
} | |||
</style> |
@@ -0,0 +1,313 @@ | |||
<template> | |||
<div class="layout"> | |||
<div class="title"> | |||
<h3>code提交列表</h3> | |||
</div> | |||
<div class="layout-content"> | |||
<el-form :inline="true" :model="ruleForm" ref="ruleForm" class="demo-form-inline" label-position="right"> | |||
<el-form-item label="提交状态" prop="codeStatus" class="fx_send"> | |||
<el-select v-model="ruleForm.codeStatus" placeholder="请选择" clearable> | |||
<el-option v-for="(item,index) in codestate" :key="index" :value="item.value" :label="item.name"></el-option> | |||
</el-select> | |||
</el-form-item> | |||
<el-form-item label="小程序类型" prop="type" class="fx_send"> | |||
<el-select v-model="ruleForm.type" placeholder="请选择" clearable> | |||
<el-option v-for="(item,index) in appType" :key="index" :value="item.value" :label="item.name"></el-option> | |||
</el-select> | |||
</el-form-item> | |||
<el-form-item label="小程序名称" prop="name" class="fx_title"> | |||
<el-input v-model="ruleForm.name" placeholder="请输入" clearable></el-input> | |||
</el-form-item> | |||
<el-form-item label="小程序版本号" class="fx_send"> | |||
<el-select v-model="ruleForm.userVersion" placeholder="请选择" clearable> | |||
<el-option v-for="(item,index) in version" :key="index" :value="item.version" :label="item.version"></el-option> | |||
</el-select> | |||
</el-form-item> | |||
<el-form-item> | |||
<el-button class="hoverBtn" type="primary" icon="el-icon-search" size="medium" @click.stop="search"></el-button> | |||
</el-form-item> | |||
<el-form-item> | |||
<el-button class="hoverBtn" type="primary" @click.stop="reviewApp('reviewApp')">批量提交小程序审核(7)</el-button> | |||
</el-form-item> | |||
<el-form-item> | |||
<el-button class="hoverBtn" type="primary" @click.stop="refresh">刷新</el-button> | |||
</el-form-item> | |||
</el-form> | |||
</div> | |||
<table-list :ref="tk" :options="optionsTable"></table-list> | |||
<choose-app :params="params" :ref="tKey" :t-key="tKey" :cb="getShopCb"></choose-app> | |||
</div> | |||
</template> | |||
<script> | |||
import {mapState, mapActions} from "vuex"; | |||
import TableList from "../../core/comps/table/tableList.vue"; | |||
import { CacheData } from "./../../service/couponData/data.js"; | |||
import { configUrl } from "./../../utils/config.js"; | |||
import chooseApp from "./../../components/marketing/businessComp/chooseApp.vue"; | |||
export default { | |||
name: 'codesubmit', | |||
components: {TableList,chooseApp}, | |||
data(){ | |||
return { | |||
listNavKey:"codesubmitNavKey", | |||
tk:"codesubmitKey", | |||
paramers:"", | |||
params:"", | |||
src: '', | |||
version:[], | |||
tKey: "chooseApp", | |||
ruleForm:{ | |||
auditStatus:"", | |||
releaseStatus:"", | |||
codeStatus:"", | |||
type:"", | |||
appId:"", | |||
name:"", | |||
userVersion:"", | |||
}, | |||
optionsTable:{ | |||
actions :[ | |||
{key:"edit",val:"体验版二维码(6)",action:this.goErCode,show:(item)=>{ | |||
if(item.codeStatus == 0){ | |||
return true; | |||
} | |||
return false; | |||
}}, | |||
{key:"edit",val:"提交审核(7)",action:this.submitcheck,show:(item)=>{ | |||
if(item.codeStatus == 0){ | |||
return true; | |||
} | |||
return false; | |||
}}, | |||
], | |||
map: [ | |||
{ key: "name", val: "小程序名称"}, | |||
{ key: "appId", val: "授权方appid"}, | |||
{ key:"type", val:"小程序类型",convert:this.cAppType}, | |||
{ key:"userVersion", val:"版本号"}, | |||
{ key:"versionDesc", val:"版本描述"}, | |||
{ key:"codeStatus", val:"code提交状态",convert:this.codeStatus}, | |||
{ key:"codeTime", val:"code提交时间",type:"dateTime"}, | |||
{ key:"codeErrCode", val:"错误码"} | |||
], | |||
getUrl:()=>{ | |||
let codeStatus = this.ruleForm.codeStatus; | |||
let type = this.ruleForm.type; | |||
let name = this.ruleForm.name; | |||
let userVersion = this.ruleForm.userVersion; | |||
if(this.ruleForm.userVersion){ | |||
return configUrl.codeStatusList+"?codeStatus="+codeStatus+"&type="+type+"&name="+name+"&userVersion="+userVersion; | |||
}else if(this.ruleForm.userVersion == ""){ | |||
return configUrl.codeStatusList+"?codeStatus="+codeStatus+"&type="+type+"&name="+name; | |||
} | |||
}, | |||
pageOption:{ | |||
sizeKey:"pageSize", | |||
indexKey:"pageNum", | |||
index:1, | |||
size:10 | |||
}, | |||
analysis:(data)=>{ | |||
// data.data.list.map(file=>{ | |||
// if(file.codeErrCode=='{"errcode":"0","errmsg":"ok"}'){ | |||
// file.codeErrCode ="" | |||
// } | |||
// }) | |||
return { | |||
data:data.data.list, | |||
count:data.data.total | |||
}; | |||
} | |||
} | |||
} | |||
}, | |||
computed:{ | |||
appType:()=>{ | |||
return CacheData.appType; | |||
}, | |||
codestate:()=>{ | |||
return CacheData.codeStatus; | |||
}, | |||
...mapState({ | |||
topNav:state=>state.topNav.data, //将 this.topNav 映射为 this.$store.topNav.data | |||
channels:state=>state.couponStore.channels, | |||
navigationInfo:state=>state.topNav.navigationInfo | |||
}) | |||
}, | |||
created() { | |||
this.setIndex("7"); | |||
}, | |||
mounted(){ | |||
//获得小程序的版本号 | |||
this.getFetch(configUrl.codeVersionList).then(res=>{ | |||
console.log(res) | |||
this.version = res.data; | |||
}).catch(error=>{ | |||
console.log(error); | |||
}) | |||
}, | |||
methods:{ | |||
...mapActions([ | |||
"setIndex" | |||
]), | |||
//选择小程序 | |||
getShopCb(items) { | |||
this.shopTableData = []; | |||
items.data.map((item, index) => { | |||
let haveIf = false; | |||
this.shopTableData.map((item01, index01) => { | |||
if(item.id == item01.id) { | |||
haveIf = true | |||
} | |||
}) | |||
if (haveIf == false) { | |||
item.merchantName = item.name; | |||
item.merchantLinkPhone = item.linkPhone | |||
this.shopTableData.push(item); | |||
} | |||
}) | |||
}, | |||
//批量提交小程序审核 | |||
reviewApp(item) { | |||
let items = { | |||
from:item | |||
} | |||
console.log(items) | |||
this.$refs[this.tKey].openDialog(JSON.stringify(items)); | |||
}, | |||
//刷新 | |||
refresh(){ | |||
this.search(); | |||
}, | |||
search:function(){ | |||
let tk = this.$refs[this.tk]; | |||
tk.search(tk.getParams().index); | |||
}, | |||
goErCode: function (item) { | |||
let weiXinUrl = configUrl.getQrcode+"?appId="+item.appId+'&pagePath='+'pages/index/index'; | |||
this.$alert("<strong><img src="+ weiXinUrl + " width=100px height=100px></strong>", item.name+'体验版', { | |||
dangerouslyUseHTMLString: true, | |||
closeOnClickModal:true, | |||
showConfirmButton:true, | |||
showClose:false, | |||
center:true | |||
}) | |||
}, | |||
//小程序提交审核 | |||
submitcheck: function (item) { | |||
let parmer = { | |||
apps:item.appId, | |||
userVersion:item.userVersion | |||
} | |||
this.postFetch(configUrl.batchCodeAudit,parmer).then(res=>{ | |||
console.log(res) | |||
this.search(); | |||
this.$message({ | |||
type: "success", | |||
message:"提交审核成功" | |||
}) | |||
}).catch(error=>{ | |||
console.log(error) | |||
this.search(); | |||
this.$message({ | |||
type: "error", | |||
message:error.data | |||
}) | |||
}) | |||
}, | |||
//小程序的类型 | |||
cAppType(col, item) { | |||
console.log(item) | |||
let res = CacheData.appType.filter(e => { | |||
return e.value == item.type; | |||
})[0]; | |||
console.log(res) | |||
if (res) { | |||
return res.name; | |||
} else { | |||
console.log("error:异常券id:", item.id); | |||
return ""; | |||
} | |||
return res.name; | |||
}, | |||
//code提交状态 | |||
codeStatus(col, item){ | |||
console.log(item) | |||
let res = CacheData.codeStatus.filter(e => { | |||
return e.value == item.codeStatus; | |||
})[0]; | |||
console.log(res) | |||
if (res) { | |||
return res.name; | |||
} else { | |||
return ""; | |||
} | |||
return res.name; | |||
}, | |||
}, | |||
} | |||
</script> | |||
<style scoped> | |||
.lip{ | |||
padding-top: 30px; | |||
} | |||
.lip span{ | |||
color: red; | |||
} | |||
.title{ | |||
margin-bottom: 10px; | |||
} | |||
.title h3{ | |||
font-size: 18px; | |||
font-weight: bold; | |||
} | |||
.content span{ | |||
font-size: 15px; | |||
} | |||
.content span:nth-of-type(1){ | |||
color: #19ce00; | |||
font-weight:bold; | |||
margin-right: 20px; | |||
} | |||
.content span:nth-of-type(2){ | |||
margin-right: 20px; | |||
cursor: pointer; | |||
} | |||
.layout-content{ | |||
margin-top: 20px; | |||
background: #f6f6f6; | |||
padding: 29px 20px 0; | |||
border-radius:6px; | |||
} | |||
.el-select-dropdown__item{ | |||
display: block; | |||
} | |||
.tableContainer{ | |||
width: 100%; | |||
margin-top: 23px; | |||
} | |||
</style> | |||
<style> | |||
.el-message-box{ | |||
width:300px; | |||
padding:0 0 20px; | |||
} | |||
.el-message-box img{ | |||
width:200px; | |||
height: 200px; | |||
display:block; | |||
margin:0 auto; | |||
} | |||
.el-message-box__header{ | |||
text-align:center; | |||
font-size:14px!important; | |||
} | |||
.el-message-box__btns button{ | |||
width:100px!important; | |||
} | |||
.el-message-box__title{ | |||
font-size:16px; | |||
} | |||
</style> | |||
@@ -0,0 +1,353 @@ | |||
<template> | |||
<div class="layout server"> | |||
<div class="title"> | |||
<h3>草稿/模板</h3> | |||
</div> | |||
<el-button type="primary" @click="refresh">刷新</el-button> | |||
<div class="content"> | |||
<div> | |||
<h3 class="h3">草稿</h3> | |||
<table-list :ref="tk1" :options="optionsTable1"></table-list> | |||
<alert-dialog ref="alertDialogKey"></alert-dialog> | |||
</div> | |||
<div> | |||
<h3 class="h3">模板</h3> | |||
<table-list :ref="tk2" :options="optionsTable2"></table-list> | |||
<alert-dialog ref="alertDialogKey"></alert-dialog> | |||
</div> | |||
</div> | |||
<choose-app :params="params" :ref="tKey" :t-key="tKey" :cb="getShopCb"></choose-app> | |||
</div> | |||
</template> | |||
<script> | |||
import TableList from "./../../core/comps/table/tableList.vue"; | |||
import { configUrl } from "./../../utils/config.js"; | |||
import { mapState, mapActions } from "vuex"; | |||
import moment from 'moment'; | |||
import alertDialog from "../../core/comps/input/alertDialog.vue"; | |||
import commonUtil from './../../core/tool/commonUtil'; | |||
import chooseApp from "./../../components/marketing/businessComp/chooseApp.vue"; | |||
export default { | |||
name: 'draft', | |||
components: {TableList,alertDialog,chooseApp}, | |||
data () { | |||
return { | |||
data:[], | |||
tk1:"draftTableKey1", | |||
tk2:"draftTableKey2", | |||
tKey: "chooseApp", | |||
params:"", | |||
draft:"draft", | |||
ruleForm: { | |||
//副标题 | |||
subTitle: "", | |||
}, | |||
rules:{ | |||
subTitle: [ | |||
{ | |||
min: 1, | |||
max: 50, | |||
message: "副标题最大50个字符!", | |||
trigger: "blur" | |||
} | |||
], | |||
}, | |||
optionsTable1:{ | |||
actions :[ | |||
{key:"edit",val:"转为模板(4)",action:this.addToTemplate} | |||
], | |||
map:[ | |||
{key:"draftId",val:"草稿ID"}, | |||
{key:"userVersion",val:"版本号"}, | |||
{key:"createTime",val:"创建时间",type:'dateTime'}, | |||
{key:"userDesc",val:"版本描述"}, | |||
], | |||
getUrl:()=>{ | |||
return configUrl.tempDraftList; | |||
}, | |||
pageOption:{ | |||
showIf:false, | |||
sizeKey:"pageSize", | |||
indexKey:"pageNum", | |||
index:1, | |||
size:10 | |||
}, | |||
analysis:(res)=>{ | |||
res.data.map((item,index)=>{ | |||
item.createTime=Number(item.createTime)*1000 | |||
}) | |||
return { | |||
data:res.data, | |||
count:res.data.total | |||
}; | |||
} | |||
}, | |||
optionsTable2:{ | |||
actions :[ | |||
{key:"edit",val:"删除",action:this.goDelete}, | |||
{key:"edit",val:"提交(5)",action:this.choseAPP}, | |||
], | |||
map:[ | |||
{key:"templateId",val:"模板ID"}, | |||
{key:"userVersion",val:"版本号"}, | |||
{key:"createTime",val:"创建时间",type:'dateTime'}, | |||
{key:"userDesc",val:"版本描述"} | |||
], | |||
getUrl:()=>{ | |||
return configUrl.getTempList; | |||
}, | |||
pageOption:{ | |||
showIf:false, | |||
sizeKey:"pageSize", | |||
indexKey:"pageNum", | |||
index:1, | |||
size:10, | |||
}, | |||
analysis:(res)=>{ | |||
res.data.map((item,index)=>{ | |||
item.createTime=Number(item.createTime)*1000 | |||
}) | |||
return { | |||
data:res.data, | |||
count:res.data.total | |||
}; | |||
} | |||
} | |||
} | |||
}, | |||
computed:{ | |||
...mapState({ | |||
topNav:state=>state.topNav.data, //将 this.topNav 映射为 this.$store.topNav.data | |||
channels:state=>state.couponStore.channels, | |||
index:state=>state.topNav.index | |||
}) | |||
}, | |||
methods:{ | |||
...mapActions([ | |||
"setIndex" | |||
]), | |||
//选择小程序 | |||
choseAPP(item) { | |||
console.log(item) | |||
this.params = JSON.stringify(item); | |||
this.$refs[this.tKey].openDialog(this.params); | |||
}, | |||
//选择小程序 | |||
getShopCb(items) { | |||
this.shopTableData = []; | |||
items.data.map((item, index) => { | |||
let haveIf = false; | |||
this.shopTableData.map((item01, index01) => { | |||
if(item.id == item01.id) { | |||
haveIf = true | |||
} | |||
}) | |||
if (haveIf == false) { | |||
item.merchantName = item.name; | |||
item.merchantLinkPhone = item.linkPhone | |||
this.shopTableData.push(item); | |||
} | |||
}) | |||
}, | |||
//删除模板 | |||
goDelete(item) { | |||
this.$refs['alertDialogKey'].openDialog("此操作会删除草稿, 是否继续?",() => { | |||
let params = { templateId: item.templateId} | |||
this.postFetch(configUrl.deleteTemplate, params).then(d => { | |||
this.showAlertMsg("success", '操作成功!'); | |||
this.search(); | |||
}) | |||
}); | |||
}, | |||
//将草稿转为模板 | |||
addToTemplate(item) { | |||
this.$refs['alertDialogKey'].openDialog("此操作会将草稿转为模板, 是否继续?",() => { | |||
let params = { draftId: item.draftId}; | |||
this.postFetch(configUrl.addToTemplate, params).then(d => { | |||
this.showAlertMsg("success", '操作成功!'); | |||
this.search(); | |||
}) | |||
}) | |||
}, | |||
search:function(){ | |||
let tk1 = this.$refs[this.tk1]; | |||
let tk2 = this.$refs[this.tk2]; | |||
tk1.search(tk1.getParams().index); | |||
tk2.search(tk2.getParams().index); | |||
}, | |||
//刷新 | |||
refresh(){ | |||
//更新草稿列表 | |||
//更新模板列表 | |||
this.search(); | |||
} | |||
}, | |||
mounted(){ | |||
}, | |||
created() { | |||
this.setIndex("3"); | |||
} | |||
} | |||
</script> | |||
<!-- Add "scoped" attribute to limit CSS to this component only --> | |||
<style scoped> | |||
.tableContainer{ | |||
width: 100%; | |||
margin-top: 30px; | |||
} | |||
.h3{ | |||
font-size: 16px; | |||
} | |||
.sever{ | |||
border-radius: 4px; | |||
border:1px solid #e7e7eb; | |||
padding: 0 20px 10px; | |||
margin-bottom: 20px; | |||
} | |||
.title{ | |||
margin-bottom: 10px; | |||
} | |||
.title h3{ | |||
font-size: 18px; | |||
font-weight: bold; | |||
} | |||
.layout-content{ | |||
background: #fff; | |||
overflow: hidden; | |||
} | |||
.btn-group{ | |||
text-align: center; | |||
margin-top: 26px; | |||
} | |||
.layout-content table{ | |||
width:100%; | |||
} | |||
.layout-content table tr td{ | |||
padding:17px 0; | |||
text-align:left; | |||
} | |||
.layout-content table tr td:nth-child(1){ | |||
padding:17px 0 17px 18px; | |||
width:200px; | |||
text-align:center; | |||
} | |||
.layout-content table tr td:nth-child(2){ | |||
padding:17px 15px; | |||
width:10px; | |||
text-align:center; | |||
} | |||
.layout-content table tr td:nth-child(3){ | |||
padding:17px 10px 17px 0; | |||
width:180px; | |||
text-align:center; | |||
} | |||
.layout-content table tr td:nth-child(4){ | |||
padding:17px 10px; | |||
width:240px; | |||
text-align:center; | |||
} | |||
.layout-content table tr td:nth-child(5){ | |||
padding:17px 10px; | |||
text-align:left; | |||
} | |||
.layout-content table tr:hover{ | |||
cursor:pointer; | |||
background:#F4F7F9; | |||
} | |||
.editBox,.delBox{ | |||
width:40px; | |||
height:40px; | |||
text-align:center; | |||
line-height:40px; | |||
display:inline-block; | |||
color:#fff; | |||
font-size:14px; | |||
border-radius:3px; | |||
margin-right:20px; | |||
display:none; | |||
} | |||
.editBox{ | |||
background:#51A9C9; | |||
} | |||
.delBox{ | |||
background:#EE7653; | |||
} | |||
.layout-content table tr:hover .editBox{ | |||
display:inline-block; | |||
} | |||
.layout-content table tr:hover .delBox{ | |||
display:inline-block; | |||
} | |||
.btnGroupBox{ | |||
margin-top:20px; | |||
} | |||
.addBox{ | |||
width:146px; | |||
height:40px; | |||
text-align:center; | |||
line-height:40px; | |||
display:inline-block; | |||
color:#fff; | |||
font-size:14px; | |||
border-radius:3px; | |||
margin-right:20px; | |||
background:#6B5EC9; | |||
cursor:pointer; | |||
} | |||
.addBox i{ | |||
margin-right:5px; | |||
} | |||
.saveBox{ | |||
width:91px; | |||
height:40px; | |||
text-align:center; | |||
line-height:40px; | |||
display:block; | |||
color:#fff; | |||
font-size:14px; | |||
border-radius:3px; | |||
background:#51A9C9; | |||
margin: 0 auto!important; | |||
cursor:pointer; | |||
} | |||
.addBox:hover{ | |||
background:#7A6CE1; | |||
} | |||
.addBox:active{ | |||
background:#6357BB; | |||
} | |||
.editBox:hover{ | |||
background:#5DC1E5; | |||
} | |||
.editBox:active{ | |||
background:#4490AB; | |||
} | |||
.saveBox:hover{ | |||
background:#5DC1E5; | |||
} | |||
.saveBox:active{ | |||
background:#4490AB; | |||
} | |||
.delBox:hover{ | |||
background:#FF8460; | |||
} | |||
.delBox:active{ | |||
background:#DF6F4E; | |||
} | |||
</style> | |||
<style> | |||
.save{ | |||
display: block; | |||
width:90px; | |||
margin:0 auto; | |||
} | |||
.tips{ | |||
color:red; | |||
text-align:center; | |||
margin-top:10px; | |||
} | |||
</style> |
@@ -0,0 +1,34 @@ | |||
<template> | |||
<el-popover | |||
placement="top-start" | |||
:title="title" | |||
width="200" | |||
trigger="hover" | |||
:content="content"> | |||
<i class="el-icon-question" slot="reference"></i> | |||
</el-popover> | |||
</template> | |||
<script> | |||
export default { | |||
name: 'help', | |||
props:['title','content'], | |||
data () { | |||
return { | |||
} | |||
}, | |||
methods:{ | |||
}, | |||
mounted:function () { | |||
}, | |||
created(){ | |||
} | |||
} | |||
</script> | |||
<!-- Add "scoped" attribute to limit CSS to this component only --> | |||
<style scoped> | |||
</style> |
@@ -0,0 +1,114 @@ | |||
<template> | |||
<div> | |||
<div class="second-level"> | |||
<h1>满减券</h1> | |||
<ul class="tab-list"> | |||
<li>全部</li> | |||
<li class="active">草稿箱</li> | |||
<li>待生效</li> | |||
<li>已生效</li> | |||
<li>已失效</li> | |||
<li>已作废</li> | |||
</ul> | |||
</div> | |||
<!-- <v-input :ref="name" error-msg="请输入数字" :v-type="num"></v-input> | |||
<button @click="submit">提交</button> | |||
<div> | |||
<local-select ref='localSelectId' :data="selectData" :analysis="analysis"></local-select> | |||
<input type="button" value="getSelectedItems" @click="getSelectedItems" /> | |||
</div> --> | |||
</div> | |||
</template> | |||
<script> | |||
import AjaxUtil from "../core/tool/ajaxService"; | |||
import Util from "../core/tool/commonUtil"; | |||
import LocalSelect from "../core/comps/select/localSelect.vue"; | |||
import VInput from "../core/comps/input/vInput.vue" | |||
export default { | |||
extends:AjaxUtil, | |||
components: {LocalSelect,VInput}, | |||
name: "Login", | |||
data(){ | |||
return { | |||
selectData:[], | |||
num:"number", | |||
name:"name" | |||
} | |||
}, | |||
methods:{ | |||
analysis:function(data){ | |||
let res = []; | |||
data.forEach(item => { | |||
res.push({name:item.name,code:item._id}); | |||
}); | |||
return res; | |||
}, | |||
getSelectData:function(){ | |||
this.getFetch("/api/person/list").then(d=>{ | |||
this.selectData = d.data.data; | |||
}) | |||
}, | |||
getSelectedItems:function(){ | |||
console.log(this.$refs['localSelectId'].getSelectedItems()); | |||
}, | |||
submit(){ | |||
console.log(this.$refs[this.name].getResult()); | |||
} | |||
}, | |||
mounted:function () { | |||
this.getSelectData(); | |||
}, | |||
created(){ | |||
} | |||
} | |||
</script> | |||
<style scoped> | |||
.inputRedIcon input{border-right: 0;border-color: red;outline: none;} | |||
.inputRedIcon div span.icon{background: #fff;border-color: red;color: red;} | |||
.inputRedIcon p{color: red;} | |||
.inputGreenIcon input{border-right: 0;} | |||
.inputGreenIcon div span.icon{background: #fff;font-size: 16px;color: rgb(72, 255, 0);} | |||
.inputGreenIcon p{display: none} | |||
.inputIcon{border-right: 0;} | |||
.second-level{ | |||
min-height: 60px; | |||
background: #fff; | |||
padding: 0 32px; | |||
box-sizing: border-box; | |||
} | |||
.second-level h1{ | |||
color:rgba(0,0,0,0.85); | |||
font-size: 20px; | |||
text-align: left; | |||
line-height: 60px; | |||
margin: 0; | |||
padding: 0; | |||
} | |||
.second-level .tab-list{ | |||
list-style: none; | |||
line-height: 42px; | |||
overflow: hidden; | |||
padding: 0; | |||
margin: 0; | |||
} | |||
.second-level .tab-list li{ | |||
float: left; | |||
font-size: 14px; | |||
color:rgba(0,0,0,0.65); | |||
padding:0 10px; | |||
margin: 0 10px | |||
} | |||
.second-level .tab-list .active{ | |||
color: rgba(24,144,255,1); | |||
border-bottom: 2px solid rgba(24,144,255,1); | |||
} | |||
</style> |
@@ -0,0 +1,697 @@ | |||
<template> | |||
<div class="layout"> | |||
<div class="title"> | |||
<h3>授权链接</h3> | |||
</div> | |||
<div class="content"> | |||
<a href="/O/wt_auth/goto_auth_url" target="_blank">获取授权(1)</a> | |||
</div> | |||
<div class="layout-content"> | |||
<el-form :inline="true" :model="ruleForm" ref="ruleForm" class="demo-form-inline" label-position="right"> | |||
<el-form-item label="授权状态" prop="authorizationStatus" class="fx_send"> | |||
<el-select v-model="ruleForm.authorizationStatus" placeholder="请选择" clearable> | |||
<el-option v-for="(item,index) in authorizationStatus" :key="index" :value="item.value" :label="item.name"></el-option> | |||
</el-select> | |||
</el-form-item> | |||
<el-form-item label="小程序名称" prop="name" class="fx_title"> | |||
<el-input v-model="ruleForm.name" placeholder="请输入" clearable></el-input> | |||
</el-form-item> | |||
<el-form-item label="小程序类型" prop="type" class="fx_send"> | |||
<el-select v-model="ruleForm.type" placeholder="请选择" clearable> | |||
<el-option v-for="(item,index) in appType" :key="index" :value="item.value" :label="item.name"></el-option> | |||
</el-select> | |||
</el-form-item> | |||
<el-form-item> | |||
<el-button class="hoverBtn" type="primary" icon="el-icon-search" size="medium" @click.stop="search"></el-button> | |||
</el-form-item> | |||
<el-form-item> | |||
<el-button class="hoverBtn" type="primary" @click.stop="batchBasicSet">批量基础配置(2)</el-button> | |||
</el-form-item> | |||
<el-form-item> | |||
<el-button class="hoverBtn" type="primary" @click.stop="batchExtendSet">批量扩展配置</el-button> | |||
</el-form-item> | |||
<el-form-item> | |||
<el-button class="hoverBtn" type="primary" @click.stop="getAuthorizerList">拉取已授权帐号信息</el-button> | |||
</el-form-item> | |||
</el-form> | |||
</div> | |||
<table-list :ref="tk" :options="optionsTable"></table-list> | |||
<choose-app :ref="tKey" :t-key="tKey" :cb="getShopCb"></choose-app> | |||
<extend :ref="tKey1" :t-key="tKey1"></extend> | |||
<getcategory :ref="tKey2" :t-key="tKey2"></getcategory> | |||
<template-msg :ref="tKey3" :t-key="tKey3"></template-msg> | |||
</div> | |||
</template> | |||
<script> | |||
import { mapState, mapActions } from "vuex"; | |||
import TableList from "../../core/comps/table/tableList.vue"; | |||
import { CacheData } from "./../../service/couponData/data.js"; | |||
import { configUrl } from "./../../utils/config.js"; | |||
import alertDialog from "../../core/comps/input/alertDialog.vue"; | |||
import extend from "./../../components/marketing/businessComp/extend.vue"; | |||
import templateMsg from "./../../components/marketing/businessComp/templateMsg.vue"; | |||
import chooseApp from "./../../components/marketing/businessComp/chooseApp.vue"; | |||
import getcategory from "./../../components/marketing/businessComp/getcategory.vue"; | |||
export default { | |||
name: "HomePage", | |||
components: { | |||
TableList, | |||
alertDialog, | |||
extend, | |||
chooseApp, | |||
getcategory, | |||
templateMsg | |||
}, | |||
data() { | |||
return { | |||
listNavKey: "homePageNavKey", | |||
tk: "homePageKey", | |||
tKey: "extendApp", | |||
tKey1: "extend", | |||
tKey2: "getcategory", | |||
tKey3: "templateMsgList", | |||
dialogVisible: false, | |||
privacySetting:"", | |||
latestAuditstatus:"", | |||
ruleForm: { | |||
authorizationStatus: "", | |||
type: "", | |||
name: "" | |||
}, | |||
optionsTable: { | |||
actions: [ | |||
{ | |||
key: "edit", | |||
val: "配置隐私保护指引", | |||
action: this.setprivacysetting, | |||
show: item => { | |||
return (item.type == 1 || item.type == 2)&&item.privacySettingStatus!=0 ? true : false; | |||
} | |||
}, | |||
{ | |||
key: "edit", | |||
val: "查询隐私保护指引", | |||
action: this.getPrivacySetting, | |||
show: item => { | |||
return (item.type == 1 || item.type == 2)&&item.privacySettingStatus==0 ? true : false; | |||
} | |||
}, | |||
// { | |||
// key: "edit", | |||
// val: "查询最新审核状态", | |||
// action: this.getLatestAuditstatus, | |||
// }, | |||
{ | |||
key: "edit", | |||
val: "基础", | |||
action: this.searchFigure, | |||
show: item => { | |||
return item.type == 1 || item.type == 2 ? true : false; | |||
} | |||
}, | |||
{ | |||
key: "edit", | |||
val: "扩展(3)", | |||
action: this.conFigure, | |||
show: item => { | |||
return item.type == 1 || item.type == 2 ? true : false; | |||
} | |||
}, | |||
{ | |||
key: "edit", | |||
val: "类目", | |||
action: this.getCategory, | |||
show: item => { | |||
return item.type == 1 || item.type == 2 ? true : false; | |||
} | |||
}, | |||
{ | |||
key: "delete", | |||
val: "模板列表", | |||
action: this.templateList, | |||
show: item => { | |||
return item.type == 1 || item.type == 2 ? true : false; | |||
} | |||
}, | |||
{ | |||
key: "edit", | |||
val: "创建O", | |||
action: this.createPlatform, | |||
show: item => { | |||
return (item.type == 3)&&(!item.openAppid) || (item.type == 4)&&(!item.openAppid) ? true : false; | |||
} | |||
}, | |||
{ | |||
key: "bind", | |||
val: "绑定O", | |||
action: this.bindPlatform, | |||
show: item => { | |||
return (item.type == 1)&&(!item.openAppid) || (item.type == 2)&&(!item.openAppid) ? true : false; | |||
} | |||
}, | |||
{ | |||
key: "unbind", | |||
val: "解绑O", | |||
action: this.unbindPlatform, | |||
show: item => { | |||
return item.type == 1 || item.type == 2 ? true : false; | |||
} | |||
}, | |||
{ | |||
key: "edit", | |||
val: "获取O", | |||
action: this.getPlatform, | |||
show: item => { | |||
return (item.type == 1)&&(!item.openAppid) || (item.type == 2)&&(!item.openAppid) ? true : false; | |||
} | |||
}, | |||
{ | |||
key: "edit", | |||
val: "重置Quota", | |||
action: this.clearQuota, | |||
show: item => { | |||
return item.type == 3 || item.type == 4 ? true : false; | |||
} | |||
} | |||
], | |||
map: [ | |||
{ key: "headImg", val: "小程序图标", etype: "img" }, | |||
{ key: "name", val: "小程序名称" }, | |||
{ key: "type", val: "类型", convert: this.cAppType }, | |||
{ key: "currentVersion", val: "当前发布版本" }, | |||
{ key: "authorizerAppid", val: "appid" }, | |||
{ | |||
key: "authorizationStatus", | |||
val: "授权状态", | |||
convert: this.authStatus | |||
}, | |||
{ key: "baseStatus", val: "基础版本状态", convert: this.baseStatus }, | |||
{ | |||
key: "domainStatus", | |||
val: "服务器域名状态", | |||
convert: this.domainStatus | |||
}, | |||
{ | |||
key: "webdomainStatus", | |||
val: "业务域名状态", | |||
convert: this.webdomainStatus | |||
}, | |||
{ | |||
key: "templateStatus", | |||
val: "模板消息状态", | |||
convert: this.templateStatus | |||
}, | |||
{ | |||
key: "privacySettingStatus", | |||
val: "用户隐私状态", | |||
convert: this.setPrivacySettingStatus | |||
}, | |||
{ | |||
key: "openAppid", | |||
val: "开放平台AppId" | |||
} | |||
], | |||
getUrl: () => { | |||
let type = this.ruleForm.type; | |||
let authorizationStatus = this.ruleForm.authorizationStatus; | |||
let name = this.ruleForm.name; | |||
return ( | |||
configUrl.weappList + | |||
"?type=" + | |||
type + | |||
"&authorizationStatus=" + | |||
authorizationStatus + | |||
"&name=" + | |||
name | |||
); | |||
}, | |||
pageOption: { | |||
sizeKey: "pageSize", | |||
indexKey: "pageNum", | |||
index: 1, | |||
size: 10 | |||
}, | |||
analysis: res => { | |||
return { | |||
data: res.data.list, | |||
count: res.data.total | |||
}; | |||
} | |||
} | |||
}; | |||
}, | |||
computed: { | |||
appType: () => { | |||
return CacheData.appType; | |||
}, | |||
authorizationStatus: () => { | |||
return CacheData.authorizationStatus; | |||
}, | |||
...mapState({ | |||
topNav: state => state.topNav.data, //将 this.topNav 映射为 this.$store.topNav.data | |||
channels: state => state.couponStore.channels, | |||
navigationInfo: state => state.topNav.navigationInfo | |||
}) | |||
}, | |||
methods: { | |||
// | |||
setprivacysetting(item){ | |||
console.log(item); | |||
this.postFetch("/O/weappSet/setprivacysetting",{appId:item.authorizerAppid}).then(res=>{ | |||
console.log(res,"res"); | |||
this.search() | |||
}).catch(error => { | |||
this.$message({ | |||
type: "error", | |||
message: error.data | |||
}); | |||
}); | |||
}, | |||
getPrivacySetting(item){ | |||
this.getFetch(`/O/weappSet/getPrivacySetting?appId=${item.authorizerAppid}`).then(res=>{ | |||
this.privacySetting = JSON.stringify(res.data) | |||
this.$confirm( this.privacySetting,"查询隐私保护指引",{ | |||
confirmButtonText: '确定', | |||
cancelButtonText: '取消', | |||
type: 'warning' | |||
}).then(() => { | |||
this.$message({ | |||
type: 'success', | |||
message: '确定' | |||
}); | |||
}).catch(() => { | |||
this.$message({ | |||
type: 'info', | |||
message: '取消' | |||
}); | |||
}); | |||
}).catch(error => { | |||
this.$message({ | |||
type: "error", | |||
message: error.data | |||
}); | |||
}); | |||
}, | |||
getLatestAuditstatus(item){ | |||
this.getFetch(`/O/weappCode/getLatestAuditstatus?appId=${item.authorizerAppid}`).then(res=>{ | |||
this.latestAuditstatus = JSON.stringify(res.data) | |||
this.$confirm( this.latestAuditstatus,"查询隐私保护指引",{ | |||
confirmButtonText: '确定', | |||
cancelButtonText: '取消', | |||
type: 'warning' | |||
}).then(() => { | |||
this.$message({ | |||
type: 'success', | |||
message: '确定' | |||
}); | |||
}).catch(() => { | |||
this.$message({ | |||
type: 'info', | |||
message: '取消' | |||
}); | |||
}); | |||
}).catch(error => { | |||
this.$message({ | |||
type: "error", | |||
message: error.data | |||
}); | |||
}); | |||
}, | |||
//拉取当前所有已授权的帐号基本信息 | |||
getAuthorizerList: function() { | |||
this.getFetch(configUrl.getAuthorizerList) | |||
.then(res => { | |||
console.log(res); | |||
this.$message({ | |||
type: "success", | |||
message: "拉取当前所有已授权的帐号基本信息成功" | |||
}); | |||
}) | |||
.catch(error => { | |||
this.$message({ | |||
type: "error", | |||
message: error.data | |||
}); | |||
}); | |||
}, | |||
//获得模板列表 | |||
templateList(item) { | |||
console.log(item); | |||
let parmers = JSON.stringify({ | |||
appId: item.authorizerAppid | |||
}); | |||
this.$refs[this.tKey3].openDialog(parmers); | |||
}, | |||
//批量扩展配置 | |||
batchExtendSet() { | |||
let parmers = JSON.stringify({ | |||
flag: "extendJSON" | |||
}); | |||
this.$refs[this.tKey1].openDialog(parmers); | |||
}, | |||
//小程序的类型 | |||
cAppType(col, item) { | |||
let res = CacheData.appType.filter(e => { | |||
return e.value == item.type; | |||
})[0]; | |||
if (res) { | |||
return res.name; | |||
} else { | |||
return "小程序类型无效"; | |||
} | |||
return res.name; | |||
}, | |||
search: function() { | |||
let tk = this.$refs[this.tk]; | |||
tk.search(tk.getParams().index); | |||
}, | |||
/*** | |||
* createPlatform 创建开放平台 | |||
* bindPlatform 绑定开放平台 | |||
* unbindPlatform 解绑开放平台 | |||
*/ | |||
createPlatform(item) { | |||
let appId = item.authorizerAppid; | |||
this.getFetch(configUrl.createOpenPlatform + "?appId=" + appId) | |||
.then(res => { | |||
console.log(res); | |||
this.$message({ | |||
type: "success", | |||
message: "创建微信开放平台成功" | |||
}); | |||
}) | |||
.catch(error => { | |||
this.$message({ | |||
type: "error", | |||
message: error.data | |||
}); | |||
}); | |||
}, | |||
// 绑定开放平台 | |||
bindPlatform(item) { | |||
console.log(item); | |||
this.$prompt("请输入openAppId", "提示", { | |||
confirmButtonText: "确定", | |||
cancelButtonText: "取消", | |||
inputPattern: /\S/, | |||
inputErrorMessage: "openAppId不能为空" | |||
}) | |||
.then(({ value }) => { | |||
console.log(value); | |||
let appId = item.authorizerAppid; | |||
let openAppId = value; | |||
this.getFetch( | |||
configUrl.bindOpenPlatform + | |||
"?appId=" + | |||
appId + | |||
"&openAppId=" + | |||
openAppId | |||
) | |||
.then(res => { | |||
console.log(res); | |||
this.$message({ | |||
type: "success", | |||
message: "绑定微信开放平台成功" | |||
}); | |||
}) | |||
.catch(error => { | |||
console.log(error); | |||
this.$message({ | |||
type: "error", | |||
message: error.data | |||
}); | |||
}); | |||
}) | |||
.catch(() => { | |||
this.$message({ | |||
type: "error", | |||
message: "取消输入" | |||
}); | |||
}); | |||
}, | |||
//解绑开放平台 | |||
unbindPlatform(item) { | |||
console.log(item); | |||
this.$prompt("请输入openAppId", "提示", { | |||
confirmButtonText: "确定", | |||
cancelButtonText: "取消", | |||
inputPattern: /\S/, | |||
inputErrorMessage: "openAppId不能为空" | |||
}) | |||
.then(({ value }) => { | |||
console.log(value); | |||
let appId = item.authorizerAppid; | |||
let openAppId = value; | |||
this.getFetch( | |||
configUrl.unbindOpenPlatform + | |||
"?appId=" + | |||
appId + | |||
"&openAppId=" + | |||
openAppId | |||
) | |||
.then(res => { | |||
console.log(res); | |||
this.$message({ | |||
type: "success", | |||
message: "解绑微信开放平台成功" | |||
}); | |||
}) | |||
.catch(error => { | |||
console.log(error); | |||
this.$message({ | |||
type: "error", | |||
message: error.data | |||
}); | |||
}); | |||
}) | |||
.catch(() => { | |||
this.$message({ | |||
type: "error", | |||
message: "取消输入" | |||
}); | |||
}); | |||
}, | |||
getPlatform(item) { | |||
let appId = item.authorizerAppid; | |||
let openAppId = ""; | |||
this.getFetch(configUrl.getOpenPlatform + "?appId=" + appId) | |||
.then(res => { | |||
console.log(res); | |||
this.$message({ | |||
type: "success", | |||
message: "获取微信开放平台Appid成功" | |||
}); | |||
}) | |||
.catch(error => { | |||
this.$message({ | |||
type: "error", | |||
message: error.data | |||
}); | |||
}); | |||
}, | |||
clearQuota(item) { | |||
let appId = item.authorizerAppid; | |||
let openAppId = ""; | |||
this.getFetch(configUrl.clearQuota + "?appId=" + appId) | |||
.then(res => { | |||
console.log(res); | |||
this.$message({ | |||
type: "success", | |||
message: "重置公众号Quota成功" | |||
}); | |||
}) | |||
.catch(error => { | |||
this.$message({ | |||
type: "error", | |||
message: error.data | |||
}); | |||
}); | |||
}, | |||
//选择小程序 | |||
batchBasicSet(item) { | |||
let parmers = { | |||
type: this.ruleForm.type, | |||
from: "fromHomePage" | |||
}; | |||
this.$refs[this.tKey].openDialog(JSON.stringify(parmers)); | |||
}, | |||
//选择小程序 | |||
getShopCb(items) { | |||
this.shopTableData = []; | |||
items.data.map((item, index) => { | |||
let haveIf = false; | |||
this.shopTableData.map((item01, index01) => { | |||
if (item.id == item01.id) { | |||
haveIf = true; | |||
} | |||
}); | |||
if (haveIf == false) { | |||
item.merchantName = item.name; | |||
item.merchantLinkPhone = item.linkPhone; | |||
this.shopTableData.push(item); | |||
} | |||
}); | |||
}, | |||
//小程序授权状态 | |||
authStatus(col, item) { | |||
let res = CacheData.authorizationStatus.filter(e => { | |||
return e.value == item.authorizationStatus; | |||
})[0]; | |||
if (res) { | |||
return res.name; | |||
} else { | |||
return "小程序授权状态无效"; | |||
} | |||
return res.name; | |||
}, | |||
//基础配置 | |||
baseStatus(col, item) { | |||
let res = CacheData.baseStatus.filter(e => { | |||
return e.value == item.baseStatus; | |||
})[0]; | |||
if (res) { | |||
return res.name; | |||
} else { | |||
return "暂无基础配置"; | |||
} | |||
return res.name; | |||
}, | |||
//服务器域名配置 | |||
domainStatus(col, item) { | |||
let res = CacheData.domainStatus.filter(e => { | |||
return e.value == item.domainStatus; | |||
})[0]; | |||
if (res) { | |||
return res.name; | |||
} else { | |||
return "暂无配置服务器域名"; | |||
} | |||
return res.name; | |||
}, | |||
//配置业务域名 | |||
webdomainStatus(col, item) { | |||
let res = CacheData.webdomainStatus.filter(e => { | |||
return e.value == item.webdomainStatus; | |||
})[0]; | |||
if (res) { | |||
return res.name; | |||
} else { | |||
return "暂无配置业务域名"; | |||
} | |||
return res.name; | |||
}, | |||
//小程序用户隐私状态 | |||
setPrivacySettingStatus(col,item){ | |||
let sing = "" | |||
if(!item.privacySettingStatus&&item.privacySettingStatus!=0){ | |||
sing = "暂无配置信息" | |||
}else if(item.privacySettingStatus===0){ | |||
sing = "已设置" | |||
}else{ | |||
sing = "设置失败" | |||
}; | |||
return sing | |||
}, | |||
//小程序模板消息 | |||
templateStatus(col, item) { | |||
let res = CacheData.templateStatus.filter(e => { | |||
return e.value == item.templateStatus; | |||
})[0]; | |||
if (res) { | |||
return res.name; | |||
} else { | |||
return "暂无配置模板消息"; | |||
} | |||
return res.name; | |||
}, | |||
//查看基础配置 | |||
searchFigure(item) { | |||
let parmers = JSON.stringify({ | |||
flag: "basicFigure", | |||
appId: item.authorizerAppid | |||
}); | |||
this.$refs[this.tKey1].openDialog(parmers); | |||
}, | |||
//查看小程序类目 | |||
getCategory(item) { | |||
console.log(item); | |||
let parmers = JSON.stringify({ | |||
appId: item.authorizerAppid | |||
}); | |||
this.$refs[this.tKey2].openDialog(parmers); | |||
}, | |||
//扩展配置 | |||
conFigure(item) { | |||
let parmers = JSON.stringify({ | |||
flag: "conFigure", | |||
appId: item.authorizerAppid | |||
}); | |||
this.$refs[this.tKey1].openDialog(parmers); | |||
} | |||
} | |||
}; | |||
</script> | |||
<style scoped> | |||
.tableContainer { | |||
width: 100%; | |||
margin-top: 30px; | |||
} | |||
.title { | |||
margin-bottom: 10px; | |||
} | |||
.title h3 { | |||
font-size: 18px; | |||
font-weight: bold; | |||
} | |||
.content span { | |||
font-size: 15px; | |||
} | |||
.content span:nth-of-type(1) { | |||
color: #19ce00; | |||
font-weight: bold; | |||
margin-right: 20px; | |||
} | |||
.content span:nth-of-type(2) { | |||
margin-right: 20px; | |||
cursor: pointer; | |||
} | |||
.layout-content { | |||
margin-top: 20px; | |||
background: #f6f6f6; | |||
padding: 29px 20px 0; | |||
border-radius: 6px; | |||
} | |||
.el-select-dropdown__item { | |||
display: block; | |||
} | |||
</style> | |||
<style> | |||
.el-message-box { | |||
width: 1000px; | |||
padding: 0 0 20px; | |||
} | |||
.el-message-box img { | |||
width: 200px; | |||
display: block; | |||
margin: 0 auto; | |||
} | |||
.el-message-box__header { | |||
text-align: center; | |||
font-size: 14px !important; | |||
} | |||
.el-message-box__btns button { | |||
width: 100px !important; | |||
} | |||
.el-message-box__title { | |||
font-size: 16px; | |||
} | |||
</style> | |||
@@ -0,0 +1,60 @@ | |||
<template> | |||
<div class="layout"> | |||
<top-layout></top-layout> | |||
<div class="layout-box"> | |||
<router-view></router-view> | |||
</div> | |||
</div> | |||
</template> | |||
<script> | |||
import TopLayout from "./topLayout.vue"; | |||
import commonUtil from "../../core/tool/commonUtil.js"; | |||
import {mapState, mapActions} from "vuex"; | |||
export default { | |||
name: 'Layout', | |||
components: {TopLayout}, | |||
methods:{ | |||
...mapActions([ | |||
"setIndex" | |||
]), | |||
}, | |||
created() { | |||
this.setIndex("1"); | |||
} | |||
} | |||
</script> | |||
<!-- Add "scoped" attribute to limit CSS to this component only --> | |||
<style scoped> | |||
.layout{ | |||
position: relative; | |||
} | |||
.red{ | |||
color:red; | |||
} | |||
h1, h2 { | |||
font-weight: normal; | |||
} | |||
ul { | |||
list-style-type: none; | |||
padding: 0; | |||
} | |||
li { | |||
display: inline-block; | |||
margin: 0 10px; | |||
} | |||
a { | |||
color: #42b983; | |||
} | |||
.layout-box{ | |||
min-height: 200px; | |||
padding: 0 20px; | |||
text-align: left; | |||
margin-top: 90px; | |||
} | |||
.layout-box .widget-box{ | |||
padding: 24px; | |||
} | |||
</style> |
@@ -0,0 +1,175 @@ | |||
<template> | |||
<div class="layout-top"> | |||
<div><img class="logo fl" src="https://iformall-net.s3.cn-northwest-1.amazonaws.com.cn/456/e32b123d-d762-4d8d-a89b-dd7e4380a25f.png" alt=""></div> | |||
<el-menu | |||
:default-active="index" | |||
class="el-menu-demo" | |||
mode="horizontal" | |||
@select="handleSelect" | |||
background-color="#000" | |||
text-color="#fff" | |||
active-text-color="#ffd04b"> | |||
<el-menu-item index="1">首页</el-menu-item> | |||
<el-menu-item index="3">草稿/模板</el-menu-item> | |||
<el-menu-item index="7">code提交列表</el-menu-item> | |||
<el-menu-item index="6">审核列表</el-menu-item> | |||
<el-menu-item index="4">发布列表</el-menu-item> | |||
<el-menu-item index="5">成员管理</el-menu-item> | |||
<el-menu-item index="2">基础设置</el-menu-item> | |||
</el-menu> | |||
<img class="logout" src="./../../static/images/logout.png" @click="logout" alt=""> | |||
</div> | |||
</template> | |||
<script> | |||
import {mapState, mapActions} from "vuex"; | |||
import commonUtil from "../../core/tool/commonUtil.js"; | |||
export default { | |||
name: "TopLayout", | |||
data(){ | |||
return { | |||
} | |||
}, | |||
methods:{ | |||
...mapActions([ | |||
"setNavData", // 将this.setNavData 映射为 this.$store.dispatch('setNavData') | |||
"setIndex" | |||
]), | |||
handleSelect(key, keyPath) { | |||
console.log(key); | |||
if(key == 1){ | |||
this.$router.push({ | |||
path: "/layout" | |||
}); | |||
}else if(key == 2){ | |||
this.$router.push({ | |||
path: "/basicSettings" | |||
}); | |||
}else if(key == 3){ | |||
this.$router.push({ | |||
path: "/draft" | |||
}); | |||
} | |||
else if(key == 4){ | |||
this.$router.push({ | |||
path: "/release" | |||
}); | |||
}else if(key == 5){ | |||
this.$router.push({ | |||
path: "/member" | |||
}); | |||
}else if(key == 6){ | |||
this.$router.push({ | |||
path: "/audit" | |||
}); | |||
}else if(key == 7){ | |||
this.$router.push({ | |||
path: "/codesubmit" | |||
}); | |||
} | |||
}, | |||
logout(){ | |||
this.getFetch("/O/logout").then(d=>{ | |||
this.$message.success("退出成功"); | |||
this.$router.push({path:"/login"}); | |||
commonUtil.cookie.removeCookie("uname"); | |||
}) | |||
} | |||
}, | |||
computed:{ | |||
...mapState({ | |||
topNav:state=>state.topNav.data, //将 this.topNav 映射为 this.$store.topNav.data | |||
index:state=>state.topNav.index | |||
}) | |||
} | |||
} | |||
</script> | |||
<style scoped> | |||
.logout{ | |||
width: 20px; | |||
float: right; | |||
margin-top: 20px; | |||
cursor: pointer; | |||
} | |||
.el-menu-demo{ | |||
margin-left: 20px; | |||
} | |||
.layout-top .logo{ | |||
width: 100px; | |||
margin-top: 15px; | |||
margin-right: 20px; | |||
} | |||
.layout-top{ | |||
position: fixed; | |||
right: 0; | |||
top: 0; | |||
left: 0; | |||
background: #141e29; | |||
padding: 0 20px; | |||
text-align: left; | |||
box-shadow: 0 1px 4px 0px rgba(0,21,41,0.12); | |||
color: rgba(0,0,0,0.45); | |||
font-size: 14px; | |||
overflow: hidden; | |||
z-index: 10; | |||
background:#000; | |||
height: 60px; | |||
line-height: 60px; | |||
} | |||
.layout-top ul{ | |||
float: left; | |||
list-style: none; | |||
margin: 0; | |||
padding: 0; | |||
overflow: hidden; | |||
background: #000!important; | |||
color: #fff; | |||
} | |||
.el-menu--horizontal>.el-menu-item.is-active { | |||
border-bottom: 2px solid #409EFF; | |||
color: #fff; | |||
} | |||
.layout-top ul li{ | |||
float: left; | |||
text-align: center!important; | |||
} | |||
.layout-top ul li::after{ | |||
content: ''; | |||
display: inline-block; | |||
} | |||
.layout-top ul li:last-child::after{ | |||
content: ''; | |||
} | |||
.layout-top ul li:last-child{ | |||
color: rgba(0,0,0,0.65); | |||
} | |||
.layout-top .layout-top-right{ | |||
position: absolute; | |||
right: 25px; | |||
text-align: right; | |||
top:0; | |||
} | |||
.layout-top .portrait{ | |||
width: 24px; | |||
height: 24px; | |||
background: rgba(166,219,255,1); | |||
display: inline-block; | |||
border-radius: 50%; | |||
overflow: hidden; | |||
vertical-align: middle; | |||
margin-top: -4px; | |||
} | |||
.layout-top .logout-icon{ | |||
margin-left: 14px; | |||
cursor: pointer; | |||
vertical-align: middle; | |||
} | |||
</style> |
@@ -0,0 +1,265 @@ | |||
<template> | |||
<div class="bg"> | |||
<div class="login"> | |||
<el-form :model="ruleForm2" status-icon :rules="rules2" ref="ruleForm2" class="demo-ruleForm login_form"> | |||
<h1>小程序第三方管理平台</h1> | |||
<el-form-item class="inputs" label="" prop="username"> | |||
<el-input v-model.number="ruleForm2.username" placeholder="请输入账号"></el-input> | |||
</el-form-item> | |||
<el-form-item class="inputs" label="" prop="password"> | |||
<el-input type="password" v-model="ruleForm2.password" auto-complete="off" placeholder="请输入密码"></el-input> | |||
</el-form-item> | |||
<el-form-item class="inputs" label="" prop="captcha"> | |||
<el-input v-model="ruleForm2.captcha" auto-complete="off" placeholder="看不清?点击图片刷新"> | |||
</el-input> | |||
<div class="refreImg"> | |||
<img alt="" :src="src" @click="refreshCode"> | |||
</div> | |||
</el-form-item> | |||
<el-form-item> | |||
<el-button class="login-btn" :loading="submitButton" type="primary" @click="login('ruleForm2')">登录</el-button> | |||
</el-form-item> | |||
</el-form> | |||
<div style="position: absolute;top: 96%;right: 2%;color: #fff;" id="_version"></div> | |||
</div> | |||
</div> | |||
</template> | |||
<script> | |||
import AjaxUtil from "../../core/tool/ajaxService"; | |||
import Util from "../../core/tool/commonUtil"; | |||
import { configUrl } from "./../../utils/config.js"; | |||
export default { | |||
extends: AjaxUtil, | |||
name: "Login", | |||
data() { | |||
return { | |||
submitButton:false, | |||
src: '', | |||
ruleForm2: { | |||
username: '', | |||
password: '', | |||
captcha: '' | |||
}, | |||
rules2: { | |||
username: [{ | |||
required: true, | |||
message: '抱歉,不能识别您输入的账号', | |||
trigger: 'blur' | |||
}], | |||
password: [{ | |||
required: true, | |||
message: '抱歉,不能识别您输入的密码', | |||
trigger: 'blur' | |||
}], | |||
captcha: [{ | |||
required: true, | |||
message: '抱歉,不能识别您输入的验证码', | |||
trigger: 'blur' | |||
}], | |||
} | |||
}; | |||
}, | |||
methods: { | |||
login: function () { | |||
this.submitButton = true | |||
let name = this.ruleForm2.username; | |||
let pwd = this.ruleForm2.password; | |||
let captcha = this.ruleForm2.captcha; | |||
this.postFetch(configUrl.doLogin, { | |||
username: name, | |||
password: pwd, | |||
captcha: captcha, | |||
}) | |||
.then(d => { | |||
console.log(d) | |||
this.submitButton = false | |||
this.showNotify("success", "欢迎进入小程序第三方管理平台", "登录成功"); | |||
Util.cookie.setCookie("uname", d.data.username); | |||
this.$router.push({ | |||
path: "/layout" | |||
}); | |||
}) | |||
.catch((err) => { | |||
this.submitButton = false | |||
this.refreshCode(); | |||
this.$message.error(err.data); | |||
}); | |||
}, | |||
refreshCode: function () { | |||
this.src = configUrl.captcha+"?t=" + Date(); | |||
console.log(this.src); | |||
} | |||
}, | |||
created() { | |||
this.refreshCode(); | |||
}, | |||
mounted() { | |||
let metas = document.getElementsByTagName("meta"); | |||
let version = ""; | |||
for (let index = 0; index < metas.length; index++) { | |||
if (metas[index].getAttribute("name") == "version") { | |||
version = metas[index].getAttribute("content"); | |||
break; | |||
} | |||
} | |||
console.log(configUrl.getversion,"configUrl.getversion"); | |||
this.getFetch(configUrl.getversion).then(d=>{ | |||
console.log(d,22222) | |||
document.getElementById("_version").innerHTML = "version:"+ version.substr(4) + "." + d.data.split('_')[1] ; | |||
}).catch(e=>{ | |||
document.getElementById("_version").innerHTML = "version:"+ version.substr(4); | |||
}) | |||
}, | |||
} | |||
</script> | |||
<style scoped> | |||
.qrcode{ | |||
width: 36px; | |||
position: absolute; | |||
right: 7px; | |||
top: 5px; | |||
z-index: 1000; | |||
} | |||
#login_container{ | |||
position: absolute; | |||
left: 0; | |||
right: 0; | |||
margin: auto; | |||
top: 0; | |||
bottom:0; | |||
} | |||
.inputs{ | |||
width: 315px; | |||
height: 44px; | |||
margin: 0 auto 22px; | |||
line-height: 44px; | |||
} | |||
.el-input__inner { | |||
font-size: 16px !important; | |||
color: rgb(0, 0, 0, 0.25) !important; | |||
padding: 0 35px !important; | |||
} | |||
.refreImg img { | |||
width: 100%; | |||
height: 100%; | |||
border-radius: 2px; | |||
cursor: pointer; | |||
} | |||
a { | |||
text-decoration: none; | |||
} | |||
.frechBox { | |||
display: block; | |||
margin-top: -10px; | |||
} | |||
.refreImg { | |||
width: 38.2%; | |||
height: 40px; | |||
/* line-height: 20px; */ | |||
position: absolute; | |||
z-index: 1000; | |||
right: 0; | |||
top: -1px; | |||
background-color: #ededed; | |||
} | |||
.bg { | |||
background: url(../../static/images/login-bg.png) no-repeat; | |||
position: fixed; | |||
top: 0; | |||
left: 0; | |||
right: 0; | |||
bottom: 0; | |||
background-size: cover; | |||
} | |||
.login h1 { | |||
font-size: 22px; | |||
font-weight:400; | |||
color:rgba(85,85,85,1); | |||
line-height: 24px; | |||
margin-bottom: 28px; | |||
} | |||
.login-item { | |||
width: 368px; | |||
margin: 0 auto; | |||
height: 40px; | |||
margin-bottom: 16px; | |||
border: 1px solid #D9D9D9; | |||
border-radius: 4px; | |||
box-sizing: border-box; | |||
overflow: hidden; | |||
position: relative; | |||
} | |||
.login-item input { | |||
width: 100%; | |||
line-height: 38px; | |||
background: #fff; | |||
font-size: 16px; | |||
color: rgba(0, 0, 0, 0.25); | |||
padding: 0 0 0 36px; | |||
display: block; | |||
border: none; | |||
outline: none; | |||
} | |||
.login-btn { | |||
width: 315px; | |||
line-height: 44px; | |||
background: #3FC497; | |||
text-align: center; | |||
border-radius: 4px; | |||
font-size: 16px; | |||
color: #fff; | |||
padding: 0; | |||
border: none; | |||
cursor: pointer; | |||
margin: 0 auto; | |||
} | |||
.forgot-password { | |||
color: rgba(24, 144, 255, 1); | |||
width: 368px; | |||
margin: 0 auto; | |||
text-align: right; | |||
line-height: 22px; | |||
margin-bottom: 4px; | |||
} | |||
.forgot-password label { | |||
font-weight: 400 !important; | |||
font-size: 14px; | |||
cursor: pointer; | |||
margin-right: 26px; | |||
color:#555; | |||
} | |||
.el-input__inner { | |||
font-size: 16px !important; | |||
color: rgb(0, 0, 0, 0.25) !important; | |||
padding: 0 35px !important; | |||
} | |||
.login { | |||
background: #f9fafc; | |||
border-radius:6px; | |||
overflow: hidden; | |||
width: 375px; | |||
position: relative; | |||
left: 50%; | |||
top: 50%; | |||
height: 340px; | |||
transform: translate(-50%,-50%); | |||
-webkit-transform:translate(-50%,-50%); | |||
box-shadow:0px 3px 24px 0px rgba(0, 0, 0, 0.24); | |||
} | |||
</style> |
@@ -0,0 +1,379 @@ | |||
<template> | |||
<div> | |||
<el-dialog | |||
:title="title" | |||
:visible="dialogVisible" | |||
width="800px" | |||
:before-close="closeDialog" | |||
:modal-append-to-body="false" | |||
class="fx_dialog_list_chooseSH" | |||
> | |||
<div class="search"> | |||
<el-form :inline="true" :model="ruleForm" ref="ruleForm" class="demo-form-inline" label-position="right"> | |||
<el-form-item label="小程序类型" prop="type" class="fx_send"> | |||
<el-select v-model="ruleForm.type" placeholder="请选择" @change="selectValue" > | |||
<el-option v-for="(item,index) in appType" :disabled="disabled" :key="index" :value="item.value" :label="item.name"></el-option> | |||
</el-select> | |||
</el-form-item> | |||
<el-form-item label="小程序名称" prop="name" class="fx_title"> | |||
<el-input v-model="ruleForm.name" placeholder="请输入" clearable></el-input> | |||
</el-form-item> | |||
<el-form-item> | |||
<el-button | |||
class="hoverBtn" | |||
type="primary" | |||
icon="el-icon-search" | |||
size="medium" | |||
@click="search" | |||
></el-button> | |||
</el-form-item> | |||
<h4 v-if="formwhere == 'reviewApp'" style="color:red;padding-top: 18px;margin-top:2px!important;line-height:40px;">1.请选择小程序的版本号: <el-form-item prop="type" class="fx_send"> | |||
<el-select v-model="ruleForm.version" placeholder="请选择" > | |||
<el-option v-for="(item,index) in version" :disabled="disabled" :key="index" :value="item.version" :label="item.version"></el-option> | |||
</el-select> | |||
</el-form-item></h4> | |||
</el-form> | |||
<h4 style="color:red;margin-bottom:10px!important;" v-if="formwhere == 'reviewApp'">2.请选择需要提交审核的小程序</h4> | |||
</div> | |||
<table-list :ref="tKey" :options="optionsTable"></table-list> | |||
<span slot="footer" class="dialog-footer"> | |||
<el-button class="draftBtn" @click="dialogVisible = false">取 消</el-button> | |||
<el-button class="putinBtn" @click="getSelected()">确 定</el-button> | |||
</span> | |||
</el-dialog> | |||
</div> | |||
</template> | |||
<script> | |||
import TableList from "../../../core/comps/table/tableList.vue"; | |||
import commonUtil from "../../../core/tool/commonUtil.js"; | |||
import { configUrl } from "./../../../utils/config.js"; | |||
import { CacheData } from "./../../../service/couponData/data.js" | |||
export default { | |||
inject: ["reload"], | |||
name: "chooseApp", | |||
props: ["cb","params"], | |||
components: { TableList}, | |||
data() { | |||
return { | |||
dialogVisible: false, | |||
title:"", | |||
version:[], | |||
realversion:this.childversion, | |||
disabled:false, | |||
formwhere:"", | |||
tKey: "chooseApp", | |||
ruleForm: { | |||
name: '', | |||
type:1, | |||
version:"" | |||
}, | |||
businessData:[], | |||
optionsTable: { | |||
singleSelected: false, | |||
showCk: true, | |||
map: [ | |||
{ key: "id", val: "编号"}, | |||
{ key: "headImg", val: "小程序图标",etype:"img"}, | |||
{ key: "name", val: "小程序名称"}, | |||
{ key: "authorizerAppid", val: "授权方appid"}, | |||
{key:"authorizationStatus",val:"授权状态",convert:this.authStatus}, | |||
{key:"type",val:"小程序类型",convert:this.cAppType}, | |||
], | |||
getUrl:() => { | |||
return configUrl.weappList + "?type=" + this.ruleForm.type+"&name="+this.ruleForm.name; | |||
}, | |||
pageOption: { | |||
sizeKey: "pageSize", | |||
indexKey: "pageNum", | |||
index: 1, | |||
size: 10 | |||
}, | |||
analysis: data => { | |||
console.log(data) | |||
return { | |||
data: data.data.list, | |||
count: data.data.total | |||
}; | |||
} | |||
} | |||
}; | |||
}, | |||
computed:{ | |||
appType:()=>{ | |||
return CacheData.appType; | |||
}, | |||
}, | |||
methods: { | |||
//批量状态查询 | |||
searchAudit(flag) { | |||
console.log(flag) | |||
this.paramers = flag; | |||
this.$refs[this.tKey].openDialog(flag); | |||
}, | |||
selectValue(value){ | |||
console.log(value); | |||
this.$refs[this.tKey].search(value); | |||
console.log(value); | |||
/** | |||
* 点击批量提交小程序审核按钮进来的 | |||
*/ | |||
if(this.formwhere == 'reviewApp'){ | |||
this.version = []; | |||
this.ruleForm.version = ""; | |||
this.getFetch(configUrl.codeVersionList+"?type="+value).then(res=>{ | |||
console.log(res) | |||
this.version = res.data; | |||
}).catch(err=>{ | |||
console.log(err); | |||
}) | |||
} | |||
}, | |||
//小程序类型转换 | |||
cAppType(col,item,flag) { | |||
console.log(flag) | |||
let res = CacheData.appType.filter(e => { | |||
return e.value == item.type; | |||
})[0]; | |||
console.log(res) | |||
if (res) { | |||
return res.name; | |||
} else { | |||
return "小程序类型无效"; | |||
} | |||
return res.name; | |||
}, | |||
//小程序授权状态 | |||
authStatus(col, item){ | |||
console.log(item) | |||
let res = CacheData.authorizationStatus.filter(e => { | |||
return e.value == item.authorizationStatus.toString(); | |||
})[0]; | |||
console.log(res) | |||
if (res) { | |||
return res.name; | |||
} else { | |||
return "小程序授权状态无效"; | |||
} | |||
return res.name; | |||
}, | |||
openDialog(from) { | |||
this.dialogVisible = true; | |||
if(from!=undefined){ | |||
let froms = JSON.parse(from); | |||
if(froms.from=='fromHomePage'){ | |||
this.formwhere = froms.from; | |||
if(this.formwhere == 'fromHomePage'){ | |||
this.title = "批量基础配置"; | |||
} | |||
}else if(froms.from=='reviewApp'){ | |||
this.formwhere = froms.from; | |||
if(this.formwhere == 'reviewApp'){ | |||
this.title = "批量提交小程序审核"; | |||
} | |||
this.getFetch(configUrl.codeVersionList+"?type="+this.ruleForm.type).then(res=>{ | |||
console.log(res) | |||
this.version = res.data; | |||
}).catch(err=>{ | |||
console.log(err); | |||
}) | |||
}else{ | |||
this.title = "版本号:"+JSON.parse(from).userVersion; | |||
console.log(JSON.parse(from).userVersion.charAt(0)) | |||
if(JSON.parse(from).userVersion.charAt(0)=='B'){ | |||
this.ruleForm.type = 1; | |||
this.disabled = true; | |||
}else if(JSON.parse(from).userVersion.charAt(0)=='C'){ | |||
this.ruleForm.type = 2; | |||
this.disabled = true; | |||
} | |||
if(this.$refs[this.tKey]){ | |||
this.search() | |||
} | |||
} | |||
} | |||
}, | |||
closeDialog() { | |||
this.dialogVisible = false; | |||
}, | |||
search: function() { | |||
let tKey = this.$refs[this.tKey]; | |||
tKey.search(tKey.getParams().index); | |||
}, | |||
//确定 | |||
getSelected() { | |||
let items = this.$refs[this.tKey].getCheckedItems("authorizerAppid"); | |||
if (items.data.length == 0) { | |||
if(this.formwhere == 'fromHomePage'){ | |||
this.title = "批量基础配置" | |||
this.$message({ | |||
type: "error", | |||
message: "请选择需要配置的小程序" | |||
}); | |||
}else if(this.formwhere == 'reviewApp'){ | |||
this.title = "批量提交小程序审核" | |||
this.$message({ | |||
type: "error", | |||
message: "请选择需要提交审核的小程序" | |||
}); | |||
}else if(this.ruleForm.type == ""){ | |||
this.$message({ | |||
type: "error", | |||
message: "请选择小程序的类型" | |||
}); | |||
}else{ | |||
this.$message({ | |||
type: "error", | |||
message: "请选择需要发布的小程序" | |||
}); | |||
} | |||
return; | |||
}else if(this.ruleForm.version==""&&this.formwhere == 'reviewApp'){ | |||
this.$message({ | |||
type: "error", | |||
message: "请选择小程序的版本号" | |||
}); | |||
return; | |||
}else { | |||
let apps = JSON.stringify(items.vals).replace(/\[|]/g,'').replace(/\"/g, ""); | |||
if(this.formwhere == 'fromHomePage'){ | |||
let parmer = { | |||
apps:apps, | |||
type:this.ruleForm.type, | |||
} | |||
this.postFetch(configUrl.batchBasicSet,parmer).then(res=>{ | |||
console.log(res) | |||
this.$message({ | |||
type: "success", | |||
message: "配置成功" | |||
}); | |||
this.dialogVisible = false; | |||
}).catch(err=>{ | |||
this.$message({ | |||
type: "error", | |||
message: err.data | |||
}); | |||
this.dialogVisible = true; | |||
}) | |||
} | |||
else if(this.formwhere == 'reviewApp'){ | |||
let parmer = { | |||
apps:apps, | |||
userVersion:this.ruleForm.version, | |||
} | |||
this.postFetch(configUrl.batchCodeAudit,parmer).then(res=>{ | |||
console.log(res) | |||
this.$message({ | |||
type: "success", | |||
message: "提交审核成功" | |||
}); | |||
this.dialogVisible = false; | |||
this.search(); | |||
}).catch(err=>{ | |||
console.log(err) | |||
this.$message({ | |||
type: "error", | |||
message: err.data | |||
}); | |||
this.dialogVisible = true; | |||
}) | |||
}else{ | |||
let paramers = JSON.parse(this.params); | |||
let params = { | |||
apps:apps, | |||
templateId:paramers.templateId, | |||
userVersion:paramers.userVersion, | |||
userDesc:paramers.userDesc, | |||
} | |||
console.log(params.apps) | |||
this.postFetch(configUrl.batchCodeCommit,params).then(res=>{ | |||
console.log(res) | |||
this.$message({ | |||
type: "success", | |||
message: "提交代码成功" | |||
}); | |||
}).catch(err=>{ | |||
this.$message({ | |||
type: "error", | |||
message: err.data | |||
}); | |||
}) | |||
this.dialogVisible = false; | |||
} | |||
} | |||
} | |||
}, | |||
}; | |||
</script> | |||
<style scoped> | |||
.version{ | |||
color: red; | |||
font-size: 16px; | |||
} | |||
.fx_dialog_list_chooseSH .el-dialog .el-dialog__footer .dialog-footer .draftBtn, | |||
.fx_dialog_list_chooseSH | |||
.el-dialog | |||
.el-dialog__footer | |||
.dialog-footer | |||
.putinBtn { | |||
width: 76px; | |||
height: 35px; | |||
font-size: 14px; | |||
padding: 10px 20px; | |||
} | |||
.fx_dialog_list_chooseSH | |||
.el-dialog | |||
.el-dialog__footer | |||
.dialog-footer | |||
.draftBtn { | |||
margin-right: 7.5px; | |||
background: #ffffff; | |||
color: #555555; | |||
border: 1px solid #e1e6ea; | |||
} | |||
.fx_dialog_list_chooseSH | |||
.el-dialog | |||
.el-dialog__footer | |||
.dialog-footer | |||
.putinBtn { | |||
margin-left: 7.5px; | |||
background: #c85963; | |||
color: #ffffff; | |||
} | |||
.fx_dialog_list_chooseSH | |||
.el-dialog | |||
.el-dialog__footer | |||
.dialog-footer | |||
.draftBtn:hover { | |||
background: #ffffff; | |||
} | |||
.fx_dialog_list_chooseSH | |||
.el-dialog | |||
.el-dialog__footer | |||
.dialog-footer | |||
.putinBtn:hover { | |||
background: #e26972; | |||
} | |||
.fx_dialog_list_chooseSH | |||
.el-dialog | |||
.el-dialog__footer | |||
.dialog-footer | |||
.draftBtn:active { | |||
background: #e1e2e2; | |||
} | |||
.fx_dialog_list_chooseSH | |||
.el-dialog | |||
.el-dialog__footer | |||
.dialog-footer | |||
.putinBtn:active { | |||
background: #bf585f; | |||
} | |||
.search{ | |||
width: 100%; | |||
text-align: left; | |||
} | |||
.search .el-form-item{ | |||
margin-bottom: 0; | |||
} | |||
</style> |
@@ -0,0 +1,234 @@ | |||
<template> | |||
<div> | |||
<el-dialog | |||
:title="title" | |||
:visible="dialogVisible" | |||
width="800px" | |||
:before-close="closeDialog" | |||
:modal-append-to-body="false" | |||
class="fx_dialog_list_chooseSH"> | |||
<div style="width:100%"> | |||
<table-list :ref="tKey" :options="optionsTable"></table-list> | |||
</div> | |||
<span slot="footer" class="dialog-footer"> | |||
<el-button class="draftBtn" @click="dialogVisible = false">取 消</el-button> | |||
<el-button class="putinBtn" @click="childversion">确 定</el-button> | |||
</span> | |||
</el-dialog> | |||
</div> | |||
</template> | |||
<script> | |||
import TableList from "../../../core/comps/table/tableList.vue"; | |||
import commonUtil from "../../../core/tool/commonUtil.js"; | |||
import { configUrl } from "./../../../utils/config.js"; | |||
import { CacheData } from "./../../../service/couponData/data.js"; | |||
export default { | |||
inject: ["reload"], | |||
name: "chooseVersion", | |||
props: ["tKey", "cb"], | |||
components: { TableList }, | |||
data() { | |||
return { | |||
dialogVisible: false, | |||
title:"", | |||
brands:[], | |||
flag:"", | |||
ruleForm: { | |||
authorizerAppid: '', | |||
type:"" | |||
}, | |||
businessData:[], | |||
optionsTable: { | |||
singleSelected: true, | |||
showCk: true, | |||
map: [ | |||
{ key: "version", val: "小程序版本号"} | |||
], | |||
getUrl:() => { | |||
//批量撤回审核 | |||
if(this.flag == 'batchrevertStatus'){ | |||
return configUrl.auditVersionList; | |||
}else if(this.flag == 'batchsearchStatus'){ | |||
return configUrl.codeVersionList; | |||
}else if(this.flag == 'batchRelease'){ | |||
return configUrl.auditVersionList+"?status=0"; | |||
} | |||
}, | |||
pageOption: { | |||
showIf:false, | |||
sizeKey: "pageSize", | |||
indexKey: "pageNum", | |||
index: 1, | |||
size: 10 | |||
}, | |||
analysis: data => { | |||
console.log(data.data); | |||
return { | |||
data: data.data | |||
}; | |||
} | |||
} | |||
}; | |||
}, | |||
computed:{ | |||
appType:()=>{ | |||
return CacheData.appType; | |||
}, | |||
}, | |||
methods: { | |||
//小程序类型转换 | |||
cAppType(col, item) { | |||
console.log(item) | |||
let res = CacheData.appType.filter(e => { | |||
return e.value == item.type; | |||
})[0]; | |||
console.log(res) | |||
if (res) { | |||
return res.name; | |||
} else { | |||
return "小程序类型无效"; | |||
} | |||
return res.name; | |||
}, | |||
search: function() { | |||
let tKey = this.$refs[this.tKey]; | |||
tKey.search(tKey.getParams().index); | |||
}, | |||
openDialog(flag) { | |||
this.flag = flag; | |||
this.data = []; | |||
if(this.flag == 'batchrevertStatus'){ | |||
this.title ='批量撤回小程序审核'; | |||
}else if(this.flag == 'batchsearchStatus'){ | |||
this.title ='批量查询小程序审核状态'; | |||
}else if(this.flag == 'batchRelease'){ | |||
this.title ='批量发布小程序'; | |||
} | |||
this.dialogVisible = true; | |||
}, | |||
closeDialog() { | |||
this.dialogVisible = false; | |||
}, | |||
//请选择小程序的版本 | |||
childversion() { | |||
let items = this.$refs[this.tKey].getCheckedItems("version"); | |||
if (items.data.length != 1) { | |||
this.$message({ | |||
type: "error", | |||
message: "请选择小程序的版本号!" | |||
}); | |||
return; | |||
} else { | |||
let params = { | |||
version:JSON.stringify(items.vals).replace(/\[|]/g,'').replace(/\"/g, "") | |||
}; | |||
let postUrl = ""; | |||
if(this.flag == 'batchsearchStatus'){ | |||
//批量查询审核状态 | |||
postUrl = configUrl.batchAuditQuery; | |||
}else if(this.flag == 'batchrevertStatus'){ | |||
//批量撤回审核 | |||
postUrl = configUrl.batchAuditCancel; | |||
}else if(this.flag == 'batchRelease'){ | |||
//批量发布小程序 | |||
postUrl = configUrl.batchRelease; | |||
} | |||
if(this.flag == 'batchsearchStatus'||this.flag == 'batchrevertStatus'||this.flag == 'batchRelease'){ | |||
this.postFetch(postUrl,params).then(res=>{ | |||
if(this.flag == 'batchsearchStatus'){ | |||
this.$message({ | |||
type: "success", | |||
message: "批量查询审核状态成功!" | |||
}) | |||
}else if(this.flag == 'batchrevertStatus'){ | |||
this.$message({ | |||
type: "success", | |||
message: "批量撤回审核成功!" | |||
}) | |||
}else if(this.flag == 'batchRelease'){ | |||
this.$message({ | |||
type: "success", | |||
message: "批量发布小程序成功!" | |||
}) | |||
} | |||
}).catch(err=>{ | |||
this.$message({ | |||
type: "error", | |||
message: err.data, | |||
}); | |||
}) | |||
} | |||
} | |||
this.dialogVisible = false; | |||
} | |||
} | |||
}; | |||
</script> | |||
<style scoped> | |||
.fx_dialog_list_chooseSH .el-dialog .el-dialog__footer .dialog-footer .draftBtn, | |||
.fx_dialog_list_chooseSH | |||
.el-dialog | |||
.el-dialog__footer | |||
.dialog-footer | |||
.putinBtn { | |||
width: 76px; | |||
height: 35px; | |||
font-size: 14px; | |||
padding: 10px 20px; | |||
} | |||
.fx_dialog_list_chooseSH | |||
.el-dialog | |||
.el-dialog__footer | |||
.dialog-footer | |||
.draftBtn { | |||
margin-right: 7.5px; | |||
background: #ffffff; | |||
color: #555555; | |||
border: 1px solid #e1e6ea; | |||
} | |||
.fx_dialog_list_chooseSH | |||
.el-dialog | |||
.el-dialog__footer | |||
.dialog-footer | |||
.putinBtn { | |||
margin-left: 7.5px; | |||
background: #c85963; | |||
color: #ffffff; | |||
} | |||
.fx_dialog_list_chooseSH | |||
.el-dialog | |||
.el-dialog__footer | |||
.dialog-footer | |||
.draftBtn:hover { | |||
background: #ffffff; | |||
} | |||
.fx_dialog_list_chooseSH | |||
.el-dialog | |||
.el-dialog__footer | |||
.dialog-footer | |||
.putinBtn:hover { | |||
background: #e26972; | |||
} | |||
.fx_dialog_list_chooseSH | |||
.el-dialog | |||
.el-dialog__footer | |||
.dialog-footer | |||
.draftBtn:active { | |||
background: #e1e2e2; | |||
} | |||
.fx_dialog_list_chooseSH | |||
.el-dialog | |||
.el-dialog__footer | |||
.dialog-footer | |||
.putinBtn:active { | |||
background: #bf585f; | |||
} | |||
.search{ | |||
width: 100%; | |||
height: 50px; | |||
text-align: left; | |||
margin-left: 20px; | |||
} | |||
</style> |
@@ -0,0 +1,181 @@ | |||
<template> | |||
<div> | |||
<el-dialog | |||
title="批量发布小程序" | |||
:visible="dialogVisible" | |||
width="800px" | |||
:before-close="closeDialog" | |||
:modal-append-to-body="false" | |||
class="fx_dialog_list_chooseSH"> | |||
<div style="width:100%"> | |||
<table-list :ref="tKey" :options="optionsTable"></table-list> | |||
</div> | |||
<span slot="footer" class="dialog-footer"> | |||
<el-button class="draftBtn" @click="dialogVisible = false">取 消</el-button> | |||
<el-button class="putinBtn" @click="childversion">确 定</el-button> | |||
</span> | |||
</el-dialog> | |||
</div> | |||
</template> | |||
<script> | |||
import TableList from "../../../core/comps/table/tableList.vue"; | |||
import commonUtil from "../../../core/tool/commonUtil.js"; | |||
import { configUrl } from "./../../../utils/config.js"; | |||
import { CacheData } from "./../../../service/couponData/data.js"; | |||
export default { | |||
inject: ["reload"], | |||
name: "chooseVersionRelease", | |||
props: ["tKey", "cb"], | |||
components: { TableList }, | |||
data() { | |||
return { | |||
dialogVisible: false, | |||
title:"", | |||
brands:[], | |||
flag:"", | |||
ruleForm: { | |||
authorizerAppid: '', | |||
type:"" | |||
}, | |||
businessData:[], | |||
optionsTable: { | |||
singleSelected: true, | |||
showCk: true, | |||
map: [ | |||
{ key: "version", val: "小程序版本号"} | |||
], | |||
getUrl:() => { | |||
//批量撤回审核 | |||
return configUrl.auditVersionList+"?status=0"; | |||
}, | |||
pageOption: { | |||
showIf:false, | |||
sizeKey: "pageSize", | |||
indexKey: "pageNum", | |||
index: 1, | |||
size: 10 | |||
}, | |||
analysis: data => { | |||
console.log(data.data); | |||
return { | |||
data: data.data | |||
}; | |||
} | |||
} | |||
}; | |||
}, | |||
computed:{ | |||
appType:()=>{ | |||
return CacheData.appType; | |||
}, | |||
}, | |||
methods: { | |||
search: function() { | |||
let tKey = this.$refs[this.tKey]; | |||
tKey.search(tKey.getParams().index); | |||
}, | |||
openDialog() { | |||
this.dialogVisible = true; | |||
}, | |||
closeDialog() { | |||
this.dialogVisible = false; | |||
}, | |||
//请选择小程序的版本 | |||
childversion() { | |||
let items = this.$refs[this.tKey].getCheckedItems("version"); | |||
if (items.data.length != 1) { | |||
this.$message({ | |||
type: "error", | |||
message: "请选择小程序的版本号!" | |||
}); | |||
return; | |||
} else { | |||
let params = { | |||
version:JSON.stringify(items.vals).replace(/\[|]/g,'').replace(/\"/g, "") | |||
}; | |||
let postUrl = configUrl.batchRelease; | |||
this.postFetch(postUrl,params).then(res=>{ | |||
this.$message({ | |||
type: "success", | |||
message: "批量发布小程序成功!" | |||
}) | |||
}).catch(err=>{ | |||
this.$message({ | |||
type: "error", | |||
message: err.data, | |||
}); | |||
}) | |||
} | |||
this.dialogVisible = false; | |||
} | |||
} | |||
}; | |||
</script> | |||
<style scoped> | |||
.fx_dialog_list_chooseSH .el-dialog .el-dialog__footer .dialog-footer .draftBtn, | |||
.fx_dialog_list_chooseSH | |||
.el-dialog | |||
.el-dialog__footer | |||
.dialog-footer | |||
.putinBtn { | |||
width: 76px; | |||
height: 35px; | |||
font-size: 14px; | |||
padding: 10px 20px; | |||
} | |||
.fx_dialog_list_chooseSH | |||
.el-dialog | |||
.el-dialog__footer | |||
.dialog-footer | |||
.draftBtn { | |||
margin-right: 7.5px; | |||
background: #ffffff; | |||
color: #555555; | |||
border: 1px solid #e1e6ea; | |||
} | |||
.fx_dialog_list_chooseSH | |||
.el-dialog | |||
.el-dialog__footer | |||
.dialog-footer | |||
.putinBtn { | |||
margin-left: 7.5px; | |||
background: #c85963; | |||
color: #ffffff; | |||
} | |||
.fx_dialog_list_chooseSH | |||
.el-dialog | |||
.el-dialog__footer | |||
.dialog-footer | |||
.draftBtn:hover { | |||
background: #ffffff; | |||
} | |||
.fx_dialog_list_chooseSH | |||
.el-dialog | |||
.el-dialog__footer | |||
.dialog-footer | |||
.putinBtn:hover { | |||
background: #e26972; | |||
} | |||
.fx_dialog_list_chooseSH | |||
.el-dialog | |||
.el-dialog__footer | |||
.dialog-footer | |||
.draftBtn:active { | |||
background: #e1e2e2; | |||
} | |||
.fx_dialog_list_chooseSH | |||
.el-dialog | |||
.el-dialog__footer | |||
.dialog-footer | |||
.putinBtn:active { | |||
background: #bf585f; | |||
} | |||
.search{ | |||
width: 100%; | |||
height: 50px; | |||
text-align: left; | |||
margin-left: 20px; | |||
} | |||
</style> |
@@ -0,0 +1,181 @@ | |||
<template> | |||
<div> | |||
<el-dialog | |||
title="批量查询小程序审核状态" | |||
:visible="dialogVisible" | |||
width="800px" | |||
:before-close="closeDialog" | |||
:modal-append-to-body="false" | |||
class="fx_dialog_list_chooseSH"> | |||
<div style="width:100%"> | |||
<table-list :ref="tKey" :options="optionsTable"></table-list> | |||
</div> | |||
<span slot="footer" class="dialog-footer"> | |||
<el-button class="draftBtn" @click="dialogVisible = false">取 消</el-button> | |||
<el-button class="putinBtn" @click="childversion">确 定</el-button> | |||
</span> | |||
</el-dialog> | |||
</div> | |||
</template> | |||
<script> | |||
import TableList from "../../../core/comps/table/tableList.vue"; | |||
import commonUtil from "../../../core/tool/commonUtil.js"; | |||
import { configUrl } from "./../../../utils/config.js"; | |||
import { CacheData } from "./../../../service/couponData/data.js"; | |||
export default { | |||
inject: ["reload"], | |||
name: "chooseVersioncheck", | |||
props: ["tKey", "cb"], | |||
components: { TableList }, | |||
data() { | |||
return { | |||
dialogVisible: false, | |||
title:"", | |||
brands:[], | |||
flag:"", | |||
ruleForm: { | |||
authorizerAppid: '', | |||
type:"" | |||
}, | |||
businessData:[], | |||
optionsTable: { | |||
singleSelected: true, | |||
showCk: true, | |||
map: [ | |||
{ key: "version", val: "小程序版本号"} | |||
], | |||
getUrl:() => { | |||
//批量撤回审核 | |||
return configUrl.auditVersionList; | |||
}, | |||
pageOption: { | |||
showIf:false, | |||
sizeKey: "pageSize", | |||
indexKey: "pageNum", | |||
index: 1, | |||
size: 10 | |||
}, | |||
analysis: data => { | |||
console.log(data.data); | |||
return { | |||
data: data.data | |||
}; | |||
} | |||
} | |||
}; | |||
}, | |||
computed:{ | |||
appType:()=>{ | |||
return CacheData.appType; | |||
}, | |||
}, | |||
methods: { | |||
search: function() { | |||
let tKey = this.$refs[this.tKey]; | |||
tKey.search(tKey.getParams().index); | |||
}, | |||
openDialog() { | |||
this.dialogVisible = true; | |||
}, | |||
closeDialog() { | |||
this.dialogVisible = false; | |||
}, | |||
//请选择小程序的版本 | |||
childversion() { | |||
let items = this.$refs[this.tKey].getCheckedItems("version"); | |||
if (items.data.length != 1) { | |||
this.$message({ | |||
type: "error", | |||
message: "请选择小程序的版本号!" | |||
}); | |||
return; | |||
} else { | |||
let params = { | |||
version:JSON.stringify(items.vals).replace(/\[|]/g,'').replace(/\"/g, "") | |||
}; | |||
let postUrl = configUrl.batchAuditQuery; | |||
this.postFetch(postUrl,params).then(res=>{ | |||
this.$message({ | |||
type: "success", | |||
message: "批量查询审核状态成功!" | |||
}) | |||
}).catch(err=>{ | |||
this.$message({ | |||
type: "error", | |||
message: err.data, | |||
}); | |||
}) | |||
} | |||
this.dialogVisible = false; | |||
} | |||
} | |||
}; | |||
</script> | |||
<style scoped> | |||
.fx_dialog_list_chooseSH .el-dialog .el-dialog__footer .dialog-footer .draftBtn, | |||
.fx_dialog_list_chooseSH | |||
.el-dialog | |||
.el-dialog__footer | |||
.dialog-footer | |||
.putinBtn { | |||
width: 76px; | |||
height: 35px; | |||
font-size: 14px; | |||
padding: 10px 20px; | |||
} | |||
.fx_dialog_list_chooseSH | |||
.el-dialog | |||
.el-dialog__footer | |||
.dialog-footer | |||
.draftBtn { | |||
margin-right: 7.5px; | |||
background: #ffffff; | |||
color: #555555; | |||
border: 1px solid #e1e6ea; | |||
} | |||
.fx_dialog_list_chooseSH | |||
.el-dialog | |||
.el-dialog__footer | |||
.dialog-footer | |||
.putinBtn { | |||
margin-left: 7.5px; | |||
background: #c85963; | |||
color: #ffffff; | |||
} | |||
.fx_dialog_list_chooseSH | |||
.el-dialog | |||
.el-dialog__footer | |||
.dialog-footer | |||
.draftBtn:hover { | |||
background: #ffffff; | |||
} | |||
.fx_dialog_list_chooseSH | |||
.el-dialog | |||
.el-dialog__footer | |||
.dialog-footer | |||
.putinBtn:hover { | |||
background: #e26972; | |||
} | |||
.fx_dialog_list_chooseSH | |||
.el-dialog | |||
.el-dialog__footer | |||
.dialog-footer | |||
.draftBtn:active { | |||
background: #e1e2e2; | |||
} | |||
.fx_dialog_list_chooseSH | |||
.el-dialog | |||
.el-dialog__footer | |||
.dialog-footer | |||
.putinBtn:active { | |||
background: #bf585f; | |||
} | |||
.search{ | |||
width: 100%; | |||
height: 50px; | |||
text-align: left; | |||
margin-left: 20px; | |||
} | |||
</style> |
@@ -0,0 +1,320 @@ | |||
<template> | |||
<div class="basicConfig"> | |||
<el-dialog | |||
:title="title" | |||
:visible="dialogVisible" | |||
width="800px" | |||
:before-close="closeDialog" | |||
:modal-append-to-body="false" | |||
class="fx_dialog_list_chooseSH"> | |||
<!-- 查询基础配置 --> | |||
<div class="search" v-if="configFlag=='basicFigure'"> | |||
<h3>服务器域名</h3> | |||
<p>request 合法域名:<span v-for="(item,index) in basicData.requestdomainList" :key="index">{{item}}</span></p> | |||
<p>socket 合法域名:<span v-for="(item,index) in basicData.wsrequestdomainList" :key="index">{{item}}</span></p> | |||
<p>uploadFile 合法域名:<span v-for="(item,index) in basicData.uploaddomainList" :key="index">{{item}}</span></p> | |||
<p>downloadFile 合法域名:<span v-for="(item,index) in basicData.downloaddomainList" :key="index">{{item}}</span></p> | |||
<h3>业务域名</h3> | |||
<p><span v-for="(item,index) in webviewdomain" :key="index">{{item}}</span></p> | |||
</div> | |||
<!-- 扩展配置 --> | |||
<div class="search extend" v-if="configFlag=='conFigure'"> | |||
<el-form :inline="false" :model="ruleForm" ref="ruleForm" class="demo-form-inline" label-position="right"> | |||
<el-form-item label="扩展配置" prop="extJson" class="fx_send"> | |||
<el-input | |||
@click.ctrl.alt.native="show('extend')" | |||
type="textarea" | |||
:rows="12" | |||
placeholder="请输入内容" | |||
:disabled="ruleForm.disable" | |||
v-model="ruleForm.extJson"> | |||
</el-input> | |||
</el-form-item> | |||
<el-form-item label="发布配置" prop="releaseJson" class="fx_title"> | |||
<el-input | |||
@click.ctrl.alt.native="show('release')" | |||
type="textarea" | |||
:rows="4" | |||
placeholder="请输入内容" | |||
:disabled="ruleForm.disable1" | |||
v-model="ruleForm.releaseJson"> | |||
</el-input> | |||
</el-form-item> | |||
<el-form-item label="停车配置" v-if="ruleForm.carSupport" prop="carSupport" class="fx_title"> | |||
<el-input | |||
@click.ctrl.alt.native="show('carFlag')" | |||
type="text" | |||
placeholder="" | |||
:disabled="ruleForm.disable2" | |||
v-model="ruleForm.carSupport"> | |||
</el-input> | |||
</el-form-item> | |||
</el-form> | |||
</div> | |||
<div class="search extend" v-if="configFlag=='extendJSON'"> | |||
<el-form :inline="false" :model="ruleForm" ref="ruleForm" class="demo-form-inline" label-position="right"> | |||
<el-form-item label="小程序类型" class="fx_send"> | |||
<el-select v-model="ruleForm.type" placeholder="请选择" clearable> | |||
<el-option v-for="(item,index) in appType" :key="index" :value="item.value" :label="item.name"></el-option> | |||
</el-select> | |||
</el-form-item> | |||
<el-form-item label="扩展配置" prop="extJson " class="fx_send"> | |||
<el-input | |||
type="textarea" | |||
:rows="12" | |||
:disabled="ruleForm.disable3" | |||
placeholder="请输入内容" | |||
v-model="ruleForm.extJson "> | |||
</el-input> | |||
</el-form-item> | |||
</el-form> | |||
</div> | |||
<div slot="footer" class="dialog-footer"> | |||
<el-button class="draftBtn" @click="dialogVisible = false">取 消</el-button> | |||
<el-button class="putinBtn" @click="submit()" v-if="!ruleForm.disable||!ruleForm.disable1||!ruleForm.disable2||!ruleForm.disable3">确 定</el-button> | |||
</div> | |||
</el-dialog> | |||
</div> | |||
</template> | |||
<script> | |||
import commonUtil from "../../../core/tool/commonUtil.js"; | |||
import { configUrl } from "./../../../utils/config.js"; | |||
import { CacheData } from "./../../../service/couponData/data.js"; | |||
export default { | |||
inject: ["reload"], | |||
name: "extend", | |||
props: ["tKey", "cb"], | |||
data() { | |||
return { | |||
configFlag:"", | |||
title:"", | |||
appType:[], | |||
basicData:"", | |||
webviewdomain:"", | |||
dialogVisible: false, | |||
releaseJson:"", | |||
extJson:"", | |||
ruleForm: { | |||
extJson: "", | |||
releaseJson:"", | |||
carSupport:false, | |||
id:"", | |||
appId:"", | |||
disable:true, | |||
disable1:true, | |||
disable2:true, | |||
disable3:false | |||
} | |||
}; | |||
}, | |||
computed:{ | |||
appType: () => { | |||
return CacheData.appType; | |||
}, | |||
}, | |||
methods: { | |||
show(flag){ | |||
if(flag == 'release'){ | |||
if(this.ruleForm.disable1){ | |||
this.ruleForm.disable1 = false | |||
}else{ | |||
this.ruleForm.disable1 = true; | |||
} | |||
}else if(flag == 'extend'){ | |||
if(this.ruleForm.disable){ | |||
this.ruleForm.disable = false | |||
}else{ | |||
this.ruleForm.disable = true | |||
} | |||
}else if(flag == 'carFlag'){ | |||
if(this.ruleForm.disable2){ | |||
this.ruleForm.disable2 = false | |||
}else{ | |||
this.ruleForm.disable2 = true | |||
} | |||
} | |||
}, | |||
search: function() { | |||
let tKey = this.$refs[this.tKey]; | |||
tKey.search(tKey.getParams().index); | |||
}, | |||
openDialog(flag) { | |||
this.ruleForm.disable = true; | |||
this.ruleForm.disable1 = true; | |||
this.basicData = []; | |||
this.webviewdomain = []; | |||
if(flag){ | |||
let flags = JSON.parse(flag); | |||
this.configFlag= flags.flag; | |||
this.ruleForm.appId = flags.appId; | |||
if(flags.flag == 'basicFigure'){ | |||
this.title = '查看基础配置'; | |||
this.getFetch(configUrl.getDomain+"?appId="+flags.appId).then(res=>{ | |||
console.log(res) | |||
this.basicData = res.data; | |||
}).catch(err=>{ | |||
this.$message({ | |||
type:"error", | |||
message:"暂无基础配置信息" | |||
}) | |||
}) | |||
this.getFetch(configUrl.getWebDomain+"?appId="+flags.appId).then(res=>{ | |||
if(res.data){ | |||
this.webviewdomain = JSON.parse(res.data).webviewdomain; | |||
} | |||
}).catch(err=>{ | |||
this.$message({ | |||
type:"error", | |||
message:"暂无基础配置信息" | |||
}) | |||
}) | |||
}else if(flags.flag == 'conFigure'){ | |||
this.title = '扩展配置'; | |||
this.getFetch(configUrl.weappExtSetList+"?pageNum=1&pageSize=10&appId="+flags.appId).then(res=>{ | |||
this.ruleForm.extJson = res.data.list[0].extJson; | |||
this.ruleForm.releaseJson = res.data.list[0].releaseJson; | |||
this.ruleForm.carSupport = res.data.list[0].carSupport; | |||
this.ruleForm.id = res.data.list[0].id; | |||
}).catch(err=>{ | |||
this.$message({ | |||
type:"error", | |||
message:"扩展配置失败" | |||
}) | |||
}) | |||
} | |||
} | |||
this.dialogVisible = true; | |||
}, | |||
closeDialog() { | |||
this.dialogVisible = false; | |||
}, | |||
//小程序扩展配置配置 | |||
submit(){ | |||
this.dialogVisible = false; | |||
let parmers = {} | |||
let url = "" | |||
if(this.configFlag == 'extendJSON'){ | |||
url = configUrl.batchExtendSet; | |||
parmers = { | |||
type:this.ruleForm.type, | |||
extJson:this.ruleForm.extJson | |||
} | |||
if(!parmers.type){ | |||
this.$message({ | |||
type:"error", | |||
message:"请选择小程序类型" | |||
}) | |||
return; | |||
} | |||
if(!parmers.extJson){ | |||
this.$message({ | |||
type:"error", | |||
message:"提交的extJson不能为空" | |||
}) | |||
return; | |||
} | |||
}else{ | |||
url = configUrl.weappExtSetupdate; | |||
parmers = { | |||
appId:this.ruleForm.appId, | |||
id:this.ruleForm.id, | |||
extJson:this.ruleForm.extJson, | |||
releaseJson:this.ruleForm.releaseJson | |||
} | |||
} | |||
this.postFetch(url,parmers).then(res=>{ | |||
this.$message({ | |||
type:"success", | |||
message:"保存成功" | |||
}) | |||
}).catch(error=>{ | |||
this.$message({ | |||
type:"error", | |||
message:error.data | |||
}) | |||
this.ruleForm.disable1 = true; | |||
this.ruleForm.disable = true; | |||
}) | |||
} | |||
} | |||
}; | |||
</script> | |||
<style scoped> | |||
.search span{ | |||
display: block; | |||
} | |||
.extend{ | |||
width: 400px; | |||
} | |||
.fx_dialog_list_chooseSH .el-dialog .el-dialog__footer .dialog-footer .draftBtn, | |||
.fx_dialog_list_chooseSH | |||
.el-dialog | |||
.el-dialog__footer | |||
.dialog-footer | |||
.putinBtn { | |||
width: 76px; | |||
height: 35px; | |||
font-size: 14px; | |||
padding: 10px 20px; | |||
} | |||
.fx_dialog_list_chooseSH | |||
.el-dialog | |||
.el-dialog__footer | |||
.dialog-footer | |||
.draftBtn { | |||
margin-right: 7.5px; | |||
background: #ffffff; | |||
color: #555555; | |||
border: 1px solid #e1e6ea; | |||
} | |||
.fx_dialog_list_chooseSH | |||
.el-dialog | |||
.el-dialog__footer | |||
.dialog-footer | |||
.putinBtn { | |||
margin-left: 7.5px; | |||
background: #c85963; | |||
color: #ffffff; | |||
} | |||
.fx_dialog_list_chooseSH | |||
.el-dialog | |||
.el-dialog__footer | |||
.dialog-footer | |||
.draftBtn:hover { | |||
background: #ffffff; | |||
} | |||
.fx_dialog_list_chooseSH | |||
.el-dialog | |||
.el-dialog__footer | |||
.dialog-footer | |||
.putinBtn:hover { | |||
background: #e26972; | |||
} | |||
.fx_dialog_list_chooseSH | |||
.el-dialog | |||
.el-dialog__footer | |||
.dialog-footer | |||
.draftBtn:active { | |||
background: #e1e2e2; | |||
} | |||
.fx_dialog_list_chooseSH | |||
.el-dialog | |||
.el-dialog__footer | |||
.dialog-footer | |||
.putinBtn:active { | |||
background: #bf585f; | |||
} | |||
.search{ | |||
width: 60%; | |||
text-align: left; | |||
margin-left: 20px; | |||
} | |||
</style> | |||
<style> | |||
.basicConfig .el-dialog__body{ | |||
padding: 0 18px 30px; | |||
} | |||
</style> |
@@ -0,0 +1,154 @@ | |||
<template> | |||
<div class="basicConfig"> | |||
<el-dialog | |||
title="小程序类目列表" | |||
:visible="dialogVisible" | |||
width="800px" | |||
:before-close="closeDialog" | |||
:modal-append-to-body="false" | |||
class="fx_dialog_list_chooseSH"> | |||
<!-- 扩展配置 --> | |||
<div class="search extend"> | |||
<div v-for="(item,index) in categoryList" :key="index" class="model"> | |||
<span>firstClass:{{item.firstClass}}</span> | |||
<span>firstId:{{item.firstId}}</span> | |||
<span>secondClass:{{item.secondClass}}</span> | |||
<span>secondId:{{item.secondId}}</span> | |||
</div> | |||
</div> | |||
<div slot="footer" class="dialog-footer"> | |||
<el-button class="draftBtn" @click="dialogVisible = false">取 消</el-button> | |||
<el-button class="putinBtn" @click="submit()">确 定</el-button> | |||
</div> | |||
</el-dialog> | |||
</div> | |||
</template> | |||
<script> | |||
import commonUtil from "../../../core/tool/commonUtil.js"; | |||
import { configUrl } from "./../../../utils/config.js"; | |||
export default { | |||
inject: ["reload"], | |||
name: "getcategory", | |||
props: ["tKey", "cb"], | |||
data() { | |||
return { | |||
dialogVisible:false, | |||
categoryList: [] | |||
}; | |||
}, | |||
methods: { | |||
openDialog(flag) { | |||
if(flag){ | |||
let appId = JSON.parse(flag).appId; | |||
this.getFetch(configUrl.getCategory+"?appId="+appId).then(res=>{ | |||
if(res.data.categoryList){ | |||
this.categoryList = res.data.categoryList; | |||
} | |||
console.log(res.data.categoryList) | |||
}).catch(err=>{ | |||
this.$message({ | |||
type:"error", | |||
message:"扩展配置失败" | |||
}) | |||
}) | |||
} | |||
this.dialogVisible = true; | |||
}, | |||
closeDialog() { | |||
this.dialogVisible = false; | |||
}, | |||
//确定 | |||
submit(){ | |||
this.dialogVisible = false; | |||
} | |||
}, | |||
mounted: function() {}, | |||
created() { | |||
} | |||
}; | |||
</script> | |||
<style scoped> | |||
.model{ | |||
border: 1px solid #eee; | |||
border-radius:6px; | |||
padding: 10px; | |||
margin-bottom: 10px; | |||
} | |||
.search span{ | |||
display: block; | |||
} | |||
.extend{ | |||
width: 400px; | |||
} | |||
.fx_dialog_list_chooseSH .el-dialog .el-dialog__footer .dialog-footer .draftBtn, | |||
.fx_dialog_list_chooseSH | |||
.el-dialog | |||
.el-dialog__footer | |||
.dialog-footer | |||
.putinBtn { | |||
width: 76px; | |||
height: 35px; | |||
font-size: 14px; | |||
padding: 10px 20px; | |||
} | |||
.fx_dialog_list_chooseSH | |||
.el-dialog | |||
.el-dialog__footer | |||
.dialog-footer | |||
.draftBtn { | |||
margin-right: 7.5px; | |||
background: #ffffff; | |||
color: #555555; | |||
border: 1px solid #e1e6ea; | |||
} | |||
.fx_dialog_list_chooseSH | |||
.el-dialog | |||
.el-dialog__footer | |||
.dialog-footer | |||
.putinBtn { | |||
margin-left: 7.5px; | |||
background: #c85963; | |||
color: #ffffff; | |||
} | |||
.fx_dialog_list_chooseSH | |||
.el-dialog | |||
.el-dialog__footer | |||
.dialog-footer | |||
.draftBtn:hover { | |||
background: #ffffff; | |||
} | |||
.fx_dialog_list_chooseSH | |||
.el-dialog | |||
.el-dialog__footer | |||
.dialog-footer | |||
.putinBtn:hover { | |||
background: #e26972; | |||
} | |||
.fx_dialog_list_chooseSH | |||
.el-dialog | |||
.el-dialog__footer | |||
.dialog-footer | |||
.draftBtn:active { | |||
background: #e1e2e2; | |||
} | |||
.fx_dialog_list_chooseSH | |||
.el-dialog | |||
.el-dialog__footer | |||
.dialog-footer | |||
.putinBtn:active { | |||
background: #bf585f; | |||
} | |||
.search{ | |||
width: 60%; | |||
text-align: left; | |||
margin-left: 20px; | |||
} | |||
</style> | |||
<style> | |||
.basicConfig .el-dialog__body{ | |||
padding: 0 18px 30px; | |||
} | |||
</style> |
@@ -0,0 +1,312 @@ | |||
<template> | |||
<div> | |||
<el-dialog | |||
:title="title" | |||
:visible="dialogVisible" | |||
width="1105px" | |||
:before-close="closeDialog" | |||
:modal-append-to-body="false" | |||
class="fx_dialog_list_chooseSH"> | |||
<div class="search"> | |||
<el-form :inline="true" :model="ruleForm" ref="ruleForm" class="demo-form-inline" label-position="right"> | |||
<el-form-item label="小程序类型" prop="type" class="fx_send"> | |||
<el-select v-model="ruleForm.type" placeholder="请选择" clearable> | |||
<el-option v-for="(item,index) in appType" :key="index" :value="item.value" :label="item.name"></el-option> | |||
</el-select> | |||
</el-form-item> | |||
<el-form-item label="小程序名称" prop="name" class="fx_title"> | |||
<el-input v-model="ruleForm.name" placeholder="请输入" clearable></el-input> | |||
</el-form-item> | |||
<el-form-item> | |||
<el-button | |||
class="hoverBtn" | |||
type="primary" | |||
icon="el-icon-search" | |||
size="medium" | |||
@click="search" | |||
></el-button> | |||
</el-form-item> | |||
<div></div> | |||
<h4 style="color:red;line-height:40px;margin:0!important;">1.请输入微信号: | |||
<el-form-item prop="wechatId" class="fx_title"> | |||
<el-input v-model="ruleForm.wechatId" placeholder="请输入" clearable></el-input> | |||
</el-form-item> | |||
</h4> | |||
<h4 style="color:red;line-height:40px;margin:0!important;">2.请选择小程序</h4> | |||
</el-form> | |||
</div> | |||
<div style="width:100%"> | |||
<table-list :ref="tKey" :options="optionsTable"></table-list> | |||
</div> | |||
<span slot="footer" class="dialog-footer"> | |||
<el-button class="draftBtn" @click="dialogVisible = false">取 消</el-button> | |||
<el-button class="putinBtn" @click="getSelected(tKey)">{{button}}</el-button> | |||
</span> | |||
</el-dialog> | |||
</div> | |||
</template> | |||
<script> | |||
import TableList from "../../../core/comps/table/tableList.vue"; | |||
import commonUtil from "../../../core/tool/commonUtil.js"; | |||
import { configUrl } from "./../../../utils/config.js"; | |||
import { CacheData } from "./../../../service/couponData/data.js"; | |||
export default { | |||
inject: ["reload"], | |||
name: "member", | |||
props: ["tKey", "cb","params"], | |||
components: { TableList }, | |||
data() { | |||
return { | |||
dialogVisible: false, | |||
ruleForm: { | |||
name: '', | |||
wechatId:"", | |||
type:"", | |||
}, | |||
title:"", | |||
flag:"", | |||
button:"", | |||
businessData:[], | |||
optionsTable: { | |||
singleSelected: true, | |||
showCk: true, | |||
map: [ | |||
{ key: "id", val: "编号"}, | |||
{ key: "headImg", val: "小程序图标",etype:"img"}, | |||
{ key: "name", val: "小程序名称"}, | |||
{ key: "authorizerAppid", val: "授权方appid"}, | |||
{key:"authorizationStatus",val:"授权状态",convert:this.authStatus}, | |||
{key:"type",val:"小程序类型",convert:this.cAppType}, | |||
], | |||
getUrl:() => { | |||
return configUrl.weappList + "?type=" + this.ruleForm.type+"&name="+this.ruleForm.name; | |||
}, | |||
pageOption: { | |||
sizeKey: "pageSize", | |||
indexKey: "pageNum", | |||
index: 1, | |||
size: 10 | |||
}, | |||
analysis: data => { | |||
console.log(data) | |||
return { | |||
data: data.data.list, | |||
count: data.data.total | |||
}; | |||
} | |||
} | |||
}; | |||
}, | |||
computed:{ | |||
appType:()=>{ | |||
return CacheData.appType; | |||
}, | |||
}, | |||
methods: { | |||
//小程序类型转换 | |||
cAppType(col, item) { | |||
console.log(item) | |||
let res = CacheData.appType.filter(e => { | |||
return e.value == item.type; | |||
})[0]; | |||
if (res) { | |||
return res.name; | |||
} else { | |||
return "小程序类型无效"; | |||
} | |||
return res.name; | |||
}, | |||
//小程序授权状态 | |||
authStatus(col, item){ | |||
console.log(item) | |||
let res = CacheData.authorizationStatus.filter(e => { | |||
return e.value == item.authorizationStatus.toString(); | |||
})[0]; | |||
console.log(res) | |||
if (res) { | |||
return res.name; | |||
} else { | |||
return "小程序授权状态无效"; | |||
} | |||
return res.name; | |||
}, | |||
search: function() { | |||
let tKey = this.$refs[this.tKey]; | |||
tKey.search(tKey.getParams().index); | |||
}, | |||
openDialog(item) { | |||
console.log(item) | |||
if(item == 'add'){ | |||
this.title = '添加体验者权限' | |||
this.flag = 'add'; | |||
this.button = '添 加'; | |||
}else if(item == 'delete'){ | |||
this.title = '删除体验者权限' | |||
this.flag = 'delete'; | |||
this.button = '删 除'; | |||
} | |||
this.dialogVisible = true; | |||
}, | |||
closeDialog() { | |||
this.dialogVisible = false; | |||
}, | |||
//确定选择的需要添加权限的小程序 | |||
getSelected(pamer) { | |||
console.log(pamer) | |||
let items = this.$refs[this.tKey].getCheckedItems("authorizerAppid"); | |||
console.log(items) | |||
if (items.data.length == 0) { | |||
this.$message({ | |||
type: "error", | |||
message: "请选择小程序" | |||
}); | |||
return; | |||
}else if(this.ruleForm.wechatId == ""){ | |||
this.$message({ | |||
type: "error", | |||
message: "请输入需要添加体验权限的微信号" | |||
}); | |||
return; | |||
} else { | |||
let params = { | |||
appId:JSON.stringify(items.vals).replace(/\[|]/g,'').replace(/\"/g, ""), | |||
wechatId:this.ruleForm.wechatId, | |||
} | |||
let postUrl = this.flag == 'add'?configUrl.bindTester:configUrl.unbindTester; | |||
this.postFetch(postUrl,params).then(res=>{ | |||
console.log(typeof(res.data)) | |||
//错误提示的判断 | |||
if(typeof(res.data)=="string"){ | |||
var errcode = JSON.parse(res.data).errcode; | |||
}else{ | |||
var errcode = res.data.errcode; | |||
console.log(typeof(res.data)) | |||
} | |||
//绑定体验者 | |||
if(postUrl == configUrl.bindTester){ | |||
if(errcode == -1){ | |||
this.$message({ | |||
type: "error", | |||
message: "系统繁忙" | |||
}); | |||
}else if(errcode == 85001){ | |||
this.$message({ | |||
type: "error", | |||
message: "微信号不存在或微信号设置为不可搜索" | |||
}); | |||
}else if(errcode == 85002){ | |||
this.$message({ | |||
type: "error", | |||
message: "小程序绑定的体验者数量达到上限" | |||
}); | |||
}else if(errcode == 85003){ | |||
this.$message({ | |||
type: "error", | |||
message: "微信号绑定的小程序体验者达到上限" | |||
}); | |||
}else if(errcode == 85004){ | |||
this.$message({ | |||
type: "error", | |||
message: "微信号已经绑定" | |||
}); | |||
}else if(errcode == "0"){ | |||
this.$message({ | |||
type: "success", | |||
message: "添加小程序体验者成功" | |||
}); | |||
} | |||
} | |||
//解除体验者 | |||
else if(postUrl == configUrl.unbindTester){ | |||
if(errcode == -1){ | |||
this.$message({ | |||
type: "error", | |||
message: "系统繁忙" | |||
}); | |||
}else if(errcode == "0"){ | |||
this.$message({ | |||
type: "success", | |||
message: "解除绑定成功" | |||
}); | |||
} | |||
} | |||
}).catch(err=>{ | |||
console.log(err) | |||
this.$message({ | |||
type: "error", | |||
message: err.data | |||
}); | |||
}) | |||
} | |||
this.dialogVisible = false; | |||
} | |||
} | |||
}; | |||
</script> | |||
<style scoped> | |||
.fx_dialog_list_chooseSH .el-dialog .el-dialog__footer .dialog-footer .draftBtn, | |||
.fx_dialog_list_chooseSH | |||
.el-dialog | |||
.el-dialog__footer | |||
.dialog-footer | |||
.putinBtn { | |||
width: 76px; | |||
height: 35px; | |||
font-size: 14px; | |||
padding: 10px 20px; | |||
} | |||
.fx_dialog_list_chooseSH | |||
.el-dialog | |||
.el-dialog__footer | |||
.dialog-footer | |||
.draftBtn { | |||
margin-right: 7.5px; | |||
background: #ffffff; | |||
color: #555555; | |||
border: 1px solid #e1e6ea; | |||
} | |||
.fx_dialog_list_chooseSH | |||
.el-dialog | |||
.el-dialog__footer | |||
.dialog-footer | |||
.putinBtn { | |||
margin-left: 7.5px; | |||
background: #c85963; | |||
color: #ffffff; | |||
} | |||
.fx_dialog_list_chooseSH | |||
.el-dialog | |||
.el-dialog__footer | |||
.dialog-footer | |||
.draftBtn:hover { | |||
background: #ffffff; | |||
} | |||
.fx_dialog_list_chooseSH | |||
.el-dialog | |||
.el-dialog__footer | |||
.dialog-footer | |||
.putinBtn:hover { | |||
background: #e26972; | |||
} | |||
.fx_dialog_list_chooseSH | |||
.el-dialog | |||
.el-dialog__footer | |||
.dialog-footer | |||
.draftBtn:active { | |||
background: #e1e2e2; | |||
} | |||
.fx_dialog_list_chooseSH | |||
.el-dialog | |||
.el-dialog__footer | |||
.dialog-footer | |||
.putinBtn:active { | |||
background: #bf585f; | |||
} | |||
.search{ | |||
width: 100%; | |||
text-align: left; | |||
} | |||
</style> |
@@ -0,0 +1,93 @@ | |||
<template> | |||
<div> | |||
<el-dialog title="小程序模板列表" :visible="dialogVisible" width="800px" :before-close="closeDialog" :modal-append-to-body="false" class="fx_dialog_list_chooseSH"> | |||
<table-list v-if="showAlert" :ref="tKey" :options="optionsTable"></table-list> | |||
</el-dialog> | |||
</div> | |||
</template> | |||
<script> | |||
import TableList from "../../../core/comps/table/tableList.vue"; | |||
import commonUtil from "../../../core/tool/commonUtil.js"; | |||
import { configUrl } from "./../../../utils/config.js"; | |||
import { CacheData } from "./../../../service/couponData/data.js"; | |||
export default { | |||
inject: ["reload"], | |||
name: "templateMsg", | |||
props: ["cb", "params"], | |||
components: { TableList }, | |||
data() { | |||
return { | |||
showAlert:false, | |||
dialogVisible: false, | |||
appId:"", | |||
disabled: false, | |||
tKey: "chooseApp", | |||
optionsTable: { | |||
actions: [ | |||
{ | |||
key: "delete", | |||
val: "删除", | |||
action: this.deleteTemplate | |||
} | |||
], | |||
map: [ | |||
{ key: "title", val: "标题" }, | |||
{ key: "templateId", val: "模板消息Id" } | |||
], | |||
getUrl: () => {}, | |||
pageOption: { | |||
sizeKey: "pageSize", | |||
indexKey: "pageNum", | |||
index: 1, | |||
size: 10 | |||
}, | |||
analysis: data => { | |||
return { | |||
data: data.data.list, | |||
count: data.data.total | |||
}; | |||
} | |||
} | |||
}; | |||
}, | |||
methods: { | |||
openDialog(from) { | |||
let appId = JSON.parse(from).appId; | |||
this.appId = appId; | |||
this.optionsTable.getUrl=()=>{ | |||
return configUrl.getTemplateList +"?type=2"+"&appId="+appId | |||
} | |||
this.showAlert=true; | |||
this.dialogVisible = true; | |||
}, | |||
closeDialog() { | |||
this.showAlert=false; | |||
this.dialogVisible = false; | |||
}, | |||
deleteTemplate(item){ | |||
let pamars = { | |||
appId:this.appId, | |||
templateId:item.templateId | |||
}; | |||
this.postFetch(configUrl.delTemplate,pamars).then(res=>{ | |||
this.$message({ | |||
type: "success", | |||
message: "删除成功" | |||
}); | |||
this.search(); | |||
}).catch(error=>{ | |||
this.$message({ | |||
type: "error", | |||
message: error.data | |||
}); | |||
}) | |||
}, | |||
search: function() { | |||
let tKey = this.$refs[this.tKey]; | |||
tKey.search(tKey.getParams().index); | |||
}, | |||
} | |||
}; | |||
</script> | |||
@@ -0,0 +1,175 @@ | |||
<template> | |||
<div> | |||
<el-dialog | |||
title="批量撤回审核" | |||
:visible="dialogVisible" | |||
width="800px" | |||
:before-close="closeDialog" | |||
:modal-append-to-body="false" | |||
class="fx_dialog_list_chooseSH"> | |||
<div style="width:100%"> | |||
<table-list :ref="tKey" :options="optionsTable"></table-list> | |||
</div> | |||
<span slot="footer" class="dialog-footer"> | |||
<el-button class="draftBtn" @click="dialogVisible = false">取 消</el-button> | |||
<el-button class="putinBtn" @click="childversion">确 定</el-button> | |||
</span> | |||
</el-dialog> | |||
</div> | |||
</template> | |||
<script> | |||
import TableList from "../../../core/comps/table/tableList.vue"; | |||
import commonUtil from "../../../core/tool/commonUtil.js"; | |||
import { configUrl } from "./../../../utils/config.js"; | |||
import { CacheData } from "./../../../service/couponData/data.js"; | |||
export default { | |||
inject: ["reload"], | |||
name: "versionWithdraw", | |||
props: ["tKey", "cb"], | |||
components: { TableList }, | |||
data() { | |||
return { | |||
dialogVisible: false, | |||
title:"", | |||
brands:[], | |||
flag:"", | |||
ruleForm: { | |||
authorizerAppid: '', | |||
type:"" | |||
}, | |||
businessData:[], | |||
optionsTable: { | |||
singleSelected: true, | |||
showCk: true, | |||
map: [ | |||
{ key: "version", val: "小程序版本号"} | |||
], | |||
getUrl:() => { | |||
//批量撤回审核 | |||
return configUrl.auditVersionList; | |||
}, | |||
pageOption: { | |||
showIf:false, | |||
sizeKey: "pageSize", | |||
indexKey: "pageNum", | |||
index: 1, | |||
size: 10 | |||
}, | |||
analysis: data => { | |||
return { | |||
data: data.data | |||
}; | |||
} | |||
} | |||
}; | |||
}, | |||
methods: { | |||
openDialog() { | |||
this.dialogVisible = true; | |||
}, | |||
search: function() { | |||
let tKey = this.$refs[this.tKey]; | |||
tKey.search(tKey.getParams().index); | |||
}, | |||
closeDialog() { | |||
this.dialogVisible = false; | |||
}, | |||
//请选择小程序的版本 | |||
childversion() { | |||
let items = this.$refs[this.tKey].getCheckedItems("version"); | |||
if (items.data.length != 1) { | |||
this.$message({ | |||
type: "error", | |||
message: "请选择小程序的版本号!" | |||
}); | |||
return; | |||
} else { | |||
let params = { | |||
version:JSON.stringify(items.vals).replace(/\[|]/g,'').replace(/\"/g, "") | |||
}; | |||
let postUrl = configUrl.batchAuditCancel; | |||
this.postFetch(postUrl,params).then(res=>{ | |||
ithis.$message({ | |||
type: "success", | |||
message: "批量撤回审核成功!" | |||
}) | |||
}).catch(err=>{ | |||
this.$message({ | |||
type: "error", | |||
message: err.data, | |||
}); | |||
}) | |||
} | |||
this.dialogVisible = false; | |||
} | |||
} | |||
}; | |||
</script> | |||
<style scoped> | |||
.fx_dialog_list_chooseSH .el-dialog .el-dialog__footer .dialog-footer .draftBtn, | |||
.fx_dialog_list_chooseSH | |||
.el-dialog | |||
.el-dialog__footer | |||
.dialog-footer | |||
.putinBtn { | |||
width: 76px; | |||
height: 35px; | |||
font-size: 14px; | |||
padding: 10px 20px; | |||
} | |||
.fx_dialog_list_chooseSH | |||
.el-dialog | |||
.el-dialog__footer | |||
.dialog-footer | |||
.draftBtn { | |||
margin-right: 7.5px; | |||
background: #ffffff; | |||
color: #555555; | |||
border: 1px solid #e1e6ea; | |||
} | |||
.fx_dialog_list_chooseSH | |||
.el-dialog | |||
.el-dialog__footer | |||
.dialog-footer | |||
.putinBtn { | |||
margin-left: 7.5px; | |||
background: #c85963; | |||
color: #ffffff; | |||
} | |||
.fx_dialog_list_chooseSH | |||
.el-dialog | |||
.el-dialog__footer | |||
.dialog-footer | |||
.draftBtn:hover { | |||
background: #ffffff; | |||
} | |||
.fx_dialog_list_chooseSH | |||
.el-dialog | |||
.el-dialog__footer | |||
.dialog-footer | |||
.putinBtn:hover { | |||
background: #e26972; | |||
} | |||
.fx_dialog_list_chooseSH | |||
.el-dialog | |||
.el-dialog__footer | |||
.dialog-footer | |||
.draftBtn:active { | |||
background: #e1e2e2; | |||
} | |||
.fx_dialog_list_chooseSH | |||
.el-dialog | |||
.el-dialog__footer | |||
.dialog-footer | |||
.putinBtn:active { | |||
background: #bf585f; | |||
} | |||
.search{ | |||
width: 100%; | |||
height: 50px; | |||
text-align: left; | |||
margin-left: 20px; | |||
} | |||
</style> |
@@ -0,0 +1,230 @@ | |||
<template> | |||
<div class="layout server"> | |||
<div class="title"> | |||
<h3>成员管理</h3> | |||
</div> | |||
<el-button type="primary" @click="addMember('add')">添加体验者</el-button> | |||
<el-button type="primary" @click="addMember('delete')">删除体验者</el-button> | |||
<member :params="params" :ref="tKey" :t-key="tKey" :cb="addMember"></member> | |||
</div> | |||
</template> | |||
<script> | |||
import { configUrl } from "./../../utils/config.js"; | |||
import { mapState, mapActions } from "vuex"; | |||
import moment from 'moment'; | |||
import alertDialog from "../../core/comps/input/alertDialog.vue"; | |||
import commonUtil from './../../core/tool/commonUtil'; | |||
import member from "./../../components/marketing/businessComp/member.vue"; | |||
export default { | |||
name: 'draft', | |||
components: {alertDialog,member}, | |||
data () { | |||
return { | |||
data:[], | |||
tk:"memberTableKey", | |||
tKey: "member", | |||
params:"", | |||
ruleForm: { | |||
appId: "", | |||
}, | |||
rules:{ | |||
appId: [ | |||
{ | |||
min: 1, | |||
max: 50, | |||
message: "副标题最大50个字符!", | |||
trigger: "blur" | |||
} | |||
], | |||
}, | |||
} | |||
}, | |||
computed:{ | |||
...mapState({ | |||
topNav:state=>state.topNav.data, //将 this.topNav 映射为 this.$store.topNav.data | |||
channels:state=>state.couponStore.channels, | |||
index:state=>state.topNav.index | |||
}) | |||
}, | |||
methods:{ | |||
...mapActions([ | |||
"setIndex" | |||
]), | |||
//选择小程序 | |||
addMember(item) { | |||
console.log(item); | |||
this.params = item; | |||
this.$refs[this.tKey].openDialog(item); | |||
}, | |||
search:function(){ | |||
let tk = this.$refs[this.tk]; | |||
tk.search(tk.getParams().index); | |||
}, | |||
}, | |||
created() { | |||
this.setIndex("5"); | |||
} | |||
} | |||
</script> | |||
<style scoped> | |||
.content{ | |||
margin-top: 30px; | |||
} | |||
.tableContainer{ | |||
width: 100%; | |||
} | |||
.h3{ | |||
font-size: 16px; | |||
} | |||
.sever{ | |||
border-radius: 4px; | |||
border:1px solid #e7e7eb; | |||
padding: 0 20px 10px; | |||
margin-bottom: 20px; | |||
} | |||
.title{ | |||
margin-bottom: 10px; | |||
} | |||
.title h3{ | |||
font-size: 18px; | |||
font-weight: bold; | |||
} | |||
.layout-content{ | |||
background: #fff; | |||
overflow: hidden; | |||
} | |||
.btn-group{ | |||
text-align: center; | |||
margin-top: 26px; | |||
} | |||
.layout-content table{ | |||
width:100%; | |||
} | |||
.layout-content table tr td{ | |||
padding:17px 0; | |||
text-align:left; | |||
} | |||
.layout-content table tr td:nth-child(1){ | |||
padding:17px 0 17px 18px; | |||
width:200px; | |||
text-align:center; | |||
} | |||
.layout-content table tr td:nth-child(2){ | |||
padding:17px 15px; | |||
width:10px; | |||
text-align:center; | |||
} | |||
.layout-content table tr td:nth-child(3){ | |||
padding:17px 10px 17px 0; | |||
width:180px; | |||
text-align:center; | |||
} | |||
.layout-content table tr td:nth-child(4){ | |||
padding:17px 10px; | |||
width:240px; | |||
text-align:center; | |||
} | |||
.layout-content table tr td:nth-child(5){ | |||
padding:17px 10px; | |||
text-align:left; | |||
} | |||
.layout-content table tr:hover{ | |||
cursor:pointer; | |||
background:#F4F7F9; | |||
} | |||
.editBox,.delBox{ | |||
width:40px; | |||
height:40px; | |||
text-align:center; | |||
line-height:40px; | |||
display:inline-block; | |||
color:#fff; | |||
font-size:14px; | |||
border-radius:3px; | |||
margin-right:20px; | |||
display:none; | |||
} | |||
.editBox{ | |||
background:#51A9C9; | |||
} | |||
.delBox{ | |||
background:#EE7653; | |||
} | |||
.layout-content table tr:hover .editBox{ | |||
display:inline-block; | |||
} | |||
.layout-content table tr:hover .delBox{ | |||
display:inline-block; | |||
} | |||
.btnGroupBox{ | |||
margin-top:20px; | |||
} | |||
.addBox{ | |||
width:146px; | |||
height:40px; | |||
text-align:center; | |||
line-height:40px; | |||
display:inline-block; | |||
color:#fff; | |||
font-size:14px; | |||
border-radius:3px; | |||
margin-right:20px; | |||
background:#6B5EC9; | |||
cursor:pointer; | |||
} | |||
.addBox i{ | |||
margin-right:5px; | |||
} | |||
.saveBox{ | |||
width:91px; | |||
height:40px; | |||
text-align:center; | |||
line-height:40px; | |||
display:block; | |||
color:#fff; | |||
font-size:14px; | |||
border-radius:3px; | |||
background:#51A9C9; | |||
margin: 0 auto!important; | |||
cursor:pointer; | |||
} | |||
.addBox:hover{ | |||
background:#7A6CE1; | |||
} | |||
.addBox:active{ | |||
background:#6357BB; | |||
} | |||
.editBox:hover{ | |||
background:#5DC1E5; | |||
} | |||
.editBox:active{ | |||
background:#4490AB; | |||
} | |||
.saveBox:hover{ | |||
background:#5DC1E5; | |||
} | |||
.saveBox:active{ | |||
background:#4490AB; | |||
} | |||
.delBox:hover{ | |||
background:#FF8460; | |||
} | |||
.delBox:active{ | |||
background:#DF6F4E; | |||
} | |||
</style> | |||
<style> | |||
.save{ | |||
display: block; | |||
width:90px; | |||
margin:0 auto; | |||
} | |||
.tips{ | |||
color:red; | |||
text-align:center; | |||
margin-top:10px; | |||
} | |||
</style> |
@@ -0,0 +1,379 @@ | |||
<template> | |||
<div class="layout"> | |||
<div class="title"> | |||
<h3>发布列表</h3> | |||
</div> | |||
<div class="layout-content"> | |||
<el-form :inline="true" :model="ruleForm" ref="ruleForm" class="demo-form-inline" label-position="right"> | |||
<el-form-item label="发布状态" prop="releaseStatus" class="fx_send"> | |||
<el-select v-model="ruleForm.releaseStatus" placeholder="请选择" clearable> | |||
<el-option v-for="(item,index) in releaseStatus" :key="index" :value="item.value" :label="item.name"></el-option> | |||
</el-select> | |||
</el-form-item> | |||
<el-form-item label="小程序类型" prop="type" class="fx_send"> | |||
<el-select v-model="ruleForm.type" placeholder="请选择" clearable> | |||
<el-option v-for="(item,index) in appType" :key="index" :value="item.value" :label="item.name"></el-option> | |||
</el-select> | |||
</el-form-item> | |||
<el-form-item label="小程序名称" prop="name" class="fx_title"> | |||
<el-input v-model="ruleForm.name" placeholder="请输入" clearable></el-input> | |||
</el-form-item> | |||
<el-form-item label="小程序版本号" class="fx_send"> | |||
<el-select v-model="ruleForm.userVersion" placeholder="请选择" clearable> | |||
<el-option v-for="(item,index) in version" :key="index" :value="item.version" :label="item.version"></el-option> | |||
</el-select> | |||
</el-form-item> | |||
<el-form-item> | |||
<el-button class="hoverBtn" type="primary" icon="el-icon-search" size="medium" @click.stop="search"></el-button> | |||
</el-form-item> | |||
<el-form-item> | |||
<el-button class="hoverBtn" type="primary" @click.stop="refresh">刷新</el-button> | |||
</el-form-item> | |||
</el-form> | |||
</div> | |||
<table-list :ref="tk" :options="optionsTable"></table-list> | |||
<choose-version :paramers="paramers" :ref="tKey" :t-key="tKey" :cb="getShopCb"></choose-version> | |||
</div> | |||
</template> | |||
<script> | |||
import {mapState, mapActions} from "vuex"; | |||
import TableList from "../../core/comps/table/tableList.vue"; | |||
import { CacheData } from "./../../service/couponData/data.js"; | |||
import { configUrl } from "./../../utils/config.js"; | |||
import chooseVersion from "./../../components/marketing/businessComp/chooseVersion.vue"; | |||
export default { | |||
name: 'release', | |||
components: {TableList,chooseVersion}, | |||
data(){ | |||
return { | |||
listNavKey:"releaseNavKey", | |||
tk:"releaseKey", | |||
paramers:"", | |||
params:"", | |||
src: '', | |||
version:[], | |||
tKey: "chooseVersion", | |||
ruleForm:{ | |||
auditStatus:"", | |||
releaseStatus:"", | |||
codeStatus:"", | |||
type:"", | |||
appId:"", | |||
name:"", | |||
userVersion:"", | |||
}, | |||
optionsTable:{ | |||
actions :[ | |||
{key:"edit",val:"版本回退",action:this.revertCodeRelease,show:(item)=>{ | |||
if(item.releaseStatus == 0){ | |||
return true; | |||
} | |||
return false; | |||
}}, | |||
], | |||
map: [ | |||
{ key: "name", val: "小程序名称"}, | |||
{ key: "appId", val: "授权方appid"}, | |||
{ key:"type", val:"小程序类型",convert:this.cAppType}, | |||
{ key:"userVersion", val:"版本号"}, | |||
{ key:"versionDesc", val:"版本描述"}, | |||
{ key:"releaseStatus", val:"发布状态",convert:this.cReleaseStatus}, | |||
{ key:"releaseTime", val:"发布时间",type:"dateTime"}, | |||
{ key:"releaseErrCode", val:"错误码"} | |||
], | |||
getUrl:()=>{ | |||
let releaseStatus = this.ruleForm.releaseStatus; | |||
let type = this.ruleForm.type; | |||
let name = this.ruleForm.name; | |||
let userVersion = this.ruleForm.userVersion; | |||
if(userVersion){ | |||
return configUrl.releaseStatusList+"?releaseStatus="+releaseStatus+"&type="+type+"&name="+name+"&userVersion="+userVersion; | |||
}else{ | |||
return configUrl.releaseStatusList+"?releaseStatus="+releaseStatus+"&type="+type+"&name="+name; | |||
} | |||
}, | |||
pageOption:{ | |||
sizeKey:"pageSize", | |||
indexKey:"pageNum", | |||
index:1, | |||
size:10 | |||
}, | |||
analysis:(data)=>{ | |||
// data.data.list.map(file=>{ | |||
// if(file.releaseErrCode=='{"errcode":"0","errmsg":"ok"}'){ | |||
// file.releaseErrCode ="" | |||
// } | |||
// }) | |||
return { | |||
data:data.data.list, | |||
count:data.data.total | |||
}; | |||
} | |||
} | |||
} | |||
}, | |||
computed:{ | |||
appType:()=>{ | |||
return CacheData.appType; | |||
}, | |||
releaseStatus:()=>{ | |||
return CacheData.releaseStatus; | |||
}, | |||
...mapState({ | |||
topNav:state=>state.topNav.data, //将 this.topNav 映射为 this.$store.topNav.data | |||
channels:state=>state.couponStore.channels, | |||
navigationInfo:state=>state.topNav.navigationInfo | |||
}) | |||
}, | |||
created() { | |||
this.setIndex("4"); | |||
}, | |||
mounted(){ | |||
//获得小程序的版本号 | |||
this.getFetch(configUrl.releaseVersionList).then(res=>{ | |||
console.log(res) | |||
this.version = res.data; | |||
}).catch(error=>{ | |||
console.log(error); | |||
}) | |||
}, | |||
methods:{ | |||
...mapActions([ | |||
"setIndex" | |||
]), | |||
//小程序版本回退 | |||
revertCodeRelease(item){ | |||
console.log(item); | |||
this.getFetch(configUrl.revertCodeRelease+"?appId="+item.appId).then(res=>{ | |||
console.log(res); | |||
this.search(); | |||
}).catch(err=>{ | |||
this.$message({ | |||
type: "error", | |||
message: err.data | |||
}); | |||
}) | |||
}, | |||
//选择版本号或者小程序 | |||
getShopCb(items) { | |||
this.shopTableData = []; | |||
items.data.map((item, index) => { | |||
let haveIf = false; | |||
this.shopTableData.map((item01, index01) => { | |||
if(item.id == item01.id) { | |||
haveIf = true | |||
} | |||
}) | |||
if (haveIf == false) { | |||
item.merchantName = item.name; | |||
item.merchantLinkPhone = item.linkPhone | |||
this.shopTableData.push(item); | |||
} | |||
}) | |||
}, | |||
//批量撤回小程序 | |||
searchAudit(flag) { | |||
console.log(flag) | |||
this.paramers = flag; | |||
this.$refs[this.tKey].openDialog(flag); | |||
}, | |||
//撤回审核 | |||
auditCancel(item){ | |||
this.getFetch(configUrl.undoCodeAudit+"?appId="+item.appId).then(res=>{ | |||
this.search(); | |||
this.$message({ | |||
type:"success", | |||
message:"撤回审核成功" | |||
}) | |||
}).catch(err=>{ | |||
console.log(err) | |||
if(typeof(err.data)=="string"){ | |||
var errcode = JSON.parse(err.data).errcode; | |||
}else{ | |||
var errcode = err.data.errcode; | |||
console.log(typeof(err.data)) | |||
} | |||
if(errcode == 0){ | |||
this.$message({ | |||
type: "error", | |||
message: "系统繁忙" | |||
}); | |||
}else if(errcode == -1){ | |||
this.$message({ | |||
type: "error", | |||
message: "系统繁忙" | |||
}); | |||
}else if(errcode == 87013){ | |||
this.$message({ | |||
type: "error", | |||
message: "撤回次数达到上限(每天一次,每个月10次)" | |||
}); | |||
}else if(errcode == 45009){ | |||
this.$message({ | |||
type: "error", | |||
message: "公众号接口访问次数到达了上限" | |||
}); | |||
} | |||
}) | |||
}, | |||
//发布单个小程序 | |||
goSubmit(item){ | |||
let paramer = { | |||
apps:item.appId | |||
}; | |||
this.postFetch(configUrl.batchRelease,paramer).then(res=>{ | |||
console.log(res); | |||
this.$message({ | |||
type: "success", | |||
message: "批量发布小程序成功" | |||
}); | |||
this.search(); | |||
}).catch(err=>{ | |||
console.log(err) | |||
this.$message({ | |||
type: "error", | |||
message: err.data | |||
}); | |||
}) | |||
}, | |||
//批量提交小程序审核 | |||
reviewApp(item) { | |||
let items = { | |||
from:item | |||
} | |||
console.log(items) | |||
this.$refs[this.tKey1].openDialog(JSON.stringify(items)); | |||
}, | |||
//刷新 | |||
refresh(){ | |||
this.search(); | |||
}, | |||
search:function(){ | |||
let tk = this.$refs[this.tk]; | |||
tk.search(tk.getParams().index); | |||
}, | |||
goErCode: function (item) { | |||
let weiXinUrl = configUrl.getQrcode+"?appId="+item.appId+'&pagePath='+'pages/index/index'; | |||
this.$alert("<strong><img src="+ weiXinUrl + " width=100px height=100px></strong>", item.name+'体验版', { | |||
dangerouslyUseHTMLString: true, | |||
closeOnClickModal:true, | |||
showConfirmButton:true, | |||
showClose:false, | |||
center:true | |||
}) | |||
}, | |||
//小程序提交审核 | |||
submitcheck: function (item) { | |||
let parmer = { | |||
apps:item.appId, | |||
userVersion:item.userVersion | |||
} | |||
this.postFetch(configUrl.batchCodeAudit,parmer).then(res=>{ | |||
console.log(res) | |||
this.$message({ | |||
type: "success", | |||
message:"提交审核成功" | |||
}) | |||
}).catch(error=>{ | |||
console.log(error) | |||
this.$message({ | |||
type: "error", | |||
message:error.data | |||
}) | |||
}) | |||
}, | |||
//小程序的类型 | |||
cAppType(col, item) { | |||
console.log(item) | |||
let res = CacheData.appType.filter(e => { | |||
return e.value == item.type; | |||
})[0]; | |||
console.log(res) | |||
if (res) { | |||
return res.name; | |||
} else { | |||
console.log("error:异常券id:", item.id); | |||
return ""; | |||
} | |||
return res.name; | |||
}, | |||
//小程序审核状态 | |||
cReleaseStatus(col, item){ | |||
console.log(item) | |||
let res = CacheData.releaseStatus.filter(e => { | |||
return e.value == item.releaseStatus; | |||
})[0]; | |||
console.log(res) | |||
if (res) { | |||
return res.name; | |||
} else { | |||
return ""; | |||
} | |||
return res.name; | |||
}, | |||
}, | |||
} | |||
</script> | |||
<style scoped> | |||
.lip{ | |||
padding-top: 30px; | |||
} | |||
.lip span{ | |||
color: red; | |||
} | |||
.title{ | |||
margin-bottom: 10px; | |||
} | |||
.title h3{ | |||
font-size: 18px; | |||
font-weight: bold; | |||
} | |||
.content span{ | |||
font-size: 15px; | |||
} | |||
.content span:nth-of-type(1){ | |||
color: #19ce00; | |||
font-weight:bold; | |||
margin-right: 20px; | |||
} | |||
.content span:nth-of-type(2){ | |||
margin-right: 20px; | |||
cursor: pointer; | |||
} | |||
.layout-content{ | |||
margin-top: 20px; | |||
background: #f6f6f6; | |||
padding: 29px 20px 0; | |||
border-radius:6px; | |||
} | |||
.el-select-dropdown__item{ | |||
display: block; | |||
} | |||
.tableContainer{ | |||
width: 100%; | |||
margin-top: 23px; | |||
} | |||
</style> | |||
<style> | |||
.el-message-box{ | |||
width:300px; | |||
padding:0 0 20px; | |||
} | |||
.el-message-box img{ | |||
width:200px; | |||
height: 200px; | |||
display:block; | |||
margin:0 auto; | |||
} | |||
.el-message-box__header{ | |||
text-align:center; | |||
font-size:14px!important; | |||
} | |||
.el-message-box__btns button{ | |||
width:100px!important; | |||
} | |||
.el-message-box__title{ | |||
font-size:16px; | |||
} | |||
</style> | |||
@@ -0,0 +1,69 @@ | |||
<template> | |||
<el-dialog | |||
title='搜索定位您的详细地址' | |||
:visible="dialogVisible" | |||
width="500px" :show-close=true :before-close="handleClose"> | |||
<baidu-map sytle="height:280px;width:100%;" :map-click=false :center="center" :zoom="zoom" @ready="handler"> | |||
<bm-view style="height:280px;width:100%"></bm-view> | |||
<bm-control :offset="{width: '10px', height: '10px'}"> | |||
<bm-auto-complete v-model="keyword" :sugStyle="{zIndex: 9999}"> | |||
<input style="height:5vh;width:30vw;font-size:12px;text-indent: 1em; | |||
border: 1px solid #eee; | |||
border-radius: 6px;" placeholder="请输入关键字"/> <!-- 这里指代一个自定义搜索框组件 --> | |||
</bm-auto-complete> | |||
</bm-control> | |||
<bm-local-search :pageCapacity="3" :keyword="keyword" @infohtmlset="getpoi" :auto-viewport="true"></bm-local-search> | |||
</baidu-map> | |||
</el-dialog> | |||
</template> | |||
<script> | |||
export default { | |||
name: 'baidumap', | |||
props:['setpoi'], | |||
data () { | |||
return { | |||
center: {lng: 0, lat: 0}, | |||
zoom: 3, | |||
dialogVisible:false, | |||
location: '', | |||
keyword: '' | |||
} | |||
}, | |||
methods:{ | |||
openDialog(){ | |||
this.dialogVisible = true; | |||
}, | |||
handler ({BMap, map}) { | |||
console.log(BMap, map) | |||
this.center.lng = 116.404 | |||
this.center.lat = 39.915 | |||
this.zoom = 15 | |||
}, | |||
getpoi(info){ | |||
this.dialogVisible = false; | |||
this.setpoi(info); | |||
}, | |||
handleClose(done) { | |||
this.$confirm('确认关闭?') | |||
.then(_ => { | |||
this.keyword=''; | |||
this.dialogVisible=false; | |||
}) | |||
.catch(_ => {}); | |||
}, | |||
syncCenterAndZoom (e) { | |||
const {lng, lat} = e.target.getCenter() | |||
} | |||
} | |||
} | |||
</script> | |||
<style scoped> | |||
.el-dialog__body{ | |||
padding-top: 0; | |||
} | |||
</style> |
@@ -0,0 +1,38 @@ | |||
<template> | |||
<div> | |||
<file-upload fname="file" :url="imageUploadUrl" :completed-callback="uploadCb"></file-upload> | |||
{{filePath}} | |||
</div> | |||
</template> | |||
<script> | |||
import commonUtil from '../../core/tool/commonUtil'; | |||
import FileUpload from "../../core/comps/upload/upload.vue"; | |||
export default { | |||
name: 'ImgUpload', | |||
components: {FileUpload}, | |||
data () { | |||
return { | |||
imageUploadUrl:"/api/upload/awsFileUpload", | |||
filePath:"" | |||
} | |||
}, | |||
methods:{ | |||
uploadCb(d){ | |||
if(d.success){ | |||
this.filePath = d.data.data.url; | |||
} | |||
} | |||
}, | |||
mounted(){ | |||
} | |||
} | |||
</script> | |||
<!-- Add "scoped" attribute to limit CSS to this component only --> | |||
<style scoped> | |||
</style> |
@@ -0,0 +1,105 @@ | |||
<template> | |||
<div> | |||
<el-dialog class="alertDialog" top="40vh" :visible="dialogVisible" :before-close="closeDialog" width="443px" :append-to-body='true'> | |||
<div class="contentBox"> | |||
<i :class="icon"></i><span v-html="title"></span> | |||
</div> | |||
<div class="btnGroupBox"> | |||
<span class="cancelBtn" @click="dialogVisible = false;">取消</span> | |||
<span class="sureBtn" @click="clickSure">确定</span> | |||
</div> | |||
</el-dialog> | |||
</div> | |||
</template> | |||
<script> | |||
import commonUtil from '../../tool/commonUtil.js'; | |||
import {CouponCacheData} from "../../../service/couponData/data.js"; | |||
import {mapState, mapActions} from "vuex"; | |||
export default { | |||
name: 'alertDialog', | |||
components: {}, | |||
data() { | |||
return { | |||
dialogVisible: false, | |||
title: '', | |||
icon: 'el-icon-warning', | |||
cb:function(){ | |||
} | |||
} | |||
}, | |||
computed:{ | |||
...mapState({ | |||
topNav:state=>state.topNav.data,//将 this.topNav 映射为 this.$store.topNav.data | |||
navigationInfo:state=>state.topNav.navigationInfo | |||
}), | |||
}, | |||
methods: { | |||
openDialog(title,cb,icon) { | |||
this.dialogVisible = true; | |||
this.title = title; | |||
if(cb){ | |||
this.cb=cb; | |||
} | |||
if (icon) { | |||
this.icon = icon; | |||
} | |||
}, | |||
closeDialog() { | |||
this.dialogVisible = false; | |||
}, | |||
clickSure(){ | |||
this.cb() | |||
this.dialogVisible = false; | |||
} | |||
}, | |||
mounted: function() { | |||
} | |||
} | |||
</script> | |||
<style scoped> | |||
.contentBox { | |||
text-align: left; | |||
padding: 25px 15px; | |||
} | |||
.contentBox i { | |||
font-size: 24px; | |||
color: #e6a23c; | |||
margin-right: 12px; | |||
vertical-align: middle; | |||
} | |||
.contentBox span { | |||
color: #606266; | |||
font-size: 14px; | |||
line-height: 24px; | |||
} | |||
.btnGroupBox{ | |||
text-align: right; | |||
} | |||
.btnGroupBox span { | |||
width: 76px; | |||
height: 35px; | |||
display: inline-block; | |||
line-height: 35px; | |||
text-align: center; | |||
border-radius: 3px; | |||
font-size: 14px; | |||
margin-left: 15px; | |||
cursor: pointer; | |||
} | |||
.cancelBtn { | |||
background: rgba(255, 255, 255, 1); | |||
border: 1px solid rgba(225, 230, 234, 1); | |||
} | |||
.sureBtn { | |||
border: 1px solid rgba(200, 89, 98, 1); | |||
background: rgba(200, 89, 98, 1); | |||
color: #fff; | |||
} | |||
</style> |
@@ -0,0 +1,86 @@ | |||
<template> | |||
<div> | |||
<div v-bind:class="state.borderCls"> | |||
<div class="input-group mb-3"> | |||
<input type="text" class="form-control" v-model="vValue" aria-label="Amount (to the nearest dollar)" v-on:input="changeEvent()"> | |||
<div class="input-group-append"> | |||
<span class="input-group-text icon" v-bind:class="state.successIcon"></span> | |||
</div> | |||
</div> | |||
<p class="text-left" v-show="state.showError">{{errorMsg}}</p> | |||
</div> | |||
</div> | |||
</template> | |||
<script> | |||
import Util from "../../../core/tool/commonUtil"; | |||
export default{ | |||
name:"VInput", | |||
props:["errorMsg","vType"], | |||
data(){ | |||
return { | |||
vValue:"", | |||
state:{ | |||
flag:false, | |||
showError:false, | |||
borderCls:"inputIcon",//inputRedIcon inputGreenIcon inputIcon | |||
successIcon:""//icon-cuo,icon-duihao | |||
} | |||
} | |||
}, | |||
methods:{ | |||
setIsSuccess(flag){ | |||
if(flag){ | |||
this.state = { | |||
borderCls:"inputGreenIcon", | |||
successIcon:"icon-duihao", | |||
showError:false, | |||
flag:true | |||
} | |||
}else{ | |||
this.state = { | |||
borderCls:"inputRedIcon", | |||
successIcon:"icon-cuo", | |||
showError:true, | |||
flag:false | |||
} | |||
} | |||
}, | |||
changeEvent(e){ | |||
this.setIsSuccess(this.verify(this.vValue)); | |||
}, | |||
verify(val){ | |||
var reg = /^[0-9]*$/; | |||
if (!reg.test(val)) { | |||
return false; | |||
} | |||
return true; | |||
}, | |||
getResult(){ | |||
return { | |||
success:this.state.flag, | |||
value:this.vValue | |||
} | |||
} | |||
}, | |||
mounted () { | |||
}, | |||
created () { | |||
} | |||
} | |||
</script> | |||
<style scoped> | |||
.inputRedIcon input{border-right: 0;border-color: red;outline: none;} | |||
.inputRedIcon div span.icon{background: #fff;border-color: red;color: red;} | |||
.inputRedIcon p{color: red;} | |||
.inputGreenIcon input{border-right: 0;} | |||
.inputGreenIcon div span.icon{background: #fff;font-size: 16px;color: rgb(72, 255, 0);} | |||
.inputGreenIcon p{display: none} | |||
.inputIcon{border-right: 0;} | |||
</style> |
@@ -0,0 +1,32 @@ | |||
验证数字:^[0-9]*$ | |||
验证n位的数字:^\d{n}$ | |||
验证至少n位数字:^\d{n,}$ | |||
验证m-n位的数字:^\d{m,n}$ | |||
验证零和非零开头的数字:^(0|[1-9][0-9]*)$ | |||
验证有两位小数的正实数:^[0-9]+(.[0-9]{2})?$ | |||
验证有1-3位小数的正实数:^[0-9]+(.[0-9]{1,3})?$ | |||
验证非零的正整数:^\+?[1-9][0-9]*$ | |||
验证非零的负整数:^\-[1-9][0-9]*$ | |||
验证非负整数(正整数 + 0) ^\d+$ | |||
验证非正整数(负整数 + 0) ^((-\d+)|(0+))$ | |||
验证长度为3的字符:^.{3}$ | |||
验证由26个英文字母组成的字符串:^[A-Za-z]+$ | |||
验证由26个大写英文字母组成的字符串:^[A-Z]+$ | |||
验证由26个小写英文字母组成的字符串:^[a-z]+$ | |||
验证由数字和26个英文字母组成的字符串:^[A-Za-z0-9]+$ | |||
验证由数字、26个英文字母或者下划线组成的字符串:^\w+$ | |||
验证用户密码:^[a-zA-Z]\w{5,17}$ 正确格式为:以字母开头,长度在6-18之间,只能包含字符、数字和下划线。 | |||
验证是否含有 ^%&',;=?$\" 等字符:[^%&',;=?$\x22]+ | |||
验证汉字:^[\u4e00-\u9fa5],{0,}$ | |||
验证Email地址:/^([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+\.[a-zA-Z]{2,3}$/ | |||
验证InternetURL:^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$ ;^[a-zA-z]+://(w+(-w+)*)(.(w+(-w+)*))*(?S*)?$ | |||
验证电话号码:^(\(\d{3,4}\)|\d{3,4}-)?\d{7,8}$:--正确格式为:XXXX-XXXXXXX,XXXX-XXXXXXXX,XXX-XXXXXXX,XXX-XXXXXXXX,XXXXXXX,XXXXXXXX。 | |||
验证身份证号(15位或18位数字):^\d{15}|\d{}18$ | |||
验证一年的12个月:^(0?[1-9]|1[0-2])$ 正确格式为:“01”-“09”和“1”“12” | |||
验证一个月的31天:^((0?[1-9])|((1|2)[0-9])|30|31)$ 正确格式为:01、09和1、31。 | |||
整数:^-?\d+$ | |||
非负浮点数(正浮点数 + 0):^\d+(\.\d+)?$ | |||
正浮点数 ^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$ | |||
非正浮点数(负浮点数 + 0) ^((-\d+(\.\d+)?)|(0+(\.0+)?))$ | |||
负浮点数 ^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$ | |||
浮点数 ^(-?\d+)(\.\d+)?$ |
@@ -0,0 +1,101 @@ | |||
<template> | |||
<div class="pullItem"> | |||
<p :class="item.cls" @click.stop="selectItem(item)" v-for="(item,index) in data" :key="index">{{item.name}}<span class="icon icon-duihaocheckmark17"></span></p> | |||
</div> | |||
</template> | |||
<script> | |||
export default { | |||
name: 'BottomSection', | |||
props:['data','noticeParent'], | |||
data () { | |||
return { | |||
} | |||
}, | |||
methods:{ | |||
selectItem:function(item){ | |||
this.noticeParent(item); | |||
} | |||
} | |||
} | |||
</script> | |||
<style scoped> | |||
.chooseZh {padding-top:30px;} | |||
.right { | |||
width:80%; | |||
border:1px solid #e6e6e6; | |||
border-radius:5px; | |||
padding:5px 0 0; | |||
margin:auto; | |||
} | |||
.defaultSpan { | |||
display:inline-block; | |||
height:26px; | |||
line-height:26px; | |||
margin-bottom:5px; | |||
margin-left:5px; | |||
} | |||
.groupSpan { | |||
float:left; | |||
/* width:90%; */ | |||
margin-left:5px; | |||
overflow-x:hidden; | |||
overflow-y:auto; | |||
max-height:150px; | |||
} | |||
.groupSpan span.icon{font-size:12px;} | |||
.item { | |||
background:aliceblue; | |||
border-radius:5px; | |||
padding:5px; | |||
margin-right:5px; | |||
margin-bottom:5px; | |||
} | |||
.delG { | |||
width:15px; | |||
height:15px; | |||
margin-left:3px; | |||
border:1px solid #e6e6e6; | |||
border-radius:50%; | |||
background-color:#f2f2f2; | |||
} | |||
.clear { | |||
width:15px; | |||
height:15px; | |||
margin-right:5px; | |||
margin-top:6px; | |||
} | |||
.pull { | |||
width:15px; | |||
height:15px; | |||
margin-top:6px; | |||
margin-right:5px; | |||
} | |||
.pullItem p {text-align: left} | |||
.pullItem p span{float: right} | |||
.pullItem { | |||
overflow-x:hidden; | |||
overflow-y:auto; | |||
width:80%; | |||
margin:auto; | |||
max-height:150px; | |||
margin-bottom:10px; | |||
border:1px solid #e6e6e6; | |||
border-top:none; | |||
border-radius:0 0 5px 5px; | |||
} | |||
.pullItem p { | |||
height:30px; | |||
line-height:30px; | |||
padding:0 5px; | |||
} | |||
.pullItem p:HOVER {background-color:cornflowerblue;color:white;} | |||
.pullItemCkBgc {background-color:cornflowerblue;} | |||
.over {overflow:hidden;} | |||
.fl {float:left;} | |||
.fr {float:right;} | |||
.input{height: 30px;width: 200px;border:none;outline: none} | |||
</style> |
@@ -0,0 +1,106 @@ | |||
<template> | |||
<div> | |||
<span class="groupSpan over" v-for="(item,index) in data" :key="index"> | |||
<div class="item over fl"> | |||
<span class="fl">{{item.name}}</span> | |||
<span class="icon icon-cuo" @click.stop="removeItem(item)"></span> | |||
</div> | |||
</span> | |||
</div> | |||
</template> | |||
<script> | |||
export default { | |||
name: 'LeftSection', | |||
components: {}, | |||
props:["data","noticeParent"], | |||
data () { | |||
return { | |||
} | |||
}, | |||
methods:{ | |||
removeItem:function(item){ | |||
this.noticeParent(item); | |||
} | |||
} | |||
} | |||
</script> | |||
<style scoped> | |||
.chooseZh {padding-top:30px;} | |||
.right { | |||
width:80%; | |||
border:1px solid #e6e6e6; | |||
border-radius:5px; | |||
padding:5px 0 0; | |||
margin:auto; | |||
} | |||
.defaultSpan { | |||
display:inline-block; | |||
height:26px; | |||
line-height:26px; | |||
margin-bottom:5px; | |||
margin-left:5px; | |||
} | |||
.groupSpan { | |||
float:left; | |||
/* width:90%; */ | |||
margin-left:5px; | |||
overflow-x:hidden; | |||
overflow-y:auto; | |||
max-height:150px; | |||
} | |||
.groupSpan span.icon{font-size:12px;} | |||
.item { | |||
background:aliceblue; | |||
border-radius:5px; | |||
padding:5px; | |||
margin-right:5px; | |||
margin-bottom:5px; | |||
} | |||
.delG { | |||
width:15px; | |||
height:15px; | |||
margin-left:3px; | |||
border:1px solid #e6e6e6; | |||
border-radius:50%; | |||
background-color:#f2f2f2; | |||
} | |||
.clear { | |||
width:15px; | |||
height:15px; | |||
margin-right:5px; | |||
margin-top:6px; | |||
} | |||
.pull { | |||
width:15px; | |||
height:15px; | |||
margin-top:6px; | |||
margin-right:5px; | |||
} | |||
.pullItem p {text-align: left} | |||
.pullItem p span{float: right} | |||
.pullItem { | |||
overflow-x:hidden; | |||
overflow-y:auto; | |||
width:80%; | |||
margin:auto; | |||
max-height:150px; | |||
margin-bottom:10px; | |||
border:1px solid #e6e6e6; | |||
border-top:none; | |||
border-radius:0 0 5px 5px; | |||
} | |||
.pullItem p { | |||
height:30px; | |||
line-height:30px; | |||
padding:0 5px; | |||
} | |||
.pullItem p:HOVER {background-color:cornflowerblue;color:white;} | |||
.over {overflow:hidden;} | |||
.fl {float:left;} | |||
.fr {float:right;} | |||
.input{height: 30px;width: 200px;border:none;outline: none} | |||
</style> |
@@ -0,0 +1,171 @@ | |||
<template> | |||
<div class="chooseZh"> | |||
<div class="right" id="zhPull"> | |||
<div class="over" style="text-align: left;"> | |||
<left-section :data="datas.leftArray" :notice-parent="noticeFromLeft"></left-section> | |||
<input @click.stop="clickInput" type="text" class="input" v-model="datas.searchName" @input="inputChange" /> | |||
{{datas.searchName}} | |||
</div> | |||
<bottom-section :data="datas.bottomArray" :notice-parent="noticeFromBottom"></bottom-section> | |||
</div> | |||
</div> | |||
</template> | |||
<script> | |||
import CommonUtil from '../../tool/commonUtil.js'; | |||
import LeftSection from "./left.vue"; | |||
import BottomSection from "./bottom.vue"; | |||
export default { | |||
name: 'LocalSelect', | |||
props:["data","analysis"], | |||
components: {LeftSection,BottomSection}, | |||
data () { | |||
return { | |||
datas:{ | |||
searchName:"", | |||
bottomArray:[], | |||
leftArray:[], | |||
} | |||
} | |||
}, | |||
computed:{ | |||
originData:function(){ | |||
let tmp = CommonUtil.object.cloneObj(this.analysis(this.data)); | |||
if(tmp && tmp instanceof Array){ | |||
tmp.forEach(item=>{ | |||
item.ck = false; | |||
item.__tmpId = Math.ceil(Math.random()*10000000000000000); | |||
item.cls = ""; | |||
}) | |||
return CommonUtil.object.addPrimaryAndCk(tmp); | |||
} | |||
return []; | |||
} | |||
}, | |||
methods:{ | |||
clickInput:function(){ | |||
if(this.datas.searchName != ""){ | |||
this.datas = { | |||
searchName:"", | |||
bottomArray:[], | |||
leftArray:this.datas.leftArray | |||
} | |||
}else{ | |||
this.datas.bottomArray = this.fliterOriginData(); | |||
} | |||
}, | |||
inputChange:function(){ | |||
this.datas.bottomArray = this.fliterOriginData(); | |||
}, | |||
fliterOriginData:function(){ | |||
let res = this.originData.filter(item=>{ | |||
return item.name.indexOf(this.datas.searchName) != -1; | |||
}) | |||
return res; | |||
}, | |||
init:function(data){ | |||
this.data = data; | |||
}, | |||
updateLeftBottom:function(item){ | |||
this.datas = { | |||
searchName:"", | |||
bottomArray:this.originData, | |||
leftArray:CommonUtil.object.getCheckedItems(this.originData).items | |||
} | |||
}, | |||
noticeFromBottom:function(item){ | |||
if(item.ck){ | |||
item.ck = false; | |||
item.cls = ""; | |||
}else{ | |||
item.ck = true; | |||
item.cls = "pullItemCkBgc"; | |||
} | |||
this.updateLeftBottom(item); | |||
}, | |||
noticeFromLeft:function(item){ | |||
item.ck = false; | |||
item.cls = ""; | |||
this.updateLeftBottom(item); | |||
}, | |||
bodyClick:function(){ | |||
this.datas = { | |||
searchName:"", | |||
bottomArray:[], | |||
leftArray:CommonUtil.object.getCheckedItems(this.originData).items | |||
} | |||
}, | |||
getSelectedItems:function(){ | |||
return CommonUtil.object.cloneObj(CommonUtil.object.getCheckedItems(this.originData,"code")); | |||
} | |||
}, | |||
created () { | |||
document.body.addEventListener("click",this.bodyClick,false); | |||
}, | |||
beforeDestroy () { | |||
document.body.removeEventListener("click",this.bodyClick) | |||
} | |||
} | |||
</script> | |||
<style scoped> | |||
.chooseZh {padding-top:30px;} | |||
.right { | |||
width:80%; | |||
border:1px solid #e6e6e6; | |||
border-radius:5px; | |||
padding:5px 0 0; | |||
margin:auto; | |||
} | |||
.defaultSpan { | |||
display:inline-block; | |||
height:26px; | |||
line-height:26px; | |||
margin-bottom:5px; | |||
margin-left:5px; | |||
} | |||
.groupSpan { | |||
float:left; | |||
/* width:90%; */ | |||
margin-left:5px; | |||
overflow-x:hidden; | |||
overflow-y:auto; | |||
max-height:150px; | |||
} | |||
.groupSpan span.icon{font-size:12px;} | |||
.item { | |||
background:aliceblue; | |||
border-radius:5px; | |||
padding:5px; | |||
margin-right:5px; | |||
margin-bottom:5px; | |||
} | |||
.delG { | |||
width:15px; | |||
height:15px; | |||
margin-left:3px; | |||
border:1px solid #e6e6e6; | |||
border-radius:50%; | |||
background-color:#f2f2f2; | |||
} | |||
.clear { | |||
width:15px; | |||
height:15px; | |||
margin-right:5px; | |||
margin-top:6px; | |||
} | |||
.pull { | |||
width:15px; | |||
height:15px; | |||
margin-top:6px; | |||
margin-right:5px; | |||
} | |||
.over {overflow:hidden;} | |||
.fl {float:left;} | |||
.fr {float:right;} | |||
.input{height: 30px;width: 200px;border:none;outline: none} | |||
</style> |
@@ -0,0 +1,174 @@ | |||
<template> | |||
<tbody> | |||
<tr v-for="(row,index) in data" @click="e=>selectRow(row,e)" :key="index" v-if="data && data.length>0"> | |||
<td v-if="showCk"> | |||
<div v-if="singleSelected"> | |||
<input :name="radioKey" type="radio" :checked="row.ck" /> | |||
</div> | |||
<div v-else> | |||
<input type="checkbox" :checked="row.ck" /> | |||
</div> | |||
</td> | |||
<td v-for="(item,idx) in cols" :key="idx" :style="item.key=='title'&&textAlignKey==true?'text-align:left;':''"> | |||
<div v-if="item.etype == 'img'"> | |||
<img style="width:100px;height:75px;border-radius:5px;" v-bind:src="row[item.key]" /> | |||
</div> | |||
<div v-else style="position:relative;"> | |||
<a v-if="item.convert && item.action" @click.prevent="e=>item.action(row,item)"> | |||
{{item.convert(item,row)}} | |||
</a> | |||
<span v-if="item.convert && !item.action"> | |||
{{item.convert(item,row)}} | |||
</span> | |||
<a v-if="!item.convert && item.action" @click.prevent="e=>item.action(row,item)"> | |||
{{getValByFieldInRow(item,row)}} | |||
</a> | |||
<span v-if="!item.convert && !item.action"> | |||
{{getValByFieldInRow(item,row)}} | |||
</span> | |||
<img v-if="item.img && item.img(item, row)" style="display:block;position:absolute;top:0;right:0;" :src="item.img(item, row)"/> | |||
</div> | |||
</td> | |||
<td v-if="actions && actions.length != 0" class="operationButtonBox"> | |||
<span class="tableBtn" style="color:rgb(200, 89, 99);" v-if="actionShowFn(x,row)" v-for="(x,i) in actions" @click.prevent="e=>{x.action(row)}" :key="i"> | |||
<i class="iconfont" v-if="x.val=='编辑'"></i><i class="iconfont" v-if="x.val=='复制'"></i><i class="iconfont" v-if="x.val=='投放'"></i><i class="iconfont" v-if="x.val=='上线'"></i><i class="iconfont" v-if="x.val=='查看'" style="font-size:12px !important;"></i><i class="iconfont" v-if="x.val=='修改'"></i><i class="iconfont" v-if="x.val=='退款'"></i><i class="iconfont" v-if="x.val=='下线'"></i><i class="" v-if="x.val=='作废'"></i><i class="" v-if="x.val=='停用'"></i><i class="" v-if="x.val=='删除'"></i><i class="iconfont" v-if="x.val=='终止'"></i><i class="iconfont" v-if="x.val=='周期'"></i><i class="" v-if="x.val=='结单'"></i>{{x.val}} | |||
</span> | |||
</td> | |||
</tr> | |||
<tr v-if="!data||data.length==0"> | |||
<td :colspan="[actions && actions.length != 0?cols.length:(cols.length+1)]" style="text-align:center !important;">暂无数据</td> | |||
</tr> | |||
</tbody> | |||
</template> | |||
<script> | |||
import Util from "../../tool/commonUtil.js"; | |||
import { mapState, mapActions } from "vuex"; | |||
export default { | |||
name: "BodySection", | |||
props: ["actions", "data", "cols", "accpetHBNotice", "showCk", "singleSelected"], | |||
data() { | |||
return { | |||
radioKey: Math.ceil(Math.random() * 10000000), | |||
textAlignKey:false, | |||
} | |||
}, | |||
computed: { | |||
...mapState({ | |||
topNav: state => state.topNav.data, //将 this.topNav 映射为 this.$store.topNav.data | |||
navigationInfo: state => state.topNav.navigationInfo | |||
}), | |||
}, | |||
created() { | |||
this.cols.forEach(s => { | |||
if (s.etype == 'img') { | |||
this.textAlignKey = true; | |||
} | |||
}); | |||
}, | |||
methods: { | |||
actionShowFn(action, row) { | |||
if (action.show) { | |||
return action.show(row); | |||
} else { | |||
return true; | |||
} | |||
return; | |||
}, | |||
selectRow: function(row, e) { | |||
if (this.singleSelected) { | |||
this.data.forEach(el => { | |||
el.ck = false; | |||
}); | |||
} | |||
row.ck = !row.ck; | |||
this.accpetHBNotice(null, { data: this.data }); | |||
}, | |||
getValByFieldInRow: function(item, row) { | |||
let key = item.key; | |||
let val = ""; | |||
if (typeof row[key] == "boolean") { | |||
val = row[key].toString(); | |||
} else { | |||
let v = "row." + item.key; | |||
let tmp = eval("(" + v + ")"); | |||
if (tmp == undefined) { | |||
val = ""; | |||
} else { | |||
let type = item.type; | |||
if (type) { | |||
type = type.toLowerCase(); | |||
switch (type) { | |||
case "date": | |||
val = Util.date.date(tmp); | |||
break; | |||
case "datetime": | |||
val = Util.date.dateTime(tmp); | |||
break; | |||
case "time": | |||
val = Util.date.time(tmp); | |||
break; | |||
default: | |||
val = tmp; | |||
} | |||
} else { | |||
val = tmp; | |||
} | |||
} | |||
} | |||
return val; | |||
} | |||
} | |||
} | |||
</script> | |||
<style scoped> | |||
.tableList .relative { | |||
position: relative; | |||
} | |||
.tableList .maskLayer { | |||
position: absolute; | |||
left: 0; | |||
top: 0; | |||
bottom: 0; | |||
right: 0; | |||
} | |||
.btnCls { | |||
margin: 0 5px; | |||
} | |||
tbody tr:hover { | |||
background: #f5f7f8 !important; | |||
} | |||
tbody tr td { | |||
color: rgba(0, 0, 0, 0.65); | |||
border-bottom: 1px solid #ddd; | |||
vertical-align: middle; | |||
text-align: center; | |||
} | |||
.operationButtonBox { | |||
width: 160px !important; | |||
overflow: hidden; | |||
} | |||
.tableBtn { | |||
display: inline-block; | |||
font-size: 14px !important; | |||
margin: 5px 7px !important; | |||
cursor: pointer; | |||
/* display: inline-block; */ | |||
} | |||
.tableBtn i { | |||
font-size: 14px !important; | |||
margin-right: 6px !important; | |||
font-weight: bolder; | |||
} | |||
.btn-sm { | |||
padding: 0 10px; | |||
} | |||
</style> |
@@ -0,0 +1,102 @@ | |||
<template> | |||
<thead> | |||
<tr> | |||
<th v-if="showCk"> | |||
<div v-if="!singleSelected"> | |||
<input type="checkbox" :checked="ck" @click="setAll" /> | |||
</div> | |||
</th> | |||
<th v-for="(item,index) in cols" :key="index" class="thCols"> | |||
{{item.val}} | |||
<i v-if="false" class="icon icon-caidan menu" @click.stop="showChangeColsDialog"></i> | |||
<!-- <i v-if="index == 0 ? true : false" class="icon icon-caidan menu" @click.stop="showChangeColsDialog"></i> --> | |||
<div class="colsModal" v-if="index == 0 && colsModalShow ? true : false" @click.stop> | |||
<div v-for="(item,index) in defaultCols" :key="index"> | |||
<p> | |||
<input type="checkbox" :checked="item.ck" @click.stop="e=>{itemCheckChange(item,e)}" /> | |||
<span>{{item.val}}</span> | |||
</p> | |||
</div> | |||
</div> | |||
</th> | |||
<th v-if="actions && actions.length != 0"> | |||
操作 | |||
</th> | |||
</tr> | |||
</thead> | |||
</template> | |||
<script> | |||
import Util from "../../tool/commonUtil.js"; | |||
export default { | |||
props:["originCols","accpetHBNotice","noticeChangeCols","ck","actions","cols","showCk","singleSelected"], | |||
name: "HeaderSection", | |||
data(){ | |||
return { | |||
colsModalShow:false | |||
} | |||
}, | |||
computed:{ | |||
defaultCols:function(){ | |||
return Util.object.addPrimaryAndCk(Util.object.deepArrayClone(this.originCols),true); | |||
} | |||
}, | |||
methods:{ | |||
setAll:function(){ | |||
this.accpetHBNotice({ck:!this.ck},null); | |||
}, | |||
itemCheckChange:function(item,e){ | |||
item.ck = !item.ck; | |||
e.target.checked = item.ck; | |||
this.reSetCols(); | |||
}, | |||
reSetCols:function(){ | |||
let cols = Util.object.getCheckedItems(this.defaultCols).items; | |||
if(cols.length == 0){ | |||
this.noticeChangeCols(this.defaultCols); | |||
this.defaultCols.forEach(item => { | |||
item.ck = true; | |||
}); | |||
}else{ | |||
this.noticeChangeCols(cols); | |||
} | |||
}, | |||
showChangeColsDialog:function(){ | |||
this.colsModalShow = this.colsModalShow ? false : true; | |||
}, | |||
bodyClick:function(){ | |||
console.log("body click"); | |||
this.colsModalShow = false; | |||
} | |||
}, | |||
updated(a,b) { | |||
}, | |||
mounted(){ | |||
}, | |||
created () { | |||
document.body.addEventListener("click",this.bodyClick,false); | |||
}, | |||
beforeDestroy () { | |||
document.body.removeEventListener("click",this.bodyClick) | |||
} | |||
} | |||
</script> | |||
<style scoped> | |||
.enterIndexCls{width: 50px;display: inline-block;} | |||
.colsModal{border:1px solid #ddd;padding:10px;border-radius: 3px;position: absolute;left:30px;top:0;background: #fff;color: #000;z-index: 999;} | |||
.colsModal p {text-align: left;} | |||
.colsModal p input{float: left;margin-left: 15px;margin-right: 15px;} | |||
.thCols {position: relative;} | |||
/* .thCols:nth-of-type(2){ | |||
width:100px; | |||
} */ | |||
.colsModal .bot input{width: 50px;line-height: 15px;margin: 0 5px;} | |||
.menu{position: absolute;left:10px;top:0;font-size: 20px;} | |||
thead tr th{border-bottom:1px solid rgba(0,0,0,0.09);font-weight: 400;text-align: center; | |||
color:#fff;font-size: 14px;} | |||
</style> |
@@ -0,0 +1,105 @@ | |||
<template> | |||
<div class="pageNumCls" > | |||
<nav aria-label="Page navigation example"> | |||
<ul class="pagination"> | |||
<li class="page-item"><a class="page-link span">总条数:{{count}}</a></li> | |||
<li class="page-item" @click="this.prev"><a class="page-link button" >上一页</a></li> | |||
<li class="page-item" @click="this.next"><a class="page-link button" >下一页</a></li> | |||
<li class="page-item"><a class="page-link span">当前页</a></li> | |||
<li class="page-item"><a class="page-link span">{{index}}/{{total}}</a></li> | |||
<li class="page-item"><span class="page-link span">跳至</span></li> | |||
<li class="page-item"><input type="text" :ref="this.goIndexKey" class="enter-number" placeholder=''/></li> | |||
<li class="page-item"><span class="page-link span">页</span></li> | |||
<li class="page-item" @click="this.goToIndex"><a class="page-link button">跳至此页</a></li> | |||
</ul> | |||
</nav> | |||
</div> | |||
</template> | |||
<script> | |||
export default { | |||
props:["options","goNext","goPrev","goIndex"], | |||
name: "PagingSection", | |||
data(){ | |||
return { | |||
goIndexKey:Math.ceil(Math.random()*10000000000) | |||
} | |||
}, | |||
computed:{ | |||
index:function(){ | |||
return this.options.index; | |||
}, | |||
count:function(){ | |||
return this.options.count; | |||
}, | |||
total:function(){ | |||
return this.options.total; | |||
} | |||
}, | |||
methods:{ | |||
next:function () { | |||
if(this.index >= this.total){ | |||
return; | |||
} | |||
this.goNext(); | |||
}, | |||
prev:function () { | |||
if(this.index <=1){ | |||
return; | |||
} | |||
this.goPrev(); | |||
}, | |||
goToIndex:function () { | |||
let eIndex = this.$refs[this.goIndexKey].value; | |||
if( eIndex > this.total || eIndex< 1 || isNaN(eIndex)){ | |||
this.$refs[this.goIndexKey].value = ""; | |||
return; | |||
} | |||
this.goIndex(eIndex); | |||
} | |||
}, | |||
updated(a,b) { | |||
}, | |||
created(){ | |||
} | |||
} | |||
</script> | |||
<style scoped> | |||
.button{ | |||
cursor: pointer; | |||
} | |||
.paging{height: 26px; margin: 30px 0; line-height: 26px;} | |||
.paging input[type=button]{ | |||
height: 26px; | |||
min-width: 26px; | |||
padding: 0 5px; | |||
border: 1px solid #dfdfdf; | |||
box-sizing: border-box; | |||
background: none; | |||
margin-right: 4px; | |||
border-radius: 5px;} | |||
.paging input[type=text]{width: 30px; height: 20px; border: 1px solid #797979; text-align: center;} | |||
.paging span{padding: 0 5px;} | |||
.pageNumCls{margin-right: 20px;} | |||
.pagination{ | |||
list-style: none;overflow: hidden; | |||
} | |||
.pagination>li{ | |||
display: block;float: left;margin-left: 8px; | |||
} | |||
.pagination>li>a, .pagination>li>span{ | |||
border-radius: 6px;padding: 0 10px;line-height: 30px;color: rgba(0,0,0,0.65); | |||
} | |||
.pagination .enter-number{ | |||
border: 1px solid rgba(217,217,217,1);line-height: 30px;width: 54px; | |||
padding: 0 5px;border-radius: 6px;outline: none; | |||
} | |||
</style> | |||
<style> | |||
.span{ border:1px #fff solid!important; } | |||
.span:hover{ | |||
background-color:#fff!important; | |||
} | |||
</style> |
@@ -0,0 +1,198 @@ | |||
<template> | |||
<div class="tableContainer"> | |||
<table class="table"> | |||
<header-section :singleSelected="singleSelected" :show-ck="showCk" :origin-cols="originCols" :accpet-h-b-notice="accpetHBNotice" :notice-change-cols="noticeChangeCols" :ck="state.ck" :actions="actions" :cols="state.cols"></header-section> | |||
<body-section :singleSelected="singleSelected" :show-ck="showCk" :actions="actions" :cols="state.cols" :accpet-h-b-notice="accpetHBNotice" :data="state.data"></body-section> | |||
</table> | |||
<div v-if="showIf"> | |||
<paging-section :options="state.pageOption" :go-index="gIndex" :go-prev="prev" :go-next="next"></paging-section> | |||
</div> | |||
</div> | |||
</template> | |||
<script> | |||
import HeaderSection from "./header.vue"; | |||
import BodySection from "./body.vue"; | |||
import PagingSection from "./paging.vue"; | |||
import Util from "../../tool/commonUtil.js"; | |||
import CommonUtil from '../../tool/commonUtil.js'; | |||
export default { | |||
components: {HeaderSection,BodySection,PagingSection}, | |||
props:["options"], | |||
name: "TableList", | |||
data(){ | |||
return { | |||
showIf:this.options.pageOption.showIf==false?false:true, | |||
state:{ | |||
data:[], | |||
cols:this.options.map, | |||
ck:false, | |||
pageOption:{ | |||
index:this.options.pageOption.index?this.options.pageOption.index:1, | |||
size:this.options.pageOption.size?this.options.pageOption.size:10, | |||
count:0, | |||
total:0, | |||
showIf:true | |||
} | |||
} | |||
} | |||
}, | |||
computed:{ | |||
originCols:function(){ | |||
return Util.object.deepArrayClone(this.options.map); | |||
}, | |||
showCk:function(){ | |||
return this.options.showCk; | |||
}, | |||
actions:function(){ | |||
return this.options.actions; | |||
}, | |||
getUrl:function(){ | |||
return this.options.getUrl; | |||
}, | |||
singleSelected:function(){ | |||
return this.options.singleSelected; | |||
} | |||
}, | |||
methods:{ | |||
getData:function(index){ | |||
if(!index){ | |||
index = 1; | |||
} | |||
let url = this.options.getUrl(); | |||
if( url === ""){ | |||
return; | |||
} | |||
let suffix = url.indexOf('?') === -1?"?":"&"; | |||
let size = this.state.pageOption.size; | |||
url += suffix + this.options.pageOption.indexKey + "=" + index + "&"+ this.options.pageOption.sizeKey + "=" + size; | |||
this.getFetch(url).then(data=>{ | |||
let res = {}; | |||
if(this.options.analysis){ | |||
res = this.options.analysis(data); | |||
}else{ | |||
res = data; | |||
} | |||
if(res.data && res.data instanceof Array && res.data.length != 0){ | |||
let arr = Util.object.addPrimaryAndCk(res.data); | |||
let total = -1; | |||
if(parseInt(res.count)%size == 0){ | |||
total = parseInt(res.count)/size; | |||
}else{ | |||
total = parseInt(parseInt(res.count)/size) + 1; | |||
} | |||
this.state = { | |||
data:arr, | |||
cols:this.state.cols, | |||
ck:false, | |||
pageOption:{ | |||
index:index, | |||
count:res.count, | |||
total:total, | |||
size:size | |||
} | |||
} | |||
}else{ | |||
this.state = { | |||
data:[], | |||
cols:this.state.cols, | |||
ck:false, | |||
pageOption:{ | |||
index:1, | |||
count:0, | |||
total:0, | |||
size:size | |||
} | |||
} | |||
Util.throwError("检查analysis, getUrl, pageOption参数!"); | |||
} | |||
}) | |||
}, | |||
accpetHBNotice:function(hData,bData){ | |||
//如果data有参数,说明是从head过来的通知,如果没有就说明是body过来的通知 | |||
if(hData){ | |||
this.state.data.map(item=>{ | |||
item.ck = hData.ck; | |||
}) | |||
this.state = { | |||
data:this.state.data, | |||
ck:hData.ck, | |||
cols:this.state.cols, | |||
pageOption:this.state.pageOption | |||
} | |||
} | |||
if(bData){ | |||
let items = Util.object.getCheckedItems(bData.data); | |||
let flag = items.items.length == this.state.data.length?true:false; | |||
this.state = { | |||
data:bData.data, | |||
ck:flag, | |||
cols:this.state.cols, | |||
pageOption:this.state.pageOption | |||
} | |||
} | |||
}, | |||
noticeChangeCols:function(map){ | |||
this.state.cols = map; | |||
}, | |||
prev:function(){ | |||
let index = this.state.pageOption.index; | |||
index--; | |||
this.getData(index); | |||
}, | |||
next:function(){ | |||
let index = this.state.pageOption.index; | |||
index++; | |||
this.getData(index); | |||
}, | |||
gIndex:function(index){ | |||
this.getData(index); | |||
}, | |||
getCheckedItems(field){ | |||
let res = {data:[],vals:[]}; | |||
if(this.state.data && this.state.data instanceof Array){ | |||
this.state.data.forEach(x=>{ | |||
if(x.ck){ | |||
res.data.push(x); | |||
if(field){ | |||
res.vals.push(x[field]); | |||
} | |||
} | |||
}) | |||
} | |||
return res; | |||
}, | |||
getParams(){ | |||
return {index:this.state.pageOption.index,data:this.state.data}; | |||
}, | |||
search(index){ | |||
if(!index){ | |||
this.getData(); | |||
}else{ | |||
this.getData(this.state.pageOption.index); | |||
} | |||
}, | |||
// removeItems(items){ | |||
// this.state.data = CommonUtil.arrayServer.removeItems(items); | |||
// } | |||
}, | |||
created(){ | |||
console.log(this.state.pageOption,22222) | |||
}, | |||
mounted () { | |||
this.getData(this.state.pageOption.index); | |||
console.log(this.state.pageOption); | |||
}, | |||
destroyed(){ | |||
} | |||
} | |||
</script> | |||
<style scoped> | |||
table thead{background:#409EFF;} | |||
</style> |
@@ -0,0 +1,118 @@ | |||
<template> | |||
<div class="upaload"> | |||
<span class="input-file">请选择 | |||
<input @change="change" type="file" :ref="fkey" class="imgFile"></span> | |||
<img v-show="showLoading" src="https://p2.lefile.cn/product/adminweb/2018/05/28/6f7b5572-8693-4f6c-a041-cf6f32b367ac.gif" class="loading"> | |||
<span style="margin-left:10px;" >{{msg}}</span> | |||
<!-- <input type="button" style="margin-left:10px;" class="btn btn-info" @click="upload" value="上传" /> --> | |||
</div> | |||
</template> | |||
<script> | |||
export default { | |||
components: {}, | |||
props:["fname","url","completedCallback","vtype"], | |||
name: "FileUpload", | |||
data(){ | |||
return { | |||
fkey:Math.ceil(Math.random()*1000000000), | |||
showLoading:false, | |||
msg:"" | |||
} | |||
}, | |||
computed:{ | |||
}, | |||
methods:{ | |||
change:function(){ | |||
let val = this.$refs[this.fkey].value; | |||
this.msg = val.substring(val.lastIndexOf('\\') + 1); | |||
this.upload(); | |||
}, | |||
resetFileInput:function(){ | |||
this.$refs[this.fkey].value = ""; | |||
}, | |||
upload:function(){ | |||
let dom = this.$refs[this.fkey]; | |||
let val = dom.value; | |||
if(val){ | |||
let formData = new FormData(); | |||
formData.append(this.fname,dom.files[0]); | |||
if(this.vtype){ | |||
let fileName = dom.files[0].name; | |||
var suffix = fileName.substring(fileName.lastIndexOf('.')+1); | |||
if(this.vtype.indexOf(',') == -1){ | |||
if(this.vtype != suffix){ | |||
this.msg = "后缀名必须为:"+ this.vtype; | |||
return; | |||
} | |||
}else{ | |||
let res = this.vtype.split(',').filter(item=>{ | |||
return item.toLowerCase() == suffix.toLowerCase(); | |||
}) | |||
if(res.length == 0){ | |||
this.msg = "后缀名必须为:"+ this.vtype; | |||
return; | |||
} | |||
} | |||
} | |||
this.showLoading = true; | |||
this.uploadFetch(this.url,formData).then((result) => { | |||
this.msg = "上传成功"; | |||
this.showLoading = false; | |||
this.completedCallback({success:true,data:result}); | |||
}).catch((err) => { | |||
this.showLoading = false; | |||
this.msg = "上传异常"; | |||
this.resetFileInput(); | |||
this.completedCallback({success:false,data:err}); | |||
}); | |||
}else{ | |||
this.msg = "请选择文件"; | |||
} | |||
} | |||
}, | |||
created(){ | |||
}, | |||
mounted () { | |||
} | |||
} | |||
</script> | |||
<style scoped> | |||
.imgFile{ | |||
cursor:pointer; | |||
} | |||
.input-file { | |||
position: relative; | |||
overflow: hidden; | |||
text-align: center; | |||
width: 100%; | |||
background-color: #2c7; | |||
border-radius: 4px; | |||
padding: 7px 10px; | |||
font-size: 12px; | |||
font-weight: normal; | |||
line-height: 18px; | |||
color: #fff; | |||
text-decoration: none; | |||
} | |||
.input-file input[type="file"] { | |||
cursor:pointer; | |||
position: absolute; | |||
display: block; | |||
top: 0; | |||
right: 0; | |||
font-size: 14px; | |||
background-color: #f00; | |||
/*transform: translate(-300px, 0px) scale(4);*/ | |||
/* height: 100%; | |||
width: 100%; */ | |||
opacity: 0; | |||
filter: alpha(opacity=0); | |||
} | |||
.loading{width:24px;} | |||
</style> |
@@ -0,0 +1,256 @@ | |||
<template> | |||
<div style="margin-top:10px"> | |||
<div class="coverText">1.裁剪图片,图片大小需在2M以内.</div> | |||
<div class="coverText">2.鼠标滚轮可以伸缩图片展示区大小.</div> | |||
<div class="coverText" style="margin-bottom:5px;">{{information}}</div> | |||
<div class="contianer"> | |||
<vueCropper ref="cropper" :img="option.img" :autoCrop="option.autoCrop" :autoCropWidth="option.autoCropWidth" | |||
:autoCropHeight="option.autoCropHeight" :canScale="option.canScale" :outputSize="option.size" | |||
:outputType="option.outputType" :info="true" :full="option.full" :canMove="option.canMove" :canMoveBox="option.canMoveBox" | |||
:fixedBox="option.fixedBox" :original="option.original" :fixed="option.fixed" :fixedNumber="option.fixedNumber" | |||
@realTime="realTime"> | |||
</vueCropper> | |||
</div> | |||
<div class="buttonBox"></div> | |||
<span class="input-file">请选择 | |||
<input class="choiceImg" type="file" name="file" @change="changeEt" value="1" /> | |||
</span> | |||
<!-- <div class="finish" @click="finish('blob')">保存图片</div> --> | |||
<el-button class="finish" :loading="submitButton" type="primary" @click="finish('blob')">保存图片</el-button> | |||
<span class="msg">{{msg}}</span> | |||
</div> | |||
</template> | |||
<script> | |||
import AjaxUtil from "../../../core/tool/ajaxService"; | |||
import vueCropper from 'vue-cropper' | |||
export default { | |||
components: { | |||
vueCropper | |||
}, | |||
props: ["fname", "url", "completedCallback", "vtype", "option"], | |||
name: "FileUpload", | |||
// props: { | |||
// viewImg: { | |||
// url: { | |||
// type: String, | |||
// default: '' | |||
// }, | |||
// scale: { | |||
// type: Number, | |||
// default: 1 / 1 | |||
// }, | |||
// label: { | |||
// type: String, | |||
// default: '' | |||
// } | |||
// } | |||
// }, | |||
data() { | |||
return { | |||
submitButton:false, | |||
msg:"", | |||
information:'', | |||
imgUrl: '', | |||
// option: { | |||
// img: '', | |||
// size: 1, | |||
// full: false, | |||
// outputType: 'png', | |||
// canMove: true, | |||
// fixedBox: false, | |||
// original: false, | |||
// canMoveBox: false, | |||
// canScale: false, | |||
// autoCrop: true, | |||
// autoCropWidth: 200, | |||
// autoCropHeight: 200, | |||
// // // 开启宽度和高度比例 | |||
// fixed: true, | |||
// fixedNumber: [1, 1] | |||
// }, | |||
crap: false, | |||
previews: {}, | |||
files: '' | |||
} | |||
}, | |||
methods: { | |||
changeEt: function (e) { | |||
var file = e.target.files[0] | |||
if (!file) return; | |||
if (/^image\/\w+$/.test(file.type)) { | |||
let uploadedImageURL = URL.createObjectURL(file); | |||
this.files = file | |||
this.option.img = uploadedImageURL; | |||
} | |||
}, | |||
// 实时预览函数 | |||
realTime(data) { | |||
this.previews = data | |||
console.log( JSON.stringify(this.option)) | |||
if(this.option.propertion=='4/3'){ | |||
this.information = '3.宽高比约4:3效果最佳(例:宽800px,高600px)' | |||
}else if(this.option.propertion=='1/1'){ | |||
this.information = '3.宽高比约1:1效果最佳(例:宽400px,高400px)' | |||
}else if(this.option.propertion=='8/3'){ | |||
this.information = '3.宽高比约8:3效果最佳(例:宽800px,高300px)' | |||
} | |||
}, | |||
changeImg() { | |||
this.option.img = this.lists[~~(Math.random() * this.lists.length)].img | |||
}, | |||
startCrop() { | |||
// start | |||
this.crap = true | |||
this.$refs.cropper.startCrop() | |||
}, | |||
stopCrop() { | |||
// stop | |||
this.crap = false | |||
this.$refs.cropper.stopCrop() | |||
}, | |||
clearCrop() { | |||
// clear | |||
this.$refs.cropper.clearCrop() | |||
}, | |||
finish(type) { | |||
this.$refs.cropper.getCropBlob((data) => { | |||
let blob = data | |||
let formData = new FormData() | |||
formData.append('file', blob, this.files.name) | |||
this.msg = '', | |||
this.submitButton = true; | |||
this.uploadFetch(this.url, formData).then((result) => { | |||
this.submitButton = false; | |||
this.$message.success('保存成功'); | |||
this.showLoading = false; | |||
this.completedCallback({ | |||
success: true, | |||
data: result | |||
}); | |||
}).catch((err) => { | |||
this.submitButton = false; | |||
this.msg = "上传失败,图片超2M或上传超时"; | |||
this.completedCallback({ | |||
success: false, | |||
data: err | |||
}); | |||
}); | |||
}) | |||
} | |||
}, | |||
mounted() { | |||
} | |||
} | |||
</script> | |||
<style scoped> | |||
.msg{ | |||
margin-top: 38px; | |||
display: block; | |||
color: red; | |||
font-size: 12px; | |||
} | |||
img{ | |||
max-width: 100%; | |||
} | |||
.buttonBox{ | |||
overflow: hidden; | |||
} | |||
.contianer { | |||
width: 375px; | |||
height: 200px; | |||
position: relative; | |||
border-radius: 4px; | |||
} | |||
.show-preview { | |||
position: absolute; | |||
left: 405px; | |||
bottom: 0px; | |||
background-color: white; | |||
border-radius: 4px; | |||
color: #2c7; | |||
} | |||
.show-text { | |||
position: absolute; | |||
left: 0; | |||
top: -30px; | |||
font-size: 14px; | |||
color: #333; | |||
width: 200px; | |||
} | |||
.imgFile { | |||
cursor: pointer; | |||
} | |||
.input-file { | |||
float: left; | |||
position: relative; | |||
overflow: hidden; | |||
text-align: center; | |||
border: 1px #999 solid; | |||
background-color: #fff; | |||
border-radius: 4px; | |||
padding: 7px 10px; | |||
font-size: 12px; | |||
font-weight: normal; | |||
line-height: 24px; | |||
color: #fff; | |||
text-decoration: none; | |||
display: block; | |||
width: 120px; | |||
color: #666; | |||
margin: 20px 20px 0 0; | |||
} | |||
.input-file input[type="file"] { | |||
cursor: pointer; | |||
position: absolute; | |||
height: 38px; | |||
display: block; | |||
top: 0; | |||
right: 0; | |||
font-size: 14px; | |||
background-color: #f00; | |||
/*transform: translate(-300px, 0px) scale(4);*/ | |||
/* height: 100%; | |||
width: 100%; */ | |||
opacity: 0; | |||
filter: alpha(opacity=0); | |||
} | |||
.finish { | |||
float: left; | |||
margin-top: 20px; | |||
margin-right: 20px; | |||
width: 120px; | |||
height: 40px; | |||
font-size: 12px; | |||
background-color: #2c7; | |||
text-align: center; | |||
color: white; | |||
border-radius: 4px; | |||
cursor: pointer; | |||
border: 1px #2c7 solid; | |||
} | |||
.coverText { | |||
font-size: 12px !important; | |||
color: #999 !important; | |||
font-weight: lighter; | |||
height: 20px; | |||
line-height: 20px; | |||
} | |||
</style> | |||
<style> | |||
.crop-info[data-v-7b077dd1]{ | |||
display: none; | |||
} | |||
</style> | |||
<!-- Add "scoped" attribute to limit CSS to this component only --> |
@@ -0,0 +1,166 @@ | |||
<template> | |||
<div class="upaload"> | |||
<span class="input-file">请选择 | |||
<input @change="change" type="file" :ref="fkey" class="imgFile"></span> | |||
<span @click.stop.prevent="download" class="download-file">下载</span> | |||
<img v-show="showLoading" src="https://p2.lefile.cn/product/adminweb/2018/05/28/6f7b5572-8693-4f6c-a041-cf6f32b367ac.gif" class="loading"> | |||
<span style="margin-left:10px;positon:absolute" >{{msg}}</span> | |||
<!-- <input type="button" style="margin-left:10px;" class="btn btn-info" @click="upload" value="上传" /> --> | |||
<div> | |||
<span class="download-filename">{{fileName}}</span> | |||
</div> | |||
</div> | |||
</template> | |||
<script> | |||
export default { | |||
components: {}, | |||
props:["fname","id","url","completedCallback","vtype"], | |||
name: "FileUpload", | |||
data(){ | |||
return { | |||
fkey:Math.ceil(Math.random()*1000000000), | |||
showLoading:false, | |||
msg:"", | |||
fileurl:"", | |||
fileName:"" | |||
} | |||
}, | |||
computed:{ | |||
}, | |||
methods:{ | |||
change:function(){ | |||
console.log(111) | |||
let val = this.$refs[this.fkey].value; | |||
this.msg = val.substring(val.lastIndexOf('\\') + 1); | |||
this.upload(); | |||
}, | |||
resetFileInput:function(){ | |||
this.$refs[this.fkey].value = ""; | |||
}, | |||
upload:function(){ | |||
let dom = this.$refs[this.fkey]; | |||
let val = dom.value; | |||
if(val){ | |||
let formData = new FormData(); | |||
formData.append(this.fname,dom.files[0]); | |||
if(this.vtype){ | |||
let fileName = dom.files[0].name; | |||
this.fileName=fileName; | |||
var suffix = fileName.substring(fileName.lastIndexOf('.')+1); | |||
if(this.vtype.indexOf(',') == -1){ | |||
if(this.vtype != suffix){ | |||
this.msg = "后缀名必须为:"+ this.vtype; | |||
return; | |||
} | |||
}else{ | |||
let res = this.vtype.split(',').filter(item=>{ | |||
return item.toLowerCase() == suffix.toLowerCase(); | |||
}) | |||
if(res.length == 0){ | |||
this.msg = "后缀名必须为:"+ this.vtype; | |||
return; | |||
} | |||
} | |||
} | |||
this.showLoading = true; | |||
this.uploadFetch(this.url,formData).then((result) => { | |||
debugger | |||
this.msg = "上传成功"; | |||
this.showLoading = false; | |||
this.fileurl=result.data.url; | |||
result.data.filename=this.fileName | |||
this.completedCallback({success:true,data:result}); | |||
}).catch((err) => { | |||
this.showLoading = false; | |||
this.msg = "上传异常"; | |||
this.resetFileInput(); | |||
this.completedCallback({success:false,data:err}); | |||
}); | |||
}else{ | |||
this.msg = "请选择文件"; | |||
} | |||
}, | |||
download:function(){ | |||
if(this.id){ | |||
location.href ="/O/wxRentContract/download?id="+this.id; | |||
}else{ | |||
location.href = this.fileurl; | |||
} | |||
} | |||
}, | |||
created(){ | |||
}, | |||
mounted () { | |||
} | |||
} | |||
</script> | |||
<style scoped> | |||
.imgFile{ | |||
cursor:pointer; | |||
} | |||
.input-file { | |||
position: relative; | |||
overflow: hidden; | |||
text-align: center; | |||
display: inline-block; | |||
width: 120px; | |||
border: 1px #999 solid; | |||
background-color: #fff; | |||
border-radius: 4px; | |||
padding: 7px 10px; | |||
font-size: 12px; | |||
font-weight: normal; | |||
line-height: 24px; | |||
text-decoration: none; | |||
color: #666; | |||
margin: 0 20px 0 30px; | |||
} | |||
.download-file { | |||
position: relative; | |||
overflow: hidden; | |||
text-align: center; | |||
display: inline-block; | |||
width: 120px; | |||
border: 1px #dcdfe6 solid; | |||
background-color: #409EFF; | |||
border-radius: 4px; | |||
padding: 7px 10px; | |||
font-size: 12px; | |||
font-weight: normal; | |||
line-height: 24px; | |||
color: #fff; | |||
text-decoration: none; | |||
margin:0 20px 0 30px; | |||
} | |||
.download-filename{ | |||
width: 120px; | |||
padding: 7px 10px; | |||
display: inline-block; | |||
line-height: 24px; | |||
margin-left: 50px; | |||
} | |||
.input-file input[type="file"] { | |||
cursor:pointer; | |||
position: absolute; | |||
display: block; | |||
top: 0; | |||
right: 0; | |||
font-size: 14px; | |||
background-color: #f00; | |||
/*transform: translate(-300px, 0px) scale(4);*/ | |||
/* height: 100%; | |||
width: 100%; */ | |||
opacity: 0; | |||
filter: alpha(opacity=0); | |||
} | |||
.loading{width:24px;} | |||
</style> |
@@ -0,0 +1,264 @@ | |||
/** | |||
* Created by wupeng5 on 2018/1/7. | |||
*/ | |||
/** | |||
* ajax 处理类, | |||
* get: return promise | |||
* post: return promise | |||
* all: params:PromiseArray, return promise | |||
* 接口返回格式{code:0,message:"xx",data:object} | |||
* code:200, 成功, 其他为失败 | |||
* code:701,未登录 | |||
* code失败的情况下,打印message | |||
* return promise | |||
* | |||
* 组件内部请求ajax必须继承此类extends:AjaxUtil | |||
* | |||
**/ | |||
let param = function(obj) { | |||
var query = ''; | |||
var name, value, fullSubName, subName, subValue, innerObj, i; | |||
for (name in obj) { | |||
value = obj[name]; | |||
if (value instanceof Array) { | |||
for (i = 0; i < value.length; ++i) { | |||
subValue = value[i]; | |||
fullSubName = name + '[' + i + ']'; | |||
innerObj = {}; | |||
innerObj[fullSubName] = subValue; | |||
query += param(innerObj) + '&'; | |||
} | |||
} else if (value instanceof Object) { | |||
for (subName in value) { | |||
subValue = value[subName]; | |||
fullSubName = name + '[' + subName + ']'; | |||
innerObj = {}; | |||
innerObj[fullSubName] = subValue; | |||
query += param(innerObj) + '&'; | |||
} | |||
} else if (value !== undefined && value !== null) { | |||
query += encodeURIComponent(name) + '=' | |||
+ encodeURIComponent(value) + '&'; | |||
} | |||
} | |||
return query.length ? query.substr(0, query.length - 1) : query; | |||
}; | |||
import Q from "q"; | |||
// export default { | |||
// name: "AjaxUtil", | |||
// methods:{ | |||
// getFetch(url){ | |||
// let symbol = url.indexOf('?') == -1?"?":"&"; | |||
// url = url + symbol + "ran="+Math.ceil(Math.random()*10000000); | |||
// let defer = Q.defer(); | |||
// let headers = { | |||
// 'Content-Type': 'application/json; charset=UTF-8' | |||
// }; | |||
// let options = { | |||
// method:"get", | |||
// credentials:'include', | |||
// headers:headers | |||
// }; | |||
// let that = this; | |||
// fetch(url,options).then(d =>d.json()).then(function (data) { | |||
// let code = data.code; | |||
// if(code == "701"){ | |||
// that.$router.push({path:"login"}); | |||
// }else{ | |||
// if(code == "200"){ | |||
// defer.resolve({data:data.data,params:data.params}); | |||
// }else{ | |||
// defer.reject({data: data.message}); | |||
// } | |||
// } | |||
// }).catch(function(err) { | |||
// defer.reject({data: "Server Error!"}); | |||
// throw new Error(url + " request server error!"); | |||
// }); | |||
// return defer.promise; | |||
// }, | |||
// postFetch(url,data){ | |||
// let symbol = url.indexOf('?') == -1?"?":"&"; | |||
// url = url + symbol + "ran="+Math.ceil(Math.random()*10000000); | |||
// let defer = Q.defer(); | |||
// let headers = { | |||
// // 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8' | |||
// 'Content-Type': 'application/json; charset=UTF-8' | |||
// }; | |||
// let options = { | |||
// method:"post", | |||
// credentials:'include', | |||
// headers:headers | |||
// }; | |||
// if(data){ | |||
// // options.body = param(data); | |||
// options.body = JSON.stringify(data); | |||
// } | |||
// let that = this; | |||
// fetch(url,options).then(d =>d.json()).then(function (data) { | |||
// let code = data.code; | |||
// if(code == "701"){ | |||
// that.$router.push({path:"login"}); | |||
// }else{ | |||
// if(code == "200"){ | |||
// defer.resolve({data:data.data,params:data.params}); | |||
// }else{ | |||
// defer.reject({data: data.message}); | |||
// } | |||
// } | |||
// }).catch(function(err) { | |||
// defer.reject({data: "Server Error!"}); | |||
// throw new Error(url + " request server error!"); | |||
// }); | |||
// return defer.promise; | |||
// }, | |||
// uploadFetch(url,data){ | |||
// let symbol = url.indexOf('?') == -1?"?":"&"; | |||
// url = url + symbol + "ran="+Math.ceil(Math.random()*10000000); | |||
// let defer = Q.defer(); | |||
// let options = { | |||
// method:"post", | |||
// credentials:'include' | |||
// }; | |||
// if(data){ | |||
// options.body = data; | |||
// } | |||
// let that = this; | |||
// fetch(url,options).then(d =>d.json()).then(function (data) { | |||
// let code = data.code; | |||
// if(code == "701"){ | |||
// that.$router.push({path:"login"}); | |||
// }else{ | |||
// if(code == "200"){ | |||
// defer.resolve({data:data.data,params:data.params}); | |||
// }else{ | |||
// defer.reject({data: data.message}); | |||
// } | |||
// } | |||
// }).catch(function(err) { | |||
// defer.reject({data: "Server Error!"}); | |||
// throw new Error(url + " request server error!"); | |||
// }); | |||
// return defer.promise; | |||
// }, | |||
// fetchAll(promises){ | |||
// return Q.all(promises); | |||
// } | |||
// }, | |||
// }; | |||
export default { | |||
install:function(Vue){ | |||
Vue.prototype.getFetch=function(url){ | |||
let symbol = url.indexOf('?') == -1?"?":"&"; | |||
url = url + symbol + "ran="+Math.ceil(Math.random()*10000000); | |||
let defer = Q.defer(); | |||
let headers = { | |||
'Content-Type': 'application/json; charset=UTF-8' | |||
}; | |||
let options = { | |||
method:"get", | |||
credentials:'include', | |||
headers:headers | |||
}; | |||
let that = this; | |||
fetch(url,options).then(d =>d.json()).then( (data)=> { | |||
let code = data.code; | |||
if(code == "701"){ | |||
that.$router.push({path:"/login"}); | |||
}else{ | |||
if(code == "200"){ | |||
defer.resolve({data:data.data,params:data.params}); | |||
}else{ | |||
defer.reject({data: data.message}); | |||
} | |||
} | |||
}).catch((err)=> { | |||
defer.reject({data: "Server Error!"}); | |||
// this.showAlertMsg("error","服务器异常"); | |||
throw new Error(url + " request server error!"); | |||
}); | |||
return defer.promise; | |||
}; | |||
Vue.prototype.postFetch = function(url,data){ | |||
let symbol = url.indexOf('?') == -1?"?":"&"; | |||
url = url + symbol + "ran="+Math.ceil(Math.random()*10000000); | |||
let defer = Q.defer(); | |||
let headers = { | |||
// 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8' | |||
'Content-Type': 'application/json; charset=UTF-8', | |||
}; | |||
let options = { | |||
method:"post", | |||
credentials:'include', | |||
headers:headers | |||
}; | |||
if(data){ | |||
// options.body = param(data); | |||
options.body = JSON.stringify(data); | |||
} | |||
let that = this; | |||
fetch(url,options).then(d =>d.json()).then((data)=> { | |||
let code = data.code; | |||
if(code == "701"){ | |||
that.$router.push({path:"/login"}); | |||
}else{ | |||
if(code == "200"){ | |||
defer.resolve({data:data.data,params:data.params}); | |||
}else{ | |||
defer.reject({data: data.message}); | |||
} | |||
} | |||
}).catch(function(err) { | |||
defer.reject({data: "Server Error!"}); | |||
throw new Error(url + " request server error!"); | |||
}); | |||
return defer.promise; | |||
}; | |||
Vue.prototype.uploadFetch = function(url,data){ | |||
let symbol = url.indexOf('?') == -1?"?":"&"; | |||
url = url + symbol + "ran="+Math.ceil(Math.random()*10000000); | |||
let defer = Q.defer(); | |||
let options = { | |||
method:"post", | |||
credentials:'include' | |||
}; | |||
if(data){ | |||
options.body = data; | |||
} | |||
let that = this; | |||
fetch(url,options).then(d =>d.json()).then( (data)=> { | |||
let code = data.code; | |||
if(code == "701"){ | |||
that.$router.push({path:"/login"}); | |||
}else{ | |||
if(code == "200"){ | |||
defer.resolve({data:data.data,params:data.params}); | |||
this.$Message.success(data.message); | |||
}else{ | |||
defer.reject({data: data.message}); | |||
} | |||
} | |||
}).catch(function(err) { | |||
defer.reject({data: "Server Error!"}); | |||
// this.showAlertMsg("error","服务器异常"); | |||
throw new Error(url + " request server error!"); | |||
}); | |||
return defer.promise; | |||
}, | |||
Vue.prototype.fetchAll = (promises)=>{ | |||
return Q.all(promises); | |||
} | |||
} | |||
} |
@@ -0,0 +1,28 @@ | |||
export default { | |||
install:function(Vue){ | |||
Vue.prototype.showConfirm = function(title,cb){ | |||
this.$confirm(title, '提示', { | |||
confirmButtonText: '确定', | |||
cancelButtonText: '取消', | |||
type: 'warning' | |||
}).then(() => { | |||
if(cb){cb()}; | |||
}).catch(() => { | |||
// this.showAlertMsg('info','操作异常!'); | |||
}); | |||
} | |||
Vue.prototype.showAlertMsg =function(type,msg) { | |||
this.$message({ | |||
type: type?type:'success', | |||
message: msg?msg:'操作成功' | |||
}); | |||
} | |||
Vue.prototype.showNotify = function(type,msg,title){ | |||
this.$notify({ | |||
title: title?title:'警告', | |||
type: type?type:'error', | |||
message: msg?msg:"操作成功" | |||
}); | |||
} | |||
} | |||
} |
@@ -0,0 +1,460 @@ | |||
/** | |||
* Created by wupeng5 on 2018/2/1. | |||
*/ | |||
import moment from 'moment'; | |||
let CommonUtil = { | |||
throwError:function(str){ | |||
console.log(str); | |||
//throw new Error(str); | |||
}, | |||
object:{ | |||
equalsObject(source,target){ | |||
let p; | |||
for (p in source) { | |||
if (typeof (target[p]) == 'undefined') { | |||
return false; | |||
} | |||
} | |||
for (p in source) { | |||
if (source[p]) { | |||
switch (typeof (source[p])) { | |||
case 'object': | |||
if (!this.equalsObject(source[p], target[p])) { | |||
return false; | |||
} | |||
break; | |||
case 'function': | |||
if (typeof (target[p]) == 'undefined' || | |||
(p != 'equals' && source[p].toString() != target[p].toString())) | |||
return false; | |||
break; | |||
default: | |||
if (source[p] != target[p]) { | |||
return false; | |||
} | |||
} | |||
} else { | |||
if (target[p]) | |||
return false; | |||
} | |||
} | |||
for (p in target) { | |||
if (typeof (source[p]) == 'undefined') { | |||
return false; | |||
} | |||
} | |||
return true; | |||
}, | |||
cloneObj(source){ | |||
if(source){ | |||
return JSON.parse(JSON.stringify(source)); | |||
} | |||
return null; | |||
}, | |||
deepArrayClone(data){ | |||
return [...data]; | |||
}, | |||
getProperties(obj){ | |||
let res = []; | |||
if(!obj){ | |||
return res; | |||
} | |||
for(let i in obj){ | |||
res.push(i); | |||
} | |||
return res; | |||
}, | |||
/** | |||
* js中的任务队列 | |||
* @params: data:Array | |||
* @params: process:function | |||
* @params: completedCallback : function 执行完毕的回调 | |||
* @params: context(可选): 执行环境,如果没有,则为window | |||
* return undefined | |||
* demo: | |||
* let data = [{name:1},{name:2},{name:3},{name:4},{name:5},{name:6},{name:7}]; | |||
* function print(item){console.log(item.name);} | |||
* taskQueue(data,print,cb); | |||
* **/ | |||
taskQueue:function(array,process,completedCallback,context){ | |||
setTimeout(function(){ | |||
if(completedCallback && typeof completedCallback == "function"){ | |||
if(array.length == 0){ | |||
completedCallback({data:"all tasks completed!"}); | |||
return; | |||
} | |||
} | |||
let item = array.shift(); | |||
process.call(context,item); | |||
if(array.length >0){ | |||
setTimeout(arguments.callee,100); | |||
} | |||
},100) | |||
}, | |||
/** | |||
* 节流函数: | |||
* 如果在段时间内一直操作DOM,可能会导致浏览器内存问题,甚至崩溃,所以在一段时间内,我们让该持续性的操作间隔的执行 | |||
* @params: method:function 需要执行的函数 | |||
* @params: context(可选):执行环境,如果没有,则为window | |||
* return undefined | |||
* demo: | |||
* function resizeDiv(){ | |||
* let div = document.querySelector("#div1"); | |||
* div.style.height = div.offsetWidth + "px"; | |||
* } | |||
* throttle(resizeDiv); | |||
* **/ | |||
throttle:function(method,context) { | |||
clearTimeout(method.tId); | |||
method.tId = setTimeout(function () { | |||
method.call(context); | |||
}, 80) | |||
}, | |||
addPrimaryAndCk(data,ck){ | |||
data.map(item=>{ | |||
if(ck!=undefined){ | |||
if(!ck){ | |||
item.ck = false; | |||
}else{ | |||
item.ck = true; | |||
} | |||
}else{ | |||
item.ck = false; | |||
} | |||
item.cls = ""; | |||
item.__tmpId = Math.ceil(Math.random()*10000000000000000); | |||
}); | |||
return data; | |||
}, | |||
getCheckedItems(arr,field){ | |||
let res = {items:[],vals:[]}; | |||
arr.map(item=>{ | |||
if(item.ck){ | |||
res.items.push(item); | |||
if(field){ | |||
res.vals.push(item[field]); | |||
} | |||
} | |||
}) | |||
return res; | |||
}, | |||
getInfoInArrayByField(field,vals,array){ | |||
let res = []; | |||
vals.map(item=>{ | |||
array.map(k=>{ | |||
if(k[vals] == item){ | |||
res.push(k); | |||
} | |||
}) | |||
}) | |||
return res; | |||
} | |||
}, | |||
cookie:{ | |||
removeCookie(name){ | |||
this.setCookie(name,"",new Date(0)); | |||
}, | |||
getCookie(name){ | |||
let cookie = document.cookie; | |||
let cookieName = encodeURIComponent(name) + "=", | |||
cookieStart = cookie.indexOf(cookieName), | |||
cookieValue = null; | |||
if(cookieStart > -1){ | |||
let cookieEnd = cookie.indexOf(';',cookieStart); | |||
if(cookieEnd == -1){ | |||
cookieEnd = cookie.length; | |||
} | |||
cookieValue = decodeURIComponent(cookie.substring(cookieStart + cookieName.length,cookieEnd)); | |||
} | |||
return cookieValue; | |||
}, | |||
setCookie(name,value,expires){ | |||
let cookieText = encodeURIComponent(name) + "=" + encodeURIComponent(value); | |||
if(expires instanceof Date){ | |||
cookieText += "; expires=" + expires.toGMTString(); | |||
} | |||
document.cookie = cookieText+";path=/;domain="+document.domain; | |||
}, | |||
}, | |||
arrayServer:{ | |||
_private:{ | |||
getIndexByString: function (array, str) { | |||
let _index = -1; | |||
for (let i = 0; i < array.length; i++) { | |||
if (array[i] == str) { | |||
_index = i; | |||
break; | |||
} | |||
} | |||
return _index; | |||
}, | |||
getIndexByObject: function (array, obj) { | |||
let _index = -1; | |||
for (let i = 0; i < array.length; i++) { | |||
if (CommonUtil.object.equalsObject(array[i], obj)) { | |||
_index = i; | |||
break; | |||
} | |||
} | |||
return _index; | |||
}, | |||
removeSingleStr: function (array, str) { | |||
let _index = this.getIndexByString(array, str); | |||
if (_index == -1) { | |||
return array; | |||
} | |||
array.splice(_index, 1); | |||
return array; | |||
}, | |||
removeSingleObject: function (array, item) { | |||
let _index = this.getIndexByObject(array, item); | |||
if (_index == -1) { | |||
return array; | |||
} | |||
array.splice(_index, 1); | |||
return array; | |||
}, | |||
sortByDate:function(array, field, desc){ | |||
let _arr = CommonUtil.object.cloneObj(array); | |||
_arr.map(function(item){ | |||
item._tmpDateField = new Date(item[field]).getTime(); | |||
}) | |||
_arr.sort(function (a, b) { | |||
if(desc){ | |||
return a._tmpDateField - b._tmpDateField; | |||
}else{ | |||
return b._tmpDateField - a._tmpDateField; | |||
} | |||
}) | |||
return _arr; | |||
}, | |||
sortByNumAndChar:function(array, field, desc){ | |||
let _arr = CommonUtil.object.cloneObj(array); | |||
_arr.sort(function (a, b) { | |||
if(desc){ | |||
return a[field] - b[field]; | |||
}else{ | |||
return b[field] - a[field]; | |||
} | |||
}) | |||
return _arr; | |||
} | |||
}, | |||
getIndex:function(array, item){ | |||
if(array instanceof Array == false){ | |||
CommonUtil.throwError("params[array] must be Array in getIndex method"); | |||
return; | |||
} | |||
if (typeof item == "object") { | |||
return CommonUtil.arrayServer._private.getIndexByObject(array, item); | |||
} else if (typeof item == "string") { | |||
return CommonUtil.arrayServer._private.getIndexByString(array, item); | |||
} else { | |||
return -1; | |||
} | |||
}, | |||
removeItems:function(array, items){ | |||
if(array instanceof Array == false){ | |||
CommonUtil.throwError("params[array] must be Array in removeItems method"); | |||
return; | |||
} | |||
items.map(function (item) { | |||
if (typeof item == "object") { | |||
CommonUtil.arrayServer._private.removeSingleObject(array, item); | |||
} | |||
if (typeof item == "string") { | |||
CommonUtil.arrayServer._private.removeSingleStr(array, item); | |||
} | |||
}) | |||
return array; | |||
}, | |||
insertItem:function(array, items){ | |||
if(array instanceof Array == false){ | |||
CommonUtil.throwError("params[array] must be Array in removeItems method"); | |||
return; | |||
} | |||
items.map(function (item) { | |||
if (typeof item == "object") { | |||
CommonUtil.arrayServer._private.removeSingleObject(array, item); | |||
} | |||
if (typeof item == "string") { | |||
CommonUtil.arrayServer._private.removeSingleStr(array, item); | |||
} | |||
}) | |||
return array; | |||
}, | |||
uniq:function(array,field){ | |||
if(array instanceof Array == false){ | |||
CommonUtil.throwError("params[array] must be Array in uniq method"); | |||
return; | |||
} | |||
if(!field){ | |||
var result = [], hash = {}; | |||
for (var i = 0, elem; (elem = array[i]) != null; i++) { | |||
if (!hash[elem]) { | |||
result.push(elem); | |||
hash[elem] = true; | |||
} | |||
} | |||
return result; | |||
}else{ | |||
var hash = {}; | |||
return array.reduce(function (item, next) { | |||
hash[next[field]] ? '' : hash[next[field]] = true && item.push(next); | |||
return item; | |||
}, []); | |||
} | |||
}, | |||
getSimpleValuesByField:function(array,field){ | |||
if(array instanceof Array == false){ | |||
CommonUtil.throwError("params[array] must be Array in getSimpleValuesByField method"); | |||
return; | |||
} | |||
let res = []; | |||
array.forEach(function(item){ | |||
res.push(item[field]); | |||
}) | |||
return res; | |||
}, | |||
getFieldsByCk:(array,field)=>{ | |||
if(array instanceof Array == false){ | |||
CommonUtil.throwError("params[array] must be Array in getSimpleValuesByField method"); | |||
return; | |||
} | |||
let res = []; | |||
array.forEach(function(item){ | |||
if(item.ck){ | |||
if(field){ | |||
res.push(item[field]); | |||
}else{ | |||
res.push(item); | |||
} | |||
} | |||
}) | |||
return res; | |||
}, | |||
sortByField:function(array,field,desc){ | |||
if(array instanceof Array == false){ | |||
CommonUtil.throwError("params[array] must be Array in sortByField method"); | |||
return; | |||
} | |||
if(array.length == 0){ | |||
return array; | |||
} | |||
let res = null; | |||
let tmp = array[0][field]; | |||
//check Date | |||
if (new Date(tmp) != "Invalid Date") { | |||
res = _private.sortByDate(array, field, desc); | |||
} else { | |||
res = _private.sortByNumAndChar(array, field, desc); | |||
} | |||
return res; | |||
}, | |||
getChannelsForCoupon:function(arr1,arr2){ | |||
let res = []; | |||
arr1.forEach(d=>{ | |||
arr2.forEach(x=>{ | |||
if(x.id == d){ | |||
res.push(x.title); | |||
} | |||
}) | |||
}) | |||
return res; | |||
} | |||
}, | |||
timechuo:{ | |||
//计算下单的时间与现在的时间的 | |||
timechuo:function(endTime,startTime) { | |||
var s2 = new Date(startTime.replace(/-/g, "/")); | |||
var s1 = new Date(endTime.replace(/-/g, "/")); | |||
var runTime = parseInt((s1.getTime() - s2.getTime()) / 1000); | |||
var year = Math.floor(runTime / 86400 / 365); | |||
var runTime = runTime % (86400 * 365); | |||
var month = Math.floor(runTime / 86400 / 30); | |||
var runTime = runTime % (86400 * 30); | |||
var day = Math.floor(runTime / 86400); | |||
var runTime = runTime % 86400; | |||
var hour = Math.floor(runTime / 3600); | |||
var runTime = runTime % 3600; | |||
var minute = Math.floor(runTime / 60); | |||
var runTime = runTime % 60; | |||
var second = runTime; | |||
console.log(month, day, hour, minute, second); | |||
return (day) | |||
} | |||
}, | |||
date:{ | |||
date:function(val){ | |||
if(!val){return "";} | |||
let d = new Date(val); | |||
let m = d.getMonth()+1; | |||
m = m>=10?m:"0"+m; | |||
let day = d.getDate(); | |||
day = d.getDate()>=10?d.getDate():"0"+d.getDate(); | |||
return d.getFullYear() + "-" + m + "-" + day; | |||
}, | |||
dateTime:function(val){ | |||
return this.date(val) + " " + this.time(val); | |||
}, | |||
time:function(val){ | |||
if(!val){return "";} | |||
let d = new Date(val); | |||
let h = d.getHours() >=10?d.getHours():"0"+d.getHours(); | |||
let m = d.getMinutes() >=10?d.getMinutes():"0"+d.getMinutes(); | |||
let s = d.getSeconds() >=10?d.getSeconds():"0"+d.getSeconds(); | |||
return h + ":" + m + ":" +s; | |||
}, | |||
//当前月的第一天 | |||
getCurrentMonthFirst(){ | |||
let date=new Date(); | |||
date.setDate(1); | |||
return this.date(date); | |||
}, | |||
//当前月的最后一天 | |||
getCurrentMonthLast(){ | |||
let date=new Date(); | |||
let currentMonth=date.getMonth(); | |||
let nextMonth=++currentMonth; | |||
let nextMonthFirstDay=new Date(date.getFullYear(),nextMonth,1); | |||
let oneDay=1000*60*60*24; | |||
return this.date(new Date(nextMonthFirstDay-oneDay)); | |||
} | |||
}, | |||
pvuv:{ | |||
pvuvKey:"pvuvKey", | |||
setPVUV:function(){ | |||
let params = { | |||
// actionDate:CommonUtil.date.date(new Date().toLocaleDateString()), | |||
actionDate:moment(new Date()).format('YYYY-MM-DD'), | |||
url:this.$route.name, | |||
type:"1" | |||
} | |||
this.postFetch("/O/wxAdminLog/pvlog",params); | |||
} | |||
}, | |||
checkInChannels:function(array,channels){ | |||
if(!array){ | |||
array = []; | |||
} | |||
let count = 0; | |||
for (let i = 0; i < array.length; i++) { | |||
for (let index = 0; index < channels.length; index++) { | |||
if(array[i] == channels[index].channelId){ | |||
count++; | |||
} | |||
} | |||
} | |||
if(count == channels.length){ | |||
return false; | |||
} | |||
return true; | |||
} | |||
} | |||
export default CommonUtil |
@@ -0,0 +1,16 @@ | |||
/** | |||
* Created by wupeng5 on 2018/1/14. | |||
*/ | |||
let dataCache = function(){ | |||
this.dictionary = {}; | |||
this.get = function(){ | |||
} | |||
this.set = function(){ | |||
} | |||
}; |
@@ -0,0 +1,104 @@ | |||
export default { | |||
initLine:function(x,data){ | |||
return { | |||
toolbox: { | |||
show: true, | |||
feature: { | |||
magicType: { | |||
type: ['bar'] | |||
}, | |||
dataView: {show: true, readOnly: true}, | |||
restore: {}, | |||
}, | |||
top: "5%", | |||
right: "10%", | |||
}, | |||
xAxis: { | |||
type: 'category', | |||
data: x,//['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] | |||
}, | |||
tooltip : { | |||
trigger: 'axis', | |||
}, | |||
yAxis: { | |||
type: 'value', | |||
splitLine: { | |||
show: true, | |||
lineStyle: { | |||
type: "dash" | |||
} | |||
} | |||
}, | |||
series: data | |||
// [ | |||
// { | |||
// name: 'name1', | |||
// data: [1000, 932, 901, 934, 1290, 1330, 1320], | |||
// type: 'line' | |||
// }, | |||
// { | |||
// name: 'name2', | |||
// data: [3000, 932, 901, 934, 1290, 1330, 1320], | |||
// type: 'line' | |||
// } | |||
// ] | |||
}; | |||
}, | |||
initPie:function(title,x,data){ | |||
return { | |||
title : { | |||
text: title?title:"", | |||
x:'center' | |||
}, | |||
tooltip : { | |||
trigger: 'item', | |||
formatter: "{b} : {c} ({d}%)" | |||
}, | |||
legend: { | |||
orient: 'vertical', | |||
left: 'left', | |||
data: x //['直接访问','邮件营销','联盟广告','视频广告','搜索引擎'] | |||
}, | |||
series : [ | |||
{ | |||
// name: '详情', | |||
type: 'pie', | |||
radius : '55%', | |||
center: ['50%', '60%'], | |||
data:data | |||
// [{value:335, name:'直接访问'}, | |||
// {value:310, name:'邮件营销'}, | |||
// {value:234, name:'联盟广告'}, | |||
// {value:135, name:'视频广告'}, | |||
// {value:1548, name:'搜索引擎'}] | |||
, | |||
itemStyle: { | |||
emphasis: { | |||
shadowBlur: 10, | |||
shadowOffsetX: 0, | |||
shadowColor: 'rgba(0, 0, 0, 0.5)' | |||
} | |||
}, | |||
label:{show:true,formatter:'{b}:{c} ({d}%)'} | |||
} | |||
] | |||
} | |||
}, | |||
initBar:function(x,y){ | |||
return { | |||
xAxis: { | |||
type: 'category', | |||
data: x//['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] | |||
}, | |||
tooltip: {}, | |||
yAxis: { | |||
type: 'value' | |||
}, | |||
series: [{ | |||
data: y,//[120, 200, 150, 80, 70, 110, 130], | |||
type: 'bar', | |||
label:{show:true} | |||
}] | |||
}; | |||
} | |||
} |
@@ -0,0 +1,101 @@ | |||
/** | |||
* Created by wupeng5 on 2017/12/21. | |||
*/ | |||
/* | |||
* 验证表单类 | |||
* property:strategys {json object}, 验证规则,为function | |||
* property:rules<Array> , 保存规则, | |||
* [{strategy: 'isNotEmpty',errorMsg:'用户名不能为空'},{strategy: 'minLength:6',errorMsg:'用户名长度不能小于6位'}] | |||
* | |||
* add, 添加规则 | |||
* start:Array 返回结果,为数组 | |||
* */ | |||
var Validator = function(){ | |||
this.rules = []; | |||
/* | |||
* rules: [{strategy: 'isNotEmpty',errorMsg:'用户名不能为空'}, | |||
{strategy: 'minLength:6',errorMsg:'用户名长度不能小于6位'}] | |||
*value :dom element.value | |||
* | |||
* 返回删除的第一个 | |||
* */ | |||
this.add = function(value,rules){ | |||
var that = this; | |||
rules.map(function(rule){ | |||
(function(rule){ | |||
//获取strategy key数组,可能有附加条件用:隔开 | |||
var strategyAry = rule.strategy.split(":"); | |||
var errorMsg = rule.errorMsg; | |||
var fun = function(){ | |||
//获取获取strategy key具体值 | |||
var strategy = strategyAry.shift(); | |||
strategyAry.unshift(value); | |||
strategyAry.push(errorMsg); | |||
return that.strategys[strategy].apply(value,strategyAry); | |||
} | |||
that.rules.push(fun); | |||
})(rule); | |||
}) | |||
return this; | |||
} | |||
this.start = function(){ | |||
var res = []; | |||
this.rules.map(function(validatorFunc){ | |||
var msg = validatorFunc(); | |||
if(msg){ | |||
res.push(msg); | |||
} | |||
}) | |||
return res; | |||
} | |||
} | |||
Validator.prototype.strategys = { | |||
isNotEmpty:function(value,errorMsg){ | |||
if(value === "") { | |||
return errorMsg; | |||
} | |||
}, | |||
minLength:function(value,length,errorMsg){ | |||
if(value.length < length) { | |||
return errorMsg; | |||
} | |||
}, | |||
maxLength:function(value,length,errorMsg){ | |||
if(value.length > length) { | |||
return errorMsg; | |||
} | |||
}, | |||
mobileFormat: function(value,errorMsg) { | |||
if(!/(^1[3|5|8][0-9]{9}$)/.test(value)) { | |||
return errorMsg; | |||
} | |||
}, | |||
emailFormat:function(value,errorMsg){ | |||
if(!/\w@\w*\.\w/.test(value)){ | |||
return errorMsg; | |||
} | |||
}, | |||
urlFormat:function(value,errorMsg){ | |||
var strRegex = "^((https|http|ftp|rtsp|mms)?://)" | |||
+ "?(([0-9a-z_!~*'().&=+$%-]+: )?[0-9a-z_!~*'().&=+$%-]+@)?" //ftp的user@ | |||
+ "(([0-9]{1,3}\.){3}[0-9]{1,3}" // IP形式的URL- 199.194.52.184 | |||
+ "|" // 允许IP和DOMAIN(域名) | |||
+ "([0-9a-z_!~*'()-]+\.)*" // 域名- www. | |||
+ "([0-9a-z][0-9a-z-]{0,61})?[0-9a-z]\." // 二级域名 | |||
+ "[a-z]{2,6})" // first level domain- .com or .museum | |||
+ "(:[0-9]{1,4})?" // 端口- :80 | |||
+ "((/?)|" // a slash isn't required if there is no file name | |||
+ "(/[0-9a-z_!~*'().;?:@&=+$,%#-]+)+/?)$"; | |||
var re = new RegExp(strRegex); | |||
if (!re.test(value)){ | |||
return errorMsg; | |||
} | |||
}, | |||
numFormat:function(value,errorMsg){ | |||
if(isNaN(str)){ | |||
return errorMsg; | |||
} | |||
} | |||
} |
@@ -0,0 +1,30 @@ | |||
<!DOCTYPE html> | |||
<html> | |||
<head> | |||
<meta charset="utf-8"> | |||
<meta name="viewport" content="width=device-width,initial-scale=1.0"> | |||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> | |||
<meta name="viewport" content="initial-scale=1.0, user-scalable=no" /> | |||
<meta name="version" content=<%= htmlWebpackPlugin.options.version %> /> | |||
<meta name="renderer" content="webkit"> | |||
<title>富茂小程序管理后台</title> | |||
<title></title> | |||
<link rel="stylesheet" href="./static/css/app.css"> | |||
<link href="https://cdnjs.cloudflare.com/ajax/libs/cropperjs/1.4.1/cropper.css" rel="stylesheet"> | |||
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/cropperjs/1.4.1/cropper.js"></script> | |||
<script src="./static/js/event.js"></script> | |||
<style> | |||
.map{ | |||
position: fixed; | |||
left: 500px; | |||
top: 0; | |||
width: 500px; | |||
height: 300px; | |||
} | |||
</style> | |||
</head> | |||
<body> | |||
<div id="app"></div> | |||
<!-- <div style="position: absolute;top: 98%;left: 92%;">version:<%= htmlWebpackPlugin.options.version %></div> --> | |||
</body> | |||
</html> |
@@ -0,0 +1,35 @@ | |||
// The Vue build version to load with the `import` command | |||
// (runtime-only or standalone) has been set in webpack.base.conf with an alias. | |||
import Vue from 'vue'; | |||
import Vuex from 'vuex'; | |||
import App from './App.vue'; | |||
import router from './router/index.js'; | |||
import ElementUI from 'element-ui'; //引入js | |||
import 'element-ui/lib/theme-chalk/index.css';//引入css | |||
import AlertMsg from "./core/tool/alert.js"; | |||
import AjaxService from "./core/tool/ajaxService.js"; | |||
import store from "./store/index.js"; | |||
import BaiduMap from 'vue-baidu-map' | |||
import 'babel-polyfill' | |||
Vue.use(BaiduMap, { | |||
// ak 是在百度地图开发者平台申请的密钥 详见 http://lbsyun.baidu.com/apiconsole/key */ | |||
ak: '9iFIaYXhOfi4CpSBP0xKYOBCBOGEWH0A' | |||
}) | |||
Vue.use(Vuex); | |||
Vue.use(ElementUI); | |||
Vue.use(AlertMsg); | |||
Vue.use(AjaxService); | |||
/* eslint-disable no-new */ | |||
new Vue({ | |||
el: '#app', | |||
router, | |||
store, | |||
components: { App }, | |||
template: '<App/>' | |||
}) |
@@ -0,0 +1,83 @@ | |||
import Vue from 'vue'; | |||
import Router from 'vue-router'; | |||
import Vuex from 'vuex'; | |||
import AuthHOC from "../components/authHOC/authHoc.js"; | |||
import Input from "../components/input.vue"; | |||
//布局&登录 | |||
import Layout from "../components/layout/layout.vue"; | |||
import Login from '../components/login/login.vue'; | |||
Vue.use(Router); | |||
Vue.use(Vuex); | |||
export default new Router({ | |||
// mode:"history", | |||
routes: [ | |||
{ | |||
path: '/', | |||
name: 'login', | |||
component: Login | |||
}, | |||
{ | |||
path: '/login', | |||
name: 'login1', | |||
component: Login | |||
}, | |||
{ | |||
path: '/layout', | |||
name: 'Layout', | |||
component: AuthHOC(Layout), | |||
children: [ | |||
{ | |||
path: '/input', | |||
name: 'Input', | |||
component: Input | |||
}, | |||
//首页 | |||
{ | |||
path: '/', | |||
name: 'HomePage', | |||
component: r => require.ensure([], () => r(require('../components/layout/homePage.vue')), 'HomePage') | |||
}, | |||
//服务器配置 | |||
{ | |||
path: '/basicSettings', | |||
name: 'basicSettings', | |||
component: r => require.ensure([], () => r(require('../components/basicSettings/list.vue')), 'basicSettings') | |||
}, | |||
// 草稿 | |||
{ | |||
path: '/draft', | |||
name: 'draft', | |||
component: r => require.ensure([], () => r(require('../components/draft/list.vue')), 'draft') | |||
}, | |||
//code提交列表 | |||
{ | |||
path: '/codesubmit', | |||
name: 'codesubmit', | |||
component: r => require.ensure([], () => r(require('../components/codesubmit/list.vue')), 'codesubmit') | |||
}, | |||
//审核 | |||
{ | |||
path: '/audit', | |||
name: 'audit', | |||
component: r => require.ensure([], () => r(require('../components/audit/list.vue')), 'audit') | |||
}, | |||
// 发布 | |||
{ | |||
path: '/release', | |||
name: 'release', | |||
component: r => require.ensure([], () => r(require('../components/release/list.vue')), 'release') | |||
}, | |||
// 成员管理 | |||
{ | |||
path: '/member', | |||
name: 'member', | |||
component: r => require.ensure([], () => r(require('../components/member/list.vue')), 'member') | |||
} | |||
] | |||
}, | |||
] | |||
}) |
@@ -0,0 +1,55 @@ | |||
export let CacheData = { | |||
//小程序端 | |||
appType:[ | |||
{name:"B端小程序",value:1}, | |||
{name:"C端小程序",value:2}, | |||
{name:"公众号服务号",value:3}, | |||
{name:"公众号订阅号",value:4}, | |||
], | |||
//授权状态 | |||
authorizationStatus:[ | |||
{name:"已授权",value:0}, | |||
{name:"未授权",value:1}, | |||
], | |||
//审核状态 | |||
auditStatus:[ | |||
{name:"审核成功",value:0}, | |||
{name:"审核失败",value:1}, | |||
{name:"审核中",value:2}, | |||
{name:"已撤回",value:3}, | |||
], | |||
//code提交状态 | |||
codeStatus:[ | |||
{name:"提交成功",value:0}, | |||
{name:"提交失败",value:1} | |||
], | |||
//发布状态 | |||
releaseStatus:[ | |||
{name:"发布成功",value:0}, | |||
{name:"未发布",value:1}, | |||
{name:"版本回退",value:2} | |||
], | |||
//是否设置基础设置 | |||
baseStatus:[ | |||
{name:"已设置",value:0}, | |||
{name:"暂无设置",value:1} | |||
], | |||
//是否设置服务器域名 | |||
domainStatus:[ | |||
{name:"已设置",value:0}, | |||
{name:"暂无设置",value:1} | |||
], | |||
//是否设置业务域名 | |||
webdomainStatus:[ | |||
{name:"已设置",value:0}, | |||
{name:"暂无设置",value:1} | |||
], | |||
//是否设置模板消息 | |||
templateStatus:[ | |||
{name:"已设置",value:0}, | |||
{name:"暂无设置",value:1} | |||
] | |||
} |
@@ -0,0 +1,59 @@ | |||
@font-face {font-family: "iconfont"; | |||
src: url('../font/iconfont.eot?t=1522291528940'); /* IE9*/ | |||
src: url('../font/iconfont.eot?t=1522291528940#iefix') format('embedded-opentype'), /* IE6-IE8 */ | |||
url('../font/iconfont.woff?t=1473155405') format('woff'), | |||
url('../font/iconfont.ttf?t=1522291528940') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/ | |||
url('../font/iconfont.svg?t=1522291528940#iconfont') format('svg'); /* iOS 4.1- */ | |||
} | |||
.icon { | |||
font-family:"iconfont" !important; | |||
font-size:14px; | |||
font-style:normal; | |||
-webkit-font-smoothing: antialiased; | |||
-moz-osx-font-smoothing: grayscale; | |||
} | |||
.icon-jian:before { content: "\e600"; } | |||
.icon-arrow-right:before { content: "\e602"; } | |||
.icon-jiahao:before { content: "\e726"; } | |||
.icon-arrow-bot:before { content: "\e6aa"; } | |||
.icon-arrow-top:before { content: "\e6b0"; } | |||
.icon-duihaocheckmark17:before { content: "\e770"; } | |||
.icon-yonghu:before { content: "\e639"; } | |||
.icon-caidan:before { content: "\e608"; } | |||
.icon-mima:before { content: "\e622"; } | |||
.icon-arrow-left:before { content: "\e667"; } | |||
.icon-tianjia:before { content: "\e64f"; } | |||
.icon-cuowu:before { content: "\e616"; } | |||
.icon-cuowu1:before { content: "\e674"; } | |||
.icon-edit:before { content: "\e61f"; } | |||
.icon-duihao:before { content: "\e69e"; } | |||
.icon-search:before { content: "\e613"; } | |||
.icon-tuichu:before { content: "\e652"; } | |||
.icon-cuo:before { content: "\e68c"; } | |||
.icon-arrow-up:before { content: "\e667"; transform: rotate(90deg);display: block;} | |||
.icon-arrow-down:before { content: "\e667"; transform: rotate(-90deg);display: block;} | |||
@@ -0,0 +1,87 @@ | |||
<?xml version="1.0" standalone="no"?> | |||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > | |||
<!-- | |||
2013-9-30: Created. | |||
--> | |||
<svg> | |||
<metadata> | |||
Created by iconfont | |||
</metadata> | |||
<defs> | |||
<font id="iconfont" horiz-adv-x="1024" > | |||
<font-face | |||
font-family="iconfont" | |||
font-weight="500" | |||
font-stretch="normal" | |||
units-per-em="1024" | |||
ascent="896" | |||
descent="-128" | |||
/> | |||
<missing-glyph /> | |||
<glyph glyph-name="x" unicode="x" horiz-adv-x="1001" | |||
d="M281 543q-27 -1 -53 -1h-83q-18 0 -36.5 -6t-32.5 -18.5t-23 -32t-9 -45.5v-76h912v41q0 16 -0.5 30t-0.5 18q0 13 -5 29t-17 29.5t-31.5 22.5t-49.5 9h-133v-97h-438v97zM955 310v-52q0 -23 0.5 -52t0.5 -58t-10.5 -47.5t-26 -30t-33 -16t-31.5 -4.5q-14 -1 -29.5 -0.5 | |||
t-29.5 0.5h-32l-45 128h-439l-44 -128h-29h-34q-20 0 -45 1q-25 0 -41 9.5t-25.5 23t-13.5 29.5t-4 30v167h911zM163 247q-12 0 -21 -8.5t-9 -21.5t9 -21.5t21 -8.5q13 0 22 8.5t9 21.5t-9 21.5t-22 8.5zM316 123q-8 -26 -14 -48q-5 -19 -10.5 -37t-7.5 -25t-3 -15t1 -14.5 | |||
t9.5 -10.5t21.5 -4h37h67h81h80h64h36q23 0 34 12t2 38q-5 13 -9.5 30.5t-9.5 34.5q-5 19 -11 39h-368zM336 498v228q0 11 2.5 23t10 21.5t20.5 15.5t34 6h188q31 0 51.5 -14.5t20.5 -52.5v-227h-327z" /> | |||
<glyph glyph-name="jian" unicode="" d="M512.16384 860.6051199999999c-262.57546667 0-476.20426667-213.6288-476.20426667-476.20426667 0-262.57653333 213.6288-476.20426667 476.20426667-476.20426666 262.57653333 0 476.20533333 213.62773333 476.20533333 476.20426666C988.36810667 646.97632 774.73930667 860.6051199999999 512.16384 860.6051199999999zM512.16384-32.27925332999996c-229.76042667 0-416.67893333 186.91957333-416.67893333 416.68117333 0 229.76042667 186.91850667 416.67893333 416.67893333 416.67893333 229.7616 0 416.67893333-186.91850667 416.67893333-416.67893333C928.84277333 154.63925332999997 741.92426667-32.27925332999996 512.16384-32.27925332999996zM690.74069333 414.16298667H333.5880704c-16.45173333 0-29.7632-13.31146667-29.7632-29.76213334 0-16.42218667 13.31146667-29.7632 29.7632-29.7632h357.15263147c16.45173333 0 29.7632 13.34090667 29.7632 29.7632C720.50389333 400.85152 707.19242667 414.16298667 690.74069333 414.16298667z" horiz-adv-x="1024" /> | |||
<glyph glyph-name="arrow-right" unicode="" d="M336.733 776.333l-56.278-55.72 334.857-337.154-337.673-334.315 55.802-56.184 393.944 390.04z" horiz-adv-x="1024" /> | |||
<glyph glyph-name="jiahao" unicode="" d="M512-62.01661100000001c-119.648434 0-232.1288 46.367961-316.736783 130.559656-84.640667 84.255342-131.263217 196.255772-131.263217 315.455235 0 119.168499 46.624271 231.199892 131.232254 315.424271 84.607983 84.191695 197.088348 130.559656 316.736783 130.559656s232.1288-46.367961 316.704099-130.559656c84.67163-84.224378 131.263217-196.255772 131.263217-315.391587 0.032684-119.199462-46.591587-231.232576-131.263217-315.455235C744.1288-15.615965999999958 631.648434-62.01661100000001 512-62.01661100000001zM512 766.016611c-102.623626 0-199.071738-39.743475-271.583282-111.936783-72.480581-72.12794-112.416718-168.063432-112.416718-270.079828s39.903454-197.951888 112.384034-270.047144c72.511544-72.191587 168.959656-111.936783 271.583282-111.936783 102.592662 0 199.071738 39.743475 271.583282 111.936783 72.480581 72.160624 112.416718 168.063432 112.384034 270.079828 0 102.016396-39.903454 197.919204-112.384034 270.016181C711.071738 726.240452 614.592662 766.016611 512 766.016611zM736.00086 415.99914L544.00086 415.99914 544.00086 607.99914c0 17.664722-14.336138 32.00086-32.00086 32.00086s-32.00086-14.336138-32.00086-32.00086l0-192L288.00086 415.99914c-17.664722 0-32.00086-14.336138-32.00086-32.00086s14.336138-32.00086 32.00086-32.00086l192 0 0-192c0-17.695686 14.336138-32.00086 32.00086-32.00086s32.00086 14.303454 32.00086 32.00086L544.00258 351.99914l192 0c17.695686 0 32.00086 14.336138 32.00086 32.00086S753.696546 415.99914 736.00086 415.99914z" horiz-adv-x="1024" /> | |||
<glyph glyph-name="arrow-bot" unicode="" d="M171.15136 554.99776l684.02176 0-342.016-341.99552L171.15136 554.99776z" horiz-adv-x="1024" /> | |||
<glyph glyph-name="arrow-top" unicode="" d="M855.16288 213.00224000000003L171.14112 213.00224000000003l342.016 341.99552L855.16288 213.00224000000003z" horiz-adv-x="1024" /> | |||
<glyph glyph-name="duihaocheckmark17" unicode="" d="M704.20625 544.734375L441.6875 282.21562500000005l-121.865625 121.89375c-10.715625 10.715625-28.125 10.715625-38.840625 0-10.715625-10.715625-10.715625-28.125 0-38.840625l137.953125-137.953125c0.928125-1.321875 1.490625-2.840625 2.671875-4.021875 5.540625-5.540625 12.825-8.1 20.08125-7.903125 7.25625-0.16875 14.56875 2.3625 20.109375 7.903125 1.18125 1.18125 1.74375 2.7 2.671875 4.021875l278.578125 278.578125c10.715625 10.715625 10.715625 28.125 0 38.840625C732.303125 555.45 714.921875 555.45 704.20625 544.734375zM512 834C263.459375 834 62 632.540625 62 384c0-248.540625 201.459375-450 450-450 248.5125 0 450 201.459375 450 450C962 632.540625 760.540625 834 512 834zM512-9.75C294.5375-9.75 118.25 166.53750000000002 118.25 384 118.25 601.4625 294.5375 777.75 512 777.75c217.4625 0 393.75-176.2875 393.75-393.75C905.75 166.53750000000002 729.4625-9.75 512-9.75z" horiz-adv-x="1024" /> | |||
<glyph glyph-name="yonghu" unicode="" d="M502.496 832.864c125.888 0 227.936-100.384 227.936-224.192 0-123.84-102.048-224.224-227.936-224.224-125.888 0-227.936 100.384-227.936 224.224C274.56 732.512 376.64 832.864 502.496 832.864L502.496 832.864zM502.496 832.864c125.888 0 227.936-100.384 227.936-224.192 0-123.84-102.048-224.224-227.936-224.224-125.888 0-227.936 100.384-227.936 224.224C274.56 732.512 376.64 832.864 502.496 832.864L502.496 832.864zM417.024 309.696l189.984 0c162.624 0 294.432-129.632 294.432-289.6l0-18.656c0-63.04-131.84-65.44-294.432-65.44l-189.984 0c-162.624 0-294.432 0.096-294.432 65.44l0 18.656C122.592 180.064 254.4 309.696 417.024 309.696L417.024 309.696zM417.024 309.696" horiz-adv-x="1024" /> | |||
<glyph glyph-name="caidan" unicode="" d="M68.191078 334.687898l98.624205 0 0 98.624205L68.191078 433.312102 68.191078 334.687898zM68.191078 137.439488l98.624205 0 0 98.624205L68.191078 236.063693 68.191078 137.439488zM68.191078 531.936307l98.624205 0 0 98.624205L68.191078 630.560512 68.191078 531.936307zM265.439488 334.687898l690.369434 0 0 98.624205L265.439488 433.312102 265.439488 334.687898zM265.439488 137.439488l690.369434 0 0 98.624205L265.439488 236.063693 265.439488 137.439488zM265.439488 630.560512l0-98.624205 690.369434 0 0 98.624205L265.439488 630.560512z" horiz-adv-x="1024" /> | |||
<glyph glyph-name="mima" unicode="" d="M768.9216 473.27232 372.06016 473.27232C378.88 530.78016 329.37984 764.57984 512.2048 770.27328c173.83424 6.59456 146.78016-213.34016 146.78016-213.34016l85.13536-0.57344c0 0 24.73984 294.4-231.91552 295.8336C232.09984 837.98016 297.82016 518.81984 289.28 473.27232c1.98656 0 4.56704 0 7.29088 0-55.88992 0-101.21216-45.34272-101.21216-101.21216l0-337.38752c0-55.88992 45.34272-101.21216 101.21216-101.21216l472.35072 0c55.88992 0 101.21216 45.34272 101.21216 101.21216L870.13376 372.06016C870.13376 427.9296 824.79104 473.27232 768.9216 473.27232zM566.4768 178.97472l0-76.84096c0-18.57536-15.1552-33.73056-33.73056-33.73056-18.57536 0-33.73056 15.1552-33.73056 33.73056l0 76.84096c-20.09088 11.69408-33.73056 33.21856-33.73056 58.12224 0 37.2736 30.208 67.4816 67.4816 67.4816 37.2736 0 67.4816-30.208 67.4816-67.4816C600.22784 212.19328 586.58816 190.6688 566.4768 178.97472z" horiz-adv-x="1024" /> | |||
<glyph glyph-name="arrow-left" unicode="" d="M671.807-31.803999999999974l-415.632 415.804 415.632 415.803 63.445-63.616-352.017-352.209 352.017-352.102z" horiz-adv-x="1024" /> | |||
<glyph glyph-name="tianjia" unicode="" d="M925.304287 481.160787 606.244429 481.160787 606.244429 800.322974c0 17.60048-14.223643 31.926451-31.926451 31.926451L446.7145 832.249425c-17.60048 0-31.926451-14.223643-31.926451-31.926451l0-319.059858L95.72819 481.263116c-17.60048 0-31.926451-14.223643-31.926451-31.926451l0-127.603478c0-17.60048 14.223643-31.926451 31.926451-31.926451l319.059858 0 0-319.059858c0-17.60048 14.223643-31.926451 31.926451-31.926451l127.603478 0c17.60048 0 31.926451 14.325972 31.926451 31.926451L606.244429 289.806735l319.059858 0c17.60048 0 31.926451 14.223643 31.926451 31.926451L957.230738 449.336664C957.230738 466.937144 943.007095 481.160787 925.304287 481.160787L925.304287 481.160787z" horiz-adv-x="1024" /> | |||
<glyph glyph-name="cuowu" unicode="" d="M945.91565013 549.48833387c-23.25132907 54.90806827-56.43632533 104.13975573-98.68169813 146.38512853-42.2453728 42.2453728-91.58622187 75.5395296-146.38512853 98.68169813C643.97585493 818.5706176 583.71888853 830.7966688 521.49702187 830.7966688s-122.47883307-12.2260512-179.35180267-36.24150827c-54.90806827-23.25132907-104.13975573-56.43632533-146.38512853-98.68169813s-75.5395296-91.58622187-98.68169814-146.38512853C73.06293547 492.61536427 60.83688427 432.35839787 60.83688427 370.13653120000004s12.2260512-122.47883307 36.24150826-179.35180267c23.25132907-54.90806827 56.43632533-104.13975573 98.68169814-146.38512853 42.2453728-42.2453728 91.58622187-75.5395296 146.38512853-98.68169813 56.763808-24.01545707 117.12993493-36.24150827 179.35180267-36.24150827s122.47883307 12.2260512 179.35180266 36.24150827c54.90806827 23.25132907 104.13975573 56.43632533 146.38512854 98.68169813 42.2453728 42.2453728 75.5395296 91.58622187 98.68169813 146.38512853 24.01545707 56.763808 36.24150827 117.12993493 36.24150827 179.35180267S969.93110827 492.61536427 945.91565013 549.48833387zM521.49702187-42.49269119999997c-227.4918784 0-412.6292224 185.137344-412.6292224 412.6292224s185.137344 412.6292224 412.6292224 412.6292224 412.6292224-185.137344 412.6292224-412.6292224S748.98890027-42.49269119999997 521.49702187-42.49269119999997zM547.25905813 367.40750187000003l112.2176832 112.2176832c9.38786027 9.38786027 9.38786027 24.67042453 0 33.94912426l0 0c-9.38786027 9.38786027-24.67042453 9.38786027-33.94912426 0L513.30993387 401.35662613 400.54644587 514.0109536c-9.38786027 9.38786027-24.67042453 9.38786027-33.94912427 0l0 0c-9.38786027-9.38786027-9.38786027-24.67042453 0-33.94912427l112.65432747-112.65432746L366.05151573 254.20736853000005c-9.38786027-9.38786027-9.38786027-24.67042453 0-33.94912426 9.38786027-9.38786027 24.67042453-9.38786027 33.94912427 0l113.20013333 113.20013333 112.65432747-112.65432747c9.38786027-9.38786027 24.67042453-9.38786027 33.94912427 0 9.38786027 9.38786027 9.38786027 24.67042453 0 33.94912427L547.25905813 367.40750187000003z" horiz-adv-x="1024" /> | |||
<glyph glyph-name="cuowu1" unicode="" d="M508.74077 830.629529c-247.026716 0-447.274148-200.247432-447.274148-447.274148 0-247.028515 200.247432-447.274148 447.274148-447.274148s447.274148 200.245434 447.274148 447.274148C956.014918 630.3820969999999 755.767486 830.629529 508.74077 830.629529zM509.450888 70.26345700000002c-34.495812 0-62.461451 26.162862-62.461451 58.442176 0 32.277716 27.965639 58.442376 62.461451 58.442376 34.506804 0 62.471444-26.16466 62.471444-58.442376C571.922333 96.42611899999997 543.957693 70.26345700000002 509.450888 70.26345700000002zM621.45475 557.394183l-49.630151-276.31326c0-0.306592 0.097734-0.5906 0.097734-0.895393 0-32.279514-27.965639-58.442176-62.471444-58.442176-34.495812 0-62.461451 26.162862-62.461451 58.442176 0 0.304993 0.087541 0.5896 0.097734 0.895393l-49.641943 276.31326 0.699326 0c-0.437304 3.800024-0.699326 7.621832-0.699326 11.509596 0 58.093613 50.144002 105.179688 112.004861 105.179688s112.003861-47.086076 112.003861-105.179688c0-3.888564-0.262022-7.709573-0.699126-11.509596L621.45475 557.394183z" horiz-adv-x="1024" /> | |||
<glyph glyph-name="edit" unicode="" d="M924.766 708.515c-32.297 32.412-62.339 68.774-99.757 95.411-34.261 7.093-50.787-29.928-74.311-47.237 39.777-46.201 86.117-87.013 128.923-130.718 19.407 23.095 65.369 46.724 45.145 82.543zM903.499 533.974c-27.158-27.294-55.258-53.806-81.519-82.146-0.648-109.327 0.273-218.642-0.375-327.946-0.545-40.3-35.851-76.004-76.13-77.445-165.797-0.65-331.717-0.65-497.513-0.127-44.75 1.191-80.6 44.103-77.048 88.058-0.125 158.274-0.125 316.403 0 474.533-3.406 43.84 32.55 85.968 76.797 87.535 109.85 1.451 219.739-0.125 329.462 0.794 28.495 25.717 54.737 53.942 82.063 80.976-146.242 0-292.337 0.773-438.557-0.397-68.274-1.18-129.445-60.898-130.614-129.403-0.272-184.515-0.793-368.895 0.25-553.399 0.272-66.414 56.7-124.012 122.091-130.322l574.541 0c61.944 10.884 115.115 64.972 115.907 129.403 1.839 146.576 0.399 293.297 0.649 439.883zM859.669 605.757c-43.058 43.309-86.365 86.357-129.946 129.142-95.309-94.619-190.867-188.987-285.63-284.128 42.91-43.182 86.094-86.22 129.674-128.871 95.433 94.484 190.718 189.238 285.902 283.856zM373.604 252.22c58.392 15.877 89.499 25.874 147.911 41.616 15.607 4.973 25.989 7.98 33.992 11.167-41.345 39.369-88.852 87.891-130.072 127.523-17.32-60.106-34.534-120.201-51.832-180.305z" horiz-adv-x="1024" /> | |||
<glyph glyph-name="duihao" unicode="" d="M62 384C62 632.5241376 263.4758624 834 512 834s450-201.4758624 450-450-201.4758624-450-450-450S62 135.47586239999998 62 384z m368.53448291-171.06206924a31.03448291 31.03448291 0 0 1 43.41724102-1.11724102l294.88965556 274.15862052a31.03448291 31.03448291 0 0 1-42.25344873 45.46551708l-271.69137862-254.4827581-127.5517248 131.52413759a31.03448291 31.03448291 0 1 1-44.55-43.21551709l147.75517266-152.33275898z" horiz-adv-x="1024" /> | |||
<glyph glyph-name="search" unicode="" d="M960-18.7l-211.9 211.9c25.4 29.9 46.1 63.4 61.5 99.8 20.3 47.9 30.5 98.6 30.5 151s-10.2 103.1-30.5 151c-19.6 46.2-47.5 87.7-83.1 123.3-35.7 35.7-77.2 63.6-123.5 83.2-47.9 20.3-98.6 30.5-151 30.5-52.4 0-103.1-10.2-151-30.5-46.2-19.6-87.7-47.5-123.3-83.1-35.7-35.6-63.6-77.1-83.2-123.4-20.3-47.9-30.5-98.6-30.5-151s10.2-103.1 30.5-151c19.6-46.2 47.5-87.7 83.1-123.3 35.6-35.6 77.1-63.6 123.3-83.1 47.9-20.3 98.6-30.5 151-30.5 52.4 0 103.1 10.2 151 30.5 36.4 15.4 69.8 36 99.8 61.5l212-212.1 45.3 45.3zM578.1 145.4c-39.9-16.8-82.3-25.4-126.1-25.4s-86.2 8.6-126.1 25.4c-38.6 16.3-73.3 39.7-103 69.5-29.7 29.7-53.1 64.4-69.5 103-16.8 39.9-25.4 82.3-25.4 126.1s8.6 86.2 25.4 126.1c16.3 38.6 39.7 73.3 69.5 103 29.7 29.7 64.4 53.1 103 69.5 39.9 16.8 82.3 25.4 126.1 25.4 43.8 0 86.2-8.6 126.1-25.4 38.6-16.3 73.3-39.7 103-69.5 29.7-29.7 53.1-64.4 69.5-103 16.8-39.9 25.4-82.3 25.4-126.1s-8.6-86.2-25.4-126.1c-16.3-38.6-39.7-73.3-69.5-103-29.7-29.8-64.4-53.1-103-69.5z" horiz-adv-x="1024" /> | |||
<glyph glyph-name="tuichu" unicode="" d="M950.093 408.228l-179.775 173.078c-14.382 13.851-35.955 13.851-50.336 0-14.382-13.842-14.382-34.614 0-48.465l118.647-114.228h-345.168c-21.573 0-35.955-13.842-35.955-34.614s14.382-34.614 35.955-34.614h345.168l-118.639-114.228c-14.382-13.851-14.382-34.623 0-48.465 7.192-6.93 14.382-10.386 25.164-10.386 10.792 0 17.982 3.465 25.173 10.386l179.775 176.535s0 3.465 3.6 3.465c10.782 10.386 10.782 31.149-3.6 41.535zM853.01 141.69299999999998c-21.573 0-35.955-13.851-35.955-34.614v-69.237c0-20.763-14.382-34.614-35.955-34.614h-611.235c-21.573 0-35.955 13.851-35.955 34.614v692.317c0 20.763 14.382 34.614 35.955 34.614h611.235c21.573 0 35.955-13.851 35.955-34.614v-69.237c0-20.764 14.382-34.614 35.955-34.614s35.955 13.851 35.955 34.614v69.237c0 58.842-46.736 103.842-107.865 103.842h-611.235c-61.119 0-107.865-45-107.865-103.842v-692.317c0-58.842 46.747-103.842 107.865-103.842h611.235c61.128 0 107.865 45 107.865 103.842v69.237c0 20.764-14.382 34.614-35.955 34.614z" horiz-adv-x="1024" /> | |||
<glyph glyph-name="cuo" unicode="" d="M939.78396445 564.20010667c-23.33696 55.09461333-56.61468445 104.52992-99.14481778 147.05891555s-91.96430222 75.80785778-147.05891556 99.14481778c-57.02883555 24.16412445-117.64849778 36.31559111-180.06129778 36.31559111s-123.03246222-12.28913778-180.06129778-36.31559111c-55.09461333-23.33696-104.52992-56.61468445-147.05891555-99.14481778-42.52899555-42.52899555-75.80785778-91.96430222-99.14481778-147.05891555-24.16412445-57.02883555-36.31559111-117.64849778-36.31559111-180.06129778s12.28913778-123.03246222 36.31559111-180.06129778c23.33696-55.09461333 56.61468445-104.52992 99.14481778-147.05891556 42.52899555-42.52899555 91.96430222-75.80785778 147.05891555-99.14481777 57.02883555-24.16412445 117.64849778-36.31559111 180.06129778-36.31559111s123.03246222 12.28913778 180.06129778 36.31559111c55.09461333 23.33696 104.52992 56.61468445 147.05891556 99.14481777 42.52899555 42.52899555 75.80785778 91.96430222 99.14481778 147.05891556 24.16412445 57.02883555 36.31559111 117.64849778 36.3155911 180.06129778s-12.15260445 123.03246222-36.3155911 180.06129778zM706.97415111 232.10780445c12.84096-12.84096 12.84096-33.96835555 0-46.81045334s-33.96835555-12.84096-46.81045333 0l-150.78741333 150.64860444-150.64860445-150.78741333c-12.84096-12.84096-33.96835555-12.84096-46.81045333 0s-12.84096 33.96835555 0 46.81045333l150.64860444 150.64860445-150.78741333 150.78741333c-12.84096 12.84096-12.84096 33.96835555 0 46.81045334 12.84096 12.84096 33.96835555 12.84096 46.81045333 0l150.64860444-150.64860445 150.64860445 150.64860445c12.84096 12.84096 33.96835555 12.84096 46.81045333 0s12.84096-33.96835555 0-46.81045334l-150.37326222-150.64860444 150.64860444-150.64860444z" horiz-adv-x="1024" /> | |||
</font> | |||
</defs></svg> |
@@ -0,0 +1,24 @@ | |||
/** | |||
* 单页面通信,订阅 + 发布 | |||
* on为注册 | |||
* broadcast为执行,一旦broadcast执行,会主动推送消息到on注册的地方 | |||
* **/ | |||
var EventPublisher = function(){ | |||
this.eventCallbackDictionary = {}; | |||
this.on = function(eventName,callback){ | |||
this.eventCallbackDictionary[eventName] = callback; | |||
} | |||
this.broadcast = function(eventName,data){ | |||
for(var i in this.eventCallbackDictionary){ | |||
if(i == eventName && this.eventCallbackDictionary[eventName]){ | |||
this.eventCallbackDictionary[eventName](data); | |||
//this.eventCallbackDictionary[eventName] = null; | |||
} | |||
} | |||
} | |||
} | |||
var eventCtl = new EventPublisher(); |
@@ -0,0 +1,11 @@ | |||
export default{ | |||
state: { | |||
couponTableData: [] | |||
}, | |||
mutations: { | |||
increment (state,data) { | |||
// 变更状态 | |||
state.couponTableData=data | |||
} | |||
} | |||
} |
@@ -0,0 +1,17 @@ | |||
export default{ | |||
state:{ | |||
channels:[] | |||
}, | |||
mutations:{ | |||
setChannels(state,data){ | |||
state.channels = data; | |||
} | |||
}, | |||
actions:{ | |||
setChannels(context,data){ | |||
context.commit("setChannels",data); | |||
} | |||
} | |||
} |
@@ -0,0 +1,10 @@ | |||
import Vuex from 'vuex'; | |||
import topNav_store from "./topNav/store.js"; | |||
export default new Vuex.Store({ | |||
modules:{ | |||
topNav:topNav_store, | |||
} | |||
}) |
@@ -0,0 +1,17 @@ | |||
export default{ | |||
state:{ | |||
memberId:"" | |||
}, | |||
mutations:{ | |||
setMemberId(state,data){ | |||
state.memberId = data; | |||
} | |||
}, | |||
actions:{ | |||
setMemberId(context,data){ | |||
context.commit("setMemberId",data); | |||
} | |||
} | |||
} |
@@ -0,0 +1,40 @@ | |||
export default{ | |||
state:{ | |||
data:[], | |||
uname:"", | |||
index:'', | |||
}, | |||
getters:{ | |||
tmp_data(state){ | |||
if(state.data.length == 0){ | |||
return ['未配置'] | |||
} | |||
return state.data; | |||
} | |||
}, | |||
mutations:{ | |||
setNavData(state,data){ | |||
state.data = data; | |||
}, | |||
setName(state,name){ | |||
state.uname = name; | |||
}, | |||
setIndex(state,index){ | |||
state.index = index; | |||
} | |||
}, | |||
actions:{ | |||
setNavData(context,data){ | |||
console.log("触发分发setNavData"); | |||
context.commit("setNavData",data); | |||
}, | |||
setUName(context,data){ | |||
context.commit("setName",data); | |||
}, | |||
setIndex(context,data){ | |||
context.commit("setIndex",data); | |||
} | |||
} | |||
} |
@@ -0,0 +1,116 @@ | |||
export let configUrl = { | |||
//登录 | |||
doLogin:"/T/doLogin", | |||
//获得后端版本号 | |||
getversion:"/T/version", | |||
//验证码 | |||
captcha:"/T/captcha.jpg", | |||
//微信第三方开放平台授权相关接口 | |||
getMobilePreAuthUrl:"/T/wt_auth/getMobilePreAuthUrl", | |||
//获取授权跳转页 | |||
gotoAuthUrlShow:"/T/wt_auth/goto_auth_url_show", | |||
//授权跳转页面 | |||
gotoAuthUrl:"/T/wt_auth/goto_auth_url", | |||
//获得小程序的模板 | |||
getTempList:"/T/weappDraftTemplate/tempList", | |||
//获得小程序草稿 | |||
tempDraftList:"/T/weappDraftTemplate/tempDraftList", | |||
//小程序草稿转为模板 | |||
addToTemplate:"/T/weappDraftTemplate/addToTemplate", | |||
//删除小程序模板 | |||
deleteTemplate:"/T/weappDraftTemplate/deleteTemplate", | |||
//获得小程序列表 | |||
weappList:"/T/weapp/list", | |||
//首页 小程序扩展配置列表 | |||
weappExtSetList:"/T/weappExtSet/list", | |||
//小程序提交审核 | |||
batchCodeCommitAndAudit:'/T/weapp/batchCodeCommitAndAudit', | |||
//批量上传code并提交审核 | |||
batchCodeCommitAndAudit:"/T/weapp/batchCodeCommitAndAudit", | |||
//获得小程序体验二维码 | |||
getQrcode:"/T/weappCode/getQrcode", | |||
//批量发布 | |||
batchRelease:"/T/weapp/batchRelease", | |||
//获取授权小程序帐号已设置的类目 | |||
getCategory:"/T/weappCode/getCategory", | |||
//将第三方提交的代码包提交审核 | |||
submitAudit:"/T/weappCode/submitAudit", | |||
//小程序审核撤回 | |||
undoCodeAudit:"/T/weappCode/undoCodeAudit", | |||
//查询最新一次提交的审核状态 | |||
getLatestAuditstatus:"/T/weappCode/getLatestAuditstatus", | |||
//发布已通过审核的小程序 | |||
releaesAudited:"/T/weappCode/releaesAudited", | |||
//小程序不带分页列表 | |||
webappallist:"/T/weapp/allist", | |||
//设置小程序服务器域名 | |||
modifyDomain:"/T/weappSet/modifyDomain", | |||
//设置小程序业务域名 | |||
setWebViewDomain:"/T/weappSet/setWebViewDomain", | |||
//绑定微信用户为小程序体验者 | |||
bindTester:"/T/weappSet/bindTester", | |||
//解除绑定小程序的体验者 | |||
unbindTester:"/T/weappSet/unbindTester", | |||
//获得体验者的列表 | |||
getTesterList:"/T/weappSet/getTesterList", | |||
//小程序发布状态分页列表接口 | |||
releaseStatusList:"/T/weapp/releaseStatusList", | |||
//小程序版本回退 | |||
revertCodeRelease:"/T/weappCode/revertCodeRelease", | |||
//批量审核查询 | |||
batchAuditQuery:"/T/weapp/batchAuditQuery", | |||
//小程序基础设置接口 分页列表接口 | |||
weappBasicSetList:"/T/weappBasicSet/list", | |||
//批量基础配置 | |||
batchBasicSet:"/T/weapp/batchBasicSet", | |||
//批量撤回 | |||
batchAuditCancel:"/T/weapp/batchAuditCancel", | |||
//获取小程序服务器域名 | |||
getDomain:"/T/weappSet/getDomain", | |||
//获取小程序业务域名 | |||
getWebDomain:"/T/weappSet/getWebDomain", | |||
//小程序审核撤回 | |||
undoCodeAudit:"/T/weappCode/undoCodeAudit", | |||
//小程序批量提交代码 | |||
batchCodeCommit:"/T/weapp/batchCodeCommit", | |||
//小程序批量提交审核 | |||
batchCodeAudit:"/T/weapp/batchCodeAudit", | |||
//获取小程序已设置的账号类目 | |||
getCategory:"/T/weappCode/getCategory", | |||
//小程序code提交状态分页列表接口 | |||
codeStatusList:"/T/weapp/codeStatusList", | |||
//小程序code提交版本列表 | |||
codeVersionList:"/T/weapp/codeVersionList", | |||
// 小程序审核状态分页列表接口 | |||
auditStatusList:"/T/weapp/auditStatusList", | |||
//小程序审核版本列表 | |||
auditVersionList:"/T/weapp/auditVersionList", | |||
//小程序发布版本列表 | |||
releaseVersionList:"/T/weapp/releaseVersionList", | |||
//发布已通过审核的小程序 | |||
releaseAudited:"/T/weappCode/releaseAudited", | |||
//查询最新一次提交的审核状态 | |||
getLatestAuditstatus:"/T/weappCode/getLatestAuditstatus", | |||
//创建微信开放平台 | |||
createOpenPlatform:"/T/wxOpen/createOpenPlatform", | |||
//绑定微信开放平台 | |||
bindOpenPlatform:"/T/wxOpen/bindOpenPlatform", | |||
//解绑微信开放平台 | |||
unbindOpenPlatform:"/T/wxOpen/unbindOpenPlatform", | |||
//获取微信开放平台 | |||
getOpenPlatform:"/T/wxOpen/getOpenPlatform", | |||
//重置公众号Quota | |||
clearQuota:"/T/wxOpen/clearQuota", | |||
//小程序扩展配置接口 | |||
weappExtSetupdate:"/T/weappExtSet/update", | |||
//拉取当前所有已授权的帐号基本信息 | |||
getAuthorizerList:"/T/wxOpen/getAuthorizerList", | |||
//批量扩展配置 | |||
batchExtendSet:"/T/weappExtSet/batchUpdate", | |||
//获取帐号下已存在的模板列表 | |||
getTemplateList:"/T/weappMsgTemplate/getTemplateList", | |||
//删除帐号下的某个模板 | |||
delTemplate:"/T/weappMsgTemplate/delTemplate" | |||
} |
@@ -0,0 +1,11 @@ | |||
//深拷贝 | |||
export function deepcopy(source) { | |||
if (!source) { | |||
return source; | |||
} | |||
let sourceCopy = source instanceof Array ? [] : {}; | |||
for (let item in source) { | |||
sourceCopy[item] = typeof source[item] === 'object' ? deepcopy(source[item]) : source[item]; | |||
} | |||
return sourceCopy; | |||
}; |
@@ -0,0 +1,5 @@ | |||
{ | |||
"globalDependencies": { | |||
"popper.js": "registry:dt/popper.js#0.4.0+20161005184000" | |||
} | |||
} |
@@ -0,0 +1,155 @@ | |||
var path = require('path'); | |||
var webpack = require('webpack'); | |||
const CopyWebpackPlugin = require('copy-webpack-plugin'); | |||
const HtmlWebpackPlugin = require('html-webpack-plugin'); | |||
const CleanWebpackPlugin = require('clean-webpack-plugin'); | |||
const packageInfo = require('./package.json'); | |||
const CompressionWebpackPlugin = require("compression-webpack-plugin"); | |||
module.exports = (env = {}) =>{ | |||
console.log(`------------------- ${env.Generative?'生产':'开发'}环境 -------------------`); | |||
var plugins = (module.exports.plugins || []).concat([ | |||
new CleanWebpackPlugin(['dist']), | |||
new webpack.optimize.UglifyJsPlugin({ | |||
// sourceMap: true, | |||
// compress: { | |||
// warnings: false | |||
// } | |||
}), | |||
new webpack.LoaderOptionsPlugin({ | |||
minimize: true | |||
}) | |||
]) | |||
if(!env.Generative){ | |||
plugins = []; | |||
} | |||
plugins.push( | |||
new CompressionWebpackPlugin({ | |||
filename: '[path].gz[query]', //压缩后的文件名 | |||
algorithm: 'gzip',// 压缩格式 有:gzip、brotliCompress、 | |||
test: /\.(js|css|svg)$/, | |||
threshold: 10240,// 只处理比这个值大的资源,按字节算 | |||
minRatio: 0.8, //只有压缩率比这个值小的文件才会被处理,压缩率=压缩大小/原始大小,如果压缩后和原始文件大小没有太大区别,就不用压缩 | |||
deleteOriginalAssets: false //是否删除原文件,最好不删除,服务器会自动优先返回同名的.gzip资源,如果找不到还可以拿原始文件 | |||
})); | |||
plugins.push(new CopyWebpackPlugin([{ | |||
// from: './src/static', | |||
// to: 'static' | |||
from : path.join(__dirname,'./src/static'), | |||
to : 'static' | |||
}])); | |||
plugins.push(new HtmlWebpackPlugin({ | |||
// title: "自动生成网页标题", | |||
filename: "./index.html", | |||
hash:true, | |||
showErrors: true, | |||
version: packageInfo.version, | |||
template: './src/index.html' | |||
})); | |||
return { | |||
entry: { | |||
app:['babel-polyfill','./src/main.js'], | |||
vendor: ['vue', 'vue-router', 'vuex', 'element-ui'] | |||
}, | |||
output: { | |||
path: path.resolve(__dirname, './dist'),//输出结果 | |||
publicPath: env.production ? './' : '/', //文件路径 | |||
filename: '[name].js', | |||
chunkFilename: 'js/[name].js' | |||
}, | |||
module: { | |||
rules: [ | |||
// 使用vue-loader 加载 .vue 结尾的文件 | |||
{ | |||
test: /\.vue$/, | |||
loader: 'vue-loader', | |||
options: { | |||
loaders: { | |||
}, | |||
// other vue-loader options go here | |||
presets: ['es2015'], | |||
plugins: ['transform-runtime', 'transform-object-rest-spread'] | |||
}, | |||
// query: { | |||
// } | |||
}, | |||
// 使用babel 加载 .js 结尾的文件 | |||
{ | |||
test: /\.js$/, | |||
loader: 'babel-loader', | |||
exclude: /node_modules/ | |||
}, | |||
// 加载图标 | |||
{ | |||
test: /\.(png|jpg|gif|svg)$/, | |||
loader: 'file-loader', | |||
options: { | |||
name: '[name].[ext]?[hash]', | |||
limit: 8192, | |||
outputPath: 'static/images/' | |||
} | |||
}, | |||
//加载css | |||
{ | |||
test: /\.css$/, | |||
loader: "style-loader!css-loader", | |||
// loader: 'style-loader!css-loader?modules&importLoaders=1&localIdentName=[name]__[local]___[hash:base64:5]', | |||
// exclude: /node_modules/ | |||
}, | |||
// { | |||
// test: /\.scss$/, | |||
// loader: "style-loader!css-loader!sass-loader!" | |||
// }, | |||
// { | |||
// test: /\.(woff|woff2|svg|ttf|eot)$/, | |||
// use:[ | |||
// {loader:'file-loader',options:{name:'fonts/[name].[hash:8].[ext]'}}//项目设置打包到dist下的fonts文件夹下 | |||
// // {loader:'url-loader',options:{name:'fonts/[name].[hash:8].[ext]'}}//项目设置打包到dist下的fonts文件夹下 | |||
// ] | |||
// }, | |||
{ | |||
test: /\.(woff|woff2|svg|eot|ttf)\??.*$/, | |||
// loader: 'url-loader' | |||
loader:'url-loader',options:{name:'fonts/[name].[hash:8].[ext]'}//项目设置打包到dist下的fonts文件夹下 | |||
}, | |||
// { | |||
// test: /\.html$/, | |||
// loader: 'html-loader', | |||
// options: { | |||
// minimize: false | |||
// } | |||
// } | |||
] | |||
}, | |||
resolve: { | |||
alias: { | |||
'vue$': 'vue/dist/vue.esm.js' | |||
} | |||
}, | |||
externals: { | |||
"BMap": "BMap" | |||
}, | |||
devServer: { | |||
inline: true, //检测文件变化,实时构建并刷新浏览器 | |||
port: "8880", | |||
proxy: { | |||
'/T': { | |||
target: 'https://opentest.malls.iformall.com/T', | |||
// target: 'http://10.100.30.171:6060', | |||
pathRewrite: { | |||
"^/T": "" | |||
}, | |||
secure: false, | |||
changeOrigin: true | |||
}, | |||
}, | |||
historyApiFallback: true, | |||
}, | |||
performance: { | |||
hints: false | |||
}, | |||
plugins:plugins, | |||
// devtool: '#eval-source-map'//开发模式下更方便定位错误 | |||
devtool:env.Generative?false:'#eval-source-map' | |||
} | |||
} |