Merge branch 'dev' of http://git.sinoecare.com/sinoecare/digital_village_v2/dvcp_v2_webapp into dev
This commit is contained in:
@@ -1,178 +1,16 @@
|
|||||||
<template>
|
<template>
|
||||||
<section class="AppQyWxConfig">
|
<section class="AppQyWxConfig">
|
||||||
<ai-list>
|
<component :is="currentPage" v-bind="$props"/>
|
||||||
<ai-title slot="title" title="企业微信配置" isShowBottomBorder/>
|
|
||||||
<template #content>
|
|
||||||
<ai-search-bar>
|
|
||||||
<template #left>
|
|
||||||
<el-button type="primary" @click="add" icon="iconfont iconAdd">新增</el-button>
|
|
||||||
</template>
|
|
||||||
<template #right>
|
|
||||||
<el-input size="small" placeholder="搜索名称" v-model="search.name" clearable
|
|
||||||
@clear="page.current = 1,search.name = '', getTableData()"
|
|
||||||
v-throttle="() => {page.current = 1, getTableData()}"/>
|
|
||||||
</template>
|
|
||||||
</ai-search-bar>
|
|
||||||
<ai-table :tableData="tableData" :total="page.total" :current.sync="page.current" :size.sync="page.size"
|
|
||||||
@getList="getTableData" :col-configs="colConfigs">
|
|
||||||
<el-table-column type="expand" slot="expand">
|
|
||||||
<template slot-scope="{row}">
|
|
||||||
<ai-wrapper>
|
|
||||||
<ai-info-item labelWidth="200px" v-for="op in desConfigs" :key="op.prop" :value="row[op.prop]"
|
|
||||||
v-bind="op"/>
|
|
||||||
</ai-wrapper>
|
|
||||||
</template>
|
|
||||||
</el-table-column>
|
|
||||||
<el-table-column slot="status" align="center" label="状态" width="150">
|
|
||||||
<template v-slot="{ row }">
|
|
||||||
<el-switch v-model="row.status" @change="onChange(row)" active-value="1" inactive-value="0"
|
|
||||||
active-color="#5088FF" inactive-color="#D0D4DC"></el-switch>
|
|
||||||
</template>
|
|
||||||
</el-table-column>
|
|
||||||
<el-table-column slot="miniappStatus" align="center" label="小程序状态" width="150">
|
|
||||||
<template v-slot="{ row }">
|
|
||||||
<el-switch v-model="row.miniappStatus" @change="onMiniappStatusChange(row)" active-value="1"
|
|
||||||
inactive-value="0"
|
|
||||||
active-color="#5088FF" inactive-color="#D0D4DC"></el-switch>
|
|
||||||
</template>
|
|
||||||
</el-table-column>
|
|
||||||
<el-table-column slot="options" align="center" label="操作" width="400">
|
|
||||||
<el-row type="flex" justify="center" align="middle" slot-scope="{row}">
|
|
||||||
<el-button type="text" @click="detail(row)">详情</el-button>
|
|
||||||
<el-button type="text" @click="del(row)">删除</el-button>
|
|
||||||
<el-button type="text" @click="handleSystemInfo(row.id)">系统信息</el-button>
|
|
||||||
<el-button type="text" @click="handlePush(row.id)">推送随手拍样式</el-button>
|
|
||||||
</el-row>
|
|
||||||
</el-table-column>
|
|
||||||
</ai-table>
|
|
||||||
</template>
|
|
||||||
</ai-list>
|
|
||||||
|
|
||||||
<ai-dialog title="新增" :visible.sync="dialog" width="800px" @onConfirm="confirm">
|
|
||||||
<el-form ref="form" :model="dialogForm" :rules="rules" size="small" label-width="180px">
|
|
||||||
<el-form-item required label="名称" prop="name">
|
|
||||||
<el-input v-model.trim="dialogForm.name" placeholder="请输入名称" show-word-limit maxlength="100"></el-input>
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item label="企业微信ID" prop="corpId">
|
|
||||||
<el-input v-model.trim="dialogForm.corpId" placeholder="请输入企业微信ID" show-word-limit maxlength="32"></el-input>
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item label="企业微信通讯录SECRET" prop="corpAddressBookSecret">
|
|
||||||
<el-input v-model.trim="dialogForm.corpAddressBookSecret" placeholder="请输入企业微信通讯录SECRET" show-word-limit
|
|
||||||
maxlength="64"></el-input>
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item label="企业微信AESKEY" prop="corpAeskey">
|
|
||||||
<el-input v-model.trim="dialogForm.corpAeskey" placeholder="请输入企业微信AESKEY" show-word-limit
|
|
||||||
maxlength="64"></el-input>
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item label="企业微信AGENTID" prop="corpAgentId">
|
|
||||||
<el-input v-model.trim="dialogForm.corpAgentId" placeholder="请输入企业微信AGENTID" show-word-limit
|
|
||||||
maxlength="100"></el-input>
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item label="随手拍AGENTID" prop="clapAgentId">
|
|
||||||
<el-input v-model.trim="dialogForm.clapAgentId" placeholder="请输入随手拍AGENTID" show-word-limit
|
|
||||||
maxlength="100"></el-input>
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item label="企业微信SECRET" prop="corpSecret">
|
|
||||||
<el-input v-model.trim="dialogForm.corpSecret" placeholder="请输入企业微信SECRET" show-word-limit
|
|
||||||
maxlength="255"></el-input>
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item label="企业微信TOKEN" prop="corpToken">
|
|
||||||
<el-input v-model.trim="dialogForm.corpToken" placeholder="请输入企业微信TOKEN" show-word-limit
|
|
||||||
maxlength="32"></el-input>
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item label="小程序APPID" prop="miniappAppid">
|
|
||||||
<el-input v-model.trim="dialogForm.miniappAppid" placeholder="请输入小程序APPID" show-word-limit
|
|
||||||
maxlength="32"></el-input>
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item label="小程序SECRET" prop="miniappSecret">
|
|
||||||
<el-input v-model.trim="dialogForm.miniappSecret" placeholder="请输入小程序SECRET" show-word-limit
|
|
||||||
maxlength="32"></el-input>
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item label="企微访问域名" prop="dvcpUrl">
|
|
||||||
<el-input v-model.trim="dialogForm.dvcpUrl" placeholder="请输入企微访问域名" show-word-limit maxlength="128">
|
|
||||||
<template slot="prepend">Http://</template>
|
|
||||||
</el-input>
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item label="web访问域名" prop="webUrl">
|
|
||||||
<el-input v-model.trim="dialogForm.webUrl" placeholder="请输入web访问域名" show-word-limit maxlength="128">
|
|
||||||
<template slot="prepend">Http://</template>
|
|
||||||
</el-input>
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item label="地区" prop="areaId">
|
|
||||||
<ai-area-select :instance="instance" v-model="dialogForm.areaId" alwaysShow
|
|
||||||
@name="(e)=>dialogForm.areaName=e"/>
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item label="地图中心点" prop="lat">
|
|
||||||
<el-button type="primary" icon="iconfont iconAdd" @click="showMap=true">设置地点</el-button>
|
|
||||||
<div v-if="dialogForm.lat">{{ dialogForm.address }}</div>
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item label="状态" prop="status">
|
|
||||||
<el-radio-group v-model.trim="dialogForm.status">
|
|
||||||
<el-radio label="1">启用</el-radio>
|
|
||||||
<el-radio label="0">禁用</el-radio>
|
|
||||||
</el-radio-group>
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item label="小程序状态" prop="miniappStatus">
|
|
||||||
<el-radio-group v-model.trim="dialogForm.miniappStatus">
|
|
||||||
<el-radio label="1">启用</el-radio>
|
|
||||||
<el-radio label="0">禁用</el-radio>
|
|
||||||
</el-radio-group>
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item label="系统配置信息" prop="systemInfo">
|
|
||||||
<el-input type="textarea" :rows="2" placeholder="请输入系统配置信息" v-model="dialogForm.systemInfo"
|
|
||||||
maxlength="50000"/>
|
|
||||||
</el-form-item>
|
|
||||||
</el-form>
|
|
||||||
</ai-dialog>
|
|
||||||
<ai-dialog title="地图" :visible.sync="showMap" @opened="initMap" width="800px" class="mapDialog"
|
|
||||||
@onConfirm="selectMap">
|
|
||||||
<div id="map"></div>
|
|
||||||
<el-input id="searchPlaceInput" size="medium" class="searchPlaceInput" clearable v-model="searchPlace"
|
|
||||||
autocomplete="on"
|
|
||||||
@change="placeSearch.search(searchPlace)">
|
|
||||||
<el-button type="primary" slot="append" @click="placeSearch.search(searchPlace)">搜索</el-button>
|
|
||||||
</el-input>
|
|
||||||
<div id="searchPlaceOutput"/>
|
|
||||||
</ai-dialog>
|
|
||||||
<ai-dialog title="系统信息设置" :visible.sync="sysInfoDialog" width="600px" @onConfirm="submitSystemInfo"
|
|
||||||
@closed="sysInfo={}">
|
|
||||||
<el-form size="small" label-width="140px">
|
|
||||||
<el-form-item label="页签标题">
|
|
||||||
<el-input v-model="sysInfo.title" placeholder="请输入..." clearable/>
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item label="系统标题">
|
|
||||||
<el-input v-model="sysInfo.fullTitle" placeholder="请输入..." clearable/>
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item label="logo">
|
|
||||||
<el-input v-model="sysInfo.logo" placeholder="请输入..." clearable/>
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item label="登录页左上角标题">
|
|
||||||
<el-input v-model="sysInfo.name" placeholder="请输入..." clearable/>
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item label="登录页副标题">
|
|
||||||
<el-input type="textarea" rows="5" v-model="sysInfo.desc" placeholder="请输入..." clearable/>
|
|
||||||
</el-form-item>
|
|
||||||
|
|
||||||
<el-form-item label="版权所有">
|
|
||||||
<el-input v-model="sysInfo.recordDesc" placeholder="请输入..." clearable/>
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item label="备案号">
|
|
||||||
<el-input v-model="sysInfo.recordNo" placeholder="请输入..." clearable/>
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item label="备案跳转链接">
|
|
||||||
<el-input v-model="sysInfo.recordURL" placeholder="请输入..." clearable/>
|
|
||||||
</el-form-item>
|
|
||||||
</el-form>
|
|
||||||
</ai-dialog>
|
|
||||||
</section>
|
</section>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import {mapState} from "vuex";
|
import List from "./list";
|
||||||
import AMapLoader from "@amap/amap-jsapi-loader"
|
import ThemeSetting from "./themeSetting";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: "AppQyWxConfig",
|
name: "AppQyWxConfig",
|
||||||
|
components: {ThemeSetting, List},
|
||||||
label: "企业微信配置",
|
label: "企业微信配置",
|
||||||
props: {
|
props: {
|
||||||
instance: Function,
|
instance: Function,
|
||||||
@@ -180,300 +18,18 @@ export default {
|
|||||||
permissions: Function
|
permissions: Function
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
...mapState(['user']),
|
currentPage() {
|
||||||
colConfigs() {
|
const {hash} = this.$route
|
||||||
return [
|
return hash == "#theme" ? ThemeSetting : List
|
||||||
{slot: 'expand'},
|
|
||||||
{prop: "name", label: "名称"},
|
|
||||||
{prop: "corpId", label: "企业微信ID", width: 180},
|
|
||||||
{slot: "status",},
|
|
||||||
{slot: "miniappStatus"},
|
|
||||||
{prop: "createTime", label: "创建时间"},
|
|
||||||
{slot: "options"},
|
|
||||||
]
|
|
||||||
},
|
|
||||||
desConfigs() {
|
|
||||||
let isLine = true
|
|
||||||
return [
|
|
||||||
{prop: "corpAddressBookSecret", label: "企业微信通讯录SECRET", width: 200},
|
|
||||||
{prop: "corpAgentId", label: "企业微信AGENTID", width: 150},
|
|
||||||
{prop: "corpSecret", label: "企业微信SECRET", isLine},
|
|
||||||
{prop: "corpToken", label: "企业微信TOKEN", width: 150},
|
|
||||||
{prop: "corpAeskey", label: "企业微信AESKEY", width: 150},
|
|
||||||
{prop: "miniappAppid", label: "小程序APPID", width: 150},
|
|
||||||
{prop: "miniappSecret", label: "小程序SECRET", width: 150},
|
|
||||||
{prop: "areaId", label: "地区编码", width: 150, isLine},
|
|
||||||
{prop: "lat", label: "纬度", width: 100},
|
|
||||||
{prop: "lng", label: "经度", width: 100},
|
|
||||||
{prop: "address", label: "中心点", width: 100, isLine},
|
|
||||||
{prop: "webUrl", label: "管理端地址", width: 100},
|
|
||||||
{prop: "dvcpUrl", label: "企微端地址", width: 100},
|
|
||||||
]
|
|
||||||
},
|
|
||||||
rules() {
|
|
||||||
return {
|
|
||||||
name: [{required: true, message: "请填写名称"}],
|
|
||||||
corpId: [{required: true, message: "请填写企业微信ID"}],
|
|
||||||
corpAddressBookSecret: [{required: true, message: "请填写企业微信通讯录SECRET"}],
|
|
||||||
corpAeskey: [{required: true, message: "请填写企业微信AESKEY"}],
|
|
||||||
corpAgentId: [{required: true, message: "请填写企业微信AGENTID"}],
|
|
||||||
corpSecret: [{required: true, message: "请填写企业微信SECRET"}],
|
|
||||||
corpToken: [{required: true, message: "请填写企业微信TOKEN"}],
|
|
||||||
miniappAppid: [{required: true, message: "请填写小程序APPID"}],
|
|
||||||
miniappSecret: [{required: true, message: "请填写小程序SECRET"}],
|
|
||||||
dvcpUrl: [{required: true, message: "请填写企微访问域名"}],
|
|
||||||
webUrl: [{required: true, message: "请填写web访问域名"}],
|
|
||||||
status: [{required: true, message: "请选择状态", trigger: "change"}],
|
|
||||||
miniappStatus: [{required: true, message: "请选择小程序状态", trigger: "change"}],
|
|
||||||
areaId: [{required: true, message: "请选择地区", trigger: "change"}],
|
|
||||||
lat: [{required: true, message: "请选择中心点"}],
|
|
||||||
systemInfo: [{required: true, message: "请输入系统配置信息"}],
|
|
||||||
}
|
|
||||||
},
|
|
||||||
},
|
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
page: {current: 1, size: 10, total: 0},
|
|
||||||
dialog: false,
|
|
||||||
showMap: false,
|
|
||||||
map: null,
|
|
||||||
placeSearch: null,
|
|
||||||
placeDetail: {},
|
|
||||||
searchPlace: "",
|
|
||||||
dialogForm: {},
|
|
||||||
tableData: [],
|
|
||||||
search: {
|
|
||||||
name: ""
|
|
||||||
},
|
|
||||||
sysInfo: {},
|
|
||||||
sysInfoDialog: false
|
|
||||||
}
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
selectMap() {
|
|
||||||
Object.keys(this.placeDetail).map(e => this.dialogForm[e] = this.placeDetail[e]);
|
|
||||||
this.showMap = false;
|
|
||||||
},
|
|
||||||
initMap() {
|
|
||||||
AMapLoader.load({
|
|
||||||
key: 'b553334ba34f7ac3cd09df9bc8b539dc',
|
|
||||||
version: '2.0',
|
|
||||||
plugins: ['AMap.PlaceSearch', 'AMap.AutoComplete', 'AMap.Geocoder'],
|
|
||||||
}).then(AMap => {
|
|
||||||
this.map = new AMap.Map('map', {
|
|
||||||
resizeEnable: true,
|
|
||||||
zooms: [6, 20],
|
|
||||||
center: [116.394681, 39.910283],
|
|
||||||
zoom: 11
|
|
||||||
})
|
|
||||||
this.placeSearch = new AMap.PlaceSearch({map: this.map})
|
|
||||||
new AMap.AutoComplete({
|
|
||||||
input: "searchPlaceInput",
|
|
||||||
output: 'searchPlaceOutput',
|
|
||||||
}).on('select', e => {
|
|
||||||
if (e?.poi) {
|
|
||||||
this.placeSearch.setCity(e.poi.adcode);
|
|
||||||
this.movePosition(e.poi.location)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
this.map.on('click', e => {
|
|
||||||
new AMap.Geocoder().getAddress(e.lnglat, (sta, res) => {
|
|
||||||
if (res?.regeocode) {
|
|
||||||
this.placeDetail = {
|
|
||||||
lng: e.lnglat?.lng,
|
|
||||||
lat: e.lnglat?.lat,
|
|
||||||
address: res.regeocode.formattedAddress
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
this.movePosition(e.lnglat)
|
|
||||||
})
|
|
||||||
})
|
|
||||||
},
|
|
||||||
movePosition(center) {
|
|
||||||
if (this.map) {
|
|
||||||
this.map.clearMap()
|
|
||||||
this.map.panTo(center)
|
|
||||||
this.map.add([
|
|
||||||
new AMap.Marker({
|
|
||||||
position: center,
|
|
||||||
clickable: true
|
|
||||||
})
|
|
||||||
])
|
|
||||||
this.map.setFitView()
|
|
||||||
}
|
|
||||||
},
|
|
||||||
onChange(row) {
|
|
||||||
this.instance.post(`/app/appdvcpconfig/setStatus`, null, {
|
|
||||||
params: {
|
|
||||||
id: row.id,
|
|
||||||
status: row.status
|
|
||||||
}
|
|
||||||
}).then((res) => {
|
|
||||||
if (res.code == 0) {
|
|
||||||
this.$message.success(+row.status ? '已启用' : '已禁用');
|
|
||||||
this.getTableData();
|
|
||||||
}
|
|
||||||
})
|
|
||||||
},
|
|
||||||
onMiniappStatusChange(row) {
|
|
||||||
this.instance.post(`/app/appdvcpconfig/setMiniappStatus`, null, {
|
|
||||||
params: {
|
|
||||||
id: row.id,
|
|
||||||
status: row.miniappStatus
|
|
||||||
}
|
|
||||||
}).then((res) => {
|
|
||||||
if (res.code == 0) {
|
|
||||||
this.$message.success(+row.miniappStatus ? '已启用' : '已禁用');
|
|
||||||
this.getTableData();
|
|
||||||
}
|
|
||||||
})
|
|
||||||
},
|
|
||||||
|
|
||||||
add() {
|
|
||||||
this.dialogForm = {};
|
|
||||||
this.dialog = true;
|
|
||||||
},
|
|
||||||
del(row) {
|
|
||||||
this.$confirm("是否要删除?").then(_ => {
|
|
||||||
this.instance.post("/app/appdvcpconfig/delete", null, {
|
|
||||||
params: {
|
|
||||||
ids: row.id
|
|
||||||
}
|
|
||||||
}).then(res => {
|
|
||||||
if (res.code == 0) {
|
|
||||||
this.$message.success("删除成功");
|
|
||||||
this.dialog = false;
|
|
||||||
this.getTableData();
|
|
||||||
}
|
|
||||||
})
|
|
||||||
})
|
|
||||||
},
|
|
||||||
detail(row) {
|
|
||||||
this.instance.post("/app/appdvcpconfig/detail", null, {
|
|
||||||
params: {
|
|
||||||
id: row.id
|
|
||||||
}
|
|
||||||
}).then(res => {
|
|
||||||
if (res && res.data) {
|
|
||||||
this.dialogForm = {...res.data};
|
|
||||||
this.dialog = true;
|
|
||||||
}
|
|
||||||
})
|
|
||||||
},
|
|
||||||
getTableData() {
|
|
||||||
this.instance.post("/app/appdvcpconfig/list", null, {
|
|
||||||
params: {...this.page, ...this.search}
|
|
||||||
}).then(res => {
|
|
||||||
if (res?.data) {
|
|
||||||
this.tableData = res.data?.records
|
|
||||||
this.page.total = res.data.total
|
|
||||||
}
|
|
||||||
})
|
|
||||||
},
|
|
||||||
confirm() {
|
|
||||||
this.$refs["form"].validate(valid => {
|
|
||||||
if (valid) {
|
|
||||||
this.instance.post("/app/appdvcpconfig/addOrUpdate", {
|
|
||||||
...this.dialogForm,
|
|
||||||
}).then(res => {
|
|
||||||
if (res.code == 0) {
|
|
||||||
this.$message.success(this.dialogForm.id ? "修改成功" : "新增成功");
|
|
||||||
this.dialog = false;
|
|
||||||
this.getTableData();
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
})
|
|
||||||
},
|
|
||||||
handleSystemInfo(id) {
|
|
||||||
this.sysInfoDialog = true
|
|
||||||
this.getSystemInfo(id)
|
|
||||||
},
|
|
||||||
getSystemInfo(id) {
|
|
||||||
this.instance.post("/app/appdvcpconfig/getSystemInfo", null, {
|
|
||||||
params: {id}
|
|
||||||
}).then(res => {
|
|
||||||
if (res?.data) {
|
|
||||||
this.sysInfo = JSON.parse(res.data)
|
|
||||||
this.sysInfo.id = id
|
|
||||||
}
|
|
||||||
})
|
|
||||||
},
|
|
||||||
submitSystemInfo() {
|
|
||||||
let {id} = this.sysInfo
|
|
||||||
this.instance.post("/app/appdvcpconfig/updateSystemInfo", this.sysInfo, {params: {id}}).then(res => {
|
|
||||||
if (res?.code == 0) {
|
|
||||||
this.$message.success("提交成功!")
|
|
||||||
this.sysInfoDialog = false
|
|
||||||
}
|
|
||||||
})
|
|
||||||
},
|
|
||||||
handlePush(id) {
|
|
||||||
this.instance.post("/app/appclapeventinfo/setAppWorkbench", null, {params: {id}}).then(res => {
|
|
||||||
if (res?.code == 0) {
|
|
||||||
this.$message.success("推送成功!")
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
created() {
|
created() {
|
||||||
this.dict.load("integralRuleStatus").then(this.getTableData);
|
this.dict.load("yesOrNo", "themeWeb", 'themeMp', "themeWxwork")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
.AppQyWxConfig {
|
.AppQyWxConfig {
|
||||||
height: 100%;
|
|
||||||
|
|
||||||
|
|
||||||
::v-deep .mapDialog {
|
|
||||||
.el-dialog__body {
|
|
||||||
padding: 0;
|
|
||||||
|
|
||||||
.ai-dialog__content {
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.ai-dialog__content--wrapper {
|
|
||||||
padding: 0 !important;
|
|
||||||
position: relative;
|
|
||||||
}
|
|
||||||
|
|
||||||
#map {
|
|
||||||
width: 100%;
|
|
||||||
height: 500px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.searchPlaceInput {
|
|
||||||
position: absolute;
|
|
||||||
width: 250px;
|
|
||||||
top: 30px;
|
|
||||||
left: 25px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#searchPlaceOutput {
|
|
||||||
position: absolute;
|
|
||||||
width: 250px;
|
|
||||||
left: 25px;
|
|
||||||
height: initial;
|
|
||||||
top: 80px;
|
|
||||||
background: white;
|
|
||||||
z-index: 250;
|
|
||||||
max-height: 300px;
|
|
||||||
overflow-y: auto;
|
|
||||||
|
|
||||||
.auto-item {
|
|
||||||
text-align: left;
|
|
||||||
font-size: 14px;
|
|
||||||
padding: 8px;
|
|
||||||
box-sizing: border-box;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
74
core/apps/AppQyWxConfig/components/AiSelectCard.vue
Normal file
74
core/apps/AppQyWxConfig/components/AiSelectCard.vue
Normal file
@@ -0,0 +1,74 @@
|
|||||||
|
<template>
|
||||||
|
<section class="AiSelectCard" flex>
|
||||||
|
<div class="checkCard" v-for="op in list" :key="op[props.value]" :class="{checked:op.dictValue==value}">
|
||||||
|
<el-image :src="op.thumb"/>
|
||||||
|
<el-row type="flex" class="bottomPane">
|
||||||
|
<b class="label fill" v-text="op[props.label]"/>
|
||||||
|
<el-button type="text" @click.stop="$emit('change',op[props.value])">使用</el-button>
|
||||||
|
</el-row>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
name: "AiSelectCard",
|
||||||
|
model: {
|
||||||
|
prop: "value",
|
||||||
|
event: "change"
|
||||||
|
},
|
||||||
|
props: {
|
||||||
|
value: {default: ""},
|
||||||
|
ops: {default: () => []},
|
||||||
|
type: {default: "web"},
|
||||||
|
dict: String,
|
||||||
|
prop: {default: () => ({})}
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
list: v => (v.dict ? v.$dict.getDict(v.dict) : v.ops || []).map(e => ({
|
||||||
|
...e,
|
||||||
|
thumb: `https://cdn.cunwuyun.cn/theme/thumb/${v.type}_${e[v.props.value]}.png`
|
||||||
|
})),
|
||||||
|
props: v => ({value: 'dictValue', label: 'dictName', ...v.prop})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.AiSelectCard {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
gap: 16px;
|
||||||
|
|
||||||
|
.checkCard {
|
||||||
|
width: 360px;
|
||||||
|
background: #fff;
|
||||||
|
border-radius: 8px;
|
||||||
|
overflow: hidden;
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
.label {
|
||||||
|
user-select: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.checked:before {
|
||||||
|
position: absolute;
|
||||||
|
content: "应用中";
|
||||||
|
top: 16px;
|
||||||
|
left: 16px;
|
||||||
|
z-index: 9;
|
||||||
|
padding: 8px 16px;
|
||||||
|
background: rgba(#000, .7);
|
||||||
|
color: #fff;
|
||||||
|
border-radius: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bottomPane {
|
||||||
|
height: 48px;
|
||||||
|
align-items: center;
|
||||||
|
padding: 0 16px;
|
||||||
|
border-top: 1px solid #eee;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
481
core/apps/AppQyWxConfig/list.vue
Normal file
481
core/apps/AppQyWxConfig/list.vue
Normal file
@@ -0,0 +1,481 @@
|
|||||||
|
<template>
|
||||||
|
<section class="list">
|
||||||
|
<ai-list>
|
||||||
|
<ai-title slot="title" title="企业微信配置" isShowBottomBorder/>
|
||||||
|
<template #content>
|
||||||
|
<ai-search-bar>
|
||||||
|
<template #left>
|
||||||
|
<el-button type="primary" @click="add" icon="iconfont iconAdd">新增</el-button>
|
||||||
|
</template>
|
||||||
|
<template #right>
|
||||||
|
<el-input size="small" placeholder="搜索名称" v-model="search.name" clearable
|
||||||
|
@clear="page.current = 1,search.name = '', getTableData()"
|
||||||
|
v-throttle="() => {page.current = 1, getTableData()}"/>
|
||||||
|
</template>
|
||||||
|
</ai-search-bar>
|
||||||
|
<ai-table :tableData="tableData" :total="page.total" :current.sync="page.current" :size.sync="page.size"
|
||||||
|
@getList="getTableData" :col-configs="colConfigs">
|
||||||
|
<el-table-column type="expand" slot="expand">
|
||||||
|
<template slot-scope="{row}">
|
||||||
|
<ai-wrapper>
|
||||||
|
<ai-info-item labelWidth="200px" v-for="op in desConfigs" :key="op.prop" :value="row[op.prop]"
|
||||||
|
v-bind="op"/>
|
||||||
|
</ai-wrapper>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column slot="status" align="center" label="状态" width="150">
|
||||||
|
<template v-slot="{ row }">
|
||||||
|
<el-switch v-model="row.status" @change="onChange(row)" active-value="1" inactive-value="0"
|
||||||
|
active-color="#5088FF" inactive-color="#D0D4DC"></el-switch>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column slot="miniappStatus" align="center" label="小程序状态" width="150">
|
||||||
|
<template v-slot="{ row }">
|
||||||
|
<el-switch v-model="row.miniappStatus" @change="onMiniappStatusChange(row)" active-value="1"
|
||||||
|
inactive-value="0"
|
||||||
|
active-color="#5088FF" inactive-color="#D0D4DC"></el-switch>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column slot="options" align="center" label="操作" width="400">
|
||||||
|
<el-row type="flex" justify="center" align="middle" slot-scope="{row}">
|
||||||
|
<el-button type="text" @click="detail(row)">详情</el-button>
|
||||||
|
<el-button type="text" @click="del(row)">删除</el-button>
|
||||||
|
<el-button type="text" @click="handleSystemInfo(row.id)">系统信息</el-button>
|
||||||
|
<el-button type="text" @click="handlePush(row.id)">推送随手拍样式</el-button>
|
||||||
|
<el-button type="text" @click="handleTheme(row.id)">主题样式</el-button>
|
||||||
|
</el-row>
|
||||||
|
</el-table-column>
|
||||||
|
</ai-table>
|
||||||
|
</template>
|
||||||
|
</ai-list>
|
||||||
|
<ai-dialog title="新增" :visible.sync="dialog" width="800px" @onConfirm="confirm">
|
||||||
|
<el-form ref="form" :model="dialogForm" :rules="rules" size="small" label-width="180px">
|
||||||
|
<el-form-item required label="名称" prop="name">
|
||||||
|
<el-input v-model.trim="dialogForm.name" placeholder="请输入名称" show-word-limit maxlength="100"></el-input>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="企业微信ID" prop="corpId">
|
||||||
|
<el-input v-model.trim="dialogForm.corpId" placeholder="请输入企业微信ID" show-word-limit maxlength="32"></el-input>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="企业微信通讯录SECRET" prop="corpAddressBookSecret">
|
||||||
|
<el-input v-model.trim="dialogForm.corpAddressBookSecret" placeholder="请输入企业微信通讯录SECRET" show-word-limit
|
||||||
|
maxlength="64"></el-input>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="企业微信AESKEY" prop="corpAeskey">
|
||||||
|
<el-input v-model.trim="dialogForm.corpAeskey" placeholder="请输入企业微信AESKEY" show-word-limit
|
||||||
|
maxlength="64"></el-input>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="企业微信AGENTID" prop="corpAgentId">
|
||||||
|
<el-input v-model.trim="dialogForm.corpAgentId" placeholder="请输入企业微信AGENTID" show-word-limit
|
||||||
|
maxlength="100"></el-input>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="随手拍AGENTID" prop="clapAgentId">
|
||||||
|
<el-input v-model.trim="dialogForm.clapAgentId" placeholder="请输入随手拍AGENTID" show-word-limit
|
||||||
|
maxlength="100"></el-input>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="企业微信SECRET" prop="corpSecret">
|
||||||
|
<el-input v-model.trim="dialogForm.corpSecret" placeholder="请输入企业微信SECRET" show-word-limit
|
||||||
|
maxlength="255"></el-input>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="企业微信TOKEN" prop="corpToken">
|
||||||
|
<el-input v-model.trim="dialogForm.corpToken" placeholder="请输入企业微信TOKEN" show-word-limit
|
||||||
|
maxlength="32"></el-input>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="小程序APPID" prop="miniappAppid">
|
||||||
|
<el-input v-model.trim="dialogForm.miniappAppid" placeholder="请输入小程序APPID" show-word-limit
|
||||||
|
maxlength="32"></el-input>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="小程序SECRET" prop="miniappSecret">
|
||||||
|
<el-input v-model.trim="dialogForm.miniappSecret" placeholder="请输入小程序SECRET" show-word-limit
|
||||||
|
maxlength="32"></el-input>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="企微访问域名" prop="dvcpUrl">
|
||||||
|
<el-input v-model.trim="dialogForm.dvcpUrl" placeholder="请输入企微访问域名" show-word-limit maxlength="128">
|
||||||
|
<template slot="prepend">Http://</template>
|
||||||
|
</el-input>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="web访问域名" prop="webUrl">
|
||||||
|
<el-input v-model.trim="dialogForm.webUrl" placeholder="请输入web访问域名" show-word-limit maxlength="128">
|
||||||
|
<template slot="prepend">Http://</template>
|
||||||
|
</el-input>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="地区" prop="areaId">
|
||||||
|
<ai-area-select :instance="instance" v-model="dialogForm.areaId" alwaysShow
|
||||||
|
@name="(e)=>dialogForm.areaName=e"/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="地图中心点" prop="lat">
|
||||||
|
<el-button type="primary" icon="iconfont iconAdd" @click="showMap=true">设置地点</el-button>
|
||||||
|
<div v-if="dialogForm.lat">{{ dialogForm.address }}</div>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="状态" prop="status">
|
||||||
|
<el-radio-group v-model.trim="dialogForm.status">
|
||||||
|
<el-radio label="1">启用</el-radio>
|
||||||
|
<el-radio label="0">禁用</el-radio>
|
||||||
|
</el-radio-group>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="小程序状态" prop="miniappStatus">
|
||||||
|
<el-radio-group v-model.trim="dialogForm.miniappStatus">
|
||||||
|
<el-radio label="1">启用</el-radio>
|
||||||
|
<el-radio label="0">禁用</el-radio>
|
||||||
|
</el-radio-group>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="系统配置信息" prop="systemInfo">
|
||||||
|
<el-input type="textarea" :rows="2" placeholder="请输入系统配置信息" v-model="dialogForm.systemInfo"
|
||||||
|
maxlength="50000"/>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
</ai-dialog>
|
||||||
|
<ai-dialog title="地图" :visible.sync="showMap" @opened="initMap" width="800px" class="mapDialog"
|
||||||
|
@onConfirm="selectMap">
|
||||||
|
<div id="map"></div>
|
||||||
|
<el-input id="searchPlaceInput" size="medium" class="searchPlaceInput" clearable v-model="searchPlace"
|
||||||
|
autocomplete="on"
|
||||||
|
@change="placeSearch.search(searchPlace)">
|
||||||
|
<el-button type="primary" slot="append" @click="placeSearch.search(searchPlace)">搜索</el-button>
|
||||||
|
</el-input>
|
||||||
|
<div id="searchPlaceOutput"/>
|
||||||
|
</ai-dialog>
|
||||||
|
<ai-dialog title="系统信息设置" :visible.sync="sysInfoDialog" width="600px" @onConfirm="submitSystemInfo"
|
||||||
|
@closed="sysInfo={}">
|
||||||
|
<el-form size="small" label-width="140px">
|
||||||
|
<el-form-item label="页签标题">
|
||||||
|
<el-input v-model="sysInfo.title" placeholder="请输入..." clearable/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="系统标题">
|
||||||
|
<el-input v-model="sysInfo.fullTitle" placeholder="请输入..." clearable/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="logo">
|
||||||
|
<el-input v-model="sysInfo.logo" placeholder="请输入..." clearable/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="登录页左上角标题">
|
||||||
|
<el-input v-model="sysInfo.name" placeholder="请输入..." clearable/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="登录页副标题">
|
||||||
|
<el-input type="textarea" rows="5" v-model="sysInfo.desc" placeholder="请输入..." clearable/>
|
||||||
|
</el-form-item>
|
||||||
|
|
||||||
|
<el-form-item label="版权所有">
|
||||||
|
<el-input v-model="sysInfo.recordDesc" placeholder="请输入..." clearable/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="备案号">
|
||||||
|
<el-input v-model="sysInfo.recordNo" placeholder="请输入..." clearable/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="备案跳转链接">
|
||||||
|
<el-input v-model="sysInfo.recordURL" placeholder="请输入..." clearable/>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
</ai-dialog>
|
||||||
|
</section>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import {mapState} from "vuex";
|
||||||
|
import AMapLoader from "@amap/amap-jsapi-loader"
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: "list",
|
||||||
|
props: {
|
||||||
|
instance: Function,
|
||||||
|
dict: Object,
|
||||||
|
permissions: Function
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
...mapState(['user']),
|
||||||
|
colConfigs() {
|
||||||
|
return [
|
||||||
|
{slot: 'expand'},
|
||||||
|
{prop: "name", label: "名称"},
|
||||||
|
{prop: "corpId", label: "企业微信ID", width: 180},
|
||||||
|
{slot: "status",},
|
||||||
|
{slot: "miniappStatus"},
|
||||||
|
{prop: "createTime", label: "创建时间"},
|
||||||
|
{slot: "options"},
|
||||||
|
]
|
||||||
|
},
|
||||||
|
desConfigs() {
|
||||||
|
let isLine = true
|
||||||
|
return [
|
||||||
|
{prop: "corpAddressBookSecret", label: "企业微信通讯录SECRET", width: 200},
|
||||||
|
{prop: "corpAgentId", label: "企业微信AGENTID", width: 150},
|
||||||
|
{prop: "corpSecret", label: "企业微信SECRET", isLine},
|
||||||
|
{prop: "corpToken", label: "企业微信TOKEN", width: 150},
|
||||||
|
{prop: "corpAeskey", label: "企业微信AESKEY", width: 150},
|
||||||
|
{prop: "miniappAppid", label: "小程序APPID", width: 150},
|
||||||
|
{prop: "miniappSecret", label: "小程序SECRET", width: 150},
|
||||||
|
{prop: "areaId", label: "地区编码", width: 150, isLine},
|
||||||
|
{prop: "lat", label: "纬度", width: 100},
|
||||||
|
{prop: "lng", label: "经度", width: 100},
|
||||||
|
{prop: "address", label: "中心点", width: 100, isLine},
|
||||||
|
{prop: "webUrl", label: "管理端地址", width: 100},
|
||||||
|
{prop: "dvcpUrl", label: "企微端地址", width: 100},
|
||||||
|
]
|
||||||
|
},
|
||||||
|
rules() {
|
||||||
|
return {
|
||||||
|
name: [{required: true, message: "请填写名称"}],
|
||||||
|
corpId: [{required: true, message: "请填写企业微信ID"}],
|
||||||
|
corpAddressBookSecret: [{required: true, message: "请填写企业微信通讯录SECRET"}],
|
||||||
|
corpAeskey: [{required: true, message: "请填写企业微信AESKEY"}],
|
||||||
|
corpAgentId: [{required: true, message: "请填写企业微信AGENTID"}],
|
||||||
|
corpSecret: [{required: true, message: "请填写企业微信SECRET"}],
|
||||||
|
corpToken: [{required: true, message: "请填写企业微信TOKEN"}],
|
||||||
|
miniappAppid: [{required: true, message: "请填写小程序APPID"}],
|
||||||
|
miniappSecret: [{required: true, message: "请填写小程序SECRET"}],
|
||||||
|
dvcpUrl: [{required: true, message: "请填写企微访问域名"}],
|
||||||
|
webUrl: [{required: true, message: "请填写web访问域名"}],
|
||||||
|
status: [{required: true, message: "请选择状态", trigger: "change"}],
|
||||||
|
miniappStatus: [{required: true, message: "请选择小程序状态", trigger: "change"}],
|
||||||
|
areaId: [{required: true, message: "请选择地区", trigger: "change"}],
|
||||||
|
lat: [{required: true, message: "请选择中心点"}],
|
||||||
|
systemInfo: [{required: true, message: "请输入系统配置信息"}],
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
page: {current: 1, size: 10, total: 0},
|
||||||
|
dialog: false,
|
||||||
|
showMap: false,
|
||||||
|
map: null,
|
||||||
|
placeSearch: null,
|
||||||
|
placeDetail: {},
|
||||||
|
searchPlace: "",
|
||||||
|
dialogForm: {},
|
||||||
|
tableData: [],
|
||||||
|
search: {
|
||||||
|
name: ""
|
||||||
|
},
|
||||||
|
sysInfo: {},
|
||||||
|
sysInfoDialog: false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
selectMap() {
|
||||||
|
Object.keys(this.placeDetail).map(e => this.dialogForm[e] = this.placeDetail[e]);
|
||||||
|
this.showMap = false;
|
||||||
|
},
|
||||||
|
initMap() {
|
||||||
|
AMapLoader.load({
|
||||||
|
key: 'b553334ba34f7ac3cd09df9bc8b539dc',
|
||||||
|
version: '2.0',
|
||||||
|
plugins: ['AMap.PlaceSearch', 'AMap.AutoComplete', 'AMap.Geocoder'],
|
||||||
|
}).then(AMap => {
|
||||||
|
this.map = new AMap.Map('map', {
|
||||||
|
resizeEnable: true,
|
||||||
|
zooms: [6, 20],
|
||||||
|
center: [116.394681, 39.910283],
|
||||||
|
zoom: 11
|
||||||
|
})
|
||||||
|
this.placeSearch = new AMap.PlaceSearch({map: this.map})
|
||||||
|
new AMap.AutoComplete({
|
||||||
|
input: "searchPlaceInput",
|
||||||
|
output: 'searchPlaceOutput',
|
||||||
|
}).on('select', e => {
|
||||||
|
if (e?.poi) {
|
||||||
|
this.placeSearch.setCity(e.poi.adcode);
|
||||||
|
this.movePosition(e.poi.location)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
this.map.on('click', e => {
|
||||||
|
new AMap.Geocoder().getAddress(e.lnglat, (sta, res) => {
|
||||||
|
if (res?.regeocode) {
|
||||||
|
this.placeDetail = {
|
||||||
|
lng: e.lnglat?.lng,
|
||||||
|
lat: e.lnglat?.lat,
|
||||||
|
address: res.regeocode.formattedAddress
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
this.movePosition(e.lnglat)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
},
|
||||||
|
movePosition(center) {
|
||||||
|
if (this.map) {
|
||||||
|
this.map.clearMap()
|
||||||
|
this.map.panTo(center)
|
||||||
|
this.map.add([
|
||||||
|
new AMap.Marker({
|
||||||
|
position: center,
|
||||||
|
clickable: true
|
||||||
|
})
|
||||||
|
])
|
||||||
|
this.map.setFitView()
|
||||||
|
}
|
||||||
|
},
|
||||||
|
onChange(row) {
|
||||||
|
this.instance.post(`/app/appdvcpconfig/setStatus`, null, {
|
||||||
|
params: {
|
||||||
|
id: row.id,
|
||||||
|
status: row.status
|
||||||
|
}
|
||||||
|
}).then((res) => {
|
||||||
|
if (res.code == 0) {
|
||||||
|
this.$message.success(+row.status ? '已启用' : '已禁用');
|
||||||
|
this.getTableData();
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
onMiniappStatusChange(row) {
|
||||||
|
this.instance.post(`/app/appdvcpconfig/setMiniappStatus`, null, {
|
||||||
|
params: {
|
||||||
|
id: row.id,
|
||||||
|
status: row.miniappStatus
|
||||||
|
}
|
||||||
|
}).then((res) => {
|
||||||
|
if (res.code == 0) {
|
||||||
|
this.$message.success(+row.miniappStatus ? '已启用' : '已禁用');
|
||||||
|
this.getTableData();
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
add() {
|
||||||
|
this.dialogForm = {};
|
||||||
|
this.dialog = true;
|
||||||
|
},
|
||||||
|
del(row) {
|
||||||
|
this.$confirm("是否要删除?").then(_ => {
|
||||||
|
this.instance.post("/app/appdvcpconfig/delete", null, {
|
||||||
|
params: {
|
||||||
|
ids: row.id
|
||||||
|
}
|
||||||
|
}).then(res => {
|
||||||
|
if (res.code == 0) {
|
||||||
|
this.$message.success("删除成功");
|
||||||
|
this.dialog = false;
|
||||||
|
this.getTableData();
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
},
|
||||||
|
detail(row) {
|
||||||
|
this.instance.post("/app/appdvcpconfig/detail", null, {
|
||||||
|
params: {
|
||||||
|
id: row.id
|
||||||
|
}
|
||||||
|
}).then(res => {
|
||||||
|
if (res && res.data) {
|
||||||
|
this.dialogForm = {...res.data};
|
||||||
|
this.dialog = true;
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
getTableData() {
|
||||||
|
this.instance.post("/app/appdvcpconfig/list", null, {
|
||||||
|
params: {...this.page, ...this.search}
|
||||||
|
}).then(res => {
|
||||||
|
if (res?.data) {
|
||||||
|
this.tableData = res.data?.records
|
||||||
|
this.page.total = res.data.total
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
confirm() {
|
||||||
|
this.$refs["form"].validate(valid => {
|
||||||
|
if (valid) {
|
||||||
|
this.instance.post("/app/appdvcpconfig/addOrUpdate", {
|
||||||
|
...this.dialogForm,
|
||||||
|
}).then(res => {
|
||||||
|
if (res.code == 0) {
|
||||||
|
this.$message.success(this.dialogForm.id ? "修改成功" : "新增成功");
|
||||||
|
this.dialog = false;
|
||||||
|
this.getTableData();
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
handleSystemInfo(id) {
|
||||||
|
this.sysInfoDialog = true
|
||||||
|
this.getSystemInfo(id)
|
||||||
|
},
|
||||||
|
getSystemInfo(id) {
|
||||||
|
this.instance.post("/app/appdvcpconfig/getSystemInfo", null, {
|
||||||
|
params: {id}
|
||||||
|
}).then(res => {
|
||||||
|
if (res?.data) {
|
||||||
|
this.sysInfo = JSON.parse(res.data)
|
||||||
|
this.sysInfo.id = id
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
submitSystemInfo() {
|
||||||
|
let {id} = this.sysInfo
|
||||||
|
this.instance.post("/app/appdvcpconfig/updateSystemInfo", this.sysInfo, {params: {id}}).then(res => {
|
||||||
|
if (res?.code == 0) {
|
||||||
|
this.$message.success("提交成功!")
|
||||||
|
this.sysInfoDialog = false
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
handlePush(id) {
|
||||||
|
this.instance.post("/app/appclapeventinfo/setAppWorkbench", null, {params: {id}}).then(res => {
|
||||||
|
if (res?.code == 0) {
|
||||||
|
this.$message.success("推送成功!")
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
handleTheme(id) {
|
||||||
|
this.$router.push({hash: "#theme", query: {id}})
|
||||||
|
}
|
||||||
|
},
|
||||||
|
created() {
|
||||||
|
this.getTableData()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.list {
|
||||||
|
height: 100%;
|
||||||
|
|
||||||
|
|
||||||
|
::v-deep .mapDialog {
|
||||||
|
.el-dialog__body {
|
||||||
|
padding: 0;
|
||||||
|
|
||||||
|
.ai-dialog__content {
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-dialog__content--wrapper {
|
||||||
|
padding: 0 !important;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
#map {
|
||||||
|
width: 100%;
|
||||||
|
height: 500px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.searchPlaceInput {
|
||||||
|
position: absolute;
|
||||||
|
width: 250px;
|
||||||
|
top: 30px;
|
||||||
|
left: 25px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#searchPlaceOutput {
|
||||||
|
position: absolute;
|
||||||
|
width: 250px;
|
||||||
|
left: 25px;
|
||||||
|
height: initial;
|
||||||
|
top: 80px;
|
||||||
|
background: white;
|
||||||
|
z-index: 250;
|
||||||
|
max-height: 300px;
|
||||||
|
overflow-y: auto;
|
||||||
|
|
||||||
|
.auto-item {
|
||||||
|
text-align: left;
|
||||||
|
font-size: 14px;
|
||||||
|
padding: 8px;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
</style>
|
||||||
83
core/apps/AppQyWxConfig/themeSetting.vue
Normal file
83
core/apps/AppQyWxConfig/themeSetting.vue
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
<template>
|
||||||
|
<section class="themeSetting">
|
||||||
|
<ai-detail list>
|
||||||
|
<ai-title slot="title" title="主题样式" isShowBottomBorder isShowBack @back="cancel">
|
||||||
|
<template #rightBtn>
|
||||||
|
<span class="mar-r8" v-text="'灰色滤镜'"/>
|
||||||
|
<el-switch size="mini" v-model="form.enableGreyFilter" name="灰色滤镜" border active-value="1" inactive-value="0"/>
|
||||||
|
</template>
|
||||||
|
</ai-title>
|
||||||
|
<template #content>
|
||||||
|
<el-form size="small" :model="form" ref="ThemeForm">
|
||||||
|
<ai-title title="WEB后台"/>
|
||||||
|
<ai-select-card dict="themeWeb" v-model="form.colorScheme.web"/>
|
||||||
|
</el-form>
|
||||||
|
</template>
|
||||||
|
<template #footer>
|
||||||
|
<el-button @click="cancel">取消</el-button>
|
||||||
|
<el-button type="primary" @click="submit">提交</el-button>
|
||||||
|
</template>
|
||||||
|
</ai-detail>
|
||||||
|
</section>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import AiSelectCard from "./components/AiSelectCard";
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: "themeSetting",
|
||||||
|
components: {AiSelectCard},
|
||||||
|
props: {
|
||||||
|
instance: Function,
|
||||||
|
dict: Object,
|
||||||
|
permissions: Function
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
form: {enableGreyFilter: '0', colorScheme: {}}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
getDetail() {
|
||||||
|
const {id} = this.$route.query
|
||||||
|
this.instance.post("/app/appdvcpconfig/detail", null, {params: {id}}).then(res => {
|
||||||
|
if (res?.data) {
|
||||||
|
let {colorScheme, enableGreyFilter} = res.data
|
||||||
|
colorScheme = JSON.parse(colorScheme) || {web: 'blue'}
|
||||||
|
this.form = {colorScheme, enableGreyFilter}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
cancel() {
|
||||||
|
this.$router.push({})
|
||||||
|
},
|
||||||
|
submit() {
|
||||||
|
this.$refs.ThemeForm.validate(v => {
|
||||||
|
if (v) {
|
||||||
|
let {colorScheme} = this.form
|
||||||
|
colorScheme = JSON.stringify(colorScheme)
|
||||||
|
this.instance.post("/app/appdvcpconfig/updateSysColorScheme", {...this.form, colorScheme}).then(res => {
|
||||||
|
if (res?.code == 0) {
|
||||||
|
this.$message.success("保存成功!")
|
||||||
|
this.cancel()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
},
|
||||||
|
created() {
|
||||||
|
this.getDetail()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.themeSetting {
|
||||||
|
height: 100%;
|
||||||
|
|
||||||
|
.mar-r8 {
|
||||||
|
margin-right: 8px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@@ -45,8 +45,7 @@
|
|||||||
<span>{{ groupLen }}</span>
|
<span>{{ groupLen }}</span>
|
||||||
<el-tooltip
|
<el-tooltip
|
||||||
placement="top"
|
placement="top"
|
||||||
content="将由指定群主发送给TA作为群主的所有的群,由于企业微
|
content="将由指定群主发送给TA作为群主的所有的群,由于企业微信限制,当超过1000个时将只发送到最近活跃的1000个群">
|
||||||
信限制,当超过1000个时将只发送到最近活跃的1000个群">
|
|
||||||
<i class="iconfont iconModal_Warning"></i>
|
<i class="iconfont iconModal_Warning"></i>
|
||||||
</el-tooltip>
|
</el-tooltip>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
<div class="right-tips" v-if="info.status === '4'">
|
<div class="right-tips" v-if="info.status === '4'">
|
||||||
<el-tooltip
|
<el-tooltip
|
||||||
placement="top"
|
placement="top"
|
||||||
content="任务开始后,3天内15分钟更新1次,3天后访问页面时触发更新,1时间最多刷新1次">
|
content="任务开始后,3天内15分钟更新1次,3天后访问页面时触发更新,1小时最多刷新1次">
|
||||||
<i class="iconfont iconDetails"></i>
|
<i class="iconfont iconDetails"></i>
|
||||||
</el-tooltip>
|
</el-tooltip>
|
||||||
<span>数据更新于{{ info.dataUpdateTime }}</span>
|
<span>数据更新于{{ info.dataUpdateTime }}</span>
|
||||||
@@ -26,7 +26,7 @@
|
|||||||
<div class="user">
|
<div class="user">
|
||||||
<img src="https://cdn.cunwuyun.cn/dvcp/announce/user.png" />
|
<img src="https://cdn.cunwuyun.cn/dvcp/announce/user.png" />
|
||||||
<span><ai-open-data type="userName" :openid="info.createUserId"></ai-open-data></span>
|
<span><ai-open-data type="userName" :openid="info.createUserId"></ai-open-data></span>
|
||||||
(<span v-if="info.createUserSecondDept"><ai-open-data type="departmentName" :openid="info.createUserSecondDept"></ai-open-data>,</span>
|
(<span v-if="info.createUserSecondDept"><ai-open-data type="departmentName" :openid="info.createUserSecondDept"></ai-open-data>/</span>
|
||||||
<span><ai-open-data type="departmentName" :openid="info.createUserDept"></ai-open-data></span>)
|
<span><ai-open-data type="departmentName" :openid="info.createUserDept"></ai-open-data></span>)
|
||||||
</div>
|
</div>
|
||||||
</ai-info-item>
|
</ai-info-item>
|
||||||
|
|||||||
Reference in New Issue
Block a user