<!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>