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