summaryrefslogtreecommitdiff
path: root/UI source code/dns_mapping_ui-master/src/views/mnt
diff options
context:
space:
mode:
authorunknown <[email protected]>2022-06-24 17:11:23 +0800
committerunknown <[email protected]>2022-06-24 17:11:23 +0800
commit8565e1bb597b481447d33bac6d8c48c2c45215de (patch)
treea4f10c8f7f85a1a8b5c947f7d0d2f967d808a9c4 /UI source code/dns_mapping_ui-master/src/views/mnt
parent8165dfcc7bdb0b2e6f1c05f8e7c93553c0e7911e (diff)
upload UI source codeHEADmain
Diffstat (limited to 'UI source code/dns_mapping_ui-master/src/views/mnt')
-rw-r--r--UI source code/dns_mapping_ui-master/src/views/mnt/app/index.vue144
-rw-r--r--UI source code/dns_mapping_ui-master/src/views/mnt/database/execute.vue86
-rw-r--r--UI source code/dns_mapping_ui-master/src/views/mnt/database/index.vue148
-rw-r--r--UI source code/dns_mapping_ui-master/src/views/mnt/deploy/deploy.vue190
-rw-r--r--UI source code/dns_mapping_ui-master/src/views/mnt/deploy/index.vue229
-rw-r--r--UI source code/dns_mapping_ui-master/src/views/mnt/deploy/sysRestore.vue108
-rw-r--r--UI source code/dns_mapping_ui-master/src/views/mnt/deployHistory/index.vue93
-rw-r--r--UI source code/dns_mapping_ui-master/src/views/mnt/server/index.vue136
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>