S14-03 SSR-Nuxt3-项目:mr-ssr-nuxt3-ts-oppo 
[TOC]

接口文档 
首页信息 
说明 : 调用此接口 , 获取首页商品信息
请求方法 : GET
接口地址 : /home/info
可选参数 :
type: 商品类型,支持: oppo 、onePlus、intelligent, 默认是oppo调用例子 : baseURL + /home/info?type=oppo
{
    "code": 200,
    "data": {
        "navbars": [
            
        ],
        "banners":[
            
        ],
        "categorys":[
            
        ]
    }
}商品详情 
说明 : 调用此接口 , 获取商品详情信息
请求方法 : GET
接口地址 : /oppoDetail
可选参数 :
type: 类型:oppo 、air、watch、tablet, 默认是oppo调用例子 : baseURL + /oppoDetail?type=oppo
{
    "code": 200,
    "data": [
        {
            "id": 19978,
            "title": "Enco X 系列",
            "productDetailss": [
                {
                      "categoryCode": "000020",
                    "id": 21452,
                    "title": "OPPO Enco X2 镜夜黑 有线充版",
                    "marketingText": "45dB 降噪深度",
                    "skuId": 8687,
                    "skuName": "OPPO Enco X2 镜夜黑 有线充版",
                    .....
                }
            ]
        }
    ]
}环境搭建 
项目初始化 
pnpm dlx nuxi init mr-ssr-nuxt3-oppo集成-样式@ 
依赖包:
- normalize.css
- 安装:
pnpm i normalize.css 
 - 安装:
 - sass
- 安装:
pnpm i sass 
 - 安装:
 
配置: 全局引入 normalize.css

自定义全局样式:
global.scss
1、定义全局样式global.scss

2、添加配置,使全局有效

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

2、设置配置,自动导入全局样式变量

3、在组件中使用变量、混合

代码片段 


集成-ElementPlus2@ 
Element Plus 官网:https://element-plus.org/zh-CN/guide/quickstart.html
安装文档:https://nuxt.com.cn/modules/element-plus
依赖包:
- element-plus
- 安装:
pnpm i element-plus 
 - 安装:
 - @element-plus/nuxt
- 安装:
pnpm i @element-plus/nuxt -D 
 - 安装:
 
步骤:
1、安装依赖包
2、在nuxt.config.ts中设置配置
export default defineNuxtConfig({
  modules: [
    '@element-plus/nuxt'
  ],
    
  elementPlus: {
    /** Options */ 
    icon: 'ElIcon',
    importStyle: 'scss',
    themes: ['dark'],
  }
})早期配置:组件中使用需要手动导入

3、在组件中使用element-plus组件,【是否是自动导入?】
<template>
  <el-button @click="ElMessage('hello')">button</el-button>
  <ElButton :icon="ElIconEditPen" type="success">button</ElButton>
  <LazyElButton type="warning">lazy button</LazyElButton>
</template>Options:
【TODO】
SEO@ 

404处理@ 
在pages目录中创建[...slug].vue页面,匹配所有找不到页面的路由

网络请求封装@ 
import type { AsyncData, UseFetchOptions } from "nuxt/dist/app/composables";
const BASE_URL = "http://codercba.com:9060/oppo-nuxt/api/";
type Methods = "GET" | "POST";
export interface IResultData<T> {
  code: number;
  data: T;
}
class HYRequest {
  request<T = any>(
    url: string,
    method: Methods,
    data?: any,
    options?: UseFetchOptions<T>
  ): Promise<AsyncData<T, Error>> {
    return new Promise((resolve, reject) => {
      const newOptions: UseFetchOptions<T> = {
        baseURL: BASE_URL,
        method: method,
        ...options,
      };
      if (method === "GET") {
        newOptions.query = data;
      }
      if (method === "POST") {
        newOptions.body = data;
      }
      useFetch<T>(url, newOptions as any)
        .then((res) => {
          resolve(res as AsyncData<T, Error>);
        })
        .catch((error) => {
          reject(error);
        });
    });
  }
  get<T = any>(url: string, params?: any, options?: UseFetchOptions<T>) {
    return this.request<T>(url, "GET", params, options);
  }
  post<T = any>(url: string, data?: any, options?: UseFetchOptions<T>) {
    return this.request<T>(url, "POST", data, options);
  }
}
export default new HYRequest();使用
import hyRequest from "./index";
import type { IResultData } from "./index";
import { IHomeState } from "@/store/home";
export type IHomeInfoType = "oppo" | "onePlus" | "intelligent"; //  oppo 、onePlus、intelligent
export const getHomeInfo = (type: IHomeInfoType) => {
  return hyRequest.get<IResultData<IHomeState>>("/home/info", {
    type: type || "oppo",
  });
};集成-Pinia 
依赖包:
- pinia
- 安装:
pnmp i pinia,有冲突则添加--force 
 - 安装:
 - @pinia/nuxt
- 安装:
pnmp i @pinia/nuxt 
 - 安装:
 
步骤:
1、安装依赖包
2、配置:nuxt.config.ts

Layout 
接口 
说明 : 调用此接口 , 获取首页商品信息
请求方法 : GET
接口地址 : /home/info
可选参数 :
type: 商品类型,支持: oppo 、onePlus、intelligent, 默认是oppo调用例子 : baseURL + /home/info?type=oppo
{
    "code": 200,
    "data": {
        "navbars": [
            
        ],
        "banners":[
            
        ],
        "categorys":[
            
        ]
    }
}
Layout
1、在项目的layout/default.vue中编写layout

2、创建components/app-header/index.vue组件
3、创建components/app-footer/index.vue组件

4、在app.vue中使用layout

组件:app-header 

页面布局 

功能 
字体图标@ 
必须文件:
iconfont.cssiconfont.ttf
iconfont.css
1、修改字体文件路径

2、配置全局应用字体图标样式

3、在组件中使用字体图标

自定义布局@ 
1、在layout目录创建empty-layout.vue页面

2、在login/index.vue和register/index.vue中指定使用自定义的布局


3、效果

组件:app-footer 

组件:navbar 

页面布局 
1、页面布局

2、在layout中使用组件

请求数据@ 
1、server:在server/home.ts中发送请求

2、store:在store/home.ts中发送异步请求

TS类型: 为请求的数据定义TS类型

3、组件:在~/layouts/default.vue中触发store中的action

功能 
渲染数据 
1、在~/layouts/default.vue中获取store中的数据,并传递给navbar组件

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

切换标签 
1、在navbar组件中添加点击事件

2、实现点击事件,切换标签

路由跳转-组件式 
1、在navbar组件中为链接的to属性添加动态获取path的方法getPagePath(item)

2、实现getPagePath(item)方法,完成路由跳转

组件:search 
页面布局 
1、使用组件

2、在components/search/index.vue中创建组件

login【 
页面布局 
1、点击跳转到login页面

register【 
home 
页面布局 
组件:swiper 

页面布局 
1、使用组件

2、接收props,并渲染

功能 
指示器 


组件:tab-category 

页面布局 
1、使用组件

2、接收数据,并渲染


功能 
路由跳转-编程式 
1、定义点击事件handleItemClick(),向外发射itemClick事件


2、在外部接收itemClick事件


组件:section-category 

页面布局 
1、使用组件

2、页面布局


组件:section-title 

页面布局 
1、使用组件

2、页面布局

组件:grid-view 
页面布局 
1、使用组件

2、页面布局

组件:grid-view-item 
1、使用组件

2、页面布局


功能 
第一个item 
1、使用组件:传递参数category-url

2、页面布局:接收参数并渲染


3、控制第一个item是否显示

添加插槽 

其他页 
onePlus 
注意
该页面结构和home页基本一致,很多组件都可以复用

intelligent 

server【 
详情页 

接口 
说明 : 调用此接口 , 获取商品详情信息
请求方法 : GET
接口地址 : /oppoDetail
可选参数 :
type: 类型:oppo 、air、watch、tablet, 默认是oppo调用例子 : baseURL + /oppoDetail?type=oppo
{
    "code": 200,
    "data": [
        {
            "id": 19978,
            "title": "Enco X 系列",
            "productDetailss": [
                {
                      "categoryCode": "000020",
                    "id": 21452,
                    "title": "OPPO Enco X2 镜夜黑 有线充版",
                    "marketingText": "45dB 降噪深度",
                    "skuId": 8687,
                    "skuName": "OPPO Enco X2 镜夜黑 有线充版",
                    .....
                }
            ]
        }
    ]
}请求数据 
1、server:在~/server/detail.ts中发送请求

2、组件:在~/oppo-details/index.ts中发送异步请求

页面布局 
1、页面跳转:在index.vue中进行路由跳转

2、页面布局



打包部署 
打包项目 
1、执行pnpm run build命令打包项目,项目会打包到/.output/目录
注意: 打包nuxt项目时不能出现中文路径,主要因为Nitro不支持中文路径。
购买-阿里云服务器 
阿里云服务器购买地址: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