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

ibiz4j 发布系统代码 [ibiz-task,任务调度]

上级 8e1162eb
......@@ -12,3 +12,4 @@
**.iml
*.jar
*.log
.DS_Store
此差异已折叠。
......@@ -9,8 +9,7 @@
"dev-build": "node --max_old_space_size=8102 ./node_modules/@vue/cli-service/bin/vue-cli-service build --mode development",
"test:unit": "vue-cli-service test:unit",
"test:e2e": "vue-cli-service test:e2e",
"lint": "vue-cli-service lint",
"format-code": "prettier-eslint --write \"src/**/*.js\" \"src/**/*.vue\" \"src/**/*.tsx\" \"src/**/*.ts\" \"src/**/*.less\""
"lint": "vue-cli-service lint"
},
"dependencies": {
"@fullcalendar/core": "^4.4.0",
......@@ -30,6 +29,7 @@
"font-awesome": "^4.7.0",
"ibiz-gantt-elastic": "^1.0.17",
"ibiz-vue-lib": "^0.1.13",
"ibiz-vue-pivottable": "^1.0.6",
"interactjs": "^1.9.4",
"moment": "^2.24.0",
"path-to-regexp": "^6.1.0",
......@@ -38,6 +38,7 @@
"tinymce": "4.8.5",
"view-design": "4.2.0",
"vue": "^2.6.10",
"vue-amap": "^0.5.10",
"vue-class-component": "^7.0.2",
"vue-grid-layout": "^2.3.7",
"vue-i18n": "^8.15.3",
......@@ -65,14 +66,7 @@
"less-loader": "^5.0.0",
"mockjs": "^1.1.0",
"script-loader": "^0.7.2",
"typescript": "~3.5.3",
"typescript": "^4.0.3",
"vue-template-compiler": "^2.6.10"
},
"eslintConfig": {
"root": true,
"extends": [
"gitee",
"stylelint-config-prettier"
]
}
}
......@@ -99,6 +99,14 @@ import AppAlertGroup from './components/app-alert-group/app-alert-group.vue'
import AppRawItem from './components/app-rawitem/app-rawitem.vue'
import AppImageRomate from './components/app-image-romate/app-image-romate.vue'
import { MenuIcon } from './components/menu-icon/menu-icon'
import AppVuePivottable from './components/app-vue-pivottable/app-vue-pivottable.vue';
import AppMapPosition from './components/app-map-position/app-map-position.vue';
import AppSortBar from './components/app-sort-bar/app-sort-bar.vue';
import AppAfterTime from './components/app-after-time/app-after-time.vue';
import AppInputIp from './components/app-input-ip/app-input-ip.vue';
import Loadding from './directive/loadding/loadding';
import AppColorSpan from './components/app-color-span/app-color-span.vue';
import AppColorPicker from './components/app-color-picker/app-color-picker.vue';
// 全局挂载UI实体服务注册中心
window['uiServiceRegister'] = uiServiceRegister;
......@@ -213,5 +221,13 @@ export const AppComponents = {
v.component('app-rawitem',AppRawItem);
v.component('app-image-romate', AppImageRomate);
v.component('menu-icon', MenuIcon);
v.component('app-vue-pivottable', AppVuePivottable);
v.component('app-map-position', AppMapPosition);
v.component('app-sort-bar', AppSortBar);
v.component('app-after-time', AppAfterTime);
v.component('app-input-ip', AppInputIp);
v.directive('loading',Loadding);
v.component('app-color-span', AppColorSpan);
v.component('app-color-picker', AppColorPicker);
},
};
\ No newline at end of file
......@@ -69,6 +69,30 @@ export default class CodeListService {
return (window as any)['codeListRegister'].getService(name);
}
/**
* 获取代码表数据
*
* @param {string} tag 代码表标识
* @param {*} context
* @param {*} data
* @param {boolean} isloading
* @returns {Promise<any[]>}
* @memberof CodeListService
*/
public async getDataItems(codelist:any,context?:any, data?: any, isloading?: boolean){
let dataItems:Array<any> = [];
try{
if(codelist.tag && Object.is(codelist.type,"STATIC")){
dataItems = await this.getStaticItems(codelist.tag);
}else{
dataItems = await this.getItems(codelist.tag,codelist.context,codelist.viewparam,codelist.isloading);
}
}catch(error){
console.warn("代码表加载异常" + error);
}
return dataItems;
}
/**
* 获取静态代码表
*
......
<template>
<div class="app-after-time">
<span v-if="diffTime =='minutes'">{{curvalue}}{{$t('components.appAfterTime.minutesAgo')}}</span>
<span v-if="diffTime =='hours'">{{curvalue}}{{$t('components.appAfterTime.hoursAgo')}}</span>
<span v-if="diffTime =='days'">{{curvalue}}{{$t('components.appAfterTime.dayAgo')}}</span>
<span v-if="diffTime =='mouth'">{{curvalue}}{{$t('components.appAfterTime.monthsAgo')}}</span>
<span v-if="diffTime =='years'">{{curvalue}}{{$t('components.appAfterTime.yearsAgo')}}</span>
<span v-if="!diffTime">&nbsp;</span>
</div>
</template>
<script lang="ts">
import { Vue, Component, Prop, Emit, Watch, Model } from 'vue-property-decorator';
import { Subject, Subscription } from 'rxjs';
import moment from 'moment';
@Component({})
export default class AppAfterTime extends Vue {
/**
* 属性项名称
*
* @type {string}
* @memberof AppAfterTime
*/
@Prop() public name!: string;
/**
* 应用上下文
*
* @type {any}
* @memberof AppAfterTime
*/
@Prop() context: any;
/**
* 视图参数
*
* @type {any}
* @memberof AppAfterTime
*/
@Prop() viewparam: any;
/**
* 表单状态对象
*
* @type {Subject<any>}
* @memberof AppAfterTime
*/
@Prop() public formState?:Subject<any>;
/**
* 表单绑定数据
*
* @type {any}
* @memberof AppAfterTime
*/
@Model('change') public value:any;
/**
* 当前值
*
* @type {any}
* @memberof AppAfterTime
*/
public curvalue: string = '';
/**
* 毫秒差
*
* @type {any}
* @memberof AppAfterTime
*/
public diffTime:any='';
/**
* 值变化
*
* @param {*} newVal
* @param {*} oldVal
* @memberof AppAfterTime
*/
@Watch('value')
public onValueChange(newVal: any, oldVal: any) {
this.transTime();
}
/**
* Vue声明周期(处理组件的输入属性)
*
* @memberof AppAfterTime
*/
public created(){
if(this.formState){
this.formState.subscribe(({type,data})=>{
if(Object.is('load',type)){
this.transTime();
}
})
}
this.transTime();
}
/**
* 处理时间
*
* @memberof AppAfterTime
*/
public transTime(){
if(this.value){
let dateString:any = 'YYYY年MM月DD日' || 'YYYY年MM月DD日 HH时mm分ss秒' || 'YYYY-MM-DD HH:mm:ss' || 'YYYY-MM-DD' || 'YYYY/MM/DD HH:mm:ss' || 'YYYY/MM/DD';
let oldTime = moment(this.value,dateString).valueOf();
let nowTime = moment().valueOf();
let diffTime = nowTime - oldTime;
if(diffTime < 3600000){
this.curvalue = Math.ceil(diffTime/60000)+'';
this.diffTime = 'minutes';
}else if(diffTime < 86400000){
this.curvalue = Math.ceil(diffTime/3600000)+'';
this.diffTime = 'hours';
}else if(diffTime < 2592000000){
this.curvalue = Math.floor(diffTime/86400000)+'';
this.diffTime = 'days';
}else if(diffTime < 31104000000){
this.curvalue = Math.floor(diffTime/2592000000)+'';
this.diffTime = 'mouth';
}else{
this.curvalue = Math.floor(diffTime/31104000000)+'';
this.diffTime = 'years';
}
}
}
}
</script>
<style>
.app-after-time{
margin-left: 6px;
}
</style>
\ No newline at end of file
......@@ -110,4 +110,10 @@ export default class AppAlertGroup extends Vue {
});
}
}
</script>
\ No newline at end of file
</script>
<style lang="less">
.view-body-messages {
margin-bottom: 6px;
}
</style>
\ No newline at end of file
.app-color-picker {
.el-color-picker__trigger {
border: none;
left: 6px;
.el-color-picker__color {
border: 0.5px solid #dcdee2;
cursor: pointer;
top: 20px;
width: 77%;
height: 5px;
left: 3px;
.el-icon-close {
display: none;
}
}
}
.ivu-icon {
font-size: 22px;
position: absolute;
top: 2px;
right: -1px;
cursor: pointer;
}
}
\ No newline at end of file
<template>
<div class="app-color-picker">
<el-input
v-model="curVal"
size="small"
ref="colorPicker"
:disabled="disabled"
:placeholder="placeholder"
>
<template slot="suffix">
<el-color-picker ref="picker" v-model="colorValue" @change="colorChange" size="small">
</el-color-picker>
<Icon type="md-color-palette" @click="iconClick" />
</template>
</el-input>
</div>
</template>
<script lang="ts">
import { Vue, Component, Watch, Prop, Model } from 'vue-property-decorator';
import CodeListService from '@codelist/codelist-service';
import { Subject, Subscription } from 'rxjs';
@Component({})
export default class AppColorPicker extends Vue {
/**
* 双向绑定表单项数据
*
* @type {*}
* @memberof AppColorPicker
*/
@Model('change') public value: any;
/**
* 表单数据
*
* @type {*}
* @memberof AppColorPicker
*/
@Prop() public data: any;
/**
* 表单通讯对象
*
* @type {*}
* @memberof AppColorPicker
*/
@Prop() public formState?: Subject<any>;
/**
* 禁用状态
*
* @type {*}
* @memberof AppColorPicker
*/
@Prop({default: false}) public disabled?: boolean;
/**
* 占位提示
*
* @type {*}
* @memberof AppColorPicker
*/
@Prop() public placeholder?: string;
/**
* 上下文
*
* @type {*}
* @memberof AppColorPicker
*/
@Prop() public context: any;
/**
* 视图参数
*
* @type {*}
* @memberof AppColorPicker
*/
@Prop() public viewparam: any;
/**
* 颜色对应字段值
*
* @type {*}
* @memberof AppColorPicker
*/
@Prop() public color: any;
/**
* 双向绑定颜色
*
* @type {*}
* @memberof AppColorPicker
*/
public colorValue: any = null;
/**
* 获取输入框值
*
* @type {*}
* @memberof AppColorPicker
*/
get curVal() {
return this.value;
}
/**
* 设置值
*
* @type {*}
* @memberof AppColorPicker
*/
set curVal(val: any) {
this.$emit('change', val);
}
/**
* Vue生命周期
*
* @memberof AppColorPicker
*/
public created() {
this.handleData();
}
/**
* 数据处理
*
* @memberof AppColorPicker
*/
@Watch('value')
public handleData() {
if(!this.value && !this.color) {
return;
}
this.colorValue = this.data[this.color];
this.curVal = this.value;
this.handleInputColor(this.colorValue);
}
/**
* 数据处理
*
* @memberof AppColorPicker
*/
public colorChange(color: any) {
this.handleInputColor(color);
this.$emit('colorChange', { name: this.color, value: color });
}
/**
* 设置输入框字体颜色
*
* @memberof AppColorPicker
*/
public handleInputColor(color: any) {
let picker: any = this.$refs.colorPicker;
if(picker) {
let child: any = picker.$el.children[0];
child.style.color = color;
}
}
/**
* 模拟点击事件
*
* @memberof AppColorPicker
*/
public iconClick() {
let picker: any = this.$refs.picker;
let e: any = document.createEvent('MouseEvent');
e.initEvent('click', true, true);
if(picker) {
picker.$el.children[0].dispatchEvent(e);
}
}
}
</script>
<style lang="less">
@import './app-color-picker.less';
</style>
<template>
<div class="app-color-span">
<span v-if="color" :style="{ color:textColor }">{{ text ? text : '---' }}</span>
<template v-else>
<template v-if="dataValue && dataValue.length > 0">
<span v-for="(textItem,index) of dataValue" :key="index" class="text-color" :style="{ backgroundColor:textItem.color }">
{{ textItem.srfmajortext ? textItem.srfmajortext : '---'}}
</span>
</template>
<span v-else>---</span>
</template>
</div>
</template>
<script lang="ts">
import { Vue, Component, Watch, Prop, Model } from 'vue-property-decorator';
import CodeListService from '@codelist/codelist-service';
import { Subject, Subscription } from 'rxjs';
@Component({
})
export default class AppColorSpan extends Vue {
/**
* 当前值
*
* @type {*}
* @memberof AppColorSpan
*/
@Prop() public value: any;
/**
* 当前表单项名称
*
* @type {*}
* @memberof AppColorSpan
*/
@Prop() public name?: any;
/**
* 代码表类型
*
* @type {string}
* @memberof AppColorSpan
*/
@Prop() public codelistType?: string;
/**
* 传入表单数据
*
* @type {*}
* @memberof AppColorSpan
*/
@Prop() public data?: any;
/**
* 局部上下文导航参数
*
* @type {any}
* @memberof AppColorSpan
*/
@Prop() public localContext!: any;
/**
* 局部导航参数
*
* @type {any}
* @memberof AppColorSpan
*/
@Prop() public localParam!: any;
/**
* 视图上下文
*
* @type {*}
* @memberof AppColorSpan
*/
@Prop() public context!: any;
/**
* 视图参数
*
* @type {*}
* @memberof AppColorSpan
*/
@Prop() public viewparams!: any;
/**
* 颜色标识
*
* @type {*}
* @memberof AppColorSpan
*/
@Prop() color:any;
/**
* 颜色
*
* @type {*}
* @memberof AppColorSpan
*/
public textColor:any;
/**
* 显示值
* @type {*}
* @memberof AppColorSpan
*/
public text: any = '';
/**
* 数据数组
*
* @type {*}
* @memberof AppColorSpan
*/
public dataValue:Array<any> = [];
/**
* 监听value
*
* @memberof AppColorSpan
*/
@Watch('value')
public valueChange(newVal:any,oldVal:any){
if(newVal !== oldVal){
this.load();
}
}
/**
* 加载数据
*
* @memberof AppColorSpan
*/
public load(){
if(this.color){
this.text = this.value;
this.textColor = this.data[this.color];
}else{
this.dataValue = JSON.parse(this.value);
}
}
/**
* vue 生命周期
*
* @memberof AppColorSpan
*/
public created() {
this.load();
}
}
</script>
<style lang="less">
.text-color{
padding: 2px;
margin: 6px;
border-radius: 4px;
}
</style>
\ No newline at end of file
<template>
<div class='form-druipart'>
<component
ref="appFormDruipart"
:is="viewname"
class="viewcontainer2"
:viewdata ="viewdata"
......@@ -178,6 +179,14 @@ export default class AppFormDRUIPart extends Vue {
*/
private formStateEvent: Unsubscribable | undefined;
/**
* 定时器实例
*
* @type {[any]}
* @memberof AppFormDRUIPart
*/
protected timer?: any;
/**
* 监控值
*
......@@ -308,11 +317,43 @@ export default class AppFormDRUIPart extends Vue {
}
if(!this.isForbidLoad){
setTimeout(() => {
this.formDruipart.next({action:'load',data:{srfparentdename:this.parentName,srfparentkey:_paramitem}});
this.partViewEvent('load',{data:{srfparentdename:this.parentName,srfparentkey:_paramitem}},0);
}, 0);
}
}
/**
* 向关系视图发送事件,采用轮询模式。避免异步视图出现加载慢情况
*
* @param {*} action 触发行为
* @param {*} data 数据
* @param {*} count 轮询计数
* @memberof AppFormDRUIPart
*/
protected partViewEvent(action: string, data: any, count: number = 0): void {
if (count > 100) {
return;
}
const clearResource:Function = () =>{
if(this.timer !== undefined){
clearTimeout(this.timer);
this.timer = undefined;
}
}
if (count === 0) {
clearResource();
}
if (this.$refs.appFormDruipart) {
this.formDruipart.next({ action: action, data });
clearResource();
return;
}
this.timer = setTimeout(() => {
count++;
this.partViewEvent(action, data, count);
}, 30);
}
/**
* vue 生命周期
*
......
......@@ -10,7 +10,9 @@
}
.app-form-item-label {
padding: 6px 10px 6px 0px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
}
......
......@@ -21,7 +21,7 @@
class="editor"
:style="slotstyle"
>
<form-item :prop="name" :error="error" :required="required" :rules="rules">
<form-item :prop="name" :error="error" :rules="rules">
<slot></slot>
</form-item>
</div>
......@@ -31,14 +31,24 @@
:class="labelclasses"
>
<span v-if="required" style="color:red;">* </span>
{{this.isEmptyCaption ? '' : this.caption}}
<span v-if="!isEmptyCaption">
<el-tooltip v-if="isShowTip" placement="top" effect="light">
<span v-html="caption"></span>
<template >
<span slot="content" v-html="caption" ></span>
</template>
</el-tooltip>
<template v-if="!isShowTip">
<span v-html="caption" ></span>
</template>
</span>
</span>
<div
v-if="Object.is(this.labelPos,'TOP') || Object.is(this.labelPos,'LEFT') || Object.is(this.labelPos,'RIGHT')"
class="editor"
:style="slotstyle"
>
<form-item :prop="name" :error="error" :required="required" :rules="rules">
<form-item :prop="name" :error="error" :rules="rules">
<slot></slot>
</form-item>
</div>
......@@ -136,6 +146,14 @@ export default class AppFormItem extends Vue {
*/
@Prop() public itemRules!: any;
/**
* 是否显示表单项Label提示
*
* @memberof AppFormItem
*/
public isShowTip:boolean = false;
/**
* 值规则数组
*
......@@ -266,7 +284,21 @@ export default class AppFormItem extends Vue {
});
} catch (error) {}
}
this.getShowTip();
}
/**
* 计算是否显示表单项Label提示
*
* @memberof AppFormItem
*/
public getShowTip(){
if(this.caption && ((this.caption.length)*14) > this.labelWidth ){
this.isShowTip = true;
}
}
}
</script>
<style lang='less'>
......
.app-inpu-ip{
display: flex;
flex-wrap: nowrap;
.el-input{
margin-right: 3px;
margin-left: 3px;
}
}
\ No newline at end of file
<template>
<div class="app-inpu-ip">
<el-input
type="text"
size="small"
v-model="firstIp"
maxlength="3" />.
<el-input
type="text"
size="small"
v-model="secIp"
maxlength="3" />.
<el-input
type="text"
size="small"
maxlength="3"
v-model="thirdIp" />.
<el-input
type="text"
size="small"
maxlength="3"
v-model="forIp" />
</div>
</template>
<script lang='ts'>
import { Component, Vue, Prop, Model, Watch } from 'vue-property-decorator';
import { Subject,Subscription } from 'rxjs';
import { debounceTime, distinctUntilChanged } from 'rxjs/operators';
@Component({
})
export default class AppInputIp extends Vue {
/**
* 应用上下文
*
* @type {any}
* @memberof AppInputIp
*/
@Prop() context: any;
/**
* 视图参数
*
* @type {any}
* @memberof AppInputIp
*/
@Prop() viewparam: any;
/**
* 表单状态对象
*
* @type {Subject<any>}
* @memberof AppInputIp
*/
@Prop() public formState!: Subject<any>;
/**表单数据绑定
*
* @type {string}
* @memberof AppInputIp
*/
@Model('change') public ipdata!: string;
/**
* 获取当前值
*
* @type {string}
* @memberof AppInputIp
*/
public CurValue: any[] = [];
/**
* 第一段ip
*
* @type {any}
* @memberof AppInputIp
*/
public firstIp: any = '';
/**
* 第二段ip
*
* @type {any}
* @memberof AppInputIp
*/
public secIp: any = '';
/**
* 第三段ip
*
* @type {any}
*/
public thirdIp: any = '';
/**
* 第四段ip
*
* @type {any}
* @memberof AppInputIp
*/
public forIp: any = '';
/**
* Vue声明周期(处理组件的输入属性)
*
* @memberof AppInputIp
*/
public created(){
if(this.formState){
this.formState.subscribe(({type,data})=>{
if(Object.is('load',type)){
this.loadData();
}
})
}
this.loadData();
}
/**
* 加载数据
*
* @memberof AppInputIp
*/
public loadData(){
if(this.ipdata){
let iparr:Array<any> = this.ipdata.split('.');
this.CurValue = iparr;
this.firstIp = this.CurValue[0];
this.secIp = this.CurValue[1];
this.thirdIp = this.CurValue[2];
this.forIp = this.CurValue[3];
}
}
/**
* 监听每段ip变化
*
* @memberof AppInputIp
*/
@Watch('firstIp')
public FirstIpChange(newVal:any,oldVal:any){
this.checkIpVal(newVal,oldVal,'firstIp',0);
}
@Watch('secIp')
public SecIpChange(newVal:any,oldVal:any){
this.checkIpVal(newVal,oldVal,'secIp',1);
}
@Watch('thirdIp')
public ThirdIpChange(newVal:any,oldVal:any){
this.checkIpVal(newVal,oldVal,'thirdIp',2);
}
@Watch('forIp')
public ForIpChange(newVal:any,oldVal:any){
this.checkIpVal(newVal,oldVal,'forIp',3);
}
/**
* 验证格式
*
* @memberof AppInputIp
*/
public checkIpVal(newVal:any,oldVal:any,flag:any,index:number){
if(newVal === '') return
let val = newVal;
let reg = /^(([0-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5]))))$/g;
if(reg.test(val)){
this.CurValue[index] = val;
}else{
if(flag){
let that:any = this;
that[flag] = oldVal;
this.CurValue[index] = oldVal;
}
}
if(this.firstIp && this.secIp && this.thirdIp && this.forIp){
this.$emit('change',this.firstIp+'.'+this.secIp+'.'+this.thirdIp+'.'+this.forIp);
}
}
}
</script>
<style lang='less'>
@import './app-input-ip.less';
</style>
.app-map-position {
.map-modal {
.el-dialog {
margin-top: 60px !important;
width: 90%;
.el-dialog__header {
padding: 10px 0px 10px 40px;
}
.el-dialog__body {
padding: 6px 10px;
.search-toolbar {
display: flex;
#map__result {
position: absolute;
z-index: 20;
right: 10px;
top: 110px;
}
.el-vue-search-box-container {
border: 1px solid #DCDFE6;
height: 40px;
margin-right: 20px;
}
}
}
.amap-marker-content {
img {
width: 25px;
height: 34px;
}
.input-map__marker {
position: absolute;
top: -28px;
right: -160px;
color: #fff;
padding: 0px 10px;
-webkit-box-shadow: 1px 1px 1px rgba(10,10,10,.2);
box-shadow: 1px 1px 1px rgba(10,10,10,.2);
white-space: nowrap;
font-size: 12px;
font-family: "";
background-color: #25a5f7;
border-radius: 3px;
}
}
}
.el-vue-amap-container {
padding-top: 20px;
height: 640px;
}
}
}
\ No newline at end of file
......@@ -5,6 +5,7 @@
padding: 0 6px;
.editor{
flex-grow: 1;
line-height: 34px;
.editorstyle{
.ivu-input.ivu-input-default{
border-color: red;
......@@ -16,7 +17,7 @@
}
.app-panel-field-label {
height: 34px !important;
line-height: 25px;
line-height: 22px;
flex-shrink: 0;
padding: 6px 10px 6px 0px;
}
......
......@@ -6,7 +6,8 @@
<div class='app-picker'>
<el-autocomplete class='text-value' :value-key="deMajorField" :disabled="disabled" v-model="curvalue" size='small'
:trigger-on-focus="true" :fetch-suggestions="(query, callback) => { this.onSearch(query, callback, true) }" @select="onACSelect"
@input="onInput" @blur="onBlur" style='width:100%;'>
@input="onInput" @blur="onBlur" style='width:100%;'
:placeholder="placeholder">
<template v-slot:default="{item}">
<!-- <template v-if="item.isNew">
<div v-if="linkview" @click="newAndEdit">{{$t('components.appPicker.newAndEdit')}}</div>
......@@ -26,7 +27,7 @@
</div>
<div v-else-if="Object.is(editortype, 'pickup-no-ac')" class='app-picker'>
<div class='app-picker'>
<el-input class='text-value' :value="curvalue" readonly size='small' :disabled="disabled">
<el-input class='text-value' :placeholder="placeholder" :value="curvalue" readonly size='small' :disabled="disabled">
<template slot='suffix'>
<i v-if="curvalue && !disabled" class='el-icon-circle-close' @click="onClear"></i>
<i class='el-icon-search' @click="openView"></i>
......@@ -38,7 +39,8 @@
<div v-else-if="Object.is(editortype, 'dropdown')" class='app-picker'>
<el-select ref="appPicker" remote :remote-method="(query) => this.onSearch(query, null, true)" :value="refvalue" size='small' filterable
@change="onSelect" :disabled="disabled" style='width:100%;' clearable popper-class="app-picker-dropdown"
@clear="onClear" @visible-change="onSelectOpen">
@clear="onClear" @visible-change="onSelectOpen"
:placeholder="placeholder">
<template v-if="items">
<template v-for="_item in items">
<el-option v-if="!_item.tag" :key="_item[deKeyField]" :value="_item[deKeyField]" :label="_item[deMajorField]" :disabled="_item.disabled"></el-option>
......@@ -222,6 +224,14 @@ export default class AppPicker extends Vue {
*/
@Model('change') public value?: any;
/**
* 占位提示
*
* @type {*}
* @memberof AppPicker
*/
@Prop() public placeholder?: string;
/**
* 当前值
*
......@@ -258,7 +268,7 @@ export default class AppPicker extends Vue {
* @type {string}
* @memberof AppPicker
*/
public selectValue = this.value;
public selectValue = null;
/**
* 下拉列表节点元素
......@@ -291,6 +301,7 @@ export default class AppPicker extends Vue {
@Watch('value',{immediate:true})
public onValueChange(newVal: any, oldVal: any) {
this.curvalue = newVal;
this.selectValue = newVal;
if (Object.is(this.editortype, 'dropdown') && this.valueitem) {
const value = this.data[this.valueitem];
const index = this.items.findIndex((item: any) => Object.is(item.value, value));
......@@ -421,7 +432,6 @@ export default class AppPicker extends Vue {
* @param item
*/
public onACSelect(item: any): void {
this.selectValue = item[this.deMajorField];
if (this.valueitem) {
this.$emit('formitemvaluechange', { name: this.valueitem, value: item[this.deKeyField] });
}
......
......@@ -144,7 +144,7 @@ export default class AppQuickGroup extends Vue {
* @memberof AppQuickGroup
*/
public handleClick($event:any,isswitch:boolean = true){
if(this.selectedUiItem && (this.selectedUiItem.id === $event.id)){
if((this.selectedUiItem && (this.selectedUiItem.id === $event.id)) || $event.children) {
return;
}
this.$emit('valuechange',$event);
......
<template>
<div>
<el-rate
:value ="currentVal"
:disabled="disabled"
:max="max"
@change="change"
>
</el-rate>
</div>
<div>
<el-rate :value="currentVal" :disabled="disabled" :max="maxItem" @change="change"> </el-rate>
</div>
</template>
<script lang='ts'>
import { Component, Vue, Prop, Model, Watch } from "vue-property-decorator";
<script lang="ts">
import { Component, Vue, Prop, Model, Watch } from 'vue-property-decorator';
import CodeListService from '@codelist/codelist-service';
@Component({})
export default class AppRate extends Vue {
/**
* 传入值
* @type {any}
* @memberof AppRate
*/
@Prop() public value?:any;
/**
* 是否禁用
* @type {boolean}
* @memberof AppRate
*/
@Prop() public disabled?: boolean;
/**
* 最大值
* @type {number}
* @memberof AppRate
*/
@Prop({default:5}) public max!: number;
/**
* 当前值
*
* @memberof AppRate
*/
get currentVal() {
return this.value;
}
/**
* change
*/
public change(val: any) {
this.$emit("change", val);
}
/**
* 传入值
* @type {any}
* @memberof AppRate
*/
@Prop() public value?: any;
/**
* 是否禁用
* @type {boolean}
* @memberof AppRate
*/
@Prop() public disabled?: boolean;
/**
* 下发数据
* @type {number}
* @memberof AppRate
*/
@Prop() public data?: any;
/**
* 代码表服务对象
*
* @type {CodeListService}
* @memberof AppRate
*/
public codeListService: CodeListService = new CodeListService({ $store: this.$store });
/**
* 传递最大值
* @type {*}
* @memberof AppRate
*/
@Prop({ default: 5 }) public max!: number;
/**
* 应用上下文
* @type {*}
* @memberof AppRate
*/
@Prop() context: any;
/**
* 视图参数
* @type {*}
* @memberof AppRate
*/
@Prop() viewparams: any;
/**
* 临时上下文
* @type {*}
* @memberof AppRate
*/
@Prop() localContext: any;
/**
* 临时参数
* @type {*}
* @memberof AppRate
*/
@Prop() localParam: any;
/**
* 代码表标识
* @type {string}
* @memberof AppRate
*/
@Prop() tag?: string;
/**
* 代码表类型
* @type {string}
* @memberof AppRate
*/
@Prop() codelistType?: string;
/**
* 代码表值分隔符
* @type {string}
* @memberof AppRate
*/
@Prop({default: ','}) valueSeparator?: string;
/**
* 数据名称
* @type {*}
* @memberof AppRate
*/
@Prop() name: any;
/**
* 最大值
* @type {number}
* @memberof AppRate
*/
public maxItem: number = 5;
/**
* 监听数据变化
*
* @memberof AppRate
*/
@Watch('data',{immediate:true,deep:true})
onDataChange(newVal: any, oldVal: any) {
if(newVal){
if(this.tag && this.codelistType == 'DYNAMIC'){
// 公共参数处理
let data: any = {};
this.handlePublicParams(data);
// 参数处理
let _context = data.context;
let _param = data.param;
this.codeListService.getItems(this.tag, _context, _param).then((res: any) => {
const items = res;
// 获取最大值
const maxItem = Math.max.apply(Math,items.map((item: any) => { return item.value; }));
this.maxItem = maxItem>5 ? 5 : maxItem;
}).catch((error: any) => {
console.log(`----${this.tag}----$t('components.appCheckBox.notExist')`);
});
}
}
}
/**
* 当前值
*
* @memberof AppRate
*/
get currentVal() {
return Number(this.value);
}
/**
* change
*/
public change(val: any) {
this.$emit('change', val);
}
/**
* Vue生命周期
* @memberof AppRate
*/
public created() {
if (this.max) {
this.maxItem = this.max;
}
this.handleCodelist();
}
/**
* 公共参数处理
*
* @param {*} arg
* @returns
* @memberof AppRate
*/
public handlePublicParams(arg: any) {
// 合并表单参数
arg.param = this.viewparams ? JSON.parse(JSON.stringify(this.viewparams)) : {};
arg.context = this.context ? JSON.parse(JSON.stringify(this.context)) : {};
// 附加参数处理
if (this.localContext && Object.keys(this.localContext).length >0) {
let _context = this.$util.computedNavData(this.data,arg.context,arg.param,this.localContext);
Object.assign(arg.context,_context);
}
if (this.localParam && Object.keys(this.localParam).length >0) {
let _param = this.$util.computedNavData(this.data,arg.param,arg.param,this.localParam);
Object.assign(arg.param,_param);
}
}
/**
* 根据代码表获取最大值
* @memberof AppRate
*/
public handleCodelist() {
if (this.tag && Object.is(this.codelistType, 'STATIC')) {
const codelist = this.$store.getters.getCodeList(this.tag);
if (codelist) {
const items = [...JSON.parse(JSON.stringify(codelist.items))];
// 获取最大值
const maxItem = Math.max.apply(Math,items.map((item: any) => { return item.value; }));
this.maxItem = maxItem>5 ? 5 : maxItem;
} else {
console.log(`----${this.tag}----$t('components.appCheckBox.notExist')`);
}
} else if (this.tag && Object.is(this.codelistType, 'DYNAMIC')) {
// 公共参数处理
let data: any = {};
this.handlePublicParams(data);
// 参数处理
let _context = data.context;
let _param = data.param;
this.codeListService.getItems(this.tag, _context, _param).then((res: any) => {
const items = res;
// 获取最大值
let maxItem = Math.max.apply(Math,items.map((item: any) => { return item.value; }));
this.maxItem = maxItem>5 ? 5 : maxItem;
}).catch((error: any) => {
console.log(`----${this.tag}----$t('components.appCheckBox.notExist')`);
});
}
}
}
</script>
<style lang='less'>
@import "./app-rate.less";
</style>
\ No newline at end of file
<style lang="less">
@import './app-rate.less';
</style>
.app-sort-bar{
padding: 6px 8px;
.ivu-row-flex.page-sort-bar{
width: 100%;
height: 30px;
position: relative;
.ivu-col{
border-radius: 2px;
user-select: none;
text-align: center;
margin: 0px 16px;
display: flex;
align-items: flex-end;
padding-bottom: 4px;
background-color: #FFF;
border: 1px solid #CCC;
margin-left: -1px;
.sort-field-text{
margin-left: 7px;
}
.caret-wrapper{
width: 15px;
display: inline-block;
position: relative;
top: 4px;
padding-bottom: 2px;
.ivu-icon{
display: block;
line-height: 0.5;
color: #c5c8ce;
}
}
}
// 悬浮样式
.ivu-col:hover{
border:1px solid #82bff7;
position:relative;
z-index:2;
.sort-field-text{
color: #82bff7;
}
}
// 选中样式
.sort-ascending, .sort-descending{
border:1px solid #82bff7;
position:relative;
z-index:2;
.sort-field-text{
color:#82bff7;
font-weight: 800;
}
}
.sort-ascending .caret-wrapper .ivu-icon.ivu-icon-md-arrow-dropup,
.sort-descending .caret-wrapper .ivu-icon.ivu-icon-md-arrow-dropdown{
color: #82bff7;
}
.issort {
position: absolute;
cursor: pointer;
top: 4px;
right: 10px;
}
}
}
.slide-in(@x-begin,@x-end,@c-begin,@c-end,@name){
@keyframes @name{
from {
transform: translateX(@x-begin);
background-color: @c-begin;
}
to {
transform: translateX(@x-end);
background-color: @c-end;
}
}
}
.slide-in(1670px,0px,#fff,#EEF2F5,fadein);
.animation(@animation-name,@animation-duration,@animation-timing-function,@animation-delay,@play-state){
animation: @arguments;
};
.open-bar {
.animation(fadein,0.7s,linear,0s,forwards);
};
\ No newline at end of file
<template>
<div :class="['app-sort-bar', isSort ? 'open-bar' : '',]">
<row v-if="sortModel && sortModel.length>0" class="page-sort-bar" :gutter="10" type="flex" justify="start" style="margin:0px;">
<template v-for="(item, index) in sortModel">
<i-col v-show="isSort" :key="index" :class="getSortClass(item)">
<div >
<div @click="sortItemClick(item)">
<span class="sort-field-text" >{{$t('entities.'+ entityName +'.fields.' + item)}}</span>
<span class="caret-wrapper">
<Icon type="md-arrow-dropup" />
<Icon type="md-arrow-dropdown" />
</span>
</div>
</div>
</i-col>
</template>
<div class="issort" @click="handleSort">
<Icon v-if="isSort" type="ios-funnel-outline" />
<Icon v-else type="ios-funnel" />
{{ $t('components.appSortBar.title') }}
</div>
</row>
</div>
</template>
<script lang='ts'>
import { Component, Vue, Prop, Model, Watch } from "vue-property-decorator";
@Component({})
export default class AppSortBar extends Vue {
@Prop() public sortModel!: any[];
@Prop() public sortField!: any;
@Prop() public sortDir!: any;
@Prop() public entityName!: string;
public isSort: boolean = false;
public getSortClass(name: any) {
if(this.sortField !== name || this.sortDir === ''){
return '';
}else if(this.sortDir === 'asc'){
return 'sort-ascending'
}else if(this.sortDir === 'desc'){
return 'sort-descending'
}
}
public sortItemClick(name: string) {
this.$emit('clickSort', name);
}
public handleSort() {
this.isSort = !this.isSort;
}
}
</script>
<style lang="less">
@import './app-sort-bar.less';
</style>
\ No newline at end of file
<template>
<vue-pivottable-ui
class="app-vue-pivottable"
:data="datas"
:aggregatorName="aggregatorName"
:rendererName="rendererName"
:columns="columns"
:rows="rows"
:cols="cols"
:vals="vals"
:locales="locales"
:rowTotal="rowTotal"
:colTotal="colTotal"
:onChange="onChange"
:hiddenFromDragDrop="hiddenFromDragDrop"
>
</vue-pivottable-ui>
</template>
<script lang = 'ts'>
import { Vue, Component, Prop } from 'vue-property-decorator';
import { VuePivottableUi } from 'ibiz-vue-pivottable';
import 'ibiz-vue-pivottable/dist/vue-pivottable.css';
@Component({
components: {
VuePivottableUi
}
})
export default class AppVuePivotTable extends Vue {
/**
* 数据集
*
* @type {*}
* @memberof AppVuePivotTable
*/
@Prop() datas: any;
/**
* 列集合
*
* @type {*}
* @memberof AppVuePivotTable
*/
@Prop() allColumns: any;
/**
* 聚合模式
*
* @type {string}
* @memberof AppVuePivotTable
*/
protected aggregatorName: string = 'Sum';
/**
* 渲染模式
*
* @type {string}
* @memberof AppVuePivotTable
*/
protected rendererName: string = 'Table Heatmap';
/**
* 行统计
*
* @type {boolean}
* @memberof AppVuePivotTable
*/
protected rowTotal: boolean = true;
/**
* 列统计
*
* @type {boolean}
* @memberof AppVuePivotTable
*/
protected colTotal: boolean = true;
/**
* 列属性列集合
*
* @type {*}
* @memberof AppVuePivotTable
*/
protected cols: any[] = [];
/**
* 行属性列集合
*
* @type {*}
* @memberof AppVuePivotTable
*/
protected rows: any[] = [];
/**
* 值属性集合
*
* @type {*}
* @memberof AppVuePivotTable
*/
protected vals: any[] = [];
/**
* 隐藏列集合
*
* @type {*}
* @memberof AppVuePivotTable
*/
protected hiddenFromDragDrop: any[] = [];
/**
* 展现列集合
*
* @type {*}
* @memberof AppVuePivotTable
*/
protected columns: any[] = [];
/**
* 语言资源
*
* @type {*}
* @memberof AppVuePivotTable
*/
protected locales: any = {
aggregators: {
'Count': 'Count',
'Count Unique Values': 'Count Unique Values',
'List Unique Values': 'List Unique Values',
'Sum': 'Sum',
'Integer Sum': 'Integer Sum',
'Average': 'Average',
'Median': 'Median',
'Sample Variance': 'Sample Variance',
'Sample Standard Deviation': 'Sample Standard Deviation',
'Minimum': 'Minimum',
'Maximum': 'Maximum',
'First': 'First',
'Last': 'Last',
'Sum over Sum': 'Sum over Sum',
'Sum as Fraction of Total': 'Sum as Fraction of Total',
'Sum as Fraction of Rows': 'Sum as Fraction of Rows',
'Sum as Fraction of Columns': 'Sum as Fraction of Columns',
'Count as Fraction of Total': 'Count as Fraction of Total',
'Count as Fraction of Rows': 'Count as Fraction of Rows',
'Count as Fraction of Columns': 'Count as Fraction of Columns'
},
renderer: {
'Table': 'Table',
'Table Heatmap': 'Table Heatmap',
'Table Col Heatmap': 'Table Col Heatmap',
'Table Row Heatmap': 'Table Row Heatmap',
'Expor Table TSV': 'Expor Table TSV',
'Grouped Column Chart': 'Grouped Column Chart',
'Stacked Column Chart': 'Stacked Column Chart',
'Grouped Bar Chart': 'Grouped Bar Chart',
'Stacked Bar Chart': 'Stacked Bar Chart',
'Line Chart': 'Line Chart',
'Dot Chart': 'Dot Chart',
'Area Chart': 'Area Chart',
'Scatter Chart': 'Scatter Chart',
'Multiple Pie Chart': 'Multiple Pie Chart'
},
'Filter Values': 'Filter Values',
'Select All': 'Select All',
'Deselect All': 'Deselect All',
'Totals': 'Totals'
};
/**
* 生命周期
*
* @type {*}
* @memberof AppVuePivotTable
*/
public created() {
if(this.allColumns) {
this.allColumns.forEach((item: any) => {
if(!item.show) {
this.hiddenFromDragDrop.push(item.name);
}
let col: any = { ...item };
col.prop = col.name;
this.columns.push(col);
});
}
}
/**
* 事件
*
* @type {*}
* @memberof AppVuePivotTable
*/
public onChange(evt: any) {
console.log(evt);
}
}
</script>
<style lang="less">
.app-vue-pivottable {
height: calc(100% - 1px);
.pvtTable {
min-width: 100%;
}
}
</style>
\ No newline at end of file
......@@ -3,9 +3,14 @@
<span v-if="ifEmpty">{{$t('codelist.'+tag+'.empty')}}</span>
<template v-if="!ifEmpty">
<template v-for="(item, index) in items">
<span>{{ index != 0 ? textSeparator : ''}}</span>
<i v-if="item.iconCls" :class="item.iconCls"></i>
<span :class="item.textCls" :style="{color:item.color}">{{isUseLangres ? $t(item.text) : item.text}}</span>
<div class="codelist-item" :key="index">
<i v-if="item.iconcls" :class="item.iconcls"></i>
<img v-if="item.icon" :src="getIcon(item.icon)" />
<span :class="item.class" :style="{ color: item.color }">
{{ isUseLangres ? $t(item.text) : item.text }}
</span>
<span v-if="index != items.length-1">{{ textSeparator }}</span>
</div>
</template>
</template>
</div>
......@@ -14,6 +19,7 @@
<script lang="ts">
import { Vue, Component, Prop, Model, Watch } from 'vue-property-decorator';
import CodeListService from "@/codelist/codelist-service";
import { Environment } from '@/environments/environment';
@Component({})
export default class CodeList extends Vue {
......@@ -288,14 +294,66 @@ export default class CodeList extends Vue {
}
}
/**
* 获取图片路径
*
* @param {*} arg
* @returns
* @memberof CodeList
*/
public getIcon(arg:any){
if(!arg){
return;
}
if(Object.prototype.toString.call(arg)=="[object String]"){
try {
let targetData:any = JSON.parse(arg);
if(Object.prototype.toString.call(targetData) == "[object Array]"){
if(targetData && targetData.length >0){
let fileId:string = targetData[0] && targetData[0].id;
return Environment.BaseUrl + Environment.ExportFile + fileId;
}
}else if(Object.prototype.toString.call(targetData) === '[object Object]'){
let fileId:string = targetData && targetData.id;
return Environment.BaseUrl + Environment.ExportFile + fileId;
}
} catch (error) {
return arg;
}
}else if(Object.prototype.toString.call(arg) == "[object Array]"){
if(arg && arg.length >0){
let fileId:string = arg[0] && arg[0].id;
return Environment.BaseUrl + Environment.ExportFile + fileId;
}
}else if(Object.prototype.toString.call(arg) === '[object Object]'){
let fileId:string = arg && arg.id;
return Environment.BaseUrl + Environment.ExportFile + fileId;
}else{
return arg;
}
}
}
</script>
<style lang='less'>
.codelist {
display: flex;
white-space: nowrap;
text-overflow: ellipsis;
word-break: break-all;
overflow: hidden;
.codelist-item{
display: flex;
align-items: center;
max-height: 32px;
padding: 0px 3px;
> img{
max-height: 32px;
width: auto;
margin-right: 6px;
border-radius: 50%;
}
}
}
</style>
\ No newline at end of file
......@@ -265,9 +265,8 @@ export default class DropDownList extends Vue {
this.loadData();
}
});
}else{
this.loadData();
}
this.loadData();
}
/**
......
......@@ -74,7 +74,7 @@
<script lang="ts">
import {Vue, Component, Watch} from 'vue-property-decorator';
import {Environment} from '@/environments/environment';
//import Divider from "ibiz-vue-lib/lib/ibiz-vue-lib.common";
import { Util } from '@/utils';
@Component({
components: {}
......@@ -141,7 +141,7 @@ export default class Login extends Vue {
}
public mounted() {
this.getCookie("loginname");
Util.getCookie("loginname");
}
/**
......@@ -181,13 +181,13 @@ export default class Login extends Vue {
const data = response.data;
if (data && data.token) {
localStorage.setItem('token', data.token);
this.setCookie('ibzuaa-token',data.token,0);
Util.setCookie('ibzuaa-token',data.token,0);
}
if(data && data.user){
localStorage.setItem('user', JSON.stringify(data.user));
}
// 设置cookie,保存账号密码7天
this.setCookie("loginname",loginname, 7);
Util.setCookie("loginname",loginname, 7);
// 跳转首页
const url: any = this.$route.query.redirect ? this.$route.query.redirect : '*';
this.$router.push({path: url});
......@@ -223,40 +223,6 @@ export default class Login extends Vue {
_this.form={loginname: 'ibzadmin', password: '123456'}
}
/**
* 设置cookie
*
* @memberof Login
*/
public setCookie(name: any, value: any, day: any) {
if (day !== 0) { //当设置的时间等于0时,不设置expires属性,cookie在浏览器关闭后删除
let curDate = new Date();
let curTamp = curDate.getTime();
let curWeeHours = new Date(curDate.toLocaleDateString()).getTime() - 1;
let passedTamp = curTamp - curWeeHours;
let leftTamp = 24 * 60 * 60 * 1000 - passedTamp;
let leftTime = new Date();
leftTime.setTime(leftTamp + curTamp);
document.cookie = name + "=" + escape(value) + ";expires=" + leftTime.toUTCString();
} else {
document.cookie = name + "=" + escape(value);
}
}
/**
* 获取cookie
*
* @memberof Login
*/
public getCookie(name: any): any {
let arr;
let reg = new RegExp("(^| )" + name + "=([^;]*)(;|$)");
if (arr = document.cookie.match(reg))
return unescape(arr[2]);
else
return null;
}
/**
* qq授权登录
* @param thirdpart
......
.menu-icon {
padding-right: 6px;
}
\ No newline at end of file
......@@ -29,10 +29,10 @@ export class MenuIcon extends Vue {
public render(): any {
if (this.item) {
if (this.item.iconcls) {
return <i class={this.item.iconcls} />
return <i class={[this.item.iconcls, 'menu-icon']} />
}
if (this.item.icon) {
return <img src={this.item.icon} />
return <img class="menu-icon" src={this.item.icon} />
}
}
return <span />
......
import { Http } from '@/utils';
import { Subscription } from 'rxjs';
/**
* 按钮loadding状态服务
*
* @export
* @class LoaddingService
*/
export class LoaddingService {
/**
* 单例变量声明
*
* @private
* @static
* @type {LoaddingService}
* @memberof LoaddingService
*/
private static loaddingService: LoaddingService;
/**
* loadding状态事件
*
* @public
* @type {(Subscription | undefined)}
* @memberof LoaddingService
*/
public loaddingStateEvent: Subscription | undefined;
/**
* 获取 LoaddingService 单例对象
*
* @static
* @returns {LoaddingService}
* @memberof LoaddingService
*/
public static getInstance(): LoaddingService {
if (!LoaddingService.loaddingService) {
LoaddingService.loaddingService = new LoaddingService();
}
return this.loaddingService;
}
/**
* 初始化指令所绑定的元素状态
*
* @param {any} el 指令所绑定的元素
* @param {any} binding 指令附加参数
* @memberof LoaddingService
*/
public initElement(el:any, binding:any){
if(binding && binding.arg){
// 工具栏按钮
if(Object.is(binding.arg,'i-button')){
if(el.getElementsByTagName('i') && el.getElementsByTagName('i').length >0){
let iconElement:any = el.getElementsByTagName('i')[0];
iconElement.setAttribute('ownclassname',iconElement.className);
}
}
}
}
/**
* 设置loadding状态
*
* @param {any} el 指令所绑定的元素
* @param {any} binding 指令附加参数
* @memberof LoaddingService
*/
public setLoadState(el:any, binding:any){
this.loaddingStateEvent = Http.getInstance().getNotifyObject().subscribe((result:any) =>{
if(result && result.action && Object.is(result.action,'setloadstate')){
if(result && result.state){
this.addLoadState(el,binding);
}else{
this.removeLoadState(el,binding);
}
}
})
}
/**
* 添加loadding状态
*
* @param {any} el 指令所绑定的元素
* @param {any} binding 指令附加参数
* @memberof LoaddingService
*/
public addLoadState(el:any, binding:any){
if(binding && binding.arg){
el.style.pointerEvents = 'none';
// 工具栏按钮
if(Object.is(binding.arg,'i-button')){
if(el.getElementsByTagName('i') && el.getElementsByTagName('i').length >0){
let iconElement:any = el.getElementsByTagName('i')[0];
iconElement.className = "el-icon-loading";
}
}
}
}
/**
* 移除loadding状态
*
* @param {any} el 指令所绑定的元素
* @param {any} binding 指令附加参数
* @memberof LoaddingService
*/
public removeLoadState(el:any, binding:any){
if(binding && binding.arg){
el.style.pointerEvents = '';
// 工具栏按钮
if(Object.is(binding.arg,'i-button')){
if(el.getElementsByTagName('i') && el.getElementsByTagName('i').length >0){
let iconElement:any = el.getElementsByTagName('i')[0];
iconElement.className = iconElement.getAttribute('ownclassname');
}
}
}
}
/**
* 清除资源(取消订阅)
*
* @param {any} el 指令所绑定的元素
* @param {any} binding 指令附加参数
* @memberof LoaddingService
*/
public clearResource(el:any, binding:any){
if(this.loaddingStateEvent){
this.loaddingStateEvent.unsubscribe();
}
}
}
export default {
bind(el:any, binding:any) {
LoaddingService.getInstance().initElement(el, binding);
},
inserted(el:any, binding:any) {
LoaddingService.getInstance().setLoadState(el, binding);
},
unbind(el:any, binding:any) {
LoaddingService.getInstance().clearResource(el,binding);
}
}
\ No newline at end of file
......@@ -89,10 +89,9 @@ export default class EditView3Engine extends EditViewEngine {
*/
public onFormLoad(arg: any = {}): void {
super.onFormLoad(arg);
this.view.formData = arg;
if (this.getDrTab()) {
const tag = this.getDrTab().name;
this.setViewState2({ tag: tag, action: 'state', viewdata: this.view.viewparams });
this.setViewState2({ tag: tag, action: 'state', viewdata: arg });
}
}
......@@ -104,10 +103,9 @@ export default class EditView3Engine extends EditViewEngine {
*/
public onFormSave(arg: any = {}): void {
super.onFormSave(arg);
this.view.formData = arg;
if (this.getDrTab()) {
const tag = this.getDrTab().name;
this.setViewState2({ tag: tag, action: 'state', viewdata: this.view.viewparams });
this.setViewState2({ tag: tag, action: 'state', viewdata: arg });
}
}
......
......@@ -91,7 +91,7 @@ export default class EditView4Engine extends EditViewEngine {
super.onFormLoad(arg);
if (this.getDrTab()) {
const tag = this.getDrTab().name;
this.setViewState2({ tag: tag, action: 'state', viewdata: this.view.viewparams });
this.setViewState2({ tag: tag, action: 'state', viewdata: arg });
}
}
......@@ -105,7 +105,7 @@ export default class EditView4Engine extends EditViewEngine {
super.onFormSave(arg);
if (this.getDrTab()) {
const tag = this.getDrTab().name;
this.setViewState2({ tag: tag, action: 'state', viewdata: this.view.viewparams });
this.setViewState2({ tag: tag, action: 'state', viewdata: arg });
}
}
......
import MDViewEngine from './md-view-engine';
/**
* 视图引擎基础
*
* @export
* @class GridViewEngine
* @extends {MDViewEngine}
*/
export default class MapViewEngine extends MDViewEngine {
/**
* 表格部件
*
* @type {*}
* @memberof GridViewEngine
*/
protected map: any;
/**
* Creates an instance of GridViewEngine.
* @memberof MapViewEngine
*/
constructor() {
super();
}
/**
* 引擎初始化
*
* @param {*} [options={}]
* @memberof MapViewEngine
*/
public init(options: any = {}): void {
this.map = options.map;
super.init(options);
}
/**
* 引擎加载
*
* @param {*} [opts={}]
* @memberof MapViewEngine
*/
public load(opts: any = {},isnotify:boolean=false): void {
if(!this.view.isformDruipart){
super.load(opts, isnotify);
}else{
if(isnotify){
super.load(opts, isnotify);
}
}
}
/**
* 获取多数据部件
*
* @returns {*}
* @memberof MapViewEngine
*/
public getMDCtrl(): any {
return this.map;
}
}
\ No newline at end of file
import MapViewEngine from './map-view-engine';
/**
* 视图引擎基础
*
* @export
* @class GridViewEngine
* @extends {MDViewEngine}
*/
export default class MapView9Engine extends MapViewEngine {
}
\ No newline at end of file
......@@ -41,6 +41,9 @@ export default class TabExpViewEngine extends ViewEngine {
if (!Object.is(_item.type, 'TABEXPPANEL')) {
return;
}
if(this.view.context && this.view.context[(this.keyPSDEField as string)]){
return;
}
this.setViewState2({ tag: _item.name, action: 'load', viewdata: this.view.context });
});
}
......
......@@ -197,7 +197,13 @@ export default class ViewEngine {
if(_item && _item['dataaccaction'] && _this.view.appUIService){
let dataActionResult:any;
if (_item.uiaction && (Object.is(_item.uiaction.target, "NONE") || Object.is(_item.uiaction.target, ""))){
dataActionResult = _this.view.appUIService.getResourceOPPrivs(_item['dataaccaction']);
if(Object.is(_item.uiaction.target, "") && Object.is(_item.uiaction.tag, "Save")){
if(data && Object.keys(data).length >0){
dataActionResult= _this.view.appUIService.getAllOPPrivs(data)[_item['dataaccaction']];
}
}else{
dataActionResult = _this.view.appUIService.getResourceOPPrivs(_item['dataaccaction']);
}
}else{
if(data && Object.keys(data).length >0){
dataActionResult= _this.view.appUIService.getAllOPPrivs(data)[_item['dataaccaction']];
......
......@@ -18,13 +18,15 @@ export default class WFDynaEditViewEngine extends EditViewEngine {
}
/**
* 表单加载完成
* 引擎加载
*
* @param {*} args
* @param {*} [opts={}]
* @memberof WFDynaEditViewEngine
*/
public onFormLoad(arg: any): void {
super.onFormLoad(arg);
this.view.getWFLinkModel();
public load(opts: any = {}): void {
if(this.view.getWFLinkModel && this.view.getWFLinkModel instanceof Function){
this.view.getWFLinkModel();
}
}
}
\ No newline at end of file
......@@ -375,5 +375,19 @@ export default {
false: 'False',
deleteImageFailure:'Image deletion failed',
updateFailure: 'Batch update file failed',
}
},
appMapPosition: {
submit: 'Submit',
title: 'Please select address'
},
appSortBar: {
title: 'Sort'
},
appAfterTime:{
minutesAgo: 'minutes ago',
hoursAgo: 'hours ago',
dayAgo: 'days ago',
monthsAgo: 'months ago',
yearsAgo: 'years ago'
}
};
\ No newline at end of file
......@@ -376,5 +376,19 @@ export default {
false: '取消',
deleteImageFailure:'删除图片失败',
updateFailure: '批量更新文件失败',
}
},
appMapPosition: {
submit: '确认',
title: '请选择地址'
},
appSortBar: {
title: '排序'
},
appAfterTime:{
minutesAgo: '分钟前',
hoursAgo: '小时前',
dayAgo: '天前',
monthsAgo: '月前',
yearsAgo: '年前'
}
};
\ No newline at end of file
......@@ -7,14 +7,14 @@
<span class='caption-info'>{{$t(model.srfCaption)}}</span>
<div class='toolbar-container'>
<tooltip :transfer="true" :max-width="600">
<i-button v-show="toolBarModels.tbitem3.visabled" :disabled="toolBarModels.tbitem3.disabled" class='' @click="toolbar_click({ tag: 'tbitem3' }, $event)">
<i-button v-show="toolBarModels.tbitem3.visabled" :disabled="toolBarModels.tbitem3.disabled" class='' v-loading:i-button @click="toolbar_click({ tag: 'tbitem3' }, $event)">
<i class='fa fa-save'></i>
<span class='caption'>{{$t('entities.jobsinfo.editviewtoolbar_toolbar.tbitem3.caption')}}</span>
</i-button>
<div slot='content'>{{$t('entities.jobsinfo.editviewtoolbar_toolbar.tbitem3.tip')}}</div>
</tooltip>
<tooltip :transfer="true" :max-width="600">
<i-button v-show="toolBarModels.deuiaction1.visabled" :disabled="toolBarModels.deuiaction1.disabled" class='' @click="toolbar_click({ tag: 'deuiaction1' }, $event)">
<i-button v-show="toolBarModels.deuiaction1.visabled" :disabled="toolBarModels.deuiaction1.disabled" class='' v-loading:i-button @click="toolbar_click({ tag: 'deuiaction1' }, $event)">
<i class='fa fa-sign-out'></i>
<span class='caption'>{{$t('entities.jobsinfo.editviewtoolbar_toolbar.deuiaction1.caption')}}</span>
</i-button>
......
......@@ -9,53 +9,53 @@
</div>
<div class='content-container'>
<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="执行器任务HANDLER" />
<i-input v-show="!isExpandSearchForm" v-model="query" search enter-button @on-search="onSearch($event)" class='quick-search-input' style='max-width: 400px;padding-left: 24px' placeholder="执行器任务HANDLER" />
<div class='pull-right'>
<div class='toolbar-container'>
<tooltip :transfer="true" :max-width="600">
<i-button v-show="toolBarModels.deuiaction1.visabled" :disabled="toolBarModels.deuiaction1.disabled" class='' @click="toolbar_click({ tag: 'deuiaction1' }, $event)">
<i-button v-show="toolBarModels.deuiaction1.visabled" :disabled="toolBarModels.deuiaction1.disabled" class='' v-loading:i-button @click="toolbar_click({ tag: 'deuiaction1' }, $event)">
<i class='fa fa-play'></i>
<span class='caption'>{{$t('entities.jobsinfo.gridviewtoolbar_toolbar.deuiaction1.caption')}}</span>
</i-button>
<div slot='content'>{{$t('entities.jobsinfo.gridviewtoolbar_toolbar.deuiaction1.tip')}}</div>
</tooltip>
<tooltip :transfer="true" :max-width="600">
<i-button v-show="toolBarModels.deuiaction2.visabled" :disabled="toolBarModels.deuiaction2.disabled" class='' @click="toolbar_click({ tag: 'deuiaction2' }, $event)">
<i-button v-show="toolBarModels.deuiaction2.visabled" :disabled="toolBarModels.deuiaction2.disabled" class='' v-loading:i-button @click="toolbar_click({ tag: 'deuiaction2' }, $event)">
<i class='fa fa-stop'></i>
<span class='caption'>{{$t('entities.jobsinfo.gridviewtoolbar_toolbar.deuiaction2.caption')}}</span>
</i-button>
<div slot='content'>{{$t('entities.jobsinfo.gridviewtoolbar_toolbar.deuiaction2.tip')}}</div>
</tooltip>
<tooltip :transfer="true" :max-width="600">
<i-button v-show="toolBarModels.deuiaction3.visabled" :disabled="toolBarModels.deuiaction3.disabled" class='' @click="toolbar_click({ tag: 'deuiaction3' }, $event)">
<i-button v-show="toolBarModels.deuiaction3.visabled" :disabled="toolBarModels.deuiaction3.disabled" class='' v-loading:i-button @click="toolbar_click({ tag: 'deuiaction3' }, $event)">
<i class='fa fa-flash'></i>
<span class='caption'>{{$t('entities.jobsinfo.gridviewtoolbar_toolbar.deuiaction3.caption')}}</span>
</i-button>
<div slot='content'>{{$t('entities.jobsinfo.gridviewtoolbar_toolbar.deuiaction3.tip')}}</div>
</tooltip>
<tooltip :transfer="true" :max-width="600">
<i-button v-show="toolBarModels.deuiaction4.visabled" :disabled="toolBarModels.deuiaction4.disabled" class='' @click="toolbar_click({ tag: 'deuiaction4' }, $event)">
<i-button v-show="toolBarModels.deuiaction4.visabled" :disabled="toolBarModels.deuiaction4.disabled" class='' v-loading:i-button @click="toolbar_click({ tag: 'deuiaction4' }, $event)">
<i class='fa fa-file-text-o'></i>
<span class='caption'>{{$t('entities.jobsinfo.gridviewtoolbar_toolbar.deuiaction4.caption')}}</span>
</i-button>
<div slot='content'>{{$t('entities.jobsinfo.gridviewtoolbar_toolbar.deuiaction4.tip')}}</div>
</tooltip>
<tooltip :transfer="true" :max-width="600">
<i-button v-show="toolBarModels.deuiaction5.visabled" :disabled="toolBarModels.deuiaction5.disabled" class='' @click="toolbar_click({ tag: 'deuiaction5' }, $event)">
<i-button v-show="toolBarModels.deuiaction5.visabled" :disabled="toolBarModels.deuiaction5.disabled" class='' v-loading:i-button @click="toolbar_click({ tag: 'deuiaction5' }, $event)">
<i class='fa fa-edit'></i>
<span class='caption'>{{$t('entities.jobsinfo.gridviewtoolbar_toolbar.deuiaction5.caption')}}</span>
</i-button>
<div slot='content'>{{$t('entities.jobsinfo.gridviewtoolbar_toolbar.deuiaction5.tip')}}</div>
</tooltip>
<tooltip :transfer="true" :max-width="600">
<i-button v-show="toolBarModels.deuiaction6.visabled" :disabled="toolBarModels.deuiaction6.disabled" class='' @click="toolbar_click({ tag: 'deuiaction6' }, $event)">
<i-button v-show="toolBarModels.deuiaction6.visabled" :disabled="toolBarModels.deuiaction6.disabled" class='' v-loading:i-button @click="toolbar_click({ tag: 'deuiaction6' }, $event)">
<i class='fa fa-remove'></i>
<span class='caption'>{{$t('entities.jobsinfo.gridviewtoolbar_toolbar.deuiaction6.caption')}}</span>
</i-button>
<div slot='content'>{{$t('entities.jobsinfo.gridviewtoolbar_toolbar.deuiaction6.tip')}}</div>
</tooltip>
<tooltip :transfer="true" :max-width="600">
<i-button v-show="toolBarModels.deuiaction7.visabled" :disabled="toolBarModels.deuiaction7.disabled" class='' @click="toolbar_click({ tag: 'deuiaction7' }, $event)">
<i-button v-show="toolBarModels.deuiaction7.visabled" :disabled="toolBarModels.deuiaction7.disabled" class='' v-loading:i-button @click="toolbar_click({ tag: 'deuiaction7' }, $event)">
<i class='fa fa-filter'></i>
<span class='caption'>{{$t('entities.jobsinfo.gridviewtoolbar_toolbar.deuiaction7.caption')}}</span>
</i-button>
......
......@@ -9,7 +9,7 @@
</div>
<div class='content-container'>
<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="执行器任务HANDLER" />
<i-input v-show="!isExpandSearchForm" v-model="query" search enter-button @on-search="onSearch($event)" class='quick-search-input' style='max-width: 400px;padding-left: 24px' placeholder="执行器任务HANDLER" />
<div class='pull-right'>
</div>
</div>
......
......@@ -7,14 +7,14 @@
<span class='caption-info'>{{$t(model.srfCaption)}}</span>
<div class='toolbar-container'>
<tooltip :transfer="true" :max-width="600">
<i-button v-show="toolBarModels.tbitem3.visabled" :disabled="toolBarModels.tbitem3.disabled" class='' @click="toolbar_click({ tag: 'tbitem3' }, $event)">
<i-button v-show="toolBarModels.tbitem3.visabled" :disabled="toolBarModels.tbitem3.disabled" class='' v-loading:i-button @click="toolbar_click({ tag: 'tbitem3' }, $event)">
<i class='fa fa-save'></i>
<span class='caption'>{{$t('entities.jobsregistry.editviewtoolbar_toolbar.tbitem3.caption')}}</span>
</i-button>
<div slot='content'>{{$t('entities.jobsregistry.editviewtoolbar_toolbar.tbitem3.tip')}}</div>
</tooltip>
<tooltip :transfer="true" :max-width="600">
<i-button v-show="toolBarModels.deuiaction1.visabled" :disabled="toolBarModels.deuiaction1.disabled" class='' @click="toolbar_click({ tag: 'deuiaction1' }, $event)">
<i-button v-show="toolBarModels.deuiaction1.visabled" :disabled="toolBarModels.deuiaction1.disabled" class='' v-loading:i-button @click="toolbar_click({ tag: 'deuiaction1' }, $event)">
<i class='fa fa-sign-out'></i>
<span class='caption'>{{$t('entities.jobsregistry.editviewtoolbar_toolbar.deuiaction1.caption')}}</span>
</i-button>
......
......@@ -9,32 +9,32 @@
</div>
<div class='content-container'>
<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;padding-left: 24px' placeholder="服务名" />
<div class='pull-right'>
<div class='toolbar-container'>
<tooltip :transfer="true" :max-width="600">
<i-button v-show="toolBarModels.tbitem3.visabled" :disabled="toolBarModels.tbitem3.disabled" class='' @click="toolbar_click({ tag: 'tbitem3' }, $event)">
<i-button v-show="toolBarModels.tbitem3.visabled" :disabled="toolBarModels.tbitem3.disabled" class='' v-loading:i-button @click="toolbar_click({ tag: 'tbitem3' }, $event)">
<i class='fa fa-file-text-o'></i>
<span class='caption'>{{$t('entities.jobsregistry.gridviewtoolbar_toolbar.tbitem3.caption')}}</span>
</i-button>
<div slot='content'>{{$t('entities.jobsregistry.gridviewtoolbar_toolbar.tbitem3.tip')}}</div>
</tooltip>
<tooltip :transfer="true" :max-width="600">
<i-button v-show="toolBarModels.tbitem4.visabled" :disabled="toolBarModels.tbitem4.disabled" class='' @click="toolbar_click({ tag: 'tbitem4' }, $event)">
<i-button v-show="toolBarModels.tbitem4.visabled" :disabled="toolBarModels.tbitem4.disabled" class='' v-loading:i-button @click="toolbar_click({ tag: 'tbitem4' }, $event)">
<i class='fa fa-edit'></i>
<span class='caption'>{{$t('entities.jobsregistry.gridviewtoolbar_toolbar.tbitem4.caption')}}</span>
</i-button>
<div slot='content'>{{$t('entities.jobsregistry.gridviewtoolbar_toolbar.tbitem4.tip')}}</div>
</tooltip>
<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='' v-loading:i-button @click="toolbar_click({ tag: 'tbitem8' }, $event)">
<i class='fa fa-remove'></i>
<span class='caption'>{{$t('entities.jobsregistry.gridviewtoolbar_toolbar.tbitem8.caption')}}</span>
</i-button>
<div slot='content'>{{$t('entities.jobsregistry.gridviewtoolbar_toolbar.tbitem8.tip')}}</div>
</tooltip>
<tooltip :transfer="true" :max-width="600">
<i-button v-show="toolBarModels.deuiaction1.visabled" :disabled="toolBarModels.deuiaction1.disabled" class='' @click="toolbar_click({ tag: 'deuiaction1' }, $event)">
<i-button v-show="toolBarModels.deuiaction1.visabled" :disabled="toolBarModels.deuiaction1.disabled" class='' v-loading:i-button @click="toolbar_click({ tag: 'deuiaction1' }, $event)">
<i class='fa fa-filter'></i>
<span class='caption'>{{$t('entities.jobsregistry.gridviewtoolbar_toolbar.deuiaction1.caption')}}</span>
</i-button>
......
......@@ -15,6 +15,15 @@ import 'view-design/dist/styles/iview.css';
import 'ibiz-vue-lib/lib/ibiz-vue-lib.css';
import '@/styles/default.less';
import VueAMap from 'vue-amap';
Vue.use(VueAMap);
VueAMap.initAMapApiLoader({
key: '6ab2751103aea67e817c90a5528181b5',
plugin: ["AMap.Geolocation","AMap.PlaceSearch","AMap.Geocoder", "AMap.Autocomplete"],
uiVersion: '1.1'
});
// 模拟数据
if (process.env.NODE_ENV === 'development') {
require('@/mock');
......
......@@ -226,4 +226,18 @@ export default class JobsInfoServiceBase extends EntityService {
let res:any = Http.getInstance().get(`/jobsinfos/fetchdefault`,tempData,isloading);
return res;
}
/**
* searchDefault接口方法
*
* @param {*} [context={}]
* @param {*} [data={}]
* @param {boolean} [isloading]
* @returns {Promise<any>}
* @memberof JobsInfoServiceBase
*/
public async searchDefault(context: any = {},data: any = {}, isloading?: boolean): Promise<any> {
let tempData:any = JSON.parse(JSON.stringify(data));
return await Http.getInstance().post(`/jobsinfos/searchdefault`,tempData,isloading);
}
}
\ No newline at end of file
......@@ -184,4 +184,18 @@ export default class JobsLockServiceBase extends EntityService {
let res:any = Http.getInstance().get(`/jobslocks/fetchdefault`,tempData,isloading);
return res;
}
/**
* searchDefault接口方法
*
* @param {*} [context={}]
* @param {*} [data={}]
* @param {boolean} [isloading]
* @returns {Promise<any>}
* @memberof JobsLockServiceBase
*/
public async searchDefault(context: any = {},data: any = {}, isloading?: boolean): Promise<any> {
let tempData:any = JSON.parse(JSON.stringify(data));
return await Http.getInstance().post(`/jobslocks/searchdefault`,tempData,isloading);
}
}
\ No newline at end of file
......@@ -184,4 +184,18 @@ export default class JobsLogServiceBase extends EntityService {
let res:any = Http.getInstance().get(`/jobslogs/fetchdefault`,tempData,isloading);
return res;
}
/**
* searchDefault接口方法
*
* @param {*} [context={}]
* @param {*} [data={}]
* @param {boolean} [isloading]
* @returns {Promise<any>}
* @memberof JobsLogServiceBase
*/
public async searchDefault(context: any = {},data: any = {}, isloading?: boolean): Promise<any> {
let tempData:any = JSON.parse(JSON.stringify(data));
return await Http.getInstance().post(`/jobslogs/searchdefault`,tempData,isloading);
}
}
\ No newline at end of file
......@@ -184,4 +184,18 @@ export default class JobsRegistryServiceBase extends EntityService {
let res:any = Http.getInstance().get(`/jobsregistries/fetchdefault`,tempData,isloading);
return res;
}
/**
* searchDefault接口方法
*
* @param {*} [context={}]
* @param {*} [data={}]
* @param {boolean} [isloading]
* @returns {Promise<any>}
* @memberof JobsRegistryServiceBase
*/
public async searchDefault(context: any = {},data: any = {}, isloading?: boolean): Promise<any> {
let tempData:any = JSON.parse(JSON.stringify(data));
return await Http.getInstance().post(`/jobsregistries/searchdefault`,tempData,isloading);
}
}
\ No newline at end of file
......@@ -9,4 +9,6 @@ declare module '@fullcalendar/list';
declare module '@fullcalendar/interaction';
declare module 'vue-grid-layout';
declare module 'vue-print-nb';
declare module 'vuedraggable';
\ No newline at end of file
declare module 'vuedraggable';
declare module 'ibiz-vue-pivottable';
declare module 'vue-amap';
\ No newline at end of file
......@@ -97,7 +97,7 @@
border-color: rgb(221, 221, 221);
border-style: solid;
border-width: 0px 0px 1px;
margin: 0px 0px 11px;
margin: 0px 0px 6px;
padding: 6px 0px 2px;
> .header-container{
min-height: 42px;
......@@ -246,7 +246,7 @@
}
}
.view-container.degridview, .view-container.degridview9, .view-container.dewfgridview, .view-container.delistview, .view-container.delistview9, .view-container.dedataview, .view-container.dedataview9,.view-container.dechartview,.view-container.dechartview9{
.view-container.degridview, .view-container.degridview9, .view-container.dewfgridview, .view-container.delistview, .view-container.delistview9, .view-container.dedataview, .view-container.dedataview9,.view-container.dechartview,.view-container.dechartview9,.view-container.decalendarview,.view-container.decalendarview9{
>.view-card.view-no-caption{
>.ivu-card-body{
height: 100%;
......
......@@ -13,6 +13,6 @@
</noscript>
<div id="app"></div>
<script src="./environments/environment.js"></script>
<script src="../assets/js/avue.min.js"></script>
<script src="./assets/js/avue.min.js"></script>
</body>
</html>
......@@ -2,6 +2,8 @@ import axios from 'axios';
import { Loading } from 'element-ui';
import { ElLoadingComponent } from 'element-ui/types/loading';
import qs from 'qs';
import { Subject } from 'rxjs';
/**
* Http net 对象
* 调用 getInstance() 获取实例
......@@ -10,20 +12,6 @@ import qs from 'qs';
*/
export class Http {
/**
* 获取 Http 单例对象
*
* @static
* @returns {Http}
* @memberof Http
*/
public static getInstance(): Http {
if (!Http.Http) {
Http.Http = new Http();
}
return this.Http;
}
/**
* 单例变量声明
*
......@@ -42,6 +30,28 @@ export class Http {
*/
private loadingCount: number = 0;
/**
* 数据传递对象
*
* @type {Subject}
* @memberof Http
*/
private subject:Subject<any> = new Subject<any>();
/**
* 获取 Http 单例对象
*
* @static
* @returns {Http}
* @memberof Http
*/
public static getInstance(): Http {
if (!Http.Http) {
Http.Http = new Http();
}
return this.Http;
}
/**
* load状态管理器
*
......@@ -227,6 +237,7 @@ export class Http {
body: true,
fullscreen: true,
});
this.notifyLoadState(true);
}
this.loadingCount++;
}
......@@ -244,6 +255,7 @@ export class Http {
setTimeout(() => {
if (this.loadingCount === 0) {
this.elLoadingComponent.close();
this.notifyLoadState(false);
}
}, 500);
}
......@@ -265,4 +277,24 @@ export class Http {
return data;
}
/**
* 获取通知对象
*
* @public
* @memberof Http
*/
public getNotifyObject(){
return this.subject;
}
/**
* 通知loadding状态
*
* @private
* @memberof Http
*/
private notifyLoadState(loadingState:boolean){
this.subject.next({action:'setloadstate',state:loadingState});
}
}
\ No newline at end of file
......@@ -3,6 +3,9 @@ import axios from 'axios';
import Router from 'vue-router';
import i18n from '@/locale';
import { Environment } from '@/environments/environment';
import { Http } from '../http/http';
import { Util } from '../util/util';
/**
* 拦截器
*
......@@ -104,6 +107,9 @@ export class Interceptors {
});
axios.interceptors.response.use((response: any) => {
if(response.headers && response.headers['refreshtoken'] && localStorage.getItem('token')){
this.refreshToken(response);
}
return response;
}, (error: any) => {
error = error ? error : { response: {} };
......@@ -174,4 +180,30 @@ export class Interceptors {
}
}
/**
* 刷新token
*
* @private
* @param {*} [data={}]
* @memberof Interceptors
*/
private refreshToken(data:any = {}):void{
if(data && data.config && (data.config.url == "/uaa/refreshToken")){
return;
}
Http.getInstance().post('/uaa/refreshToken',localStorage.getItem('token'),false).then((response: any) => {
if (response && response.status === 200) {
const data = response.data;
if (data ) {
localStorage.setItem('token', data);
Util.setCookie('ibzuaa-token',data,0);
}
}else{
console.log("刷新token出错");
}
}).catch((error: any) => {
console.log("刷新token出错");
});
}
}
\ No newline at end of file
......@@ -153,7 +153,7 @@ export declare interface Util {
* @returns {string}
* @memberof Util
*/
dateFormat(date: any,fmt?: string):string
dateFormat(date: any,fmt?: string):string;
/**
* 表单项校验
......@@ -164,7 +164,21 @@ export declare interface Util {
* @returns {Promise}
* @memberof Util
*/
validateItem(property: string, data:any, rules:any): Promise<any>
validateItem(property: string, data:any, rules:any): Promise<any>;
/**
* 设置cookie
*
* @memberof Util
*/
setCookie(name: any, value: any, day: any):void;
/**
* 获取cookie
*
* @memberof Util
*/
getCookie(name: any): any;
}
declare module "vue/types/vue" {
......
......@@ -258,7 +258,8 @@ export class Util {
*/
public static srfFilePath2(name: string): string {
if (!name || (name && Object.is(name, ''))) {
throw new Error('名称异常');
console.error("名称异常")
return '';
}
name = name.replace(/[_]/g, '-');
let state: number = 0;
......@@ -427,4 +428,39 @@ export class Util {
// 校验返回Promise
return schema.validate({ [property]: value })
}
/**
* 设置cookie
*
* @memberof Util
*/
public static setCookie(name: any, value: any, day: any) {
if (day !== 0) { //当设置的时间等于0时,不设置expires属性,cookie在浏览器关闭后删除
let curDate = new Date();
let curTamp = curDate.getTime();
let curWeeHours = new Date(curDate.toLocaleDateString()).getTime() - 1;
let passedTamp = curTamp - curWeeHours;
let leftTamp = 24 * 60 * 60 * 1000 - passedTamp;
let leftTime = new Date();
leftTime.setTime(leftTamp + curTamp);
document.cookie = name + "=" + escape(value) + ";expires=" + leftTime.toUTCString();
} else {
document.cookie = name + "=" + escape(value);
}
}
/**
* 获取cookie
*
* @memberof Util
*/
public static getCookie(name: any): any {
let arr;
let reg = new RegExp("(^| )" + name + "=([^;]*)(;|$)");
if (arr = document.cookie.match(reg))
return unescape(arr[2]);
else
return null;
}
}
\ No newline at end of file
......@@ -154,7 +154,7 @@ export default class TaskIndexViewBase extends Vue implements ControlInterface {
* @type {*}
* @memberof TaskIndexViewBase
*/
@Prop() public context: any;
@Prop() public context!: any;
/**
* 视图参数
......@@ -162,7 +162,7 @@ export default class TaskIndexViewBase extends Vue implements ControlInterface {
* @type {*}
* @memberof TaskIndexViewBase
*/
@Prop() public viewparams: any;
@Prop() public viewparams!: any;
/**
* 视图状态事件
......
......@@ -109,7 +109,7 @@ export default class DefaultBase extends Vue implements ControlInterface {
* @type {*}
* @memberof DefaultBase
*/
@Prop() public context: any;
@Prop() public context!: any;
/**
* 视图参数
......@@ -117,7 +117,7 @@ export default class DefaultBase extends Vue implements ControlInterface {
* @type {*}
* @memberof DefaultBase
*/
@Prop() public viewparams: any;
@Prop() public viewparams!: any;
/**
* 视图状态事件
......
......@@ -250,7 +250,7 @@ export default class MainBase extends Vue implements ControlInterface {
* @type {*}
* @memberof MainBase
*/
@Prop() public context: any;
@Prop() public context!: any;
/**
* 视图参数
......@@ -258,7 +258,7 @@ export default class MainBase extends Vue implements ControlInterface {
* @type {*}
* @memberof MainBase
*/
@Prop() public viewparams: any;
@Prop() public viewparams!: any;
/**
* 视图状态事件
......@@ -367,6 +367,14 @@ export default class MainBase extends Vue implements ControlInterface {
*/
public formKeyItemName: string = '';
/**
* 是否自动加载
*
* @type {boolean}
* @memberof MainBase
*/
@Prop({default:false}) public isautoload?:boolean;
/**
* 界面UI服务对象
*
......@@ -750,34 +758,40 @@ export default class MainBase extends Vue implements ControlInterface {
startOp(true);
return falg;
}
// 常规规则
if(item.type == 'SIMPLE'){
startOp(!this.$verify.checkFieldSimpleRule(dataValue,item.condOP,item.paramValue,item.ruleInfo,item.paramType,this.data,item.isKeyCond));
falg.infoMessage = item.ruleInfo;
if(!falg.isPast) return falg;
}
// 数值范围
if(item.type == 'VALUERANGE2'){
startOp( !this.$verify.checkFieldValueRangeRule(dataValue,item.minValue,item.isIncludeMinValue,item.maxValue,item.isIncludeMaxValue,item.ruleInfo,item.isKeyCond));
falg.infoMessage = item.ruleInfo;
if(!falg.isPast) return falg;
}
// 正则式
if (item.type == "REGEX") {
startOp(!this.$verify.checkFieldRegExRule(dataValue,item.regExCode,item.ruleInfo,item.isKeyCond));
falg.infoMessage = item.ruleInfo;
if(!falg.isPast) return falg;
}
// 长度
if (item.type == "STRINGLENGTH") {
startOp(!this.$verify.checkFieldStringLengthRule(dataValue,item.minValue,item.isIncludeMinValue,item.maxValue,item.isIncludeMaxValue,item.ruleInfo,item.isKeyCond));
falg.infoMessage = item.ruleInfo;
if(!falg.isPast) return falg;
}
// 系统值规则
if(item.type == "SYSVALUERULE") {
startOp(!this.$verify.checkFieldSysValueRule(dataValue,item.sysRule.regExCode,item.ruleInfo,item.isKeyCond));
try {
// 常规规则
if(item.type == 'SIMPLE'){
startOp(!this.$verify.checkFieldSimpleRule(dataValue,item.condOP,item.paramValue,item.ruleInfo,item.paramType,this.data,item.isKeyCond));
falg.infoMessage = item.ruleInfo;
if(!falg.isPast) return falg;
}
// 数值范围
if(item.type == 'VALUERANGE2'){
startOp( !this.$verify.checkFieldValueRangeRule(dataValue,item.minValue,item.isIncludeMinValue,item.maxValue,item.isIncludeMaxValue,item.ruleInfo,item.isKeyCond));
falg.infoMessage = item.ruleInfo;
if(!falg.isPast) return falg;
}
// 正则式
if (item.type == "REGEX") {
startOp(!this.$verify.checkFieldRegExRule(dataValue,item.regExCode,item.ruleInfo,item.isKeyCond));
falg.infoMessage = item.ruleInfo;
if(!falg.isPast) return falg;
}
// 长度
if (item.type == "STRINGLENGTH") {
startOp(!this.$verify.checkFieldStringLengthRule(dataValue,item.minValue,item.isIncludeMinValue,item.maxValue,item.isIncludeMaxValue,item.ruleInfo,item.isKeyCond));
falg.infoMessage = item.ruleInfo;
if(!falg.isPast) return falg;
}
// 系统值规则
if(item.type == "SYSVALUERULE") {
startOp(!this.$verify.checkFieldSysValueRule(dataValue,item.sysRule.regExCode,item.ruleInfo,item.isKeyCond));
falg.infoMessage = item.ruleInfo;
if(!falg.isPast) return falg;
}
} catch(error) {
falg.infoMessage = item.ruleInfo;
startOp(false);
if(!falg.isPast) return falg;
}
// 分组
......@@ -792,7 +806,7 @@ export default class MainBase extends Vue implements ControlInterface {
if(!falg.hasOwnProperty("isPast")){
falg.isPast = true;
}
if(!this.data[name]){
if(!this.data[name] && this.data[name] != 0){
falg.isPast = true;
}
return falg;
......@@ -1470,6 +1484,9 @@ export default class MainBase extends Vue implements ControlInterface {
* @memberof MainBase
*/
public afterCreated(){
if(this.isautoload){
this.autoLoad({srfkey:this.context.documentcenter});
}
if (this.viewState) {
this.viewStateEvent = this.viewState.subscribe(({ tag, action, data }) => {
if (!Object.is(tag, this.name)) {
......@@ -2284,6 +2301,17 @@ export default class MainBase extends Vue implements ControlInterface {
public updateDefault(){
}
/**
* 面板数据变化处理事件
* @param {any} item 当前列数据
* @param {any} $event 面板事件数据
*
* @memberof MainBase
*/
public onPanelDataChange(item:any,$event:any) {
Object.assign(item, $event, {rowDataState:'update'});
}
}
</script>
......
......@@ -6,6 +6,7 @@
}
.app-form {
overflow: auto;
padding: 6px;
> .ivu-row {
> .ivu-tabs {
height: 100%;
......
......@@ -102,7 +102,7 @@ export default class DefaultBase extends Vue implements ControlInterface {
* @type {*}
* @memberof DefaultBase
*/
@Prop() public context: any;
@Prop() public context!: any;
/**
* 视图参数
......@@ -110,7 +110,7 @@ export default class DefaultBase extends Vue implements ControlInterface {
* @type {*}
* @memberof DefaultBase
*/
@Prop() public viewparams: any;
@Prop() public viewparams!: any;
/**
* 视图状态事件
......
......@@ -170,7 +170,7 @@ export default class MainBase extends Vue implements ControlInterface {
* @type {*}
* @memberof MainBase
*/
@Prop() public context: any;
@Prop() public context!: any;
/**
* 视图参数
......@@ -178,7 +178,7 @@ export default class MainBase extends Vue implements ControlInterface {
* @type {*}
* @memberof MainBase
*/
@Prop() public viewparams: any;
@Prop() public viewparams!: any;
/**
* 视图状态事件
......@@ -287,6 +287,14 @@ export default class MainBase extends Vue implements ControlInterface {
*/
public formKeyItemName: string = '';
/**
* 是否自动加载
*
* @type {boolean}
* @memberof MainBase
*/
@Prop({default:false}) public isautoload?:boolean;
/**
* 界面UI服务对象
*
......@@ -645,34 +653,40 @@ export default class MainBase extends Vue implements ControlInterface {
startOp(true);
return falg;
}
// 常规规则
if(item.type == 'SIMPLE'){
startOp(!this.$verify.checkFieldSimpleRule(dataValue,item.condOP,item.paramValue,item.ruleInfo,item.paramType,this.data,item.isKeyCond));
falg.infoMessage = item.ruleInfo;
if(!falg.isPast) return falg;
}
// 数值范围
if(item.type == 'VALUERANGE2'){
startOp( !this.$verify.checkFieldValueRangeRule(dataValue,item.minValue,item.isIncludeMinValue,item.maxValue,item.isIncludeMaxValue,item.ruleInfo,item.isKeyCond));
falg.infoMessage = item.ruleInfo;
if(!falg.isPast) return falg;
}
// 正则式
if (item.type == "REGEX") {
startOp(!this.$verify.checkFieldRegExRule(dataValue,item.regExCode,item.ruleInfo,item.isKeyCond));
falg.infoMessage = item.ruleInfo;
if(!falg.isPast) return falg;
}
// 长度
if (item.type == "STRINGLENGTH") {
startOp(!this.$verify.checkFieldStringLengthRule(dataValue,item.minValue,item.isIncludeMinValue,item.maxValue,item.isIncludeMaxValue,item.ruleInfo,item.isKeyCond));
falg.infoMessage = item.ruleInfo;
if(!falg.isPast) return falg;
}
// 系统值规则
if(item.type == "SYSVALUERULE") {
startOp(!this.$verify.checkFieldSysValueRule(dataValue,item.sysRule.regExCode,item.ruleInfo,item.isKeyCond));
try {
// 常规规则
if(item.type == 'SIMPLE'){
startOp(!this.$verify.checkFieldSimpleRule(dataValue,item.condOP,item.paramValue,item.ruleInfo,item.paramType,this.data,item.isKeyCond));
falg.infoMessage = item.ruleInfo;
if(!falg.isPast) return falg;
}
// 数值范围
if(item.type == 'VALUERANGE2'){
startOp( !this.$verify.checkFieldValueRangeRule(dataValue,item.minValue,item.isIncludeMinValue,item.maxValue,item.isIncludeMaxValue,item.ruleInfo,item.isKeyCond));
falg.infoMessage = item.ruleInfo;
if(!falg.isPast) return falg;
}
// 正则式
if (item.type == "REGEX") {
startOp(!this.$verify.checkFieldRegExRule(dataValue,item.regExCode,item.ruleInfo,item.isKeyCond));
falg.infoMessage = item.ruleInfo;
if(!falg.isPast) return falg;
}
// 长度
if (item.type == "STRINGLENGTH") {
startOp(!this.$verify.checkFieldStringLengthRule(dataValue,item.minValue,item.isIncludeMinValue,item.maxValue,item.isIncludeMaxValue,item.ruleInfo,item.isKeyCond));
falg.infoMessage = item.ruleInfo;
if(!falg.isPast) return falg;
}
// 系统值规则
if(item.type == "SYSVALUERULE") {
startOp(!this.$verify.checkFieldSysValueRule(dataValue,item.sysRule.regExCode,item.ruleInfo,item.isKeyCond));
falg.infoMessage = item.ruleInfo;
if(!falg.isPast) return falg;
}
} catch(error) {
falg.infoMessage = item.ruleInfo;
startOp(false);
if(!falg.isPast) return falg;
}
// 分组
......@@ -687,7 +701,7 @@ export default class MainBase extends Vue implements ControlInterface {
if(!falg.hasOwnProperty("isPast")){
falg.isPast = true;
}
if(!this.data[name]){
if(!this.data[name] && this.data[name] != 0){
falg.isPast = true;
}
return falg;
......@@ -1290,6 +1304,9 @@ export default class MainBase extends Vue implements ControlInterface {
* @memberof MainBase
*/
public afterCreated(){
if(this.isautoload){
this.autoLoad({srfkey:this.context.documentcenter});
}
if (this.viewState) {
this.viewStateEvent = this.viewState.subscribe(({ tag, action, data }) => {
if (!Object.is(tag, this.name)) {
......@@ -2104,6 +2121,17 @@ export default class MainBase extends Vue implements ControlInterface {
public updateDefault(){
}
/**
* 面板数据变化处理事件
* @param {any} item 当前列数据
* @param {any} $event 面板事件数据
*
* @memberof MainBase
*/
public onPanelDataChange(item:any,$event:any) {
Object.assign(item, $event, {rowDataState:'update'});
}
}
</script>
......
......@@ -6,6 +6,7 @@
}
.app-form {
overflow: auto;
padding: 6px;
> .ivu-row {
> .ivu-tabs {
height: 100%;
......
......@@ -95,7 +95,7 @@ export default class DefaultBase extends Vue implements ControlInterface {
* @type {*}
* @memberof DefaultBase
*/
@Prop() public context: any;
@Prop() public context!: any;
/**
* 视图参数
......@@ -103,7 +103,7 @@ export default class DefaultBase extends Vue implements ControlInterface {
* @type {*}
* @memberof DefaultBase
*/
@Prop() public viewparams: any;
@Prop() public viewparams!: any;
/**
* 视图状态事件
......
......@@ -111,7 +111,7 @@ export default class MainBase extends Vue implements ControlInterface {
* @type {*}
* @memberof MainBase
*/
@Prop() public context: any;
@Prop() public context!: any;
/**
* 视图参数
......@@ -119,7 +119,7 @@ export default class MainBase extends Vue implements ControlInterface {
* @type {*}
* @memberof MainBase
*/
@Prop() public viewparams: any;
@Prop() public viewparams!: any;
/**
* 视图状态事件
......@@ -228,6 +228,14 @@ export default class MainBase extends Vue implements ControlInterface {
*/
public formKeyItemName: string = '';
/**
* 是否自动加载
*
* @type {boolean}
* @memberof MainBase
*/
@Prop({default:false}) public isautoload?:boolean;
/**
* 界面UI服务对象
*
......@@ -556,34 +564,40 @@ export default class MainBase extends Vue implements ControlInterface {
startOp(true);
return falg;
}
// 常规规则
if(item.type == 'SIMPLE'){
startOp(!this.$verify.checkFieldSimpleRule(dataValue,item.condOP,item.paramValue,item.ruleInfo,item.paramType,this.data,item.isKeyCond));
falg.infoMessage = item.ruleInfo;
if(!falg.isPast) return falg;
}
// 数值范围
if(item.type == 'VALUERANGE2'){
startOp( !this.$verify.checkFieldValueRangeRule(dataValue,item.minValue,item.isIncludeMinValue,item.maxValue,item.isIncludeMaxValue,item.ruleInfo,item.isKeyCond));
falg.infoMessage = item.ruleInfo;
if(!falg.isPast) return falg;
}
// 正则式
if (item.type == "REGEX") {
startOp(!this.$verify.checkFieldRegExRule(dataValue,item.regExCode,item.ruleInfo,item.isKeyCond));
falg.infoMessage = item.ruleInfo;
if(!falg.isPast) return falg;
}
// 长度
if (item.type == "STRINGLENGTH") {
startOp(!this.$verify.checkFieldStringLengthRule(dataValue,item.minValue,item.isIncludeMinValue,item.maxValue,item.isIncludeMaxValue,item.ruleInfo,item.isKeyCond));
falg.infoMessage = item.ruleInfo;
if(!falg.isPast) return falg;
}
// 系统值规则
if(item.type == "SYSVALUERULE") {
startOp(!this.$verify.checkFieldSysValueRule(dataValue,item.sysRule.regExCode,item.ruleInfo,item.isKeyCond));
try {
// 常规规则
if(item.type == 'SIMPLE'){
startOp(!this.$verify.checkFieldSimpleRule(dataValue,item.condOP,item.paramValue,item.ruleInfo,item.paramType,this.data,item.isKeyCond));
falg.infoMessage = item.ruleInfo;
if(!falg.isPast) return falg;
}
// 数值范围
if(item.type == 'VALUERANGE2'){
startOp( !this.$verify.checkFieldValueRangeRule(dataValue,item.minValue,item.isIncludeMinValue,item.maxValue,item.isIncludeMaxValue,item.ruleInfo,item.isKeyCond));
falg.infoMessage = item.ruleInfo;
if(!falg.isPast) return falg;
}
// 正则式
if (item.type == "REGEX") {
startOp(!this.$verify.checkFieldRegExRule(dataValue,item.regExCode,item.ruleInfo,item.isKeyCond));
falg.infoMessage = item.ruleInfo;
if(!falg.isPast) return falg;
}
// 长度
if (item.type == "STRINGLENGTH") {
startOp(!this.$verify.checkFieldStringLengthRule(dataValue,item.minValue,item.isIncludeMinValue,item.maxValue,item.isIncludeMaxValue,item.ruleInfo,item.isKeyCond));
falg.infoMessage = item.ruleInfo;
if(!falg.isPast) return falg;
}
// 系统值规则
if(item.type == "SYSVALUERULE") {
startOp(!this.$verify.checkFieldSysValueRule(dataValue,item.sysRule.regExCode,item.ruleInfo,item.isKeyCond));
falg.infoMessage = item.ruleInfo;
if(!falg.isPast) return falg;
}
} catch(error) {
falg.infoMessage = item.ruleInfo;
startOp(false);
if(!falg.isPast) return falg;
}
// 分组
......@@ -598,7 +612,7 @@ export default class MainBase extends Vue implements ControlInterface {
if(!falg.hasOwnProperty("isPast")){
falg.isPast = true;
}
if(!this.data[name]){
if(!this.data[name] && this.data[name] != 0){
falg.isPast = true;
}
return falg;
......@@ -1111,6 +1125,9 @@ export default class MainBase extends Vue implements ControlInterface {
* @memberof MainBase
*/
public afterCreated(){
if(this.isautoload){
this.autoLoad({srfkey:this.context.documentcenter});
}
if (this.viewState) {
this.viewStateEvent = this.viewState.subscribe(({ tag, action, data }) => {
if (!Object.is(tag, this.name)) {
......@@ -1925,6 +1942,17 @@ export default class MainBase extends Vue implements ControlInterface {
public updateDefault(){
}
/**
* 面板数据变化处理事件
* @param {any} item 当前列数据
* @param {any} $event 面板事件数据
*
* @memberof MainBase
*/
public onPanelDataChange(item:any,$event:any) {
Object.assign(item, $event, {rowDataState:'update'});
}
}
</script>
......
......@@ -6,6 +6,7 @@
}
.app-form {
overflow: auto;
padding: 6px;
> .ivu-row {
> .ivu-tabs {
height: 100%;
......
......@@ -37,11 +37,6 @@
git clone -b master $para2 ibztask/
export NODE_OPTIONS=--max-old-space-size=4096
cd ibztask/
mvn clean package -Papi
cd ibztask-provider/ibztask-provider-api
mvn -Papi docker:build
mvn -Papi docker:push
docker -H $para1 stack deploy --compose-file=src/main/docker/ibztask-provider-api.yaml ibzlab-rt --with-registry-auth
</command>
</hudson.tasks.Shell>
</builders>
......
......@@ -112,10 +112,10 @@ public class webSecurityConfig extends WebSecurityConfigurerAdapter {
"/**/svg/**",
"/"
).permitAll()
//放行登录请求
.antMatchers( HttpMethod.POST,"/"+loginPath).permitAll()
//放行注销请求
.antMatchers( HttpMethod.GET,"/"+logoutPath).permitAll()
// 放行登录请求
.antMatchers( HttpMethod.POST, "/"+loginPath).permitAll()
// 放行注销请求
.antMatchers( HttpMethod.GET, "/"+logoutPath).permitAll()
// 文件操作
.antMatchers("/"+downloadpath+"/**").permitAll()
.antMatchers("/"+uploadpath).permitAll()
......
......@@ -30,13 +30,13 @@ import java.util.List;
@SpringBootApplication(exclude = {
org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class,
})
public class webApplication extends WebMvcConfigurerAdapter{
public class webApplication extends WebMvcConfigurerAdapter {
@Autowired
SearchContextHandlerMethodArgumentResolver resolver;
public static void main(String[] args) {
SpringApplication.run(webApplication.class,args);
SpringApplication.run(webApplication.class, args);
}
@Override
......
......@@ -25,8 +25,8 @@ import org.springframework.beans.factory.annotation.Autowired;
@SpringBootApplication(exclude = {
})
@ComponentScan(basePackages = {"cn.ibizlab"}
// ,excludeFilters={
// @ComponentScan.Filter(type= org.springframework.context.annotation.FilterType.REGEX,pattern="cn.ibizlab.xxx.rest.xxx"),
// ,excludeFilters = {
// @ComponentScan.Filter(type= org.springframework.context.annotation.FilterType.REGEX, pattern="cn.ibizlab.xxx.rest.xxx"),
// }
)
@Import({
......@@ -34,13 +34,13 @@ import org.springframework.beans.factory.annotation.Autowired;
})
@EnableAsync
@EnableScheduling
public class DevBootApplication extends WebMvcConfigurerAdapter{
public class DevBootApplication extends WebMvcConfigurerAdapter {
@Autowired
SearchContextHandlerMethodArgumentResolver resolver;
public static void main(String[] args) {
SpringApplication.run(DevBootApplication.class,args);
SpringApplication.run(DevBootApplication.class, args);
}
@Override
......
......@@ -110,9 +110,9 @@ public class DevBootSecurityConfig extends WebSecurityConfigurerAdapter {
"/v2/**"
).permitAll()
//放行登录请求
.antMatchers( HttpMethod.POST,"/"+loginPath).permitAll()
.antMatchers( HttpMethod.POST, "/"+loginPath).permitAll()
//放行注销请求
.antMatchers( HttpMethod.GET,"/"+logoutPath).permitAll()
.antMatchers( HttpMethod.GET, "/"+logoutPath).permitAll()
// 文件操作
.antMatchers("/"+downloadpath+"/**").permitAll()
.antMatchers("/"+uploadpath).permitAll()
......
......@@ -58,7 +58,7 @@ public class JobsInfoSearchContext extends QueryWrapperContext<JobsInfo> {
this.query=query;
if(!StringUtils.isEmpty(query)){
this.getSearchCond().and( wrapper ->
wrapper.like("handler", query)
wrapper.like("handler", query)
);
}
}
......
......@@ -44,7 +44,7 @@ public class JobsLockSearchContext extends QueryWrapperContext<JobsLock> {
this.query=query;
if(!StringUtils.isEmpty(query)){
this.getSearchCond().and( wrapper ->
wrapper.like("name", query)
wrapper.like("name", query)
);
}
}
......
......@@ -58,7 +58,7 @@ public class JobsLogSearchContext extends QueryWrapperContext<JobsLog> {
this.query=query;
if(!StringUtils.isEmpty(query)){
this.getSearchCond().and( wrapper ->
wrapper.like("handler", query)
wrapper.like("handler", query)
);
}
}
......
......@@ -51,7 +51,7 @@ public class JobsRegistrySearchContext extends QueryWrapperContext<JobsRegistry>
this.query=query;
if(!StringUtils.isEmpty(query)){
this.getSearchCond().and( wrapper ->
wrapper.like("app", query)
wrapper.like("app", query)
);
}
}
......
......@@ -160,17 +160,17 @@ public class JobsInfoServiceImpl extends ServiceImpl<JobsInfoMapper, JobsInfo> i
@Override
@Transactional
public JobsInfo start(JobsInfo et) {
et.set("Status","0");
et.set("Last_time","0");
et.set("Status","0");
update(et);
return et;
}
@Override
@Transactional
public JobsInfo stop(JobsInfo et) {
et.set("Next_time","0");
et.set("Last_time","0");
et.set("Status","1");
et.set("Next_time","0");
update(et);
return et;
}
......
......@@ -4,37 +4,37 @@
],
"entities":[
{
"dename":"JobsLog",
"delogicname":"任务调度日志",
"dename":"JobsInfo",
"delogicname":"任务信息",
"sysmoudle":{"id":"TASK","name":"task"},
"dedataset":[{"id":"Default" , "name":"DEFAULT"}],
"deaction":[{"id":"Create" , "name":"Create" , "type":"BUILTIN" },{"id":"Update" , "name":"Update" , "type":"BUILTIN" },{"id":"Remove" , "name":"Remove" , "type":"BUILTIN" },{"id":"Get" , "name":"Get" , "type":"BUILTIN" },{"id":"GetDraft" , "name":"GetDraft" , "type":"BUILTIN" },{"id":"CheckKey" , "name":"CheckKey" , "type":"BUILTIN" },{"id":"Save" , "name":"Save" , "type":"BUILTIN" }],
"deaction":[{"id":"Create" , "name":"Create" , "type":"BUILTIN" },{"id":"Update" , "name":"Update" , "type":"BUILTIN" },{"id":"Remove" , "name":"Remove" , "type":"BUILTIN" },{"id":"Get" , "name":"Get" , "type":"BUILTIN" },{"id":"GetDraft" , "name":"GetDraft" , "type":"BUILTIN" },{"id":"CheckKey" , "name":"CheckKey" , "type":"BUILTIN" },{"id":"Execute" , "name":"执行" , "type":"USERCUSTOM" },{"id":"Save" , "name":"Save" , "type":"BUILTIN" },{"id":"Start" , "name":"开始" , "type":"USERUPDATE" },{"id":"Stop" , "name":"停止" , "type":"USERUPDATE" }],
"datascope":[{"id":"all","name":"全部数据"}]
}
}
, {
"dename":"JobsRegistry",
"delogicname":"任务注册信息",
"dename":"JobsLock",
"delogicname":"任务",
"sysmoudle":{"id":"TASK","name":"task"},
"dedataset":[{"id":"Default" , "name":"DEFAULT"}],
"deaction":[{"id":"Create" , "name":"Create" , "type":"BUILTIN" },{"id":"Update" , "name":"Update" , "type":"BUILTIN" },{"id":"Remove" , "name":"Remove" , "type":"BUILTIN" },{"id":"Get" , "name":"Get" , "type":"BUILTIN" },{"id":"GetDraft" , "name":"GetDraft" , "type":"BUILTIN" },{"id":"CheckKey" , "name":"CheckKey" , "type":"BUILTIN" },{"id":"Save" , "name":"Save" , "type":"BUILTIN" }],
"datascope":[{"id":"all","name":"全部数据"}]
}
}
, {
"dename":"JobsInfo",
"delogicname":"任务信息",
"dename":"JobsLog",
"delogicname":"任务调度日志",
"sysmoudle":{"id":"TASK","name":"task"},
"dedataset":[{"id":"Default" , "name":"DEFAULT"}],
"deaction":[{"id":"Create" , "name":"Create" , "type":"BUILTIN" },{"id":"Update" , "name":"Update" , "type":"BUILTIN" },{"id":"Remove" , "name":"Remove" , "type":"BUILTIN" },{"id":"Get" , "name":"Get" , "type":"BUILTIN" },{"id":"GetDraft" , "name":"GetDraft" , "type":"BUILTIN" },{"id":"CheckKey" , "name":"CheckKey" , "type":"BUILTIN" },{"id":"Execute" , "name":"执行" , "type":"USERCUSTOM" },{"id":"Save" , "name":"Save" , "type":"BUILTIN" },{"id":"Start" , "name":"开始" , "type":"USERUPDATE" },{"id":"Stop" , "name":"停止" , "type":"USERUPDATE" }],
"deaction":[{"id":"Create" , "name":"Create" , "type":"BUILTIN" },{"id":"Update" , "name":"Update" , "type":"BUILTIN" },{"id":"Remove" , "name":"Remove" , "type":"BUILTIN" },{"id":"Get" , "name":"Get" , "type":"BUILTIN" },{"id":"GetDraft" , "name":"GetDraft" , "type":"BUILTIN" },{"id":"CheckKey" , "name":"CheckKey" , "type":"BUILTIN" },{"id":"Save" , "name":"Save" , "type":"BUILTIN" }],
"datascope":[{"id":"all","name":"全部数据"}]
}
}
, {
"dename":"JobsLock",
"delogicname":"任务",
"dename":"JobsRegistry",
"delogicname":"任务注册信息",
"sysmoudle":{"id":"TASK","name":"task"},
"dedataset":[{"id":"Default" , "name":"DEFAULT"}],
"deaction":[{"id":"Create" , "name":"Create" , "type":"BUILTIN" },{"id":"Update" , "name":"Update" , "type":"BUILTIN" },{"id":"Remove" , "name":"Remove" , "type":"BUILTIN" },{"id":"Get" , "name":"Get" , "type":"BUILTIN" },{"id":"GetDraft" , "name":"GetDraft" , "type":"BUILTIN" },{"id":"CheckKey" , "name":"CheckKey" , "type":"BUILTIN" },{"id":"Save" , "name":"Save" , "type":"BUILTIN" }],
"datascope":[{"id":"all","name":"全部数据"}]
}
}
],
"appmenus":[
......
......@@ -9,6 +9,8 @@
"table_name":"JOBS_INFO",
"system_id":"ibztask",
"system_name":"ibztask",
"module_id":"task",
"module_name":"task",
"fields":[
{
"fieldname":"ID" ,
......@@ -229,6 +231,8 @@
"table_name":"JOBS_LOCK",
"system_id":"ibztask",
"system_name":"ibztask",
"module_id":"task",
"module_name":"task",
"fields":[
{
"fieldname":"ID" ,
......@@ -299,6 +303,8 @@
"table_name":"JOBS_LOG",
"system_id":"ibztask",
"system_name":"ibztask",
"module_id":"task",
"module_name":"task",
"fields":[
{
"fieldname":"ID" ,
......@@ -451,6 +457,8 @@
"table_name":"JOBS_REGISTRY",
"system_id":"ibztask",
"system_name":"ibztask",
"module_id":"task",
"module_name":"task",
"fields":[
{
"fieldname":"ID" ,
......
......@@ -12,6 +12,6 @@ CMD echo "The application will start in ${IBIZ_SLEEP}s..." && \
sleep ${IBIZ_SLEEP} && \
java ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -jar /ibztask-provider-api.jar
EXPOSE 40005
EXPOSE 8081
ADD ibztask-provider-api.jar /ibztask-provider-api.jar
......@@ -3,23 +3,9 @@ services:
ibztask-provider-api:
image: registry.cn-shanghai.aliyuncs.com/ibizsys/ibztask-provider-api:latest
ports:
- "40005:40005"
- "8081:8081"
networks:
- agent_network
environment:
- SPRING_CLOUD_NACOS_DISCOVERY_IP=172.16.180.237
- SERVER_PORT=40005
- SPRING_CLOUD_NACOS_DISCOVERY_SERVER-ADDR=172.16.100.243: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.100.243:8848
- SPRING_CLOUD_NACOS_DISCOVERY_GROUP=ibizdev
deploy:
resources:
limits:
......
......@@ -19,7 +19,7 @@ import org.springframework.context.annotation.Import;
@ConditionalOnClass(apiRestConfiguration.class)
@ConditionalOnWebApplication
@EnableConfigurationProperties(apiServiceProperties.class)
public class apiAutoConfiguration implements ApplicationContextAware{
public class apiAutoConfiguration implements ApplicationContextAware {
protected ApplicationContext applicationContext;
......
package cn.ibizlab.util.domain;
import com.alibaba.fastjson.annotation.JSONField;
import com.fasterxml.jackson.annotation.JsonAnyGetter;
import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.alibaba.fastjson.annotation.JSONField;
import lombok.Data;
import cn.ibizlab.util.helper.DEFieldCacheMap;
import org.springframework.cglib.beans.BeanMap;
import org.springframework.data.annotation.Transient;
import org.springframework.util.StringUtils;
import java.io.Serializable;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import lombok.Data;
@Data
public class DTOBase implements Serializable {
......@@ -73,9 +77,44 @@ public class DTOBase implements Serializable {
return extensionparams;
}
@JsonIgnore
@JSONField(serialize = false)
@Transient
private BeanMap map;
private BeanMap getMap()
{
if(map==null) {
map=BeanMap.create(this);
}
return map;
}
public Object get(String field) {
String fieldRealName= DEFieldCacheMap.getFieldRealName(this.getClass(),field);
if(!StringUtils.isEmpty(fieldRealName)) {
return getMap().get(fieldRealName);
}
else {
return this.extensionparams.get(field.toLowerCase());
}
}
@JsonAnySetter
public void set(String name, Object value) {
extensionparams.put(name.toLowerCase(), value);
public void set(String field, Object value) {
field=field.toLowerCase();
String fieldRealName=DEFieldCacheMap.getFieldRealName(this.getClass(),field);
if(!StringUtils.isEmpty(fieldRealName)) {
if (value == null) {
getMap().put(fieldRealName, null);
}
else {
getMap().put(fieldRealName, DEFieldCacheMap.fieldValueOf(this.getClass(), fieldRealName, value));
}
}
else {
this.extensionparams.put(field.toLowerCase(),value);
}
}
}
Markdown 格式
0% or
您添加了 0 到此讨论。请谨慎行事。
先完成此消息的编辑!
想要评论请 注册