RBAC-web-admin/index.html
2023-09-02 21:17:17 +08:00

448 lines
20 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<!-- import CSS -->
<link rel="stylesheet" href="import/element-ui@2.15.14_lib_theme-chalk_index.css">
<script src="import/axios.min.js"></script>
<script src="import/jsencrypt.min.js"></script>
<style>
</style>
</head>
<body>
<div id="app">
<el-container>
<el-header></el-header>
<el-container>
<el-aside width="400px">
<div>
<el-button type="primary" plain @click="dialogFormVisible1 = true">添加接口</el-button>
</div>
<div style="margin-top: 10px;">
<span>roleId:</span>
<el-select v-model="roleId" placeholder="请选择" @change="roleChange">
<el-option v-for="item in roleIdOptions" :key="item.value" :label="item.label"
:value="item.value">
</el-option>
</el-select>
</div>
<div style="margin-top: 10px;">
<span>baseUrl:</span>
<el-select v-model="baseUrlValue" placeholder="请选择" @change="baseUrlChange">
<el-option v-for="item in baseUrlOptions" :key="item.value" :label="item.label"
:value="item.value">
</el-option>
</el-select>
</div>
<div style="margin-top: 10px;">
<el-form ref="form" :model="form" label-width="80px">
<el-form-item label="账号">
<el-input v-model="loginForm.userName" style="width: 200px;"></el-input>
</el-form-item>
<el-form-item label="密码">
<el-input v-model="loginForm.passWord" style="width: 200px;"></el-input>
</el-form-item>
<el-button type="primary" @click="login">登录</el-button>
</el-form>
</div>
</el-aside>
<el-main>
<el-autocomplete :fetch-suggestions="querySearch" placeholder="请输入内容" v-model="searchValue"
clearable class="input-with-select">
<el-button slot="append" icon="el-icon-search" @click="selectSearch"></el-button>
</el-autocomplete>
<template>
<el-table :data="tableData.slice((currentPage-1)*pageSize,currentPage*pageSize)"
style="width: 100%">
<el-table-column label="url" width="180">
<template slot-scope="scope">
<span style="margin-left: 10px">{{ scope.row.url }}</span>
</template>
</el-table-column>
<el-table-column label="描述" width="180">
<template slot-scope="scope">
<span style="margin-left: 10px">
{{ scope.row.description }}
</span>
</template>
</el-table-column>
<el-table-column label="权限信息" align="center">
<template slot-scope="scope">
<span style="margin-left: 10px" v-for='role in scope.row.roleIds'>
<el-tag v-if="role === -1">超级管理员</el-tag>
<el-tag v-else-if="role === 0">校级管理员</el-tag>
<el-tag v-else-if="role === 1">教师</el-tag>
<el-tag v-else-if="role === 3">学生</el-tag>
<el-tag v-else>暂未设置</el-tag>
</span>
</template>
</el-table-column>
<el-table-column label="操作">
<template slot-scope="scope">
<el-button size="mini" @click="handleEdit(scope.$index, scope.row)">编辑</el-button>
<el-button size="mini" type="danger"
@click="handleDelete(scope.$index, scope.row)">删除</el-button>
</template>
</el-table-column>
</el-table>
<div class="block">
<el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange"
:current-page.sync="currentPage" :page-size="pageSize" layout="total, prev, pager, next"
:total="totalSize">
</el-pagination>
</div>
</template>
</el-main>
</el-container>
</el-container>
<el-dialog title="编辑接口权限" :visible.sync="dialogFormVisible2" :before-close="cancel">
<el-form ref="form" :model="form" label-width="80px">
<el-form ref="form" :model="form" label-width="80px">
<el-form-item label="url">
<el-input v-model="form.url"></el-input>
</el-form-item>
<el-form-item label="描述">
<el-input v-model="form.description"></el-input>
</el-form-item>
<el-form-item label="可访问角色">
<el-checkbox-group v-model="form.roleIds">
<el-checkbox :label="-1" name="type">超级管理员</el-checkbox>
<el-checkbox :label="0" name="type">校级管理员</el-checkbox>
<el-checkbox :label="1" name="type">教师</el-checkbox>
<el-checkbox :label="3" name="type">学生</el-checkbox>
</el-checkbox-group>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="submitEdit">保存</el-button>
<el-button @click="cancel">取消</el-button>
</el-form-item>
</el-form>
</el-dialog>
<el-dialog title="添加接口权限" :visible.sync="dialogFormVisible1" :before-close="cancel">
<el-form ref="form" :model="form" label-width="80px">
<el-form ref="form" :model="form" label-width="80px">
<el-form-item label="url">
<el-input v-model="form.url"></el-input>
</el-form-item>
<el-form-item label="描述">
<el-input v-model="form.description"></el-input>
</el-form-item>
<el-form-item label="可访问角色">
<el-checkbox-group v-model="form.roleIds">
<el-checkbox :label="-1" name="type">超级管理员</el-checkbox>
<el-checkbox :label="0" name="type">校级管理员</el-checkbox>
<el-checkbox :label="1" name="type">教师</el-checkbox>
<el-checkbox :label="3" name="type">学生</el-checkbox>
</el-checkbox-group>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="submitInsert">添加</el-button>
<el-button @click="cancel">取消</el-button>
</el-form-item>
</el-form>
</el-dialog>
</div>
</body>
<!-- import Vue before Element -->
<script src="import/vue@2.7.14_dist_vue.js"></script>
<!-- import JavaScript -->
<script src="import/element-ui@2.15.14_lib_index.js"></script>
<script>
let _this = null;
new Vue({
el: "#app",
data() {
return {
currentPage: 1, // 当前页码
totalSize: 20, // 总条数
pageSize: 10, // 每页的数据条数
loginForm: {
userName: '',
passWord: ''
},
form: {
url: '',
description: '',
roleIds: [],
},
tableData: [],
roleIdOptions: [{
value: null,
label: 'ALL'
}, {
value: '-1',
label: '超级管理员'
}, {
value: '0',
label: '校级管理员'
}, {
value: '1',
label: '教师'
}, {
value: '3',
label: '学生'
}],
baseUrlOptions: [{
value: 0,
baseUrl: 'https://anyview.gdut.edu.cn/api/user-service',
label: 'anyview.gdut.edu.cn'
}, {
value: 1,
baseUrl: 'https://dsvision.net/api/user-service',
label: 'dsvision.net'
}, {
value: 2,
baseUrl: 'https://res.dsvision.net/api/user-service',
label: 'res.dsvision.net'
}, {
value: 3,
baseUrl: 'http://localhost:9001/',
label: 'localhost'
}],
roleId: null,
baseUrlValue: 2,
dialogFormVisible2: false,
dialogFormVisible1: false,
searchValue: '',
allToken: [null, null, null, null],
token: null
}
},
created() {
_this = this
},
mounted() {
_this.baseUrlChange(3)
},
methods: {
roleChange: function (val) {
_this.selectSearch()
console.log(val)
},
baseUrlChange: function (val) {
delete axios.defaults.headers.common['token']
_this.baseUrlValue = val
axios.defaults.baseURL = _this.baseUrlOptions[val].baseUrl
if (_this.allToken[val] != null) {
axios.defaults.headers.common['token'] = _this.allToken[val]
}
_this.selectSearch()
console.log(val)
},
handleEdit(index, row) {
console.log(_this.form);
_this.dialogFormVisible2 = true
_this.form['accessId'] = row.accessId
_this.form.url = row.url
_this.form.description = row.description
_this.form.roleIds = [...row.roleIds]
//强制更新数组-视图
_this.form.roleIds.splice()
},
submitEdit() {
axios.post('/access/update', _this.form)
.then(function (response) {
_this.$notify({
title: '成功',
message: '编辑成功',
type: 'success'
});
_this.selectSearch()
}).catch(error => {
_this.$notify.error({
title: '错误',
message: '编辑失败'
});
console.log(error);
})
_this.cancel()
console.log(_this.form);
},
handleDelete(index, row) {
_this.$confirm('此操作将删除该url以及角色权限, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
console.log(row.accessId)
axios.get('/access/deleteAccess', { params: { accessId: row.accessId } })
.then(function (response) {
_this.$notify({
title: '成功',
message: '删除成功',
type: 'success'
});
_this.selectSearch()
}).catch(error => {
_this.$notify.error({
title: '错误',
message: '删除失败'
});
console.log(error);
})
}).catch(() => {
_this.$message({
type: 'info',
message: '已取消删除'
});
});
console.log(index, row);
},
submitInsert() {
console.log(_this.form);
axios.post('/access/addAccessToRoles', _this.form)
.then(function (response) {
_this.$notify({
title: '成功',
message: '添加成功',
type: 'success'
});
_this.selectSearch()
}).catch(error => {
_this.$notify.error({
title: '错误',
message: '添加失败'
});
console.log(error);
})
_this.cancel()
},
cancel() {
_this.dialogFormVisible1 = false
_this.dialogFormVisible2 = false
_this.form = _this.$options.data().form
},
handleSizeChange(val) {
_this.currentPage = 1;
_this.pageSize = val;
console.log(`每页 ${val}`);
},
handleCurrentChange(val) {
console.log(`当前页: ${val}`);
_this.currentPage = val;
},
//搜索
selectSearch() {
if (typeof axios.defaults.headers.common['token'] == "undefined") {
_this.tableData = []
return
}
const params = new URLSearchParams
if (_this.searchValue != null && _this.searchValue != '') params.append("url", _this.searchValue)
if (_this.roleId != null) params.append("roleId", _this.roleId)
axios.get('/access/list', {
params: params
}).then(function (response) {
_this.tableData = response.data.data
_this.totalSize = response.data.data.length
//强制更新数组-视图
_this.tableData.splice()
})
},
//搜索联想
querySearch(queryString, cb) {
let programs = _this.tableData;
let programList = [];
//从数据中拿出要联想的字段,并给它的名改成指定的{value值}的格式才能正常显示
for (let i = 0; i < _this.tableData.length; i++) {
programList.push({ 'value': programs[i].url })
}
let results = queryString ? programList.filter(_this.createStateFilter(queryString)) : programList;
cb(results);//最后给到显示
},
//联想内容根据输入的搜索内容过滤
createStateFilter(queryString) {
return (program) => {
return (program.value.toLowerCase().indexOf(queryString.toLowerCase()) !== -1);
};
},
passwordEncryption(userPassword) {
// RSA加密
const publicKey = 'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCjmeQkUc/sljVd1ea2Z+PiFqab5zclbXWlE3ytvYx5ULPkeeMTmD0MiUZoU1MmulGoI0c8ogoSVV17qjbH8OFk8wr+BMhPa0XYrNKObqvxR1PtzabbVxBFp7Q8lULp14MeSOSFifdrj+zmiATHKBw2E1g3uDvZE9NzSOa9iFEv1QIDAQAB'; // 从后台获取公钥
const encryptor = new JSEncrypt(); // 新建JSEncrypt对象
encryptor.setPublicKey(publicKey); // 设置公钥
const passwordEncryp = encryptor.encrypt(userPassword); // 对密码进行加密
return passwordEncryp;
},
login() {
axios({
method: 'post',
url: '/login',
data: {
roleId: -1,
username: _this.loginForm.userName,
password: _this.loginForm.passWord,
debug: 1
},
transformRequest: [
function (data) {
// 将请求数据转换成功 formdata 接收格式
return _this.stringify(data)
}
],
headers: {
'Content-Type': 'multipart/form-data'
}
}).then(function (response) {
console.log(response);
_this.allToken[_this.baseUrlValue] = response.data.data.token
axios.defaults.headers.common['token'] = _this.allToken[_this.baseUrlValue]
_this.selectSearch()
}).catch(error => {
_this.$notify.error({
title: '错误',
message: '登录失败'
});
console.log(error);
})
},
stringify(data) {
const formData = new FormData()
for (const key in data) {
// eslint-disable-next-line no-prototype-builtins
if (data.hasOwnProperty(key)) {
if (data[key]) {
if (data[key].constructor === Array) {
if (data[key][0]) {
if (data[key][0].constructor === Object) {
formData.append(key, JSON.stringify(data[key]))
} else {
data[key].forEach((item, index) => {
formData.append(key + `[${index}]`, item)
})
}
} else {
formData.append(key + '[]', '')
}
} else if (data[key].constructor === Object) {
formData.append(key, JSON.stringify(data[key]))
} else {
formData.append(key, data[key])
}
} else {
if (data[key] === 0) {
formData.append(key, 0)
} else {
formData.append(key, '')
}
}
}
}
return formData
},
log() {
console.log(this.tableData)
}
},
});
</script>
</html>