Skip to content

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

[TOC]

image-20240911161810109

接口文档

GET 搜索建议

说明 : 调用此接口 , 获取首页搜索建议

请求方法 : GET

接口地址 : /searchsuggest/get

必选参数 :

调用例子 : baseURL + /searchsuggest/get

json
{
    "code": 200,
    "data": {
        "id": 30001,
        "defaultKey": "蓝牙耳机",
        "configKey": [
            {
                "1": "迪士尼Q2"
            },
            {
                "2": "日常元素"
            }
        ]
    }
}

GET 首页信息

说明 : 调用此接口 , 获取首页商品信息

请求方法 : GET

接口地址 : /home/info

必选参数 :

调用例子 : baseURL + /home/info

json
{
    "code": 200,
    "data": {
        "banners":[
            
        ],
        "categorys":[
            
        ]
    }
}

GET 热门商品

说明 : 调用此接口 , 获取热门商品

请求方法 : GET

接口地址 : /hotproduct_v2/gets

必选参数 :

调用例子 : baseURL + /hotproduct_v2/gets

json
{
    "code": 200,
    "data": {
        "count": 8,
        "hasMore": false,
        "hotProduct":[
        
        ]
    }
}

GET 所有商品

说明 : 调用此接口 , 获取所有商品

请求方法 : GET

接口地址 : /allProduct/gets

必选参数 :

调用例子 : baseURL + /allProduct/gets

json
{
    "code": 200,
    "data": {
        "count": 150,
        "allProduct":[
        ]
    }
}

GET 商品详情信息

说明 : 调用此接口 , 获取商品详情信息

请求方法 : GET

接口地址 : /special/getdetail

必选参数 :

json
specialTopicId: 商品id ( 目前只有 5500168001 两个商品的详情 )

调用例子 : baseURL + /special/getdetail?specialTopicId=68001

json
{
    "code": 200,
    "data": {
        "id": 55001,
        "name": "热销爆品",
        "linkedUrl": null,
        "specialTopicProducts":[]
        "products" [],
         .....
    }
}

POST 搜索商品

说明 : 调用此接口 , 获取商品详情信息

请求方法 : POST

接口地址 : /store/api/product/searchl

请求头信息 :

json
{
   "Content-Type": "application/x-www-form-urlencoded",
}

必选参数 :

json
limit: 60
offset: 0
key: 真无线

调用例子 : baseURL + /special/getdetail?specialTopicId=68001

json
{
    "code": 200,
    "data": {
        "id": 55001,
        "name": "热销爆品",
        "linkedUrl": null,
        "specialTopicProducts":[]
        "products" [],
         .....
    }
}

环境搭建

项目初始化

注意: 不同与nuxt,next的项目可以在中文路径中创建。

sh
pnpm dlx create-next-app@latest

image-20241018111549788

最新版(next15)

image-20241028220606347

集成-样式

依赖包:

  • normalize.css
    • 安装:pnpm i normalize.css
  • sass
    • 安装:pnpm i sass
  • classnames
    • 安装:pnpm i classnames

配置:

tsconfig.json中通过baseUrlpaths配置@别名

image-20241018113521924

自定义全局样式:

normalize.css

1、安装依赖包

2、在pages/_app.tsx中全局引入 normalize.css

image-20241018112211573

variables.scss

1、定义全局样式变量

image-20241018112739214

image-20241018112817571

2、在global.scss中使用@import导入样式

global.scss

1、定义全局样式global.scss

image-20241018113007224

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

image-20241018113113067

SEO

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

image-20241018114753867

集成-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/toolkitreact-redux
    • 安装:pnpm i @reduxjs/toolkit react-redux

集成过程

1、创建store:configureStore()

js
  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 store

2、创建reducer片段:createSlice()

js
  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.reducer

3、Next:添加 HYDRATE 操作,保证服务端和客户端数据的一致性

image-20241018152414741

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

image-20241018152844241

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

image-20241018153052171

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

image-20241018153434961

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

image-20241018153827810

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

image-20241018154028243

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

image-20241018154352847

7、效果

image-20241018154423802

异步操作

1、在home.ts中发送异步请求

js
+  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()

image-20241012172750002

集成-AntDesign5

依赖包:

  • antd
    • 安装:pnpm i antd
  • @types/antd
    • 安装:pnpm i @types/antd -D

基本实现:

1、安装依赖包

2、重置antd样式

image-20241018163052867

3、使用ant组件

tsx
import { Button } from 'antd'

image-20241018163249745

注意:

  • antd默认支持基于ES modules的tree shaking,直接引入 import { Button } from 'antd' 就有按需加载的效果

Layout

基本实现

1、组件:navbar

image-20241018115829969

2、组件:footer

image-20241018115818637

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

image-20241018115943010

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

image-20241018120050150

5、效果

image-20241018120058457

组件:navbar

image-20241018120417712

页面布局

1、基本布局

image-20241018161704129

功能

显示购物车上标

image-20241018162703165

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

image-20241018162630211

2、渲染counter

image-20241018162616182

页面布局

image-20241018122338980

1、使用组件

2、页面布局

image-20241018122659246

请求数据

1、service

image-20241018155518580

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

image-20241018161210386

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

image-20241018161234381

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

image-20241018161606713

image-20241018161611802

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

image-20241018161836970

image-20241018162059780

功能

点击显示下拉面板

1、添加聚焦、失焦事件

image-20241018123433071

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

image-20241018123741387

image-20241018123725581

搜索联想功能

1、添加onKeyDown事件

image-20241018152051627

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

image-20241018124706609

3、

home

组件:top-swiper

页面布局

1、使用组件:在pages/index.tsx中使用组件

image-20241018163951232

2、基本布局

image-20241018165342044

请求数据

1、service

image-20241018164649007

image-20241018164713470

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

image-20241018164922721

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

image-20241018165229851

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

image-20241018165753589

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

image-20241018165825850

6、效果

image-20241018165840292

7、优化:轮播图

image-20241018170016150

功能

添加轮播图两侧背景

image-20241018170553568

修改指示器样式

1、基本布局

image-20241018170732369

2、默认选中效果

image-20241018171026002

image-20241018171033376

手动切换图片

1、渲染上一页、下一页

image-20241018171300924

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

image-20241018171406590

3、实现事件函数

image-20241018171816790

组件:tab-category

image-20241018171952367

1、使用组件并传递数据

image-20241018172441379

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

image-20241018173401973

组件:recommend

image-20241018173508572

1、使用组件并传递数据

image-20241018174750182

2、基本布局

image-20241018175205474

组件:section-title

image-20241018175951044

1、使用组件

image-20241018175825768

2、基本布局

image-20241018175710251

组件:grid-view

image-20241018180014862

请求数据

URL:http://codercba.com:9060/music-next/api/hotproduct_v2/gets

image-20241018180904267

1、service

image-20241018181343948

image-20241018181346868

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

image-20241018181543343

页面布局

1、使用组件:在pages/index.tsx中使用组件

image-20241028144202280

2、基本布局

组件:grid-view-item

image-20241028144842642

1、使用组件

image-20241028145525160

2、基本布局

image-20241028150339194

3、添加打折提示,通过showTip控制是否显示

  • grid-view组件中设置showTip变量

    image-20241028150742885

  • grid-view-item组件中根据showTip控制是否显示

    image-20241028151005387

所有商品(组件复用)

请求数据

URL:http://codercba.com:9060/music-next/api/allProduct/gets

image-20241028152403410

1、service

image-20241028152409160

image-20241028152427899

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

image-20241028152648648

页面布局

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

image-20241028152835893

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

image-20241028153056876

image-20241028153114869

其他页

详情页

image-20241028160818785

页面跳转

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

image-20241028154217880

请求数据

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

image-20241028160702190

1、service

image-20241028155744795

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

image-20241028160032482

页面布局

根据请求的数据渲染组件

image-20241028160100357

image-20241028160622944

搜索页

页面跳转

1、跳转到搜索页

  • 点击搜索,跳转到搜索页

    image-20241028161211559

    image-20241028161714494

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

    image-20241028161820344

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

image-20241028162025970

请求数据

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

image-20241028162605218

2、service

image-20241028162421745

【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

image-20241028164900796

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

image-20241028164842866

购买-阿里云服务器

阿里云服务器购买地址:https://aliyun.com/

1、打开控制台

2、菜单找到:云服务器 ECS

3、创建我们 ECS

4、服务器的配置

  • CentOS 7.9 / 64
  • 2cpu 4G

5、配置安全组

6、系统配置,自定义密码

7、确认订单,创建实例

image-20240911153202733

连接-阿里云服务器

1、VS Code 安装:Remote SSH 插件

image-20240911153214818

2、Remote SSH 连接远程服务器

image-20240911153223136

image-20240911153228309

image-20241028163132759

image-20240911153233416

安装 Node

见:安装nodejs

安装n

见:安装n

安装pm2

见:安装pm2