UNPKG

generator-hcy-system

Version:

hcy system layout and pages

340 lines (242 loc) 10.7 kB
# README ## 命令说明: 安装: ``` yarn install ``` 快速启动: ``` yarn start ``` ## 一、功能概述: ### 1.1、目录结构说明: #### .env 环境变量,比如: ```json PORT=8888 COMPRESS=none ``` #### mock 存放 mock 文件,此目录下所有 `.ts` / `.js` 文件会被 mock 服务加载,从而提供模拟数据,使用方法详见 [Mock](https://umijs.org/docs/guides/mock) 。 #### dist 目录 执行 `umi build` 后产物的默认输出文件夹。可通过 [`outputPath`](https://umijs.org/docs/api/config#outputpath) 配置修改产物输出文件夹。 #### public 目录 存放固定的静态资源,如存放 `public/image.png` ,则开发时可以通过 `/image.png` 访问到,构建后会被拷贝到输出文件夹。 #### config 目录 ##### config.ts 配置文件,集中管理所有的配置;包含 Umi 所有[非运行时配置](https://umijs.org/docs/api/config)(运行时配置一般定义于 [`app.ts`](https://umijs.org/docs/guides/directory-structure#apptstsx))。 若你需要在不同环境中加载不同配置,这在 Umi 中是根据 [`UMI_ENV`](https://umijs.org/docs/guides/env-variables#umi_env) 来实现的,一个不同环境启动的例子: ```json { "scripts": { "dev": "umi dev", "dev:pre": "cross-env UMI_ENV=pre umi dev" } } ``` ##### defaultSettings.ts layout 配置文件,包含整体的布局与风格; ##### pyoxy.ts 代理配置文件夹,不同环境的代理; ##### requestErrorConfig.ts 同一请求拦截、封装、埋点、处理、同一请求头配置; ##### routes.ts /childRouter.ts 路由配置文件,格式为路由信息的数组。 主系统配置在routes.ts, 子系统在childRouter.ts中配置。 更多内容详见[https://umijs.org/docs/guides/routes](https://umijs.org/docs/guides/routes) ##### theme.config.json 全局样式组件, 由主题编辑器生成,用于全局样式的调整,覆盖; #### src目录 ##### app.tsx [运行时配置](https://umijs.org/docs/api/runtime-config) 文件,可以在这里扩展运行时的能力,比如修改路由、修改 render 方法等。 运行时配置带来的逻辑会在浏览器中运行,因此当有远程配置、动态内容时,这些我们在本地开发时还不确定,不能写死,所以需要在浏览器实际运行项目时动态获取他们。 ##### assets 静态资源放置在此,例如pages文件夹下组件所用的图片、字体; ##### components 公用组件文件夹 页面中多次复用的组件放置在改文件中 详见index.md说明文件中 ##### pages 目录 所有页面、及页面相关组件放置这里 约定式路由默认以 `pages/*` 文件夹的文件层级结构来生成路由表。 在配置式路由中,`component` 若写为相对路径,将从该文件夹为起点开始寻找文件; ##### locales目录 多语言配置目录,不同的语言分不同的文件夹存储, 每个模块一个文件 方便查找 修改; 在en-US.ts中需要进行统一导入及导出; 例: ```typescript import columns from './en-US/columns'; import component from './en-US/component'; import dictionaries from './en-US/dictionaries'; import forms from './en-US/forms'; import globalHeader from './en-US/globalHeader'; import pages from './en-US/layoutPages'; import loginLog from './en-US/loginLog'; import menu from './en-US/menu'; import operationLog from './en-US/operationLog'; import pwa from './en-US/pageMenuManagement'; import parameterManagement from './en-US/parameterManagement'; import role from './en-US/roleManagement'; import settings from './en-US/settings'; import userCenter from './en-US/userCenter'; export default { 'navBar.lang': 'Languages', 'layout.logout': 'Logout', 'layout.user.link.help': 'Help', 'layout.user.link.privacy': 'Privacy', 'layout.user.link.terms': 'Terms', 'app.title': 'APP Title', ...globalHeader, ...menu, ...settings, ...pwa, ...component, ...pages, ...columns, ...forms, ...loginLog, ...operationLog, ...parameterManagement, ...userCenter, ...role, ...dictionaries, }; ``` ##### models 所谓的 Model,就是一个自定义的 `hooks`,没有任何使用者需要关注的“黑魔法”。 当我们需要获取 Model 中的全局数据时,调用该命名空间即可。例如,对于 Model 文件 `userModel.ts`,它的命名空间为 `userModel`。 编写一个默认导出的函数: ```js // src/models/userModel.ts export default function Page() { constuser = {username:'umi', }; return { user }; }; ``` 这就是一个 Model。插件所做的工作就是将其中的状态或数据变成了 **全局数据** ,不同的组件在使用该 Model 时,拿到的是同一份状态或数据。 💡Model 文件需要默认导出一个函数,此函数定义了一个 `hook`。对于不符合此规范的文件,将会被过滤掉,并无法通过命名空间调用。 ##### utils 常用工具类函数封装,全局常量、正则、时间格式处理、常用方法封装等... #### access 我们约定了 `src/access.ts` 为我们的权限定义文件,该文件需要默认导出一个方法,导出的方法会在项目初始化时被执行。该方法需要返回一个对象,对象的每一个值就对应定义了一条权限。如下所示: ```typescript // src/access.ts export default function (initialState) { const { userId, role } = initialState; return { canReadFoo: true, canUpdateFoo: role === 'admin', canDeleteFoo: (foo) => { return foo.ownerId === userId; }, }; } ``` 其中 `initialState` 是通过初始化状态插件 `initial-state` 提供的数据,你可以使用该数据来初始化你的用户权限。 配合 [layout](https://umijs.org/docs/max/layout-menu) 插件你可以很简单的实现针对某些页面的权限控制。如下所示,只有拥有了 canReadPageA (在 `src/access.ts` 中定义)权限,用户才可以访问该页面。否则会默认渲染 Layout 插件内置的权限错误页面。 #### global.less/[`overrides.less`](https://umijs.org/docs/guides/directory-structure#overridescsslesssassscss) 全局样式文件。 当你有需要全局使用的样式时,请考虑加入此文件。 💡需要注意的是,此文件的优先级在第三方组件库的样式之后,所以当你有覆盖第三方库样式的需求时,请使用 [`overrides.less`](https://umijs.org/docs/guides/directory-structure#overridescsslesssassscss) 。 #### loading.tsx 全局加载组件。 Umi 4 默认 [按页分包](https://umijs.org/blog/code-splitting) ,从而在页面切换时存在加载过程,通过该文件来配置加载动画。 ### 1.2、微前端架构: 父应用里,我们通过导航栏切换路由后,下方显示的内容来自于不同的子应用。子应用支持单独打开;子应用之间也支持任意的嵌套。 [关于 Qiankun 微前端的更多介绍请参阅此文档](https://umijs.org/docs/max/micro-frontend#microappprops) #### 1.2.1、qiankun框架挂载配置,主系统挂载配置:config/config.ts中代码如下: ##### 1.2.1.1 父子系统在不同的服务器运行 ```typescript ... qiankun: { master: { apps: [ { name: 'dashboard', //是否在开发环境? 开发环境端口号 : 部署环境url entry: isDev?'//localhost:3015': microAppUrl, activeRule: '/dashboard', history:'base', } ], }, }, ``` ##### 1.2.1.2 父子系统在同一个服务器,同端口运行 ```typescript ... qiankun: { master: { apps: [ { name: 'dashboard', //是否在开发环境? 开发环境端口号 : 部署环境下相对的路径 entry: isDev?'//localhost:3015':'/child/dashboard/', activeRule: '/dashboard', history:'base', } ], }, }, ``` #### 1.2.2、父系统router 挂载方式 ##### 1.2.2.1 使用路由挂载; ```typescript { path: '/large-screen-manage',//大屏多维数据管理 name: 'dashboard.management', icon: 'AppstoreOutlined', routes: [ { path: '/large-screen-manage/*', microApp: 'dashboard', microAppProps: { ... } } ] }, ``` ##### 1.2.2.2 使用组件方式挂载 ``` { path: '/dashboard', name: 'dashboard', routes: [ { path: '/dashboard/*', access: 'dashboard', component: './qiankun/Dashboard', }, ] }, ``` qiankun/Dashboard.tsx 代码如下: ```typescript import React, { useState } from 'react'; import { MicroApp, useAccess} from '@umijs/max'; import { CURRENT_MENU, TOKEN } from '@/utils/constant'; const Dashboard: React.FC = () => { const access = useAccess(); const [globalState] = useState<any>({ token: localStorage.getItem(TOKEN), menuTree: localStorage.getItem(CURRENT_MENU), access, }); return (<MicroApp name="dashboard" base="/dashboard" autoSetLoading globalState={globalState} autoCaptureError />); }; export default Dashboard; ``` ##### 1.2.2.3 microAppProps 属性如下 | 属性 | 必填 | 说明 | 类型 | 默认值 | | -------------------- | ---- | -------------------------------------------------------------------------------------- | ----------------------------------- | ------------- | | `autoSetLoading` | 否 | 自动设置微应用的加载状态 | `boolean` | `false` | | `loader` | 否 | 自定义的微应用加载状态组件 | `(loading) => React.ReactNode` | `undefined` | | `autoCaptureError` | 否 | 自动设置微应用的错误捕获 | `boolean` | `false` | | `errorBoundary` | 否 | 自定义的微应用错误捕获组件 | `(error: any) => React.ReactNode` | `undefined` | | `className` | 否 | 微应用的样式类 | `string` | `undefined` | | `wrapperClassName` | 否 | 包裹微应用加载组件、错误捕获组件和微应用的样式类,仅在启用加载组件或错误捕获组件时有效 | `string` | `undefine` |