S14-06 SSR-Next13-项目:mr-ssr-next13-ts-music-mall
[TOC]

接口文档
GET 搜索建议
说明 : 调用此接口 , 获取首页搜索建议
请求方法 : GET
接口地址 : /searchsuggest/get
必选参数 : 无
调用例子 : baseURL + /searchsuggest/get
{
"code": 200,
"data": {
"id": 30001,
"defaultKey": "蓝牙耳机",
"configKey": [
{
"1": "迪士尼Q2"
},
{
"2": "日常元素"
}
]
}
}GET 首页信息
说明 : 调用此接口 , 获取首页商品信息
请求方法 : GET
接口地址 : /home/info
必选参数 : 无
调用例子 : baseURL + /home/info
{
"code": 200,
"data": {
"banners":[
],
"categorys":[
]
}
}GET 热门商品
说明 : 调用此接口 , 获取热门商品
请求方法 : GET
接口地址 : /hotproduct_v2/gets
必选参数 : 无
调用例子 : baseURL + /hotproduct_v2/gets
{
"code": 200,
"data": {
"count": 8,
"hasMore": false,
"hotProduct":[
]
}
}GET 所有商品
说明 : 调用此接口 , 获取所有商品
请求方法 : GET
接口地址 : /allProduct/gets
必选参数 : 无
调用例子 : baseURL + /allProduct/gets
{
"code": 200,
"data": {
"count": 150,
"allProduct":[
]
}
}GET 商品详情信息
说明 : 调用此接口 , 获取商品详情信息
请求方法 : GET
接口地址 : /special/getdetail
必选参数 :
specialTopicId: 商品id ( 目前只有 55001 和 68001 两个商品的详情 )调用例子 : baseURL + /special/getdetail?specialTopicId=68001
{
"code": 200,
"data": {
"id": 55001,
"name": "热销爆品",
"linkedUrl": null,
"specialTopicProducts":[],
"products": [],
.....
}
}POST 搜索商品
说明 : 调用此接口 , 获取商品详情信息
请求方法 : POST
接口地址 : /store/api/product/searchl
请求头信息 :
{
"Content-Type": "application/x-www-form-urlencoded",
}必选参数 :
limit: 60
offset: 0
key: 真无线调用例子 : baseURL + /special/getdetail?specialTopicId=68001
{
"code": 200,
"data": {
"id": 55001,
"name": "热销爆品",
"linkedUrl": null,
"specialTopicProducts":[],
"products": [],
.....
}
}环境搭建
项目初始化
注意: 不同与nuxt,next的项目可以在中文路径中创建。
pnpm dlx create-next-app@latest
最新版(next15)

集成-样式
依赖包:
- normalize.css
- 安装:
pnpm i normalize.css
- 安装:
- sass
- 安装:
pnpm i sass
- 安装:
- classnames
- 安装:
pnpm i classnames
- 安装:
配置:
在tsconfig.json中通过baseUrl和paths配置@别名

自定义全局样式:
normalize.css
1、安装依赖包
2、在pages/_app.tsx中全局引入 normalize.css

variables.scss
1、定义全局样式变量


2、在global.scss中使用@import导入样式
global.scss
1、定义全局样式global.scss

2、在pages/_app.tsx中导入,使全局有效

SEO
可以在_document.js中添加Head,并在其中进行SEO配置

集成-RTK
Redux Toolkit 是官方推荐的编写 Redux 逻辑的方法。
在前面我们学习Redux的时候应该已经发现,redux的编写逻辑过于的繁琐和麻烦。
并且代码通常分拆在多个文件中(虽然也可以放到一个文件管理,但是代码量过多,不利于管理);
Redux Toolkit包旨在成为编写Redux逻辑的标准方式,从而解决上面提到的问题;
在很多地方为了称呼方便,也将之称为“RTK”;
安装
依赖包:
- next-redux-wrapper:将服务端redux存储的数据同步一份到客户端上。
- 安装:
pnpm i next-redux-wrapper - 可以避免在访问服务器端渲染页面时store的重置
- 该库提供了HYDRATE调度操作
- 当用户访问动态路由或后端渲染的页面时,会执行Hydration来保持两端数据状态一致
- 比如:每次当用户打开使用了getStaticProps或getServerSideProps函数生成的页面时,HYDRATE将执行调度操作。
- 安装:
- @reduxjs/toolkit、react-redux
- 安装:
pnpm i @reduxjs/toolkit react-redux
- 安装:
集成过程
1、创建store:configureStore()
import { configureStore } from '@reduxjs/toolkit'
import counterReducer from './features/counter'
import homeReducer from './features/home'
+ const store = configureStore({
+ reducer: {
+ counter: counterReducer,
+ home: homeReducer
+ }
+ })
export default store2、创建reducer片段:createSlice()
import { createSlice } from "@reduxjs/toolkit";
+ const counterSlice = createSlice({
+ name: 'counter',
+ initialState: {
+ counter: 100
+ },
+ reducers: {
+ addCounter(state, action) {
+ state.counter += action.payload
+ },
+ subCounter(state, action) {
+ state.counter -= action.payload
+ }
+ }
+ })
+ export const { addCounter, subCounter } = counterSlice.actions
+ export default counterSlice.reducer3、Next:添加 HYDRATE 操作,保证服务端和客户端数据的一致性

4、Next:通过 createWrapper() 方法包裹一个通过函数返回的store并导出

5、TS类型:为模块的initialState添加TS类型

6、TS类型:为store的dispatch、state添加TS类型

7、在_app.tsx中挂载store到app上

8、在组件中使用 useSelector() 获取store中的数据

6、在组件中使用 useDispatch() 修改store中的数据

7、效果

异步操作
1、在home.ts中发送异步请求
+ export const fetchHomeMultidataAction = createAsyncThunk('home/multidata', async () => {
const res = await axios.get('http://123.207.32.32:8000/home/multidata')
return res.data.data
})
const homeSlice = createSlice({
name: 'home',
initialState: {
banners: [],
recommends: []
},
+ extraReducers(builder) {
+ builder
+ .addCase(fetchHomeMultidataAction.fulfilled, (state, { payload }) => {
state.banners = payload.banner.list
state.recommends = payload.recommend.list
})
+ .addCase(fetchHomeMultidataAction.rejected, (state) => {
console.log('fetchHomeMultidataAction.rejected')
})
}
})2、在组件中调用 fetchHomeMultidataAction()

集成-AntDesign5
依赖包:
- antd
- 安装:
pnpm i antd
- 安装:
- @types/antd
- 安装:
pnpm i @types/antd -D
- 安装:
基本实现:
1、安装依赖包
2、重置antd样式

3、使用ant组件
import { Button } from 'antd'
注意:
- antd默认支持基于ES modules的tree shaking,直接引入
import { Button } from 'antd'就有按需加载的效果
Layout
基本实现
1、组件:navbar

2、组件:footer

3、在components/layout/index.tsx中添加布局

4、在pages/_app.tsx中用<Layout>组件包裹<Component>组件,应用布局

5、效果

组件:navbar

页面布局
1、基本布局

功能
显示购物车上标

1、在navbar组件中,通过 useSelector()方法获取store中的counter数据

2、渲染counter

组件:search
页面布局

1、使用组件

2、页面布局

请求数据
1、service

2、在store的异步action中发送请求

3、在pages/index.tsx组件中通过 getServerSideProps() 方法获取SSR数据,并存储到redux中

4、在components/navbar/index.tsx组件中,使用 useSelector() 获取store中的数据


5、在components/search/index.tsx组件中,接收参数,并渲染


功能
点击显示下拉面板
1、添加聚焦、失焦事件

2、实现事件函数,控制显示和隐藏下拉面板


搜索联想功能
1、添加onKeyDown事件

2、实现事件函数,当输入搜索内容时,自动联想关键词

3、
组件:footer
home
组件:top-swiper
页面布局
1、使用组件:在pages/index.tsx中使用组件

2、基本布局

请求数据
1、service


2、在pages/idnex.tsx组件的getServerSideProps()中发送网络请求

3、在pages/idnex.tsx组件中,传递参数到<top-swiper>组件中

4、在组件top-swiper中接收参数,并渲染

5、在next.config.js中配置图片域名的白名单

6、效果

7、优化:轮播图

功能
添加轮播图两侧背景

修改指示器样式
1、基本布局

2、默认选中效果


手动切换图片
1、渲染上一页、下一页

2、点击上一页、下一页事件

3、实现事件函数

组件:tab-category

1、使用组件并传递数据

2、在组件中接收数据并渲染

组件:recommend

1、使用组件并传递数据

2、基本布局

组件:section-title

1、使用组件

2、基本布局

组件:grid-view

请求数据
URL:http://codercba.com:9060/music-next/api/hotproduct_v2/gets

1、service


2、在pages/index.tsx组件中发起网络请求

页面布局
1、使用组件:在pages/index.tsx中使用组件

2、基本布局

组件:grid-view-item

1、使用组件

2、基本布局

3、添加打折提示,通过showTip控制是否显示
在
grid-view组件中设置showTip变量
在
grid-view-item组件中根据showTip控制是否显示
所有商品(组件复用)
请求数据
URL:http://codercba.com:9060/music-next/api/allProduct/gets

1、service


2、在pages/index.tsx组件中发起网络请求

页面布局
1、在pages/index.tsx组件中复用<grid-view>组件,并传入获取的所有商品的数据

2、在<grid-view> 和<grid-view-item>组件中,修改products类型


其他页
详情页

页面跳转
1、页面跳转:在<recommend>组件中跳转

请求数据
URL:http://codercba.com:9060/music-next/api/special/getdetail?specialTopicId=68001

1、service

2、在detail组件中通过getServerSideProps()方法请求数据

页面布局
根据请求的数据渲染组件


搜索页
页面跳转
1、跳转到搜索页
点击搜索,跳转到搜索页


同时在监听回车键的事件中,也添加跳转

2、在search页通过router.query获取跳转时传递的参数

请求数据
1、在search页中通过getServerSideProps()方法请求数据

2、service

【TODO】
打包部署
打包项目
基本部署:
1、执行pnpm run build命令打包项目,检查是否存在错误
注意: 打包next项目时可以出现中文路径。
2、将整个项目(不包括node_modules)上传到远程服务器中
3、在远程运行pnpm i安装依赖包
4、在远程运行PORT=9090 pnpm run start启动项目
5、打开网站
6、在远程运行pm2 start "PROT=9090 pnpm run start" --name music-mall可以实现单个实例启动项目
使用PM2集群部署:
1、在远程运行pm2 init simple创建配置文件
2、修改配置ecosystem.config.js

3、在远程运行pm2 start ecosystem.config.js可以实现集群启动项目

购买-阿里云服务器
阿里云服务器购买地址:https://aliyun.com/
1、打开控制台
2、菜单找到:云服务器 ECS
3、创建我们 ECS
4、服务器的配置
- CentOS 7.9 / 64
- 2cpu 4G
5、配置安全组
6、系统配置,自定义密码
7、确认订单,创建实例

连接-阿里云服务器
1、VS Code 安装:Remote SSH 插件

2、Remote SSH 连接远程服务器




安装 Node
见:安装nodejs
安装n
见:安装n
安装pm2
见:安装pm2