这篇文章开始编写 个人中心的页面
首先看下页面的效果
接下来 就按照 这个设计 来编写代码
个人中心页面,我们使用ssr的方式来渲染
1.首先引入数据库等的配置
/* eslint-disable @next/next/link-passhref */
import React from 'react';
import Link from 'next/link';
import { observer } from 'mobx-react-lite';
import { Button, Avatar, Divider } from 'antd';
import {
CodeOutlined,
FireOutlined,
FundViewOutlined,
} from '@ant-design/icons';
import ListItem from 'components/ListItem';
import { prepareConnection } from 'db/index';
import { User, Article } from 'db/entity';
2.通过ssr的方式获取用户信息和文章相关的数据
3.根据url获取当前用户的id
const userId = params?.id;
4.根据当前用户的id查询 从用户表中查询当前用户的信息
const user = await db.getRepository(User).findOne({
where: {
id: Number(userId),
},
});
5.根据用户id以及关联的用户表和标签表查询相关联的文章
const articles = await db.getRepository(Article).find({
where: {
user: {
id: Number(userId),
},
},
relations: ['user', 'tags'],
});
6.最后将上面两个数据返回
return {
props: {
userInfo: JSON.parse(JSON.stringify(user)),
articles: JSON.parse(JSON.stringify(articles)),
},
};
7.在前端 通过 props 拿到 数据
const { userInfo = {}, articles = [] } = props;
8.获取 全部文章的 总浏览数
const viewsCount = articles?.reduce(
(prev: any, next: any) => prev + next?.views,
0
);
9.最后将 所有的数据渲染出来
<div className={styles.userDetail}>
<div className={styles.left}>
<div className={styles.userInfo}>
<Avatar className={styles.avatar} src={userInfo?.avatar} size={90} />
<div>
<div className={styles.nickname}>{userInfo?.nickname}</div>
<div className={styles.desc}>
<CodeOutlined /> {userInfo?.job}
</div>
<div className={styles.desc}>
<FireOutlined /> {userInfo?.introduce}
</div>
</div>
<Link href="/user/profile">
<Button>编辑个人资料</Button>
</Link>
</div>
<Divider />
<div className={styles.article}>
{articles?.map((article: any) => (
<div key={article?.id}>
<ListItem article={article} />
<Divider />
</div>
))}
</div>
</div>
<div className={styles.right}>
<div className={styles.achievement}>
<div className={styles.header}>个人成就</div>
<div className={styles.number}>
<div className={styles.wrapper}>
<FundViewOutlined />
<span>共创作 {articles?.length} 篇文章</span>
</div>
<div className={styles.wrapper}>
<FundViewOutlined />
<span>文章被阅读 {viewsCount} 次</span>
</div>
</div>
</div>
</div>
</div>
10.这里有个地方是 编辑 个人资料的 入口,点击 跳转到 编辑个人资料的页面
<Link href="/user/profile">
<Button>编辑个人资料</Button>
</Link>
首先看下 编辑个人资料的页面
这里的逻辑就是 首先 从接口 获取当前用户的信息,然后修改个人信息,最后 保存修改。
1.首先通过接口获取用户信息
useEffect(() => {
request.get('/api/user/detail').then((res: any) => {
if (res?.code === 0) {
console.log(333333);
console.log(res?.data?.userInfo);
form.setFieldsValue(res?.data?.userInfo);
}
});
}, [form]);
2.接着将用户信息渲染到表单中
return (
<div className="content-layout">
<div className={styles.userProfile}>
<h2>个人资料</h2>
<div>
<Form
{...layout}
form={form}
className={styles.form}
onFinish={handleSubmit}
>
<Form.Item label="用户名" name="nickname">
<Input placeholder="请输入用户名" />
</Form.Item>
<Form.Item label="职位" name="job">
<Input placeholder="请输入职位" />
</Form.Item>
<Form.Item label="个人介绍" name="introduce">
<Input placeholder="请输入个人介绍" />
</Form.Item>
<Form.Item {...tailLayout}>
<Button type="primary" htmlType="submit">
保存修改
</Button>
</Form.Item>
</Form>
</div>
</div>
</div>
);
3.最后调用保存修改的接口 将 修改后的数据 更新到 数据表中
const handleSubmit = (values: any) => {
console.log(99999);
console.log(values);
request.post('/api/user/update', { ...values }).then((res: any) => {
if (res?.code === 0) {
message.success('修改成功');
} else {
message.error(res?.msg || '修改失败');
}
});
};