Commit 22b45f42 authored by caimeng's avatar caimeng

把盈点通的代码移动一些过来;做了法诉材料下载的需求

parent 79d7d5e9
<template>
<el-dialog :close-on-click-modal="false" :close-on-press-escape="false" :title="title" :width="width"
:visible.sync="visible" :before-close="handleCancel">
<slot></slot>
<component :is="componentTag"></component>
<div slot="footer" v-if="footer" class="dialog-footer">
<el-button size="small" @click="handleCancel">取 消</el-button>
<el-button size="small" type="primary" @click="handleSubmit">提 交</el-button>
</div>
</el-dialog>
</template>
<script>
const defaultOption = {
title:"弹框",
width:'35%',
center:false
}
export default {
name: "McDialog",
props: {
componentTag: {
type: Object,
default: () => null
},
footer:false,
title: {
type: String,
default: '弹框'
},
visible: false,
width: {
type: String,
default: "350px"
},
component: null,
onSubmit: Function,
onCancel: Function
},
methods: {
handleCancel() {
this.$emit('update:visible', false)
this.onCancel && this.onCancel()
},
handleSubmit() {
this.$emit('update:visible', false)
this.onSubmit && this.onSubmit()
},
}
}
</script>
<style lang="less" scoped></style>
\ No newline at end of file
<template>
<el-form-item v-show="show" :label="label" :prop="prop" :rules="rules">
<template v-if="component === 'MUpload'">
<m-upload :value.sync="currentValue" v-bind="options" v-on="$attrs.on" />
</template>
<template v-else>
<component :is="`el-${component}`" size="small" v-model="currentValue" v-bind="options" style="width: 100%;" v-on="$attrs.on">
<template v-if="component === 'select'">
<el-option
v-for="(item, index) in $attrs.options"
:key="index"
:label="item.label"
:value="item.value"
></el-option>
</template>
<template v-if="component === 'input'">
<template v-if="$attrs.appendText" slot="append">{{ $attrs.appendText }}</template>
<template v-if="$attrs.prependText" slot="prepend">{{ $attrs.prependText }}</template>
</template>
</component>
</template>
<div v-if="$attrs.helpMessage" class="el-help-message">{{ $attrs.helpMessage }}</div>
</el-form-item>
</template>
<script>
import MUpload from '@/components/McUpload'
const defaultOptionMap = {
input: {
placeholder: label => `请输入${label}`,
},
select: {
placeholder: label => `请选择${label}`,
},
'date-picker': {
placeholder: label => `请选择${label}`,
valueFormat: 'yyyy-MM-dd',
},
'date-picker-daterange': {
valueFormat: 'yyyy-MM-dd',
rangeSeparator: '至',
startPlaceholder: '开始日期',
endPlaceholder: '结束日期',
},
}
export default {
name: 'BaseFormItem',
components: { MUpload },
inheritAttrs: false,
props: {
value: {
type: [String, Number, Object, Array],
default: () => '',
},
label: String,
prop: {
type: String,
required: true,
},
component: {
type: String,
required: true,
},
rules: {
type: [Object, Array],
default: () => [],
},
show: {
type: Boolean,
default: true,
}
},
computed: {
currentValue: {
get() {
return this.value
},
set(val) {
this.$emit('input', val)
},
},
options() {
const options = { ...this.$attrs }
const defaultOption = this.getDefaultOption()
return {
...defaultOption,
clearable: true,
...options,
}
},
},
methods: {
getDefaultOption() {
const { type } = this.$attrs
const key = type ? `${this.component}-${type}` : this.component
const defaultOption = defaultOptionMap[key] || defaultOptionMap[this.component] || {}
let placeholder = defaultOption.placeholder
if (placeholder) {
placeholder = typeof placeholder === 'function' ? placeholder(this.label) : placeholder
}
return { ...defaultOption, placeholder }
},
},
}
</script>
<style lang="less" scoped>
.el-help-message {
color: #999;
font-size: 12px;
}
</style>
<template>
<div>
<div class="common-form">
<el-form ref="formRef" :model="values" label-suffix=":" v-bind="$attrs" @submit.native.prevent>
<template v-if="grouping">
<block v-for="child in formatSchemas" :key="child.label">
<block-header :title="child.label" />
<el-row>
<el-col v-for="item in child.options" :key="item.prop" :span="item.span || 24">
<BaseFormItem v-model="values[item.prop]" class="base-form-item" v-bind="item" />
</el-col>
</el-row>
</block>
</template>
<el-row v-else>
<el-col v-for="item in formatSchemas" :key="item.prop" :span="item.span || 24">
<BaseFormItem v-model="values[item.prop]" class="base-form-item" v-bind="item" />
</el-col>
</el-row>
<slot name="footer">
<el-form-item>
<el-button type="primary" size="small" @click="submit">提交</el-button>
<el-button size="small" @click="cancel">取消</el-button>
</el-form-item>
</slot>
</el-form>
</div>
</template>
</template>
<script>
import BaseFormItem from './form-item.vue'
<script>
export default {
name: 'BaseForm',
components: {
BaseFormItem,
},
inheritAttrs: false,
props: {
grouping: false,
value: {
type: Object,
default: () => { },
},
schemas: {
type: Array,
required: true,
default: () => [],
},
onSubmit: Function,
onInput: Function,
},
computed: {
values: {
get() {
return this.value || {}
},
set(val) {
if (this.onInput) {
this.onInput(val)
}
this.$emit('input', val)
},
},
/**
* @description 获取格式化的schema
* @description 格式化schema
*/
formatSchemas() {
if (this.grouping) {
return this.schemas.forEach(child => {
child.options = item.options.map(item => ({
...item,
rules: (item.required && !item.rules) ? [
{
required: true,
message: this.rulesMessage(item.component, item.placeholder, item.label),
trigger: this.rulesTrigger(item.component),
},
] : item.rules,
})
)
})
} else {
return this.schemas.map(item => ({
...item,
rules: (item.required && !item.rules) ? [
{
required: true,
message: this.rulesMessage(item.component, item.placeholder, item.label),
trigger: this.rulesTrigger(item.component),
},
] : item.rules,
}))
}
},
},
watch: {
schemas: {
handler: 'initValues',
immediate: true,
deep: true,
},
},
methods: {
/**
* @description 根据组件类型获取placeholder
* @param component
* @param placeholder
* @param label
*/
rulesMessage(component, placeholder, label) {
switch (component) {
case 'input':
return placeholder || `请输入${label}`
case 'upload':
case 'MUpload':
return placeholder || `请上传${label}`
default:
return placeholder || `请选择${label}`
}
},
/**
* @description 获取触发验证的方式
* @param trigger 'input' | 'upload' | 'select' | 'cascader' | 'date-picker' | 'time-picker' | 'datetime-picker' | 'switch' | 'slider' | 'rate' | 'radio' | 'checkbox' | 'input-number' | 'color-picker'
*/
rulesTrigger(trigger) {
switch (trigger) {
case 'input':
return 'blur'
case 'MUpload':
case 'upload':
case 'select':
case 'cascader':
case 'date-picker':
case 'time-picker':
case 'datetime-picker':
case 'switch':
case 'slider':
case 'rate':
case 'radio':
case 'checkbox':
case 'input-number':
case 'color-picker':
return 'change'
default:
return 'blur'
}
},
initValues() {
this.values = this.schemas.reduce((values, item) => {
values[item.prop] = item.value
return values
}, {})
},
submit() {
const values = { ...this.values }
this.$refs.formRef.validate((valid) => {
if (valid) {
this.$emit('submit', values)
}
})
},
cancel() {
this.$refs['formRef'].clearValidate();
this.$emit('cancel')
},
reset() {
this.$emit('reset')
this.$refs.formRef.resetFields()
this.initValues()
},
},
}
</script>
<style lang="less" scoped>
.common-form {
background: #FFF;
margin-bottom: 24px;
}
</script>
<style lang="scss" scoped>
::v-deep {
.base-form-item {
}
.el-input {
width: 100%;
}
}
</style>
\ No newline at end of file
</style>
\ No newline at end of file
......@@ -28,13 +28,13 @@ export default {
},
computed: {
position() {
return this.pagination.position || 'right'
return this.pagination.position || 'center'
},
options() {
return {
...defaultOption,
...this.pagination,
currentPage: this.pagination.pageNo || this.pagination.currentPage,
currentPage: this.pagination.current || this.pagination.currentPage,
}
},
},
......@@ -51,7 +51,7 @@ export default {
pageSize = val
}
this.$emit('change', { pageNo, pageSize })
this.$emit('change', { current:pageNo, size:pageSize })
},
},
}
......
<template>
<div class="file-list-item">
<ul>
<li v-for="item in fileList" :key="item.url">
<a :href="item.url" target="_blank">
<i class="el-icon-paperclip" />
{{ item.name }}
</a>
<div class="action">
<span @click="$emit('preview', item)">查看</span>
<span v-if="!disabled" @click="$emit('download', item)">下载</span>
<span v-if="!disabled" @click="$emit('delete', item)">删除</span>
</div>
</li>
</ul>
</div>
</template>
<script>
export default {
name: 'FileListItem',
props: {
fileList: {
type: Array,
default: () => []
},
disabled: {
type: Boolean,
default: false
}
},
data () {
return {
}
},
}
</script>
<style lang='less' scoped>
.file-list-item {
ul {
list-style: none;
padding: 0;
margin: 0;
li {
display: flex;
justify-content: space-between;
align-items: center;
a {
flex: 1;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
color: #606266;
&:hover {
color: #409EFF;
}
}
.action {
span {
font-size: 12px;
margin-right: 10px;
color: #409EFF;
cursor: pointer;
}
}
}
}
}
</style>
<!-- 预授信申述 -->
<template>
<div>
<el-upload
:class="{ hidden: limitHidden }"
:file-list="fileList"
:list-type="listType"
:multiple="multiple"
:limit="limit"
:show-file-list="showFileList"
action="#"
:accept='accept'
:before-upload="handleBeforeUpload"
:http-request='(params) => handleUpload(params)'
:on-success="handleSuccess"
:on-exceed="handleExceed"
>
<i v-if="listType === 'picture-card'" slot="default" class="el-icon-plus"></i>
<el-button v-else size="small" icon="el-icon-upload" type="primary">点击上传</el-button>
<div slot="file" slot-scope="{ file }">
<img
class="el-upload-list__item-thumbnail"
:src="file.url" :alt="file.name"
>
<span class="el-upload-list__item-actions">
<span
class="el-upload-list__item-preview"
@click="handlePreview(file)"
>
<i class="el-icon-zoom-in"></i>
</span>
<span
v-if="!disabled"
class="el-upload-list__item-delete"
@click="handleDownload(file)"
>
<i class="el-icon-download"></i>
</span>
<span
v-if="!disabled"
class="el-upload-list__item-delete"
@click="handleRemove(file)"
>
<i class="el-icon-delete"></i>
</span>
</span>
</div>
<div slot="tip" class="el-upload__tip">{{ tip }}</div>
</el-upload>
<file-list-item v-if="!showFileList" :file-list="fileList" :disabled="disabled" @preview="handlePreview" @download="handleDownload" @delete="handleRemove"></file-list-item>
<el-image-viewer v-if="imgViewerVisible" :url-list="urlList" :on-close="handleClose"></el-image-viewer>
</div>
</template>
<script>
import _ from 'lodash'
import ListItem from './ListItem'
import useOSS from '@/utils/useOSS'
const { uploadFile } = useOSS()
export default {
name: 'MUpload',
components: {
'el-image-viewer': () => import('element-ui/packages/image/src/image-viewer'),
'file-list-item': ListItem,
},
props: {
/**
* 上传文件列表 value.sync 绑定
* @type {Array}
*/
value: {
type: [String, Array],
require: true,
default: () => []
},
/**
* 上传文件列表类型
* @type {String} text/picture-card
*/
listType: {
type: String,
require: false,
default: 'text'
},
multiple: {
type: Boolean,
require: false,
default: false
},
/**
* 是否显示文件列表 - TODO listType 为 picture-card 时显示 showFileList 需设置为 true
* @type {Boolean}
* @default false
*/
showFileList: {
type: Boolean,
require: false,
default: false
},
/**
* 上传文件类型
* @type {String}
*/
accept: {
type: String,
require: false,
default: '.jpeg, .jpg, .png, .bmp, .gif'
},
limit: {
type: Number,
require: false
},
/**
* 上传文件路径
* @type {String} YDT-CRM-FRONT
*/
path: {
type: String,
require: false
},
/**
* 上传提示
* @type {String}
*/
tip: {
type: String,
require: false
},
/**
* 是否禁用
* @type {Boolean}
* @default false
*/
disabled: {
type: Boolean,
require: false,
default: false
},
},
data() {
return {
// 上传文件列表
fileList: [],
imgViewerVisible: false,
urlList: [],
}
},
computed: {
limitHidden() {
return this.limit && this.fileList.length >= this.limit
}
},
watch: {
value(newVal) {
if (newVal) {
const newList = _.compact(newVal)
this.fileList = Array.isArray(newList) ? newList.map(item => ({ name: item.name, url: item.url })) : []
} else {
this.fileList = []
}
}
},
methods: {
handlePreview(file) {
if(this.listType === 'picture-card') {
this.urlList = [file.url]
this.imgViewerVisible = true
} else {
window.open(file.url)
}
},
handleDownload(file) {
window.open(file.url)
},
handleClose() {
this.imgViewerVisible = false
this.urlList = []
},
// 上传前
handleBeforeUpload(file) {
const type = file.type
return true
},
// 上传
async handleUpload(file) {
try {
const res = await uploadFile(file.file, this.path)
this.$notify({
title: '成功',
message: `${file.file.name} 上传成功`,
type: 'success',
duration: 2000
});
if (this.limit === 1) {
this.fileList = [...res]
} else {
this.fileList.push(...res)
}
this.updateValue(this.fileList)
} catch (err) {
console.log(err)
}
},
updateValue(fileList) {
this.$emit('update:value', fileList);
this.$emit('change', fileList)
},
// 上传成功
handleSuccess(res, file) {
this.$notify({ title: '成功', message: file.name + ",上传成功", type: 'success' });
},
// 删除
handleRemove(file) {
this.$confirm(`是否删除 <a target="_blank">${file.name}</a> ?`, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
dangerouslyUseHTMLString: true,
}).then(() => {
const cacheFileList = _.cloneDeep(this.fileList)
this.fileList = cacheFileList.filter(item => {
if (item.url !== file.url) {
return item
}
})
this.updateValue(this.fileList)
})
},
// 超出限制
handleExceed() {
this.$notify({
title: '提示',
message: `当前限制上传最多 ${this.limit} 个文件`,
type: 'warning',
duration: 2000
});
},
}
}
</script>
<style lang='less' scoped>
.hidden {
::v-deep {
.el-upload--picture-card {
display: none;
}
.el-upload__tip {
line-height: normal;
margin-top: 0;
}
}
}
</style>
export function BaseFormMixin() {
return {
data() {
return {
form: {
value: null,
// onSubmit: (values) => {
// console.log('表单提交', values);
// },
onInput: val => {
this.form.value = val
},
},
}
},
methods: {
/**
* @description: 设置表单字段值
* @param {*} formSchemas 表单字段
* @param {*} formData 表单数据
*/
setFieldsValue(formSchemas, formData) {
this[formSchemas] = this[formSchemas].map((item) => ({
...item,
value: typeof formData === 'object'
? formData[item.prop] || item.value
: this[formData]?.[item.prop] || item.value,
}))
},
},
}
}
import BlockHeader from "@/components/byh/componments/blockHeader";
import ProductSelect from "@/components/common/ProductSelect";
import BaseDialog from "@/components/McDialog/index";
import AppSelect from "@/components/common/AppSelect";
import McUpload from "@/components/McUpload/index.vue";
export default {
components: {
BlockHeader,
ProductSelect,
AppSelect
AppSelect,
BaseDialog,
McUpload
}
}
......@@ -4,8 +4,8 @@ import BaseTable from '@/components/McTable/index.vue'
export function FormTableMixin(service, defaultProps = {}) {
const pagination = defaultProps && {
pageNo: 1,
pageSize: 10,
current: 1,
size: 10,
total: 0,
...defaultProps,
}
......@@ -49,7 +49,7 @@ export function FormTableMixin(service, defaultProps = {}) {
// this.getList()
// }
// this.getList()
this.getList()
},
activated() {
......@@ -62,8 +62,8 @@ export function FormTableMixin(service, defaultProps = {}) {
const { pagination } = this.table
return {
...this.form.value,
pageNum: pagination.pageNo,
pageSize: pagination.pageSize,
current: pagination.current,
size: pagination.size,
}
},
},
......@@ -71,6 +71,7 @@ export function FormTableMixin(service, defaultProps = {}) {
async getList() {
this.table.loading = true
try {
console.log(this.params,'请求参数')
const { data = [], total = 0 } = (await service?.call(this, this.params, this)) || {}
this.table.loading = false
this.table.data = data
......
......@@ -208,7 +208,7 @@ export default new Router({
},
{
path: '/collection/download',
name: 'CollectionSearch',
name: 'LitigationParam',
component: resolve => require(['../views/collection/download.vue'], resolve),
meta: {
title: '法诉材料',
......
import { GET, POST } from "@/utils/ajax";
// 初始化下载列表
// 法诉资料下载列表页面
export default {
GetCollectionDownLoad(data) {
return GET('/protocol/selectProtocolEnumList', data);
return POST('/proceeding/searchList', data);
},
CreateCollectionDownLoad(data) {
return POST('/proceeding/createTask', data);
},
ossToken(data){
return GET('/oss/ossToken',data)
}
};
import Vue from 'vue'
let loadingCount = 0
let loading
const LoadingManager = {
startLoading: function () {
loading = Vue.prototype.$loading({
lock: true,
text: '正在加载',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.7)',
})
},
closeLoading: function () {
loading.close()
},
showFullScreenLoading: function () {
if (loadingCount === 0) {
LoadingManager.startLoading()
}
loadingCount++
},
hideFullScreenLoading: function () {
// 添加延时,防止多次间隔很短的请求造成的页面闪烁
setTimeout(() => {
if (loadingCount <= 0) return
loadingCount--
if (loadingCount === 0) {
LoadingManager.closeLoading()
}
}, 100)
},
}
export default LoadingManager
import OSS from "ali-oss";
import API from "@/server/api";
import dayjs from "dayjs";
import LoadingManager from "@/utils/LoadingManager";
let ossCredentials = null;
/**
* 判断临时凭证是否到期。
**/
function isCredentialsExpired(credentials) {
if (!credentials) {
return true;
}
const expireDate = dayjs(credentials.expiration).valueOf();
const now = dayjs().valueOf();
// 如果有效期不足一分钟,视为过期。
return expireDate - now <= 60000;
}
const progress = (p) => {
// Object的上传进度。
console.log(p);
};
export default function useOSS() {
const uploadFile = async (file, path = "LOAN-CUSTOMER") => {
const EXT = file.name.split(".");
const PATH_FILE_SUFFIX = `${path}/${dayjs().format("YYYYMMDD")}/${
EXT[0]
}-${dayjs().valueOf()}.${EXT[EXT.length - 1]}`;
console.log(EXT, PATH_FILE_SUFFIX, "那是");
if (isCredentialsExpired(ossCredentials)) {
const params = { filePath: PATH_FILE_SUFFIX };
const { data } = await API.ossToken({ ...params });
ossCredentials = Object.assign({}, data.result);
}
console.log(ossCredentials, "xx ");
const client = new OSS({
bucket: ossCredentials.bucket,
region: "oss-cn-hangzhou" || ossCredentials.region,
accessKeyId: ossCredentials.accessKeyId,
accessKeySecret: ossCredentials.accessKeySecret,
stsToken: ossCredentials.securityToken,
refreshSTSTokenInterval: 300000, // refresh token every 30 minutes
});
try {
LoadingManager.showFullScreenLoading();
const result = await client.multipartUpload(PATH_FILE_SUFFIX, file, {
progress,
});
LoadingManager.hideFullScreenLoading();
const FILE_HOST = ossCredentials.hostUrl; // 资源地址
const originalUrl = result.res.requestUrls[0].split("?")[0];
const url = originalUrl.replace(/^https?:\/\/[^\/]+/, FILE_HOST); // 拼接完整资源地址
if (url) {
return [
{
url: url,
name: file.name,
},
];
} else {
throw new Error("上传失败");
}
} catch (error) {
LoadingManager.hideFullScreenLoading();
// eslint-disable-next-line no-console
console.log(error);
throw new Error(error);
}
};
return { uploadFile };
}
<template>
<div class="box-dialog">
<BaseForm v-bind="form" :schemas="formConfig" label-width="110px" @cancel="onCancel" @submit="onSubmit" />
</div>
</template>
<script>
import BaseForm from '@/components/McForm/index.vue'
import { BaseFormMixin } from '@/mixins/BaseForm'
import API from '@/server/api'
export default {
name: "CreateDownload",
components: {
BaseForm
},
props: {
callback: Function
},
mixins: [BaseFormMixin()],
data() {
return {
formConfig: [
{
component: 'MUpload',
label: '文件',
prop: 'excelUrl',
limit: 3,
showFileList: false,
accept: '.xltx,.xltm,.xlsx,.xlsm,.xls',
value: '',
rules: [
{ required: true, message: '请上传文件', trigger: 'change' },
],
helpMessage: '请上传借款编号:loan_no'
},
{
component: 'input',
label: '案件批次',
prop: 'batchName',
value: '',
rules: [
{ required: true, message: '请填写案件批次', trigger: 'blur' },
],
},
{
component: 'input',
type: "textarea",
label: '备注',
prop: 'memo',
value: '',
rules: [
{ required: true, message: '请填写备注', trigger: 'blur' },
],
}
]
}
},
methods: {
async onSubmit(val) {
try {
const params = Object.assign({}, val)
params.excelUrl = params.excelUrl[0]['url']
params.creator = window.localStorage.getItem('userName')
const { data: { success, message } } = await API.CreateCollectionDownLoad(params)
if (success) {
this.$message.success(message)
this.$emit('callback')
} else {
this.$message.error(message)
}
setTimeout(() => {
this.onCancel();
}, 500)
} catch (err) {
this.$message({
message: '操作失败'
})
}
},
onCancel() {
this.$children[0].reset()
this.$parent.$parent.handleCancel();
}
}
}
</script>
<style lang="less" scoped></style>
\ No newline at end of file
......@@ -2,87 +2,92 @@
<div class="page-download">
<block-header title="搜索" />
<BaseSearch v-bind="form" ref="search" :config="searchConfig"></BaseSearch>
<block-header title="法诉材料列表">
<el-button size="small" @click="visible = true" type="primary">上传生成材料</el-button>
</block-header>
<BaseTable v-bind="table" ref="table" :columns="columns"></BaseTable>
<BaseTable v-bind="table" ref="table" :columns="columns"></BaseTable>
<!-- 上传并生成材料 弹框 -->
<BaseDialog :visible.sync="visible" title="上传并生成材料" width="35%">
<component is="CreateDownload" @callback="reload"></component>
</BaseDialog>
</div>
</template>
<script>
import _ from 'lodash'
import { FormTableMixin } from '@/mixins/form-table'
import dayjs from 'dayjs'
import CreateDownload from './components/create.vue'
import API from '@/server/api'
// 获取列表
const service = async (params) => {
try{
const res = await API.GetCollectionDownLoad({...params})
console.log(res,'哈哈')
try {
const { data = {} } = await API.GetCollectionDownLoad({ ...params })
return {
data:'',
total:''
data: data.result?.data,
total: data.result?.total
}
}catch{
console.log('报错了')
} catch {
console.log('初始化法诉下载列表报错')
}
}
export default {
name: "CollectionDownload",
mixins: [FormTableMixin(service())],
mixins: [FormTableMixin(service)],
components: { CreateDownload },
data() {
return {
visible: false,
searchConfig: [
{
component: 'input',
prop: 'companyName',
prop: 'batchName',
label: '案件批次',
placeholder: '请输入案件批次'
},
{
component: 'select',
prop: 'b',
prop: 'riskType',
label: '状态',
placeholder: '请选择',
options: []
options: [
{ label: '已创建', value: 'CREATED' },
{ label: '生成中', value: 'NEEDZIP' },
{ label: '已完成', value: 'FINISHED' }
]
}
],
columns: [
{
label: '案件批次',
prop: 'companyName',
prop: 'batchName',
},
{
label: '案件数',
prop: 'a',
prop: 'caseNumber',
},
{
label: '状态',
prop: 'b',
prop: 'caseStatusStr',
},
{
label: '创建时间',
prop: 'c',
prop: 'gmtCreatedStr',
},
{
label: '更新时间',
prop: 'd',
prop: 'gmtModifiedStr',
},
{
label: '备注',
prop: 'e',
prop: 'memo',
},
{
label: '操作人',
prop: 'f',
},
{
label: '创建时间',
prop: 'createdTime',
render: (_, text) => {
return <span>{text && dayjs(text).format('YYYY-MM-DD HH:mm:ss')}</span>
}
prop: 'creator'
}
],
}
......@@ -102,6 +107,9 @@ export default {
} catch (err) {
this.$message.error(res || '初始化协议枚举列表报错');
}
},
async reload() {
this.getList()
}
},
}
......
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