Authored by 王涛

Merge branch 'master-500-dev-xwx' into 'master-500-dev'

第三方授权



See merge request !960
<title>第三方授权</title>
<iframe class="layadmin-iframe" src="/vue3/index.html#/vue3/thirdSet" style="height: 99.5%!important;"/>
... ...
... ... @@ -40,8 +40,8 @@
width: 93px;
}
.upload-demo-systemConf {
width: 280px;
.upload-systemConf {
width: 360px;
}
.logo-img {
... ...
... ... @@ -172,7 +172,12 @@ const routes = [{
path: '/vue3/license',
name: 'license',
component: () => myImport('views/license/index')
}
},
{
path: '/vue3/thirdSet',
name: 'thirdSet',
component: () => myImport('views/thirdSet/index')
},
];
// hash模式: createWebHashHistory
... ...
... ... @@ -23,11 +23,11 @@
<el-descriptions-item label="授权状态" label-align="right" align="center">
{{tableData.authorizeStats}}
</el-descriptions-item>
<el-descriptions-item label="授权时间" label-align="right" align="center">
<el-descriptions-item label="导入时间" label-align="right" align="center">
{{tableData.authorizeTime}}
</el-descriptions-item>
<el-descriptions-item label="剩余" label-align="right" align="center">
<el-tag size="small">{{tableData.timeLeft}}天</el-tag>
<el-tag size="small" v-if="tableData.timeLeft">{{tableData.timeLeft}}天</el-tag>
</el-descriptions-item>
</el-descriptions>
</el-col>
... ...
... ... @@ -30,7 +30,7 @@
</div>
<div v-if="prop == 'img'">
<div v-if="row.type == 'img'">
<el-image style="width: 100px; height: 100px" :src="domainName+row.code" />
<el-image style="width: 60px; height: 60px;border-radius: 10px;" :src="domainName+row.code" />
</div>
</div>
</template>
... ... @@ -54,37 +54,42 @@
<!--新增编辑弹框-->
<cm-dialog :showDialogVisible="cacheVisible" :showFooter="false" :title="titleName" @hidedialog="cancelBtn"
width="400px">
width="500px">
<template v-slot>
<el-form
:model="fileFrom"
:rules="docRulesForm"
label-position="right"
label-width="100px"
label-width="120px"
ref="ruleForm">
<el-form-item label="名称" prop="name">
<el-input :size="$global.elementConfig.size.input" clearable v-model="fileFrom.name"></el-input>
</el-form-item>
<el-form-item label="编码" prop="code">
<el-input :size="$global.elementConfig.size.input" clearable v-model="fileFrom.code"></el-input>
</el-form-item>
<el-form-item label="文件" prop="img">
<el-upload
:auto-upload="true"
:before-upload="beforeAvatarUpload"
:http-request="getFile"
:multiple="false"
:show-file-list="false">
<el-input :size="$global.elementConfig.size.input" placeholder="请上传文件" v-model="fileFrom.fileName" class="upload-demo-systemConf"></el-input>
</el-upload>
</el-form-item>
<el-form-item>
<el-button :size="$global.elementConfig.size.button" @click="addFrom()" type="primary">保存
</el-button>
<el-button :size="$global.elementConfig.size.button" @click="cancelBtn">取消</el-button>
</el-form-item>
</el-form>
<div style="padding-right: 20px">
<el-form
:model="fileFrom"
:rules="docRulesForm"
label-position="right"
label-width="100px"
label-width="120px"
ref="ruleForm">
<el-form-item label="名称" prop="name">
<el-input :size="$global.elementConfig.size.input" placeholder="请输入名称" clearable v-model="fileFrom.name"></el-input>
</el-form-item>
<el-form-item label="编码" prop="code">
<el-input :size="$global.elementConfig.size.input" placeholder="请输入编码" clearable v-model="fileFrom.code"></el-input>
</el-form-item>
<el-form-item label="分组" prop="group">
<el-input :size="$global.elementConfig.size.input" placeholder="请输入组Id" clearable v-model="fileFrom.groupId"></el-input>
</el-form-item>
<el-form-item label="文件" prop="file" >
<el-upload
:auto-upload="true"
:before-upload="beforeAvatarUpload"
:http-request="getFile"
:multiple="false"
:show-file-list="false">
<el-input :size="$global.elementConfig.size.input" placeholder="请上传文件" v-model="fileFrom.fileName" class="upload-systemConf"></el-input>
</el-upload>
</el-form-item>
<el-form-item>
<el-button :size="$global.elementConfig.size.button" @click="addFrom()" type="primary">保存
</el-button>
<el-button :size="$global.elementConfig.size.button" @click="cancelBtn">取消</el-button>
</el-form-item>
</el-form>
</div>
</template>
</cm-dialog>
... ...
... ... @@ -7,15 +7,20 @@ export default {
radio: '0',
docRulesForm: {
name: [{
required: true,
message: '请填写名称!',
trigger: 'blur',
required: true,
message: '请填写名称!',
trigger: 'blur'
}],
code: [{
required: true,
message: '请填写编码!',
trigger: 'blur',
trigger: 'blur'
}],
group: [{
required: true,
message: '请填写组Id!',
trigger: 'blur'
}]
}
}
},
... ... @@ -39,20 +44,27 @@ export default {
align: 'center'
},
{
prop: 'img',
label: '图片',
prop: 'type',
label: '类型',
sortable: true,
align: 'center',
width: '300'
width: '200'
},
{
prop: 'type',
label: '类型',
prop: 'groupId',
label: '分组',
sortable: true,
align: 'center',
width: '200'
},
{
prop: 'img',
label: '图片',
sortable: true,
align: 'center',
width: '300'
},
{
prop: 'createTime',
label: '创建时间',
sortable: true,
... ... @@ -79,6 +91,7 @@ export default {
});
//上传完后的图片预览
let imageUrl = Vue.ref('');
let titleName = Vue.ref('新增');
let tableDataList = Vue.ref([]);
let isAdd = Vue.ref(true);
let beforeAvatarUpload = (file) => {
... ... @@ -137,25 +150,34 @@ export default {
let cacheVisible = Vue.ref(false);
let openAddFile = () => {
titleName.value = '新增';
fileFrom.value = {
id: '',
pid: '',
name: '',
fileName: '',
code: '',
groupId: '',
type: '',
file: '',
createTime: '',
uploadFile:''
};
cacheVisible.value = true;
}
//保存
let addFile = () => {
}
//关闭弹框
let cancelBtn = () => {
cacheVisible.value = false;
}
//修改
let handleUpdate = (row) => {
titleName.value = '修改';
cacheVisible.value = true;
fileFrom.value = row;
isAdd.value = false;
}
let addFrom = () => {
let params = fileFrom.value;
debugger
if (isAdd.value){
proxy.$http.uploadFile("/api-web/file/add", params, function (res) {
hasRefresh.value = false;
... ... @@ -164,7 +186,6 @@ export default {
cacheVisible.value = false;
getDataList();
}
})
}else {
proxy.$http.uploadFile("/api-web/file/update", params, function (res) {
... ... @@ -173,11 +194,12 @@ export default {
proxy.$global.showMsg("修改成功!");
cacheVisible.value = false;
getDataList();
}else {
proxy.$global.showMsg(res.msg,'warning');
}
})
}
}
// 挂载完
Vue.onMounted(() => {
... ... @@ -201,11 +223,11 @@ export default {
fileFrom,
cacheVisible,
openAddFile,
addFile,
cancelBtn,
addFrom,
handleUpdate,
isAdd
isAdd,
titleName
}
}
}
... ...
<div class="container" :style="{'height':height+'px','max-height':height+'px','padding':'10px 0 10px 10px','background':'#fff','box-sizing':'border-box'}">
<div class="cm-card" :style="{'min-height':height+'px','max-height':height+'px','height':'100%','padding-top':'3px'}">
<div class="search">
<div class="search-input flex-div-start">
<el-tooltip placement="bottom-start">
<template #content>第三方系统<br/>请求地址</template>
<el-input :size="$global.elementConfig.size.input" v-model="keyword" placeholder="请输入关键字(回车搜索)" class="fault-book-input-text" />
</el-tooltip>
<el-button :size="$global.elementConfig.size.button" type="primary" @click="getDetailList()">查询</el-button>
</div>
<el-button :size="$global.elementConfig.size.button" @click="handleAdd()">新增</el-button>
</div>
<div class="search-table">
<el-table
:data="tableData"
style="width: 100%;margin: 0px 0px; font-size:13.5px;"
row-key="id"
border
:tree-props="{ children: 'authorizeList'}"
header-row-class-name="tbl-header-class"
>
<el-table-column type="index" label="序号" align="center" width="80"/>
<el-table-column prop="name" label="第三方系统" sortable=true align="center" width="350" />
<el-table-column prop="detail" label="系统请求地址" sortable=true align="center" width="470" />
<el-table-column prop="nickName" label="授权用户" sortable=true align="center" width="250" />
<el-table-column prop="sort" label="排序" sortable=true align="center" width="100" />
<el-table-column prop="createTime" label="创建时间" sortable=true align="center"width="300" />
<el-table-column fixed="right" label="操作" width="150" align="center">
<template #default="scope">
<div class="list-handle">
<span class="icon-bg" v-if="scope.row.type == '0'">
<i @click="handleAuth(scope.row)" class="iconfont icon-icon--quanxian" title="授权"></i>
</span>
<span class="icon-bg" v-if="scope.row.type == '0'">
<i @click="handleUpdate(scope.row)" class="el-icon-edit-outline" title="修改"></i>
</span>
<span class="icon-bg">
<i @click="handleDelete(scope.row)" class="el-icon-delete" title="删除"></i>
</span>
</div>
</template>
</el-table-column>
</el-table>
</div>
<cm-userright :isUser="false" :buttonTexts="['删除', '添加']" :showDialogVisible="showUserDialogVisible" :titles="['所有用户', '已添加用户']"
:userArr="userList" :selectedArr="userFileRight" @callback="selectUser" @hideDialog="showUserDialog" :showOrg="false" :showGroup="false"
title="选择用户"></cm-userright>
</div>
</div>
<!--新增编辑弹框-->
<cm-dialog :showDialogVisible="cacheVisible" :showFooter="false" :title="titleName" @hidedialog="cancelBtn"
width="500px">
<template v-slot>
<div style="padding-right: 20px">
<el-form
:model="confAdd"
:rules="docRulesForm"
label-position="right"
label-width="100px"
label-width="120px"
ref="ruleForm">
<el-form-item label="系统名称" prop="name">
<el-input :size="$global.elementConfig.size.input" placeholder="请输入系统名称" clearable v-model="confAdd.name"></el-input>
</el-form-item>
<el-form-item label="请求地址" prop="detail">
<el-input :size="$global.elementConfig.size.input" placeholder="请输入请求地址或事件" clearable v-model="confAdd.detail"></el-input>
</el-form-item>
<el-form-item label="排序" prop="detail">
<el-input :size="$global.elementConfig.size.input" placeholder="请输入排序" clearable v-model="confAdd.sort"></el-input>
</el-form-item>
<el-form-item>
<el-button :size="$global.elementConfig.size.button" @click="handleConfAdd" type="primary">保存</el-button>
<el-button :size="$global.elementConfig.size.button" @click="cancelBtn">取消</el-button>
</el-form-item>
</el-form>
</div>
</template>
</cm-dialog>
... ...
export default {
name:"thirdSet",
template:"",
data() {
return {
docRulesForm: {
name: [{
required: true,
message: '请填写系统名称!',
trigger: 'blur'
}],
detail: [{
required: true,
message: '请填写请求地址或事件!',
trigger: 'blur'
}],
sort: [{
required: true,
message: '请填写排序!',
trigger: 'blur'
}]
}
}
},
setup(props,{attrs,slots,emit}){
const {proxy} = Vue.getCurrentInstance();
let height = Vue.ref(window.innerHeight);
//下拉框
let options = Vue.ref([]);
let authAdd = Vue.ref({
tpsId:'',
userName:'',
roleId:''
})
let confAdd = Vue.ref({
name: '',
detail: '',
sort:''
})
let tableData = Vue.ref([]);
let cacheVisible = Vue.ref(false);
let titleName = Vue.ref('新增');
let keyword = Vue.ref('');
let isAdd = Vue.ref(true);
let showUserDialogVisible = Vue.ref(false);
let userFileRight = Vue.ref([]);
//获取用户
let userList = Vue.ref([]);
// 获取系统
let getDetailList = () => {
proxy.$http.get(`/api-web/thirdParty/conf/list`, {keywords:keyword.value}, function (res) {
if (res && res.success == true) {
tableData.value = res.data;
tableData.value.forEach(function (e) {
let report = {}
report.label = e.name;
report.value = e.id;
options.value.push(report)
});
}
})
};
let getUser = (arr) => {
let types = arr.map(function (v) {
return v.username;
});
authAdd.value.userName = types.join(',');
}
//获取授权
let handleAuth = (row) =>{
showUserDialog(true)
let tpsId = row.id;
authAdd.value.tpsId = tpsId;
let user=[];
let role=[];
proxy.$http.get(`/api-web/thirdParty/auth/list`, {tpsId:tpsId}, function (res) {
if (res && res.success) {
if (res.map.USER){
res.map.USER.map(item=>{
user.push(item.userName)
})
}
if (res.map.ROLE){
res.map.ROLE.map(item=>{
role.push(item.roleId);
})
}
let params={
USER:user,
ROLE:role
}
userFileRight.value = params;
}
})
}
// 获取用户选择的用户
let selectUser = (userObj) => {
let userArr = userObj.user;
let roleArr = userObj.role;
let names = [];
let rule = [];
userArr.map(function (v) {
names.push(v.username);
})
roleArr.map(function (v) {
rule.push(v.id);
})
authAdd.value.userName = names.join(',');
authAdd.value.roleId = rule.join(',');
proxy.$http.post(`/api-web/thirdParty/auth/add`, authAdd.value, function (res) {
if (res && res.success){
proxy.$global.showMsg('授权成功','success');
getDetailList();
}else {
proxy.$global.showMsg(res.msg,'warning');
}
})
}
//获取用户数据
let getUserList = () => {
proxy.userList = [];
// 查询信息中心的用户
proxy.$http.get("/api-user/org/getOrgUserList?orgCode=xxzx", {}, function (res) {
if (res && res.data) {
res.data.map(function (v) {
let desc = [];
let orgName = v.orgName;
let nickname = v.nickname;
if (orgName) {
desc.push(orgName);
}
if (nickname) {
desc.push(nickname);
}
proxy.userList.push({
value: v.username,
type: 'USER',
desc: v.nickname,
props: v
})
});
}
}, function () {
}, false)
}
/**
* 获取用户授权
*/
let showUserDialog = (flg) => {
showUserDialogVisible.value = flg;
}
let handleAdd = () =>{
cacheVisible.value = true;
titleName.value = '新增';
isAdd.value = true;
confAdd.value = {
name: '',
detail: ''
}
}
// 新增或修改配置
let handleConfAdd = () => {
let url = '';
let msg = '';
if (isAdd.value){
url='/api-web/thirdParty/conf/add';
msg='新增成功'
}else {
url='/api-web/thirdParty/conf/update';
msg='修改成功'
}
proxy.$http.post(url, confAdd.value, function (res) {
if (res && res.success){
proxy.$global.showMsg(msg,'success');
cacheVisible.value = false;
getDetailList();
}else {
proxy.$global.showMsg(res.msg,'warning');
}
})
}
// 删除
let handleDelete = (row) => {
let url = '';
let msg = '';
let params = {
idList:row.id
}
if (row.type == 0){
url='/api-web/thirdParty/conf/delete';
msg='您确实删除第三方系统吗?'
}else {
url='/api-web/thirdParty/auth/delete';
msg='您确实删除授权吗?'
}
proxy.$global.confirm(msg, function () {proxy.$http.get(url, params, function (res) {
if (res && res.success){
proxy.$global.showMsg('删除成功','success');
cacheVisible.value = false;
getDetailList();
}else {
proxy.$global.showMsg(res.msg,'warning');
}
})
})
}
let handleUpdate = (row) =>{
cacheVisible.value = true;
isAdd.value = false;
titleName.value = '修改';
confAdd.value.id = row.id;
confAdd.value.name = row.name;
confAdd.value.detail = row.detail;
}
//关闭弹框
let cancelBtn = () => {
cacheVisible.value = false;
}
Vue.onMounted(()=>{
getUserList();
getDetailList();
})
return {
height,
getUser,
options,
authAdd,
getDetailList,
tableData,
handleAdd,
confAdd,
cacheVisible,
handleConfAdd,
titleName,
cancelBtn,
keyword,
handleDelete,
handleUpdate,
isAdd,
handleAuth,
showUserDialog,
showUserDialogVisible,
selectUser,
userFileRight,
userList
}
}
}
... ...
... ... @@ -108,23 +108,22 @@
<!--//end lsq 2022-03-13-->
<li class="layui-nav-item" id="systems-select" lay-unselect>
<script lay-done="layui.element.render('nav', 'layadmin-systems');"
lay-url="{{sessionStorage.getItem('domainName')}}/api-web/manage/ddic/list?ddicCategory=systems"
lay-url="{{sessionStorage.getItem('domainName')}}/api-web/thirdParty/getList"
template
type="text/html">
<a href="javascript:;" title="第三方系统">
<span class="layui-icon layui-icon-slider"></span>
</a>
<dl class="layui-nav-child">
{{# d.data.sort(function (a, b) { return a.ddicSort > b.ddicSort ? 1 : -1; })}}
{{# if(d.data && d.data.length == 0){ }}
{{# var sysObj = document.querySelector('#systems-select'); }}
{{# sysObj != null ? sysObj.remove() :''; }}
{{# } }}
{{# layui.each(d.data, function(index, item){ }}
<dd style="text-align: left;" lay-filter="layadmin-systems">
<a href="javascript:;" layadmin-event="openOtherSystem" data-code="{{item.ddicCode}}"
title="{{item.ddicName}}">
<i class="iconfont icon-tree {{ item.ddicDesc }}"/>&nbsp;&nbsp;{{ item.ddicName }}
<a href="javascript:;" layadmin-event="openOtherSystem" data-code="{{item.detail}}"
title="{{item.name}}">
<i class="iconfont icon-tree {{ item.name }}"/>&nbsp;&nbsp;{{ item.name }}
</a>
</dd>
{{# }); }}
... ...
... ... @@ -273,7 +273,12 @@ const routes = [{
path: '/vue3/license',
name: 'license',
component: () => myImport('views/license/index')
}
},
{
path: '/vue3/thirdSet',
name: 'thirdSet',
component: () => myImport('views/thirdSet/index')
},
];
// hash模式: createWebHashHistory
... ...