dev_review
yujialong 1 year ago
parent 7c47acc9d2
commit e78aca3957
  1. 2
      src/setting.js
  2. 2
      src/utils/api.js
  3. 132
      src/views/system/index.vue
  4. 336
      src/views/system/manageLog - 副本.vue
  5. 91
      src/views/system/taskLog.vue

@ -13,7 +13,7 @@ if (isDev) {
sandPath = `http://${location.hostname}:9520` sandPath = `http://${location.hostname}:9520`
host = 'http://121.37.12.51/' host = 'http://121.37.12.51/'
// host = 'https://huorantech.cn/' // host = 'https://huorantech.cn/'
// host = 'http://192.168.31.217:9000/'// 榕 host = 'http://192.168.31.217:9000/'// 榕
// host = 'http://192.168.31.51:9000/'// 赓 // host = 'http://192.168.31.51:9000/'// 赓
} else if (isPro) { } else if (isPro) {
jumpPath = 'https://www.huorantech.cn/judgmentPoint/' jumpPath = 'https://www.huorantech.cn/judgmentPoint/'

@ -290,6 +290,8 @@ export default {
checkRepeat: `nakadai/nakadai/log/checkRepeat`, checkRepeat: `nakadai/nakadai/log/checkRepeat`,
logWithdrawal: `nakadai/nakadai/log/logWithdrawal`, logWithdrawal: `nakadai/nakadai/log/logWithdrawal`,
sysLogs: `occupationlab/sys/logs`,
// 合伙人 // 合伙人
deleteParner: `nakadai/nakadai/partnerClassification/delete`, deleteParner: `nakadai/nakadai/partnerClassification/delete`,
saveParner: `nakadai/nakadai/partnerClassification/save`, saveParner: `nakadai/nakadai/partnerClassification/save`,

@ -1,14 +1,26 @@
<template> <template>
<div class="page system" style="padding: 0"> <div class="page system"
<div class="tabs"> style="padding: 0">
<a class="item" v-for="(item,index) in tabs" :key="index" :class="{active: index == active}" @click="tabChange(index)">{{ item }}</a> <div class="tabs">
</div> <a class="item"
v-for="(item,index) in tabs"
:key="index"
:class="{active: index == active}"
@click="tabChange(index)">{{ item }}</a>
</div>
<staff v-if="active == 'staff'"></staff> <staff v-if="active == 'staff'"></staff>
<role v-if="active == 'role'"></role> <role v-if="active == 'role'"></role>
<dic v-if="active == 'dic'"></dic> <dic v-if="active == 'dic'"></dic>
<log v-if="active == 'log'"></log> <log v-if="active == 'log'"></log>
<div v-if="active == 'task'">
<p class="tips">账号admin;密码huoran@2023</p>
<iframe class="frame"
:src="isPro ? 'https://huorantech.cn/xxl-job-admin/' : 'http://121.37.12.51:8001/xxl-job-admin/'"
frameborder="0"></iframe>
</div> </div>
<taskLog v-if="active == 'taskLog'"></taskLog>
</div>
</template> </template>
<script> <script>
@ -17,57 +29,62 @@ import staff from "./staff";
import role from "./role"; import role from "./role";
import dic from "./dic"; import dic from "./dic";
import log from "./log"; import log from "./log";
import taskLog from "./taskLog";
export default { export default {
data() { data () {
return { return {
active: this.$route.query.type || 'staff', isPro: Setting.isPro,
tabs: { active: this.$route.query.type || 'staff',
staff: "后台账号", tabs: {
role: "角色权限", staff: "后台账号",
dic: "数据字典", role: "角色权限",
log: "日志更新" dic: "数据字典",
} log: "日志更新",
}; task: "任务调度",
}, taskLog: "操作日志",
computed: { }
};
},
computed: {
},
components: {
staff,
role,
dic,
log,
taskLog
},
created () {
Setting.dynamicRoute && this.initTabs();
},
methods: {
tabChange (index) {
this.active = index
this.$router.push({
path: 'system',
query: {
...this.$route.query,
type: index
}
})
}, },
components: { initTabs () {
staff, const btns = this.$store.state.btns
role, const tab1 = btns.includes('/system:后台账号')
dic, const tab2 = btns.includes('/system:角色权限')
log const tab3 = btns.includes('/system:数据字典')
}, const tab4 = btns.includes('/system:日志更新')
created() {
Setting.dynamicRoute && this.initTabs();
},
methods: {
tabChange(index) {
this.active = index
this.$router.push({
path: 'system',
query: {
...this.$route.query,
type: index
}
})
},
initTabs() {
const btns = this.$store.state.btns
const tab1 = btns.includes('/system:后台账号')
const tab2 = btns.includes('/system:角色权限')
const tab3 = btns.includes('/system:数据字典')
const tab4 = btns.includes('/system:日志更新')
tab1 || delete this.tabs.staff tab1 || delete this.tabs.staff
tab2 || delete this.tabs.role tab2 || delete this.tabs.role
tab3 || delete this.tabs.dic tab3 || delete this.tabs.dic
tab4 || delete this.tabs.log tab4 || delete this.tabs.log
const type = this.$route.query.type const type = this.$route.query.type
const keys = Object.keys(this.tabs) const keys = Object.keys(this.tabs)
this.active = keys.includes(type) ? type : keys[0] this.active = keys.includes(type) ? type : keys[0]
}
} }
}
}; };
</script> </script>
@ -75,4 +92,11 @@ export default {
.system { .system {
min-height: calc(100vh - 170px); min-height: calc(100vh - 170px);
} }
.tips {
padding: 10px;
}
.frame {
width: 100%;
height: calc(100vh - 280px);
}
</style> </style>

@ -1,336 +0,0 @@
<template>
<div>
<el-card shadow="hover"
class="mgb20">
<div class="flex-between">
<div class="per_title"
v-preventReClick
@click="$router.back()">
<i class="el-icon-arrow-left"></i>
<span class="per_back">返回</span>
<span class="per_school">{{ platformName }}日志管理</span>
</div>
</div>
</el-card>
<div class="page">
<div class="inner">
<div class="tool">
<div class="filters">
<h6>日志更新</h6>
<div class="filter">
<label>版本查询</label>
<el-select v-model="versionName"
size="small"
placeholder="请选择版本"
filterable
@change="verChange">
<el-option v-for="item in vers"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</div>
</div>
<div>
<el-button type="primary"
@click="add"
v-auth="'/system:日志更新:管理:新增日志'">新增日志</el-button>
</div>
</div>
<el-timeline class="timeline">
<el-timeline-item placement="top"
v-for="(item, i) in listData"
:key="i"
:class="['item' + i, {draft: item.draft}]">
<p class="sign">{{ item.draft ? '未发布' : item.draftTime }}</p>
<div class="ver">
<div>
{{ item.versionName + (item.draft ? '(草稿)' : '') }}
<span class="action">
<i class="el-icon-edit-outline"
@click="edit(item)"
v-auth="'/system:日志更新:管理:编辑日志'"></i>
<i class="el-icon-delete"
@click="del(item)"
v-auth="'/system:日志更新:管理:删除日志'"></i>
</span>
</div>
<div>
<template v-if="!i && item.withdrawNum !== 1 && item.draft !== 1">
<span class="withdraw"
v-if="item.withdraw && item.open">已撤回</span>
<el-button v-else
style="margin-right: 10px"
type="primary"
size="small"
@click="revoke(item)">撤销</el-button>
</template>
<el-switch v-model="item.open"
:active-value="0"
:inactive-value="1"
@change="switchOff($event, item)"
v-auth="'/system:日志更新:管理:开启日志'"></el-switch>
</div>
</div>
<ul class="detail">
<li v-for="(item, i) in item.logContents"
:key="i">
<p v-if="!isNaN(item.type)"
class="name"><img :src="require('@/assets/img/' + funcList.find(e => e.id === item.type).icon + '.png')"
alt=""> {{ funcList.find(e => e.id === item.type).name }}</p>
<div class="val">
<p class=""
v-for="(item, i) in item.content"
:key="i">{{ item }}</p>
</div>
</li>
</ul>
</el-timeline-item>
</el-timeline>
</div>
</div>
</div>
</template>
<script>
import Setting from '@/setting'
export default {
data () {
return {
platformId: this.$route.query.platformId,
platformName: '',
versionName: '',
vers: [],
listData: [],
funcList: [
{
id: 0,
name: '新功能',
icon: 'func'
},
{
id: 1,
name: '修复',
icon: 'bug'
},
{
id: 2,
name: '优化',
icon: 'optimize'
}
]
};
},
mounted () {
this.getData()
},
methods: {
//
getData () {
this.$get(`${this.api.platformLogList}?platformId=${this.platformId}&versionName=${this.versionName}`).then(res => {
const { logList } = res
this.listData = logList
if (logList.length) {
const vers = []
const platformName = Setting.platformList.find(e => e.id === logList[0].platformId).name
this.platformName = platformName
logList.map((e, i) => {
e.logContents.map(n => {
n.content = n.content.split('\n')
})
vers.push({
id: i,
name: e.versionName
})
})
this.vers = vers
}
}).catch(res => { })
},
//
add () {
if (this.listData.find(e => e.draft)) {
this.$confirm("当前有未发布的版本,是否要新增版本?", "提示", {
type: "warning"
}).then(() => {
this.$router.push(`/addLog?platformId=${this.platformId}`)
}).catch(() => { })
} else {
this.$router.push(`/addLog?platformId=${this.platformId}`)
}
},
//
edit (item) {
this.$router.push(`/addLog?platformId=${this.platformId}&id=${item.logId}&draft=${item.draft}`)
},
//
del (item) {
this.$confirm("确定要删除吗?", "提示", {
type: "warning"
}).then(() => {
this.$post(`${this.api.logDel}?logId=${item.logId}`).then(res => {
this.$message.success("删除成功")
this.getData()
}).catch(res => { })
}).catch(() => { })
},
//
revoke (item) {
this.$confirm("确定要撤销吗?", "提示", {
type: "warning"
}).then(() => {
this.$get(`${this.api.logWithdrawal}?platformId=${this.platformId}&logId=${item.logId}`).then(res => {
this.$message.success('撤销成功')
this.getData()
}).catch(res => { })
}).catch(() => { })
},
changeStatus (logId, open, draft) {
this.$post(this.api.listUpdate, {
logId,
open,
draft
}).then(res => {
this.$message.success(open ? '禁用成功' : '启用成功')
this.getData()
}).catch(res => { })
},
//
switchOff (val, row) {
const logId = row.logId
if (row.draft && !val) {
this.$confirm('是否要发布该日志?', '提示', {
type: 'success'
}).then(() => {
this.changeStatus(logId, val, 0)
}).catch(() => {
this.changeStatus(logId, val, 1)
})
} else {
this.changeStatus(logId, val, row.draft)
}
},
//
verChange (i) {
window.scrollTo({
top: document.querySelector(`.item${i}`).offsetTop,
behavior: 'smooth'
})
}
}
};
</script>
<style lang="scss" scoped>
.page {
min-height: calc(100vh - 300px);
padding: 24px 0;
.inner {
width: 900px;
margin: 0 auto;
}
}
.tool {
padding-bottom: 20px;
margin-bottom: 0;
border-bottom: 1px solid #f0f0f0;
}
.filters {
display: inline-flex;
align-items: center;
h6 {
margin-right: 100px;
font-size: 18px;
}
}
/deep/.timeline {
padding-left: 20%;
overflow: hidden;
.el-timeline-item__node--normal {
top: 30px;
}
.el-timeline-item__wrapper {
top: 15px;
padding-left: 40px;
}
.el-timeline-item__tail {
height: 250%;
border-left-width: 1px;
}
.sign {
position: relative;
display: inline-block;
margin-left: -22%;
font-size: 14px;
color: #9076ff;
}
.draft {
.ver,
.sign {
color: #b1b1b1;
}
}
.ver {
display: flex;
justify-content: space-between;
align-items: center;
padding-bottom: 10px;
margin: -19px 0 20px;
font-size: 18px;
color: #9076ff;
border-bottom: 1px dashed #bfbfbf;
}
.withdraw {
margin-right: 10px;
font-size: 13px;
color: #979797;
}
.action {
margin-left: 15px;
i {
margin-left: 8px;
font-size: 14px;
color: #9076ff;
cursor: pointer;
&:hover {
opacity: 0.9;
}
}
}
.detail {
li {
margin-bottom: 20px;
}
.name {
display: flex;
align-items: center;
margin-bottom: 5px;
font-size: 15px;
font-weight: 600;
img {
width: 20px;
margin-right: 5px;
}
}
.val {
font-size: 14px;
line-height: 1.8;
white-space: pre-wrap;
p {
position: relative;
color: #6a6a6a;
&:before {
content: '';
display: inline-block;
width: 5px;
height: 5px;
margin: 0 10px 0 5px;
vertical-align: middle;
border-radius: 20px;
background-color: #c5b8ff;
}
}
}
}
}
</style>

@ -0,0 +1,91 @@
<template>
<div class="page">
<el-table :data="listData"
class="table"
ref="table"
stripe
header-align="center"
row-key="id">
<el-table-column type="index"
width="60"
label="序号"
align="center"></el-table-column>
<el-table-column prop="operation"
label="操作"
align="center"
min-width="150"
show-overflow-tooltip></el-table-column>
<el-table-column prop="ip"
label="ip"
align="center"></el-table-column>
<el-table-column prop="userId"
label="userId"
align="center"></el-table-column>
<el-table-column prop="userName"
label="用户名"
align="center"></el-table-column>
<el-table-column prop="schoolName"
label="学校"
align="center"></el-table-column>
<el-table-column prop="method"
label="路径"
align="center"></el-table-column>
<el-table-column prop="params"
label="参数"
align="center"></el-table-column>
<el-table-column prop="createTime"
label="操作时间"
align="center"></el-table-column>
</el-table>
<div class="pagination">
<el-pagination background
@current-change="currentChange"
:current-page="page"
layout="total, prev, pager, next"
:total="total"></el-pagination>
</div>
</div>
</template>
<script>
import Setting from '@/setting'
export default {
data () {
return {
keyword: "",
searchTimer: null,
platformList: Setting.platformList,
form: {
id: "",
roleName: "",
remark: ""
},
listDataAll: [],
listData: [],
page: 1,
pageSize: 10,
total: 0
};
},
mounted () {
this.getData()
},
methods: {
getData () {
this.$post(this.api.sysLogs, {
pageNum: this.page,
pageSize: this.pageSize
}).then(({ message }) => {
this.listData = message.records
this.total = message.total
}).catch(res => { })
},
currentChange (val) {
this.page = val;
this.getData();
},
}
};
</script>
<style lang="scss" scoped>
</style>
Loading…
Cancel
Save