Commit 8158009f authored by yanzhongrong's avatar yanzhongrong

search log

parent 532c6f37
/* eslint-disable */
const path = require('path')
const moment = require('moment')
const util = require('util')
const events = require('events')
const Client = require('ssh2').Client
const fs = require('fs')
const ProgressBar = require('progress')
const inquirer = require('inquirer')
//cnpm install moment util events ssh2 progress inquirer --dev 请先在deploy所在目录安装以上包
/******************************请手动配置以下内容*********************************/
/** 远程服务器配置
* @type {{password: string, port: number, host: string, username: string}}
*/
const serveEnv = {
stage: {
host: '8.142.143.40',
port: '22', //SSH 连接端口
username: 'changfa', //用户名
password: 'changFA123', //用户登录密码
},
}
// changfa07
// 公网IP 8.142.143.40 端口22
// changfa / changFA123
// 目录 /home/changfa/app/apache-tomcat-8.5.5new/webapps/dist/
let env = process.argv[process.argv.length - 1]
console.log('当前环境', env)
let server = serveEnv[env]
if (!server) {
console.log('请检查当前环境')
}
const basePath = '/home' //服务器网站根目录
let baseDir = '/changfa/app/apache-tomcat-8.5.5new/webapps/dist' //项目目录名称
let back_up_dir = '' //备份目录名称,需手动创建,可选,注意目录名后有斜杠 比如 back_up/
const bakDirName = baseDir + '.bak' + moment(new Date()).format('YYYY-M-D-HH:mm:ss') //备份文件名
const buildPath = path.resolve('./dist') //本地项目编译后的文件目录
console.log(basePath, );
/**********************************配置结束***************************************/
function doConnect(server, then) {
const conn = new Client()
conn.on('ready', function () {
then && then(conn)
}).on('error', function (err) {
console.error('connect error!', err)
}).on('close', function () {
conn.end()
}).connect(server)
}
function doShell(server, cmd, then) {
doConnect(server, function (conn) {
conn.shell(function (err, stream) {
if (err) throw err
else {
let buf = ''
stream.on('close', function () {
conn.end()
then && then(err, buf)
}).on('data', function (data) {
buf = buf + data
}).stderr.on('data', function (data) {
console.log('stderr: ' + data)
})
stream.end(cmd)
}
})
})
}
function doGetFileAndDirList(localDir, dirs, files) {
const dir = fs.readdirSync(localDir)
for (let i = 0; i < dir.length; i++) {
const p = path.join(localDir, dir[i])
const stat = fs.statSync(p)
if (stat.isDirectory()) {
dirs.push(p)
doGetFileAndDirList(p, dirs, files)
}
else {
files.push(p)
}
}
}
function Control() {
events.EventEmitter.call(this)
}
util.inherits(Control, events.EventEmitter)
const control = new Control()
control.on('doNext', function (todos, then) {
if (todos.length > 0) {
const func = todos.shift()
func(function (err) {
if (err) {
then(err)
throw err
}
else {
control.emit('doNext', todos, then)
}
})
}
else {
then(null)
}
})
function doUploadFile(server, localPath, remotePath, then) {
doConnect(server, function (conn) {
conn.sftp(function (err, sftp) {
if (err) {
then(err)
}
else {
sftp.fastPut(localPath, remotePath, function (err, result) {
conn.end()
then(err, result)
})
}
})
})
}
function doUploadDir(server, localDir, remoteDir, then) {
let dirs = []
let files = []
doGetFileAndDirList(localDir, dirs, files)
// 创建远程目录
console.log('开始创建远程目录')
let todoDir = []
dirs.forEach(function (dir) {
todoDir.push(function (done) {
const to = path.join(remoteDir, dir.slice(localDir.length + 1)).replace(/[\\]/g, '/')
const cmd = 'mkdir -p ' + to + '\r\nexit\r\n'
// console.log(`cmd::${cmd}`)
doShell(server, cmd, done)
})// end of push
})
// 上传文件
console.log('准备上传文件:')
let todoFile = []
let total = files.length;
let bar = new ProgressBar('上传进度:[:bar] :percent 剩余时长::etas', { total, width: 50 });
files.forEach(function (file) {
todoFile.push(function (done) {
const to = path.join(remoteDir, file.slice(localDir.length + 1)).replace(/[\\]/g, '/')
// console.log('upload ' + to)
bar.tick(1);
doUploadFile(server, file, to, done)
})
})
control.emit('doNext', todoDir, function (err) {
if (err) {
throw err
}
else {
control.emit('doNext', todoFile, then)
}
})
}
let mutual = {
chooseDir: function (err, dirList) {
if (err) {
console.log(err)
return false
}
if (baseDir) {
init()
return
}
dirList.unshift('我要新建目录')
const promptList = [
{
type: 'list',
message: '请选择要上传到的项目目录:',
name: 'dir',
choices: dirList,
}
]
inquirer.prompt(promptList).then(answers => {
if (answers.dir === '我要新建目录') {
mutual.mkNewDir()
return false
} else if (answers.dir.includes(basePath)) {
baseDir = basePath
} else {
baseDir = answers.dir
}
init()
}).catch(err => {
console.log(err)
})
},
mkNewDir: function () {
const promptList = [
{
type: 'input',
message: '请输入要创建的目录名称:',
name: 'dir',
}
]
inquirer.prompt(promptList).then(answers => {
if (!answers.dir) {
console.error('警告:文件名不能为空')
return false
}
baseDir = answers.dir
init()
})
}
}
/**
* 描述:获取远程文件路径下文件列表信息
* 参数:server 远程电脑凭证;
* remotePath 远程路径;
* isFile 是否是获取文件,true获取文件信息,false获取目录信息;
* then 回调函数
* 回调:then(err, dirs) : dir, 获取的列表信息
*/
function getFileOrDirList(server, remotePath, isFile, then) {
var cmd = "find " + remotePath + " -type " + (isFile == true ? "f" : "d") + "\r\nexit\r\n"
doShell(server, cmd, function (err, data) {
var arr = []
var remoteFile = []
arr = data.split("\r\n")
arr.forEach(function (dir) {
if (dir.indexOf(remotePath) == 0) {
remoteFile.push(dir)
}
})
remoteFile = remoteFile.map(item => item.split('/')[2]).filter(item => item && item.trim()) //只保留第一层目录
remoteFile = Array.from(new Set(remoteFile)) //去重
then(err, remoteFile)
})
}
function init() {
console.log('\n--------配置如下--------------\n')
console.log(`服务器host: ${server.host}`)
console.log(`项目文件夹: ${baseDir}`)
console.log(`项目部署以及备份目录: ${basePath}`)
console.log(`备份后的文件夹名: ${bakDirName}`)
console.log('\n--------开始部署--------------\n')
doShell(server, `mv ${basePath}/${baseDir} ${basePath}/${back_up_dir}${bakDirName}\nexit\n`) //备份远程目录文件
doUploadDir(server, buildPath, `${basePath}/${baseDir}`, () => console.log('\n--------部署成功--------------'))
}
getFileOrDirList(server, basePath, false, mutual.chooseDir)
\ No newline at end of file
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
"description": "A vue admin template with Element UI & axios & iconfont & permission control & lint", "description": "A vue admin template with Element UI & axios & iconfont & permission control & lint",
"scripts": { "scripts": {
"dev": "vue-cli-service serve", "dev": "vue-cli-service serve",
"build": "vue-cli-service build", "build": "vue-cli-service build && node deploy/index.js --mode stage",
"build:stage": "vue-cli-service build --mode staging", "build:stage": "vue-cli-service build --mode staging",
"preview": "node build/index.js --preview", "preview": "node build/index.js --preview",
"svgo": "svgo -f src/icons/svg --config=src/icons/svgo.yml", "svgo": "svgo -f src/icons/svg --config=src/icons/svgo.yml",
...@@ -14,17 +14,22 @@ ...@@ -14,17 +14,22 @@
}, },
"dependencies": { "dependencies": {
"axios": "0.18.1", "axios": "0.18.1",
"core-js": "3.6.5", "core-js": "^3.6.5",
"element-ui": "2.13.2", "element-ui": "2.13.2",
"events": "^3.3.0",
"inquirer": "^8.2.0",
"js-cookie": "2.2.0", "js-cookie": "2.2.0",
"moment": "^2.29.1",
"normalize.css": "7.0.0", "normalize.css": "7.0.0",
"nprogress": "0.2.0", "nprogress": "0.2.0",
"path-to-regexp": "2.4.0", "path-to-regexp": "2.4.0",
"progress": "^2.0.3",
"ssh2": "^1.6.0",
"util": "^0.12.4",
"vue": "2.6.10", "vue": "2.6.10",
"vue-router": "3.0.6", "vue-router": "3.0.6",
"vuex": "3.1.0" "vuex": "3.1.0"
}, },
"devDependencies": { "devDependencies": {
"@vue/cli-plugin-babel": "4.4.4", "@vue/cli-plugin-babel": "4.4.4",
"@vue/cli-plugin-eslint": "4.4.4", "@vue/cli-plugin-eslint": "4.4.4",
......
...@@ -6,6 +6,7 @@ const path = { ...@@ -6,6 +6,7 @@ const path = {
OperateEnum: '/dict/selectOperationItem', OperateEnum: '/dict/selectOperationItem',
LeakyCablelEnum: '/dict/selectLeakyCablelItem', LeakyCablelEnum: '/dict/selectLeakyCablelItem',
MonitorEnum: '/dict/selectMonitorItem', MonitorEnum: '/dict/selectMonitorItem',
selectDictType: '/dict/selectDictType',
getTree: '/home/getTree', getTree: '/home/getTree',
} }
...@@ -29,6 +30,10 @@ export function MonitorEnum() { ...@@ -29,6 +30,10 @@ export function MonitorEnum() {
return request.post(path.MonitorEnum, ...arguments) return request.post(path.MonitorEnum, ...arguments)
} }
export function selectDictType() {
return request.post(path.selectDictType, ...arguments)
}
export function getTree() { export function getTree() {
return request.post(path.getTree, ...arguments) return request.post(path.getTree, ...arguments)
} }
......
...@@ -70,6 +70,7 @@ service.interceptors.response.use( ...@@ -70,6 +70,7 @@ service.interceptors.response.use(
errorShowing = true errorShowing = true
setTimeout(() => { errorShowing = false }, 3000) setTimeout(() => { errorShowing = false }, 3000)
store.dispatch('user/resetToken') store.dispatch('user/resetToken')
location.href = location.href.replace(/#.+/, '') + '#/login'
return return
} }
if (code !== 200) { if (code !== 200) {
......
...@@ -2,23 +2,29 @@ ...@@ -2,23 +2,29 @@
<div> <div>
<el-form class="search-form" :model="form" ref="form" label-width="80px" :inline="true" size="mini"> <el-form class="search-form" :model="form" ref="form" label-width="80px" :inline="true" size="mini">
<el-form-item label="操作对象" > <el-form-item label="操作对象" >
<el-select v-model="form.sex" placeholder="请选择操作对象"> <el-select v-model="form.operateObj" placeholder="请选择操作对象" clearable >
<el-option v-for="(val, key) in sexOptions" <el-option v-for="item in operatObj"
:key="val" :key="item.dictValue"
:label="val" :label="item.dictValue"
:value="key"> :value="+item.dictValue1">
</el-option> </el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="操作内容"> <el-form-item label="操作内容">
<el-input v-model="form.name"></el-input> <el-select v-model="form.operateContent" placeholder="请选择操作内容" clearable >
<el-option v-for="item in operatContent"
:key="item.dictValue"
:label="item.dictValue"
:value="item.dictValue1">
</el-option>
</el-select>
</el-form-item> </el-form-item>
<el-form-item label="操作结果"> <el-form-item label="操作结果">
<el-select v-model="form.sex" placeholder="请选择操作结果"> <el-select v-model="form.operateResult" placeholder="请选择操作结果" clearable >
<el-option v-for="(val, key) in sexOptions" <el-option v-for="(val, key) in resultEnum"
:key="val" :key="val"
:label="val" :label="val"
:value="key"> :value="+key">
</el-option> </el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
...@@ -31,32 +37,50 @@ ...@@ -31,32 +37,50 @@
</template> </template>
<script> <script>
import { selectDictType } from '@/api/baseData'
export default { export default {
name: 'search', name: 'search',
data() { data() {
return { return {
sexOptions: [], operatContent: [],
operatObj: [],
resultEnum: {
0: '失败',
1: '成功',
},
form: formInit() form: formInit()
} }
}, },
computed: { computed: {
}, },
mounted() {
this.getInit()
},
methods: { methods: {
toSearch() { toSearch() {
this.$emit('search', this.form) this.$emit('search', this.form)
}, },
reset() { reset() {
this.form = formInit() this.form = formInit()
},
getInit() {
selectDictType({dictType: '06'}).then(res => {
let list = res || []
this.operatContent = list
})
selectDictType({dictType: '07'}).then(res => {
let list = res || []
this.operatObj = list
})
} }
} }
} }
function formInit() { function formInit() {
return { return {
department_id: [], operateContent: '',
name: '', operateObj: null,
sex: null, operateResult: null,
} }
} }
</script> </script>
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
</div> </div>
</div> </div>
<div v-if="isQuery"> <div v-if="isQuery">
<search /> <search @search="getTableData" />
</div> </div>
<el-table <el-table
:data="tableData" :data="tableData"
...@@ -67,10 +67,11 @@ export default { ...@@ -67,10 +67,11 @@ export default {
this.params.pageNum = pageData.page; this.params.pageNum = pageData.page;
this.getTableData() this.getTableData()
}, },
getTableData() { getTableData(option) {
let params = { let params = {
current: this.params.pageNum, current: this.params.pageNum,
size: this.params.pageSize size: this.params.pageSize,
...option
} }
logList(params).then(res => { logList(params).then(res => {
let list = res.records || [] let list = res.records || []
......
...@@ -11,7 +11,7 @@ const port = process.env.port || process.env.npm_config_port || 8886 // dev port ...@@ -11,7 +11,7 @@ const port = process.env.port || process.env.npm_config_port || 8886 // dev port
const rewriteDefaultConfig = { const rewriteDefaultConfig = {
changeOrigin: true, changeOrigin: true,
target: 'http://8.142.143.40:8886', target: 'http://8.142.143.40',
// target: 'http://192.168.0.111:8886', // target: 'http://192.168.0.111:8886',
// ws: true, // ws: true,
headers: { headers: {
...@@ -28,7 +28,7 @@ const rewriteDefaultConfig = { ...@@ -28,7 +28,7 @@ const rewriteDefaultConfig = {
} }
module.exports = { module.exports = {
publicPath: '/', publicPath: './',
outputDir: 'dist', outputDir: 'dist',
assetsDir: 'static', assetsDir: 'static',
lintOnSave: process.env.NODE_ENV === 'development', lintOnSave: process.env.NODE_ENV === 'development',
...@@ -44,7 +44,6 @@ module.exports = { ...@@ -44,7 +44,6 @@ module.exports = {
proxy: { proxy: {
'/api': rewriteDefaultConfig '/api': rewriteDefaultConfig
}, },
// before: require('./mock/mock-server.js')
}, },
configureWebpack: { configureWebpack: {
// provide the app's title in webpack's name field, so that // provide the app's title in webpack's name field, so that
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment