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

news2024/10/6 18:34:23

一. 项目初始化

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 前端初始化模板(仅移除了国际化),也可以从官网中下载初始版本然后按照上述步骤完成初始化与瘦身等。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【学习笔记】Hive

Hive 作为数仓应用工具&#xff0c;对比 RDBMS&#xff08;关系型数据库&#xff09; 有3个“不能”&#xff1a; 不能像 RDBMS 一般实时响应&#xff0c;Hive 查询延时大&#xff1b; 不能像 RDBMS 做事务型查询&#xff0c;Hive 没有事务机制&#xff1b; 不能像 RDBMS 做行…

理解论文笔记:基于AHP和模糊综合评价的无线传感器网络可维护性评估方法

作为一个研0的娃,这是我认真读的第一篇论文,想着笔记让自己能看懂。如有侵权,请联系删除。 I. INTRODUCTION 介绍 主要介绍了无线传感器网络可维护性研究的重要性和必要性,并对下面的各章进行了总结。 翻译:第二部分简要介绍了无线传感器网络的维护,并对影响系统的因素…

【C++】final关键字 | 避免派生、重写

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…

【ARM Trace32(劳特巴赫) 使用介绍 2.7 -- bat 脚本传参数给 trace32 cmm 脚本】

请阅读【Trace32 ARM 专栏导读】 文章目录 bat 脚本传参数给 trace32脚本可变参数传入CMM 脚本接收参数运行BAT脚本bat 脚本传参数给 trace32脚本 在使用 Trace32 的过程中,如果每次都是通过GUI 界面来操作,是习惯使用命令行工作的人所不能忍受的!!!,那么能不同通过脚本…

打破数据分析壁垒:SPSS复习必备(十一)

一、方差分析 方差分析的应用条件如下&#xff1a; &#xff08;1&#xff09;独立&#xff0c;各组数据相互独立&#xff0c;互不相关&#xff1b; &#xff08;2&#xff09;正态&#xff1a;即各组数据符合正态分布&#xff1b; &#xff08;3&#xff09;方差齐性&…

【第十八课】区域经济分析——探索性空间数据分析软件实操

一、前言 ArcGIS有专门处理探索性空间数据分析方法的工具,即地统计分析模块。 该模块主要由三个功能模块组成:探索性数据分析(Explore)、地统计分析向导(Geostatistical Wizard),以及生成数据子集(Create Subsets)。其中利用 这些基本功能模块,可以方便完成多种地统…

RPC架构基本结构和核心技术

当你在构建一个分布式系统时&#xff0c;势必需要考虑的一个问题是&#xff1a;如何实现服务与服务之间高效调用&#xff1f;当然&#xff0c;你可以使用Dubbo或Spring Cloud等分布式服务框架来完成这个目标&#xff0c;这些框架帮助我们封装了技术实现的复杂性。那么&#xff…

Spring Boot 整合 JSP

Spring Boot 是一个开源的 Java 框架&#xff0c;用于创建独立、生产级的基于 Spring 框架的应用程序。它简化了基于 Spring 的应用程序的创建和部署过程。JSP&#xff08;JavaServer Pages&#xff09;是一种动态网页技术&#xff0c;允许开发者在 HTML 中嵌入 Java 代码。将 …

基于UDP的网络聊天室(多线程实现收和发消息)

要求&#xff1a;1.有新用户登录&#xff0c;其他在线的用户可以收到登录信息 2.有用户群聊&#xff0c;其他在线的用户可以收到群聊信息 3.有用户退出&#xff0c;其他在线的用户可以收到退出信息 4.服务器可以发送系统信息 效果图&#xff1a; service.c #include <head…

内网一键部署k8s-kubeshpere,1.22.12版本

1.引言 本文档旨在指导读者在内网环境中部署 Kubernetes 集群。Kubernetes 是一种用于自动化容器化应用程序部署、扩展和管理的开源平台&#xff0c;其在云原生应用开发和部署中具有广泛的应用。然而&#xff0c;由于一些安全或网络限制&#xff0c;一些组织可能选择在内部网络…

计算机专业课面试常见问题-计算机网络篇

目录 1. 计算机网络分为哪 5 层&#xff1f; 2. TCP 协议简述&#xff1f; 3. TCP 和 UDP 的区别&#xff1f;->不同的应用场景&#xff1f; 4. 从浏览器输入网址到显示页…

论文阅读MVBench: A Comprehensive Multi-modal Video Understanding Benchmark

摘要(Abstract)&#xff1a; 论文介绍了MVBench&#xff0c;这是一个全新的多模态视频理解基准测试&#xff0c;旨在评估多模态大型语言模型&#xff08;MLLMs&#xff09;在视频理解方面的能力。 目前许多基准测试主要集中在静态图像任务的空间理解上&#xff0c;而忽视了动…

云计算【第一阶段(21)】引导过程与服务控制

目录 一、linux操作系统引导过程 1.1、开机自检 1.2、MBR引导 1.3、GRUB菜单 1.4、加载 Linux 内核 1.5、init进程初始化 1.6、简述总结 1.7、初始化进程centos 6和7的区别 二、排除启动类故障 2.1、修复MBR扇区故障 2.1.1、 实验 2.2、修复grub引导故障 2.2.1、实…

Marin说PCB之total etch length规则知多少?

魔都上海最近迎来了一轮梅雨季节了&#xff0c;小编我上周就已经提前把被子衣服袜子都晒了一遍&#xff0c;省的后面一段时间下雨就不能晒了。这种阴雨绵绵的天气当然在家里睡觉最舒服了&#xff0c;上周留正当我在家里夏眠的时候&#xff0c;突然被一阵手机铃声吵醒了&#xf…

Spring Boot如何实现跨域资源共享(CORS)?

&#x1f345; 作者简介&#xff1a;哪吒&#xff0c;CSDN2021博客之星亚军&#x1f3c6;、新星计划导师✌、博客专家&#x1f4aa; &#x1f345; 哪吒多年工作总结&#xff1a;Java学习路线总结&#xff0c;搬砖工逆袭Java架构师 &#x1f345; 技术交流&#xff1a;定期更新…

ArkTS开发系列之Web组件的学习(2.9)

上篇回顾&#xff1a;ArkTS开发系列之事件&#xff08;2.8.2手势事件&#xff09; 本篇内容&#xff1a; ArkTS开发系列之Web组件的学习&#xff08;2.9&#xff09; 一、知识储备 Web组件就是用来展示网页的一个组件。具有页面加载、页面交互以及页面调试功能 1. 加载网络…

多商户万能DIY商城小程序源码系统 支持自营+独立部署 带完整的安装代码包以及搭建教程

系统概述 多商户万能 DIY 商城小程序源码系统是一个综合性的电商平台解决方案&#xff0c;旨在满足不同用户的多样化需求。它不仅支持自营模式&#xff0c;还为多商户入驻提供了广阔的空间&#xff0c;使平台能够汇聚各类商品和商家&#xff0c;形成一个丰富多样的商业生态。 …

字节发布Depth Anything V2深度模型,比 Depth Anything V1 更精细的细节。

欢迎点击关注下方公众号并加入官方读者交流群&#xff0c;一个有趣有AI的AIGC公众号:关注AI、深度学习、计算机视觉、AIGC、Stable Diffusion、Sora等相关技术&#xff0c;欢迎一起交流学习&#x1f497;&#xff5e; 字节发布Depth Anything V2深度模型。比 Depth Anything V1…

昇思25天学习打卡营第3天|onereal

前几天不能运行代码&#xff0c;经过排查是因为我的浏览器是搜狗的&#xff0c;换成Chrome问题解决了。按照提示学习了《应用实践/计算机视觉/FCN图像语义分割.ipynb》并且尝试运行代码&#xff0c;开始训练&#xff0c;最后看到图片变化。 网络流程 FCN网络的流程如下图所示&…

【课程总结】Day11(下):YOLO的入门使用

前言 YOLO的简介 YOLO&#xff08;You Only Look Once&#xff09;是一种流行的目标检测算法&#xff0c;由Joseph Redmon等人于2015年提出。YOLO的设计思想是将目标检测任务转化为单个神经网络的回归问题&#xff0c;通过在图像上划分网格并对每个网格预测边界框和类别置信度…