# 项目流程图
![img.png](img.png)
# Ant Design Pro
官方文档:https://ant-design-pro.gitee.io/zh-CN/docs/getting-started
## 前端项目安装启动
```js
yarn install
yarn start
```
## 移除国际化
- i18n-remove 报错
- 执行 yarn add eslint-config-prettier --dev
- 执行 yarn add eslint-plugin-unicorn --dev
- 修改node_modules/@umijs/lint/dist/config/eslint/index.js文件:注释 // es2022: true
## open api生成前端接口调用
- package.json
```js
"openapi": "max openapi",
```
- 配置 config/config.ts
```tsx
export default defineConfig({
openAPI: [
{
requestLibPath: "import { request } from '@umijs/max'",
// 后端openapi 地址
schemaPath: 'http://localhost:8081/v3/api-docs',
projectName: 'api-backend',
},
],
})
```
## 请求配置
- src/requestConfig.ts
```tsx
export const requestConfig: RequestConfig = {
// 方式1:跨域访问方式,需要添加配置withCredentials: true, 才能携带cookie
// baseURL: 'http://localhost:8081',
// 方式2:公共前缀 + proxy 代理方式 config/proxy.ts
baseURL: '/api',
}
```
- 完整配置
```tsx
export const requestConfig: RequestConfig = {
// 方式1:跨域访问方式,需要添加配置withCredentials: true, 才能携带cookie
// baseURL: 'http://localhost:8081',
// 方式2:公共前缀 + proxy 代理方式 config/proxy.ts
baseURL: '/api',
// 请求拦截器
requestInterceptors: [
(config: RequestOptions) => {
// 拦截请求配置,进行个性化处理。
const url = config?.url;
return { ...config, url };
},
],
// 响应拦截器
responseInterceptors: [
(response) => {
// 拦截响应数据,进行个性化处理
// data: res 重新分配参数
const { data: res } = response as unknown as ResponseStructure;
if (res?.success === false) {
notification.error({
description: '请求错误',
message: '提示',
});
throw Error('请求错误');
}
const { code, message, data } = res;
if (code !== 0) {
notification.error({
description: message,
message: '提示',
});
throw Error(message);
}
/**
* TODO 这里返回response,实际后面调用获取的是response.data,也就是{ code, message, data }
* 官方说通过配置 request.dataField = '' 可以获取原始数据,实际上未生效
*/
return response;
},
],
// 携带cookie 跨域请求
// withCredentials: true,
};
```
## 登录
- src/pages/user/Login/index.tsx
- 核心方法handleSubmit
- 获取用户信息fetchUserInfo,调用src/app.tsx getInitialState() 获取
```tsx
const Login: React.FC = () => {
const [userLoginState, setUserLoginState] = useState<API.LoginResult>({});
const [type, setType] = useState<string>('account');
const { initialState, setInitialState } = useModel('@@initialState');
const fetchUserInfo = async () => {
// 获取userinfo信息,这里调用的fetchUserInfo是个Promisee函数
const userInfo = await initialState?.fetchUserInfo?.();
if (userInfo) {
flushSync(() => {
setInitialState((s) => ({
...s,
currentUser: userInfo,
}));
});
}
};
const handleSubmit = async (values: API.UserLoginRequest) => {
// 登录
try {
// 判断能否正常登录
const res = await userLoginUsingPOST({
...values,
});
if (res) {
const defaultLoginSuccessMessage = '登录成功!';
notification.success({
description: defaultLoginSuccessMessage,
message: '提示',
});
// 可以登录,获取用户信息并设置到全局状态
await fetchUserInfo();
console.log('fetchUserInfo initialState', initialState);
const urlParams = new URL(window.location.href).searchParams;
// setInitialState(res.data);
console.log('routes', urlParams.get('redirect') || '/');
history.push(urlParams.get('redirect') || '/');
return;
}
} catch (e) {
// 如果失败去设置用户错误信息
const state: API.LoginResult = { status: 'error', type: 'account' };
setUserLoginState(state);
}
};
};
```
## 全局用户状态
- src/app.tsx
```tsx
/**
* @see https://umijs.org/zh-CN/plugins/plugin-initial-state
* 全局状态管理,通过useModel('@@initialState') 获取
* */
export async function getInitialState(): Promise<{
settings?: Partial<LayoutSettings>;
currentUser?: API.LoginUserVO;
loading?: boolean;
fetchUserInfo?: () => Promise<API.LoginUserVO | undefined>;
}> {
// 获取用户信息
const fetchUserInfo = async () => {
try {
const res = await getLoginUserUsingGET();
console.log('fetchUserInfo res', res);
return res.data;
} catch (error) {
history.push(loginPath);
}
return undefined;
};
// 如果不是登录页面,执行
const { location } = history;
if (location.pathname !== loginPath) {
const currentUser = await fetchUserInfo();
return {
fetchUserInfo,
currentUser,
settings: defaultSettings as Partial<LayoutSettings>,
};
}
return {
fetchUserInfo,
settings: defaultSettings as Partial<LayoutSettings>,
};
}
export const layout: RunTimeLayoutConfig = ({ initialState, setInitialState }) => {
return {
// 页面路由改变时回调
onPageChange: () => {
const { location } = history;
// 如果没有登录,重定向到 login
if (!initialState?.currentUser && location.pathname !== loginPath) {
history.push(loginPath);
}
},
};
};
```
## 登出
- src/components/RightContent/AvatarDropdown.tsx
- userLogoutUsingPOST
```tsx
export const AvatarDropdown: React.FC<GlobalHeaderRightProps> = ({ menu, children }) => {
/**
* 退出登录,并且将当前的 url 保存
*/
const loginOut = async () => {
await userLogoutUsingPOST();
}
...
```
## 路由权限
- src/access.ts
```tsx
/**
* @see https://umijs.org/zh-CN/plugins/plugin-access
* */
export default function access(initialState: { currentUser?: API.LoginUserVO } | undefined) {
const { currentUser } = initialState ?? {};
return {
canAdmin: currentUser && currentUser.userRole === 'admin',
};
}
```
## User注册
- Mybatis-Plus默认的主键策略是:ASSIGN_ID(使用雪花算法)
```java
@TableName(value = "user")
@Data
public class User implements Serializable {
/**
* id
如果没有配置策略,则默认为ASSIGN_ID
*/
@TableId(type = IdType.ASSIGN_ID)
private Long id;
}
```
## ProTable 表单
- protable通常用来做查询+ 列表的高级组件,但是也可以用来crud,官方文档提供参数type={'form'},来转换为表单,目前使用有bug
- 方式一:request提交:重置表单会重复调用请求,解决方式,onReset函数会先于request调用,onReset设置标志区分是否reset
- 方式二:onSubmit提交(建议使用这种)form 表单init数据
- ```
form={{
initialValues: !isAdd ? currentRow : {},
}}
```
- status Integer类型数据回显问题,valueEnum枚举类型,如果key是数字,回显会直接显示数字
- 暂时解决方式 ,提前赋值为字符串,record.status += '';
- Add/Update Form表单组件
- 封装单独组件
```tsx
{/* add or update form */}
<EditForm
isAdd={isAdd}
open={open}
onCancel={cancel}
onSubmit={submit}
currentRow={currentRow}
columns={columns}
/>
```
- modal表单中传入值的问题:ProTable中会初始化一次属性,再次打开时候,组件已经赋值,所以有两种解决方式,要么监听外层属性变化,然后重新为表单赋值,要么销毁modal,�
没有合适的资源?快使用搜索试试~ 我知道了~
2024年最新JAVA项目-智能BI-用户中心 - 前后端代码统一.zip
共28个文件
zip:17个
pdf:8个
md:2个
0 下载量 161 浏览量
2024-05-15
09:09:58
上传
评论
收藏 25.89MB ZIP 举报
温馨提示
(可私信博主领取资源) 一共7个JAVA项目,每个项目中涵项目学习资料和教程PDF,源码齐全 1.java springboot后台开发通用模板、2.伙伴匹配系统、3.yb寻爱网、4.用户中心、5.yb接口-API、6.yb聚合搜索平台、7.智能BI平台 2.需求分析 > 设计(概要设计、详细设计)> 技术选型 > 初始化 / 引入需要的技术 > 写 Demo > 写代码(实现业务逻辑) > 测试(单元测试、系统测试)> 代码提交 / 代码评审 > 部署 > 发布上线。 3.做一个提供API接口调用的平台,用户可以注册登录,开通接口调用权限。管理员可以发布接口、下线接口、接入接口,以及可视化接口的调用情况、数据。 涵盖技术:java Spring boot、Spring Boot Starter (SDK 开发)、springmvc、mybatis、mysql、junit、HTML+CSS+JavaScript 三件套、React 开发框架、组件库 Ant Design、Umi 开发框架、Umi Request 开发框架、Ant Design Pro(现成的管理系统)
资源推荐
资源详情
资源评论
收起资源包目录
2024年最新JAVA项目-智能BI-用户中心 - 前后端代码统一.zip (28个子文件)
2024年最新JAVA项目-智能BI-用户中心 - 前后端代码统一
寻爱网
lovefinder-frontend-master.zip 253KB
lovefinder-backend-master.zip 101KB
用户中心
user-center-backend-master.zip 501KB
用户中心笔记.pdf 2.9MB
user-center-frontend-master.zip 69KB
yubi聚合搜索平台
聚合搜索第四期.pdf 4.34MB
yuso-frontend-master.zip 161KB
聚合搜索第三期.pdf 3.53MB
yubi搜索项目笔记.zip 5.12MB
yubi聚合搜索平台(前端).zip 161KB
聚合搜索第二期.pdf 2.77MB
yuso-backend-master.zip 540KB
聚合搜索第一期.pdf 1015KB
yubi聚合搜索平台(后端).zip 540KB
智能 BI 平台
yubi-frontend-master.zip 224KB
yubi-backend-master.zip 497KB
智能BI项目.pdf 1.98MB
智能BI项目笔记.md 192KB
yubi接口 - API 开放平台
yubi-frontend-master.zip 75KB
yubi-backend-master.zip 331KB
文档.pdf 3.39MB
httpswww.yuque.comjuccebgvd5wbmyi9xfobcgr4hww#.txt 46B
README.md 30KB
伙伴匹配系统
yubi-frontend-master.zip 79KB
yubi-backend-master.zip 242KB
lmeng伙伴匹配系统.pdf 4.53MB
java springboot 后台开发通用模板
老
springboot-init-old-master.zip 54KB
springboot-init-master.zip 461KB
共 28 条
- 1
资源评论
李指导、
- 粉丝: 1893
- 资源: 75
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功