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 @@
"description": "A vue admin template with Element UI & axios & iconfont & permission control & lint",
"scripts": {
"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",
"preview": "node build/index.js --preview",
"svgo": "svgo -f src/icons/svg --config=src/icons/svgo.yml",
......@@ -14,17 +14,22 @@
},
"dependencies": {
"axios": "0.18.1",
"core-js": "3.6.5",
"core-js": "^3.6.5",
"element-ui": "2.13.2",
"events": "^3.3.0",
"inquirer": "^8.2.0",
"js-cookie": "2.2.0",
"moment": "^2.29.1",
"normalize.css": "7.0.0",
"nprogress": "0.2.0",
"path-to-regexp": "2.4.0",
"progress": "^2.0.3",
"ssh2": "^1.6.0",
"util": "^0.12.4",
"vue": "2.6.10",
"vue-router": "3.0.6",
"vuex": "3.1.0"
},
"devDependencies": {
"@vue/cli-plugin-babel": "4.4.4",
"@vue/cli-plugin-eslint": "4.4.4",
......
......@@ -6,6 +6,7 @@ const path = {
OperateEnum: '/dict/selectOperationItem',
LeakyCablelEnum: '/dict/selectLeakyCablelItem',
MonitorEnum: '/dict/selectMonitorItem',
selectDictType: '/dict/selectDictType',
getTree: '/home/getTree',
}
......@@ -29,6 +30,10 @@ export function MonitorEnum() {
return request.post(path.MonitorEnum, ...arguments)
}
export function selectDictType() {
return request.post(path.selectDictType, ...arguments)
}
export function getTree() {
return request.post(path.getTree, ...arguments)
}
......
......@@ -70,6 +70,7 @@ service.interceptors.response.use(
errorShowing = true
setTimeout(() => { errorShowing = false }, 3000)
store.dispatch('user/resetToken')
location.href = location.href.replace(/#.+/, '') + '#/login'
return
}
if (code !== 200) {
......
......@@ -2,23 +2,29 @@
<div>
<el-form class="search-form" :model="form" ref="form" label-width="80px" :inline="true" size="mini">
<el-form-item label="操作对象" >
<el-select v-model="form.sex" placeholder="请选择操作对象">
<el-option v-for="(val, key) in sexOptions"
:key="val"
:label="val"
:value="key">
<el-select v-model="form.operateObj" placeholder="请选择操作对象" clearable >
<el-option v-for="item in operatObj"
:key="item.dictValue"
:label="item.dictValue"
:value="+item.dictValue1">
</el-option>
</el-select>
</el-form-item>
<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 label="操作结果">
<el-select v-model="form.sex" placeholder="请选择操作结果">
<el-option v-for="(val, key) in sexOptions"
<el-select v-model="form.operateResult" placeholder="请选择操作结果" clearable >
<el-option v-for="(val, key) in resultEnum"
:key="val"
:label="val"
:value="key">
:value="+key">
</el-option>
</el-select>
</el-form-item>
......@@ -31,32 +37,50 @@
</template>
<script>
import { selectDictType } from '@/api/baseData'
export default {
name: 'search',
data() {
return {
sexOptions: [],
operatContent: [],
operatObj: [],
resultEnum: {
0: '失败',
1: '成功',
},
form: formInit()
}
},
computed: {
},
mounted() {
this.getInit()
},
methods: {
toSearch() {
this.$emit('search', this.form)
},
reset() {
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() {
return {
department_id: [],
name: '',
sex: null,
operateContent: '',
operateObj: null,
operateResult: null,
}
}
</script>
......
......@@ -10,7 +10,7 @@
</div>
</div>
<div v-if="isQuery">
<search />
<search @search="getTableData" />
</div>
<el-table
:data="tableData"
......@@ -67,10 +67,11 @@ export default {
this.params.pageNum = pageData.page;
this.getTableData()
},
getTableData() {
getTableData(option) {
let params = {
current: this.params.pageNum,
size: this.params.pageSize
size: this.params.pageSize,
...option
}
logList(params).then(res => {
let list = res.records || []
......
......@@ -11,7 +11,7 @@ const port = process.env.port || process.env.npm_config_port || 8886 // dev port
const rewriteDefaultConfig = {
changeOrigin: true,
target: 'http://8.142.143.40:8886',
target: 'http://8.142.143.40',
// target: 'http://192.168.0.111:8886',
// ws: true,
headers: {
......@@ -28,7 +28,7 @@ const rewriteDefaultConfig = {
}
module.exports = {
publicPath: '/',
publicPath: './',
outputDir: 'dist',
assetsDir: 'static',
lintOnSave: process.env.NODE_ENV === 'development',
......@@ -44,7 +44,6 @@ module.exports = {
proxy: {
'/api': rewriteDefaultConfig
},
// before: require('./mock/mock-server.js')
},
configureWebpack: {
// 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