这篇文章开始编写 个人中心的页面
首先看下页面的效果
接下来 就按照 这个设计 来编写代码
个人中心页面,我们使用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 || '修改失败');}});};
