diff options
Diffstat (limited to 'UI source code/dns_mapping_ui-master/src/views/mnt')
8 files changed, 1134 insertions, 0 deletions
diff --git a/UI source code/dns_mapping_ui-master/src/views/mnt/app/index.vue b/UI source code/dns_mapping_ui-master/src/views/mnt/app/index.vue new file mode 100644 index 0000000..ddb8fb8 --- /dev/null +++ b/UI source code/dns_mapping_ui-master/src/views/mnt/app/index.vue @@ -0,0 +1,144 @@ +<template> + <div class="app-container"> + <!--工具栏--> + <div class="head-container"> + <div v-if="crud.props.searchToggle"> + <!-- 搜索 --> + <el-input v-model="query.name" clearable placeholder="输入名称搜索" style="width: 200px" class="filter-item" @keyup.enter.native="crud.toQuery" /> + <date-range-picker v-model="query.createTime" class="date-item" /> + <rrOperation /> + </div> + <crudOperation :permission="permission"> + <el-button + slot="left" + v-permission="['admin','app:add']" + :disabled="!currentRow" + class="filter-item" + size="mini" + type="primary" + icon="el-icon-plus" + @click="copy" + >复制</el-button> + </crudOperation> + </div> + <!--表单组件--> + <el-dialog append-to-body :close-on-click-modal="false" :before-close="crud.cancelCU" :visible.sync="crud.status.cu > 0" :title="crud.status.title" width="800px"> + <el-form ref="form" :model="form" :rules="rules" size="small" label-width="100px"> + <el-form-item label="应用名称" prop="name"> + <el-input v-model="form.name" style="width: 670px" placeholder="部署后的文件或者目录名称,用于备份" /> + </el-form-item> + <el-form-item label="应用端口" prop="port"> + <el-input-number v-model.number="form.port" placeholder="例如:8080" /> + </el-form-item> + <el-form-item label="上传目录" prop="uploadPath"> + <el-input v-model="form.uploadPath" style="width: 670px" placeholder="例如: /opt/upload" /> + </el-form-item> + <el-form-item label="部署目录" prop="deployPath"> + <el-input v-model="form.deployPath" style="width: 670px" placeholder="例如: /opt/app" /> + </el-form-item> + <el-form-item label="备份目录" prop="backupPath"> + <el-input v-model="form.backupPath" style="width: 670px" placeholder="例如: /opt/backup" /> + </el-form-item> + <el-form-item label="部署脚本" prop="deployScript"> + <el-input v-model="form.deployScript" :rows="3" type="textarea" autosize style="width: 670px" placeholder="" /> + </el-form-item> + <el-form-item label="启动脚本" prop="startScript"> + <el-input v-model="form.startScript" :rows="3" type="textarea" autosize style="width: 670px" placeholder="" /> + </el-form-item> + </el-form> + <div slot="footer" class="dialog-footer"> + <el-button type="text" @click="crud.cancelCU">取消</el-button> + <el-button :loading="crud.status.cu === 2" type="primary" @click="crud.submitCU">确认</el-button> + </div> + </el-dialog> + <!--表格渲染--> + <el-table ref="table" v-loading="crud.loading" :data="crud.data" highlight-current-row style="width: 100%" @selection-change="crud.selectionChangeHandler" @current-change="handleCurrentChange"> + <el-table-column type="selection" width="55" /> + <el-table-column prop="name" label="应用名称" /> + <el-table-column prop="port" label="端口号" /> + <el-table-column prop="uploadPath" label="上传目录" /> + <el-table-column prop="deployPath" label="部署目录" /> + <el-table-column prop="backupPath" label="备份目录" /> + <el-table-column prop="createTime" label="创建日期" /> + <el-table-column v-if="checkPer(['admin','app:edit','app:del'])" label="操作" width="150px" align="center"> + <template slot-scope="scope"> + <udOperation + :data="scope.row" + :permission="permission" + /> + </template> + </el-table-column> + </el-table> + <!--分页组件--> + <pagination /> + </div> +</template> + +<script> +import crudApp from '@/api/mnt/app' +import CRUD, { presenter, header, form, crud } from '@crud/crud' +import rrOperation from '@crud/RR.operation' +import crudOperation from '@crud/CRUD.operation' +import udOperation from '@crud/UD.operation' +import pagination from '@crud/Pagination' +import DateRangePicker from '@/components/DateRangePicker' + +const defaultForm = { id: null, name: null, port: 8080, uploadPath: '/opt/upload', deployPath: '/opt/app', backupPath: '/opt/backup', startScript: null, deployScript: null } +export default { + name: 'App', + components: { pagination, crudOperation, rrOperation, udOperation, DateRangePicker }, + cruds() { + return CRUD({ title: '应用', url: 'api/app', crudMethod: { ...crudApp }}) + }, + mixins: [presenter(), header(), form(defaultForm), crud()], + data() { + return { + currentRow: null, + permission: { + add: ['admin', 'app:add'], + edit: ['admin', 'app:edit'], + del: ['admin', 'app:del'] + }, + rules: { + name: [ + { required: true, message: '请输入应用名称', trigger: 'blur' } + ], + port: [ + { required: true, message: '请输入应用端口', trigger: 'blur', type: 'number' } + ], + uploadPath: [ + { required: true, message: '请输入上传目录', trigger: 'blur' } + ], + deployPath: [ + { required: true, message: '请输入部署目录', trigger: 'blur' } + ], + backupPath: [ + { required: true, message: '请输入备份目录', trigger: 'blur' } + ], + startScript: [ + { required: true, message: '请输入启动脚本', trigger: 'blur' } + ], + deployScript: [ + { required: true, message: '请输入部署脚本', trigger: 'blur' } + ] + } + } + }, + methods: { + copy() { + for (const key in this.currentRow) { + this.form[key] = this.currentRow[key] + } + this.form.id = null + this.form.createTime = null + this.crud.toAdd() + }, + handleCurrentChange(row) { + this.currentRow = JSON.parse(JSON.stringify(row)) + } + } +} +</script> + +<style scoped> +</style> diff --git a/UI source code/dns_mapping_ui-master/src/views/mnt/database/execute.vue b/UI source code/dns_mapping_ui-master/src/views/mnt/database/execute.vue new file mode 100644 index 0000000..94622fc --- /dev/null +++ b/UI source code/dns_mapping_ui-master/src/views/mnt/database/execute.vue @@ -0,0 +1,86 @@ +<template> + <el-dialog append-to-body :close-on-click-modal="false" :visible.sync="dialog" title="执行脚本" width="400px"> + <el-form ref="form" :rules="rules" size="small"> + <el-upload + :action="databaseUploadApi" + :data="databaseInfo" + :headers="headers" + :on-success="handleSuccess" + :on-error="handleError" + class="upload-demo" + drag + > + <i class="el-icon-upload" /> + <div class="el-upload__text"> + 将文件拖到此处,或 + <em>点击上传</em> + </div> + <div slot="tip" class="el-upload__tip">上传后,系统会自动执行SQL脚本</div> + </el-upload> + </el-form> + <div slot="footer" class="dialog-footer"> + <el-button type="primary" @click="cancel">关闭</el-button> + </div> + </el-dialog> +</template> + +<script> +import { mapGetters } from 'vuex' +import { getToken } from '@/utils/auth' +export default { + props: { + databaseInfo: { + type: Object, + default() { + return {} + } + } + }, + data() { + return { + loading: false, + dialog: false, + headers: { + Authorization: getToken() + }, + rules: {} + } + }, + computed: { + ...mapGetters(['databaseUploadApi']) + }, + mounted() { + }, + methods: { + cancel() { + this.dialog = false + }, + handleSuccess(response, file, fileList) { + if (response === 'success') { + this.$notify({ + title: '执行成功', + type: 'success', + duration: 2500 + }) + } else { + this.$notify({ + title: response, + type: 'error', + duration: 0 + }) + } + }, + handleError(e, file, fileList) { + const msg = JSON.parse(e.message) + this.$notify({ + title: msg.message, + type: 'error', + duration: 0 + }) + } + } +} +</script> + +<style scoped> +</style> diff --git a/UI source code/dns_mapping_ui-master/src/views/mnt/database/index.vue b/UI source code/dns_mapping_ui-master/src/views/mnt/database/index.vue new file mode 100644 index 0000000..03d44a6 --- /dev/null +++ b/UI source code/dns_mapping_ui-master/src/views/mnt/database/index.vue @@ -0,0 +1,148 @@ +<template> + <div class="app-container"> + <!--工具栏--> + <div class="head-container"> + <div v-if="crud.props.searchToggle"> + <!-- 搜索 --> + <el-input v-model="query.blurry" clearable placeholder="模糊搜索" style="width: 200px" class="filter-item" @keyup.enter.native="crud.toQuery" /> + <date-range-picker v-model="query.createTime" class="date-item" /> + <rrOperation /> + </div> + <crudOperation :permission="permission"> + <el-button + slot="right" + v-permission="['admin','database:add']" + :disabled="!selectIndex" + class="filter-item" + size="mini" + type="warning" + icon="el-icon-upload" + @click="execute" + >执行脚本 + </el-button> + </crudOperation> + </div> + <!--表单组件--> + <eForm ref="execute" :database-info="currentRow" /> + <el-dialog append-to-body :close-on-click-modal="false" :before-close="crud.cancelCU" :visible.sync="crud.status.cu > 0" :title="crud.status.title" width="530px"> + <el-form ref="form" :model="form" :rules="rules" size="small" label-width="100px"> + <el-form-item label="连接名称" prop="name"> + <el-input v-model="form.name" style="width: 370px" /> + </el-form-item> + <el-form-item label="JDBC地址" prop="jdbcUrl"> + <el-input v-model="form.jdbcUrl" style="width: 300px" /> + <el-button :loading="loading" type="success" @click="testConnectDatabase">测试</el-button> + </el-form-item> + <el-form-item label="用户" prop="userName"> + <el-input v-model="form.userName" style="width: 370px" /> + </el-form-item> + <el-form-item label="密码" prop="pwd"> + <el-input v-model="form.pwd" type="password" style="width: 370px" /> + </el-form-item> + </el-form> + <div slot="footer" class="dialog-footer"> + <el-button type="text" @click="crud.cancelCU">取消</el-button> + <el-button :loading="crud.status.cu === 2" type="primary" @click="crud.submitCU">确认</el-button> + </div> + </el-dialog> + <!--表格渲染--> + <el-table ref="table" v-loading="crud.loading" :data="crud.data" highlight-current-row stripe style="width: 100%" @selection-change="handleCurrentChange"> + <el-table-column type="selection" width="55" /> + <el-table-column prop="name" width="130px" label="数据库名称" /> + <el-table-column prop="jdbcUrl" label="连接地址" /> + <el-table-column prop="userName" width="200px" label="用户名" /> + <el-table-column prop="createTime" width="200px" label="创建日期" /> + <el-table-column v-if="checkPer(['admin','database:edit','database:del'])" label="操作" width="150px" align="center"> + <template slot-scope="scope"> + <udOperation + :data="scope.row" + :permission="permission" + /> + </template> + </el-table-column> + </el-table> + <!--分页组件--> + <pagination /> + </div> +</template> + +<script> +import crudDatabase from '@/api/mnt/database' +import { testDbConnect } from '@/api/mnt/connect' +import eForm from './execute' +import CRUD, { presenter, header, form, crud } from '@crud/crud' +import rrOperation from '@crud/RR.operation' +import crudOperation from '@crud/CRUD.operation' +import udOperation from '@crud/UD.operation' +import pagination from '@crud/Pagination' +import DateRangePicker from '@/components/DateRangePicker' + +const defaultForm = { id: null, name: null, jdbcUrl: 'jdbc:mysql://', userName: null, pwd: null } +export default { + name: 'DataBase', + components: { eForm, pagination, crudOperation, rrOperation, udOperation, DateRangePicker }, + cruds() { + return CRUD({ title: '数据库', url: 'api/database', crudMethod: { ...crudDatabase }}) + }, + mixins: [presenter(), header(), form(defaultForm), crud()], + data() { + return { + currentRow: {}, + selectIndex: '', + databaseInfo: '', + loading: false, + permission: { + add: ['admin', 'database:add'], + edit: ['admin', 'database:edit'], + del: ['admin', 'database:del'] + }, + rules: { + name: [ + { required: true, message: '请输入数据库名称', trigger: 'blur' } + ], + jdbcUrl: [ + { required: true, message: '请输入数据库连接地址', trigger: 'blur' } + ], + userName: [ + { required: true, message: '请输入用户名', trigger: 'blur' } + ], + pwd: [ + { required: true, message: '请输入数据库密码', trigger: 'blur' } + ] + } + } + }, + methods: { + testConnectDatabase() { + this.$refs['form'].validate((valid) => { + if (valid) { + this.loading = true + testDbConnect(this.form).then((res) => { + this.loading = false + this.crud.notify(res ? '连接成功' : '连接失败', res ? 'success' : 'error') + }).catch(() => { + this.loading = false + }) + } + }) + }, + execute() { + this.$refs.execute.dialog = true + }, + handleCurrentChange(selection) { + this.crud.selections = selection + if (selection.length === 1) { + const row = selection[0] + this.selectIndex = row.id + this.currentRow = row + } else { + this.currentRow = {} + this.selectIndex = '' + } + } + } +} +</script> + +<style scoped> +</style> diff --git a/UI source code/dns_mapping_ui-master/src/views/mnt/deploy/deploy.vue b/UI source code/dns_mapping_ui-master/src/views/mnt/deploy/deploy.vue new file mode 100644 index 0000000..4a411b4 --- /dev/null +++ b/UI source code/dns_mapping_ui-master/src/views/mnt/deploy/deploy.vue @@ -0,0 +1,190 @@ +<template> + <el-dialog append-to-body :close-on-click-modal="false" :visible.sync="dialog" title="应用部署" width="400px"> + <el-form ref="form" :model="form" :rules="rules" size="small"> + <el-upload + :action="deployUploadApi" + :data="deployInfo" + :headers="headers" + :on-success="handleSuccess" + :on-error="handleError" + class="upload-demo" + drag + > + <i class="el-icon-upload" /> + <div class="el-upload__text"> + 将文件拖到此处,或 + <em>点击上传</em> + </div> + <div slot="tip" class="el-upload__tip">多个应用上传文件名称为all.zip,数据库更新脚本扩展名为.sql,上传成功后系统自动部署系统。</div> + </el-upload> + </el-form> + <div slot="footer" class="dialog-footer"> + <el-button type="primary" @click="cancel">关闭</el-button> + </div> + </el-dialog> +</template> + +<script> +import { add, edit, getApps, getServers } from '@/api/mnt/deploy' +import { mapGetters } from 'vuex' +import { getToken } from '@/utils/auth' + +export default { + props: {}, + data() { + return { + loading: false, + dialog: false, + apps: [], + servers: [], + headers: { + Authorization: getToken() + }, + deployInfo: {}, + form: { + id: '', + appId: '', + ip: '', + selectIp: [] + }, + rules: {} + } + }, + computed: { + ...mapGetters(['deployUploadApi']) + }, + created() { + this.initWebSocket() + }, + mounted() { + this.initSelect() + }, + methods: { + cancel() { + this.resetForm() + }, + doSubmit() { + this.loading = true + if (this.isAdd) { + this.doAdd() + } else { + this.doEdit() + } + }, + joinIp() { + this.form.ip = '' + this.form.selectIp.forEach(ip => { + if (this.form.ip !== '') { + this.form.ip += ',' + } + this.form.ip += ip + }) + }, + doAdd() { + this.joinIp() + add(this.form) + .then(res => { + this.resetForm() + this.$notify({ + title: '添加成功', + type: 'success', + duration: 2500 + }) + this.loading = false + this.$parent.init() + }) + .catch(err => { + this.loading = false + console.log(err.response.data.message) + }) + }, + doEdit() { + this.joinIp() + edit(this.form) + .then(res => { + this.resetForm() + this.$notify({ + title: '修改成功', + type: 'success', + duration: 2500 + }) + this.loading = false + this.$parent.init() + }) + .catch(err => { + this.loading = false + console.log(err.response.data.message) + }) + }, + resetForm() { + this.dialog = false + this.$refs['form'].resetFields() + this.form = { + id: '', + appId: '', + ip: '', + selectIp: [] + } + }, + initSelect() { + getApps().then(res => { + this.apps = res.content + }) + getServers().then(res => { + this.servers = res.content + }) + }, + handleSuccess(response, file, fileList) { + this.cancel() + }, + // 监听上传失败 + handleError(e, file, fileList) { + const msg = JSON.parse(e.message) + this.$notify({ + title: msg.message, + type: 'error', + duration: 2500 + }) + }, + initWebSocket() { + const wsUri = process.env.VUE_APP_WS_API + '/webSocket/deploy' + this.websock = new WebSocket(wsUri) + this.websock.onerror = this.webSocketOnError + this.websock.onmessage = this.webSocketOnMessage + }, + webSocketOnError(e) { + this.$notify({ + title: 'WebSocket连接发生错误', + type: 'error', + duration: 0 + }) + }, + webSocketOnMessage(e) { + const data = JSON.parse(e.data) + if (data.msgType === 'INFO') { + this.$notify({ + title: '', + message: data.msg, + type: 'success', + dangerouslyUseHTMLString: true, + duration: 5500 + }) + } else if (data.msgType === 'ERROR') { + this.$notify({ + title: '', + message: data.msg, + dangerouslyUseHTMLString: true, + type: 'error', + duration: 0 + }) + } + }, + webSocketSend(agentData) { + this.websock.send(agentData) + } + } +} +</script> + +<style scoped> +</style> diff --git a/UI source code/dns_mapping_ui-master/src/views/mnt/deploy/index.vue b/UI source code/dns_mapping_ui-master/src/views/mnt/deploy/index.vue new file mode 100644 index 0000000..e2ab8a7 --- /dev/null +++ b/UI source code/dns_mapping_ui-master/src/views/mnt/deploy/index.vue @@ -0,0 +1,229 @@ +<template> + <div class="app-container"> + <!--工具栏--> + <div class="head-container"> + <div v-if="crud.props.searchToggle"> + <!-- 搜索 --> + <el-input v-model="query.appName" clearable placeholder="输入应用名称查询" style="width: 200px" class="filter-item" @keyup.enter.native="crud.toQuery" /> + <date-range-picker v-model="query.createTime" class="date-item" /> + <rrOperation /> + </div> + <crudOperation :permission="permission"> + <template slot="right"> + <el-button + v-permission="['admin','deploy:add']" + :disabled="!selectIndex" + class="filter-item" + size="mini" + type="primary" + icon="el-icon-upload" + @click="sysRestore" + >系统还原 + </el-button> + <el-button + v-permission="['admin','deploy:add']" + :disabled="!selectIndex" + class="filter-item" + size="mini" + type="primary" + icon="el-icon-upload" + @click="serverStatus" + >状态查询 + </el-button> + <el-button + v-permission="['admin','deploy:add']" + :disabled="!selectIndex" + class="filter-item" + size="mini" + type="success" + icon="el-icon-upload" + @click="startServer" + >启动 + </el-button> + <el-button + v-permission="['admin','deploy:add']" + :disabled="!selectIndex" + class="filter-item" + size="mini" + type="danger" + icon="el-icon-upload" + @click="stopServer" + >停止 + </el-button> + <el-button + v-permission="['admin','deploy:add']" + :disabled="!selectIndex" + class="filter-item" + size="mini" + type="warning" + icon="el-icon-upload" + @click="deploy" + >一键部署 + </el-button> + </template> + </crudOperation> + </div> + <!--表单组件--> + <el-dialog append-to-body :close-on-click-modal="false" :before-close="crud.cancelCU" :visible.sync="crud.status.cu > 0" :title="crud.status.title" width="500px"> + <el-form ref="form" :model="form" :rules="rules" size="small" label-width="80px"> + <el-form-item label="应用" prop="app.id"> + <el-select v-model.number="form.app.id" placeholder="请选择" style="width: 370px"> + <el-option v-for="item in apps" :key="item.id" :label="item.name" :value="item.id" /> + </el-select> + </el-form-item> + <el-form-item label="服务器" prop="deploys"> + <el-select v-model="form.deploys" multiple placeholder="请选择" style="width: 370px"> + <el-option v-for="item in servers" :key="item.id" :label="item.name" :value="item.id" /> + </el-select> + </el-form-item> + </el-form> + <div slot="footer" class="dialog-footer"> + <el-button type="text" @click="crud.cancelCU">取消</el-button> + <el-button :loading="crud.status.cu === 2" type="primary" @click="crud.submitCU">确认</el-button> + </div> + </el-dialog> + <!--统还原组件--> + <fForm ref="sysRestore" :key="times" :app-name="appName" /> + <dForm ref="deploy" /> + <!--表格渲染--> + <el-table ref="table" v-loading="crud.loading" :data="crud.data" highlight-current-row stripe style="width: 100%" @selection-change="handleCurrentChange"> + <el-table-column type="selection" width="55" /> + <el-table-column prop="app.name" label="应用名称" /> + <el-table-column prop="servers" label="服务器列表" /> + <el-table-column prop="createTime" label="部署日期" /> + <el-table-column v-if="checkPer(['admin','deploy:edit','deploy:del'])" label="操作" width="150px" align="center"> + <template slot-scope="scope"> + <udOperation + :data="scope.row" + :permission="permission" + /> + </template> + </el-table-column> + </el-table> + <!--分页组件--> + <pagination /> + </div> +</template> + +<script> +import crudDeploy from '@/api/mnt/deploy' +import dForm from './deploy' +import fForm from './sysRestore' +import CRUD, { presenter, header, form, crud } from '@crud/crud' +import rrOperation from '@crud/RR.operation' +import crudOperation from '@crud/CRUD.operation' +import udOperation from '@crud/UD.operation' +import pagination from '@crud/Pagination' +import DateRangePicker from '@/components/DateRangePicker' + +const defaultForm = { id: null, app: { id: null }, deploys: [] } +export default { + name: 'Deploy', + components: { dForm, fForm, pagination, crudOperation, rrOperation, udOperation, DateRangePicker }, + cruds() { + return CRUD({ title: '部署', url: 'api/deploy', crudMethod: { ...crudDeploy }}) + }, + mixins: [presenter(), header(), form(defaultForm), crud()], + data() { + return { + currentRow: {}, selectIndex: '', appName: '', urlHistory: '', + times: 0, appId: '', deployId: '', apps: [], servers: [], + permission: { + add: ['admin', 'deploy:add'], + edit: ['admin', 'deploy:edit'], + del: ['admin', 'deploy:del'] + }, + rules: { + 'app.id': [ + { required: true, message: '应用不能为空', trigger: 'blur', type: 'number' } + ], + deploys: [ + { required: true, message: '服务器不能为空', trigger: 'blur' } + ] + } + } + }, + methods: { + [CRUD.HOOK.beforeRefresh]() { + this.selectIndex = '' + return true + }, + // 新增编辑前做的操作 + [CRUD.HOOK.beforeToCU](crud, form) { + this.initSelect() + const deploys = [] + form.deploys.forEach(function(deploy, index) { + deploys.push(deploy.id) + }) + this.form.deploys = deploys + }, + // 提交前 + [CRUD.HOOK.beforeSubmit]() { + const deploys = [] + this.form.deploys.forEach(function(data, index) { + const deploy = { id: data } + deploys.push(deploy) + }) + this.form.deploys = deploys + return true + }, + deploy() { + this.$refs.deploy.dialog = true + this.$refs.deploy.deployInfo = this.currentRow + }, + sysRestore() { + this.$refs.sysRestore.dialog = true + }, + handleCurrentChange(selection) { + this.crud.selections = selection + if (selection.length === 1) { + const row = selection[0] + this.selectIndex = row.id + this.currentRow = row + this.appName = row.app.name + this.times = this.times + 1 + this.appId = row.appId + this.deployId = row.id + } else { + this.currentRow = {} + this.selectIndex = '' + } + }, + startServer() { + crudDeploy.startServer(JSON.stringify(this.currentRow)) + .then(res => { + }) + .catch(err => { + console.log('error:' + err.response.data.message) + }) + }, + stopServer() { + crudDeploy.stopServer(JSON.stringify(this.currentRow)) + .then(res => { + }) + .catch(err => { + console.log('error:' + err.response.data.message) + }) + }, + serverStatus() { + crudDeploy.serverStatus(JSON.stringify(this.currentRow)) + .then(res => { + }) + .catch(err => { + console.log('error:' + err.response.data.message) + }) + }, + initSelect() { + crudDeploy.getApps().then(res => { + this.apps = res.content + }) + crudDeploy.getServers().then(res => { + this.servers = res.content + }) + } + } +} +</script> + +<style scoped> +</style> diff --git a/UI source code/dns_mapping_ui-master/src/views/mnt/deploy/sysRestore.vue b/UI source code/dns_mapping_ui-master/src/views/mnt/deploy/sysRestore.vue new file mode 100644 index 0000000..e44aed6 --- /dev/null +++ b/UI source code/dns_mapping_ui-master/src/views/mnt/deploy/sysRestore.vue @@ -0,0 +1,108 @@ +<template> + <el-dialog append-to-body :close-on-click-modal="false" :visible.sync="dialog" title="系统还原" width="800px"> + <!--工具栏--> + <div class="head-container"> + <date-range-picker v-model="query.createTime" class="date-item" /> + <el-button class="filter-item" size="mini" type="success" icon="el-icon-search" @click="toQuery">搜索</el-button> + </div> + <el-form size="small" label-width="80px"> + <!--表格渲染--> + <el-table v-loading="loading" :data="data" style="width: 100%" @row-click="showRow"> + <el-table-column width="30px"> + <template slot-scope="scope"> + <el-radio v-model="radio" :label="scope.$index" /> + </template> + </el-table-column> + <el-table-column prop="appName" label="应用名称" /> + <el-table-column prop="ip" label="部署IP" /> + <el-table-column prop="deployDate" label="部署时间" /> + <el-table-column prop="deployUser" label="部署人员" /> + </el-table> + </el-form> + <div slot="footer" class="dialog-footer"> + <el-button type="text" @click="cancel">取消</el-button> + <el-button v-permission="['admin','deploy:add']" :loading="submitLoading" type="primary" @click="doSubmit">确认</el-button> + </div> + <!--分页组件--> + <el-pagination + :total="total" + :current-page="page + 1" + style="margin-top: 8px" + layout="total, prev, pager, next, sizes" + @size-change="sizeChange" + @current-change="pageChange" + /> + </el-dialog> +</template> + +<script> +import crud from '@/mixins/crud' +import { reducte } from '@/api/mnt/deployHistory' +import DateRangePicker from '@/components/DateRangePicker' +export default { + components: { DateRangePicker }, + mixins: [crud], + props: { + appName: { + type: String, + default: '' + } + }, + data() { + return { + submitLoading: false, + dialog: false, + history: [], + radio: '', + appNames: '', + selectIndex: '' + } + }, + created() { + this.$nextTick(() => { + this.init() + }) + }, + methods: { + beforeInit() { + this.url = 'api/deployHistory' + this.deployId = this.$parent.deployId + if (this.deployId === '') { + return false + } + this.sort = 'deployDate,desc' + this.params['deployId'] = this.deployId + return true + }, + showRow(row) { + this.radio = this.data.indexOf(row) + this.selectIndex = row.id + }, + cancel() { + this.dialog = false + this.submitLoading = false + }, + doSubmit() { + if (this.selectIndex === '') { + this.$message.error('请选择要还原的备份') + } else { + this.submitLoading = true + reducte(JSON.stringify(this.data[this.radio])) + .then(res => { + this.dialog = false + this.submitLoading = false + this.appNames = '' + this.$parent.crud.toQuery() + }) + .catch(err => { + this.submitLoading = false + console.log('error:' + err.response.data.message) + }) + } + } + } +} +</script> + +<style scoped> +</style> diff --git a/UI source code/dns_mapping_ui-master/src/views/mnt/deployHistory/index.vue b/UI source code/dns_mapping_ui-master/src/views/mnt/deployHistory/index.vue new file mode 100644 index 0000000..c4f9728 --- /dev/null +++ b/UI source code/dns_mapping_ui-master/src/views/mnt/deployHistory/index.vue @@ -0,0 +1,93 @@ +<template> + <div class="app-container"> + <!--工具栏--> + <div class="head-container"> + <div v-if="crud.props.searchToggle"> + <!-- 搜索 --> + <el-input v-model="query.blurry" clearable placeholder="输入搜索内容" style="width: 200px" class="filter-item" @keyup.enter.native="crud.toQuery" /> + <date-range-picker v-model="query.deployDate" class="date-item" /> + <rrOperation /> + </div> + <crudOperation :permission="permission" /> + </div> + <!--表格渲染--> + <el-table ref="table" v-loading="crud.loading" :data="crud.data" style="width: 100%" @selection-change="crud.selectionChangeHandler"> + <el-table-column type="selection" width="55" /> + <el-table-column prop="appName" label="应用名称" /> + <el-table-column prop="ip" label="部署IP" /> + <el-table-column prop="deployUser" label="部署人员" /> + <el-table-column prop="deployDate" label="部署时间" /> + <el-table-column v-if="checkPer(['admin','deployHistory:del'])" label="操作" width="100px" align="center"> + <template slot-scope="scope"> + <el-popover + :ref="scope.row.id" + v-permission="['admin','deployHistory:del']" + placement="top" + width="180" + > + <p>确定删除本条数据吗?</p> + <div style="text-align: right; margin: 0"> + <el-button size="mini" type="text" @click="$refs[scope.row.id].doClose()">取消</el-button> + <el-button :loading="delLoading" type="primary" size="mini" @click="delMethod(scope.row.id)">确定</el-button> + </div> + <el-button slot="reference" type="danger" icon="el-icon-delete" size="mini" /> + </el-popover> + </template> + </el-table-column> + </el-table> + <!--分页组件--> + <pagination /> + </div> +</template> + +<script> +import { del } from '@/api/mnt/deployHistory' +import CRUD, { presenter, header } from '@crud/crud' +import rrOperation from '@crud/RR.operation' +import crudOperation from '@crud/CRUD.operation' +import pagination from '@crud/Pagination' +import DateRangePicker from '@/components/DateRangePicker' + +export default { + name: 'DeployHistory', + components: { pagination, crudOperation, rrOperation, DateRangePicker }, + cruds() { + return CRUD({ title: '部署历史', url: 'api/deployHistory', crudMethod: { del }}) + }, + mixins: [presenter(), header()], + data() { + return { + delLoading: false, + permission: { + del: ['admin', 'deployHistory:del'] + } + } + }, + created() { + this.crud.optShow = { + add: false, + edit: false, + del: true, + download: true + } + }, + methods: { + delMethod(id) { + this.delLoading = true + del([id]).then(() => { + this.delLoading = false + this.$refs[id].doClose() + this.crud.dleChangePage(1) + this.crud.delSuccessNotify() + this.crud.toQuery() + }).catch(() => { + this.delLoading = false + this.$refs[id].doClose() + }) + } + } +} +</script> + +<style scoped> +</style> diff --git a/UI source code/dns_mapping_ui-master/src/views/mnt/server/index.vue b/UI source code/dns_mapping_ui-master/src/views/mnt/server/index.vue new file mode 100644 index 0000000..c26cc9c --- /dev/null +++ b/UI source code/dns_mapping_ui-master/src/views/mnt/server/index.vue @@ -0,0 +1,136 @@ +<template> + <div class="app-container"> + <!--工具栏--> + <div class="head-container"> + <div v-if="crud.props.searchToggle"> + <!-- 搜索 --> + <el-input v-model="query.id" clearable placeholder="输入名称或IP搜索" style="width: 200px" class="filter-item" @keyup.enter.native="crud.toQuery" /> + <date-range-picker v-model="query.createTime" class="date-item" /> + <rrOperation /> + </div> + <crudOperation :permission="permission" /> + </div> + <!--表单组件--> + <el-dialog append-to-body :close-on-click-modal="false" :before-close="crud.cancelCU" :visible.sync="crud.status.cu > 0" :title="crud.status.title" width="470px"> + <el-form ref="form" :model="form" :rules="rules" size="small" label-width="55px"> + <el-form-item label="名称" prop="name"> + <el-input v-model="form.name" style="width: 370px" /> + </el-form-item> + <el-form-item label="IP" prop="ip"> + <el-input v-model="form.ip" style="width: 370px" /> + </el-form-item> + <el-form-item label="端口" prop="port"> + <el-input-number v-model.number="form.port" controls-position="right" style="width: 370px;" /> + </el-form-item> + <el-form-item label="账号" prop="account"> + <el-input v-model="form.account" style="width: 370px" /> + </el-form-item> + <el-form-item label="密码" prop="password"> + <el-input v-model="form.password" type="password" style="width: 200px" /> + <el-button :loading="loading" type="success" style="align: right;" @click="testConnectServer">测试连接</el-button> + </el-form-item> + </el-form> + <div slot="footer" class="dialog-footer"> + <el-button type="text" @click="crud.cancelCU">取消</el-button> + <el-button :loading="crud.status.cu === 2" type="primary" @click="crud.submitCU">确认</el-button> + </div> + </el-dialog> + <!--表格渲染--> + <el-table ref="table" v-loading="crud.loading" :data="crud.data" style="width: 100%" @selection-change="crud.selectionChangeHandler"> + <el-table-column type="selection" width="55" /> + <el-table-column prop="name" label="名称" /> + <el-table-column prop="ip" label="IP" /> + <el-table-column prop="port" label="端口" /> + <el-table-column prop="account" label="账号" /> + <el-table-column prop="createTime" label="创建日期" /> + <el-table-column v-if="checkPer(['admin','serverDeploy:edit','serverDeploy:del'])" label="操作" width="150px" align="center"> + <template slot-scope="scope"> + <udOperation + :data="scope.row" + :permission="permission" + /> + </template> + </el-table-column> + </el-table> + <!--分页组件--> + <pagination /> + </div> +</template> + +<script> + +import crudServer from '@/api/mnt/serverDeploy' +import { testServerConnect } from '@/api/mnt/connect' +import { validateIP } from '@/utils/validate' +import CRUD, { presenter, header, form, crud } from '@crud/crud' +import rrOperation from '@crud/RR.operation' +import crudOperation from '@crud/CRUD.operation' +import udOperation from '@crud/UD.operation' +import pagination from '@crud/Pagination' +import DateRangePicker from '@/components/DateRangePicker' + +const defaultForm = { id: null, name: null, ip: null, port: 22, account: 'root', password: null } +export default { + name: 'Server', + components: { pagination, crudOperation, rrOperation, udOperation, DateRangePicker }, + cruds() { + return CRUD({ title: '服务器', url: 'api/serverDeploy', crudMethod: { ...crudServer }}) + }, + mixins: [presenter(), header(), form(defaultForm), crud()], + data() { + return { + accountList: [], + accountMap: {}, + loading: false, + permission: { + add: ['admin', 'serverDeploy:add'], + edit: ['admin', 'serverDeploy:edit'], + del: ['admin', 'serverDeploy:del'] + }, + rules: { + name: [ + { required: true, message: '请输入名称', trigger: 'blur' } + ], + ip: [ + { required: true, message: '请输入IP', trigger: 'blur' }, + { validator: validateIP, trigger: 'change' } + ], + port: [ + { required: true, message: '请输入端口', trigger: 'blur', type: 'number' } + ], + account: [ + { required: true, message: '请输入账号', trigger: 'blur' } + ], + password: [ + { required: true, message: '请输入密码', trigger: 'blur' } + ] + } + } + }, + methods: { + testConnectServer() { + this.$refs['form'].validate((valid) => { + if (valid) { + this.loading = true + testServerConnect(this.form).then((res) => { + this.loading = false + this.$notify({ + title: res ? '连接成功' : '连接失败', + type: res ? 'success' : 'error', + duration: 2500 + }) + }).catch(() => { + this.loading = false + }) + } + }) + } + } +} +</script> + +<style rel="stylesheet/scss" lang="scss" scoped> + ::v-deep .el-input-number .el-input__inner { + text-align: left; + } +</style> |
