小更新

backup_master_20231211
飘泊客 11 months ago
parent aeba0a5793
commit 28f81ff73c

@ -3,13 +3,13 @@
# @Autor: 飘泊客
# @Date: 2023-05-05 16:18:03
# @LastEditors: error: error: git config user.name & please set dead value or install git && error: git config user.email & please set dead value or install git & please set dead value or install git
# @LastEditTime: 2023-10-09 15:31:18
# @LastEditTime: 2023-10-16 12:57:34
###
ENV = 'production'
# 如果使用 Nginx 代理后端接口,那么此处需要改为 '/',文件查看 Docker 部署篇Nginx 配置
# 接口地址,注意协议,如果你没有配置 ssl需要将 https 改为 http
VUE_APP_BASE_API = 'http://39.100.77.21:8013'
VUE_APP_BASE_IMG = 'http://39.100.77.21:8013'
VUE_APP_BASE_API = 'https://baiyee.vip'
VUE_APP_BASE_IMG = 'https://baiyee.vip'
# 如果接口是 http 形式, wss 需要改为 ws
VUE_APP_WS_API = 'wss://baiyee.vip'

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

@ -3,7 +3,7 @@
* @Autor: 飘泊客
* @Date: 2022-01-13 15:43:13
* @LastEditors: error: error: git config user.name & please set dead value or install git && error: git config user.email & please set dead value or install git & please set dead value or install git
* @LastEditTime: 2023-10-13 11:29:17
* @LastEditTime: 2023-10-13 16:27:05
-->
<template>
<div class="app-container">
@ -34,7 +34,7 @@
</el-table-column> -->
<el-table-column
label="操作"
width="300"
width="140"
align="center"
fixed="right"
>

@ -1,411 +1,412 @@
<template>
<div class="app-container">
<!--工具栏-->
<div class="head-container">
<div v-if="crud.props.searchToggle">
<!-- 搜索 -->
<el-input
v-model="query.blurry"
clearable
size="small"
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" />
</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="580px"
>
<el-form
ref="form"
:inline="true"
:model="form"
:rules="rules"
size="small"
label-width="80px"
>
<el-form-item label="菜单类型" prop="type">
<el-radio-group v-model="form.type" size="mini" style="width: 178px">
<el-radio-button label="0">目录</el-radio-button>
<el-radio-button label="1">菜单</el-radio-button>
<el-radio-button label="2">按钮</el-radio-button>
</el-radio-group>
</el-form-item>
<el-form-item
v-show="form.type.toString() !== '2'"
label="菜单图标"
prop="icon"
>
<el-popover
placement="bottom-start"
width="450"
trigger="click"
@show="$refs['iconSelect'].reset()"
>
<IconSelect ref="iconSelect" @selected="selected" />
<el-input
slot="reference"
v-model="form.icon"
style="width: 450px;"
placeholder="点击选择图标"
readonly
clearable
>
<svg-icon
v-if="form.icon"
slot="prefix"
:icon-class="form.icon"
class="el-input__icon"
style="height: 32px;width: 16px;"
/>
<i v-else slot="prefix" class="el-icon-search el-input__icon" />
</el-input>
</el-popover>
</el-form-item>
<el-form-item
v-show="form.type.toString() !== '2'"
label="外链菜单"
prop="iframe"
>
<el-radio-group v-model="form.iframe" size="mini">
<el-radio-button label="true"></el-radio-button>
<el-radio-button label="false"></el-radio-button>
</el-radio-group>
</el-form-item>
<el-form-item
v-show="form.type.toString() === '1'"
label="菜单缓存"
prop="cache"
>
<el-radio-group v-model="form.cache" size="mini">
<el-radio-button label="true"></el-radio-button>
<el-radio-button label="false"></el-radio-button>
</el-radio-group>
</el-form-item>
<el-form-item
v-show="form.type.toString() !== '2'"
label="菜单可见"
prop="hidden"
>
<el-radio-group v-model="form.hidden" size="mini">
<el-radio-button label="false"></el-radio-button>
<el-radio-button label="true"></el-radio-button>
</el-radio-group>
</el-form-item>
<el-form-item
v-if="form.type.toString() !== '2'"
label="菜单标题"
prop="title"
>
<el-input
v-model="form.title"
:style="
form.type.toString() === '0' ? 'width: 450px' : 'width: 178px'
"
placeholder="菜单标题"
/>
</el-form-item>
<el-form-item
v-if="form.type.toString() === '2'"
label="按钮名称"
prop="title"
>
<el-input
v-model="form.title"
placeholder="按钮名称"
style="width: 178px;"
/>
</el-form-item>
<el-form-item
v-show="form.type.toString() !== '0'"
label="权限标识"
prop="permission"
>
<el-input
v-model="form.permission"
:disabled="form.iframe.toString() === 'true'"
placeholder="权限标识"
style="width: 178px;"
/>
</el-form-item>
<el-form-item
v-if="form.type.toString() !== '2'"
label="路由地址"
prop="path"
>
<el-input
v-model="form.path"
placeholder="路由地址"
style="width: 178px;"
/>
</el-form-item>
<el-form-item label="菜单排序" prop="menuSort">
<el-input-number
v-model.number="form.menuSort"
:min="0"
:max="999"
controls-position="right"
style="width: 178px;"
/>
</el-form-item>
<el-form-item
v-show="
form.iframe.toString() !== 'true' && form.type.toString() === '1'
"
label="组件名称"
prop="componentName"
>
<el-input
v-model="form.componentName"
style="width: 178px;"
placeholder="匹配组件内Name字段"
/>
</el-form-item>
<el-form-item
v-show="
form.iframe.toString() !== 'true' && form.type.toString() === '1'
"
label="组件路径"
prop="component"
>
<el-input
v-model="form.component"
style="width: 178px;"
placeholder="组件路径"
/>
</el-form-item>
<el-form-item label="上级类目" prop="pid">
<treeselect
v-model="form.pid"
:options="menus"
:load-options="loadMenus"
style="width: 450px;"
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"
lazy
:load="getMenus"
:data="crud.data"
:tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
row-key="id"
@select="crud.selectChange"
@select-all="crud.selectAllChange"
@selection-change="crud.selectionChangeHandler"
>
<el-table-column type="selection" width="55" />
<el-table-column
:show-overflow-tooltip="true"
label="菜单标题"
width="125px"
prop="title"
/>
<el-table-column prop="icon" label="图标" align="center" width="60px">
<template slot-scope="scope">
<svg-icon :icon-class="scope.row.icon ? scope.row.icon : ''" />
</template>
</el-table-column>
<el-table-column prop="menuSort" align="center" label="排序">
<template slot-scope="scope">
{{ scope.row.menuSort }}
</template>
</el-table-column>
<el-table-column
:show-overflow-tooltip="true"
prop="permission"
label="权限标识"
/>
<el-table-column
:show-overflow-tooltip="true"
prop="component"
label="组件路径"
/>
<el-table-column prop="iframe" label="外链" width="75px">
<template slot-scope="scope">
<span v-if="scope.row.iframe"></span>
<span v-else></span>
</template>
</el-table-column>
<el-table-column prop="cache" label="缓存" width="75px">
<template slot-scope="scope">
<span v-if="scope.row.cache"></span>
<span v-else></span>
</template>
</el-table-column>
<el-table-column prop="hidden" label="可见" width="75px">
<template slot-scope="scope">
<span v-if="scope.row.hidden"></span>
<span v-else></span>
</template>
</el-table-column>
<el-table-column prop="createTime" label="创建日期" width="135px" />
<el-table-column
v-if="checkPer(['admin', 'menu:edit', 'menu:del'])"
label="操作"
width="130px"
align="center"
fixed="right"
>
<template slot-scope="scope">
<udOperation
:data="scope.row"
:permission="permission"
msg="确定删除吗,如果存在下级节点则一并删除,此操作不能撤销!"
/>
</template>
</el-table-column>
</el-table>
</div>
</template>
<script>
import crudMenu from '@/api/system/menu'
import IconSelect from '@/components/IconSelect'
import Treeselect from '@riophae/vue-treeselect'
import '@riophae/vue-treeselect/dist/vue-treeselect.css'
import { LOAD_CHILDREN_OPTIONS } from '@riophae/vue-treeselect'
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 DateRangePicker from '@/components/DateRangePicker'
// crudpresenter
const defaultForm = {
id: null,
title: null,
menuSort: 999,
path: null,
component: null,
componentName: null,
iframe: false,
roles: [],
pid: 0,
icon: null,
cache: false,
hidden: false,
type: 0,
permission: null
}
export default {
name: 'Menu',
components: {
Treeselect,
IconSelect,
crudOperation,
rrOperation,
udOperation,
DateRangePicker
},
cruds() {
return CRUD({
title: '菜单',
url: 'api-management/api/menus',
crudMethod: { ...crudMenu }
})
},
mixins: [presenter(), header(), form(defaultForm), crud()],
data() {
return {
menus: [],
permission: {
add: ['admin', 'menu:add'],
edit: ['admin', 'menu:edit'],
del: ['admin', 'menu:del']
},
rules: {
title: [{ required: true, message: '请输入标题', trigger: 'blur' }],
path: [{ required: true, message: '请输入地址', trigger: 'blur' }]
}
}
},
methods: {
//
[CRUD.HOOK.afterToCU](crud, form) {
this.menus = []
if (form.id != null) {
if (form.pid === null) {
form.pid = 0
}
this.getSupDepts(form.id)
} else {
this.menus.push({ id: 0, label: '顶级类目', children: null })
}
},
getMenus(tree, treeNode, resolve) {
const params = { pid: tree.id }
setTimeout(() => {
crudMenu.getMenus(params).then(res => {
resolve(res.content)
})
}, 100)
},
getSupDepts(id) {
crudMenu.getMenuSuperior(id).then(res => {
const children = res.map(function(obj) {
if (!obj.leaf && !obj.children) {
obj.children = null
}
return obj
})
this.menus = [{ id: 0, label: '顶级类目', children: children }]
})
},
loadMenus({ action, parentNode, callback }) {
if (action === LOAD_CHILDREN_OPTIONS) {
crudMenu.getMenusTree(parentNode.id).then(res => {
parentNode.children = res.map(function(obj) {
if (!obj.leaf) {
obj.children = null
}
return obj
})
setTimeout(() => {
callback()
}, 100)
})
}
},
//
selected(name) {
this.form.icon = name
}
}
}
</script>
<style rel="stylesheet/scss" lang="scss" scoped>
::v-deep .el-input-number .el-input__inner {
text-align: left;
}
::v-deep .vue-treeselect__control,
::v-deep .vue-treeselect__placeholder,
::v-deep .vue-treeselect__single-value {
height: 30px;
line-height: 30px;
}
</style>
<template>
<div class="app-container">
<!--工具栏-->
<div class="head-container">
<div v-if="crud.props.searchToggle">
<!-- 搜索 -->
<el-input
v-model="query.blurry"
clearable
size="small"
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" />
</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="580px"
>
<el-form
ref="form"
:inline="true"
:model="form"
:rules="rules"
size="small"
label-width="80px"
>
<el-form-item label="菜单类型" prop="type">
<el-radio-group v-model="form.type" size="mini" style="width: 178px">
<el-radio-button label="0">目录</el-radio-button>
<el-radio-button label="1">菜单</el-radio-button>
<el-radio-button label="2">按钮</el-radio-button>
</el-radio-group>
</el-form-item>
<el-form-item
v-show="form.type.toString() !== '2'"
label="菜单图标"
prop="icon"
>
<el-popover
placement="bottom-start"
width="450"
trigger="click"
@show="$refs['iconSelect'].reset()"
>
<IconSelect ref="iconSelect" @selected="selected" />
<el-input
slot="reference"
v-model="form.icon"
style="width: 450px;"
placeholder="点击选择图标"
readonly
clearable
>
<svg-icon
v-if="form.icon"
slot="prefix"
:icon-class="form.icon"
class="el-input__icon"
style="height: 32px;width: 16px;"
/>
<i v-else slot="prefix" class="el-icon-search el-input__icon" />
</el-input>
</el-popover>
</el-form-item>
<el-form-item
v-show="form.type.toString() !== '2'"
label="外链菜单"
prop="iframe"
>
<el-radio-group v-model="form.iframe" size="mini">
<el-radio-button label="true"></el-radio-button>
<el-radio-button label="false"></el-radio-button>
</el-radio-group>
</el-form-item>
<el-form-item
v-show="form.type.toString() === '1'"
label="菜单缓存"
prop="cache"
>
<el-radio-group v-model="form.cache" size="mini">
<el-radio-button label="true"></el-radio-button>
<el-radio-button label="false"></el-radio-button>
</el-radio-group>
</el-form-item>
<el-form-item
v-show="form.type.toString() !== '2'"
label="菜单可见"
prop="hidden"
>
<el-radio-group v-model="form.hidden" size="mini">
<el-radio-button label="false"></el-radio-button>
<el-radio-button label="true"></el-radio-button>
</el-radio-group>
</el-form-item>
<el-form-item
v-if="form.type.toString() !== '2'"
label="菜单标题"
prop="title"
>
<el-input
v-model="form.title"
:style="
form.type.toString() === '0' ? 'width: 450px' : 'width: 178px'
"
placeholder="菜单标题"
/>
</el-form-item>
<el-form-item
v-if="form.type.toString() === '2'"
label="按钮名称"
prop="title"
>
<el-input
v-model="form.title"
placeholder="按钮名称"
style="width: 178px;"
/>
</el-form-item>
<el-form-item
v-show="form.type.toString() !== '0'"
label="权限标识"
prop="permission"
>
<el-input
v-model="form.permission"
:disabled="form.iframe.toString() === 'true'"
placeholder="权限标识"
style="width: 178px;"
/>
</el-form-item>
<el-form-item
v-if="form.type.toString() !== '2'"
label="路由地址"
prop="path"
>
<el-input
v-model="form.path"
placeholder="路由地址"
style="width: 178px;"
/>
</el-form-item>
<el-form-item label="菜单排序" prop="menuSort">
<el-input-number
v-model.number="form.menuSort"
:min="0"
:max="999"
controls-position="right"
style="width: 178px;"
/>
</el-form-item>
<el-form-item
v-show="
form.iframe.toString() !== 'true' && form.type.toString() === '1'
"
label="组件名称"
prop="componentName"
>
<el-input
v-model="form.componentName"
style="width: 178px;"
placeholder="匹配组件内Name字段"
/>
</el-form-item>
<el-form-item
v-show="
form.iframe.toString() !== 'true' && form.type.toString() === '1'
"
label="组件路径"
prop="component"
>
<el-input
v-model="form.component"
style="width: 178px;"
placeholder="组件路径"
/>
</el-form-item>
<el-form-item label="上级类目" prop="pid">
<treeselect
v-model="form.pid"
:options="menus"
:load-options="loadMenus"
style="width: 450px;"
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"
lazy
:load="getMenus"
:data="crud.data"
:tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
row-key="id"
:header-cell-style="{'text-align':'left'}"
@select="crud.selectChange"
@select-all="crud.selectAllChange"
@selection-change="crud.selectionChangeHandler"
>
<el-table-column type="selection" width="55" />
<el-table-column
:show-overflow-tooltip="true"
label="菜单标题"
width="125px"
prop="title"
/>
<el-table-column prop="icon" label="图标" align="center" width="60px">
<template slot-scope="scope">
<svg-icon :icon-class="scope.row.icon ? scope.row.icon : ''" />
</template>
</el-table-column>
<el-table-column prop="menuSort" align="center" label="排序">
<template slot-scope="scope">
{{ scope.row.menuSort }}
</template>
</el-table-column>
<el-table-column
:show-overflow-tooltip="true"
prop="permission"
label="权限标识"
/>
<el-table-column
:show-overflow-tooltip="true"
prop="component"
label="组件路径"
/>
<el-table-column prop="iframe" label="外链" width="75px">
<template slot-scope="scope">
<span v-if="scope.row.iframe"></span>
<span v-else></span>
</template>
</el-table-column>
<el-table-column prop="cache" label="缓存" width="75px">
<template slot-scope="scope">
<span v-if="scope.row.cache"></span>
<span v-else></span>
</template>
</el-table-column>
<el-table-column prop="hidden" label="可见" width="75px">
<template slot-scope="scope">
<span v-if="scope.row.hidden"></span>
<span v-else></span>
</template>
</el-table-column>
<el-table-column prop="createTime" label="创建日期" width="135px" />
<el-table-column
v-if="checkPer(['admin', 'menu:edit', 'menu:del'])"
label="操作"
width="130px"
align="center"
fixed="right"
>
<template slot-scope="scope">
<udOperation
:data="scope.row"
:permission="permission"
msg="确定删除吗,如果存在下级节点则一并删除,此操作不能撤销!"
/>
</template>
</el-table-column>
</el-table>
</div>
</template>
<script>
import crudMenu from '@/api/system/menu'
import IconSelect from '@/components/IconSelect'
import Treeselect from '@riophae/vue-treeselect'
import '@riophae/vue-treeselect/dist/vue-treeselect.css'
import { LOAD_CHILDREN_OPTIONS } from '@riophae/vue-treeselect'
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 DateRangePicker from '@/components/DateRangePicker'
// crudpresenter
const defaultForm = {
id: null,
title: null,
menuSort: 999,
path: null,
component: null,
componentName: null,
iframe: false,
roles: [],
pid: 0,
icon: null,
cache: false,
hidden: false,
type: 0,
permission: null
}
export default {
name: 'Menu',
components: {
Treeselect,
IconSelect,
crudOperation,
rrOperation,
udOperation,
DateRangePicker
},
cruds() {
return CRUD({
title: '菜单',
url: 'api-management/api/menus',
crudMethod: { ...crudMenu }
})
},
mixins: [presenter(), header(), form(defaultForm), crud()],
data() {
return {
menus: [],
permission: {
add: ['admin', 'menu:add'],
edit: ['admin', 'menu:edit'],
del: ['admin', 'menu:del']
},
rules: {
title: [{ required: true, message: '请输入标题', trigger: 'blur' }],
path: [{ required: true, message: '请输入地址', trigger: 'blur' }]
}
}
},
methods: {
//
[CRUD.HOOK.afterToCU](crud, form) {
this.menus = []
if (form.id != null) {
if (form.pid === null) {
form.pid = 0
}
this.getSupDepts(form.id)
} else {
this.menus.push({ id: 0, label: '顶级类目', children: null })
}
},
getMenus(tree, treeNode, resolve) {
const params = { pid: tree.id }
setTimeout(() => {
crudMenu.getMenus(params).then(res => {
resolve(res.content)
})
}, 100)
},
getSupDepts(id) {
crudMenu.getMenuSuperior(id).then(res => {
const children = res.map(function(obj) {
if (!obj.leaf && !obj.children) {
obj.children = null
}
return obj
})
this.menus = [{ id: 0, label: '顶级类目', children: children }]
})
},
loadMenus({ action, parentNode, callback }) {
if (action === LOAD_CHILDREN_OPTIONS) {
crudMenu.getMenusTree(parentNode.id).then(res => {
parentNode.children = res.map(function(obj) {
if (!obj.leaf) {
obj.children = null
}
return obj
})
setTimeout(() => {
callback()
}, 100)
})
}
},
//
selected(name) {
this.form.icon = name
}
}
}
</script>
<style rel="stylesheet/scss" lang="scss" scoped>
::v-deep .el-input-number .el-input__inner {
text-align: left;
}
::v-deep .vue-treeselect__control,
::v-deep .vue-treeselect__placeholder,
::v-deep .vue-treeselect__single-value {
height: 30px;
line-height: 30px;
}
</style>

@ -1,104 +1,104 @@
<template>
<el-dialog :visible.sync="dialog" append-to-body title="执行日志" width="88%">
<!-- 搜索 -->
<div class="head-container">
<el-input v-model="query.jobName" clearable size="small" placeholder="输入任务名称搜索" style="width: 200px;" class="filter-item" @keyup.enter.native="toQuery" />
<date-range-picker v-model="query.createTime" class="date-item" />
<el-select v-model="query.isSuccess" placeholder="日志状态" clearable size="small" class="filter-item" style="width: 110px" @change="toQuery">
<el-option v-for="item in enabledTypeOptions" :key="item.key" :label="item.display_name" :value="item.key" />
</el-select>
<el-button class="filter-item" size="mini" type="success" icon="el-icon-search" @click="toQuery"></el-button>
<!-- 导出 -->
<div style="display: inline-block;">
<el-button
:loading="downloadLoading"
size="mini"
class="filter-item"
type="warning"
icon="el-icon-download"
@click="downloadMethod"
>导出</el-button>
</div>
</div>
<!--表格渲染-->
<el-table v-loading="loading" :data="data" style="width: 100%;margin-top: -10px;">
<el-table-column :show-overflow-tooltip="true" prop="jobName" label="任务名称" />
<el-table-column :show-overflow-tooltip="true" prop="beanName" label="Bean名称" />
<el-table-column :show-overflow-tooltip="true" prop="methodName" label="执行方法" />
<el-table-column :show-overflow-tooltip="true" prop="params" width="120px" label="参数" />
<el-table-column :show-overflow-tooltip="true" prop="cronExpression" label="cron表达式" />
<el-table-column prop="createTime" label="异常详情" width="110px">
<template slot-scope="scope">
<el-button v-show="scope.row.exceptionDetail" size="mini" type="text" @click="info(scope.row.exceptionDetail)"></el-button>
</template>
</el-table-column>
<el-table-column :show-overflow-tooltip="true" align="center" prop="time" width="100px" label="耗时(毫秒)" />
<el-table-column align="center" prop="isSuccess" width="80px" label="状态">
<template slot-scope="scope">
<el-tag :type="scope.row.isSuccess ? 'success' : 'danger'">{{ scope.row.isSuccess ? '成功' : '失败' }}</el-tag>
</template>
</el-table-column>
<el-table-column :show-overflow-tooltip="true" prop="createTime" label="创建日期" />
</el-table>
<el-dialog :visible.sync="errorDialog" append-to-body title="异常详情" width="85%">
<pre v-highlightjs="errorInfo"><code class="java" /></pre>
</el-dialog>
<!--分页组件-->
<el-pagination
:total="total"
:current-page="page + 1"
:page-size="6"
style="margin-top:8px;"
layout="total, prev, pager, next"
@size-change="sizeChange"
@current-change="pageChange"
/>
</el-dialog>
</template>
<script>
import crud from '@/mixins/crud'
import DateRangePicker from '@/components/DateRangePicker'
export default {
components: { DateRangePicker },
mixins: [crud],
data() {
return {
title: '任务日志',
errorInfo: '', errorDialog: false,
enabledTypeOptions: [
{ key: 'true', display_name: '成功' },
{ key: 'false', display_name: '失败' }
]
}
},
methods: {
doInit() {
this.$nextTick(() => {
this.init()
})
},
//
beforeInit() {
this.url = 'api-management/api/jobs/logs'
this.size = 6
return true
},
//
info(errorInfo) {
this.errorInfo = errorInfo
this.errorDialog = true
}
}
}
</script>
<style scoped>
.java.hljs{
color: #444;
background: #ffffff !important;
}
::v-deep .el-dialog__body{
padding: 0 20px 10px 20px !important;
}
</style>
<template>
<el-dialog :visible.sync="dialog" append-to-body title="执行日志" width="88%">
<!-- 搜索 -->
<div class="head-container">
<el-input v-model="query.jobName" clearable size="small" placeholder="输入任务名称搜索" style="width: 200px;" class="filter-item" @keyup.enter.native="toQuery" />
<date-range-picker v-model="query.createTime" class="date-item" />
<el-select v-model="query.isSuccess" placeholder="日志状态" clearable size="small" class="filter-item" style="width: 110px" @change="toQuery">
<el-option v-for="item in enabledTypeOptions" :key="item.key" :label="item.display_name" :value="item.key" />
</el-select>
<el-button class="filter-item" size="mini" type="success" icon="el-icon-search" @click="toQuery"></el-button>
<!-- 导出 -->
<div style="display: inline-block;">
<el-button
:loading="downloadLoading"
size="mini"
class="filter-item"
type="warning"
icon="el-icon-download"
@click="downloadMethod"
>导出</el-button>
</div>
</div>
<!--表格渲染-->
<el-table v-loading="loading" :data="data" style="width: 100%;margin-top: -10px;" :header-cell-style="{'text-align':'left'}">
<el-table-column :show-overflow-tooltip="true" prop="jobName" label="任务名称" />
<el-table-column :show-overflow-tooltip="true" prop="beanName" label="Bean名称" />
<el-table-column :show-overflow-tooltip="true" prop="methodName" label="执行方法" />
<el-table-column :show-overflow-tooltip="true" prop="params" width="120px" label="参数" />
<el-table-column :show-overflow-tooltip="true" prop="cronExpression" label="cron表达式" />
<el-table-column prop="createTime" label="异常详情" width="110px">
<template slot-scope="scope">
<el-button v-show="scope.row.exceptionDetail" size="mini" type="text" @click="info(scope.row.exceptionDetail)"></el-button>
</template>
</el-table-column>
<el-table-column :show-overflow-tooltip="true" align="center" prop="time" width="100px" label="耗时(毫秒)" />
<el-table-column align="center" prop="isSuccess" width="80px" label="状态">
<template slot-scope="scope">
<el-tag :type="scope.row.isSuccess ? 'success' : 'danger'">{{ scope.row.isSuccess ? '成功' : '失败' }}</el-tag>
</template>
</el-table-column>
<el-table-column :show-overflow-tooltip="true" prop="createTime" label="创建日期" />
</el-table>
<el-dialog :visible.sync="errorDialog" append-to-body title="异常详情" width="85%">
<pre v-highlightjs="errorInfo"><code class="java" /></pre>
</el-dialog>
<!--分页组件-->
<el-pagination
:total="total"
:current-page="page + 1"
:page-size="6"
style="margin-top:8px;"
layout="total, prev, pager, next"
@size-change="sizeChange"
@current-change="pageChange"
/>
</el-dialog>
</template>
<script>
import crud from '@/mixins/crud'
import DateRangePicker from '@/components/DateRangePicker'
export default {
components: { DateRangePicker },
mixins: [crud],
data() {
return {
title: '任务日志',
errorInfo: '', errorDialog: false,
enabledTypeOptions: [
{ key: 'true', display_name: '成功' },
{ key: 'false', display_name: '失败' }
]
}
},
methods: {
doInit() {
this.$nextTick(() => {
this.init()
})
},
//
beforeInit() {
this.url = 'api-management/api/jobs/logs'
this.size = 6
return true
},
//
info(errorInfo) {
this.errorInfo = errorInfo
this.errorDialog = true
}
}
}
</script>
<style scoped>
.java.hljs{
color: #444;
background: #ffffff !important;
}
::v-deep .el-dialog__body{
padding: 0 20px 10px 20px !important;
}
</style>

@ -223,6 +223,7 @@
ref="multipleTable"
v-loading="approvalLoading"
:data="item.list"
:header-cell-style="{'text-align':'left'}"
style="width: 100%"
>
<el-table-column

File diff suppressed because it is too large Load Diff

@ -447,8 +447,10 @@
<el-radio v-for="(item, index) in taskDetail.baseLabel" :key="index" :label="item">{{ item }}</el-radio>
</el-radio-group>
</div>
<div class="label-link">客户号码</div>
<el-input v-model="newNid" type="number" placeholder="请输入客户号码" />
<div v-if="radioLabel == '有意向'">
<div class="label-link">客户号码</div>
<el-input v-model="newNid" type="number" placeholder="请输入客户号码" />
</div>
<div class="label-link">线索记录</div>
<div class="u-flex mt-15">
<el-input v-model="taskRemarks" type="textarea" :rows="5" placeholder="添加线索记录" />
@ -1063,7 +1065,7 @@ export default {
clueId: index != null ? this.crud.data[index].id : this.taskDetail.id,
optimisticVersion: index != null ? this.crud.data[index].optimisticVersion : this.taskDetail.optimisticVersion
}
if ((type === 'labsub' && this.radioLabel === '有意向') || type === 'update') {
if ((type === 'labsub' && this.radioLabel === '有意向') || (type === 'update' && this.radioLabel === '有意向')) {
const reg_tel = /^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8}$/
if (!reg_tel.test(this.newNid)) {
this.$message({
@ -1085,7 +1087,7 @@ export default {
}
if (type === 'update') {
this.loadingSub = true
//
//
if (this.radioLabel) {
delete data.optimisticVersion
data.sourceLabel = [this.radioLabel]

@ -385,8 +385,10 @@
<el-radio v-for="(item, index) in taskDetail.baseLabel" :key="index" :label="item">{{ item }}</el-radio>
</el-radio-group>
</div>
<div class="label-link">客户号码</div>
<el-input v-model="newNid" type="number" placeholder="请输入客户号码" />
<div v-if="radioLabel == '有意向'">
<div class="label-link">客户号码</div>
<el-input v-model="newNid" type="number" placeholder="请输入客户号码" />
</div>
<div class="label-link">线索记录</div>
<div class="u-flex mt-15">
<el-input v-model="taskRemarks" type="textarea" :rows="5" placeholder="添加线索记录" />
@ -966,7 +968,7 @@ export default {
clueId: index != null ? this.crud.data[index].id : this.taskDetail.id,
optimisticVersion: index != null ? this.crud.data[index].optimisticVersion : this.taskDetail.optimisticVersion
}
if ((type === 'labsub' && this.radioLabel === '有意向') || type === 'update') {
if ((type === 'labsub' && this.radioLabel === '有意向') || (type === 'update' && this.radioLabel === '有意向')) {
const reg_tel = /^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8}$/
if (!reg_tel.test(this.newNid)) {
this.$message({
@ -988,7 +990,7 @@ export default {
}
if (type === 'update') {
this.loadingSub = true
//
//
if (this.radioLabel) {
delete data.optimisticVersion
data.sourceLabel = [this.radioLabel]

@ -139,7 +139,7 @@
inactive-text="是否开启"
/>
</div>
<el-table ref="multipleTable" :data="userOptionsAll" tooltip-effect="dark" style="height: 400px;overflow-y: auto;" @selection-change="handleUserSelectionChange">
<el-table ref="multipleTable" :data="userOptionsAll" tooltip-effect="dark" :header-cell-style="{'text-align':'left'}" style="height: 400px;overflow-y: auto;" @selection-change="handleUserSelectionChange">
<el-table-column type="selection" width="55" />
<el-table-column width="100" property="label" label="组员名" />
<el-table-column label="分配比">

Loading…
Cancel
Save