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

ibizdev提交

上级 15e3ac29
{
"appindexview": {
"title": "应用首页视图",
"caption": "首页",
"viewtype": "APPINDEXVIEW",
"viewmodule": "Ungroup",
"viewname": "AppIndexView",
"viewtag": "958184FC-744E-4B78-A919-158C780D583F"
}
}
......@@ -25,8 +25,13 @@ export default {
},
// 非实体视图
views: {
appindexview: {
caption: '首页',
},
},
menus: {
appindexview: {
},
},
},
};
\ No newline at end of file
......@@ -25,8 +25,13 @@ export default {
},
// 非实体视图
views: {
appindexview: {
caption: '首页',
},
},
menus: {
appindexview: {
},
},
},
};
\ No newline at end of file
import { MockAdapter } from '@/mock/mock-adapter';
const mock = MockAdapter.getInstance();
import Mock from 'mockjs'
const Random = Mock.Random;
// 获取应用数据
mock.onGet('v7/app-index-viewappmenu').reply((config: any) => {
let status = MockAdapter.mockStatus(config);
return [status, {
name: 'appmenu',
items: [
],
}];
});
......@@ -7,5 +7,13 @@ import Mock from 'mockjs'
mock.onGet('./assets/json/view-config.json').reply((config: any) => {
let status = MockAdapter.mockStatus(config);
return [status,{
}];
"appindexview": {
"title": "应用首页视图",
"caption": "首页",
"viewtype": "APPINDEXVIEW",
"viewmodule": "Ungroup",
"viewname": "AppIndexView",
"viewtag": "958184FC-744E-4B78-A919-158C780D583F"
}
}];
});
\ No newline at end of file
<template>
<div class="index_view app-index-view">
<app-studioaction viewTitle="应用首页视图" viewName="appindexview"></app-studioaction>
<layout :class="themeClasses" :style="themeStyle">
<header class="index_header">
<div class="page-logo">
<img src="../../../assets/img/logo2.png" height="22" />
<span style="display: inline-block;margin-left: 10px;font-size: 22px;">首页</span>
</div>
<div class="header-right" style="display: flex;align-items: center;justify-content: space-between;">
<div>
<icon type="md-notifications-outline" style="font-size: 25px;margin: 0 10px;" />
</div>
<div>
<icon type="ios-mail-open-outline" style="font-size: 25px;margin: 0 10px;" />
</div>
<app-lang style='font-size: 15px;padding: 0 10px;'></app-lang>
<app-orgsector></app-orgsector>
<app-user></app-user>
<app-theme style="width:45px;display: flex;justify-content: center;"></app-theme>
</div>
</header>
<layout>
<sider :width="collapseChange ? 64 : 200" hide-trigger v-model="collapseChange">
<div class="sider-top">
<i class="ivu-icon ivu-icon-md-menu" @click="handleClick"></i>
</div>
<view_appmenu
:viewState="viewState"
:viewparams="viewparams"
:context="context"
:showBusyIndicator="true"
v-model="collapseChange"
:mode="mode"
:selectTheme="selectTheme"
:isDefaultPage="isDefaultPage"
:defPSAppView="defPSAppView"
name="appmenu"
ref='appmenu'
@closeview="closeView($event)">
</view_appmenu>
</sider>
<content class="index_content" :style="{'width':this.collapseChange ? 'calc(100vw - 64px)' : 'calc(100vw - 200px)' }">
<tab-page-exp></tab-page-exp>
<app-keep-alive :routerList="getRouterList">
<router-view :key="getRouterViewKey"></router-view>
</app-keep-alive>
</content>
</layout>
</layout>
</div>
</template>
<script lang='ts'>
import { Vue, Component, Prop, Provide, Emit, Watch } from 'vue-property-decorator';
import { UIActionTool,Util } from '@/utils';
import { Subject } from 'rxjs';
@Component({
components: {
},
})
export default class AppIndexViewBase extends Vue {
/**
* 计数器服务对象集合
*
* @type {Array<*>}
* @memberof AppIndexViewBase
*/
protected counterServiceArray:Array<any> = [];
/**
* 数据变化
*
* @param {*} val
* @returns {*}
* @memberof AppIndexViewBase
*/
@Emit()
protected viewDatasChange(val: any):any {
return val;
}
/**
* 传入视图上下文
*
* @type {string}
* @memberof AppIndexViewBase
*/
@Prop() protected viewdata!: string;
/**
* 传入视图参数
*
* @type {string}
* @memberof AppIndexViewBase
*/
@Prop() protected viewparam!: string;
/**
* 视图默认使用
*
* @type {boolean}
* @memberof AppIndexViewBase
*/
@Prop({ default: true }) protected viewDefaultUsage!: boolean;
/**
* 视图标识
*
* @type {string}
* @memberof AppIndexViewBase
*/
protected viewtag: string = '958184FC-744E-4B78-A919-158C780D583F';
/**
* 视图模型数据
*
* @type {*}
* @memberof AppIndexViewBase
*/
protected model: any = {
srfTitle: '应用首页视图',
srfCaption: 'app.views.appindexview.caption',
srfSubCaption: '',
dataInfo: ''
}
/**
* 视图参数变化
*
* @param {*} newVal
* @param {*} oldVal
* @memberof AppIndexViewBase
*/
@Watch('viewparam',{immediate: true, deep: true})
onParamData(newVal: any, oldVal: any) {
if(newVal){
Object.assign(this.viewparams, JSON.parse(this.viewparam));
}
}
/**
* 处理应用上下文变化
*
* @param {*} newVal
* @param {*} oldVal
* @memberof AppIndexViewBase
*/
@Watch('viewdata')
onViewData(newVal: any, oldVal: any) {
const _this: any = this;
if (!Object.is(newVal, oldVal) && _this.engine) {
_this.parseViewParam();
_this.engine.load();
}
}
/**
* 容器模型
*
* @type {*}
* @memberof AppIndexViewBase
*/
protected containerModel: any = {
view_appmenu: { name: 'appmenu', type: 'APPMENU' },
};
/**
* 计数器刷新
*
* @memberof AppIndexViewBase
*/
public counterRefresh(){
const _this:any =this;
if(_this.counterServiceArray && _this.counterServiceArray.length >0){
_this.counterServiceArray.forEach((item:any) =>{
if(item.refreshData && item.refreshData instanceof Function){
item.refreshData();
}
})
}
}
/**
* 视图状态订阅对象
*
* @private
* @type {Subject<{action: string, data: any}>}
* @memberof AppIndexViewBase
*/
protected viewState: Subject<ViewState> = new Subject();
/**
* 引擎初始化
*
* @private
* @memberof AppIndexViewBase
*/
private engineInit(): void {
}
/**
* 应用上下文
*
* @type {*}
* @memberof AppIndexViewBase
*/
protected context:any = {};
/**
* 视图参数
*
* @type {*}
* @memberof AppIndexViewBase
*/
protected viewparams:any = {};
/**
* 解析视图参数
*
* @private
* @memberof AppIndexViewBase
*/
private parseViewParam(): void {
if (!this.viewDefaultUsage && this.viewdata && !Object.is(this.viewdata, '')) {
Object.assign(this.context, JSON.parse(this.viewdata));
if(this.context && this.context.srfparentdename){
Object.assign(this.viewparams,{srfparentdename:this.context.srfparentdename});
}
if(this.context && this.context.srfparentkey){
Object.assign(this.viewparams,{srfparentkey:this.context.srfparentkey});
}
return;
}
const path = (this.$route.matched[this.$route.matched.length - 1]).path;
const keys: Array<any> = [];
const curReg = this.$pathToRegExp.pathToRegexp(path, keys);
const matchArray = curReg.exec(this.$route.path);
let tempValue: Object = {};
keys.forEach((item: any, index: number) => {
Object.defineProperty(tempValue, item.name, {
enumerable: true,
value: matchArray[index + 1]
});
});
this.$viewTool.formatRouteParams(tempValue,this.$route,this.context,this.viewparams);
if(this.$store.getters.getAppData() && this.$store.getters.getAppData().context){
Object.assign(this.context,this.$store.getters.getAppData().context);
}
}
/**
* Vue声明周期
*
* @memberof AppIndexViewBase
*/
protected created() {
this.afterCreated();
}
/**
* 执行created后的逻辑
*
* @memberof AppIndexViewBase
*/
protected afterCreated(){
const secondtag = this.$util.createUUID();
this.$store.commit('viewaction/createdView', { viewtag: this.viewtag, secondtag: secondtag });
this.viewtag = secondtag;
this.parseViewParam();
}
/**
* 销毁之前
*
* @memberof AppIndexViewBase
*/
protected beforeDestroy() {
this.$store.commit('viewaction/removeView', this.viewtag);
}
/**
* Vue声明周期(组件初始化完毕)
*
* @memberof AppIndexViewBase
*/
protected mounted() {
this.afterMounted();
}
/**
* 执行mounted后的逻辑
*
* @memberof AppIndexViewBase
*/
protected afterMounted(){
const _this: any = this;
_this.engineInit();
if (_this.loadModel && _this.loadModel instanceof Function) {
_this.loadModel();
}
this.viewState.next({ tag: 'appmenu', action: 'load', data: {} });
this.$viewTool.setIndexParameters([{ pathName: 'appindexview', parameterName: 'appindexview' }]);
this.$viewTool.setIndexViewParam(this.context);
}
/**
* 关闭视图
*
* @param {any[]} args
* @memberof AppIndexViewBase
*/
protected closeView(args: any[]): void {
let _view: any = this;
if (_view.viewdata) {
_view.$emit('viewdataschange', [args]);
_view.$emit('close', [args]);
} else if (_view.$tabPageExp) {
_view.$tabPageExp.onClose(_view.$route.fullPath);
}
}
/**
* 菜单位置
*
* @private
* @type {string}
* @memberof AppIndexViewBase
*/
private mode: string ='vertical';
/**
* 当前主题
*
* @readonly
* @memberof AppIndexViewBase
*/
get selectTheme() {
if (this.$router.app.$store.state.selectTheme) {
return this.$router.app.$store.state.selectTheme;
} else if (localStorage.getItem('theme-class')) {
return localStorage.getItem('theme-class');
} else {
return 'app-default-theme';
}
}
/**
* 当前字体
*
* @readonly
* @memberof AppIndexViewBase
*/
get selectFont() {
if (this.$router.app.$store.state.selectFont) {
return this.$router.app.$store.state.selectFont;
} else if (localStorage.getItem('font-family')) {
return localStorage.getItem('font-family');
} else {
return 'Microsoft YaHei';
}
}
/**
* 菜单收缩变化
*
* @type {boolean}
* @memberof AppIndexViewBase
*/
public collapseChange: boolean = false;
/**
* 菜单收缩点击
*
* @memberof AppIndexViewBase
*/
public handleClick(): void {
this.collapseChange = !this.collapseChange;
}
/**
* 默认打开的视图
*
* @type {*}
* @memberof AppIndexViewBase
*/
public defPSAppView: any = {
};
/**
* 应用起始页面
*
* @type {boolean}
* @memberof AppIndexViewBase
*/
public isDefaultPage: boolean = false;
/**
* 获取样式
*
* @readonly
* @type {string[]}
* @memberof AppIndexViewBase
*/
get themeClasses(): string[] {
return [
Object.is(this.selectTheme, 'app_theme_blue') ? 'app_theme_blue' : '',
Object.is(this.selectTheme, 'app-default-theme') ? 'app-default-theme' : '',
Object.is(this.selectTheme, 'app_theme_darkblue') ? 'app_theme_darkblue' : '',
];
}
/**
* 主题字体
*
* @readonly
* @type {*}
* @memberof AppIndexViewBase
*/
get themeStyle(): any {
return {
'height': '100vh',
'font-family': this.selectFont,
}
}
/**
* 获取路由列表
*
* @readonly
* @type {any[]}
* @memberof AppIndexViewBase
*/
get getRouterList(): any[] {
return this.$store.state.historyPathList;
}
/**
* 获取路由键值
*
* @readonly
* @type {string}
* @memberof AppIndexViewBase
*/
get getRouterViewKey(): string {
return this.$route.fullPath;
}
}
</script>
<style lang='less'>
@import './app-index-view.less';
</style>
\ No newline at end of file
.app-index-view{
position: relative;
}
.index_view{
width: 100%;
height: 100%;
padding: 0;
margin: 0;
.index_header{
height:50px;
padding:0 20px;
display: flex;
align-items: center;
justify-content: space-between;
.header-left{
display: flex;
align-items: center;
justify-content: space-between;
.el-menu.el-menu--horizontal{
border-bottom: none;
.el-submenu{
border-top: none;
}
}
}
> div {
line-height: 49px;
}
}
.index_content{
background-color:#fff;
height:calc(100vh - 50px);
overflow-x: hidden;
overflow-y: hidden;
}
>.ivu-layout {
>.ivu-layout {
height: calc(100vh - 50px);
}
}
.ivu-layout .ivu-layout-sider .ivu-layout-sider-children .sider-top{
line-height: 58px;
text-align: right;
padding-right: 18px;
}
.ivu-layout .ivu-layout-sider .ivu-layout-sider-children .sider-top .ivu-icon{
font-size: 20px;
padding: 4px;
margin-top: -2px;
cursor: pointer;
}
}
/*** BRGIN:滚动条样式 ***/
::-webkit-scrollbar {
background: transparent;
width: 4px;
height: 4px;
}
::-webkit-scrollbar-thumb {
border-radius: 0;
box-shadow: none;
border: 0;
background-color: #cecece;
}
::-webkit-scrollbar-track {
border-radius: 0;
box-shadow: none;
border: 0;
}
\ No newline at end of file
<script lang='ts'>
import { Component } from 'vue-property-decorator';
import AppIndexViewBase from './app-index-view-base.vue';
import view_appmenu from '@widgets/app/app-index-view-appmenu/app-index-view-appmenu.vue';
@Component({
components: {
view_appmenu,
},
beforeRouteEnter: (to: any, from: any, next: any) => {
next((vm: any) => {
vm.$store.commit('addCurPageViewtag', { fullPath: to.fullPath, viewtag: vm.viewtag });
});
},
})
export default class AppIndexView extends AppIndexViewBase {
}
</script>
\ No newline at end of file
import Vue from 'vue';
import Vuex from 'vuex';
import VueRouter from 'vue-router';
import App from '@/App.vue';
import ElementUi from 'element-ui';
import ViewUI from 'view-design';
import { Interceptors } from '@/utils';
import {Print} from '@/utils/print';
import i18n from '@/locale'
import 'element-ui/lib/theme-chalk/index.css';
import 'view-design/dist/styles/iview.css';
import '@/styles/default.less';
// 模拟数据
if (process.env.NODE_ENV === 'development') {
require('@/mock');
}
const pathToRegExp = require('path-to-regexp');
import { AppComponents } from '@/app-register';
import { PageComponents } from './page-register';
import { UserComponent } from '@/user-register';
import { PortletComponent } from '@/portlet-register';
import store from '@/store';
import router from './router';
Vue.config.errorHandler = function (err: any, vm: any, info: any) {
console.log(err);
}
Vue.config.productionTip = false;
Vue.use(Print)
Vue.use(Vuex);
Vue.use(VueRouter);;
Vue.use(ElementUi, {
i18n: (key: any, value: any) => i18n.t(key, value)
});
Vue.use(ViewUI, {
i18n: (key: any, value: any) => i18n.t(key, value)
});
// Vue.use(utils);
Vue.prototype.$pathToRegExp = pathToRegExp;
Vue.use(AppComponents);
Vue.use(PageComponents);
Vue.use(UserComponent);
Vue.use(PortletComponent);
router.beforeEach((to: any, from: any, next: any) => {
if (to.meta && !to.meta.ignoreAddPage) {
router.app.$store.commit('addPage', to);
}
next();
});
Interceptors.getInstance(router,store);
const init = async () => {
new Vue({
i18n,
store,
router,
render: (h: any) => h(App),
}).$mount('#app');
};
init();
\ No newline at end of file
export const PageComponents = {
install(Vue: any, opt: any) {
}
};
\ No newline at end of file
import Vue from 'vue';
import Router from 'vue-router';
import { AuthGuard } from '@/utils';
import qs from 'qs';
Vue.use(Router);
const router = new Router({
routes: [
{
path: '/appindexview/:appindexview?',
beforeEnter: (to: any, from: any, next: any) => {
const routerParamsName = 'appindexview';
const params: any = {};
if (to.params && to.params[routerParamsName]) {
Object.assign(params, qs.parse(to.params[routerParamsName], { delimiter: ';' }));
}
const url: string = '/appdata';
const auth: Promise<any> = AuthGuard.getInstance().authGuard(url, params, router);
auth.then(() => {
next();
}).catch(() => {
next();
});
},
meta: {
caption: '首页',
viewType: 'APPINDEX',
parameters: [
{ pathName: 'appindexview', parameterName: 'appindexview' },
],
requireAuth: true,
},
component: () => import('@pages/ungroup/app-index-view/app-index-view.vue'),
children: [
],
},
{
path: '/login/:login?',
name: 'login',
meta: {
caption: '登录',
viewType: 'login',
requireAuth: false,
ignoreAddPage: true,
},
beforeEnter: (to: any, from: any, next: any) => {
router.app.$store.commit('resetRootStateData');
next();
},
component: () => import('@components/login/login.vue'),
},
{
path: '/404',
component: () => import('@components/404/404.vue')
},
{
path: '/500',
component: () => import('@components/500/500.vue')
},
{
path: '*',
redirect: 'appindexview'
},
],
});
export default router;
......@@ -3,6 +3,15 @@
*/
export const viewstate: any = {
appviews: [
{
viewtag: '958184FC-744E-4B78-A919-158C780D583F',
viewmodule: 'Ungroup',
viewname: 'AppIndexView',
viewaction: '',
viewdatachange: false,
refviews: [
],
},
],
createdviews: [],
}
\ No newline at end of file
<template>
<div class="app-app-menu">
<el-menu
class="app-menu"
:default-openeds="defaultOpeneds"
:mode="mode"
:menu-trigger="trigger"
:collapse="isCollapse"
@select="select"
:default-active="defaultActive">
<template v-for="item0 in menus">
<template v-if="item0.items && Array.isArray(item0.items) && item0.items.length > 0">
<el-submenu v-show="!item0.hidden" :index="item0.name" :popper-class="popperClass" :key="item0.id">
<template slot='title'>
<template v-if="item0.icon && item0.icon != ''">
<img :src="item0.icon" class='app-menu-icon' />
</template>
<template v-else-if="item0.iconcls && item0.iconcls != ''">
<i :class="[item0.iconcls, 'app-menu-icon']"></i>
</template>
<template v-else>
<i class='fa fa-cogs app-menu-icon'></i>
</template>
<span class='text' slot='title'>{{$t('app.menus.appindexview.' + item0.name)}}</span>
</template>
<template v-for="item1 in item0.items">
<template v-if="item1.items && Array.isArray(item1.items) && item1.items.length > 0">
<el-submenu v-show="!item1.hidden" :index="item1.name" :popper-class="popperClass" :key="item1.id">
<template slot='title'>
<template v-if="item1.icon && item1.icon != ''">
<img :src="item1.icon" class='app-menu-icon' />
</template>
<template v-else-if="item1.iconcls && item1.iconcls != ''">
<i :class="[item1.iconcls, 'app-menu-icon']"></i>
</template>
<span class='text' slot='title'>{{$t('app.menus.appindexview.' + item1.name)}}</span>
</template>
<template v-for="item2 in item1.items">
<template v-if="item2.type =='MENUITEM'">
<el-menu-item v-show="!item2.hidden" :index="item2.name" :key="item2.id">
<template v-if="item2.icon && item2.icon != ''">
<img :src="item2.icon" class='app-menu-icon' />
</template>
<template v-else-if="item2.iconcls && item2.iconcls != ''">
<i :class="[item2.iconcls, 'app-menu-icon']"></i>
</template>
<template slot="title">
<span class="text">{{$t('app.menus.appindexview.' + item2.name)}}</span>
<template v-if="counterdata && counterdata[item2.counterid] && counterdata[item2.counterid] > 0">
<span class="pull-right">
<badge :count="counterdata[item2.counterid]" :overflow-count="9999"></badge>
</span>
</template>
</template>
</el-menu-item>
</template>
<template v-if="item2.type =='SEPERATOR'">
<divider :key="item2.id" />
</template>
</template>
</el-submenu>
</template>
<template v-else>
<template v-if="item1.type =='MENUITEM'">
<el-menu-item v-show="!item1.hidden" :index="item1.name" :key="item1.id">
<template v-if="item1.icon && item.icon != ''">
<img :src="item1.icon" class='app-menu-icon' />
</template>
<template v-else-if="item1.iconcls && item1.iconcls != ''">
<i :class="[item1.iconcls, 'app-menu-icon']"></i>
</template>
<template slot="title">
<span class="text">{{$t('app.menus.appindexview.' + item1.name)}} </span>
<template v-if="counterdata && counterdata[item1.counterid] && counterdata[item1.counterid] > 0">
<span class="pull-right">
<badge :count="counterdata[item1.counterid]" :overflow-count="9999"></badge>
</span>
</template>
</template>
</el-menu-item>
</template>
<template v-if="item1.type =='SEPERATOR'">
<divider :key="item1.id" />
</template>
</template>
</template>
</el-submenu>
</template>
<template v-else>
<template v-if="item0.type =='MENUITEM'">
<el-menu-item v-show="!item0.hidden" :index="item0.name" :key="item0.id">
<template v-if="item0.icon && item.icon != ''">
<img :src="item0.icon" class='app-menu-icon' />
</template>
<template v-else-if="item0.iconcls && item0.iconcls != ''">
<i :class="[item0.iconcls, 'app-menu-icon']"></i>
</template>
<template v-else>
<i class='fa fa-cogs app-menu-icon'></i>
</template>
<template slot="title">
<span class="text">{{$t('app.menus.appindexview.' + item0.name)}}</span>
<template v-if="counterdata && counterdata[item0.counterid] && counterdata[item0.counterid] > 0">
<span class="pull-right">
<badge :count="counterdata[item0.counterid]" :overflow-count="9999"></badge>
</span>
</template>
</template>
</el-menu-item>
</template>
<template v-if="item0.type =='SEPERATOR'">
<divider :key="item0.id" />
</template>
</template>
</template>
</el-menu>
</div>
</template>
<script lang='ts'>
import { Vue, Component, Prop, Provide, Emit, Watch, Model } from 'vue-property-decorator';
import { CreateElement } from 'vue';
import { Subject, Subscription } from 'rxjs';
import { ControlInterface } from '@/interface/control';
import { UIActionTool,Util } from '@/utils';
import AppIndexViewService from './app-index-view-appmenu-service';
import AppIndexViewModel from './app-index-view-appmenu-model';
@Component({
components: {
}
})
export default class AppIndexViewBase extends Vue implements ControlInterface {
/**
* 名称
*
* @type {string}
* @memberof AppIndexView
*/
@Prop() protected name?: string;
/**
* 视图通讯对象
*
* @type {Subject<ViewState>}
* @memberof AppIndexView
*/
@Prop() protected viewState!: Subject<ViewState>;
/**
* 应用上下文
*
* @type {*}
* @memberof AppIndexView
*/
@Prop() protected context: any;
/**
* 视图参数
*
* @type {*}
* @memberof AppIndexView
*/
@Prop() protected viewparams: any;
/**
* 视图状态事件
*
* @protected
* @type {(Subscription | undefined)}
* @memberof AppIndexView
*/
protected viewStateEvent: Subscription | undefined;
/**
* 获取部件类型
*
* @returns {string}
* @memberof AppIndexView
*/
protected getControlType(): string {
return 'APPMENU'
}
/**
* 建构部件服务对象
*
* @type {AppIndexViewService}
* @memberof AppIndexView
*/
protected service: AppIndexViewService = new AppIndexViewService({ $store: this.$store });
/**
* 关闭视图
*
* @param {any[]} args
* @memberof AppIndexView
*/
protected closeView(args: any[]): void {
let _this: any = this;
_this.$emit('closeview', args);
}
/**
* 计数器刷新
*
* @memberof AppIndexView
*/
public counterRefresh(){
const _this:any =this;
if(_this.counterServiceArray && _this.counterServiceArray.length >0){
_this.counterServiceArray.forEach((item:any) =>{
if(item.refreshData && item.refreshData instanceof Function){
item.refreshData();
}
})
}
}
/**
* 获取多项数据
*
* @returns {any[]}
* @memberof AppIndexView
*/
public getDatas(): any[] {
return [];
}
/**
* 获取单项树
*
* @returns {*}
* @memberof AppIndexView
*/
public getData(): any {
return null;
}
/**
* 菜单模型
*
* @private
* @type {AppIndexViewModel}
* @memberof AppIndexView
*/
private menuMode: AppIndexViewModel = new AppIndexViewModel();
/**
* 显示处理提示
*
* @type {boolean}
* @memberof AppIndexView
*/
@Prop({ default: true }) protected showBusyIndicator?: boolean;
/**
* 菜单数据
*
* @private
* @type {any[]}
* @memberof AppIndexView
*/
@Provide()
private menus: any[] = [];
/**
* 菜单收缩改变
*
* @type {boolean}
* @memberof AppIndexView
*/
@Model() protected collapsechange?: boolean;
/**
* 监听菜单收缩
*
* @param {*} newVal
* @param {*} oldVal
* @memberof AppIndexView
*/
@Watch('collapsechange')
onCollapsechangeChange(newVal: any, oldVal: any) {
if (newVal !== this.isCollapse) {
this.isCollapse = !this.isCollapse;
}
}
/**
* 当前模式,菜单在顶部还是在底部
*
* @type {*}
* @memberof AppIndexView
*/
@Prop() mode: any;
/**
* 当前菜单是否在默认视图上
*
* @type {*}
* @memberof AppIndexView
*/
@Prop({ default: false }) isDefaultPage?: boolean;
/**
* 默认打开视图
*
* @type {*}
* @memberof AppIndexView
*/
@Prop() defPSAppView: any;
/**
* 默认激活的index
*
* @type {*}
* @memberof AppIndexView
*/
@Provide() defaultActive: any = null;
/**
* 当前选中主题
*
* @type {*}
* @memberof AppIndexView
*/
@Prop() selectTheme: any;
/**
* 默认打开的index数组
*
* @type {any[]}
* @memberof AppIndexView
*/
@Provide() protected defaultOpeneds: any[] = [];
/**
* 是否展开
*
* @type {boolean}
* @memberof AppIndexView
*/
@Provide() protected isCollapse: boolean = false;
/**
* 触发方式,默认click
*
* @type {string}
* @memberof AppIndexView
*/
@Provide() trigger: string = 'click';
/**
* 计数器数据
*
* @type {*}
* @memberof AppIndexView
*/
protected counterdata: any = {};
/**
* vue 生命周期
*
* @memberof AppIndexView
*/
protected created() {
this.afterCreated();
}
/**
* 执行created后的逻辑
*
* @memberof AppIndexView
*/
protected afterCreated(){
if (Object.is(this.mode, 'horizontal')) {
this.trigger = 'hover';
}
if (this.viewState) {
this.viewStateEvent = this.viewState.subscribe(({ tag, action, data }) => {
if (!Object.is(tag, this.name)) {
return;
}
this.load(data);
});
}
}
/**
* vue 生命周期
*
* @memberof AppIndexView
*/
protected destroyed() {
this.afterDestroy();
}
/**
* 执行destroyed后的逻辑
*
* @memberof AppIndexView
*/
protected afterDestroy() {
if (this.viewStateEvent) {
this.viewStateEvent.unsubscribe();
}
}
/**
* 获取菜单项数据
*
* @private
* @param {any[]} items
* @param {string} name
* @returns
* @memberof AppIndexView
*/
private compute(items: any[], name: string) {
const item: any = {};
items.some((_item: any) => {
if (name && Object.is(_item.name, name)) {
Object.assign(item, _item);
this.setHideSideBar(_item);
return true;
}
if (_item.items && Array.isArray(_item.items)) {
const subItem = this.compute(_item.items, name);
if (Object.keys(subItem).length > 0) {
Object.assign(item, subItem);
return true;
}
}
return false;
});
return item;
}
/**
* 设置是否隐藏菜单栏
*
* @private
* @param {*} item
* @memberof AppIndexView
*/
private setHideSideBar(item: any): void {
}
/**
* 菜单项选中处理
*
* @param {*} index
* @param {any[]} indexs
* @returns
* @memberof AppIndexView
*/
protected select(index: any, indexs: any[]) {
let item = this.compute(this.menus, index);
if (Object.keys(item).length === 0) {
return;
}
this.click(item);
}
/**
* 菜单点击
*
* @private
* @param {*} item 菜单数据
* @memberof AppIndexView
*/
private click(item: any) {
if (item) {
switch (item.appfunctag) {
default:
console.warn('未指定应用功能');
}
}
}
/**
* 数据加载
*
* @param {*} data
* @memberof AppIndexView
*/
protected load(data: any) {
this.dataProcess(this.menuMode.getAppMenuItems());
this.menus = this.menuMode.getAppMenuItems();
}
/**
* 数据处理
*
* @private
* @param {any[]} items
* @memberof AppIndexView
*/
private dataProcess(items: any[]): void {
items.forEach((_item: any) => {
if (_item.expanded) {
this.defaultOpeneds.push(_item.id);
}
if (_item.items && _item.items.length > 0) {
this.dataProcess(_item.items)
}
});
}
/**
* 提示框主题样式
*
* @readonly
* @type {string}
* @memberof AppIndexView
*/
get popperClass(): string {
return 'app-popper-menu ' + this.selectTheme;
}
}
</script>
<style lang='less'>
@import './app-index-view-appmenu.less';
</style>
\ No newline at end of file
/**
* AppIndexView 部件模型
*
* @export
* @class AppIndexViewModel
*/
export default class AppIndexViewModel {
/**
* 菜单项集合
*
* @private
* @type {any[]}
* @memberof AppIndexViewModel
*/
private items: any[] = [
];
/**
* 应用功能集合
*
* @private
* @type {any[]}
* @memberof AppIndexViewModel
*/
private funcs: any[] = [
];
/**
* 获取所有菜单项集合
*
* @returns {any[]}
* @memberof AppIndexViewModel
*/
public getAppMenuItems(): any[] {
return this.items;
}
/**
* 获取所有应用功能集合
*
* @returns {any[]}
* @memberof AppIndexViewModel
*/
public getAppFuncs(): any[] {
return this.funcs;
}
}
\ No newline at end of file
import { Http,Util,Errorlog } from '@/utils';
import ControlService from '@/widgets/control-service';
import AppIndexViewModel from './app-index-view-appmenu-model';
/**
* AppIndexView 部件服务对象
*
* @export
* @class AppIndexViewService
*/
export default class AppIndexViewService extends ControlService {
/**
* 设置从数据模式
*
* @type {boolean}
* @memberof AppIndexViewService
*/
public setTempMode(){
this.isTempMode = false;
}
/**
* Creates an instance of AppIndexViewService.
*
* @param {*} [opts={}]
* @memberof AppIndexViewService
*/
constructor(opts: any = {}) {
super(opts);
this.model = new AppIndexViewModel();
}
/**
* 获取数据
*
* @returns {Promise<any>}
* @memberof AppIndexView
*/
@Errorlog
public get(params: any = {}): Promise<any> {
return Http.getInstance().get('v7/app-index-viewappmenu', params);
}
}
\ No newline at end of file
/*** BRGIN:菜单样式 ***/
.app-app-menu {
overflow-y: auto;
overflow-x: hidden;
height: calc(100% - 58px);
> .el-menu {
border-right: 0;
.el-menu-item {
.ivu-badge {
.ivu-badge-count {
box-shadow: 0 0 0 0px #fff;
}
}
}
.el-submenu__title i, .el-menu-item i {
font-size: 16px;
width: 16px;
}
.el-submenu__title .text {
font-size: 16px;
}
.el-menu-item, .el-submenu__title {
height: 36px;
font-size: 16px;
line-height: 32px;
}
.el-menu-item, .el-submenu, .el-menu {
border-top: 1px solid #fff;
}
> .el-menu-item, > .el-submenu > .el-submenu__title {
height: 40px;
line-height: 36px;
border-left: 4px solid transparent;
padding-left: 16px !important;
}
.app-menu-icon {
margin-right: 4px;
}
> .el-submenu {
> .el-menu {
> .el-menu-item, > .el-submenu > .el-submenu__title {
padding-left: 44px !important;
}
> .el-submenu {
> .el-menu {
> .el-menu-item, > .el-submenu > .el-submenu__title {
padding-left: 68px !important;
}
}
}
}
}
.active-icon {
font-size: 40px !important;
position: absolute;
right: 0;
line-height: 42px;
color: #fff !important;
display: none;
width: 24px !important;
overflow: hidden;
}
}
.ivu-divider-horizontal {
width: calc(100% - 32px);
min-width: calc(100% - 32px);
margin: 4px auto;
margin-bottom: 1px;
}
}
.app-popper-menu {
.el-menu-item, .el-submenu__title {
height: 36px;
font-size: 16px;
line-height: 36px;
}
> .el-menu-item, > .el-submenu > .el-submenu__title {
height: 40px;
line-height: 40px;
}
.el-menu-item {
.ivu-badge {
.ivu-badge-count {
box-shadow: 0 0 0 0px #fff;
}
}
> span{
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
}
.ivu-divider-horizontal {
width: calc(100% - 12px);
min-width: calc(100% - 12px);
margin: 4px auto;
margin-bottom: 1px;
}
}
// this is less
<script lang='ts'>
import { Component } from 'vue-property-decorator';
import AppIndexViewBase from './app-index-view-appmenu-base.vue';
@Component({
components: {
}
})
export default class AppIndexView extends AppIndexViewBase {
}
</script>
\ No newline at end of file
......@@ -18,14 +18,46 @@ module.exports = {
// proxy: "http://127.0.0.1:8080/Web",
historyApiFallback: {
rewrites: [
// { from: /^\/appindexview$/, to: '/appindexview.html' },
]
}
},
pages: {
// 新增默认首页入口
index : {
// page 的入口
entry: 'src/pages/ungroup/app-index-view/main.ts',
// 模板来源
template: 'src/template.html',
// 在 dist/index.html 的输出
filename: 'index.html',
// 当使用 title 选项时,
// template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>
title: '应用首页视图',
// 在这个页面中包含的块,默认情况下会包含
// 提取出来的通用 chunk 和 vendor chunk。
// chunks: ['chunk-vendors', 'chunk-common', 'index']
},
appindexview: {
// page 的入口
entry: 'src/pages/ungroup/app-index-view/main.ts',
// 模板来源
template: 'src/template.html',
// 在 dist/index.html 的输出
filename: 'appindexview.html',
// 当使用 title 选项时,
// template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>
title: '应用首页视图',
// 在这个页面中包含的块,默认情况下会包含
// 提取出来的通用 chunk 和 vendor chunk。
// chunks: ['chunk-vendors', 'chunk-common', 'index']
},
},
// 多核打包
parallel: os.cpus().length > 1,
chainWebpack: (config) => {
config.plugins.delete('preload-appindexview')
config.plugins.delete('prefetch-appindexview')
config.resolve.alias
.set('@ibizsys', resolve('src/ibizsys'))
.set('@pages', resolve('src/pages'))
......
......@@ -40,14 +40,14 @@
mvn install
cd ..
mvn install
cd im-boot
mvn clean package
cd im-app/im-app-web
mvn clean package -Pprod
echo &apos;echo &quot;$para1&quot;&apos; &gt; apppasswd.sh
chmod -R 777 *
setsid env SSH_ASKPASS=&apos;./apppasswd.sh&apos; DISPLAY=&apos;none:0&apos; ssh root@172.16.102.41 &quot;mkdir -p /ibiz/nodes/node2/CCF487B5-45A8-4D01-8BA4-754E54BD935B&quot;
setsid env SSH_ASKPASS=&apos;./apppasswd.sh&apos; DISPLAY=&apos;none:0&apos; scp -r ./target/im.jar root@172.16.102.41:/ibiz/nodes/node2/CCF487B5-45A8-4D01-8BA4-754E54BD935B
setsid env SSH_ASKPASS=&apos;./apppasswd.sh&apos; DISPLAY=&apos;none:0&apos; ssh root@172.16.102.41 &quot;ps -ef | grep &apos;/ibiz/nodes/node2/CCF487B5-45A8-4D01-8BA4-754E54BD935B&apos;| tr -s &apos; &apos;|cut -d&apos; &apos; -f2,8,9 | grep -v grep | grep &apos;jar&apos; | cut -d&apos; &apos; -f1|xargs --no-run-if-empty kill -9&quot;
setsid env SSH_ASKPASS=&apos;./apppasswd.sh&apos; DISPLAY=&apos;none:0&apos; ssh root@172.16.102.41 &quot;source /etc/profile;source ~/.bash_profile; nohup java -jar -Xms512m -Xmx1024m -XX:PermSize=128M -XX:MaxPermSize=128m /ibiz/nodes/node2/CCF487B5-45A8-4D01-8BA4-754E54BD935B/im.jar &gt;&gt;/ibiz/nodes/node2/CCF487B5-45A8-4D01-8BA4-754E54BD935B/poc_apipoc 服务-`date --date=&apos;0 days ago&apos; +%Y-%m-%d`.log 2&gt;&amp;1 &amp;&quot;
setsid env SSH_ASKPASS=&apos;./apppasswd.sh&apos; DISPLAY=&apos;none:0&apos; ssh root@172.16.102.41 &quot;mkdir -p /ibiz/nodes/node2/83773F16-0C07-4015-8272-7E3984514121&quot;
setsid env SSH_ASKPASS=&apos;./apppasswd.sh&apos; DISPLAY=&apos;none:0&apos; scp -r ./target/im-app-web.jar root@172.16.102.41:/ibiz/nodes/node2/83773F16-0C07-4015-8272-7E3984514121
setsid env SSH_ASKPASS=&apos;./apppasswd.sh&apos; DISPLAY=&apos;none:0&apos; ssh root@172.16.102.41 &quot;ps -ef | grep &apos;/ibiz/nodes/node2/83773F16-0C07-4015-8272-7E3984514121&apos;| tr -s &apos; &apos;|cut -d&apos; &apos; -f2,8,9 | grep -v grep | grep &apos;jar&apos; | cut -d&apos; &apos; -f1|xargs --no-run-if-empty kill -9&quot;
setsid env SSH_ASKPASS=&apos;./apppasswd.sh&apos; DISPLAY=&apos;none:0&apos; ssh root@172.16.102.41 &quot;source /etc/profile;source ~/.bash_profile; nohup java -jar -Xms512m -Xmx1024m -XX:PermSize=128M -XX:MaxPermSize=128m /ibiz/nodes/node2/83773F16-0C07-4015-8272-7E3984514121/im-app-web.jar &gt;&gt;/ibiz/nodes/node2/83773F16-0C07-4015-8272-7E3984514121/poc_apppoc 应用-`date --date=&apos;0 days ago&apos; +%Y-%m-%d`.log 2&gt;&amp;1 &amp;&quot;
</command>
</hudson.tasks.Shell>
</builders>
......
server:
devmode: true
port: 8080
devmode: false
port: 9902
servlet:
session:
cookie:
......@@ -17,11 +17,11 @@ spring:
security:
cas:
server:
host: http://passportcs.ibizlab.cn
host: https://passport.ibizlab.cn
login: ${security.cas.server.host}/login
logout: ${security.cas.server.host}/logout
service:
host: http://localhost:${server.port}
host: http://172.16.102.41:${server.port}
login: /login/cas
logout: /logout
......@@ -36,7 +36,7 @@ logging:
app:
web:
url: http://localhost:${server.port}
url: http://172.16.102.41:${server.port}
wfstarturl: /#/%s/null/editview
# wfviewurl: /#/dewfdataredirectview
wfviewurl: /#/appwfdataredirectview
......
server:
devmode: true
port: 8080
devmode: false
port: 9902
servlet:
session:
cookie:
......@@ -17,11 +17,11 @@ spring:
security:
cas:
server:
host: http://passportcs.ibizlab.cn
host: https://passport.ibizlab.cn
login: ${security.cas.server.host}/login
logout: ${security.cas.server.host}/logout
service:
host: http://localhost:${server.port}
host: http://172.16.102.41:${server.port}
login: /login/cas
logout: /logout
......@@ -36,7 +36,7 @@ logging:
app:
web:
url: http://localhost:${server.port}
url: http://172.16.102.41:${server.port}
wfstarturl: /#/%s/null/editview
# wfviewurl: /#/dewfdataredirectview
wfviewurl: /#/appwfdataredirectview
......
server:
port: 9901
port: 8080
spring:
application:
......
Markdown 格式
0% or
您添加了 0 到此讨论。请谨慎行事。
先完成此消息的编辑!
想要评论请 注册