提交 fa41b02f 编写于 作者: ibizdev's avatar ibizdev

ibiz4j 发布系统代码

上级 6c0c9440
## v7.0.0-alpha.20 [2020-10-18]
### Bug修复
修复获取数据对象的主状态值统一转字符串处理逻辑
修复表单空输入异常问题
修复下拉数据数据加载异常问题
修复表单分页图标重复发布异常
修复数据选择增加外键值附加数据回填逻辑
修复表格行编辑可设置数据主键和清空仿真主键问题
修复代码表返回数据不合法抛出的异常
修复表单值规则部分逻辑
修复导航类视图修改右侧表单数据时,只能跳转第一条数据BUG
### 功能新增及优化
#### 模板
新增动态表单支持
新增视图消息支持
新增表单、面板、工具栏、数据看板直接内容项支持
新增日历项支持标识属性和文本属性
新增应用组件包支持
新增导航工具栏权限控制支持
新增图表绘制最终参数
新增门户部件界面行为组权限校验
新增表单、表格数据对象方式新建、更新默认值
新增导航视图搜索框提示可搜索字段名称
新增部件逻辑插件支持
新增工具栏、工具栏项插件支持
优化调整代码表服务基类位置
#### 基础文件
新增动态表单组件、直接内容项组件、视图消息组组件和视图消息组件
优化导航类部件工具栏状态逻辑
修复表单空输入异常问题
修复下拉数据数据加载异常
修复关系页第一次进入不加载问题
## v7.0.0-alpha.19 [2020-9-13] ## v7.0.0-alpha.19 [2020-9-13]
### Bug修复 ### Bug修复
......
...@@ -43,7 +43,7 @@ ...@@ -43,7 +43,7 @@
"vue-property-decorator": "^8.3.0", "vue-property-decorator": "^8.3.0",
"vue-router": "^3.1.3", "vue-router": "^3.1.3",
"vuex": "^3.1.2", "vuex": "^3.1.2",
"xlsx": "^0.15.6" "xlsx": "^0.15.6"
}, },
"devDependencies": { "devDependencies": {
"@types/echarts": "^4.4.3", "@types/echarts": "^4.4.3",
......
import store from '@/store'; import store from '@/store';
import { Environment } from '@/environments/environment';
/** /**
* 实体权限服务 * 实体权限服务
* *
...@@ -115,7 +117,13 @@ export default class AuthService { ...@@ -115,7 +117,13 @@ export default class AuthService {
if(!this.$store.getters['authresource/getEnablePermissionValid']) { if(!this.$store.getters['authresource/getEnablePermissionValid']) {
return true; return true;
} }
return this.$store.getters['authresource/getAuthMenu'](item); if(Object.is(Environment.menuPermissionMode,"RT")){
return this.$store.getters['authresource/getAuthMenuWithRT'](item);
}else if(Object.is(Environment.menuPermissionMode,"RESOURCE")){
return this.$store.getters['authresource/getAuthMenuWithResource'](item);
}else{
return this.$store.getters['authresource/getAuthMenu'](item);
}
} }
/** /**
......
...@@ -149,10 +149,11 @@ export default class CodeListService { ...@@ -149,10 +149,11 @@ export default class CodeListService {
// 启用缓存 // 启用缓存
if(isEnableCache){ if(isEnableCache){
const callback:Function = (context:any ={},data:any ={},tag:string,promise:Promise<any>) =>{ const callback:Function = (context:any ={},data:any ={},tag:string,promise:Promise<any>) =>{
const callbackKey:string = `${JSON.stringify(context)}-${JSON.stringify(data)}-${tag}`;
promise.then((result:any) =>{ promise.then((result:any) =>{
if(result.length > 0){ if(result.length > 0){
CodeListService.codelistCached.set(`${JSON.stringify(context)}-${JSON.stringify(data)}-${tag}`,{items:result}); CodeListService.codelistCached.set(callbackKey,{items:result});
CodeListService.codelistCache.delete(`${JSON.stringify(context)}-${JSON.stringify(data)}-${tag}`); CodeListService.codelistCache.delete(callbackKey);
return resolve(result); return resolve(result);
}else{ }else{
return resolve([]); return resolve([]);
...@@ -162,8 +163,9 @@ export default class CodeListService { ...@@ -162,8 +163,9 @@ export default class CodeListService {
}) })
} }
// 加载完成,从本地缓存获取 // 加载完成,从本地缓存获取
if(CodeListService.codelistCached.get(`${JSON.stringify(context)}-${JSON.stringify(data)}-${tag}`)){ const key:string = `${JSON.stringify(context)}-${JSON.stringify(data)}-${tag}`;
let items:any = CodeListService.codelistCached.get(`${JSON.stringify(context)}-${JSON.stringify(data)}-${tag}`).items; if(CodeListService.codelistCached.get(key)){
let items:any = CodeListService.codelistCached.get(key).items;
if(items.length >0){ if(items.length >0){
if(new Date().getTime() <= codelist.getExpirationTime()){ if(new Date().getTime() <= codelist.getExpirationTime()){
return resolve(items); return resolve(items);
...@@ -172,11 +174,11 @@ export default class CodeListService { ...@@ -172,11 +174,11 @@ export default class CodeListService {
} }
if (codelist) { if (codelist) {
// 加载中,UI又需要数据,解决连续加载同一代码表问题 // 加载中,UI又需要数据,解决连续加载同一代码表问题
if(CodeListService.codelistCache.get(`${JSON.stringify(context)}-${JSON.stringify(data)}-${tag}`)){ if(CodeListService.codelistCache.get(key)){
callback(context,data,tag,CodeListService.codelistCache.get(`${JSON.stringify(context)}-${JSON.stringify(data)}-${tag}`)); callback(context,data,tag,CodeListService.codelistCache.get(key));
}else{ }else{
let result:Promise<any> = codelist.getItems(context,data,isloading); let result:Promise<any> = codelist.getItems(context,data,isloading);
CodeListService.codelistCache.set(`${JSON.stringify(context)}-${JSON.stringify(data)}-${tag}`,result); CodeListService.codelistCache.set(key,result);
codelist.setExpirationTime(new Date().getTime() + cacheTimeout); codelist.setExpirationTime(new Date().getTime() + cacheTimeout);
callback(context,data,tag,result); callback(context,data,tag,result);
} }
......
...@@ -66,7 +66,7 @@ export default class AppActionBar extends Vue { ...@@ -66,7 +66,7 @@ export default class AppActionBar extends Vue {
public created(){ public created(){
if (this.viewState) { if (this.viewState) {
this.viewStateEvent = this.viewState.subscribe(({ tag, action, data }) => { this.viewStateEvent = this.viewState.subscribe(({ tag, action, data }) => {
if (!Object.is(tag, "app-actionbar")) { if (!Object.is(tag, "all-portlet")) {
return; return;
} }
if(Object.is(action,'loadmodel')){ if(Object.is(action,'loadmodel')){
...@@ -107,7 +107,7 @@ export default class AppActionBar extends Vue { ...@@ -107,7 +107,7 @@ export default class AppActionBar extends Vue {
const _item = ActionModel[key]; const _item = ActionModel[key];
if(_item && _item['dataaccaction'] && UIService){ if(_item && _item['dataaccaction'] && UIService){
let dataActionResult:any; let dataActionResult:any;
if(Object.is(_item['actiontarget'],"NONE")){ if(Object.is(_item['actiontarget'],"NONE") || Object.is(_item['actiontarget'],"")){
dataActionResult = UIService.getResourceOPPrivs(_item['dataaccaction']); dataActionResult = UIService.getResourceOPPrivs(_item['dataaccaction']);
}else{ }else{
if(data && Object.keys(data).length >0){ if(data && Object.keys(data).length >0){
......
...@@ -4,7 +4,11 @@ ...@@ -4,7 +4,11 @@
<app-alert <app-alert
:key="index" :key="index"
:tag="item.tag" :tag="item.tag"
:position="item.position"/> :context="context"
:viewparam="viewparam"
:position="item.position"
:infoGroup="infoGroup"
:viewname="viewname"/>
</template> </template>
</div> </div>
...@@ -32,6 +36,23 @@ export default class AppAlertGroup extends Vue { ...@@ -32,6 +36,23 @@ export default class AppAlertGroup extends Vue {
*/ */
@Prop() infoGroup: any; @Prop() infoGroup: any;
/**
* 应用上下文
*
* @type {any}
* @memberof AppAlertGroup
*/
@Prop() context: any;
/**
* 视图参数
*
* @type {any}
* @memberof AppAlertGroup
*/
@Prop() viewparam: any;
/** /**
* 视图消息组显示位置 * 视图消息组显示位置
* *
...@@ -40,6 +61,14 @@ export default class AppAlertGroup extends Vue { ...@@ -40,6 +61,14 @@ export default class AppAlertGroup extends Vue {
*/ */
@Prop() position: any; @Prop() position: any;
/**
* 视图名称
*
* @type {any}
* @memberof AppAlertGroup
*/
@Prop() viewname: any;
/** /**
* 当前位置视图消息集合 * 当前位置视图消息集合
* *
......
...@@ -43,6 +43,39 @@ export default class AppAlert extends Vue { ...@@ -43,6 +43,39 @@ export default class AppAlert extends Vue {
* @memberof AppAlert * @memberof AppAlert
*/ */
@Prop() position: any; @Prop() position: any;
/**
* 应用上下文
*
* @type {any}
* @memberof AppAlert
*/
@Prop() context: any;
/**
* 视图参数
*
* @type {any}
* @memberof AppAlert
*/
@Prop() viewparam: any;
/**
* 视图消息组tag
*
* @type {any}
* @memberof AppAlert
*/
@Prop() infoGroup!: any;
/**
* 视图名称
*
* @type {any}
* @memberof AppAlert
*/
@Prop() viewname!: any;
/** /**
* 视图消息对象 * 视图消息对象
...@@ -79,7 +112,7 @@ export default class AppAlert extends Vue { ...@@ -79,7 +112,7 @@ export default class AppAlert extends Vue {
* @memberof AppAlert * @memberof AppAlert
*/ */
public async getData() { public async getData() {
let response: any = await this.viewMessageService.getViewMessageByTag(this.tag, null, null) let response: any = await this.viewMessageService.getViewMessageByTag(this.tag, this.context, this.viewparam);
if(response && response.length > 0) { if(response && response.length > 0) {
response.forEach((item: any) => { response.forEach((item: any) => {
let tempData: any = JSON.parse(JSON.stringify(item)); let tempData: any = JSON.parse(JSON.stringify(item));
...@@ -118,7 +151,8 @@ export default class AppAlert extends Vue { ...@@ -118,7 +151,8 @@ export default class AppAlert extends Vue {
data.showState = true; data.showState = true;
if(data.closeMode || data.closeMode == 0) { if(data.closeMode || data.closeMode == 0) {
if(data.closeMode == 1) { if(data.closeMode == 1) {
const id = this.$store.getters.getViewMessage(data.codename); const tag = this.viewname + '_' + this.infoGroup + '_' + data.codename;
const id = localStorage.getItem(tag);
if(id) { if(id) {
data.showState = false; data.showState = false;
flag = false; flag = false;
...@@ -182,14 +216,14 @@ export default class AppAlert extends Vue { ...@@ -182,14 +216,14 @@ export default class AppAlert extends Vue {
let tempArr: any[] = data.customClass.toString().split(','); let tempArr: any[] = data.customClass.toString().split(',');
if(tempArr && tempArr.length > 0) { if(tempArr && tempArr.length > 0) {
if(Object.is("1", tempArr[1])) { if(Object.is("1", tempArr[1])) {
const args = { tag: tempArr[0], id: data.customClass }; const tag = this.viewname + '_' + this.infoGroup + '_' + tempArr[0];
this.$store.commit('addViewMessage', args); localStorage.setItem(tag, data.customClass);
} }
} }
} }
if(data.closeMode && data.closeMode == 1) { if(data.closeMode && data.closeMode == 1) {
const args = {tag: data.codename, id: data.id}; const tag = this.viewname + '_' + this.infoGroup + '_' + data.codename;
this.$store.commit('addViewMessage', args); localStorage.setItem(tag,data.id);
} }
} }
......
<template> <template>
<el-breadcrumb class="app-breadcrumb" separator="/"> <el-breadcrumb class="app-breadcrumb" :separator="separator">
<transition-group name="breadcrumb"> <transition-group name="breadcrumb">
<template v-if="Object.is(this.navModel,'route')"> <template v-if="Object.is(this.navModel,'route')">
<el-breadcrumb-item v-for="(item, index) in breadcrumbs" :key="item.id"> <el-breadcrumb-item v-for="(item, index) in breadcrumbs" :key="item.id">
...@@ -34,6 +34,7 @@ ...@@ -34,6 +34,7 @@
import { Component, Vue, Watch, Prop } from 'vue-property-decorator' import { Component, Vue, Watch, Prop } from 'vue-property-decorator'
import { RouteRecord, Route } from 'vue-router' import { RouteRecord, Route } from 'vue-router'
import { Environment } from "@/environments/environment"; import { Environment } from "@/environments/environment";
import { appConfig } from '@/config/appConfig';
import NavDataService from '@/service/app/navdata-service'; import NavDataService from '@/service/app/navdata-service';
import {Subscription } from 'rxjs'; import {Subscription } from 'rxjs';
...@@ -48,6 +49,13 @@ export default class Breadcrumb extends Vue { ...@@ -48,6 +49,13 @@ export default class Breadcrumb extends Vue {
*/ */
private breadcrumbs: Array<any> = []; private breadcrumbs: Array<any> = [];
/**
* 面包屑分隔符
*
* @memberof Breadcrumb
*/
private separator:string = appConfig.breadcrumbSeparator;
/** /**
* 导航服务 * 导航服务
* *
......
...@@ -165,7 +165,7 @@ export default class AppFormGroup extends Vue { ...@@ -165,7 +165,7 @@ export default class AppFormGroup extends Vue {
const _item = ActionModel[key]; const _item = ActionModel[key];
if(_item && _item['dataaccaction'] && UIService){ if(_item && _item['dataaccaction'] && UIService){
let dataActionResult:any; let dataActionResult:any;
if(Object.is(_item['actiontarget'],"NONE")){ if(Object.is(_item['actiontarget'],"NONE") || Object.is(_item['actiontarget'],"")){
dataActionResult = UIService.getResourceOPPrivs(_item['dataaccaction']); dataActionResult = UIService.getResourceOPPrivs(_item['dataaccaction']);
}else{ }else{
if(data && Object.keys(data).length >0){ if(data && Object.keys(data).length >0){
......
...@@ -21,7 +21,7 @@ ...@@ -21,7 +21,7 @@
</ul> </ul>
<!-- 预览 --> <!-- 预览 -->
<modal v-model="dialogVisible" footer-hide width="auto" class-name='app-image-preview-model'> <modal v-model="dialogVisible" footer-hide width="auto" class-name='app-image-preview-model'>
<el-image src="dialogImageUrl"> <el-image :src="dialogImageUrl">
<div slot='error' class='image-slot'> <div slot='error' class='image-slot'>
<img src="/assets/img/picture.png"> <img src="/assets/img/picture.png">
</div> </div>
......
...@@ -49,7 +49,7 @@ ...@@ -49,7 +49,7 @@
</el-upload> </el-upload>
<!-- 预览 --> <!-- 预览 -->
<modal v-model="dialogVisible" footer-hide class-name='app-image-upload-model'> <modal v-model="dialogVisible" footer-hide class-name='app-image-upload-model'>
<el-image src="dialogImageUrl"> <el-image :src="dialogImageUrl">
<div slot='error' class='image-slot'> <div slot='error' class='image-slot'>
<i class='el-icon-picture-outline'></i> <i class='el-icon-picture-outline'></i>
</div> </div>
......
...@@ -65,7 +65,7 @@ export default class AppPicker extends Vue { ...@@ -65,7 +65,7 @@ export default class AppPicker extends Vue {
* 视图上下文 * 视图上下文
* *
* @type {*} * @type {*}
* @memberof AppFormDRUIPart * @memberof AppPicker
*/ */
@Prop() public context!: any; @Prop() public context!: any;
...@@ -73,7 +73,7 @@ export default class AppPicker extends Vue { ...@@ -73,7 +73,7 @@ export default class AppPicker extends Vue {
* 视图参数 * 视图参数
* *
* @type {*} * @type {*}
* @memberof AppFormDRUIPart * @memberof AppPicker
*/ */
@Prop() public viewparams!: any; @Prop() public viewparams!: any;
...@@ -81,15 +81,23 @@ export default class AppPicker extends Vue { ...@@ -81,15 +81,23 @@ export default class AppPicker extends Vue {
* AC参数 * AC参数
* *
* @type {*} * @type {*}
* @memberof AppFormDRUIPart * @memberof AppPicker
*/ */
@Prop({default: () => {}}) public acParams?: any; @Prop({default: () => {}}) public acParams?: any;
/**
* 外键值附加数据
*
* @type {*}
* @memberof AppPicker
*/
@Prop() public pickUpData?: string;
/** /**
* 表单服务 * 表单服务
* *
* @type {*} * @type {*}
* @memberof AppFormDRUIPart * @memberof AppPicker
*/ */
@Prop() public service?: any; @Prop() public service?: any;
...@@ -97,7 +105,7 @@ export default class AppPicker extends Vue { ...@@ -97,7 +105,7 @@ export default class AppPicker extends Vue {
* 应用实体主信息属性名称 * 应用实体主信息属性名称
* *
* @type {string} * @type {string}
* @memberof AppAutocomplete * @memberof AppPicker
*/ */
@Prop({default: 'srfmajortext'}) public deMajorField!: string; @Prop({default: 'srfmajortext'}) public deMajorField!: string;
...@@ -105,7 +113,7 @@ export default class AppPicker extends Vue { ...@@ -105,7 +113,7 @@ export default class AppPicker extends Vue {
* 应用实体主键属性名称 * 应用实体主键属性名称
* *
* @type {string} * @type {string}
* @memberof AppAutocomplete * @memberof AppPicker
*/ */
@Prop({default: 'srfkey'}) public deKeyField!: string; @Prop({default: 'srfkey'}) public deKeyField!: string;
...@@ -240,7 +248,7 @@ export default class AppPicker extends Vue { ...@@ -240,7 +248,7 @@ export default class AppPicker extends Vue {
* 输入状态 * 输入状态
* *
* @type {boolean} * @type {boolean}
* @memberof AppAutocomplete * @memberof AppPicker
*/ */
public inputState: boolean = false; public inputState: boolean = false;
...@@ -397,6 +405,7 @@ export default class AppPicker extends Vue { ...@@ -397,6 +405,7 @@ export default class AppPicker extends Vue {
if (this.name) { if (this.name) {
this.$emit('formitemvaluechange', { name: this.name, value: item[this.deMajorField] }); this.$emit('formitemvaluechange', { name: this.name, value: item[this.deMajorField] });
} }
this.fillPickUpData(item);
} }
/** /**
...@@ -430,6 +439,7 @@ export default class AppPicker extends Vue { ...@@ -430,6 +439,7 @@ export default class AppPicker extends Vue {
if (this.name) { if (this.name) {
this.$emit('formitemvaluechange', { name: this.name, value: '' }); this.$emit('formitemvaluechange', { name: this.name, value: '' });
} }
this.fillPickUpData();
this.$forceUpdate(); this.$forceUpdate();
} }
...@@ -672,6 +682,7 @@ export default class AppPicker extends Vue { ...@@ -672,6 +682,7 @@ export default class AppPicker extends Vue {
if (this.name) { if (this.name) {
this.$emit('formitemvaluechange', { name: this.name, value: item[this.deMajorField]?item[this.deMajorField]:item["srfmajortext"] }); this.$emit('formitemvaluechange', { name: this.name, value: item[this.deMajorField]?item[this.deMajorField]:item["srfmajortext"] });
} }
this.fillPickUpData(item);
} }
} }
...@@ -752,7 +763,7 @@ export default class AppPicker extends Vue { ...@@ -752,7 +763,7 @@ export default class AppPicker extends Vue {
/** /**
* 输入过程中 * 输入过程中
* *
* @memberof AppAutocomplete * @memberof AppPicker
*/ */
public onInput($event: any) { public onInput($event: any) {
if (Object.is($event, this.value)) { if (Object.is($event, this.value)) {
...@@ -783,6 +794,34 @@ export default class AppPicker extends Vue { ...@@ -783,6 +794,34 @@ export default class AppPicker extends Vue {
appPicker.blur(); appPicker.blur();
} }
} }
/**
* 填充外键值附加数据
*
* @param {item} 数据集
* @memberof AppPicker
*/
public fillPickUpData(item?:any){
if(this.pickUpData){
let pickUpDataArray:Array<any> = this.pickUpData.split(";")
if(pickUpDataArray && pickUpDataArray.length >0){
for(let i=0;i<pickUpDataArray.length;i++){
if(item){
this.$emit("formitemvaluechange", {
name: pickUpDataArray[i],
value: item[pickUpDataArray[i]],
});
}else{
this.$emit("formitemvaluechange", {
name: pickUpDataArray[i],
value: "",
});
}
}
}
}
}
} }
......
...@@ -20,10 +20,10 @@ export default class AvueCustomForm extends Vue { ...@@ -20,10 +20,10 @@ export default class AvueCustomForm extends Vue {
/** /**
* 编辑器参数传入组件配置 * 编辑器参数传入组件配置
* *
* @type {any} * @type {*}
* @memberof AvueCustomForm * @memberof AvueCustomForm
*/ */
@Prop() public options?: any; public options: any;
/** /**
* 是否需要转换为string类型 * 是否需要转换为string类型
...@@ -47,7 +47,7 @@ export default class AvueCustomForm extends Vue { ...@@ -47,7 +47,7 @@ export default class AvueCustomForm extends Vue {
* @type {any} * @type {any}
* @memberof AvueCustomForm * @memberof AvueCustomForm
*/ */
@Model('change') public value: any; @Model("change") public value: any;
/** /**
* 是否将表单数据通过组件配置带入组件中 * 是否将表单数据通过组件配置带入组件中
...@@ -57,13 +57,22 @@ export default class AvueCustomForm extends Vue { ...@@ -57,13 +57,22 @@ export default class AvueCustomForm extends Vue {
*/ */
@Prop() public isFormData?: boolean; @Prop() public isFormData?: boolean;
/**
* 是否为子表单
*
* @type {boolean}
* @memberof AvueCustomForm
*/
@Prop() public isSubForm?: boolean;
/** /**
* 表单数据 * 表单数据
* *
* @type {any} * @type {*}
* @memberof AvueCustomForm * @memberof AvueCustomForm
*/ */
@Prop() public formData: any; @Prop()
public formData?: any;
/** /**
* 表单状态 * 表单状态
...@@ -81,10 +90,12 @@ export default class AvueCustomForm extends Vue { ...@@ -81,10 +90,12 @@ export default class AvueCustomForm extends Vue {
*/ */
get formVal() { get formVal() {
let obj: any = {}; let obj: any = {};
if (this.value) { if (this.value) {
if (this.isParseString) obj = JSON.parse(this.value); if (this.isParseString) obj = JSON.parse(this.value);
else obj = this.value; else obj = this.value;
} if (this.isSubForm && obj instanceof Array)
obj = this.loadSubFormData(obj);
}
return obj; return obj;
} }
...@@ -110,7 +121,7 @@ export default class AvueCustomForm extends Vue { ...@@ -110,7 +121,7 @@ export default class AvueCustomForm extends Vue {
/** /**
* 当前组件配置设置属性 * 当前组件配置设置属性
* *
* @type {any} * @type {*}
* @memberof AvueCustomForm * @memberof AvueCustomForm
*/ */
public formOption: any = null; public formOption: any = null;
...@@ -118,7 +129,7 @@ export default class AvueCustomForm extends Vue { ...@@ -118,7 +129,7 @@ export default class AvueCustomForm extends Vue {
/** /**
* avue-form默认配置 * avue-form默认配置
* *
* @type {any} * @type {*}
* @memberof AvueCustomForm * @memberof AvueCustomForm
*/ */
public defaultOptions: any = { public defaultOptions: any = {
...@@ -185,22 +196,26 @@ export default class AvueCustomForm extends Vue { ...@@ -185,22 +196,26 @@ export default class AvueCustomForm extends Vue {
* *
* @memberof AvueCustomForm * @memberof AvueCustomForm
*/ */
public load() { public async load() {
let that: any = this; let that: any = this;
if (!this.options && this.options == null) { if (!this.options && this.options == null) {
if (this.url && this.options == null) { if (this.url && this.options == null) {
const get: Promise<any> = this.$http.get(this.url); const get: Promise<any> = this.$http.get(this.url);
get.then((response: any) => { await get.then((response: any) => {
if (response && response.data) { if (response && response.data) {
that.formOption = response.data; let options: any = response.data;
if (this.isFormData) that.getFormData(); this.transitionDicUrlCondition(options);
that.formOption = options;
if (that.isFormData) that.getFormData();
} }
}); });
} else { } else {
this.transitionDicUrlCondition(this.defaultOptions);
this.formOption = this.defaultOptions; this.formOption = this.defaultOptions;
if (this.isFormData) that.getFormData(); if (this.isFormData) that.getFormData();
} }
} else { } else {
this.transitionDicUrlCondition(this.options);
this.formOption = this.options; this.formOption = this.options;
if (this.isFormData) that.getFormData(); if (this.isFormData) that.getFormData();
} }
...@@ -239,19 +254,78 @@ export default class AvueCustomForm extends Vue { ...@@ -239,19 +254,78 @@ export default class AvueCustomForm extends Vue {
* @memberof AvueCustomForm * @memberof AvueCustomForm
*/ */
public setValue(value: any) { public setValue(value: any) {
if (this.isSubForm) value = this.getSubFormData(value);
if (this.isParseString) this.$emit("change", JSON.stringify(value)); if (this.isParseString) this.$emit("change", JSON.stringify(value));
else this.$emit("change", value); else this.$emit("change", value);
} }
/**
* 提取第一个属性值
*
* @memberof AvueCustomForm
* @return {Array<any>}
*/
public getSubFormData(value: any): Array<any> {
let arr: Array<any> = [];
for (let val in value) {
arr = value[val];
break;
}
return arr;
}
/**
* 加载子表单值
*
* @memberof AvueCustomForm
* @return {*}
*/
public loadSubFormData(arr: Array<any>): any {
let value: any = {};
value[this.formOption.column[0].prop] = arr;
return value;
}
/**
* 配置的下拉列表转换符号支持动态配置
*
* @memberof AvueCustomForm
* @param {*}
*/
public transitionDicUrlCondition(options: any) {
let that: any = this;
let recursive: any = function (obj: any) {
if (obj.column && obj.column.length > 0) {
obj.column.forEach((col: any) => {
if (col.dicUrl && col.dicUrl.indexOf("$") > 0) {
let g = /\${[^+]+}/;
let dicGroup = col.dicUrl.match(g);
dicGroup.forEach((dic: any) => {
col.dicUrl = col.dicUrl.replace(
dic,
that.formData[dic.substring(2, dic.length - 1)]
);
});
}
if (col.children) recursive(col.children);
if (col.group) recursive(col.group);
});
}
if (obj.children) recursive(obj.children);
if (obj.group) recursive(obj.group);
};
recursive(options);
}
/** /**
* 销毁组件(vue生命周期) * 销毁组件(vue生命周期)
* *
* @type {Subject<any>} * @type {Subject<any>}
* @memberof AvueCustomForm * @memberof AvueCustomForm
*/ */
public destroy(){ public destroy() {
if(this.formStateEvent){ if (this.formStateEvent) {
this.formStateEvent.unsubscribe(); this.formStateEvent.unsubscribe();
} }
} }
} }
......
...@@ -12,7 +12,6 @@ ...@@ -12,7 +12,6 @@
:headers="myHeaders" :headers="myHeaders"
:file-list="uploadFileList" :file-list="uploadFileList"
:show-file-list="false" :show-file-list="false"
:limit="limit"
:http-request="customUploadFile"> :http-request="customUploadFile">
<div> <div>
<i class="el-icon-upload"></i> <i class="el-icon-upload"></i>
...@@ -20,7 +19,6 @@ ...@@ -20,7 +19,6 @@
<span>{{$t('components.diskFileUpload.fileDrag')}}</span> <span>{{$t('components.diskFileUpload.fileDrag')}}</span>
<span style="color:#409EFF;">{{$t('components.diskFileUpload.clickUpload')}}</span> <span style="color:#409EFF;">{{$t('components.diskFileUpload.clickUpload')}}</span>
</div> </div>
<div slot="tip" class="el-upload__tip">{{uploadTip}}</div>
</div> </div>
</el-upload> </el-upload>
</el-col> </el-col>
...@@ -34,10 +32,10 @@ ...@@ -34,10 +32,10 @@
:headers="myHeaders" :headers="myHeaders"
:file-list="uploadFileList" :file-list="uploadFileList"
:show-file-list="false" :show-file-list="false"
:limit="limit"
:http-request="customUploadFile"> :http-request="customUploadFile">
<el-button type="primary" size="small" icon="el-icon-upload">{{$t('components.diskFileUpload.clickUpload')}}</el-button> <el-button type="primary" size="small" icon="el-icon-upload">
<div slot="tip" class="el-upload__tip">{{uploadTip}}</div> {{$t('components.diskFileUpload.clickUpload')}}
</el-button>
</el-upload> </el-upload>
</el-col> </el-col>
<!--文件操作--> <!--文件操作-->
...@@ -47,8 +45,11 @@ ...@@ -47,8 +45,11 @@
<span>{{item.name}}</span> <span>{{item.name}}</span>
</div> </div>
<div class="fileMain"> <div class="fileMain">
<el-link type="success" icon="el-icon-download" @click="onDownload(item)">{{$t('components.diskFileUpload.load')}}</el-link> <el-link type="success" icon="el-icon-download" @click="onDownload(item)">
<el-link type="warning" icon="el-icon-view" v-show="showPreview" @click="onPreview(item)">{{$t('components.diskFileUpload.preview')}} {{$t('components.diskFileUpload.load')}}
</el-link>
<el-link type="warning" icon="el-icon-view" v-show="showPreview" @click="onPreview(item)">
{{$t('components.diskFileUpload.preview')}}
</el-link> </el-link>
<el-link type="primary" icon="el-icon-edit" <el-link type="primary" icon="el-icon-edit"
v-show="showEdit && (item.name.match(/^.+\.(doc|DOC|docx|DOCX|wps|WPS|xls|XLS|xlsx|XLSX|ppt|PPT|et|ET)$/))" v-show="showEdit && (item.name.match(/^.+\.(doc|DOC|docx|DOCX|wps|WPS|xls|XLS|xlsx|XLSX|ppt|PPT|et|ET)$/))"
...@@ -58,287 +59,314 @@ ...@@ -58,287 +59,314 @@
v-show="showOcrview && (item.name.match(/^.+\.(gif|GIF|jpg|JPG|jpeg|JPEG|png|PNG|bmp|BMP|pdf|PDF)$/))" v-show="showOcrview && (item.name.match(/^.+\.(gif|GIF|jpg|JPG|jpeg|JPEG|png|PNG|bmp|BMP|pdf|PDF)$/))"
@click="onOcr(item)">OCR @click="onOcr(item)">OCR
</el-link> </el-link>
<el-link type="danger" icon="el-icon-delete" @click="onRemove(item,index)">{{$t('components.diskFileUpload.delete')}}</el-link> <el-link type="danger" icon="el-icon-delete" @click="onRemove(item,index)">
{{$t('components.diskFileUpload.delete')}}
</el-link>
</div> </div>
</el-col> </el-col>
</el-row> </el-row>
<!-- 自定义弹框 -->
<div class="dialogDiv">
<el-dialog
:title="dialogTitle"
center
width="70%"
top="5vh"
:visible="showDialog"
:close-on-click-modal="true"
:show-close="true"
:before-close="dialogClose"
:modal-append-to-body="false">
<div style="height: 100%;">
<iframe id="fileIframe" :src="iframeUrl" frameborder="0" width="100%"></iframe>
</div>
</el-dialog>
</div>
</div> </div>
</template> </template>
<script lang="ts"> <script lang="ts">
import { Component, Vue, Prop, Watch } from 'vue-property-decorator'; import {Component, Vue, Prop, Watch} from 'vue-property-decorator';
import {Button, Row, Col, Link, Icon, Upload, Message, MessageBox} from 'element-ui'; import {Button, Row, Col, Link, Icon, Upload, Message, MessageBox} from 'element-ui';
import Axios from 'axios'; import Axios from 'axios';
import {Subject, Unsubscribable} from 'rxjs'; import {Subject, Unsubscribable} from 'rxjs';
@Component({}) @Component({})
export default class DiskFileUpload extends Vue { export default class DiskFileUpload extends Vue {
/** /**
* 当前表单对象 * 当前表单对象
* *
* @type {*} * @type {*}
* @memberof DiskFileUpload * @memberof DiskFileUpload
*/ */
@Prop() public data!: any; @Prop() public data!: any;
/** /**
* 当前属性名 * 当前属性名
* *
* @type {string} * @type {string}
* @memberof DiskFileUpload * @memberof DiskFileUpload
*/ */
@Prop() public formItemName!: string; @Prop() public formItemName!: string;
/** /**
* 当前属性值 * 当前属性值
* *
* @type {string} * @type {string}
* @memberof DiskFileUpload * @memberof DiskFileUpload
*/ */
@Prop() public value!: string; @Prop() public value!: string;
/** /**
* 当前表单状态 * 当前表单状态
* *
* @type {*} * @type {*}
* @memberof DiskFileUpload * @memberof DiskFileUpload
*/ */
@Prop() public formState!: any; @Prop() public formState!: any;
/** /**
* 默认为当前实体名称,有指定则按表单参数 * 默认为当前实体名称,有指定则按表单参数
* *
* @type {string} * @type {string}
* @memberof DiskFileUpload * @memberof DiskFileUpload
*/ */
@Prop() public folder!: string; @Prop() public folder!: string;
/** /**
* 默认为当前实体主键id,有指定则按表单参数 * 默认为当前实体主键id,有指定则按表单参数
* *
* @type {string} * @type {string}
* @memberof DiskFileUpload * @memberof DiskFileUpload
*/ */
@Prop() public ownerid!: string; @Prop() public ownerid!: string;
/** /**
* 默认为当前属性名,有指定则按表单参数 * 默认为当前属性名,有指定则按表单参数
* *
* @type {string} * @type {string}
* @memberof DiskFileUpload * @memberof DiskFileUpload
*/ */
@Prop() public ownertype!: string; @Prop() public ownertype!: string;
/** /**
* 持久化 * 持久化
* *
* @type {boolean} * @type {boolean}
* @memberof DiskFileUpload * @memberof DiskFileUpload
*/ */
@Prop({default: false}) public persistence?: boolean; @Prop({default: false}) public persistence?: boolean;
/** /**
* 是否显示拖拽区域 * 是否显示拖拽区域
* *
* @type {boolean} * @type {boolean}
* @memberof DiskFileUpload * @memberof DiskFileUpload
*/ */
@Prop({default: false}) public showDrag?: boolean; @Prop({default: false}) public showDrag?: boolean;
/** /**
* 是否显示预览按钮 * 是否显示预览按钮
* *
* @type {boolean} * @type {boolean}
* @memberof DiskFileUpload * @memberof DiskFileUpload
*/ */
@Prop({default: false}) public showPreview?: boolean; @Prop({default: false}) public showPreview?: boolean;
/** /**
* 是否显示在线编辑按钮 * 是否显示在线编辑按钮
* *
* @type {boolean} * @type {boolean}
* @memberof DiskFileUpload * @memberof DiskFileUpload
*/ */
@Prop({default: false}) public showEdit?: boolean; @Prop({default: false}) public showEdit?: boolean;
/** /**
* 是否显示OCR按钮 * 是否显示OCR按钮
* *
* @type {boolean} * @type {boolean}
* @memberof DiskFileUpload * @memberof DiskFileUpload
*/ */
@Prop({default: false}) public showOcrview?: boolean; @Prop({default: false}) public showOcrview?: boolean;
/** /**
* 单文件大小 * 表单是否处于编辑状态(有真实主键,srfuf='1';srfuf='0'时处于新建未保存)
* *
* @type {number} * @type {string}
* @memberof DiskFileUpload * @memberof DiskFileUpload
*/ */
@Prop({default: 1}) public size!: number; public srfuf: string = '0';
/**
* 文件上传个数 /**
* * 文件列表
* @type {number} *
* @memberof DiskFileUpload * @type {Array<any>}
*/ * @memberof DiskFileUpload
@Prop({default: 5}) public limit!: number; */
public uploadFileList: Array<any> = [];
/**
* 表单是否处于编辑状态(有真实主键,srfuf='1';srfuf='0'时处于新建未保存) /**
* * 当前登陆人的token
* @type {string} *
* @memberof DiskFileUpload * @type {string}
*/ * @memberof DiskFileUpload
public srfuf: string = '0'; */
public token: string = "Bearer " + localStorage.getItem('token');
/**
* 上传提示语 /**
* * 上传文件请求头
* @type {string} *
* @memberof DiskFileUpload * @type {*}
*/ * @memberof DiskFileUpload
get uploadTip(): string { */
return this.$t('components.diskFileUpload.clues')+this.size.toString()+"M,"+this.$t('components.diskFileUpload.clues1')+this.limit; public myHeaders: any = {Authorization: this.token};
}
/**
* 表单状态事件
*
* @type {*}
* @memberof DiskFileUpload
*/
public formStateEvent: any | Unsubscribable | undefined;
/**
* 批量更新标识,false为不更新,true才可以更新
*
* @type {boolean}
* @memberof DiskFileUpload
*/
public isUpdateBatch: boolean = true;
/**
* 新建状态标识,true为新建,false为编辑
*
* @type {boolean}
* @memberof DiskFileUpload
*/
public isCreate: boolean = true;
/**
* 自定义弹框标题
*
* @type {*}
* @memberof DiskFileUpload
*/
public dialogTitle: any = '';
/**
* 是否显示自定义弹框
*
* @type {boolean}
* @memberof DiskFileUpload
*/
public showDialog: boolean = false;
/**
* 嵌入自定义弹框中iframe的url
*
* @type {*}
* @memberof DiskFileUpload
*/
public iframeUrl: any = '';
/**
* 关闭自定义弹框
*
* @memberof DiskFileUpload
*/
public dialogClose() {
this.dialogTitle = '';
this.showDialog = false;
this.iframeUrl = '';
let iframe: any = document.getElementById("fileIframe");
iframe.parentNode.removeChild("fileIframe");
}
/** /**
* 文件列表 * 拼接上传路径
* *
* @type {Array<any>} * @memberof DiskFileUpload
* @memberof DiskFileUpload */
*/ public getAction() {
public uploadFileList: Array<any> = []; return '/net-disk/upload/' + this.getFolder() + '?ownertype=' + this.getOwnertype() + '&ownerid=' + this.getOwnerid();
}
/**
* 当前登陆人的token
*
* @type {string}
* @memberof DiskFileUpload
*/
public token: string = "Bearer " + localStorage.getItem('token');
/**
* 上传文件请求头
*
* @type {*}
* @memberof DiskFileUpload
*/
public myHeaders: any = {Authorization: this.token};
/**
* 表单状态事件
*
* @type {*}
* @memberof DiskFileUpload
*/
public formStateEvent: any | Unsubscribable | undefined;
/**
* 批量更新标识,false为不更新,true才可以更新
*
* @type {boolean}
* @memberof DiskFileUpload
*/
public isUpdateBatch: boolean = true;
/**
* 新建状态标识,true为新建,false为编辑
*
* @type {boolean}
* @memberof DiskFileUpload
*/
public isCreate: boolean = true;
/**
* 拼接上传路径
*
* @memberof DiskFileUpload
*/
public getAction() {
const uploadUrl = '/net-disk/upload/' + this.getFolder() + '?ownertype=' + this.getOwnertype() + '&ownerid=' + this.getOwnerid();
return uploadUrl;
}
/** /**
* return folder * return folder
* *
* @memberof DiskFileUpload * @memberof DiskFileUpload
*/ */
public getFolder() { public getFolder() {
const folder = typeof this.folder == "string" ? this.folder : JSON.stringify(this.folder); return typeof this.folder == "string" ? this.folder : JSON.stringify(this.folder);
return folder; }
}
/** /**
* return ownertype * return ownertype
* *
* @memberof DiskFileUpload * @memberof DiskFileUpload
*/ */
public getOwnertype() { public getOwnertype() {
const ownertype = typeof this.ownertype == "string" ? this.ownertype : JSON.stringify(this.ownertype); return typeof this.ownertype == "string" ? this.ownertype : JSON.stringify(this.ownertype);
return ownertype; }
}
/** /**
* return ownerid * return ownerid
* *
* @memberof DiskFileUpload * @memberof DiskFileUpload
*/ */
public getOwnerid() { public getOwnerid() {
const ownerid = typeof this.ownerid == "string" ? this.ownerid : JSON.stringify(this.ownerid); return typeof this.ownerid == "string" ? this.ownerid : JSON.stringify(this.ownerid);
return ownerid; }
}
/** /**
* * vue创建
* *
* @memberof DiskFileUpload * @memberof DiskFileUpload
*/ */
public created(){ public created() {
this.formStateEvent = this.formState.subscribe(($event: any) => { this.formStateEvent = this.formState.subscribe(($event: any) => {
// 表单加载完成 // 表单加载完成
if (Object.is($event.type, 'load')) { if (Object.is($event.type, 'load')) {
const data = JSON.parse(JSON.stringify($event.data)); const data = JSON.parse(JSON.stringify($event.data));
// 编辑表单,保存时不进行批量更新 // 编辑表单,保存时不进行批量更新
if (data.srfuf == '1') { if (data.srfuf == '1') {
this.isCreate = false; this.isCreate = false;
this.isUpdateBatch = false; this.isUpdateBatch = false;
} }
// 当persistence = true时 // 当persistence = true时
if (this.persistence == true) { if (this.persistence == true) {
// 直接从表单的data数据里获取当前属性的值 // 直接从表单的data数据里获取当前属性的值
if (data[this.formItemName] && this.uploadFileList.length == 0) { if (data[this.formItemName] && this.uploadFileList.length == 0) {
const files = JSON.parse(data[this.formItemName]); const files = JSON.parse(data[this.formItemName]);
for (let i = 0; i < files.length; i++) { for (let i = 0; i < files.length; i++) {
this.uploadFileList.push(files[i]); this.uploadFileList.push(files[i]);
}
} }
} else {
// 发送get请求获取文件列表
this.getFiles();
} }
} else {
// 发送get请求获取文件列表
this.getFiles();
} }
} // 表单保存完成
// 表单保存完成 if (Object.is($event.type, 'save')) {
if (Object.is($event.type, 'save')) { // 批量更新文件表中的ownerid
// 批量更新文件表中的ownerid if (this.isUpdateBatch == true && this.uploadFileList.length > 0) {
if (this.isUpdateBatch == true && this.uploadFileList.length > 0) { this.updateFileBatch(this.uploadFileList);
this.updateFileBatch(this.uploadFileList, 'update'); }
} }
} });
}); }
}
/** /**
* 获取文件列表 * 获取文件列表
* *
* @memberof DiskFileUpload * @memberof DiskFileUpload
*/ */
public getFiles(){ public getFiles() {
// 拼接url // 拼接url
let _this:any = this; let _this: any = this;
const getUrl = '/net-disk/files/' + this.getFolder(); const getUrl = '/net-disk/files/' + this.getFolder();
// 发送get请求 // 发送get请求
Axios.get(getUrl, { Axios.get(getUrl, {
...@@ -346,9 +374,9 @@ export default class DiskFileUpload extends Vue { ...@@ -346,9 +374,9 @@ export default class DiskFileUpload extends Vue {
ownertype: this.getOwnertype(), ownertype: this.getOwnertype(),
ownerid: this.getOwnerid(), ownerid: this.getOwnerid(),
}, },
}).then(response => { }).then((response: any) => {
if (!response || response.status != 200) { if (!response || response.status != 200) {
Message.error(_this.$t('components.diskFileUpload.getFileFailure')+'!'); Message.error(_this.$t('components.diskFileUpload.getFileFailure') + '!');
return; return;
} }
// 返回的是一个jsonArray // 返回的是一个jsonArray
...@@ -358,273 +386,317 @@ export default class DiskFileUpload extends Vue { ...@@ -358,273 +386,317 @@ export default class DiskFileUpload extends Vue {
this.uploadFileList.push.apply(this.uploadFileList, files); this.uploadFileList.push.apply(this.uploadFileList, files);
} }
} }
}).catch(error => { }).catch((error: any) => {
Message.error(_this.$t('components.diskFileUpload.getFileFailure')+':'+ error); Message.error(_this.$t('components.diskFileUpload.getFileFailure') + ':' + error);
}); });
} }
/** /**
* 自定义上传文件 * 自定义上传文件
* *
* @param 上传文件 * @param 上传文件
* @memberof DiskFileUpload * @memberof DiskFileUpload
*/ */
public customUploadFile(param: any) { public customUploadFile(param: any) {
// 上传的文件 // 上传的文件
let _this: any = this; let _this: any = this;
let file = param.file; let file = param.file;
// 文件大小 // formData传参
const isSize = file.size / 1024 / 1024 < this.size; let formData = new FormData();
if (!isSize) { formData.append('file', file);
Message.error(_this.$t('components.diskFileUpload.loadFailure1')+_this.size.toString()+"M!"); // 拼接url
return; const uploadUrl = this.getAction();
// 发送post请求
Axios.post(uploadUrl, formData, {timeout: 2000}).then((response: any) => {
if (!response || response.status != 200) {
Message.error(_this.$t('components.diskFileUpload.loadFailure') + '!');
}
// 返回的是一个jsonobject
if (response.data) {
// 新建表单上传,后续需要批量更新操作
if (this.isCreate == true) {
this.isUpdateBatch = true;
}
// 保存到文件列表进行显示
this.uploadFileList.push(response.data);
// persistence=true时需要持久化表单属性
if (this.persistence == true && this.uploadFileList.length > 0) {
const value = JSON.stringify(this.uploadFileList);
this.$emit('formitemvaluechange', {name: this.formItemName, value: value});
}
}
}).catch((error: any) => {
Message.error(_this.$t('components.diskFileUpload.loadFailure') + ':' + error);
})
} }
// formData传参
let formData = new FormData(); /**
formData.append('file', file); * 下载文件
// 拼接url *
const uploadUrl = this.getAction(); * @param item 下载文件
// 发送post请求 * @memberof DiskFileUpload
Axios.post(uploadUrl, formData, {timeout: 2000}).then(response => { */
if (!response || response.status != 200) { public onDownload(item: any) {
Message.error(_this.$t('components.diskFileUpload.loadFailure')+'!'); // 拼接url
} let _this: any = this;
// 返回的是一个jsonobject const id = typeof item.id == "string" ? item.id : JSON.stringify(item.id);
if (response.data) { const name = typeof item.name == "string" ? item.name : JSON.stringify(item.filename);
// 新建表单上传,后续需要批量更新操作 const downloadUrl = '/net-disk/download/' + this.getFolder() + '/' + id + '/' + name;
if (this.isCreate == true) { // 发送get请求
this.isUpdateBatch = true; Axios.get(downloadUrl, {
headers: {
'authcode': item.authcode,
},
responseType: 'arraybuffer',
}).then((response: any) => {
if (!response || response.status != 200) {
Message.error(_this.$t('components.diskFileUpload.downloadFile') + '!');
return;
}
// 请求成功,后台返回的是一个文件流
if (response.data) {
// 获取文件名
const disposition = response.headers['content-disposition'];
const filename = disposition.split('filename=')[1];
// 用blob对象获取文件流
let blob = new Blob([response.data], {type: response.headers['content-type']});
// 通过文件流创建下载链接
var href = URL.createObjectURL(blob);
// 创建一个a元素并设置相关属性
let a = document.createElement('a');
a.href = href;
if (name) {
a.download = name;
} else {
a.download = filename;
}
// 添加a元素到当前网页
document.body.appendChild(a);
// 触发a元素的点击事件,实现下载
a.click();
// 从当前网页移除a元素
document.body.removeChild(a);
// 释放blob对象
URL.revokeObjectURL(href);
} else {
Message.error(_this.$t('components.diskFileUpload.downloadFile1'));
}
}).catch((error: any) => {
Message.error(_this.$t('components.diskFileUpload.downloadFile') + ':' + error);
});
}
/**
* 预览文件
*
* @param item 预览文件
* @memberof DiskFileUpload
*/
public onPreview(item: any) {
// 拼接url
const id = typeof item.id == "string" ? item.id : JSON.stringify(item.id);
const name = typeof item.name == "string" ? item.name : JSON.stringify(item.name);
let previewUrl = '/net-disk/preview/' + this.getFolder() + '/' + id + '/' + name + '?authcode=' + item.authcode;
Axios.get(previewUrl).then((response: any) => {
if (!response || response.status != 200) {
return;
} }
// 保存到文件列表进行显示 // 返回一个url,通过自定义弹框打开
this.uploadFileList.push(response.data); if (response.data) {
// persistence=true时需要持久化表单属性 this.dialogTitle = name;
if (this.persistence == true && this.uploadFileList.length > 0) { this.showDialog = true;
const value = JSON.stringify(this.uploadFileList); this.iframeUrl = response.data;
this.$emit('formitemvaluechange', {name: this.formItemName, value: value});
} }
} }).catch((error: any) => {
}).catch(err => { Message.error(error);
Message.error(_this.$t('components.diskFileUpload.loadFailure')+':'+ err); });
}) }
}
/**
* 编辑文件
*
* @param item
* @memberof DiskFileUpload
*/
public onEdit(item: any) {
// 拼接url
const id = typeof item.id == "string" ? item.id : JSON.stringify(item.id);
const name = typeof item.name == "string" ? item.name : JSON.stringify(item.name);
const editUrl = '/net-disk/editview/' + this.getFolder() + '/' + id + '/' + name + '?authcode=' + item.authcode;
// TODO:暂时用window.open
window.open(editUrl);
}
/** /**
* 下载文件 * ocr识别
* * @param item
* @param item 下载文件 * @memberof DiskFileUpload
* @memberof DiskFileUpload */
*/ public onOcr(item: any) {
public onDownload(item: any) { // 拼接url
// 拼接url const folder = typeof this.folder == "string" ? this.folder : JSON.stringify(this.folder);
let _this: any = this; const id = typeof item.id == "string" ? item.id : JSON.stringify(item.id);
const id = typeof item.id == "string" ? item.id : JSON.stringify(item.id); const name = typeof item.name == "string" ? item.name : JSON.stringify(item.name);
const name = typeof item.name == "string" ? item.name : JSON.stringify(item.filename); const ocrUrl = '/net-disk/ocrview/' + this.getFolder() + '/' + id + '/' + name + '?authcode=' + item.authcode;
const downloadUrl = '/net-disk/download/' + this.getFolder() + '/' + id + '/' + name; Axios.get(ocrUrl).then((response: any) => {
// 发送get请求 if (!response || response.status != 200) {
Axios.get(downloadUrl, { return;
headers: { }
'authcode': item.authcode // 返回一个url,通过自定义弹框打开
}, if (response.data) {
responseType: 'arraybuffer', this.dialogTitle = name;
}).then(response => { this.showDialog = true;
if (!response || response.status != 200) { this.iframeUrl = response.data;
Message.error(_this.$t('components.diskFileUpload.downloadFile')+'!'); }
return; }).catch((error: any) => {
Message.error(error);
});
}
/**
* 删除文件
*
* @param item
* @param index
* @memberof DiskFileUpload
*/
public onRemove(item: any, index: number) {
let _this: any = this;
if (item) {
MessageBox.confirm(_this.$t('components.diskFileUpload.deleteFile'), _this.$t('components.diskFileUpload.deleteFilePrompt'), {
confirmButtonText: _this.$t('components.diskFileUpload.true'),
cancelButtonText: _this.$t('components.diskFileUpload.false'),
type: 'warning'
}).then(() => {
// 拼接url
const deleteUrl = '/net-disk/files/' + item.id;
// 发送delete请求
Axios.delete(deleteUrl).then((response: any) => {
if (!response || response.status != 200) {
Message.error(_this.$t('components.diskFileUpload.deleteFileFailure') + '!');
}
// 从文件列表中删除
this.uploadFileList.splice(index, 1);
// persistence=true时需要持久化表单属性
if (this.persistence == true) {
const value = JSON.stringify(this.uploadFileList);
this.$emit('formitemvaluechange', {name: this.formItemName, value: value});
}
}).catch((error: any) => {
// 提示删除失败
Message.error(_this.$t('components.diskFileUpload.deleteFileFailure') + ':' + error);
});
});
} }
// 请求成功,后台返回的是一个文件流 }
if (response.data) {
// 获取文件名 /**
const disposition = response.headers['content-disposition']; * 批量更新文件表的ownerid
const filename = disposition.split('filename=')[1]; *
// 用blob对象获取文件流 * @memberof DiskFileUpload
var blob = new Blob([response.data], {type: response.headers['content-type']}); */
// 创建下载链接 public updateFileBatch(files: any) {
var href = URL.createObjectURL(blob); let _this: any = this;
// 创建一个a元素并设置相关属性 // 拼接url
var a = document.createElement('a'); const updateUrl = '/net-disk/files/' + this.getFolder() + '?ownertype=' + this.getOwnertype() + "&ownerid=" + this.getOwnerid();
a.href = href; // requestBody参数
a.download = filename; let requestBody = [];
// 添加a元素到当前网页 if (files) {
document.body.appendChild(a); requestBody = files;
// 触发a元素的点击事件,实现下载
a.click();
// 从当前网页移除a元素
document.body.removeChild(a);
// 释放blob对象
URL.revokeObjectURL(href);
} else {
Message.error(_this.$t('components.diskFileUpload.downloadFile1'));
} }
}).catch(error => { // 发送post请求
Message.error(_this.$t('components.diskFileUpload.downloadFile')+':'+ error); Axios.post(updateUrl, requestBody, {
}); headers: {
"Content-Type": "application/json;charset=UTF-8"
},
timeout: 2000
}).then((response: any) => {
if (!response || response.status != 200) {
Message.error(_this.$t('components.diskFileUpload.updateFailure') + '!');
return;
}
}).catch((error: any) => {
Message.error(_this.$t('components.diskFileUpload.updateFailure') + ':' + error);
});
}
}
</script>
<style lang="less">
#file-upload {
width: auto;
height: auto;
border: 0px solid black;
} }
/** #el-row {
* 预览文件 border: 0px solid red;
* width: 400px;
* @param item 预览文件
* @memberof DiskFileUpload
*/
public onPreview(item: any) {
// 拼接url
const id = typeof item.id == "string" ? item.id : JSON.stringify(item.id);
const name = typeof item.name == "string" ? item.name : JSON.stringify(item.name);
const previewUrl = '/net-disk/preview/' + this.getFolder() + '/' + id + '/' + name + '?authcode=' + item.authcode;
// 新窗口打开url
window.open(previewUrl);
} }
/** .withDrag {
* 编辑文件 border: 0px solid grey;
* width: 400px;
* @param item
* @memberof DiskFileUpload
*/
public onEdit(item: any) {
// 拼接url
const id = typeof item.id == "string" ? item.id : JSON.stringify(item.id);
const name = typeof item.name == "string" ? item.name : JSON.stringify(item.name);
const editUrl = '/net-disk/edit/' + this.getFolder() + '/' + id + '/' + name + '?authcode=' + item.authcode;
// 新窗口打开url
window.open(editUrl);
} }
/** .withoutDrag {
* ocr识别 border: 0px solid grey;
* @param item width: 400px;
* @memberof DiskFileUpload text-align: left;
*/ padding-left: 0px;
public onOcr(item: any) { padding-top: 0px;
// 拼接url margin-top: 0px;
const folder = typeof this.folder == "string" ? this.folder : JSON.stringify(this.folder);
const id = typeof item.id == "string" ? item.id : JSON.stringify(item.id);
const name = typeof item.name == "string" ? item.name : JSON.stringify(item.name);
const ocrUrl = '/net-disk/ocrview/' + this.getFolder() + '/' + id + '/' + name + '?authcode=' + item.authcode;
// 新窗口打开url
window.open(ocrUrl);
} }
/** .fileList {
* 删除文件 width: 400px;
* border: 0px solid grey;
* @param item margin-top: 0px;
* @param index }
* @memberof DiskFileUpload
*/ .fileTitle {
public onRemove(item: any, index: number) { text-align: left;
let _this:any = this; margin-left: 0px;
if (item) { }
MessageBox.confirm(_this.$t('components.diskFileUpload.deleteFile'), _this.$t('components.diskFileUpload.deleteFilePrompt'), {
confirmButtonText: _this.$t('components.diskFileUpload.true'), .fileTitle i {
cancelButtonText: _this.$t('components.diskFileUpload.false'), margin-right: 5px;
type: 'warning' }
}).then(() => {
// 拼接url .fileMain {
const deleteUrl = '/net-disk/files/' + item.id; text-align: left;
// 发送delete请求 margin-left: 0px;
Axios.delete(deleteUrl).then(response => { margin-top: -10px;
if (!response || response.status != 200) {
Message.error(_this.$t('components.diskFileUpload.deleteFileFailure')+'!');
}
// 从文件列表中删除
this.uploadFileList.splice(index, 1);
// persistence=true时需要持久化表单属性
if (this.persistence == true) {
const value = JSON.stringify(this.uploadFileList);
this.$emit('formitemvaluechange', {name: this.formItemName, value: value});
}
}).catch(error => {
// 提示删除失败
Message.error(_this.$t('components.diskFileUpload.deleteFileFailure')+':'+ error);
});
});
}
} }
/** .fileMain .el-link:nth-child(n+2) {
* 批量更新文件表的ownerid margin-left: 10px;
* }
* @memberof DiskFileUpload
*/ .dialogDiv {
public updateFileBatch(files: any, opt: any) { // el-dialog头部
let _this:any = this; .el-dialog__header {
// 拼接url height: 40px;
const updateUrl = '/net-disk/files/' + this.getFolder() + '?ownertype=' + this.getOwnertype() + "&ownerid=" + this.getOwnerid(); }
// requestBody参数
let requestBody = []; // el-dialog面板
if (files) { .el-dialog__wrapper {
requestBody = files; height: 90vh;
overflow: visible;
}
// el-dialog
.el-dialog {
height: 100%;
}
// el-dailog内容
.el-dialog__body {
height: inherit;
}
#fileIframe {
height: calc(100% - 40px);
} }
// 发送post请求
Axios.post(updateUrl, requestBody, {
headers: {
"Content-Type": "application/json;charset=UTF-8"
},
timeout: 2000
}).then(response => {
if (!response || response.status != 200) {
Message.error(_this.$t('components.diskFileUpload.updateFailure')+'!');
return;
}
}).catch(error => {
Message.error(_this.$t('components.diskFileUpload.updateFailure')+':'+ error);
});
} }
}
</script>
<style lang="less">
#file-upload {
width: auto;
height: auto;
border: 0px solid black;
}
#el-row {
border: 0px solid red;
width: 400px;
}
.withDrag {
border: 0px solid grey;
width: 400px;
}
.withoutDrag {
border: 0px solid grey;
width: 400px;
text-align: left;
padding-left: 0px;
padding-top: 0px;
margin-top: 0px;
}
.el-upload__tip {
margin-top: 0px;
}
.fileList {
width: 400px;
border: 0px solid grey;
margin-top: 0px;
}
.fileTitle {
text-align: left;
margin-left: 0px;
}
.fileTitle i {
margin-right: 5px;
}
.fileMain {
text-align: left;
margin-left: 0px;
margin-top: -10px;
}
.fileMain .el-link:nth-child(n+2) {
margin-left: 10px;
}
</style> </style>
\ No newline at end of file
...@@ -7,7 +7,6 @@ ...@@ -7,7 +7,6 @@
list-type="picture-card" list-type="picture-card"
:action="getAction()" :action="getAction()"
:headers="myHeaders" :headers="myHeaders"
:limit="limit"
:before-upload="beforeUpload" :before-upload="beforeUpload"
:http-request="customImageUpload"> :http-request="customImageUpload">
<i class="el-icon-plus"></i> <i class="el-icon-plus"></i>
...@@ -15,274 +14,364 @@ ...@@ -15,274 +14,364 @@
<img class="el-upload-list__item-thumbnail" :src="file.url"> <img class="el-upload-list__item-thumbnail" :src="file.url">
<span class="el-upload-list__item-actions"> <span class="el-upload-list__item-actions">
<!--预览按钮--> <!--预览按钮-->
<span class="el-upload-list__item-preview" @click="onPreview(file)" :title="$t('components.diskImageUpload.preview')" <span class="el-upload-list__item-preview" @click="onPreview(file)"
:title="$t('components.diskImageUpload.preview')"
v-show="showPreview"> v-show="showPreview">
<i class="el-icon-view"></i> <i class="el-icon-view"></i>
</span> </span>
<!--OCR按钮--> <!--OCR按钮-->
<span class="el-upload-list__item-delete" @click="onOcr(file)" :title="$t('components.diskImageUpload.OCRdiscern')" <span class="el-upload-list__item-delete" @click="onOcr(file)"
:title="$t('components.diskImageUpload.OCRdiscern')"
v-show="showOcrview && (file.name.match(/^.+\.(gif|GIF|jpg|JPG|jpeg|JPEG|png|PNG|bmp|BMP)$/))"> v-show="showOcrview && (file.name.match(/^.+\.(gif|GIF|jpg|JPG|jpeg|JPEG|png|PNG|bmp|BMP)$/))">
<i class="el-icon-camera"></i> <i class="el-icon-camera"></i>
</span> </span>
<!--下载按钮--> <!--下载按钮-->
<span class="el-upload-list__item-delete" @click="onDownload(file)" :title="$t('components.diskImageUpload.load')"> <span class="el-upload-list__item-delete" @click="onDownload(file)"
:title="$t('components.diskImageUpload.load')">
<i class="el-icon-download"></i> <i class="el-icon-download"></i>
</span> </span>
<!--删除按钮--> <!--删除按钮-->
<span class="el-upload-list__item-delete" @click="onRemove(file)" :title="$t('components.diskImageUpload.delete')"> <span class="el-upload-list__item-delete" @click="onRemove(file)"
:title="$t('components.diskImageUpload.delete')">
<i class="el-icon-delete"></i> <i class="el-icon-delete"></i>
</span> </span>
</span> </span>
</div> </div>
</el-upload> </el-upload>
<!-- 预览弹框 -->
<el-dialog :visible.sync="dialogVisible" :modal="false"> <el-dialog :visible.sync="dialogVisible" :modal="false">
<img width="100%" :src="dialogImageUrl" alt=""> <img width="100%" :src="dialogImageUrl" alt="">
</el-dialog> </el-dialog>
<!-- 自定义弹框 -->
<div class="dialogDiv">
<el-dialog
:title="dialogTitle"
center
width="70%"
top="5vh"
:visible="showDialog"
:close-on-click-modal="true"
:show-close="true"
:before-close="dialogClose"
:modal-append-to-body="false">
<div style="height: 100%;">
<iframe id="fileIframe" :src="iframeUrl" frameborder="0" width="100%"></iframe>
</div>
</el-dialog>
</div>
</div> </div>
</template> </template>
<script lang="ts"> <script lang="ts">
import {Component, Vue, Prop, Watch} from 'vue-property-decorator'; import {Component, Vue, Prop, Watch} from 'vue-property-decorator';
import {Message, MessageBox} from 'element-ui'; import {Message, MessageBox} from 'element-ui';
import Axios from 'axios'; import Axios from 'axios';
import {Subject, Unsubscribable} from 'rxjs'; import {Subject, Unsubscribable} from 'rxjs';
@Component({}) @Component({})
export default class DiskImageUplaod extends Vue { export default class DiskImageUplaod extends Vue {
/** /**
* 当前表单对象 * 当前表单对象
* *
* @type {*} * @type {*}
* @memberof DiskImageUplaod * @memberof DiskImageUplaod
*/ */
@Prop() public data!: any; @Prop() public data!: any;
/** /**
* 当前属性名 * 当前属性名
* *
* @type {string} * @type {string}
* @memberof DiskImageUplaod * @memberof DiskImageUplaod
*/ */
@Prop() public formItemName!: string; @Prop() public formItemName!: string;
/** /**
* 当前属性值 * 当前属性值
* *
* @type {string} * @type {string}
* @memberof DiskImageUplaod * @memberof DiskImageUplaod
*/ */
@Prop() public value!: string; @Prop() public value!: string;
/** /**
* 当前表单状态 * 当前表单状态
* *
* @type {*} * @type {*}
* @memberof DiskImageUplaod * @memberof DiskImageUplaod
*/ */
@Prop() public formState!: any; @Prop() public formState!: any;
/** /**
* 默认为当前实体名称,有指定则按表单参数 * 默认为当前实体名称,有指定则按表单参数
* *
* @type {string} * @type {string}
* @memberof DiskImageUplaod * @memberof DiskImageUplaod
*/ */
@Prop() public folder!: string; @Prop() public folder!: string;
/** /**
* 默认为当前实体主键id,有指定则按表单参数 * 默认为当前实体主键id,有指定则按表单参数
* *
* @type {string} * @type {string}
* @memberof DiskImageUplaod * @memberof DiskImageUplaod
*/ */
@Prop() public ownerid!: string; @Prop() public ownerid!: string;
/** /**
* 默认为当前属性名,有指定则按表单参数 * 默认为当前属性名,有指定则按表单参数
* *
* @type {string} * @type {string}
* @memberof DiskImageUplaod * @memberof DiskImageUplaod
*/ */
@Prop() public ownertype!: string; @Prop() public ownertype!: string;
/** /**
* 持久化 * 持久化
* *
* @type {boolean} * @type {boolean}
* @memberof DiskImageUplaod * @memberof DiskImageUplaod
*/ */
@Prop({default: false}) public persistence?: boolean; @Prop({default: false}) public persistence?: boolean;
/** /**
* 是否显示预览按钮 * 是否显示预览按钮
* *
* @type {boolean} * @type {boolean}
* @memberof DiskImageUplaod * @memberof DiskImageUplaod
*/ */
@Prop({default: false}) public showPreview?: boolean; @Prop({default: false}) public showPreview?: boolean;
/** /**
* 是否显示OCR按钮 * 是否显示OCR按钮
* *
* @type {boolean} * @type {boolean}
* @memberof DiskImageUplaod * @memberof DiskImageUplaod
*/ */
@Prop({default: false}) public showOcrview?: boolean; @Prop({default: false}) public showOcrview?: boolean;
/**
* 单文件大小 /**
* * 表单是否处于编辑状态(有真实主键,srfuf='1';srfuf='0'时处于新建未保存)
* @type {number} *
* @memberof DiskImageUplaod * @type {string}
*/ * @memberof DiskImageUplaod
@Prop({default: 1}) public size!: number; */
public srfuf: string = '0';
/**
* 文件上传个数 /**
* * 图片列表
* @type {number} *
* @memberof DiskImageUplaod * @type {Array<any>}
*/ * @memberof DiskImageUplaod
@Prop({default: 5}) public limit!: number; */
public imageList: Array<any> = [];
/**
* 表单是否处于编辑状态(有真实主键,srfuf='1';srfuf='0'时处于新建未保存) /**
* * 当前登陆人的token
* @type {string} *
* @memberof DiskImageUplaod * @type {string}
*/ * @memberof DiskImageUplaod
public srfuf: string = '0'; */
public token: string = "Bearer " + localStorage.getItem('token');
/**
* 图片列表 /**
* * 上传文件请求头
* @type {Array<any>} *
* @memberof DiskImageUplaod * @type {*}
*/ * @memberof DiskImageUplaod
public imageList: Array<any> = []; */
public myHeaders: any = {Authorization: this.token};
/**
* 当前登陆人的token /**
* * 表单状态事件
* @type {string} *
* @memberof DiskImageUplaod * @type {*}
*/ * @memberof DiskImageUplaod
public token: string = "Bearer " + localStorage.getItem('token'); */
public formStateEvent: any | Unsubscribable | undefined;
/**
* 上传文件请求头 /**
* * 批量更新标识,false为不更新,true才可以更新
* @type {*} *
* @memberof DiskImageUplaod * @type {boolean}
*/ * @memberof DiskImageUplaod
public myHeaders: any = {Authorization: this.token}; */
public isUpdateBatch: boolean = true;
/**
* 表单状态事件 /**
* * 新建状态标识,true为新建,false为编辑
* @type {*} *
* @memberof DiskImageUplaod * @type {boolean}
*/ * @memberof DiskImageUplaod
public formStateEvent: any | Unsubscribable | undefined; */
public isCreate: boolean = true;
/**
* 批量更新标识,false为不更新,true才可以更新 /**
* * 预览弹出框显示标识,true显示,false隐藏
* @type {boolean} *
* @memberof DiskImageUplaod * @type {boolean}
*/ * @memberof DiskImageUplaod
public isUpdateBatch: boolean = true; */
public dialogVisible: boolean = false;
/**
* 新建状态标识,true为新建,false为编辑 /**
* * 预览弹出框中的图片地址
* @type {boolean} *
* @memberof DiskImageUplaod * @type {string}
*/ * @memberof DiskImageUplaod
public isCreate: boolean = true; */
public dialogImageUrl: string = '';
/**
* 预览弹出框显示标识,true显示,false隐藏 /**
* * 存放图片的fileid,用于图片列表定位
* @type {boolean} *
* @memberof DiskImageUplaod * @type {boolean}
*/ * @memberof DiskImageUplaod
public dialogVisible: boolean = false; */
public imageFileids: Array<any> = [];
/**
* 预览弹出框中的图片地址 /**
* * 自定义弹框标题
* @type {string} *
* @memberof DiskImageUplaod * @type {*}
*/ * @memberof DiskImageUplaod
public dialogImageUrl: string = ''; */
public dialogTitle: any = '';
/**
* 存放图片的fileid,用于图片列表定位 /**
* * 是否显示自定义弹框
* @type {boolean} *
* @memberof DiskImageUplaod * @type {boolean}
*/ * @memberof DiskImageUplaod
public imageFileids: Array<any> = []; */
public showDialog: boolean = false;
/**
* 拼接上传路径 /**
* * 嵌入自定义弹框中iframe的url
* @memberof DiskImageUplaod *
*/ * @type {*}
public getAction() { * @memberof DiskImageUplaod
return '/net-disk/upload/' + this.getFolder() + '?ownertype=' + this.getOwnertype() + '&ownerid=' + this.getOwnerid(); */
} public iframeUrl: any = '';
/**
* 关闭自定义弹框
*
* @memberof DiskImageUplaod
*/
public dialogClose() {
this.dialogTitle = '';
this.showDialog = false;
this.iframeUrl = '';
let iframe: any = document.getElementById("fileIframe");
iframe.parentNode.removeChild("fileIframe");
}
/** /**
* return folder * 拼接上传路径
* *
* @memberof DiskImageUplaod * @memberof DiskImageUplaod
*/ */
public getFolder() { public getAction() {
return typeof this.folder == "string" ? this.folder : JSON.stringify(this.folder); return '/net-disk/upload/' + this.getFolder() + '?ownertype=' + this.getOwnertype() + '&ownerid=' + this.getOwnerid();
} }
/** /**
* return ownertype * return folder
* *
* @memberof DiskImageUplaod * @memberof DiskImageUplaod
*/ */
public getOwnertype() { public getFolder() {
return typeof this.ownertype == "string" ? this.ownertype : JSON.stringify(this.ownertype); return typeof this.folder == "string" ? this.folder : JSON.stringify(this.folder);
} }
/** /**
* return ownerid * return ownertype
* *
* @memberof DiskImageUplaod * @memberof DiskImageUplaod
*/ */
public getOwnerid() { public getOwnertype() {
return typeof this.ownerid == "string" ? this.ownerid : JSON.stringify(this.ownerid); return typeof this.ownertype == "string" ? this.ownertype : JSON.stringify(this.ownertype);
} }
/**
* return ownerid
*
* @memberof DiskImageUplaod
*/
public getOwnerid() {
return typeof this.ownerid == "string" ? this.ownerid : JSON.stringify(this.ownerid);
}
/** /**
* vue生命周期create * vue创建
* *
* @memberof DiskImageUplaod * @memberof DiskImageUplaod
*/ */
public created() { public created() {
this.formStateEvent = this.formState.subscribe(($event: any) => { this.formStateEvent = this.formState.subscribe(($event: any) => {
// 表单加载完成 // 表单加载完成
if (Object.is($event.type, 'load')) { if (Object.is($event.type, 'load')) {
const data = JSON.parse(JSON.stringify($event.data)); const data = JSON.parse(JSON.stringify($event.data));
// 编辑表单,保存时不进行批量更新 // 编辑表单,保存时不进行批量更新
if (data.srfuf == '1') { if (data.srfuf == '1') {
this.isCreate = false; this.isCreate = false;
this.isUpdateBatch = false; this.isUpdateBatch = false;
}
// 当persistence = true时,表单持久化
if (this.persistence == true) {
// 直接从表单的data数据里获取当前属性的值
if (data[this.formItemName] && this.imageList.length == 0) {
const files = JSON.parse(data[this.formItemName]);
files.forEach((item: any, i: number) => {
// 图片列表显示缩略图需要获取真实的图片信息
if (item.id && item.name) {
this.getRealImageData(item);
}
});
}
} else {
// 发送get请求获取图片列表
this.getFiles();
}
} }
// 当persistence = true时,表单持久化 // 表单保存完成
if (this.persistence == true) { if (Object.is($event.type, 'save')) {
// 直接从表单的data数据里获取当前属性的值 // 批量更新文件表中的ownerid
if (data[this.formItemName] && this.imageList.length == 0) { if (this.isUpdateBatch == true && this.imageList.length > 0) {
const files = JSON.parse(data[this.formItemName]); this.updateFileBatch(this.imageList);
}
}
});
}
/**
* 获取图片列表
*
* @memberof DiskImageUplaod
*/
public getFiles() {
// 拼接url
let _this: any = this;
const getUrl = '/net-disk/files/' + this.getFolder();
// 发送get请求
Axios.get(getUrl, {
params: {
ownertype: this.getOwnertype(),
ownerid: this.getOwnerid(),
},
}).then((response: any) => {
if (!response || response.status != 200) {
Message.error(_this.$t('components.diskImageUpload.getImageFailure') + "!");
return;
}
// 返回的是一个jsonArray
if (response.data) {
const files = JSON.parse(JSON.stringify(response.data));
if (this.imageList.length == 0) {
files.forEach((item: any, i: number) => { files.forEach((item: any, i: number) => {
// 图片列表显示缩略图需要获取真实的图片信息 // 图片列表显示缩略图需要获取真实的图片信息
if (item.id && item.name) { if (item.id && item.name) {
...@@ -290,358 +379,347 @@ export default class DiskImageUplaod extends Vue { ...@@ -290,358 +379,347 @@ export default class DiskImageUplaod extends Vue {
} }
}); });
} }
} else {
// 发送get请求获取图片列表
this.getFiles();
} }
} }).catch((error: any) => {
// 表单保存完成 Message.error(_this.$t('components.diskImageUpload.getImageFailure') + ':' + error);
if (Object.is($event.type, 'save')) { });
// 批量更新文件表中的ownerid }
if (this.isUpdateBatch == true && this.imageList.length > 0) {
this.updateFileBatch(this.imageList); /**
* 获取真实的图片信息
* @param file
* @memberof DiskImageUplaod
*/
public getRealImageData(file: any) {
let fileData = file;
let _this: any = this;
// 拼接url,与下载一致
const downloadUrl = '/net-disk/download/' + this.getFolder() + '/' + fileData.id + '/' + fileData.name;
// 发送get请求
Axios.get(downloadUrl, {
headers: {
'authcode': fileData.authcode
},
responseType: 'blob',
}).then((response: any) => {
if (!response || response.status != 200) {
Message.error(_this.$t('components.diskImageUpload.loadImageFailure') + '!');
} }
} // 请求成功,后台返回的是一个文件流
}); if (response.data) {
} // 用blob对象获取文件流
var blob = new Blob([response.data], {type: response.headers['content-type']});
// 通过文件流创建下载链接
var href = URL.createObjectURL(blob);
// 将下载链接保存到图片中
fileData.url = href;
// 保存图片fileid
if (fileData.fileid) {
this.imageFileids.push(fileData.fileid);
} else if (fileData.id) {
this.imageFileids.push(fileData.id);
} else {
Message.error(_this.$t('components.diskImageUpload.ImageIdNone'));
return;
}
// 保存图片到图片列表进行显示
this.imageList.push(fileData);
} else {
Message.error(_this.$t('components.diskImageUpload.loadImageFailure1'));
}
}).catch((error: any) => {
Message.error(_this.$t('components.diskImageUpload.loadImageFailure') + ':' + error);
});
}
/** /**
* 获取图片列表 * 上传之前
* * @param file
* @memberof DiskImageUplaod * @memberof DiskImageUplaod
*/ */
public getFiles() { public beforeUpload(file: any) {
// 拼接url // 支持上传的图片格式
let _this:any = this; let _this: any = this;
const getUrl = '/net-disk/files/' + this.getFolder(); if (!file.name.match(/^.+\.(gif|GIF|jpg|JPG|jpeg|JPEG|png|PNG|bmp|BMP)$/)) {
// 发送get请求 Message.error(_this.$t('components.diskImageUpload.uploadImageFailure1'));
Axios.get(getUrl, { return false;
params: {
ownertype: this.getOwnertype(),
ownerid: this.getOwnerid(),
},
}).then(response => {
if (!response || response.status != 200) {
Message.error(_this.$t('components.diskImageUpload.getImageFailure')+"!");
return;
} }
// 返回的是一个jsonArray }
if (response.data) {
const files = JSON.parse(JSON.stringify(response.data)); /**
if (this.imageList.length == 0) { * 自定义图片上传
files.forEach((item: any, i: number) => { * @param param
// 图片列表显示缩略图需要获取真实的图片信息 * @memberof DiskImageUplaod
if (item.id && item.name) { */
this.getRealImageData(item); public customImageUpload(param: any) {
let _this: any = this;
// 上传的文件
let file = param.file;
// formData传参
let formData = new FormData();
formData.append('file', file);
// 拼接url
const uploadUrl = this.getAction();
// 发送post请求
Axios.post(uploadUrl, formData, {timeout: 2000}).then((response: any) => {
if (!response || response.status != 200) {
Message.error(_this.$t('components.diskImageUpload.uploadImageFailure') + "!");
}
// 返回的是一个jsonobject
if (response.data) {
let returnData = response.data;
// 拼接缩略图下载url
const downloadUrl = '/net-disk/download/' + this.getFolder() + '/' + returnData.id + '/' + returnData.name;
// 发送get请求
Axios.get(downloadUrl, {
headers: {
'authcode': returnData.authcode
},
responseType: 'blob',
}).then((response2) => {
if (!response2 || response2.status != 200) {
Message.error(_this.$t('components.diskImageUpload.loadImageFailure') + "!");
return;
} }
// 请求成功,后台返回的是一个文件流
if (response2.data) {
// 用blob对象获取文件流
var blob = new Blob([response2.data], {type: response2.headers['content-type']});
// 通过文件流创建下载链接
var href = URL.createObjectURL(blob);
// 将下载链接保存到本次上传成功后返回的jsonobject中
returnData.url = href;
// 保存jsonobject中的图片fileid
if (returnData.fileid) {
this.imageFileids.push(returnData.fileid);
} else if (returnData.id) {
this.imageFileids.push(returnData.id);
} else {
Message.error(_this.$t('components.diskImageUpload.ImageIdNone'));
return;
}
// 保存jsonobject到图片列表进行显示
this.imageList.push(returnData);
// 新建表单上传时,后续需要批量更新操作
if (this.isCreate == true) {
this.isUpdateBatch = true;
}
// persistence=true时,需要持久化表单属性
if (this.persistence == true && this.imageList.length > 0) {
const value = JSON.stringify(this.imageList);
this.$emit('formitemvaluechange', {name: this.formItemName, value: value});
}
} else {
Message.error(_this.$t('components.diskImageUpload.loadImageFailure1'));
}
}).catch((error2: any) => {
Message.error(_this.$t('components.diskImageUpload.loadImageFailure') + ':' + error2);
}); });
} }
} }).catch((error: any) => {
}).catch(error => { Message.error(_this.$t('components.diskImageUpload.uploadImageFailure') + ':' + error);
Message.error(_this.$t('components.diskImageUpload.getImageFailure')+':'+ error); });
}); }
}
/**
* 获取真实的图片信息 /**
* @param file * 预览
* @memberof DiskImageUplaod * @param file
*/ * @memberof DiskImageUplaod
public getRealImageData(file: any) { */
let fileData = file; public onPreview(file: any) {
let _this: any = this; let _this: any = this;
// 拼接url,与下载一致 if (file.url) {
const downloadUrl = '/net-disk/download/' + this.getFolder() + '/' + fileData.id + '/' + fileData.name; this.dialogImageUrl = file.url;
// 发送get请求 this.dialogVisible = true;
Axios.get(downloadUrl, {
headers: {
'authcode': fileData.authcode
},
responseType: 'blob',
}).then(res => {
if (!res || res.status != 200) {
Message.error(_this.$t('components.diskImageUpload.loadImageFailure')+'!');
}
// 请求成功,后台返回的是一个文件流
if (res.data) {
// 用blob对象获取文件流
var blob = new Blob([res.data], {type: res.headers['content-type']});
// 通过文件流创建下载链接
var href = URL.createObjectURL(blob);
// 将下载链接保存到图片中
fileData.url = href;
// 保存图片fileid
if (fileData.fileid) {
this.imageFileids.push(fileData.fileid);
} else if (fileData.id) {
this.imageFileids.push(fileData.id);
} else {
Message.error(_this.$t('components.diskImageUpload.ImageIdNone'));
return;
}
// 保存图片到图片列表进行显示
this.imageList.push(fileData);
} else { } else {
Message.error(_this.$t('components.diskImageUpload.loadImageFailure1')); Message.error(_this.$t('components.diskImageUpload.notImageUrl'));
} }
}).catch(error => {
Message.error(_this.$t('components.diskImageUpload.loadImageFailure')+':' + error);
});
}
/**
* 上传之前
* @param file
* @memberof DiskImageUplaod
*/
public beforeUpload(file: any) {
// 支持上传的图片格式
let _this: any = this;
if (!file.name.match(/^.+\.(gif|GIF|jpg|JPG|jpeg|JPEG|png|PNG|bmp|BMP)$/)) {
Message.error(_this.$t('components.diskImageUpload.uploadImageFailure1'));
return false;
} }
// 文件大小
const isSize = file.size / 1024 / 1024 < this.size; /**
if (!isSize) { * Ocr识别
Message.error(_this.$t('components.diskImageUpload.uploadFailure')+this.size.toString()+"M!"); * @param file
return false; * @memberof DiskImageUplaod
*/
public onOcr(file: any) {
// 拼接url
const id = typeof file.id == "string" ? file.id : JSON.stringify(file.id);
const name = typeof file.name == "string" ? file.name : JSON.stringify(file.name);
const ocrUrl = '/net-disk/ocrview/' + this.getFolder() + '/' + id + '/' + name + '?authcode=' + file.authcode;
Axios.get(ocrUrl).then((response: any) => {
if (!response || response.status != 200) {
return;
}
// 返回一个url,通过自定义弹框打开
if (response.data) {
this.dialogTitle = name;
this.showDialog = true;
this.iframeUrl = response.data;
}
}).catch((error: any) => {
Message.error(error);
});
} }
}
/** /**
* 自定义图片上传 * 下载
* @param param * @param file
* @memberof DiskImageUplaod * @memberof DiskImageUplaod
*/ */
public customImageUpload(param: any) { public onDownload(file: any) {
let _this: any = this; // 拼接url
// 上传的文件 let _this: any = this;
let file = param.file; const id = typeof file.id == "string" ? file.id : JSON.stringify(file.id);
// formData传参 const name = typeof file.name == "string" ? file.name : JSON.stringify(file.filename);
let formData = new FormData(); const downloadUrl = '/net-disk/download/' + this.getFolder() + '/' + id + '/' + name;
formData.append('file', file); // 发送get请求
// 拼接url Axios.get(downloadUrl, {
const uploadUrl = this.getAction(); headers: {
// 发送post请求 'authcode': file.authcode
Axios.post(uploadUrl, formData, {timeout: 2000}).then(response => { },
if (!response || response.status != 200) { responseType: 'blob',
Message.error(_this.$t('components.diskImageUpload.uploadImageFailure')+"!"); }).then((response: any) => {
} if (!response || response.status != 200) {
// 返回的是一个jsonobject Message.error(_this.$t('components.diskImageUpload.loadImageFailure2') + '!');
if (response.data) { return;
let returnData = response.data; }
// 拼接缩略图下载url // 请求成功,后台返回的是一个文件流
const downloadUrl = '/net-disk/download/' + this.getFolder() + '/' + returnData.id + '/' + returnData.name; if (response.data) {
// 发送get请求 // 获取文件名
Axios.get(downloadUrl, { const disposition = response.headers['content-disposition'];
headers: { const filename = disposition.split('filename=')[1];
'authcode': returnData.authcode // 用blob对象获取文件流
}, var blob = new Blob([response.data], {type: response.headers['content-type']});
responseType: 'blob', // 通过文件流创建下载链接
}).then(res => { var href = URL.createObjectURL(blob);
if (!res || res.status != 200) { // 创建一个a元素并设置相关属性
Message.error(_this.$t('components.diskImageUpload.loadImageFailure')+"!"); var a = document.createElement('a');
return; a.href = href;
} if (name) {
// 请求成功,后台返回的是一个文件流 a.download = name;
if (res.data) {
// 用blob对象获取文件流
var blob = new Blob([res.data], {type: res.headers['content-type']});
// 通过文件流创建下载链接
var href = URL.createObjectURL(blob);
// 将下载链接保存到本次上传成功后返回的jsonobject中
returnData.url = href;
// 保存jsonobject中的图片fileid
if (returnData.fileid) {
this.imageFileids.push(returnData.fileid);
} else if (returnData.id) {
this.imageFileids.push(returnData.id);
} else {
Message.error(_this.$t('components.diskImageUpload.ImageIdNone'));
return;
}
// 保存jsonobject到图片列表进行显示
this.imageList.push(returnData);
// 新建表单上传时,后续需要批量更新操作
if (this.isCreate == true) {
this.isUpdateBatch = true;
}
// persistence=true时,需要持久化表单属性
if (this.persistence == true && this.imageList.length > 0) {
const value = JSON.stringify(this.imageList);
this.$emit('formitemvaluechange', {name: this.formItemName, value: value});
}
} else { } else {
Message.error(_this.$t('components.diskImageUpload.loadImageFailure1')); a.download = filename;
} }
}).catch(error => { // 添加a元素到当前网页
Message.error(_this.$t('components.diskImageUpload.loadImageFailure')+':' + error); document.body.appendChild(a);
}); // 触发a元素的点击事件,实现下载
} a.click();
}).catch(err => { // 下载完成,从当前网页移除a元素
Message.error(_this.$t('components.diskImageUpload.uploadImageFailure')+':' + err); document.body.removeChild(a);
}); // 释放blob对象
} URL.revokeObjectURL(href);
} else {
Message.error(_this.$t('components.diskImageUpload.loadImageFailure3'));
/** }
* 预览 }).catch((error: any) => {
* @param file Message.error(_this.$t('components.diskImageUpload.loadImageFailure2') + ':' + error);
* @memberof DiskImageUplaod });
*/
public onPreview(file: any) {
let _this: any = this;
if (file.url) {
this.dialogImageUrl = file.url;
this.dialogVisible = true;
} else {
Message.error(_this.$t('components.diskImageUpload.notImageUrl'));
} }
}
/**
* Ocr识别
* @param file
* @memberof DiskImageUplaod
*/
public onOcr(file: any) {
// 拼接url
const id = typeof file.id == "string" ? file.id : JSON.stringify(file.id);
const name = typeof file.name == "string" ? file.name : JSON.stringify(file.name);
const ocrUrl = '/net-disk/ocrview/' + this.getFolder() + '/' + id + '/' + name + '?authcode=' + file.authcode;
// 新窗口打开url
window.open(ocrUrl);
}
/** /**
* 下载 * 删除
* @param file * @param file
* @memberof DiskImageUplaod * @memberof DiskImageUplaod
*/ */
public onDownload(file: any) { public onRemove(file: any) {
// 拼接url let _this: any = this;
let _this: any = this; if (file) {
const id = typeof file.id == "string" ? file.id : JSON.stringify(file.id); MessageBox.confirm(_this.$t('components.diskImageUpload.deleteFile'), _this.$t('components.diskImageUpload.deleteFilePrompt'), {
const name = typeof file.name == "string" ? file.name : JSON.stringify(file.filename); confirmButtonText: _this.$t('components.diskImageUpload.true'),
const downloadUrl = '/net-disk/download/' + this.getFolder() + '/' + id + '/' + name; cancelButtonText: _this.$t('components.diskImageUpload.false'),
// 发送get请求 type: 'warning'
Axios.get(downloadUrl, { }).then(() => {
headers: { if (this.imageFileids.indexOf(file.id) != -1) {
'authcode': file.authcode // 要删除的图片在图片列表中的下标
}, const index = this.imageFileids.indexOf(file.id);
responseType: 'blob', // 拼接url
}).then(response => { const deleteUrl = '/net-disk/files/' + file.id;
if (!response || response.status != 200) { // 发送delete请求
Message.error(_this.$t('components.diskImageUpload.loadImageFailure2')+'!'); Axios.delete(deleteUrl).then((response: any) => {
return; if (!response || response.status != 200) {
} Message.error(_this.$t('components.diskImageUpload.deleteImageFailure') + '!');
// 请求成功,后台返回的是一个文件流 }
if (response.data) { // 从fileid数组中删除
// 获取文件名 this.imageFileids.splice(index, 1);
const disposition = response.headers['content-disposition']; // 从图片列表中删除
const filename = disposition.split('filename=')[1]; this.imageList.splice(index, 1);
// 用blob对象获取文件流 // persistence=true,时需要持久化表单属性
var blob = new Blob([response.data], {type: response.headers['content-type']}); if (this.persistence == true) {
// 通过文件流创建下载链接 const value = JSON.stringify(this.imageList);
var href = URL.createObjectURL(blob); this.$emit('formitemvaluechange', {name: this.formItemName, value: value});
// 创建一个a元素并设置相关属性 }
var a = document.createElement('a'); }).catch((error: any) => {
a.href = href; // 提示删除失败
a.download = filename; Message.error(_this.$t('components.diskImageUpload.deleteImageFailure') + ':' + error);
// 添加a元素到当前网页 });
document.body.appendChild(a); }
// 触发a元素的点击事件,实现下载 });
a.click();
// 下载完成,从当前网页移除a元素
document.body.removeChild(a);
// 释放blob对象
URL.revokeObjectURL(href);
} else {
Message.error(_this.$t('components.diskImageUpload.loadImageFailure3'));
} }
}).catch(error => { }
Message.error(_this.$t('components.diskImageUpload.loadImageFailure2')+':' + error);
});
}
/** /**
* 删除 * 批量更新文件表的ownerid
* @param file * @param files
* @memberof DiskImageUplaod * @memberof DiskImageUplaod
*/ */
public onRemove(file: any) { public updateFileBatch(files: any) {
let _this: any = this; let _this: any = this;
if (file) { // 拼接url
MessageBox.confirm(_this.$t('components.diskImageUpload.deleteFile'),_this.$t('components.diskImageUpload.deleteFilePrompt'), { const updateUrl = '/net-disk/files/' + this.getFolder() + '?ownertype=' + this.getOwnertype() + "&ownerid=" + this.getOwnerid();
confirmButtonText: _this.$t('components.diskImageUpload.true'), // requestBody参数
cancelButtonText: _this.$t('components.diskImageUpload.false'), let requestBody = [];
type: 'warning' if (files) {
}).then(() => { requestBody = files;
if (this.imageFileids.indexOf(file.id) != -1) { }
// 要删除的图片在图片列表中的下标 // 发送post请求
const index = this.imageFileids.indexOf(file.id); Axios.post(updateUrl, requestBody, {
// 拼接url headers: {
const deleteUrl = '/net-disk/files/' + file.id; "Content-Type": "application/json;charset=UTF-8"
// 发送delete请求 },
Axios.delete(deleteUrl).then(response => { timeout: 2000
if (!response || response.status != 200) { }).then((response: any) => {
Message.error(_this.$t('components.diskImageUpload.deleteImageFailure')+'!'); if (!response || response.status != 200) {
} Message.error(_this.$t('components.diskImageUpload.updateFailure') + '!');
// 从fileid数组中删除 return;
this.imageFileids.splice(index, 1);
// 从图片列表中删除
this.imageList.splice(index, 1);
// persistence=true,时需要持久化表单属性
if (this.persistence == true) {
const value = JSON.stringify(this.imageList);
this.$emit('formitemvaluechange', {name: this.formItemName, value: value});
}
}).catch(error => {
// 提示删除失败
Message.error(_this.$t('components.diskImageUpload.deleteImageFailure')+':' + error);
});
} }
}).catch((error: any) => {
Message.error(_this.$t('components.diskImageUpload.updateFailure') + ':' + error);
}); });
} }
}
/**
* 批量更新文件表的ownerid
* @param files
* @memberof DiskImageUplaod
*/
public updateFileBatch(files: any) {
let _this: any = this;
// 拼接url
const updateUrl = '/net-disk/files/' + this.getFolder() + '?ownertype=' + this.getOwnertype() + "&ownerid=" + this.getOwnerid();
// requestBody参数
let requestBody = [];
if (files) {
requestBody = files;
}
// 发送post请求
Axios.post(updateUrl, requestBody, {
headers: {
"Content-Type": "application/json;charset=UTF-8"
},
timeout: 2000
}).then(response => {
if (!response || response.status != 200) {
Message.error(_this.$t('components.diskImageUpload.updateFailure')+'!');
return;
}
}).catch(error => {
Message.error(_this.$t('components.diskImageUpload.updateFailure')+':' + error);
});
} }
</script>
<style lang="less">
.dialogDiv {
// el-dialog头部
.el-dialog__header {
height: 40px;
}
} // el-dialog面板
</script> .el-dialog__wrapper {
height: 90vh;
overflow: visible;
}
// el-dialog
.el-dialog {
height: 100%;
}
<style scoped> // el-dailog内容
.el-dialog__body {
height: inherit;
}
// iframe
#fileIframe {
height: calc(100% - 40px);
}
}
</style> </style>
\ No newline at end of file
...@@ -35,5 +35,7 @@ export const appConfig = { ...@@ -35,5 +35,7 @@ export const appConfig = {
label: 'YouYuan', label: 'YouYuan',
value: 'YouYuan', value: 'YouYuan',
}, },
] ],
// 面包屑分隔符
breadcrumbSeparator:"/"
} }
\ No newline at end of file
...@@ -401,10 +401,10 @@ export default class MDViewEngine extends ViewEngine { ...@@ -401,10 +401,10 @@ export default class MDViewEngine extends ViewEngine {
if (this.view.viewparams && Object.keys(this.view.viewparams).length > 0) { if (this.view.viewparams && Object.keys(this.view.viewparams).length > 0) {
Object.assign(arg, this.view.viewparams); Object.assign(arg, this.view.viewparams);
} }
if (this.getSearchForm() && this.view.isExpandSearchForm) { if (this.getSearchForm()) {
Object.assign(arg, this.getSearchForm().getData()); Object.assign(arg, this.getSearchForm().getData());
} }
if (this.view && this.view.$refs.searchbar && this.view.isExpandSearchForm) { if (this.view && this.view.$refs.searchbar) {
Object.assign(arg, this.view.$refs.searchbar.getData()); Object.assign(arg, this.view.$refs.searchbar.getData());
} }
if (this.view && !this.view.isExpandSearchForm) { if (this.view && !this.view.isExpandSearchForm) {
......
...@@ -194,7 +194,7 @@ export default class ViewEngine { ...@@ -194,7 +194,7 @@ export default class ViewEngine {
const _item = _this.view.toolBarModels[key]; const _item = _this.view.toolBarModels[key];
if(_item && _item['dataaccaction'] && _this.view.appUIService){ if(_item && _item['dataaccaction'] && _this.view.appUIService){
let dataActionResult:any; let dataActionResult:any;
if (_item.uiaction && (Object.is(_item.uiaction.target, 'NONE'))){ if (_item.uiaction && (Object.is(_item.uiaction.target, "NONE") || Object.is(_item.uiaction.target, ""))){
dataActionResult = _this.view.appUIService.getResourceOPPrivs(_item['dataaccaction']); dataActionResult = _this.view.appUIService.getResourceOPPrivs(_item['dataaccaction']);
}else{ }else{
if(data && Object.keys(data).length >0){ if(data && Object.keys(data).length >0){
......
...@@ -78,7 +78,11 @@ export default class WizardViewEngine extends ViewEngine { ...@@ -78,7 +78,11 @@ export default class WizardViewEngine extends ViewEngine {
*/ */
public onfinish(args: any): void { public onfinish(args: any): void {
this.view.$emit('viewdataschange', [args]); this.view.$emit('viewdataschange', [args]);
this.view.$emit('close', null); if(!this.view.viewDefaultUsage){
this.view.$emit('close', null);
}else{
this.view.$tabPageExp.onClose(this.view.$route.fullPath);
}
} }
/** /**
......
...@@ -25,6 +25,8 @@ export const Environment = { ...@@ -25,6 +25,8 @@ export const Environment = {
devMode: true, devMode: true,
// 是否开启权限认证 // 是否开启权限认证
enablePermissionValid:false, enablePermissionValid:false,
// 菜单权限模式,可选值:RT(RT模式),RESOURCE(资源模式),MINIX(混合模式),默认MINIX
menuPermissionMode:"MINIX",
// 项目模板地址 // 项目模板地址
ProjectUrl: "http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7", ProjectUrl: "http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7",
// 打开目标工具,可选参数:sln、mos // 打开目标工具,可选参数:sln、mos
......
...@@ -201,7 +201,7 @@ export default class ViewMessageService { ...@@ -201,7 +201,7 @@ export default class ViewMessageService {
public async getViewMessageByTag(tag:string,context:any = {},viewparam:any = {}){ public async getViewMessageByTag(tag:string,context:any = {},viewparam:any = {}){
let messageService:any = await this.getService(tag); let messageService:any = await this.getService(tag);
if(messageService.dynamicMode && Object.is(messageService.dynamicMode,"STATIC")){ if(messageService.dynamicMode && Object.is(messageService.dynamicMode,"STATIC")){
return messageService.getStaticViewMessage(); return messageService.getStaticViewMessage(context,viewparam);
}else{ }else{
return messageService.getDynamicViewMessage(tag,messageService,context,viewparam); return messageService.getDynamicViewMessage(tag,messageService,context,viewparam);
} }
...@@ -209,10 +209,15 @@ export default class ViewMessageService { ...@@ -209,10 +209,15 @@ export default class ViewMessageService {
/** /**
* 转化消息模板标题和内容 * 转化消息模板标题和内容
*
* @target {*} target 返回目标数据
* @param {*} context 应用上下文
* @param {*} viewparam 视图参数
* @param {*} item 源数据
* *
* @memberof ViewMessageService * @memberof ViewMessageService
*/ */
public translateMessageTemp(target:any,item?:any){ public translateMessageTemp(target:any,context:any,viewparam:any,item?:any){
} }
...@@ -221,7 +226,7 @@ export default class ViewMessageService { ...@@ -221,7 +226,7 @@ export default class ViewMessageService {
* *
* @memberof ViewMessageService * @memberof ViewMessageService
*/ */
public getStaticViewMessage():Array<ViewMessage>{ public getStaticViewMessage(context:any,viewparam:any):Array<ViewMessage>{
let returnViewMessage:ViewMessage ={ let returnViewMessage:ViewMessage ={
id:this.id, id:this.id,
name:this.name, name:this.name,
...@@ -236,7 +241,7 @@ export default class ViewMessageService { ...@@ -236,7 +241,7 @@ export default class ViewMessageService {
dynamicMode:this.dynamicMode, dynamicMode:this.dynamicMode,
messageType:this.messageType messageType:this.messageType
}; };
this.translateMessageTemp(returnViewMessage); this.translateMessageTemp(returnViewMessage,context,viewparam);
return [returnViewMessage]; return [returnViewMessage];
} }
...@@ -259,10 +264,11 @@ export default class ViewMessageService { ...@@ -259,10 +264,11 @@ export default class ViewMessageService {
// 启用缓存 // 启用缓存
if(isEnableCache){ if(isEnableCache){
const callback:Function = (context:any ={},data:any ={},tag:string,promise:Promise<any>) =>{ const callback:Function = (context:any ={},data:any ={},tag:string,promise:Promise<any>) =>{
const callbackKey:string = `${JSON.stringify(context)}-${JSON.stringify(data)}-${tag}`;
promise.then((result:any) =>{ promise.then((result:any) =>{
if(result.length > 0){ if(result.length > 0){
ViewMessageService.messageCached.set(`${JSON.stringify(context)}-${JSON.stringify(data)}-${tag}`,{items:result}); ViewMessageService.messageCached.set(callbackKey,{items:result});
ViewMessageService.messageCache.delete(`${JSON.stringify(context)}-${JSON.stringify(data)}-${tag}`); ViewMessageService.messageCache.delete(callbackKey);
return resolve(result); return resolve(result);
}else{ }else{
return resolve([]); return resolve([]);
...@@ -271,9 +277,10 @@ export default class ViewMessageService { ...@@ -271,9 +277,10 @@ export default class ViewMessageService {
return reject(result); return reject(result);
}) })
} }
const key:string = `${JSON.stringify(context)}-${JSON.stringify(data)}-${tag}`;
// 加载完成,从本地缓存获取 // 加载完成,从本地缓存获取
if(ViewMessageService.messageCached.get(`${JSON.stringify(context)}-${JSON.stringify(data)}-${tag}`)){ if(ViewMessageService.messageCached.get(key)){
let items:any = ViewMessageService.messageCached.get(`${JSON.stringify(context)}-${JSON.stringify(data)}-${tag}`).items; let items:any = ViewMessageService.messageCached.get(key).items;
if(items.length >0){ if(items.length >0){
if(new Date().getTime() <= messageService.getExpirationTime()){ if(new Date().getTime() <= messageService.getExpirationTime()){
return resolve(items); return resolve(items);
...@@ -282,11 +289,11 @@ export default class ViewMessageService { ...@@ -282,11 +289,11 @@ export default class ViewMessageService {
} }
if (messageService) { if (messageService) {
// 加载中,UI又需要数据,解决连续加载同一代码表问题 // 加载中,UI又需要数据,解决连续加载同一代码表问题
if(ViewMessageService.messageCache.get(`${JSON.stringify(context)}-${JSON.stringify(data)}-${tag}`)){ if(ViewMessageService.messageCache.get(key)){
callback(context,data,tag,ViewMessageService.messageCache.get(`${JSON.stringify(context)}-${JSON.stringify(data)}-${tag}`)); callback(context,data,tag,ViewMessageService.messageCache.get(key));
}else{ }else{
let result:Promise<any> = messageService.getItems(context,data,isloading); let result:Promise<any> = messageService.getItems(context,data,isloading);
ViewMessageService.messageCache.set(`${JSON.stringify(context)}-${JSON.stringify(data)}-${tag}`,result); ViewMessageService.messageCache.set(key,result);
messageService.setExpirationTime(new Date().getTime() + cacheTimeout); messageService.setExpirationTime(new Date().getTime() + cacheTimeout);
callback(context,data,tag,result); callback(context,data,tag,result);
} }
......
...@@ -27,28 +27,32 @@ ...@@ -27,28 +27,32 @@
</i-button> </i-button>
<div slot='content'>{{$t('entities.sdfile.editviewtoolbar_toolbar.tbitem5.tip')}}</div> <div slot='content'>{{$t('entities.sdfile.editviewtoolbar_toolbar.tbitem5.tip')}}</div>
</tooltip> </tooltip>
<span class='seperator'>|</span> <tooltip :transfer="true" :max-width="600"> <span class='seperator'>|</span>
<tooltip :transfer="true" :max-width="600">
<i-button v-show="toolBarModels.tbitem7.visabled" :disabled="toolBarModels.tbitem7.disabled" class='' @click="toolbar_click({ tag: 'tbitem7' }, $event)"> <i-button v-show="toolBarModels.tbitem7.visabled" :disabled="toolBarModels.tbitem7.disabled" class='' @click="toolbar_click({ tag: 'tbitem7' }, $event)">
<i class='fa fa-remove'></i> <i class='fa fa-remove'></i>
<span class='caption'>{{$t('entities.sdfile.editviewtoolbar_toolbar.tbitem7.caption')}}</span> <span class='caption'>{{$t('entities.sdfile.editviewtoolbar_toolbar.tbitem7.caption')}}</span>
</i-button> </i-button>
<div slot='content'>{{$t('entities.sdfile.editviewtoolbar_toolbar.tbitem7.tip')}}</div> <div slot='content'>{{$t('entities.sdfile.editviewtoolbar_toolbar.tbitem7.tip')}}</div>
</tooltip> </tooltip>
<span class='seperator'>|</span> <tooltip :transfer="true" :max-width="600"> <span class='seperator'>|</span>
<tooltip :transfer="true" :max-width="600">
<i-button v-show="toolBarModels.tbitem12.visabled" :disabled="toolBarModels.tbitem12.disabled" class='' @click="toolbar_click({ tag: 'tbitem12' }, $event)"> <i-button v-show="toolBarModels.tbitem12.visabled" :disabled="toolBarModels.tbitem12.disabled" class='' @click="toolbar_click({ tag: 'tbitem12' }, $event)">
<i class='fa fa-file-text-o'></i> <i class='fa fa-file-text-o'></i>
<span class='caption'>{{$t('entities.sdfile.editviewtoolbar_toolbar.tbitem12.caption')}}</span> <span class='caption'>{{$t('entities.sdfile.editviewtoolbar_toolbar.tbitem12.caption')}}</span>
</i-button> </i-button>
<div slot='content'>{{$t('entities.sdfile.editviewtoolbar_toolbar.tbitem12.tip')}}</div> <div slot='content'>{{$t('entities.sdfile.editviewtoolbar_toolbar.tbitem12.tip')}}</div>
</tooltip> </tooltip>
<span class='seperator'>|</span> <tooltip :transfer="true" :max-width="600"> <span class='seperator'>|</span>
<tooltip :transfer="true" :max-width="600">
<i-button v-show="toolBarModels.tbitem14.visabled" :disabled="toolBarModels.tbitem14.disabled" class='' @click="toolbar_click({ tag: 'tbitem14' }, $event)"> <i-button v-show="toolBarModels.tbitem14.visabled" :disabled="toolBarModels.tbitem14.disabled" class='' @click="toolbar_click({ tag: 'tbitem14' }, $event)">
<i class='fa fa-copy'></i> <i class='fa fa-copy'></i>
<span class='caption'>{{$t('entities.sdfile.editviewtoolbar_toolbar.tbitem14.caption')}}</span> <span class='caption'>{{$t('entities.sdfile.editviewtoolbar_toolbar.tbitem14.caption')}}</span>
</i-button> </i-button>
<div slot='content'>{{$t('entities.sdfile.editviewtoolbar_toolbar.tbitem14.tip')}}</div> <div slot='content'>{{$t('entities.sdfile.editviewtoolbar_toolbar.tbitem14.tip')}}</div>
</tooltip> </tooltip>
<span class='seperator'>|</span> <tooltip :transfer="true" :max-width="600"> <span class='seperator'>|</span>
<tooltip :transfer="true" :max-width="600">
<i-button v-show="toolBarModels.tbitem23.visabled" :disabled="toolBarModels.tbitem23.disabled" class='' @click="toolbar_click({ tag: 'tbitem23' }, $event)"> <i-button v-show="toolBarModels.tbitem23.visabled" :disabled="toolBarModels.tbitem23.disabled" class='' @click="toolbar_click({ tag: 'tbitem23' }, $event)">
<i class='fa fa-fast-backward'></i> <i class='fa fa-fast-backward'></i>
...@@ -76,7 +80,8 @@ ...@@ -76,7 +80,8 @@
</i-button> </i-button>
<div slot='content'>{{$t('entities.sdfile.editviewtoolbar_toolbar.tbitem26.tip')}}</div> <div slot='content'>{{$t('entities.sdfile.editviewtoolbar_toolbar.tbitem26.tip')}}</div>
</tooltip> </tooltip>
<span class='seperator'>|</span> <tooltip :transfer="true" :max-width="600"> <span class='seperator'>|</span>
<tooltip :transfer="true" :max-width="600">
<i-button v-show="toolBarModels.tbitem22.visabled" :disabled="toolBarModels.tbitem22.disabled" class='' @click="toolbar_click({ tag: 'tbitem22' }, $event)"> <i-button v-show="toolBarModels.tbitem22.visabled" :disabled="toolBarModels.tbitem22.disabled" class='' @click="toolbar_click({ tag: 'tbitem22' }, $event)">
<i class='fa fa-question'></i> <i class='fa fa-question'></i>
<span class='caption'>{{$t('entities.sdfile.editviewtoolbar_toolbar.tbitem22.caption')}}</span> <span class='caption'>{{$t('entities.sdfile.editviewtoolbar_toolbar.tbitem22.caption')}}</span>
...@@ -86,9 +91,11 @@ ...@@ -86,9 +91,11 @@
</div> </div>
</div> </div>
<div class="content-container">
<div class='view-top-messages'> <div class='view-top-messages'>
</div> </div>
<div class="content-container">
<div class='view-body-messages'>
</div>
<view_form <view_form
:viewState="viewState" :viewState="viewState"
:viewparams="viewparams" :viewparams="viewparams"
...@@ -111,9 +118,9 @@ ...@@ -111,9 +118,9 @@
@load="form_load($event)" @load="form_load($event)"
@closeview="closeView($event)"> @closeview="closeView($event)">
</view_form> </view_form>
</div>
<div class='view-bottom-messages'> <div class='view-bottom-messages'>
</div> </div>
</div>
</card> </card>
</div> </div>
</template> </template>
...@@ -289,6 +296,18 @@ export default class SDFileEditViewBase extends Vue { ...@@ -289,6 +296,18 @@ export default class SDFileEditViewBase extends Vue {
view_form: { name: 'form', type: 'FORM' }, view_form: { name: 'form', type: 'FORM' },
}; };
/**
* 视图刷新
*
* @param {*} args
* @memberof SDFileEditViewBase
*/
public refresh(args?: any): void {
const refs: any = this.$refs;
if (refs && refs.form) {
refs.form.refresh();
}
}
/** /**
* 计数器刷新 * 计数器刷新
* *
...@@ -320,32 +339,32 @@ export default class SDFileEditViewBase extends Vue { ...@@ -320,32 +339,32 @@ export default class SDFileEditViewBase extends Vue {
* @memberof SDFileEditView * @memberof SDFileEditView
*/ */
public toolBarModels: any = { public toolBarModels: any = {
tbitem3: { name: 'tbitem3', caption: '保存', disabled: false, type: 'DEUIACTION', visabled: true,noprivdisplaymode:2,dataaccaction: '', uiaction: { tag: 'Save', target: '' } }, tbitem3: { name: 'tbitem3', actiontarget: 'NONE', caption: '保存', disabled: false, type: 'DEUIACTION', visabled: true,noprivdisplaymode:2,dataaccaction: '', uiaction: { tag: 'Save', target: '' } },
tbitem4: { name: 'tbitem4', caption: '保存并新建', disabled: false, type: 'DEUIACTION', visabled: true,noprivdisplaymode:2,dataaccaction: '', uiaction: { tag: 'SaveAndNew', target: '' } }, tbitem4: { name: 'tbitem4', actiontarget: 'NONE', caption: '保存并新建', disabled: false, type: 'DEUIACTION', visabled: true,noprivdisplaymode:2,dataaccaction: '', uiaction: { tag: 'SaveAndNew', target: '' } },
tbitem5: { name: 'tbitem5', caption: '保存并关闭', disabled: false, type: 'DEUIACTION', visabled: true,noprivdisplaymode:2,dataaccaction: '', uiaction: { tag: 'SaveAndExit', target: '' } }, tbitem5: { name: 'tbitem5', actiontarget: 'NONE', caption: '保存并关闭', disabled: false, type: 'DEUIACTION', visabled: true,noprivdisplaymode:2,dataaccaction: '', uiaction: { tag: 'SaveAndExit', target: '' } },
tbitem6: { name: 'tbitem6', type: 'SEPERATOR', visabled: true, dataaccaction: '', uiaction: { } }, tbitem6: { name: 'tbitem6', type: 'SEPERATOR', visabled: true, dataaccaction: '', uiaction: { } },
tbitem7: { name: 'tbitem7', caption: '删除并关闭', disabled: false, type: 'DEUIACTION', visabled: true,noprivdisplaymode:2,dataaccaction: '', uiaction: { tag: 'RemoveAndExit', target: 'SINGLEKEY' } }, tbitem7: { name: 'tbitem7', actiontarget: 'NONE', caption: '删除并关闭', disabled: false, type: 'DEUIACTION', visabled: true,noprivdisplaymode:2,dataaccaction: '', uiaction: { tag: 'RemoveAndExit', target: 'SINGLEKEY' } },
tbitem8: { name: 'tbitem8', type: 'SEPERATOR', visabled: true, dataaccaction: '', uiaction: { } }, tbitem8: { name: 'tbitem8', type: 'SEPERATOR', visabled: true, dataaccaction: '', uiaction: { } },
tbitem12: { name: 'tbitem12', caption: '新建', disabled: false, type: 'DEUIACTION', visabled: true,noprivdisplaymode:2,dataaccaction: '', uiaction: { tag: 'New', target: '' } }, tbitem12: { name: 'tbitem12', actiontarget: 'NONE', caption: '新建', disabled: false, type: 'DEUIACTION', visabled: true,noprivdisplaymode:2,dataaccaction: '', uiaction: { tag: 'New', target: '' } },
tbitem13: { name: 'tbitem13', type: 'SEPERATOR', visabled: true, dataaccaction: '', uiaction: { } }, tbitem13: { name: 'tbitem13', type: 'SEPERATOR', visabled: true, dataaccaction: '', uiaction: { } },
tbitem14: { name: 'tbitem14', caption: '拷贝', disabled: false, type: 'DEUIACTION', visabled: true,noprivdisplaymode:2,dataaccaction: '', uiaction: { tag: 'Copy', target: 'SINGLEKEY' } }, tbitem14: { name: 'tbitem14', actiontarget: 'NONE', caption: '拷贝', disabled: false, type: 'DEUIACTION', visabled: true,noprivdisplaymode:2,dataaccaction: '', uiaction: { tag: 'Copy', target: 'SINGLEKEY' } },
tbitem16: { name: 'tbitem16', type: 'SEPERATOR', visabled: true, dataaccaction: '', uiaction: { } }, tbitem16: { name: 'tbitem16', type: 'SEPERATOR', visabled: true, dataaccaction: '', uiaction: { } },
tbitem23: { name: 'tbitem23', disabled: false, type: 'DEUIACTION', visabled: true,noprivdisplaymode:2,dataaccaction: '', uiaction: { tag: 'FirstRecord', target: 'SINGLEKEY' } }, tbitem23: { name: 'tbitem23', actiontarget: 'NONE', disabled: false, type: 'DEUIACTION', visabled: true,noprivdisplaymode:2,dataaccaction: '', uiaction: { tag: 'FirstRecord', target: 'SINGLEKEY' } },
tbitem24: { name: 'tbitem24', disabled: false, type: 'DEUIACTION', visabled: true,noprivdisplaymode:2,dataaccaction: '', uiaction: { tag: 'PrevRecord', target: 'SINGLEKEY' } }, tbitem24: { name: 'tbitem24', actiontarget: 'NONE', disabled: false, type: 'DEUIACTION', visabled: true,noprivdisplaymode:2,dataaccaction: '', uiaction: { tag: 'PrevRecord', target: 'SINGLEKEY' } },
tbitem25: { name: 'tbitem25', disabled: false, type: 'DEUIACTION', visabled: true,noprivdisplaymode:2,dataaccaction: '', uiaction: { tag: 'NextRecord', target: 'SINGLEKEY' } }, tbitem25: { name: 'tbitem25', actiontarget: 'NONE', disabled: false, type: 'DEUIACTION', visabled: true,noprivdisplaymode:2,dataaccaction: '', uiaction: { tag: 'NextRecord', target: 'SINGLEKEY' } },
tbitem26: { name: 'tbitem26', disabled: false, type: 'DEUIACTION', visabled: true,noprivdisplaymode:2,dataaccaction: '', uiaction: { tag: 'LastRecord', target: 'SINGLEKEY' } }, tbitem26: { name: 'tbitem26', actiontarget: 'NONE', disabled: false, type: 'DEUIACTION', visabled: true,noprivdisplaymode:2,dataaccaction: '', uiaction: { tag: 'LastRecord', target: 'SINGLEKEY' } },
tbitem21: { name: 'tbitem21', type: 'SEPERATOR', visabled: true, dataaccaction: '', uiaction: { } }, tbitem21: { name: 'tbitem21', type: 'SEPERATOR', visabled: true, dataaccaction: '', uiaction: { } },
tbitem22: { name: 'tbitem22', caption: '帮助', disabled: false, type: 'DEUIACTION', visabled: true,noprivdisplaymode:2,dataaccaction: '', uiaction: { tag: 'Help', target: '' } }, tbitem22: { name: 'tbitem22', actiontarget: 'NONE', caption: '帮助', disabled: false, type: 'DEUIACTION', visabled: true,noprivdisplaymode:2,dataaccaction: '', uiaction: { tag: 'Help', target: '' } },
}; };
...@@ -394,6 +413,23 @@ export default class SDFileEditViewBase extends Vue { ...@@ -394,6 +413,23 @@ export default class SDFileEditViewBase extends Vue {
*/ */
public serviceStateEvent: Subscription | undefined; public serviceStateEvent: Subscription | undefined;
/**
* 门户部件状态对象
*
* @type {*}
* @memberof SDFileEditViewBase
*/
@Prop() public portletState?: any;
/**
* 门户部件状态事件
*
* @public
* @type {(Subscription | undefined)}
* @memberof SDFileEditViewBase
*/
public portletStateEvent: Subscription | undefined;
/** /**
* 应用上下文 * 应用上下文
* *
...@@ -607,6 +643,16 @@ export default class SDFileEditViewBase extends Vue { ...@@ -607,6 +643,16 @@ export default class SDFileEditViewBase extends Vue {
}); });
} }
}); });
if(_this.portletState){
_this.portletStateEvent = _this.portletState.subscribe((res:any) =>{
if(!Object.is(res.name,'calendar-view9')){
return;
}
if(Object.is(res.action,'refresh') && _this.refresh && _this.refresh instanceof Function){
_this.refresh();
}
})
}
} }
...@@ -1568,6 +1614,9 @@ export default class SDFileEditViewBase extends Vue { ...@@ -1568,6 +1614,9 @@ export default class SDFileEditViewBase extends Vue {
} }
}) })
} }
if(this.portletStateEvent){
this.portletStateEvent.unsubscribe();
}
} }
......
...@@ -5,9 +5,9 @@ ...@@ -5,9 +5,9 @@
<div slot='title' class="header-container"> <div slot='title' class="header-container">
<span class='caption-info'>{{$t(model.srfCaption)}}</span> <span class='caption-info'>{{$t(model.srfCaption)}}</span>
</div> </div>
<div class='content-container'>
<div class='view-top-messages'> <div class='view-top-messages'>
</div> </div>
<div class='content-container'>
<div style='margin-bottom: 6px;'> <div style='margin-bottom: 6px;'>
<i-input v-show="!isExpandSearchForm" v-model="query" search enter-button @on-search="onSearch($event)" class='quick-search-input' style='max-width: 400px;' placeholder="" /> <i-input v-show="!isExpandSearchForm" v-model="query" search enter-button @on-search="onSearch($event)" class='quick-search-input' style='max-width: 400px;' placeholder="" />
<div class='pull-right'> <div class='pull-right'>
...@@ -33,18 +33,21 @@ ...@@ -33,18 +33,21 @@
</i-button> </i-button>
<div slot='content'>{{$t('entities.sdfile.gridviewtoolbar_toolbar.tbitem6.tip')}}</div> <div slot='content'>{{$t('entities.sdfile.gridviewtoolbar_toolbar.tbitem6.tip')}}</div>
</tooltip> </tooltip>
<span class='seperator'>|</span> <tooltip :transfer="true" :max-width="600"> <span class='seperator'>|</span>
<tooltip :transfer="true" :max-width="600">
<i-button v-show="toolBarModels.tbitem8.visabled" :disabled="toolBarModels.tbitem8.disabled" class='' @click="toolbar_click({ tag: 'tbitem8' }, $event)"> <i-button v-show="toolBarModels.tbitem8.visabled" :disabled="toolBarModels.tbitem8.disabled" class='' @click="toolbar_click({ tag: 'tbitem8' }, $event)">
<i class='fa fa-remove'></i> <i class='fa fa-remove'></i>
<span class='caption'>{{$t('entities.sdfile.gridviewtoolbar_toolbar.tbitem8.caption')}}</span> <span class='caption'>{{$t('entities.sdfile.gridviewtoolbar_toolbar.tbitem8.caption')}}</span>
</i-button> </i-button>
<div slot='content'>{{$t('entities.sdfile.gridviewtoolbar_toolbar.tbitem8.tip')}}</div> <div slot='content'>{{$t('entities.sdfile.gridviewtoolbar_toolbar.tbitem8.tip')}}</div>
</tooltip> </tooltip>
<span class='seperator'>|</span> <tooltip :transfer="true" :max-width="600"> <span class='seperator'>|</span>
<tooltip :transfer="true" :max-width="600">
<app-export-excel :item="toolBarModels.tbitem13" :caption="$t('entities.sdfile.gridviewtoolbar_toolbar.tbitem13.caption')" @exportexcel="toolbar_click({ tag: 'tbitem13' }, $event)"></app-export-excel> <app-export-excel :item="toolBarModels.tbitem13" :caption="$t('entities.sdfile.gridviewtoolbar_toolbar.tbitem13.caption')" @exportexcel="toolbar_click({ tag: 'tbitem13' }, $event)"></app-export-excel>
<div slot='content'>{{$t('entities.sdfile.gridviewtoolbar_toolbar.tbitem13.tip')}}</div> <div slot='content'>{{$t('entities.sdfile.gridviewtoolbar_toolbar.tbitem13.tip')}}</div>
</tooltip> </tooltip>
<span class='seperator'>|</span> <dropdown v-show="toolBarModels.tbitem16.visabled" trigger='click'> <span class='seperator'>|</span>
<dropdown v-show="toolBarModels.tbitem16.visabled" trigger='click'>
<tooltip :transfer="true" :max-width="600"> <tooltip :transfer="true" :max-width="600">
<i-button class=''> <i-button class=''>
<i class=''></i> <i class=''></i>
...@@ -78,7 +81,8 @@ ...@@ -78,7 +81,8 @@
</dropdown-item> </dropdown-item>
</dropdown-menu> </dropdown-menu>
</dropdown> </dropdown>
<span class='seperator'>|</span> <tooltip :transfer="true" :max-width="600"> <span class='seperator'>|</span>
<tooltip :transfer="true" :max-width="600">
<i-button v-show="toolBarModels.tbitem19.visabled" :disabled="toolBarModels.tbitem19.disabled" class='' @click="toolbar_click({ tag: 'tbitem19' }, $event)"> <i-button v-show="toolBarModels.tbitem19.visabled" :disabled="toolBarModels.tbitem19.disabled" class='' @click="toolbar_click({ tag: 'tbitem19' }, $event)">
<i class='fa fa-filter'></i> <i class='fa fa-filter'></i>
<span class='caption'>{{$t('entities.sdfile.gridviewtoolbar_toolbar.tbitem19.caption')}}</span> <span class='caption'>{{$t('entities.sdfile.gridviewtoolbar_toolbar.tbitem19.caption')}}</span>
...@@ -111,6 +115,8 @@ ...@@ -111,6 +115,8 @@
@load="searchform_load($event)" @load="searchform_load($event)"
@closeview="closeView($event)"> @closeview="closeView($event)">
</view_searchform> </view_searchform>
<div class='view-body-messages'>
</div>
<view_grid <view_grid
:viewState="viewState" :viewState="viewState"
:viewparams="viewparams" :viewparams="viewparams"
...@@ -138,9 +144,9 @@ ...@@ -138,9 +144,9 @@
@load="grid_load($event)" @load="grid_load($event)"
@closeview="closeView($event)"> @closeview="closeView($event)">
</view_grid> </view_grid>
</div>
<div class='view-bottom-messages'> <div class='view-bottom-messages'>
</div> </div>
</div>
</card> </card>
</div> </div>
</template> </template>
...@@ -320,6 +326,18 @@ export default class SDFileGridViewBase extends Vue { ...@@ -320,6 +326,18 @@ export default class SDFileGridViewBase extends Vue {
view_searchform: { name: 'searchform', type: 'SEARCHFORM' }, view_searchform: { name: 'searchform', type: 'SEARCHFORM' },
}; };
/**
* 视图刷新
*
* @param {*} args
* @memberof SDFileGridViewBase
*/
public refresh(args?: any): void {
const refs: any = this.$refs;
if (refs && refs.grid) {
refs.grid.refresh();
}
}
/** /**
* 计数器刷新 * 计数器刷新
* *
...@@ -351,29 +369,29 @@ export default class SDFileGridViewBase extends Vue { ...@@ -351,29 +369,29 @@ export default class SDFileGridViewBase extends Vue {
* @memberof SDFileGridView * @memberof SDFileGridView
*/ */
public toolBarModels: any = { public toolBarModels: any = {
tbitem3: { name: 'tbitem3', caption: '新建', disabled: false, type: 'DEUIACTION', visabled: true,noprivdisplaymode:2,dataaccaction: '', uiaction: { tag: 'New', target: '' } }, tbitem3: { name: 'tbitem3', actiontarget: 'NONE', caption: '新建', disabled: false, type: 'DEUIACTION', visabled: true,noprivdisplaymode:2,dataaccaction: '', uiaction: { tag: 'New', target: '' } },
tbitem4: { name: 'tbitem4', caption: '编辑', disabled: false, type: 'DEUIACTION', visabled: true,noprivdisplaymode:2,dataaccaction: '', uiaction: { tag: 'Edit', target: 'SINGLEKEY' } }, tbitem4: { name: 'tbitem4', actiontarget: 'NONE', caption: '编辑', disabled: false, type: 'DEUIACTION', visabled: true,noprivdisplaymode:2,dataaccaction: '', uiaction: { tag: 'Edit', target: 'SINGLEKEY' } },
tbitem6: { name: 'tbitem6', caption: '拷贝', disabled: false, type: 'DEUIACTION', visabled: true,noprivdisplaymode:2,dataaccaction: '', uiaction: { tag: 'Copy', target: 'SINGLEKEY' } }, tbitem6: { name: 'tbitem6', actiontarget: 'NONE', caption: '拷贝', disabled: false, type: 'DEUIACTION', visabled: true,noprivdisplaymode:2,dataaccaction: '', uiaction: { tag: 'Copy', target: 'SINGLEKEY' } },
tbitem7: { name: 'tbitem7', type: 'SEPERATOR', visabled: true, dataaccaction: '', uiaction: { } }, tbitem7: { name: 'tbitem7', type: 'SEPERATOR', visabled: true, dataaccaction: '', uiaction: { } },
tbitem8: { name: 'tbitem8', caption: '删除', disabled: false, type: 'DEUIACTION', visabled: true,noprivdisplaymode:2,dataaccaction: '', uiaction: { tag: 'Remove', target: 'MULTIKEY' } }, tbitem8: { name: 'tbitem8', actiontarget: 'NONE', caption: '删除', disabled: false, type: 'DEUIACTION', visabled: true,noprivdisplaymode:2,dataaccaction: '', uiaction: { tag: 'Remove', target: 'MULTIKEY' } },
tbitem9: { name: 'tbitem9', type: 'SEPERATOR', visabled: true, dataaccaction: '', uiaction: { } }, tbitem9: { name: 'tbitem9', type: 'SEPERATOR', visabled: true, dataaccaction: '', uiaction: { } },
tbitem13: { name: 'tbitem13', caption: '导出', disabled: false, type: 'DEUIACTION', visabled: true,noprivdisplaymode:2,dataaccaction: '', uiaction: { tag: 'ExportExcel', target: '' }, MaxRowCount: 1000 }, tbitem13: { name: 'tbitem13', actiontarget: 'NONE', caption: '导出', disabled: false, type: 'DEUIACTION', visabled: true,noprivdisplaymode:2,dataaccaction: '', uiaction: { tag: 'ExportExcel', target: '' }, MaxRowCount: 1000 },
tbitem10: { name: 'tbitem10', type: 'SEPERATOR', visabled: true, dataaccaction: '', uiaction: { } }, tbitem10: { name: 'tbitem10', type: 'SEPERATOR', visabled: true, dataaccaction: '', uiaction: { } },
tbitem16: { name: 'tbitem16', caption: '其它', disabled: false, type: 'ITEMS', visabled: true, dataaccaction: '', uiaction: { } }, tbitem16: { name: 'tbitem16', caption: '其它', disabled: false, type: 'ITEMS', visabled: true, dataaccaction: '', uiaction: { } },
tbitem21: { name: 'tbitem21', caption: '导出数据模型', disabled: false, type: 'DEUIACTION', visabled: true,noprivdisplaymode:2,dataaccaction: '', uiaction: { tag: 'ExportModel', target: '' } }, tbitem21: { name: 'tbitem21', actiontarget: 'NONE', caption: '导出数据模型', disabled: false, type: 'DEUIACTION', visabled: true,noprivdisplaymode:2,dataaccaction: '', uiaction: { tag: 'ExportModel', target: '' } },
tbitem23: { name: 'tbitem23', caption: '数据导入', disabled: false, type: 'DEUIACTION', visabled: true,noprivdisplaymode:2,dataaccaction: '', uiaction: { tag: 'Import', target: '' } }, tbitem23: { name: 'tbitem23', actiontarget: 'NONE', caption: '数据导入', disabled: false, type: 'DEUIACTION', visabled: true,noprivdisplaymode:2,dataaccaction: '', uiaction: { tag: 'Import', target: '' } },
tbitem17: { name: 'tbitem17', type: 'SEPERATOR', visabled: true, dataaccaction: '', uiaction: { } }, tbitem17: { name: 'tbitem17', type: 'SEPERATOR', visabled: true, dataaccaction: '', uiaction: { } },
tbitem19: { name: 'tbitem19', caption: '过滤', disabled: false, type: 'DEUIACTION', visabled: true,noprivdisplaymode:2,dataaccaction: '', uiaction: { tag: 'ToggleFilter', target: '' } }, tbitem19: { name: 'tbitem19', actiontarget: 'NONE', caption: '过滤', disabled: false, type: 'DEUIACTION', visabled: true,noprivdisplaymode:2,dataaccaction: '', uiaction: { tag: 'ToggleFilter', target: '' } },
tbitem18: { name: 'tbitem18', caption: '帮助', disabled: false, type: 'DEUIACTION', visabled: true,noprivdisplaymode:2,dataaccaction: '', uiaction: { tag: 'Help', target: '' } }, tbitem18: { name: 'tbitem18', actiontarget: 'NONE', caption: '帮助', disabled: false, type: 'DEUIACTION', visabled: true,noprivdisplaymode:2,dataaccaction: '', uiaction: { tag: 'Help', target: '' } },
}; };
...@@ -429,6 +447,23 @@ export default class SDFileGridViewBase extends Vue { ...@@ -429,6 +447,23 @@ export default class SDFileGridViewBase extends Vue {
*/ */
public serviceStateEvent: Subscription | undefined; public serviceStateEvent: Subscription | undefined;
/**
* 门户部件状态对象
*
* @type {*}
* @memberof SDFileGridViewBase
*/
@Prop() public portletState?: any;
/**
* 门户部件状态事件
*
* @public
* @type {(Subscription | undefined)}
* @memberof SDFileGridViewBase
*/
public portletStateEvent: Subscription | undefined;
/** /**
* 应用上下文 * 应用上下文
* *
...@@ -642,6 +677,16 @@ export default class SDFileGridViewBase extends Vue { ...@@ -642,6 +677,16 @@ export default class SDFileGridViewBase extends Vue {
}); });
} }
}); });
if(_this.portletState){
_this.portletStateEvent = _this.portletState.subscribe((res:any) =>{
if(!Object.is(res.name,'calendar-view9')){
return;
}
if(Object.is(res.action,'refresh') && _this.refresh && _this.refresh instanceof Function){
_this.refresh();
}
})
}
if(this.formDruipart){ if(this.formDruipart){
this.formDruipart.subscribe((res:any) =>{ this.formDruipart.subscribe((res:any) =>{
if(Object.is(res.action,'save')){ if(Object.is(res.action,'save')){
...@@ -1617,6 +1662,9 @@ export default class SDFileGridViewBase extends Vue { ...@@ -1617,6 +1662,9 @@ export default class SDFileGridViewBase extends Vue {
} }
}) })
} }
if(this.portletStateEvent){
this.portletStateEvent.unsubscribe();
}
} }
/** /**
......
...@@ -262,6 +262,23 @@ export default class SDIndexViewBase extends Vue { ...@@ -262,6 +262,23 @@ export default class SDIndexViewBase extends Vue {
*/ */
public serviceStateEvent: Subscription | undefined; public serviceStateEvent: Subscription | undefined;
/**
* 门户部件状态对象
*
* @type {*}
* @memberof SDIndexViewBase
*/
@Prop() public portletState?: any;
/**
* 门户部件状态事件
*
* @public
* @type {(Subscription | undefined)}
* @memberof SDIndexViewBase
*/
public portletStateEvent: Subscription | undefined;
/** /**
* 应用上下文 * 应用上下文
* *
...@@ -470,6 +487,16 @@ export default class SDIndexViewBase extends Vue { ...@@ -470,6 +487,16 @@ export default class SDIndexViewBase extends Vue {
}); });
} }
}); });
if(_this.portletState){
_this.portletStateEvent = _this.portletState.subscribe((res:any) =>{
if(!Object.is(res.name,'calendar-view9')){
return;
}
if(Object.is(res.action,'refresh') && _this.refresh && _this.refresh instanceof Function){
_this.refresh();
}
})
}
} }
......
...@@ -47,12 +47,21 @@ export const getLocalData = (state: any) => () => { ...@@ -47,12 +47,21 @@ export const getLocalData = (state: any) => () => {
* @param state * @param state
*/ */
export const getAppData = (state: any) => () => { export const getAppData = (state: any) => () => {
if(!state.appdata){
state.appdata = {};
}
let result:any = JSON.parse(JSON.stringify(state.appdata)); let result:any = JSON.parse(JSON.stringify(state.appdata));
let copyContext:any = result.context?result.context:{};
if(state.localdata && Object.keys(state.localdata).length >0){ if(state.localdata && Object.keys(state.localdata).length >0){
let copyContext:any = result.context?result.context:{};
Object.assign(copyContext,state.localdata); Object.assign(copyContext,state.localdata);
result.context = copyContext; }else if(localStorage.getItem('localdata')){
try{
Object.assign(copyContext,JSON.parse(localStorage.getItem('localdata') as string));
}catch(error){
console.warn(error);
}
} }
result.context = copyContext;
return result; return result;
} }
......
...@@ -32,23 +32,56 @@ export const getEnablePermissionValid = (state: any) => { ...@@ -32,23 +32,56 @@ export const getEnablePermissionValid = (state: any) => {
} }
/** /**
* 判断指定菜单是否显示 * 判断指定菜单是否显示(混合模式)
* *
* @param state * @param state
*/ */
export const getAuthMenu = (state: any) => (menu:any) =>{ export const getAuthMenu = (state: any) => (menu: any) => {
// 存在权限 if (state.enablePermissionValid) {
let resourceIndex: any; let resourceIndex: any;
let menuIndex:any; let menuIndex: any;
if(state.enablePermissionValid){ resourceIndex = state.resourceData.findIndex((resourcetag: any, objIndex: any, objs: any) => {
resourceIndex= state.resourceData.findIndex((resourcetag: any, objIndex: any, objs: any) => {
return Object.is(menu.resourcetag, resourcetag); return Object.is(menu.resourcetag, resourcetag);
}) })
menuIndex= state.menuData.findIndex((menutag: any, objIndex: any, objs: any) => { menuIndex = state.menuData.findIndex((menutag: any, objIndex: any, objs: any) => {
return Object.is(menu.authtag, menutag); return Object.is(menu.authtag, menutag);
}) })
return (resourceIndex !== -1 || menuIndex !== -1)?true:false; return (resourceIndex !== -1 || menuIndex !== -1) ? true : false;
}else{ } else {
return true;
}
}
/**
* 判断指定菜单是否显示(资源模式)
*
* @param state
*/
export const getAuthMenuWithResource = (state: any) => (menu: any) => {
if (state.enablePermissionValid && menu.resourcetag) {
let resourceIndex: any;
resourceIndex = state.resourceData.findIndex((resourcetag: any, objIndex: any, objs: any) => {
return Object.is(menu.resourcetag, resourcetag);
})
return resourceIndex !== -1 ? true : false;
} else {
return true;
}
}
/**
* 判断指定菜单是否显示(RT模式)
*
* @param state
*/
export const getAuthMenuWithRT = (state: any) => (menu: any) => {
if (state.enablePermissionValid) {
let menuIndex: any;
menuIndex = state.menuData.findIndex((menutag: any, objIndex: any, objs: any) => {
return Object.is(menu.authtag, menutag);
})
return menuIndex !== -1 ? true : false;
} else {
return true; return true;
} }
} }
\ No newline at end of file
...@@ -124,11 +124,14 @@ ...@@ -124,11 +124,14 @@
// flex-grow: 1; // flex-grow: 1;
height: calc(100% - 74px); height: calc(100% - 74px);
padding: 0px; padding: 0px;
display: flex;
flex-direction: column;
> .content-container { > .content-container {
height: 100%; height: 100%;
display: flex; display: flex;
margin: 0; margin: 0;
flex-direction: column; flex-direction: column;
overflow: auto;
} }
} }
} }
......
...@@ -89,8 +89,8 @@ export default class SDFileUIServiceBase extends UIService { ...@@ -89,8 +89,8 @@ export default class SDFileUIServiceBase extends UIService {
* @memberof SDFileUIServiceBase * @memberof SDFileUIServiceBase
*/ */
public initViewMap(){ public initViewMap(){
this.allViewMap.set('EDITVIEW:',{viewname:'editview',srfappde:'sdfiles'}); this.allViewMap.set('EDITVIEW:',{viewname:'editview',srfappde:'sdfiles',component:'sdfile-edit-view'});
this.allViewMap.set('MDATAVIEW:',{viewname:'gridview',srfappde:'sdfiles'}); this.allViewMap.set('MDATAVIEW:',{viewname:'gridview',srfappde:'sdfiles',component:'sdfile-grid-view'});
} }
/** /**
...@@ -199,17 +199,17 @@ export default class SDFileUIServiceBase extends UIService { ...@@ -199,17 +199,17 @@ export default class SDFileUIServiceBase extends UIService {
this.mainStateFields.forEach((singleMainField:any) =>{ this.mainStateFields.forEach((singleMainField:any) =>{
if(!(singleMainField in curData)){ if(!(singleMainField in curData)){
console.warn(`当前数据对象不包含属性${singleMainField},可能会发生错误`); console.warn(`当前数据对象不包含属性${singleMainField}」,根据「${singleMainField}」属性进行的主状态计算默认为空值`);
} }
}) })
for (let i = 0; i <= 1; i++) { for (let i = 0; i <= 1; i++) {
let strTag:string = (curData[this.mainStateFields[0]])?(i == 0) ? `${curData[this.mainStateFields[0]]}` : "":""; let strTag:string = (curData[this.mainStateFields[0]] != null && curData[this.mainStateFields[0]] !== "")?(i == 0) ? `${curData[this.mainStateFields[0]]}` : "":"";
if (this.mainStateFields.length >= 2) { if (this.mainStateFields.length >= 2) {
for (let j = 0; j <= 1; j++) { for (let j = 0; j <= 1; j++) {
let strTag2:string = (curData[this.mainStateFields[1]])?`${strTag}__${(j == 0) ? `${curData[this.mainStateFields[1]]}` : ""}`:strTag; let strTag2:string = (curData[this.mainStateFields[1]] != null && curData[this.mainStateFields[1]] !== "")?`${strTag}__${(j == 0) ? `${curData[this.mainStateFields[1]]}` : ""}`:strTag;
if (this.mainStateFields.length >= 3) { if (this.mainStateFields.length >= 3) {
for (let k = 0; k <= 1; k++) { for (let k = 0; k <= 1; k++) {
let strTag3:string = (curData[this.mainStateFields[2]])?`${strTag2}__${(k == 0) ? `${curData[this.mainStateFields[2]]}` : ""}`:strTag2; let strTag3:string = (curData[this.mainStateFields[2]] != null && curData[this.mainStateFields[2]] !== "")?`${strTag2}__${(k == 0) ? `${curData[this.mainStateFields[2]]}` : ""}`:strTag2;
// 判断是否存在 // 判断是否存在
return this.allDeMainStateMap.get(strTag3); return this.allDeMainStateMap.get(strTag3);
} }
......
import { Store } from 'vuex'; import { Store } from 'vuex';
import AuthService from '@/authservice/auth-service';
/** /**
* 界面服务基类 * 界面服务基类
...@@ -63,6 +64,9 @@ export default class UIService { ...@@ -63,6 +64,9 @@ export default class UIService {
* @memberof UIService * @memberof UIService
*/ */
public getResourceOPPrivs(tag:any){ public getResourceOPPrivs(tag:any){
if(!this.authService) {
this.authService = new AuthService(this.getStore());
}
return this.authService.getResourcePermission(this.authService.sysOPPrivsMap.get(tag))?1:0; return this.authService.getResourcePermission(this.authService.sysOPPrivsMap.get(tag))?1:0;
} }
......
...@@ -260,7 +260,7 @@ export class ViewTool { ...@@ -260,7 +260,7 @@ export class ViewTool {
const _item = ActionModel[key]; const _item = ActionModel[key];
if(_item && _item['dataaccaction'] && UIService){ if(_item && _item['dataaccaction'] && UIService){
let dataActionResult:any; let dataActionResult:any;
if(Object.is(_item['actiontarget'],"NONE")){ if(Object.is(_item['actiontarget'],"NONE") || Object.is(_item['actiontarget'],"")){
dataActionResult = UIService.getResourceOPPrivs(_item['dataaccaction']); dataActionResult = UIService.getResourceOPPrivs(_item['dataaccaction']);
}else{ }else{
if(data && Object.keys(data).length >0){ if(data && Object.keys(data).length >0){
......
...@@ -223,6 +223,7 @@ export default class SDIndexViewBase extends Vue implements ControlInterface { ...@@ -223,6 +223,7 @@ export default class SDIndexViewBase extends Vue implements ControlInterface {
} }
/** /**
* 获取多项数据 * 获取多项数据
* *
......
...@@ -172,6 +172,7 @@ export default class DefaultBase extends Vue implements ControlInterface { ...@@ -172,6 +172,7 @@ export default class DefaultBase extends Vue implements ControlInterface {
} }
/** /**
* 获取多项数据 * 获取多项数据
* *
......
...@@ -41,6 +41,14 @@ export default class DefaultService extends ControlService { ...@@ -41,6 +41,14 @@ export default class DefaultService extends ControlService {
this.model = new DefaultModel(); this.model = new DefaultModel();
} }
/**
* 远端数据
*
* @type {*}
* @memberof DefaultService
*/
private remoteCopyData:any = {};
/** /**
* 处理数据 * 处理数据
* *
...@@ -271,6 +279,7 @@ export default class DefaultService extends ControlService { ...@@ -271,6 +279,7 @@ export default class DefaultService extends ControlService {
result = this.appEntityService.Get(Context,Data, isloading); result = this.appEntityService.Get(Context,Data, isloading);
} }
result.then((response) => { result.then((response) => {
this.setRemoteCopyData(response);
this.handleResponse(action, response); this.handleResponse(action, response);
resolve(response); resolve(response);
}).catch(response => { }).catch(response => {
...@@ -301,6 +310,7 @@ export default class DefaultService extends ControlService { ...@@ -301,6 +310,7 @@ export default class DefaultService extends ControlService {
result = this.appEntityService.GetDraft(Context,Data, isloading); result = this.appEntityService.GetDraft(Context,Data, isloading);
} }
result.then((response) => { result.then((response) => {
this.setRemoteCopyData(response);
this.handleResponse(action, response, true); this.handleResponse(action, response, true);
resolve(response); resolve(response);
}).catch(response => { }).catch(response => {
...@@ -434,5 +444,24 @@ export default class DefaultService extends ControlService { ...@@ -434,5 +444,24 @@ export default class DefaultService extends ControlService {
return item; return item;
} }
/**
* 设置远端数据
*
* @param result 远端请求结果
* @memberof DefaultService
*/
public setRemoteCopyData(result:any){
if (result && result.status === 200) {
this.remoteCopyData = Util.deepCopy(result.data);
}
}
/**
* 获取远端数据
*
* @memberof DefaultService
*/
public getRemoteCopyData(){
return this.remoteCopyData;
}
} }
\ No newline at end of file
...@@ -2,8 +2,7 @@ ...@@ -2,8 +2,7 @@
<i-form :model="this.data" class='app-form' ref='form' id='sdfile_main' style=""> <i-form :model="this.data" class='app-form' ref='form' id='sdfile_main' style="">
<input style="display:none;" /> <input style="display:none;" />
<row > <row >
<i-col v-show="detailsModel.group1.visible" :style="{}" :lg="{ span: 24, offset: 0 }">
<i-col v-show="detailsModel.group1.visible" :style="{}" :lg="{ span: 24, offset: 0 }">
<app-form-group :uiService="appUIService" :data="transformData(data)" :manageContainerStatus="detailsModel.group1.manageContainerStatus" :isManageContainer="detailsModel.group1.isManageContainer" @managecontainerclick="manageContainerClick('group1')" layoutType="TABLE_24COL" titleStyle="" class='' :uiActionGroup="detailsModel.group1.uiActionGroup" @groupuiactionclick="groupUIActionClick($event)" :caption="$t('entities.sdfile.main_form.details.group1')" :isShowCaption="true" uiStyle="DEFAULT" :titleBarCloseMode="0" :isInfoGroupMode="false" > <app-form-group :uiService="appUIService" :data="transformData(data)" :manageContainerStatus="detailsModel.group1.manageContainerStatus" :isManageContainer="detailsModel.group1.isManageContainer" @managecontainerclick="manageContainerClick('group1')" layoutType="TABLE_24COL" titleStyle="" class='' :uiActionGroup="detailsModel.group1.uiActionGroup" @groupuiactionclick="groupUIActionClick($event)" :caption="$t('entities.sdfile.main_form.details.group1')" :isShowCaption="true" uiStyle="DEFAULT" :titleBarCloseMode="0" :isInfoGroupMode="false" >
<row> <row>
<i-col v-show="detailsModel.filename.visible" :style="{}" :lg="{ span: 24, offset: 0 }"> <i-col v-show="detailsModel.filename.visible" :style="{}" :lg="{ span: 24, offset: 0 }">
...@@ -323,6 +322,7 @@ export default class MainBase extends Vue implements ControlInterface { ...@@ -323,6 +322,7 @@ export default class MainBase extends Vue implements ControlInterface {
} }
/** /**
* 视图默认使用 * 视图默认使用
* *
...@@ -578,138 +578,58 @@ export default class MainBase extends Vue implements ControlInterface { ...@@ -578,138 +578,58 @@ export default class MainBase extends Vue implements ControlInterface {
*/ */
public rules() :any { public rules() :any {
return { return {
srfupdatedate: [
{ type: 'string', message: '更新时间 值必须为字符串类型', trigger: 'change' },
{ type: 'string', message: '更新时间 值必须为字符串类型', trigger: 'blur' },
{ required: this.detailsModel.srfupdatedate.required, type: 'string', message: '更新时间 值不能为空', trigger: 'change' },
{ required: this.detailsModel.srfupdatedate.required, type: 'string', message: '更新时间 值不能为空', trigger: 'blur' },
],
srforikey: [
{ type: 'string', message: ' 值必须为字符串类型', trigger: 'change' },
{ type: 'string', message: ' 值必须为字符串类型', trigger: 'blur' },
{ required: this.detailsModel.srforikey.required, type: 'string', message: ' 值不能为空', trigger: 'change' },
{ required: this.detailsModel.srforikey.required, type: 'string', message: ' 值不能为空', trigger: 'blur' },
],
srfkey: [
{ type: 'string', message: '标识 值必须为字符串类型', trigger: 'change' },
{ type: 'string', message: '标识 值必须为字符串类型', trigger: 'blur' },
{ required: this.detailsModel.srfkey.required, type: 'string', message: '标识 值不能为空', trigger: 'change' },
{ required: this.detailsModel.srfkey.required, type: 'string', message: '标识 值不能为空', trigger: 'blur' },
],
srfmajortext: [
{ type: 'string', message: '名称 值必须为字符串类型', trigger: 'change' },
{ type: 'string', message: '名称 值必须为字符串类型', trigger: 'blur' },
{ required: this.detailsModel.srfmajortext.required, type: 'string', message: '名称 值不能为空', trigger: 'change' },
{ required: this.detailsModel.srfmajortext.required, type: 'string', message: '名称 值不能为空', trigger: 'blur' },
],
srftempmode: [
{ type: 'string', message: ' 值必须为字符串类型', trigger: 'change' },
{ type: 'string', message: ' 值必须为字符串类型', trigger: 'blur' },
{ required: this.detailsModel.srftempmode.required, type: 'string', message: ' 值不能为空', trigger: 'change' },
{ required: this.detailsModel.srftempmode.required, type: 'string', message: ' 值不能为空', trigger: 'blur' },
],
srfuf: [
{ type: 'string', message: ' 值必须为字符串类型', trigger: 'change' },
{ type: 'string', message: ' 值必须为字符串类型', trigger: 'blur' },
{ required: this.detailsModel.srfuf.required, type: 'string', message: ' 值不能为空', trigger: 'change' },
{ required: this.detailsModel.srfuf.required, type: 'string', message: ' 值不能为空', trigger: 'blur' },
],
srfdeid: [
{ type: 'string', message: ' 值必须为字符串类型', trigger: 'change' },
{ type: 'string', message: ' 值必须为字符串类型', trigger: 'blur' },
{ required: this.detailsModel.srfdeid.required, type: 'string', message: ' 值不能为空', trigger: 'change' },
{ required: this.detailsModel.srfdeid.required, type: 'string', message: ' 值不能为空', trigger: 'blur' },
],
srfsourcekey: [
{ type: 'string', message: ' 值必须为字符串类型', trigger: 'change' },
{ type: 'string', message: ' 值必须为字符串类型', trigger: 'blur' },
{ required: this.detailsModel.srfsourcekey.required, type: 'string', message: ' 值不能为空', trigger: 'change' },
{ required: this.detailsModel.srfsourcekey.required, type: 'string', message: ' 值不能为空', trigger: 'blur' },
],
filename: [ filename: [
{ type: 'string', message: '名称 值必须为字符串类型', trigger: 'change' },
{ type: 'string', message: '名称 值必须为字符串类型', trigger: 'blur' },
{ required: this.detailsModel.filename.required, type: 'string', message: '名称 值不能为空', trigger: 'change' }, { required: this.detailsModel.filename.required, type: 'string', message: '名称 值不能为空', trigger: 'change' },
{ required: this.detailsModel.filename.required, type: 'string', message: '名称 值不能为空', trigger: 'blur' }, { required: this.detailsModel.filename.required, type: 'string', message: '名称 值不能为空', trigger: 'blur' },
], ],
filepath: [ filepath: [
{ type: 'string', message: '路径 值必须为字符串类型', trigger: 'change' },
{ type: 'string', message: '路径 值必须为字符串类型', trigger: 'blur' },
{ required: this.detailsModel.filepath.required, type: 'string', message: '路径 值不能为空', trigger: 'change' }, { required: this.detailsModel.filepath.required, type: 'string', message: '路径 值不能为空', trigger: 'change' },
{ required: this.detailsModel.filepath.required, type: 'string', message: '路径 值不能为空', trigger: 'blur' }, { required: this.detailsModel.filepath.required, type: 'string', message: '路径 值不能为空', trigger: 'blur' },
], ],
filesize: [ filesize: [
{ type: 'number', message: '文件大小 值必须为数值类型', trigger: 'change' },
{ type: 'number', message: '文件大小 值必须为数值类型', trigger: 'blur' },
{ required: this.detailsModel.filesize.required, type: 'number', message: '文件大小 值不能为空', trigger: 'change' }, { required: this.detailsModel.filesize.required, type: 'number', message: '文件大小 值不能为空', trigger: 'change' },
{ required: this.detailsModel.filesize.required, type: 'number', message: '文件大小 值不能为空', trigger: 'blur' }, { required: this.detailsModel.filesize.required, type: 'number', message: '文件大小 值不能为空', trigger: 'blur' },
], ],
fileext: [ fileext: [
{ type: 'string', message: '扩展名 值必须为字符串类型', trigger: 'change' },
{ type: 'string', message: '扩展名 值必须为字符串类型', trigger: 'blur' },
{ required: this.detailsModel.fileext.required, type: 'string', message: '扩展名 值不能为空', trigger: 'change' }, { required: this.detailsModel.fileext.required, type: 'string', message: '扩展名 值不能为空', trigger: 'change' },
{ required: this.detailsModel.fileext.required, type: 'string', message: '扩展名 值不能为空', trigger: 'blur' }, { required: this.detailsModel.fileext.required, type: 'string', message: '扩展名 值不能为空', trigger: 'blur' },
], ],
folder: [ folder: [
{ type: 'string', message: '特定目录 值必须为字符串类型', trigger: 'change' },
{ type: 'string', message: '特定目录 值必须为字符串类型', trigger: 'blur' },
{ required: this.detailsModel.folder.required, type: 'string', message: '特定目录 值不能为空', trigger: 'change' }, { required: this.detailsModel.folder.required, type: 'string', message: '特定目录 值不能为空', trigger: 'change' },
{ required: this.detailsModel.folder.required, type: 'string', message: '特定目录 值不能为空', trigger: 'blur' }, { required: this.detailsModel.folder.required, type: 'string', message: '特定目录 值不能为空', trigger: 'blur' },
], ],
digestcode: [ digestcode: [
{ type: 'string', message: '签名 值必须为字符串类型', trigger: 'change' },
{ type: 'string', message: '签名 值必须为字符串类型', trigger: 'blur' },
{ required: this.detailsModel.digestcode.required, type: 'string', message: '签名 值不能为空', trigger: 'change' }, { required: this.detailsModel.digestcode.required, type: 'string', message: '签名 值不能为空', trigger: 'change' },
{ required: this.detailsModel.digestcode.required, type: 'string', message: '签名 值不能为空', trigger: 'blur' }, { required: this.detailsModel.digestcode.required, type: 'string', message: '签名 值不能为空', trigger: 'blur' },
], ],
ownerid: [ ownerid: [
{ type: 'string', message: '所属主体 值必须为字符串类型', trigger: 'change' },
{ type: 'string', message: '所属主体 值必须为字符串类型', trigger: 'blur' },
{ required: this.detailsModel.ownerid.required, type: 'string', message: '所属主体 值不能为空', trigger: 'change' }, { required: this.detailsModel.ownerid.required, type: 'string', message: '所属主体 值不能为空', trigger: 'change' },
{ required: this.detailsModel.ownerid.required, type: 'string', message: '所属主体 值不能为空', trigger: 'blur' }, { required: this.detailsModel.ownerid.required, type: 'string', message: '所属主体 值不能为空', trigger: 'blur' },
], ],
ownertype: [ ownertype: [
{ type: 'string', message: '所属类型 值必须为字符串类型', trigger: 'change' },
{ type: 'string', message: '所属类型 值必须为字符串类型', trigger: 'blur' },
{ required: this.detailsModel.ownertype.required, type: 'string', message: '所属类型 值不能为空', trigger: 'change' }, { required: this.detailsModel.ownertype.required, type: 'string', message: '所属类型 值不能为空', trigger: 'change' },
{ required: this.detailsModel.ownertype.required, type: 'string', message: '所属类型 值不能为空', trigger: 'blur' }, { required: this.detailsModel.ownertype.required, type: 'string', message: '所属类型 值不能为空', trigger: 'blur' },
], ],
memo: [ memo: [
{ type: 'string', message: '备注 值必须为字符串类型', trigger: 'change' },
{ type: 'string', message: '备注 值必须为字符串类型', trigger: 'blur' },
{ required: this.detailsModel.memo.required, type: 'string', message: '备注 值不能为空', trigger: 'change' }, { required: this.detailsModel.memo.required, type: 'string', message: '备注 值不能为空', trigger: 'change' },
{ required: this.detailsModel.memo.required, type: 'string', message: '备注 值不能为空', trigger: 'blur' }, { required: this.detailsModel.memo.required, type: 'string', message: '备注 值不能为空', trigger: 'blur' },
], ],
createman: [ createman: [
{ type: 'string', message: '创建人 值必须为字符串类型', trigger: 'change' },
{ type: 'string', message: '创建人 值必须为字符串类型', trigger: 'blur' },
{ required: this.detailsModel.createman.required, type: 'string', message: '创建人 值不能为空', trigger: 'change' }, { required: this.detailsModel.createman.required, type: 'string', message: '创建人 值不能为空', trigger: 'change' },
{ required: this.detailsModel.createman.required, type: 'string', message: '创建人 值不能为空', trigger: 'blur' }, { required: this.detailsModel.createman.required, type: 'string', message: '创建人 值不能为空', trigger: 'blur' },
], ],
createdate: [ createdate: [
{ type: 'string', message: '创建日期 值必须为字符串类型', trigger: 'change' },
{ type: 'string', message: '创建日期 值必须为字符串类型', trigger: 'blur' },
{ required: this.detailsModel.createdate.required, type: 'string', message: '创建日期 值不能为空', trigger: 'change' }, { required: this.detailsModel.createdate.required, type: 'string', message: '创建日期 值不能为空', trigger: 'change' },
{ required: this.detailsModel.createdate.required, type: 'string', message: '创建日期 值不能为空', trigger: 'blur' }, { required: this.detailsModel.createdate.required, type: 'string', message: '创建日期 值不能为空', trigger: 'blur' },
], ],
updateman: [ updateman: [
{ type: 'string', message: '更新人 值必须为字符串类型', trigger: 'change' },
{ type: 'string', message: '更新人 值必须为字符串类型', trigger: 'blur' },
{ required: this.detailsModel.updateman.required, type: 'string', message: '更新人 值不能为空', trigger: 'change' }, { required: this.detailsModel.updateman.required, type: 'string', message: '更新人 值不能为空', trigger: 'change' },
{ required: this.detailsModel.updateman.required, type: 'string', message: '更新人 值不能为空', trigger: 'blur' }, { required: this.detailsModel.updateman.required, type: 'string', message: '更新人 值不能为空', trigger: 'blur' },
], ],
updatedate: [ updatedate: [
{ type: 'string', message: '更新时间 值必须为字符串类型', trigger: 'change' },
{ type: 'string', message: '更新时间 值必须为字符串类型', trigger: 'blur' },
{ required: this.detailsModel.updatedate.required, type: 'string', message: '更新时间 值不能为空', trigger: 'change' }, { required: this.detailsModel.updatedate.required, type: 'string', message: '更新时间 值不能为空', trigger: 'change' },
{ required: this.detailsModel.updatedate.required, type: 'string', message: '更新时间 值不能为空', trigger: 'blur' }, { required: this.detailsModel.updatedate.required, type: 'string', message: '更新时间 值不能为空', trigger: 'blur' },
], ],
fileid: [
{ type: 'string', message: '标识 值必须为字符串类型', trigger: 'change' },
{ type: 'string', message: '标识 值必须为字符串类型', trigger: 'blur' },
{ required: this.detailsModel.fileid.required, type: 'string', message: '标识 值不能为空', trigger: 'change' },
{ required: this.detailsModel.fileid.required, type: 'string', message: '标识 值不能为空', trigger: 'blur' },
],
} }
} }
...@@ -746,32 +666,38 @@ export default class MainBase extends Vue implements ControlInterface { ...@@ -746,32 +666,38 @@ export default class MainBase extends Vue implements ControlInterface {
falg.isPast = val; falg.isPast = val;
} }
} }
rule[name].forEach((item:any) => { for(let i=0;i<rule[name].length;i++){
let item:any = rule[name][i];
let dataValue = item.deName?this.data[this.service.getItemNameByDeName(item.deName)]:""; let dataValue = item.deName?this.data[this.service.getItemNameByDeName(item.deName)]:"";
// 常规规则 // 常规规则
if(item.type == 'SIMPLE'){ if(item.type == 'SIMPLE'){
startOp(!this.$verify.checkFieldSimpleRule(dataValue,item.condOP,item.paramValue,item.ruleInfo,item.paramType,this.data,item.isKeyCond)); startOp(!this.$verify.checkFieldSimpleRule(dataValue,item.condOP,item.paramValue,item.ruleInfo,item.paramType,this.data,item.isKeyCond));
falg.infoMessage = item.ruleInfo; falg.infoMessage = item.ruleInfo;
if(!falg.isPast) return falg;
} }
// 数值范围 // 数值范围
if(item.type == 'VALUERANGE2'){ if(item.type == 'VALUERANGE2'){
startOp( !this.$verify.checkFieldValueRangeRule(dataValue,item.minValue,item.isIncludeMinValue,item.maxValue,item.isIncludeMaxValue,item.ruleInfo,item.isKeyCond)); startOp( !this.$verify.checkFieldValueRangeRule(dataValue,item.minValue,item.isIncludeMinValue,item.maxValue,item.isIncludeMaxValue,item.ruleInfo,item.isKeyCond));
falg.infoMessage = item.ruleInfo; falg.infoMessage = item.ruleInfo;
if(!falg.isPast) return falg;
} }
// 正则式 // 正则式
if (item.type == "REGEX") { if (item.type == "REGEX") {
startOp(!this.$verify.checkFieldRegExRule(dataValue,item.regExCode,item.ruleInfo,item.isKeyCond)); startOp(!this.$verify.checkFieldRegExRule(dataValue,item.regExCode,item.ruleInfo,item.isKeyCond));
falg.infoMessage = item.ruleInfo; falg.infoMessage = item.ruleInfo;
if(!falg.isPast) return falg;
} }
// 长度 // 长度
if (item.type == "STRINGLENGTH") { if (item.type == "STRINGLENGTH") {
startOp(!this.$verify.checkFieldStringLengthRule(dataValue,item.minValue,item.isIncludeMinValue,item.maxValue,item.isIncludeMaxValue,item.ruleInfo,item.isKeyCond)); startOp(!this.$verify.checkFieldStringLengthRule(dataValue,item.minValue,item.isIncludeMinValue,item.maxValue,item.isIncludeMaxValue,item.ruleInfo,item.isKeyCond));
falg.infoMessage = item.ruleInfo; falg.infoMessage = item.ruleInfo;
if(!falg.isPast) return falg;
} }
// 系统值规则 // 系统值规则
if(item.type == "SYSVALUERULE") { if(item.type == "SYSVALUERULE") {
startOp(!this.$verify.checkFieldSysValueRule(dataValue,item.sysRule.regExCode,item.ruleInfo,item.isKeyCond)); startOp(!this.$verify.checkFieldSysValueRule(dataValue,item.sysRule.regExCode,item.ruleInfo,item.isKeyCond));
falg.infoMessage = item.ruleInfo; falg.infoMessage = item.ruleInfo;
if(!falg.isPast) return falg;
} }
// 分组 // 分组
if(item.type == 'GROUP'){ if(item.type == 'GROUP'){
...@@ -779,9 +705,9 @@ export default class MainBase extends Vue implements ControlInterface { ...@@ -779,9 +705,9 @@ export default class MainBase extends Vue implements ControlInterface {
if(item.isNotMode){ if(item.isNotMode){
falg.isPast = !falg.isPast; falg.isPast = !falg.isPast;
} }
} if(!falg.isPast) return falg;
}
}); }
if(!falg.hasOwnProperty("isPast")){ if(!falg.hasOwnProperty("isPast")){
falg.isPast = true; falg.isPast = true;
} }
...@@ -1548,12 +1474,12 @@ export default class MainBase extends Vue implements ControlInterface { ...@@ -1548,12 +1474,12 @@ export default class MainBase extends Vue implements ControlInterface {
/** /**
* 部件刷新 * 部件刷新
* *
* @param {any[]} args * @param {any} args
* @memberof MainBase * @memberof MainBase
*/ */
public refresh(args: any[]): void { public refresh(args?: any): void {
let arg: any = {}; let arg: any = {};
Object.assign(arg,args[0]); Object.assign(arg,args?args[0]:{});
if (this.data.srfkey && !Object.is(this.data.srfkey, '')) { if (this.data.srfkey && !Object.is(this.data.srfkey, '')) {
Object.assign(arg, { srfkey: this.data.srfkey }); Object.assign(arg, { srfkey: this.data.srfkey });
this.load(arg); this.load(arg);
......
...@@ -4,5 +4,5 @@ Tip: If the failing expression is known to be legally refer to something that's ...@@ -4,5 +4,5 @@ Tip: If the failing expression is known to be legally refer to something that's
---- ----
FTL stack trace ("~" means nesting-related): FTL stack trace ("~" means nesting-related):
- Failed at: ${appde.getKeyPSAppDEField().getCodeN... [in template "TEMPLCODE_en_US" at line 359, column 14] - Failed at: ${appde.getKeyPSAppDEField().getCodeN... [in template "TEMPLCODE_en_US" at line 368, column 14]
---- ----
\ No newline at end of file
...@@ -4,5 +4,5 @@ Tip: If the failing expression is known to be legally refer to something that's ...@@ -4,5 +4,5 @@ Tip: If the failing expression is known to be legally refer to something that's
---- ----
FTL stack trace ("~" means nesting-related): FTL stack trace ("~" means nesting-related):
- Failed at: ${ctrl.getPSAppDataEntity().getMajorP... [in template "TEMPLCODE_en_US" at line 1142, column 39] - Failed at: ${ctrl.getPSAppDataEntity().getMajorP... [in template "TEMPLCODE_en_US" at line 1156, column 39]
---- ----
\ No newline at end of file
...@@ -4,5 +4,5 @@ Tip: If the failing expression is known to be legally refer to something that's ...@@ -4,5 +4,5 @@ Tip: If the failing expression is known to be legally refer to something that's
---- ----
FTL stack trace ("~" means nesting-related): FTL stack trace ("~" means nesting-related):
- Failed at: ${appde.getKeyPSAppDEField().getCodeN... [in template "TEMPLCODE_en_US" at line 368, column 35] - Failed at: ${appde.getKeyPSAppDEField().getCodeN... [in template "TEMPLCODE_en_US" at line 396, column 35]
---- ----
\ No newline at end of file
...@@ -37,11 +37,6 @@ ...@@ -37,11 +37,6 @@
git clone -b master $para2 ibzdisk/ git clone -b master $para2 ibzdisk/
export NODE_OPTIONS=--max-old-space-size=4096 export NODE_OPTIONS=--max-old-space-size=4096
cd ibzdisk/ cd ibzdisk/
mvn clean package -Papi
cd ibzdisk-provider/ibzdisk-provider-api
mvn -Papi docker:build
mvn -Papi docker:push
docker -H $para1 stack deploy --compose-file=src/main/docker/ibzdisk-provider-api.yaml ibzlab-rt --with-registry-auth
</command> </command>
</hudson.tasks.Shell> </hudson.tasks.Shell>
</builders> </builders>
......
...@@ -17,7 +17,7 @@ zuul: ...@@ -17,7 +17,7 @@ zuul:
serviceId: ${ibiz.ref.service.uaa:ibzuaa-api} serviceId: ${ibiz.ref.service.uaa:ibzuaa-api}
stripPrefix: false stripPrefix: false
config: config:
path: /config/** path: /configs/**
serviceId: ${ibiz.ref.service.uaa:ibzuaa-api} serviceId: ${ibiz.ref.service.uaa:ibzuaa-api}
stripPrefix: false stripPrefix: false
oucore: oucore:
......
...@@ -18,6 +18,7 @@ import cn.ibizlab.util.domain.EntityBase; ...@@ -18,6 +18,7 @@ import cn.ibizlab.util.domain.EntityBase;
import cn.ibizlab.util.annotation.DEField; import cn.ibizlab.util.annotation.DEField;
import cn.ibizlab.util.enums.DEPredefinedFieldType; import cn.ibizlab.util.enums.DEPredefinedFieldType;
import cn.ibizlab.util.enums.DEFieldDefaultValueType; import cn.ibizlab.util.enums.DEFieldDefaultValueType;
import cn.ibizlab.util.helper.DataObject;
import java.io.Serializable; import java.io.Serializable;
import lombok.*; import lombok.*;
import org.springframework.data.annotation.Transient; import org.springframework.data.annotation.Transient;
......
...@@ -209,6 +209,7 @@ public class SDFileServiceImpl extends ServiceImpl<SDFileMapper, SDFile> impleme ...@@ -209,6 +209,7 @@ public class SDFileServiceImpl extends ServiceImpl<SDFileMapper, SDFile> impleme
} }
} }
......
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.9.xsd">
<changeSet author="Think (generated)" id="1592547336292-1">
<preConditions onFail="MARK_RAN" >
<not >
<tableExists tableName="IBZCFG" />
</not>
</preConditions>
<createTable remarks="配置" tableName="IBZCFG">
<column name="CFGID" remarks="配置标识" type="VARCHAR(100)">
<constraints primaryKey="true"/>
</column>
<column name="SYSTEMID" remarks="系统标识" type="VARCHAR(100)"/>
<column name="CFGTYPE" remarks="配置类型" type="VARCHAR(100)"/>
<column name="TARGETTYPE" remarks="引用对象" type="VARCHAR(100)"/>
<column name="USERID" remarks="用户标识" type="VARCHAR(100)"/>
<column name="CFG" remarks="配置" type="MEDIUMTEXT"/>
<column name="UPDATEDATE" remarks="更新时间" type="datetime"/>
</createTable>
</changeSet>
</databaseChangeLog>
...@@ -12,6 +12,6 @@ CMD echo "The application will start in ${IBIZ_SLEEP}s..." && \ ...@@ -12,6 +12,6 @@ CMD echo "The application will start in ${IBIZ_SLEEP}s..." && \
sleep ${IBIZ_SLEEP} && \ sleep ${IBIZ_SLEEP} && \
java ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -jar /ibzdisk-provider-api.jar java ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -jar /ibzdisk-provider-api.jar
EXPOSE 40006 EXPOSE 8081
ADD ibzdisk-provider-api.jar /ibzdisk-provider-api.jar ADD ibzdisk-provider-api.jar /ibzdisk-provider-api.jar
...@@ -3,22 +3,9 @@ services: ...@@ -3,22 +3,9 @@ services:
ibzdisk-provider-api: ibzdisk-provider-api:
image: registry.cn-shanghai.aliyuncs.com/ibizsys/ibzdisk-provider-api:latest image: registry.cn-shanghai.aliyuncs.com/ibizsys/ibzdisk-provider-api:latest
ports: ports:
- "40006:40006" - "8081:8081"
networks: networks:
- agent_network - agent_network
environment:
- SPRING_CLOUD_NACOS_DISCOVERY_IP=172.16.180.237
- SERVER_PORT=40006
- SPRING_CLOUD_NACOS_DISCOVERY_SERVER-ADDR=172.16.102.211:8848
- SPRING_REDIS_HOST=172.16.100.243
- SPRING_REDIS_PORT=6379
- SPRING_REDIS_DATABASE=0
- SPRING_DATASOURCE_USERNAME=a_A_5d9d78509
- SPRING_DATASOURCE_PASSWORD=@6dEfb3@
- SPRING_DATASOURCE_URL=jdbc:mysql://172.16.180.232:3306/a_A_5d9d78509?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&useOldAliasMetadataBehavior=true&allowMultiQueries=true
- SPRING_DATASOURCE_DRIVER-CLASS-NAME=com.mysql.jdbc.Driver
- SPRING_DATASOURCE_DEFAULTSCHEMA=a_A_5d9d78509
- NACOS=172.16.102.211:8848
deploy: deploy:
resources: resources:
limits: limits:
......
...@@ -157,5 +157,7 @@ public class SDFileResource { ...@@ -157,5 +157,7 @@ public class SDFileResource {
return ResponseEntity.status(HttpStatus.OK) return ResponseEntity.status(HttpStatus.OK)
.body(new PageImpl(sdfileMapping.toDto(domains.getContent()), context.getPageable(), domains.getTotalElements())); .body(new PageImpl(sdfileMapping.toDto(domains.getContent()), context.getPageable(), domains.getTotalElements()));
} }
} }
...@@ -54,19 +54,20 @@ public class AuditAspect ...@@ -54,19 +54,20 @@ public class AuditAspect
return; return;
Object serviceParam =args[0]; Object serviceParam =args[0];
EntityBase entity=(EntityBase)serviceParam;//创建数据 if(serviceParam instanceof EntityBase){
Map<String, Audit> auditFields= DEFieldCacheMap.getAuditFields(entity.getClass()); EntityBase entity=(EntityBase)serviceParam;//创建数据
if(auditFields.size()==0)//是否有审计属性 Map<String, Audit> auditFields= DEFieldCacheMap.getAuditFields(entity.getClass());
return; if(auditFields.size()==0)//是否有审计属性
return;
String idField=DEFieldCacheMap.getDEKeyField(entity.getClass()); String idField=DEFieldCacheMap.getDEKeyField(entity.getClass());
Object idValue=""; Object idValue="";
if(!StringUtils.isEmpty(idField)){ if(!StringUtils.isEmpty(idField)){
idValue=entity.get(idField); idValue=entity.get(idField);
}
//记录审计日志
dataAuditService.createAudit(request,entity,idValue,auditFields);
} }
//记录审计日志
dataAuditService.createAudit(request,entity,idValue,auditFields);
return;
} }
/** /**
...@@ -88,27 +89,30 @@ public class AuditAspect ...@@ -88,27 +89,30 @@ public class AuditAspect
return point.proceed(); return point.proceed();
Object arg=args[0]; Object arg=args[0];
EntityBase entity= (EntityBase) arg; if(arg instanceof EntityBase){
Map<String, Audit> auditFields= DEFieldCacheMap.getAuditFields(entity.getClass()); EntityBase entity= (EntityBase) arg;
Map<String, Audit> auditFields= DEFieldCacheMap.getAuditFields(entity.getClass());
//是否有审计属性 //是否有审计属性
if(auditFields.size()==0) if(auditFields.size()==0)
return point.proceed(); return point.proceed();
String idField=DEFieldCacheMap.getDEKeyField(entity.getClass()); String idField=DEFieldCacheMap.getDEKeyField(entity.getClass());
Object idValue=""; Object idValue="";
if(!StringUtils.isEmpty(idField)){ if(!StringUtils.isEmpty(idField)){
idValue=entity.get(idField); idValue=entity.get(idField);
} }
if(ObjectUtils.isEmpty(idValue)) if(ObjectUtils.isEmpty(idValue))
return point.proceed(); return point.proceed();
//获取更新前实体 //获取更新前实体
EntityBase beforeEntity=getEntity(serviceObj,idValue); EntityBase beforeEntity=getEntity(serviceObj,idValue);
//执行更新操作 //执行更新操作
point.proceed(); point.proceed();
//记录审计日志 //记录审计日志
dataAuditService.updateAudit(request,beforeEntity,serviceObj,idValue,auditFields); dataAuditService.updateAudit(request,beforeEntity,serviceObj,idValue,auditFields);
return true; return true;
}
return point.proceed();
} }
/** /**
......
...@@ -11,6 +11,7 @@ import java.util.Map; ...@@ -11,6 +11,7 @@ import java.util.Map;
import java.util.concurrent.Callable; import java.util.concurrent.Callable;
import cn.ibizlab.util.cache.listener.RedisPublisher; import cn.ibizlab.util.cache.listener.RedisPublisher;
import cn.ibizlab.util.enums.RedisChannelTopic; import cn.ibizlab.util.enums.RedisChannelTopic;
import org.springframework.util.ObjectUtils;
/** /**
* 缓存分层类 * 缓存分层类
...@@ -58,11 +59,16 @@ public class LayeringCache extends AbstractValueAdaptingCache { ...@@ -58,11 +59,16 @@ public class LayeringCache extends AbstractValueAdaptingCache {
@Override @Override
public ValueWrapper get(Object key) { public ValueWrapper get(Object key) {
ValueWrapper wrapper = caffeineCache.get(key); ValueWrapper wrapper = caffeineCache.get(key);
log.debug("查询一级缓存 key:{},value:{}", key,wrapper); Object value=ObjectUtils.isEmpty(wrapper)?null:wrapper.get();
if (wrapper == null) { log.debug("查询一级缓存 key:{} ,value:{}", key,value);
if (ObjectUtils.isEmpty(value)) {
wrapper = redisCache.get(key); wrapper = redisCache.get(key);
caffeineCache.put(key, wrapper == null ? null : wrapper.get()); value=ObjectUtils.isEmpty(wrapper)?null:wrapper.get();
log.debug("查询二级缓存,并将数据放到一级缓存。 key:{}", key); log.debug("查询二级缓存 key:{} ,value:{}", key,value);
if(!ObjectUtils.isEmpty(value)){
caffeineCache.put(key, value);
log.debug("查询二级缓存,并将数据放到一级缓存。 key:{} ,value:{}", key,value);
}
} }
return wrapper; return wrapper;
} }
......
...@@ -67,7 +67,6 @@ public class SearchContextBase implements ISearchContext{ ...@@ -67,7 +67,6 @@ public class SearchContextBase implements ISearchContext{
* 工作流流程标识 * 工作流流程标识
*/ */
public String processDefinitionKey; public String processDefinitionKey;
/** /**
* 获取工作流步骤标识 * 获取工作流步骤标识
*/ */
......
#缓存、数据源 #缓存、数据源
spring: spring:
cache: cache:
......
Markdown 格式
0% or
您添加了 0 到此讨论。请谨慎行事。
先完成此消息的编辑!
想要评论请 注册