Java知识点整理 12 — 前端 Ant Design Pro 初始化模板使用

一. 项目初始化

Ant Design Pro 是基于 Ant Design 和 umi 封装的一整套企业级中后台前端设计框架,致力于在设计规范和基本组件的基础上,继续向上构建,提炼出典型模板或配套设计资源,进一步提升企业级中后台产品设计研发过程中的用户体验。

Ant Design Pro 力求于开箱即用,提供了完整的脚手架,包括国际化、权限、mock、网络请求等各方面,大幅提升开发效率,减少学习成本。下图为整体架构:

官方地址:开始使用 - Ant Design Pro

初始化命令:

npm i @ant-design/pro-cli -g
pro create myapp

在项目源目录中使用 cmd 或 Powershell 打开终端。

版本选择:

? 🚀 要全量的还是一个简单的脚手架? (Use arrow keys)
❯ simple
  complete

simple 版本提供了框架运行的基本内容,complete 版本包含所有区块,不适合当作基础模板进行二次开发。

此处选择 simple 版本,后续可进行二次开发。下载完成后在源目录中能看到模板代码文件夹。

安装依赖包:

1. yarn / yarn install
2. npm install

打开项目后在终端使用 yarn 或 npm 包管理器均可。二者的区别可参考该文章。

下载完成后,可以看到生成的依赖包。

启动项目:

初始化模板中提供了 mock 模拟数据供开发者测试,选择 start 方式启动,包管理器此处选择了npm,可根据自己下载的依赖包调整。

 启动后,访问 http://localhost:8000,即可打开前端初始化项目。

由于选择了 start 启动方式,因此可以使用模板自带的 mock 模拟数据测试。

用户名: admin
密码: ant.design

开发规范设置:

勾选 Prettier 格式化工具,用于统一代码格式。

勾选 Eslint 保持代码风格,减少代码出错。

二. 模板瘦身 

1. 移除冗余模块

每次移除后重启项目,以检查能否正常运行,如果无法正常运行直接回滚,防止模板出错。

(1)移除 husky

用来在提交前检查代码的规范,保证代码一致性,通常用于团队协作,个人项目可移除。删除文件夹后也将 husky 对应的启动命令删除。

(2)移除 mock

mock 是模板自带的模拟数据,但我们自己的项目有真实的后端接口要对接,因此可以移除。

(3)移除 icons 和 manifest.json

图标和适配移动端所需要的 Json,直接删除即可。

 (4)移除 CNAME

官方提供的域名映射,与自己项目的域名无关,可移除。

(5)移除国际化

国际化包中集成了多种语言,如中文、英文、日语等。通常情况下,自己的上线项目仅对本国用户开放,并且如果访问量较少,也无需国际化配置,为了减轻项目体积,提升加载速度,可以选择移除。

模板的 package.json 命令执行中自带移除国际化的脚本 i18n-remove,直接执行即可。

执行后手动删除  locales 目录即可。

如果出现报错,大概率是国际化中对应的某些参数或方法被删除,导致文件找不到所需参数。此处,报错 ./src/components/index.ts 中 export 的 selectLang 参数找不到,删除后即可正常运行。

打开页面后发现,右上角处的语言切换功能消失。国际化移除成功。 

(6)移除单元测试

删除 tests 目录和对应的测试命令即可。

 (7)移除 types

我们自己的项目会用 OpenAPI 规范去生成接口和类型。

(8)移除 swagger

 (9)移除 openapi.json

我们有自己的后端接口地址,不用模板自带的。

2. 生成请求代码

修改 config.ts 中 OpenAPI 部分的代码,执行后即可查看生成结果:

  openAPI: [
    {
      requestLibPath: "import { request } from '@umijs/max'",
      schemaPath: 'https://localhost:8081/api/v2/api-docs',
      projectName: 'khr-backend',
    },
  ],

3. 全局请求处理

修改 requestErrorConfig.ts 文件名称为 requestConfig.ts。

修改后将 app.tsx 中 errorConfig 替换为 requestConfig。

创建 index.ts,区别开发环境和部署环境。

引入环境变量,根据环境变量区分不同环境请求地址。

删除模板自带的错误处理,过于复杂。

修改请求拦截器部分的代码:

 删除了拼接 Token 的部分,一般如果要使用 Token,可以直接在 Authorization 请求头中添加。

  // 请求拦截器
  requestInterceptors: [
    (config: RequestOptions) => {
      // 拦截请求配置,进行个性化处理。
      return config;
    },
  ],

修改封装好的响应拦截器:

// 响应拦截器
responseInterceptors: [
   (response) => {
      // 请求地址
      const requestPath: string = response.config.url ?? '';

      // 响应
      const { data } = response as unknown as ResponseStructure;
      if (!data) {
         throw new Error('服务异常');
      }

      // 错误码处理
      const code: number = data.code
      // 未登录,且不为获取用户登录信息接口
      if (
        code === 40100 &&
        !requestPath.includes('user/get/login') &&
        !location.pathname.includes('user/login')
      ) {
        // 跳转至登录页
        window.location.href = ` /user/login?redirect=${window.location.href}`;
        throw new Error('请先登录');
      }
        
      if(code !== 0){
        throw new Error(data.message ?? '服务器错误')
      }
      return response;
 },
],

4. 临时登录

修改 app.txs 中的 getInitialState,获取用户初始化状态,先利用 Mock 模拟数据,替换后将报错的 username、avatar等全局替换即可。

export async function getInitialState(): Promise<InitialState> {
  const initialState: InitialState = {
     currentUser: undefined,
  };

  // 如果不是登录页面,执行
  const { location } = history;
  if (!location.pathname.startsWith(loginPath)) {
    // 获取当前登录用户
    const res = await getLoginUser();
    initialState.currentUser = res.data;

    const mockUser:API.LoginUserVO = {
       userAvatar: '提供一个图片地址',
       userName: 'khr',
       userRole: 'admin',
    };
    initialState.currentUser = mockUser;
  }
  return initialState;
}

先用 @ts-ignore 忽略 ts 类型提示错误。

移除无用配置,如 setting drawers。

注释请求后端的代码,访问主页面不会再重定向到登录页。

5. 基础布局

修改 src/components/Footer/index.tsx 中的内容,可以替换页面底部信息,如个人博客、GitHub地址等。

6. 用户登录

移除手机号登录方式,验证码错误也一并删除。

移除其它登录方式和无用模块,清除不需要导入的模块和包,按 ctrl + alt + o。 

修改 logo.svg 自己替换图片,标题与副标题也是。

移除错误提示,修改模板的用户名 username 和密码 password 为 userAccount 和 userPassword。

移除其它不必要代码。

修改登录后触发的事件。

  const handleSubmit = async (values: API.LoginParams) => {
    try {
      // 登录
      const msg = await login({
        ...values,
        type,
      });
      if (msg.status === 'ok') {
        const defaultLoginSuccessMessage = '登录成功!';
        // 保存已登录用户信息
        setInitialState({
           ...initialState,
           currentUser:res.data
         )}
        const urlParams = new URL(window.location.href).searchParams;
        history.push(urlParams.get('redirect') || '/');
        return;
      }
      // 如果失败去设置用户错误信息
    } catch (error) {
      const defaultLoginFailureMessage = '登录失败,请重试!';
      console.log(error);
      message.error(defaultLoginFailureMessage);
    }
  };

之前由于初始化的时候获取的还是模拟的状态,因此刷新后,用户状态会失效。修改 app.tsx 的代码 。

export async function getInitialState(): Promise<InitialState> {
  const initialState: InitialState = {
     currentUser: undefined,
  };

  // 如果不是登录页面,执行
  const { location } = history;
  if (!location.pathname.startsWith(loginPath)) {
    // 获取当前登录用户
    try{
    const res = await getLoginUser();
    initialState.currentUser = res.data;
    } catch (error:any){

    }

    //const mockUser:API.LoginUserVO = {
    //   userAvatar: '提供一个图片地址',
    //   userName: 'khr',
    //   userRole: 'admin',
    //};
    // initialState.currentUser = mockUser;
  }
  return initialState;
}

修改模板的退出登录接口,改为自己后端的退出登录方法。

给登录按钮添加跳转链接。

根据后端的接口返回相对应的错误信息,再次修改 index.tsx 的 handleSubmit 方法。

  const handleSubmit = async (values: API.LoginParams) => {
    try {
      // 登录
      const msg = await login({
        ...values,
        type,
      });
      if (msg.status === 'ok') {
        const defaultLoginSuccessMessage = '登录成功!';
        // 保存已登录用户信息
        setInitialState({
           ...initialState,
           currentUser:res.data
         )}
        const urlParams = new URL(window.location.href).searchParams;
        history.push(urlParams.get('redirect') || '/');
        return;
        // 如果失败去设置用户错误信息
    } catch (error: any) {
      const defaultLoginFailureMessage = `登录失败,请重试!${error.message}`;
      console.log(error);
      message.error(defaultLoginFailureMessage);
    }
  };

 7. 其它

修改网页 title 和 logo。

除此之外,还有其它一些修改模板内容的操作,不一一列举,可以在具体开发时根据业务后端内容实时修改。 当找不到想要修改的内容时,可以使用 Ctrl + Shift + F 进行全局搜索。

可以从资源目录中直接下载 Ant Design Pro 前端初始化模板(仅移除了国际化),也可以从官网中下载初始版本然后按照上述步骤完成初始化与瘦身等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/759787.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Qt知识】window frame 对窗口坐标的影响

在Qt中&#xff0c;窗口框架&#xff08;Window Frame&#xff09;对Widget的尺寸计算和坐标定位有着直接的影响&#xff0c;这主要是因为窗口框架本身占据了一定的空间&#xff0c;包括标题栏、最小化/最大化/关闭按钮以及边框。这部分额外的空间在不同的应用场景下需要被考虑…

Android Graphics 显示系统 - BufferQueue的状态监测

“ BufferQueue作为连接生产者和消费者的桥梁&#xff0c;时刻掌握队列中每一块Buffer的状态&#xff0c;对于解决一些卡死卡顿问题很有帮助&#xff0c;辨别是否有生产者或消费者长期持有大量Buffer不放导致运行不畅的情况。” 01 — 前言 在Android系统中&#xff0c;应用U…

C#进阶-ASP.NET WebForms调用ASMX的WebService接口

ASMX 文件在 ASP.NET WebForms 中提供了创建 Web 服务的便捷方式&#xff0c;通过公开 Web 方法&#xff0c;允许远程客户端调用这些方法并获取数据。本文介绍了 ASMX 文件的基本功能、如何定义 WebService 接口、通过 HTTP 和 SOAP 请求调用 WebService 接口&#xff0c;以及使…

【ESP32】打造全网最强esp-idf基础教程——14.VFS与SPIFFS文件系统

VFS与SPIFFS文件系统 这几天忙着搬砖&#xff0c;差点没时间更新博客了&#xff0c;所谓一日未脱贫&#xff0c;打工不能停&#xff0c;搬砖不狠&#xff0c;明天地位不稳呀。 不多说了&#xff0c;且看以下内容吧~ 一、VFS虚拟文件系统 先来看下文件系统的定义&#x…

ThreadPoolExecutor 工作线程Worker自身锁设计

个人博客 ThreadPoolExecutor 工作线程Worker自身锁设计 | iwts’s blog 总集 想要完整了解下ThreadPoolExecutor&#xff1f;可以参考&#xff1a; 基于源码详解ThreadPoolExecutor实现原理 | iwts’s blog Worker-工作线程管理 线程池设计了内部类Worker&#xff0c;主…

【LeetCode】 740. 删除并获得点数

这真是一道好题&#xff01;这道题不仅考察了抽象思维&#xff0c;还考察了分析能力、化繁为简的能力&#xff0c;同时还有对基本功的考察。想顺利地做出这道题还挺不容易&#xff01;我倒在了第一步与第二步&#xff1a;抽象思维和化繁为简。题目的要求稍微复杂一些&#xff0…

大模型压缩-LoRAP

这里写目录标题 1.多头注意力和FFN的权重分布2 多头矩阵的低秩分解FFN无梯度通道剪枝 这篇文章 1期望找到一个“剪枝&#xff0b;低秩分解”的路子&#xff0c;使结构化剪枝达到非结构化剪枝的性能。 1.多头注意力和FFN的权重分布 Fig. 1.1 多头注意力权重矩阵 从Fig.1.1可以看…

《昇思25天学习打卡营第17天 | 昇思MindSporeCycleGAN图像风格迁移互换》

17天 本节学习了CycleGAN图像风格迁移互换。 CycleGAN即循环对抗生成网络&#xff0c;该模型实现了一种在没有配对示例的情况下学习将图像从源域 X 转换到目标域 Y 的方法。该模型一个重要应用领域是域迁移&#xff0c;可以通俗地理解为图像风格迁移。其实在 CycleGAN 之前&a…

Vue下载接口返回流的处理

1.下载接口返回流如下&#xff1a; 2.可以写公共方法处理 excelDownload(obj, name Date.now(), suffix xlsx) {//Date.now()获取当前日期const url window.URL.createObjectURL(//Blob是二进制大对象new Blob([obj], { type: application/vnd.ms-excel }))const aDOM docu…

Java知识点整理 15 — MyBatis框架

一. 什么是 MyBatis MyBatis 是一款优秀的持久层框架&#xff0c;支持自定义 SQL、存储过程以及高级映射。它免除了几乎所有 JDBC代码以及手动设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO&#xff08;普通老式 Jav…

distance delayed sound

distance delayed sound 在本章中&#xff0c;我们将讨论在游戏音频中使用距离延迟的重要性。我们将首先通过一个常见的例子——闪电和雷鸣&#xff0c;来展示这种重要性并解释距离延迟音频的基础知识。我们将讨论计算速度、距离和时间的数学和方程式&#xff0c;以确定距离延迟…

postgre事务id用完后,如何解决这个问题

在PG中事务年龄不能超过2^31 &#xff08;2的31次方2,147,483,648&#xff09;&#xff0c;如果超过了&#xff0c;这条数据就会丢失。 PG中不允许这种情况出现&#xff0c;当事务的年龄离2^31还有1千万的时候&#xff0c;数据库的日志中就会 有如下告警&#xff1a; warning:…

pc端制作一个顶部固定的菜单栏

效果 hsl颜色 hsl颜色在css中比较方便 https://www.w3school.com.cn/css/css_colors_hsl.asp 色相&#xff08;hue&#xff09;是色轮上从 0 到 360 的度数。0 是红色&#xff0c;120 是绿色&#xff0c;240 是蓝色。饱和度&#xff08;saturation&#xff09;是一个百分比值…

模板方法模式在金融业务中的应用及其框架实现

引言 模板方法模式&#xff08;Template Method Pattern&#xff09;是一种行为设计模式&#xff0c;它在一个方法中定义一个算法的框架&#xff0c;而将一些步骤的实现延迟到子类中。模板方法允许子类在不改变算法结构的情况下重新定义算法的某些步骤。在金融业务中&#xff…

Python的numpy简单使用

1.可以调用引入numpy里面的函数&#xff0c;如add可以把俩数相加&#xff0c;也可以创建一个数组arr&#xff0c;arr.shape是数组arr的属性&#xff0c;如果后有跟&#xff08;&#xff09;就是里面的一个函数 type()函数可以知道里面是什么类型 变量.shape可以知道这个变量是…

[数据集][目标检测]猪只状态吃喝睡站检测数据集VOC+YOLO格式530张4类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;530 标注数量(xml文件个数)&#xff1a;530 标注数量(txt文件个数)&#xff1a;530 标注类别…

适配手机《植物大战僵尸杂交版》最新整合包,附Android、iOS、Windows保姆级教程和工具合集!

最近&#xff0c;新版的《植物大战僵尸杂交版》火爆全网啊&#xff01;许多小伙伴不知道手机和电脑怎样安装设置才能畅玩《杂交版》&#xff0c;所以今天阿星特意为大家准备了一份安装工具集。 里面有安卓、iOS及电脑端的安装包&#xff0c;包含安装视频教程、修改器、防闪退、…

探索ChatGPT是如何改变癌症护理

了解生成式人工智能&#xff08;尤其是 ChatGPT&#xff09;如何通过高级数据集成和个性化患者管理来增强诊断和治疗&#xff0c;从而改变癌症治疗。了解 Color Health 的创新副驾驶模型及其对早期检测和患者结果的影响。 近年来&#xff0c;人工智能与医疗保健的融合为癌症治疗…

使用 fvm 管理 Flutter 版本

文章目录 Github官网fvm 安装Mac/Linux 环境Windows 环境 fvm 环境变量fvm 基本命令 Github https://github.com/leoafarias/fvmhttps://github.com/flutter/flutter 官网 https://fvm.app/ fvm 安装 Mac/Linux 环境 Install.sh curl -fsSL https://fvm.app/install.sh …

基于模糊神经网络的时间序列预测(以hopkinsirandeath数据集为例,MATLAB)

模糊神经网络从提出发展到今天,主要有三种形式&#xff1a;算术神经网络、逻辑模糊神经网络和混合模糊神经网络。算术神经网络是最基本的&#xff0c;它主要是对输入量进行模糊化&#xff0c;且网络结构中的权重也是模糊权重&#xff1b;逻辑模糊神经网络的主要特点是模糊权值可…