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

ibizdev提交

上级 05d0db49
# 系统概览
## 前言
### 1. 简介
该web应用是基于iBiz平台提供的一套PC端前端解决方案Vue_R7【**一套基于Vue全家桶(Vue + Vue-router + Vuex)的前端框架**】生产而成,Vue_R7不仅适用于管理后台或管理系统开发,且广泛适用于B/S架构的项目开发。本文档主要介绍项目如何快速上手,成果物代码结构做一阐述,旨在能够为开发人员提供一定开发指导支持。而今框架开源,希望能有更多志同道合的伙伴参与Vue_R7的迭代 ^_^
### 2. 开发环境要求
- Node.js
- Yarn
- Vue Cli
### 3. 开发技术要求
掌握`Vue``TypeScript``less``html`等技术。
### 4. 技术栈
- 前端MVVM框架:vue.js 2.6.10
- 路由:vue-router 3.1.3
- 状态管理:vue-router 3.1.3
- 国际化:vue-i18n 8.15.3
- 数据交互:axios 0.19.1
- UI框架:element-ui 2.13.0, view-design 4.1.0
- 工具库:qs, path-to-regexp, rxjs
- 图标库:font-awesome 4.7.0
- 引入组件: tinymce 4.8.5
- 代码风格检测:eslint
## 快速上手
### 1. 开发环境
> 在安装使用 `Yarn` 和 `Vue Cli (3.0)` 前,务必确认 [Node.js](https://nodejs.org) 已经升级到 v4.8.0 或以上,强烈建议升级至最新版本。
> 如果你想了解更多 `Yarn` 工具链的功能和命令,建议访问 [Yarn](https://yarnpkg.com) 了解更多。
> 如果你想了解更多 `Vue Cli (3.0)` 工具链的功能和命令,建议访问 [Vue Cli (3.0)](https://cli.vuejs.org/) 了解更多。
- 访问 [Node.js](https://nodejs.org) ,根据文档安装 `Node.js`
- 访问 [Yarn](https://yarnpkg.com) ,根据文档安装 `Yarn`
- 访问 [Vue Cli (3.0)](https://cli.vuejs.org/) ,根据文档安装 `Vue Cli (3.0)`
<blockquote style="border-color: red;"><p>在安装 Vue Cli (3.0) ,请使用 Yarn 模式全局安装。</p></blockquote>
```bash
$ yarn global add @vue/cli
```
以下为 Windows 环境开发正常配置
<br>
<br>
![开发环境信息](./imgs/getting-started/development.png)
### 2. 安装依赖
打开前端项目,进入工作空间下,执行安装依赖命令
```bash
$ yarn install
```
### 3. 启动
在工作空间下,执行启动命令
```bash
$ yarn dev-serve
```
启动后,通过 vue.config.js 开发服务 devServer 下配置的本地启动端口号访问开发项目。<br>
示例:
```bash
$ http://localhost:8111
```
这儿需要注意一点,此时启动的项目访问的数据是我们前端的mock数据,如需与后台直接交互,请看第4点。
### 4. 远程代理
在工作空间下,执行启动命令
```bash
$ yarn serve
```
修改远程代理文件 vue.config.js 代理地址
![远程代理地址](./imgs/getting-started/proxy.png)
### 5. 打包
在工作空间下,执行打包命令
```bash
$ yarn build
```
打包完成,生成最终交付产物。
## 成果物结构
```
|─ ─ app_Web
​ |─ ─ public public文件夹
​ |─ ─ assets 静态文件夹
|─ ─ favicon.ico 图标
​ |─ ─ src 工程文件夹
|─ ─ assets 静态资源
|─ ─ components 基础组件,主要包含编辑器组件和其他全局使用的组件
|─ ─ engine 引擎文件,主要封装了内置视图的内置逻辑
|─ ─ environments 环境文件
​ |─ ─ interface 接口文件
​ |─ ─ locale 多语言文件
|─ ─ mock 模拟数据
|─ ─ pages 视图文件夹
|─ ─ module 模块名称
​ |─ ─ XXX-view 视图文件夹
|─ ─ XXX-view-base.vue 视图基类
|─ ─ XXX-view.vue 自定义视图文件
|─ ─ XXX-view.less 自定义视图样式文件
​ |─ ─ main.ts 应用主函数入口
​ |─ ─ page-register.ts 全局视图注册
​ |─ ─ router.ts 路由配置文件
|─ ─ service 应用实体数据服务文件夹
|─ ─ XXX 应用实体名称
|─ ─ XXX-service-base.ts 应用实体数据服务文件
|─ ─ XXX-service.ts 自定义应用实体数据服务文件
|─ ─ YYY-logic-base.ts 应用实体数据处理逻辑文件
|─ ─ YYY-logic.ts 自定义应用实体数据处理逻辑文件
|─ ─ store 全局状态管理
|─ ─ styles 样式文件夹
|─ ─ default.less 默认样式
|─ ─ user.less 用户自定义样式
|─ ─ theme 主题文件夹
|─ ─ uiservice 界面服务文件
|─ ─ XXX 应用实体名称
|─ ─ XXX-ui-service-base.ts 应用实体界面服务文件
|─ ─ XXX-ui-service.ts 自定义应用实体界面服务文件
|─ ─ YYY-ui-logic-base.ts 应用实体界面处理逻辑文件
|─ ─ YYY-ui-logic.ts 自定义应用实体界面处理逻辑文件
|─ ─ utils 工具类文件
|─ ─ widgets 部件文件夹
|─ ─ appde 应用实体名称
​ |─ ─ XXX 部件名称
|─ ─ XXX-base.vue 视图基类
|─ ─ XXX.vue 自定义部件文件
|─ ─ XXX.less 部件样式文件
​ |─ ─ XXX.model.ts 部件model文件
​ |─ ─ XXX.service.ts 部件服务文件
|─ ─ app-register.ts 公共组件全局注册
​ |─ ─ App.vue 入口组件
​ |─ ─ user-register.ts 自定义组件全局注册
​|─ ─ package.json 依赖管理文件
​ |─ ─ vue.config.js vue cli 配置
```
## 如何贡献
如果你希望参与贡献,欢迎 [Pull Request](<http://demo.ibizlab.cn/ibiz_r7/vue_r7/issues/new>),或通过自助服务群给我们报告 Bug。
强烈推荐阅读 [《提问的智慧》](https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way)(本指南不提供此项目的实际支持服务!)[《如何向开源社区提问题》](https://github.com/seajs/seajs/issues/545)[《如何有效地报告 Bug》](https://www.chiark.greenend.org.uk/~sgtatham/bugs-cn.html)[《如何向开源项目提交无法解答的问题》](https://zhuanlan.zhihu.com/p/25795393),更好的问题更容易获得帮助。
## 社区互助
1.[iBizLab论坛](https://bbs.ibizlab.cn/)
2.加入钉钉 Vue_R7自助服务群(中文)
<img src="./imgs/getting-started/vue-r7-group.png" height="400" width="400">
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<artifactId>ps</artifactId>
<groupId>com.ibiz</groupId>
<version>1.0.0.0</version>
</parent>
<artifactId>ps-web</artifactId>
<name>Ps Web</name>
<description>Ps Web</description>
<dependencies>
</dependencies>
</project>
[
{
"srfkey": "SysOperator",
"emptytext": "未定义",
"codelisttype":"dynamic",
"appdataentity":"",
"appdedataset":"",
"items": []
}
]
\ No newline at end of file
{
"psgridview": {
"title": "采购单表格视图",
"caption": "采购单",
"viewtype": "DEGRIDVIEW",
"viewmodule": "Module",
"viewname": "PSGridView",
"viewtag": "1f3439519475b1efe65b5f980ca4caa6"
},
"appindexview": {
"title": "应用首页视图",
"caption": "首页",
"viewtype": "APPINDEXVIEW",
"viewmodule": "Ungroup",
"viewname": "AppIndexView",
"viewtag": "2530708d453013b497aebeb7a0a9cd7c"
},
"pseditview": {
"title": "采购单编辑视图",
"caption": "采购单",
"viewtype": "DEEDITVIEW",
"viewmodule": "Module",
"viewname": "PSEditView",
"viewtag": "cbe3b85eb51cf165ed3bffc22c8f37e9"
}
}
/**
* 代码表--云系统操作者
*
* @export
* @class SysOperator
*/
export default class SysOperator {
/**
* 获取数据项
*
* @param {*} data
* @param {boolean} [isloading]
* @returns {Promise<any>}
* @memberof SysOperator
*/
public getItems(data: any={}, isloading?: boolean): Promise<any> {
return Promise.reject([]);
}
}
/**
* 计数器服务注册中心
*
* @export
* @class CounterServiceRegister
*/
export class CounterServiceRegister {
/**
* 所有计数器服务Map
*
* @protected
* @type {*}
* @memberof CounterServiceRegister
*/
protected allCounterService: Map<string, () => Promise<any>> = new Map();
/**
* 已加载计数器服务Map缓存
*
* @protected
* @type {Map<string, any>}
* @memberof CounterServiceRegister
*/
protected serviceCache: Map<string, any> = new Map();
/**
* Creates an instance of CounterServiceRegister.
* @memberof CounterServiceRegister
*/
constructor() {
this.init();
}
/**
* 初始化
*
* @protected
* @memberof CounterServiceRegister
*/
protected init(): void {
}
/**
* 加载计数器服务
*
* @protected
* @param {string} serviceName
* @returns {Promise<any>}
* @memberof CounterServiceRegister
*/
protected async loadService(serviceName: string): Promise<any> {
const service = this.allCounterService.get(serviceName);
if (service) {
return service();
}
}
/**
* 获取计数器服务
*
* @param {string} name
* @returns {Promise<any>}
* @memberof CounterServiceRegister
*/
public async getService(name: string): Promise<any> {
if (this.serviceCache.has(name)) {
return this.serviceCache.get(name);
}
const entityService: any = await this.loadService(name);
if (entityService && entityService.default) {
const instance: any = new entityService.default();
this.serviceCache.set(name, instance);
return instance;
}
}
}
export const counterServiceRegister: CounterServiceRegister = new CounterServiceRegister();
\ No newline at end of file
export const Environment = {
// 原型示例数模式
SampleMode: false,
// 应用名称
AppName: 'Web',
// 应用 title
AppTitle: 'Web',
// 应用基础路径
BaseUrl: '../',
// 系统名称
SysName: 'ps',
// 远程登录地址,本地开发调试使用
RemoteLogin: 'ibizutil/login',
// 文件导出
ExportFile: 'ibizutil/download',
// 文件上传
UploadFile: 'ibizutil/upload',
// 是否为pc端应用
isAppMode:true,
//统一地址
uniteAddress:"http://172.16.100.202:8114",
// 是否为开发模式
devMode: true,
// 项目模板地址
ProjectUrl: "http://172.16.180.229/wangxiang1/VUE_R7_FTL",
// 配置平台地址
StudioUrl: "http://172.16.170.145/slnstudio/",
// 中心标识
DCId: "B4BF5C84-D020-4D9A-A986-8FA4FD72816C",
// 系统标识
SysId: "B428B5BE-EA90-4101-A493-BA7085D89F0A",
// 前端应用标识
AppId: "6e0b7357169ef4eba84e1347ed94bd84"
};
\ No newline at end of file
import Vue from 'vue'
import VueI18n from 'vue-i18n'
const vueApp: any = Vue;
vueApp.use(VueI18n);
import zhCn from './lang/zh-CN';
import iviewZhCnLocale from 'view-design/dist/locale/zh-CN';
import elementZhLocale from 'element-ui/lib/locale/lang/zh-CN';
const messages = {
'zh-CN': Object.assign(iviewZhCnLocale, elementZhLocale, zhCn),
};
// 自动根据浏览器系统语言设置语言
const navLang = localStorage.getItem('local') || navigator.language;
const localLang = (navLang === 'zh-CN' || (navLang === 'en-US' && messages.hasOwnProperty('en-US'))) ? navLang : false;
let lang: string = localLang || 'zh-CN';
vueApp.config.lang = lang
// // vue-i18n 6.x+写法
vueApp.locale = () => { };
const i18n = new VueI18n({
locale: lang,
messages
});
export default i18n;
import orgdeptuser_en_US from '@locale/lanres/org-dept-user/org-dept-user_en_US';
import orguser_en_US from '@locale/lanres/org-user/org-user_en_US';
import org_en_US from '@locale/lanres/org/org_en_US';
import ps_en_US from '@locale/lanres/ps/ps_en_US';
import orgdept_en_US from '@locale/lanres/org-dept/org-dept_en_US';
export default {
app: {
gridpage: {
choicecolumns: 'Choice columns',
refresh: 'refresh',
show: 'Show',
records: 'records',
totle: 'totle',
},
tabpage: {
sureclosetip: {
title: 'Close warning',
content: 'Form data Changed, are sure close?',
},
closeall: 'Close all',
closeother: 'Close other',
},
fileUpload: {
caption: 'Upload',
},
searchButton: {
search: 'Search',
reset: 'Reset',
},
// 非实体视图
views: {
appindexview: {
caption: '首页',
},
},
menus: {
appindexview: {
menuitem1: '采购单',
},
},
},
orgdeptuser: orgdeptuser_en_US,
orguser: orguser_en_US,
org: org_en_US,
ps: ps_en_US,
orgdept: orgdept_en_US,
};
\ No newline at end of file
import orgdeptuser_zh_CN from '@locale/lanres/org-dept-user/org-dept-user_zh_CN';
import orguser_zh_CN from '@locale/lanres/org-user/org-user_zh_CN';
import org_zh_CN from '@locale/lanres/org/org_zh_CN';
import ps_zh_CN from '@locale/lanres/ps/ps_zh_CN';
import orgdept_zh_CN from '@locale/lanres/org-dept/org-dept_zh_CN';
export default {
app: {
gridpage: {
choicecolumns: '选择列',
refresh: '刷新',
show: '显示',
records: '条',
totle: '共',
},
tabpage: {
sureclosetip: {
title: '关闭提醒',
content: '表单数据已经修改,确定要关闭?',
},
closeall: '关闭所有',
closeother: '关闭其他',
},
fileUpload: {
caption: '上传',
},
searchButton: {
search: '搜索',
reset: '重置',
},
// 非实体视图
views: {
appindexview: {
caption: '首页',
},
},
menus: {
appindexview: {
menuitem1: '采购单',
},
},
},
orgdeptuser: orgdeptuser_zh_CN,
orguser: orguser_zh_CN,
org: org_zh_CN,
ps: ps_zh_CN,
orgdept: orgdept_zh_CN,
};
\ No newline at end of file
export default {
};
\ No newline at end of file
export default {
};
\ No newline at end of file
export default {
};
\ No newline at end of file
export default {
};
\ No newline at end of file
export default {
};
\ No newline at end of file
export default {
};
\ No newline at end of file
export default {
};
\ No newline at end of file
export default {
};
\ No newline at end of file
export default {
views: {
gridview: {
caption: "采购单",
},
editview: {
caption: "采购单",
},
},
main_form: {
details: {
group1: "采购单基本信息",
formpage1: "基本信息",
srfupdatedate: "更新时间",
srforikey: "",
srfkey: "采购单标识",
srfmajortext: "采购单名称",
srftempmode: "",
srfuf: "",
srfdeid: "",
srfsourcekey: "",
psname: "采购单名称",
bz: "备注",
ngrid: "NGRID",
psid: "采购单标识",
},
uiactions: {
},
},
main_grid: {
columns: {
psname: "采购单名称",
bz: "备注",
updateman: "更新人",
updatedate: "更新时间",
},
uiactions: {
},
},
default_searchform: {
details: {
formpage1: "常规条件",
},
uiactions: {
},
},
gridviewtoolbar_toolbar: {
tbitem1_xd: {
caption: "下单",
tip: "tbitem1_xd",
},
tbitem2: {
caption: "-",
tip: "tbitem2",
},
tbitem3: {
caption: "New",
tip: "tbitem3",
},
tbitem4: {
caption: "Edit",
tip: "tbitem4",
},
tbitem6: {
caption: "Copy",
tip: "tbitem6",
},
tbitem7: {
caption: "-",
tip: "tbitem7",
},
tbitem8: {
caption: "Remove",
tip: "tbitem8",
},
tbitem9: {
caption: "-",
tip: "tbitem9",
},
tbitem13: {
caption: "Export",
tip: "tbitem13",
},
tbitem10: {
caption: "-",
tip: "tbitem10",
},
tbitem14_createandstartim: {
caption: "导出结果",
tip: "tbitem14_createandstartim",
},
tbitem15: {
caption: "-",
tip: "tbitem15",
},
tbitem16: {
caption: "其它",
tip: "tbitem16",
},
tbitem21: {
caption: "Export Data Model",
tip: "tbitem21",
},
tbitem23: {
caption: "数据导入",
tip: "tbitem23",
},
tbitem17: {
caption: "-",
tip: "tbitem17",
},
tbitem19: {
caption: "Filter",
tip: "tbitem19",
},
tbitem18: {
caption: "Help",
tip: "tbitem18",
},
},
editviewtoolbar_toolbar: {
tbitem3: {
caption: "Save",
tip: "tbitem3",
},
tbitem4: {
caption: "Save And New",
tip: "tbitem4",
},
tbitem5: {
caption: "Save And Close",
tip: "tbitem5",
},
tbitem6: {
caption: "-",
tip: "tbitem6",
},
tbitem7: {
caption: "Remove And Close",
tip: "tbitem7",
},
tbitem8: {
caption: "-",
tip: "tbitem8",
},
tbitem12: {
caption: "New",
tip: "tbitem12",
},
tbitem13: {
caption: "-",
tip: "tbitem13",
},
tbitem14: {
caption: "Copy",
tip: "tbitem14",
},
tbitem16: {
caption: "-",
tip: "tbitem16",
},
tbitem17_createandstartim: {
caption: "导出结果",
tip: "tbitem17_createandstartim",
},
tbitem20: {
caption: "-",
tip: "tbitem20",
},
tbitem23: {
caption: "第一个记录",
tip: "tbitem23",
},
tbitem24: {
caption: "上一个记录",
tip: "tbitem24",
},
tbitem25: {
caption: "下一个记录",
tip: "tbitem25",
},
tbitem26: {
caption: "最后一个记录",
tip: "tbitem26",
},
tbitem21: {
caption: "-",
tip: "tbitem21",
},
tbitem22: {
caption: "Help",
tip: "tbitem22",
},
},
};
\ No newline at end of file
export default {
views: {
gridview: {
caption: '采购单',
},
editview: {
caption: '采购单',
},
},
main_form: {
details: {
group1: '采购单基本信息',
formpage1: '基本信息',
srfupdatedate: '更新时间',
srforikey: '',
srfkey: '采购单标识',
srfmajortext: '采购单名称',
srftempmode: '',
srfuf: '',
srfdeid: '',
srfsourcekey: '',
psname: '采购单名称',
bz: '备注',
ngrid: 'NGRID',
psid: '采购单标识',
},
uiactions: {
},
},
main_grid: {
columns: {
psname: '采购单名称',
bz: '备注',
updateman: '更新人',
updatedate: '更新时间',
},
uiactions: {
},
},
default_searchform: {
details: {
formpage1: '常规条件',
},
uiactions: {
},
},
gridviewtoolbar_toolbar: {
tbitem1_xd: {
caption: '下单',
tip: '下单',
},
tbitem2: {
caption: '-',
tip: '',
},
tbitem3: {
caption: '新建',
tip: '新建',
},
tbitem4: {
caption: '编辑',
tip: '编辑',
},
tbitem6: {
caption: '拷贝',
tip: '拷贝',
},
tbitem7: {
caption: '-',
tip: '',
},
tbitem8: {
caption: '删除',
tip: '删除',
},
tbitem9: {
caption: '-',
tip: '',
},
tbitem13: {
caption: '导出',
tip: '导出',
},
tbitem10: {
caption: '-',
tip: '',
},
tbitem14_createandstartim: {
caption: '导出结果',
tip: '导出结果',
},
tbitem15: {
caption: '-',
tip: '',
},
tbitem16: {
caption: '其它',
tip: '其它',
},
tbitem21: {
caption: '导出数据模型',
tip: '导出数据模型',
},
tbitem23: {
caption: '数据导入',
tip: '数据导入',
},
tbitem17: {
caption: '-',
tip: '',
},
tbitem19: {
caption: '过滤',
tip: '过滤',
},
tbitem18: {
caption: '帮助',
tip: '帮助',
},
},
editviewtoolbar_toolbar: {
tbitem3: {
caption: '保存',
tip: '保存',
},
tbitem4: {
caption: '保存并新建',
tip: '保存并新建',
},
tbitem5: {
caption: '保存并关闭',
tip: '保存并关闭',
},
tbitem6: {
caption: '-',
tip: '',
},
tbitem7: {
caption: '删除并关闭',
tip: '删除并关闭',
},
tbitem8: {
caption: '-',
tip: '',
},
tbitem12: {
caption: '新建',
tip: '新建',
},
tbitem13: {
caption: '-',
tip: '',
},
tbitem14: {
caption: '拷贝',
tip: '拷贝',
},
tbitem16: {
caption: '-',
tip: '',
},
tbitem17_createandstartim: {
caption: '导出结果',
tip: '导出结果',
},
tbitem20: {
caption: '-',
tip: '',
},
tbitem23: {
caption: '第一个记录',
tip: '第一个记录',
},
tbitem24: {
caption: '上一个记录',
tip: '上一个记录',
},
tbitem25: {
caption: '下一个记录',
tip: '下一个记录',
},
tbitem26: {
caption: '最后一个记录',
tip: '最后一个记录',
},
tbitem21: {
caption: '-',
tip: '',
},
tbitem22: {
caption: '帮助',
tip: '帮助',
},
},
};
\ No newline at end of file
export const localList: any[] = [
{
type: 'zh-CN',
name: '中文简体',
},
];
\ 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: [
{
id: '801bacb689744f3de00c39b84618cbf5',
name: 'menuitem1',
text: '采购单',
type: 'MENUITEM',
counterid: '',
tooltip: '采购单',
expanded: false,
separator: false,
hidden: false,
hidesidebar: false,
opendefault: false,
iconcls: '',
icon: '',
textcls: '',
appfunctag: 'Auto1',
resourcetag: '',
},
],
}];
});
import { MockAdapter } from '../mock-adapter';
const mock = MockAdapter.getInstance();
import Mock from 'mockjs'
// 获取全部数组
mock.onGet('./assets/json/data-dictionary.json').reply((config: any) => {
let status = MockAdapter.mockStatus(config);
return [status, [
{
"srfkey": "SysOperator",
"emptytext": "未定义",
"codelisttype":"dynamic",
"appdataentity":"",
"appdedataset":"",
"items": []
}
]];
});
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
// 预置 api 接口对象
import './appdata/appdata';
import './codelist/codelist';
import './viewconfig/viewconfig';
import './portlet/portlet';
import './login/login';
import './upload/upload';
// 实体级接口对象
import './entity/org-dept-users/org-dept-users';
import './entity/org-users/org-users';
import './entity/orgs/orgs';
import './entity/pss/pss';
import './entity/org-depts/org-depts';
import { MockAdapter } from '../mock-adapter';
const mock = MockAdapter.getInstance();
import Mock from 'mockjs'
const Random = Mock.Random;
// 获取全部数组
mock.onGet('./assets/json/portlet-data.json').reply((config: any) => {
let status = MockAdapter.mockStatus(config);
return [status,
[
]];
});
\ No newline at end of file
import { MockAdapter } from '../mock-adapter';
const mock = MockAdapter.getInstance();
import Mock from 'mockjs'
// 获取studio链接数据
mock.onGet('./assets/json/view-config.json').reply((config: any) => {
let status = MockAdapter.mockStatus(config);
return [status,{
"psgridview": {
"title": "采购单表格视图",
"caption": "采购单",
"viewtype": "DEGRIDVIEW",
"viewmodule": "Module",
"viewname": "PSGridView",
"viewtag": "1f3439519475b1efe65b5f980ca4caa6"
},
"appindexview": {
"title": "应用首页视图",
"caption": "首页",
"viewtype": "APPINDEXVIEW",
"viewmodule": "Ungroup",
"viewname": "AppIndexView",
"viewtag": "2530708d453013b497aebeb7a0a9cd7c"
},
"pseditview": {
"title": "采购单编辑视图",
"caption": "采购单",
"viewtype": "DEEDITVIEW",
"viewmodule": "Module",
"viewname": "PSEditView",
"viewtag": "cbe3b85eb51cf165ed3bffc22c8f37e9"
}
}];
});
\ No newline at end of file
.view-card {
>.ivu-card-extra {
top: 5px;
right: 0px;
}
}
.psedit-view{
position: relative;
}
.toolbar-container {
button {
margin: 6px 0px 4px 4px;
.caption {
margin-left: 4px;
}
}
.seperator {
color: #dcdee2;
margin: 0 0px 0 4px;
}
}
// this is less
<script lang='ts'>
import { Component } from 'vue-property-decorator';
import PSEditViewBase from './psedit-view-base.vue';
import view_form from '@widgets/ps/main-form/main-form.vue';
@Component({
components: {
view_form,
},
beforeRouteEnter: (to: any, from: any, next: any) => {
next((vm: any) => {
vm.$store.commit('addCurPageViewtag', { fullPath: to.fullPath, viewtag: vm.viewtag });
});
},
})
export default class PSEditView extends PSEditViewBase {
}
</script>
\ No newline at end of file
.psgrid-view{
position: relative;
}
.toolbar-container {
button {
margin: 6px 0px 4px 4px;
.caption {
margin-left: 4px;
}
}
.seperator {
color: #dcdee2;
margin: 0 0px 0 4px;
}
}
// this is less
<script lang='ts'>
import { Component } from 'vue-property-decorator';
import PSGridViewBase from './psgrid-view-base.vue';
import view_grid from '@widgets/ps/main-grid/main-grid.vue';
import view_searchform from '@widgets/ps/default-searchform/default-searchform.vue';
@Component({
components: {
view_grid,
view_searchform,
},
beforeRouteEnter: (to: any, from: any, next: any) => {
next((vm: any) => {
vm.$store.commit('addCurPageViewtag', { fullPath: to.fullPath, viewtag: vm.viewtag });
});
},
})
export default class PSGridView extends PSGridViewBase {
}
</script>
\ 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) {
Vue.component('psgrid-view', () => import('@pages/module/psgrid-view/psgrid-view.vue'));
Vue.component('psedit-view', () => import('@pages/module/psedit-view/psedit-view.vue'));
}
};
\ No newline at end of file
此差异已折叠。
export const PortletComponent = {
install(v: any, opt: any) {
}
};
\ No newline at end of file
import SysOperator from '@/codelist/sys-operator';
import { Store } from 'vuex';
/**
* 动态代码表服务类
*
* @export
* @class CodeListService
*/
export default class CodeListService {
/**
* Vue 状态管理器
*
* @private
* @type {(any | null)}
* @memberof CodeListService
*/
private $store: Store<any> | null = null;
constructor(opts: any = {}) {
this.$store = opts.$store;
}
/**
* 获取状态管理器
*
* @returns {(any | null)}
* @memberof CodeListService
*/
public getStore(): Store<any> | null {
return this.$store;
}
/**
* 代码表--云系统操作者
*
* @type {SysOperator}
* @memberof CodeListService
*/
public SysOperator: SysOperator = new SysOperator();
/**
* 获取动态代码表
*
* @param {string} tag 代码表标识
* @param {string} context
* @returns {Promise<any[]>}
* @memberof CodeListService
*/
public getItems(tag: string,context:any = {}, data?: any, isloading?: boolean,): Promise<any[]> {
let _this: any = this;
if (_this[tag]) {
return _this[tag].getItems(context,data,isloading);
}
return Promise.reject([]);
}
}
\ No newline at end of file
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
Markdown 格式
0% or
您添加了 0 到此讨论。请谨慎行事。
先完成此消息的编辑!
想要评论请 注册