尚硅谷2020微服務分佈式電商項目《穀粒商城》(Alibaba+Vue)開發教程學習筆記(一)

前言:無意中看到尚硅谷發佈了最新的微服務分佈式項目《穀粒商城》,剛好最近在學習微服務,所以,想要學習一下。

官方已經發布了相關的資料,但是,可惜的是,並沒有課件,只能跟着視頻教程一步一步的學習,所以,將目前學習的筆記整理,供自己日後複習,供大家參考。若有不足,還請指正。

 

gitee上倉庫地址:https://gitee.com/wolf623/gulimall

 

一、開發環境統一

0、安裝虛擬機、安裝MySQL、安裝Redis

因爲我不打算在我本地電腦上安裝這些,所以這條內容省略。

 

1、Maven

(1)使用阿里鏡像倉庫

    <!-- 阿里鏡像倉庫-->
    <mirror>
        <id>alimaven</id>
        <name>aliyun maven</name>
        <url>
            http://maven.aliyun.com/nexus/content/groups/public/
        </url>
        <mirrorOf>central</mirrorOf>
    </mirror>

(2)使用jdk1.8編譯

<profile>
    <id>jdk‐1.8</id>
    <activation>
        <activeByDefault>true</activeByDefault>
        <jdk>1.8</jdk>
    </activation>
    <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
    </properties>
</profile>

 

2、安裝vscode,並安裝相關插件

 

3、安裝配置git

git我之前已經安裝過了,這裏就不說了。

跟視頻一樣吧,也使用碼雲,註冊就不說了。

不過,這裏要注意一個問題,也就是多個git ssh key 管理問題

不然,會提示:permission denied錯誤。

 

因爲我之前有其他git賬號的ssh key存在,比如GitHub,這裏在生成ssh key時,不能一路回車

ssh-keygen -t rsa -C "[email protected]"  <<<這裏不能一路回車,第一個交互提示要輸入存放的路徑,不能用默認的,否則會覆蓋原來的其他的賬號key

 

下面說下,關於管理多個git ssh key的問題

在.ssh目錄創建config文本文件並完成相關配置(最核心的地方)

內容說明如下:

HostName           這個是真實的域名地址
IdentityFile          這裏是id_rsa的地址
PreferredAuthentications   配置登錄時用什麼權限認證--可設爲publickey,password publickey,keyboard-interactive等
User            配置使用用戶名

 

這裏我的是:

# 配置github.com
Host github.com                 
    HostName github.com
    IdentityFile C:\Users\abc\.ssh\github_rsa
    PreferredAuthentications publickey
    User myname

# 配置gitee.com    
Host gitee.com    
    HostName gitee.com   
    IdentityFile C:\Users\abc\.ssh\gitee_rsa
    PreferredAuthentications publickey
    User myname

之後,通過這個命令來測試:ssh -T [email protected]

參考:

https://blog.csdn.net/weixin_36995644/article/details/81776412

https://www.cnblogs.com/popfisher/p/5731232.html

 

4.項目初始結構創建

在gitee上創建倉庫,並且在IDEA中clone,並創建member會員服務,ware倉儲服務,order訂單服務,product產品服務,coupon優惠券服務,修改.gitignore文件,增加以下內容忽略這些文件的修改。

**/mvnw
**/mvnw.cmd

**/.mvn
**/target/

.idea

**/.gitignore

最後,再把代碼提交到gitee倉庫中。

 

5.數據庫初始化

根據提供的SQL文件,分別創建gulimall各個表。

 

二、快速開發-使用人人開源搭建後臺管理系統

1.git clone下載renren-fast, renren-fast-vue,renren-generator倉庫代碼

https://gitee.com/renrenio/renren-fast.git

https://gitee.com/renrenio/renren-fast-vue.gi

https://gitee.com/renrenio/renren-generator.git

 

2.將renren-fast代碼放到gulimall工程目錄下面,並在總工程的pom.xml引入renren-fast module.

 

3.執行renren-fast模塊種的db文件下的mysql.sql語句

注意,創建的數據庫的基字符集使用utf8mb4。

 

4.修改renren-fast的application-dev.yml語句中的如下信息

url: jdbc:mysql://172.0.1.xx:3306/gulimall_admin
username: root
password: 123456

 

啓動renren-fast應用

注意,這裏遇到一個錯誤,就是application-dev.yml文件中的com.alibaba.druid.pool.DruidDataSource 顯示紅色,出錯。
另外,一個就是RenrenApplication.java中String標紅,顯示需要導入包。原來是這個module沒有設置對應的jdk,設置一下jdk8就沒問題了。

 

5.安裝Node.js,配置npm使用淘寶鏡像

npm config set registry http://registry.npm.taobao.org/

 

6.用vscode打開renren-fast-vue代碼,在終端執行:npm install 下載安裝依賴,
如果下載出錯,可以使用cnpm install 下載,在下載完成後,執行:npm run dev 啓動

 

7.renren-generator代碼導入到我們的項目,並啓動

 

8.使用renren-generator結合renren-fast-vue,根據數據庫,反向生成product模塊代碼,並把main文件copy覆蓋product下面的main文件夾。

 

9..新建gulimall-common模塊,把公共的API等信息放到common模塊中,並解決product中代碼引用包的問題。

 

10.如法炮製,依次使用人人開源產生代碼,覆蓋main,並導入gulimall-common這類。

 

11.使用MyBatis-Plus,測試數據庫讀寫問題

(1)導入依賴,在gulimall-common模塊的pom.xml中加入:

<dependency>
	<groupId>com.baomidou</groupId>
	<artifactId>mybatis-plus-boot-starter</artifactId>
	<version>3.2.0</version>
</dependency>

(2)在gulimall-product的application.yml文件增加以下內容:

spring:
  datasource:
    username: root
    password: 123456
    url: jdbc:mysql://172.0.1.xx:3306/gulimall_pms?characterEncoding=UTF-8
    driver-class-name: com.mysql.cj.jdbc.Driver
    #driver-class-name: com.mysql.jdbc.Driver

mybatis-plus:
  mapper-locations: classpath*:/mapper/**/*.xml
  global-config:
    db-config:
      id-type: auto

(3)在GulimallProductApplicationTests.java中,如下:

@SpringBootTest
class GulimallProductApplicationTests {
    @Autowired
    BrandService brandService;

    @Test
    void contextLoads() {
//        BrandEntity brandEntity = new BrandEntity();
//        brandEntity.setBrandId(4L);
//        brandEntity.setDescript("華爲");

//        brandEntity.setName("華爲");
//        brandService.save(brandEntity);
//        System.out.println("保存成功...");

//        brandService.updateById(brandEntity);

        List<BrandEntity> list = brandService.list(new QueryWrapper<BrandEntity>().eq("brand_id", 4L));
        list.forEach((item) -> {
            System.out.println(item);
        });
    }

}

(4)啓動GulimallProductApplicationTests方法,依次測試上面的save方法,update方法,以及遍歷方法,可以看到數據庫中的數據是正確的。

(5)使用總結

/*
 1、整合MyBatis-Plus
 (1)、導入依賴
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.2.0</version>
        </dependency>
  (2)、配置
    1、配置數據源
        1)、導入數據庫的驅動
        2)、在application.yml配置數據源相關信息
    2、配置Mybatis-Plus
        1)、使用MapperScan
        2)、告訴MyBatis-Plus,sql映射文件位置
 */

注意,這裏有兩個問題:
(1)啓動整個測試類,application.yml中的driver-class-name: com.mysql.jdbc.Driver 提示報警,應該使用driver-class-name: com.mysql.cj.jdbc.Driver
(2)數據庫寫入出現亂碼,應該把application.yml中的url改爲:
url: jdbc:mysql://172.0.1.xx:3306/gulimall_pms?characterEncoding=UTF-8
 

至此,整個項目基本環境已經弄好了。

 

三、引入SpringCloudAlibaba組件

1.SpringCloudAlibaba版本引用

在gulimall-common的pom.xml文件中引入spring-cloud-alibaba,如下:

<dependencyManagement>
        <!-- spring cloud alibaba 2.1.0.RELEASE -->
        <dependencies>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2.1.0.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
</dependencyManagement>

 

2.引入Alibaba Nacos註冊中心

配置參考:https://github.com/alibaba/spring-cloud-alibaba/blob/master/spring-cloud-alibaba-examples/nacos-example/nacos-discovery-example/readme-zh.md

(1)引入Nacos Discovey,在gulimall-common的pom.xml文件中加上以下內容:

<dependency>
	<groupId>com.alibaba.cloud</groupId>
	<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

(2)下載Nacos server,我下載的是1.1.4版本,解壓後,執行bin目錄下面的startup.cmd文件啓動。

(3)在應用中配置指定Nacos server註冊中心地址,以gulimall-coupon模塊說明,在application.yml文件中添加如下內容:

spring:
    cloud:
        nacos:
          discovery:
            server-addr: 127.0.0.1:8848
    application:
    	name: gulimall-coupon

(4)使用@EnableDiscoveryClient註解開啓服務註冊於發現功能

(5)啓動gulimall-coupon服務(注意Nacos Server要先啓動),訪問本地連接:http://localhost:8848/nacos/#/serviceManagement?dataId=&group=&appName=&namespace=,會看到服務列表裏面出現gulimall-coupon

 

3.在gulimall-member遠程調用gulimall-coupon模塊的服務

(1)openfeign聲明式遠程調用引入,在gulimall-member模塊的pom.xml文件加入以下內容:

<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

(2)在CouponController.java加上遠程調用的方法實現

@RequestMapping("/member/list")
public R membercoupons() {
    CouponEntity couponEntity = new CouponEntity();
    couponEntity.setCouponName("滿100減50");
    return R.ok().put("coupons", Arrays.asList(couponEntity));
}

(3)在gulimall-member模塊下,建立一個接口CouponFeignService.java,並寫上上面實現的遠程調用的API。

package com.atguigu.gulimall.member.feign;

import com.atguigu.common.utils.R;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * 這是一個聲明式的遠程調用
 */
@FeignClient("gulimall-coupon")
public interface CouponFeignService {

    @RequestMapping("/coupon/coupon/member/list")
    public R membercoupons();
}

(4)在GulimallMemberApplication.java中添加@EnableFeignClients(basePackages = "com.atguigu.gulimall.member.feign") ,這個註解的作用是讓springcloud掃描com.atguigu.gulimall.member.feign包下的所有接口

/**
 * 1、想要遠程調用別的服務
 * 1)、引入open-feign
 * 2)、編寫一個接口,告訴SpringCloud這個接口需要調用遠程服務
 *  1、聲明接口的每一個方法都是調用哪個遠程服務的那個請求
 * 3)、開啓遠程調用功能
 */
@EnableFeignClients(basePackages = "com.atguigu.gulimall.member.feign")
@EnableDiscoveryClient
@SpringBootApplication
public class GulimallMemberApplication {

    public static void main(String[] args) {
        SpringApplication.run(GulimallMemberApplication.class, args);
    }

}

(5)在gulimall-member模塊下的controller數據包寫一個測試方法來調用這個遠程服務API,比如:在MemberController.java中寫一個測試方法,如下:

@Autowired
CouponFeignService couponFeignService;

@RequestMapping("/coupons")
public R test() {
    MemberEntity memberEntity = new MemberEntity();
    memberEntity.setNickname("張三");

    R membercoupons = couponFeignService.membercoupons();
    return R.ok().put("member", memberEntity).put("coupons", membercoupons.get("coupons"));
}

(6)啓動gulimall-coupon和gulimall-member這兩個微服務,訪問測試API的地址:http://localhost:8000/member/member/coupons,即可以看到能訪問到數據。

 

4.引入Alibaba Nacos配置中心

參考地址:https://github.com/alibaba/spring-cloud-alibaba/blob/master/spring-cloud-alibaba-examples/nacos-example/nacos-config-example/readme-zh.md

(1)導入Nacos配置中心,在gulimall-common的pom.xml文件中加上以下內容:

<dependency>
     <groupId>com.alibaba.cloud</groupId>
     <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
 </dependency>

(2)gulimall-coupon模塊西安的resource目錄下新建文件bootstrap.properties,內容如下:

spring.application.name=gulimall-coupon
spring.cloud.nacos.config.server-addr=127.0.0.1:8848

(3)在gulimall-coupon模塊下的application.properties中加入以下配置:

coupon.user.name=zhangsan
coupon.user.age=18

(4)寫測試方法,在CouponController.java中加入以下內容:

@Value("${coupon.user.name}")
private String name;

@Value("${coupon.user.age}")
private Integer age;

@RequestMapping("/test")
public R test() {
	return R.ok().put("name", name).put("age", age);
}

(5)啓動coupon服務,訪問鏈接:http://localhost:7000/coupon/coupon/test,即可以看到上面的配置
(6)但是,這種方法有一個問題,就是如果配置改變了,需要修改application.properties,並重啓coupon微服務,這是個不好的,所以我們引入了Nacos配置中心。根據啓動log,微服務可以從nacos讀取配置文件信息,默認的是:gulimall-coupon.properties。
(7)在http://localhost:8848/nacos的配置列表中,新建配置,Data Id爲:gulimall-coupon.properties,規則就是,應用名.properties,在裏面添加任意配置內容,比如:

coupon.user.name=zhangsan2
coupon.user.age=24

(8)在上面的test()方法所在的類上標註@RefreshScope,這樣,當Nacos配置中心的gulimall-coupon.properties配置內容修改了,微服務就可以動態的獲取到最新的配置信息,並且,這個優先級是高於微服務本身的配置的。
(9)使用Nacos作爲配置中心的使用總結如下:

/**
 * 1、如何使用Nacos作爲配置中心統一管理配置
 *  1)、引入依賴
 *  <dependency>
 *      <groupId>com.alibaba.cloud</groupId>
 *      <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
 *  </dependency>
 *  2)、創建一個bootstrap.properties,內容如下:
 *      spring.application.name=gulimall-coupon
 *      spring.cloud.nacos.config.server-addr=127.0.0.1:8848
 *  3)、需要給配置中心添加一個叫 數據庫集(Data Id)gulimall-coupon.properties,默認規則:yingyongming.properties
 *  4)、給應用名.properties添加任何配置
 *  5)、動態獲取配置。
 *      @RefreshScope:動態獲取並刷新配置
 *      @Value("${配置項的名}"):獲取到配置
 *      如果配置中心和當前應用的配置文件都配置了相同的項,優先使用配置中心的配置
 *
 */

 

5.Nacos作爲配置中心的更多細節用法
(1)爲了區分配置和隔離,Nacos引入了幾個概念:

  • 命名空間,用作配置隔離,默認:public(保留空間):默認新增的所有配置都在public空間,開發,測試,生產:利用命名空間來做環境隔離,或者,每一個微服務之間相互隔離配置,每個微服務都創建自己的命名空間,只加載自己命名空間下的所有配置。
  • 配置集以及配置ID,配置集就是所有配置的集合,配置集ID類似文件名,也就是Nacos 中的Data ID。
  • 配置分組,默認所有的配置分組都屬於:DEFAULT_GROUP,當然,也指定自己的配置分組,比如1111雙十一,618之類的。

在之前已經提到,在默認public命名空間,以及使用默認的分組DEFAULT_GROUP裏面,創建Data ID:gulimall-coupon.properties,然後在bootstrap.properties文件裏面添加指定Nacos的地址,就可以訪問默認的gulimall-coupon.properties裏面的配置信息了,這個是默認的規則。

但是,如果我們想要用自己的,不是default默認的配置怎麼處理呢?

比如還是gulimall-coupon.properties這個Data ID,但是放在了另外一個命名空間,比如是coupon(對應微服務模塊的名稱,可以每個微服務建立一個對應的命名空間),而且放在了一個prod分組裏面(類似的,同一個coupon命名空間下面,還可以建立dev分組,test分組等),那麼如何在微服務裏面指定訪問這個配置呢?答案是:在bootstrap.properties裏面添加指定對應的namespace和group,如下:

spring.application.name=gulimall-coupon

spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.cloud.nacos.config.namespace=9bc589c6-3f38-470b-af8d-fe84f04770ef
spring.cloud.nacos.config.group=prod

9bc589c6-3f38-470b-af8d-fe84f04770ef是Nacos上coupon命名空間對應的ID值。prod則對應prod這個配置分組,這樣,當微服務啓動時,如果要獲取的配置在Nacos配置中心有(也就是這裏的gulimall-coupon.properties)的話,那麼就優先使用配置中心的,否則,就會使用代碼中application.properties文件的配置。

(2)同時加載多個配置(新的知識點)
注意一下,我們之前是把所有的配置都放在了application.yml中,比如:

spring:
  datasource:
    username: root
    password: 123456
    url: jdbc:mysql://172.0.1.172:3306/gulimall_sms?characterEncoding=UTF-8
    driver-class-name: com.mysql.cj.jdbc.Driver
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
  application:
    name: gulimall-coupon

mybatis-plus:
  mapper-locations: classpath*:/mapper/**/*.xml
  global-config:
    db-config:
      id-type: auto

server:
  port: 7000

但是,如果配置很多的話,都同在同一個文件中的話,不好看,也不便於配置,所以,建議按照不同的作用寫到幾個配置文件中,而微服務也會從Nacos配置文件中讀取配置,並且Nacos也支持多配置文件讀取,那麼怎麼配置使用呢?
在上面我們提到了新建了coupon這個命名空間對應gulimall-coupon這個模塊,那麼我們把上面的application.yml配置按照不同的功能,拆分爲三個配置文件配置到Nacos中,放在coupon命名空間,dev配置分組下面,它們分別是:datasource.yml,內容如下:

spring:
  datasource:
    username: root
    password: 123456
    url: jdbc:mysql://172.0.1.xx:3306/gulimall_sms?characterEncoding=UTF-8
    driver-class-name: com.mysql.cj.jdbc.Driver

mybatis.yml文件,內容如下:

mybatis-plus:
  mapper-locations: classpath*:/mapper/**/*.xml
  global-config:
    db-config:
      id-type: auto

以及other.yml,內容如下:

spring:
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
  application:
    name: gulimall-coupon


server:
  port: 7000

而使用的話,很簡單,在上面bootstrap.properties文件的基礎上增加一下內容:

spring.cloud.nacos.config.ext-config[0].data-id=datasource.yml
spring.cloud.nacos.config.ext-config[0].group=dev
spring.cloud.nacos.config.ext-config[0].refresh=true

spring.cloud.nacos.config.ext-config[1].data-id=mybatis.yml
spring.cloud.nacos.config.ext-config[1].group=dev
spring.cloud.nacos.config.ext-config[1].refresh=true

spring.cloud.nacos.config.ext-config[2].data-id=other.yml
spring.cloud.nacos.config.ext-config[2].group=dev
spring.cloud.nacos.config.ext-config[2].refresh=true

分別制定要導入的配置名稱,所在的配置分組group,已經是否動態刷新(refresh)。
最好,把application.yml中的配置全部註釋掉,啓動coupon微服務,來驗證配置。可以發現,微服務能夠正常讀取Nacos中的這三個配置文件。
對於這兩部分內容,總結起來就是:

/**
 * 1、如何使用Nacos作爲配置中心統一管理配置
 *  1)、引入依賴
 *  <dependency>
 *      <groupId>com.alibaba.cloud</groupId>
 *      <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
 *  </dependency>
 *  2)、創建一個bootstrap.properties,內容如下:
 *      spring.application.name=gulimall-coupon
 *      spring.cloud.nacos.config.server-addr=127.0.0.1:8848
 *  3)、需要給配置中心添加一個叫 數據庫集(Data Id)gulimall-coupon.properties,默認規則:yingyongming.properties
 *  4)、給應用名.properties添加任何配置
 *  5)、動態獲取配置。
 *      @RefreshScope:動態獲取並刷新配置
 *      @Value("${配置項的名}"):獲取到配置
 *      如果配置中心和當前應用的配置文件都配置了相同的項,優先使用配置中心的配置
 *
 * 2、細節
 *  1)、命名空間,配置隔離
 *      默認:public(保留空間):默認新增的所有配置都在public空間
 *      1、開發,測試,生產:利用命名空間來做環境隔離
 *         注意,在bootstrap.properties 配置上,需要使用哪個命名空間下的配置。
 *         spring.cloud.nacos.config.namespace=32c4a90d-6ac4-4f04-b050-e09bbe7bd58f
 *      2、每一個微服務之間相互隔離配置,每個微服務都創建自己的命名空間,只加載自己命名空間下的所 
 *         有配置
 *
 *  2)、配置集:所有配置的集合
 *
 *  3)、配置集ID:類似文件名
 *      Data ID: 類似文件名
 *
 *  4)、配置分組:
 *      默認所有的配置集都屬於:DEFAULT_GROUP
 *      1111,618
 *
 *  每個微服務創建自己的命名空間,使用配置分組區分環境,dev、test、prod
 *
 *  3、同時加載多個配置文件
 *   1)、微服務任何配置信息,任何配置文件都可以放在配置中心中
 *   2)、只需要在bootstrp.properties說明加載配置中心那些配置文件即可
 *   3)、@Value、@ConfigurationProperties...
 *   以上SprintBoot任何方法從配置文件中獲取值,都能使用
 *   配置中心有的優先使用配置中心中的
 *
 */

 

6.SpringCloud Gateway網關
(1)Gateway網關簡單介紹
網關作爲流量的入口,常用功能包括路由轉發、權限校驗、流量控制等,而SpringCloud gateway作爲SpringCloud官方推出的第二代網關框架,取代了Zuul網關。
簡單一句話總結:先斷言(判斷請求是否符合某個路由規則),(如果符合了某個路由規則)再路由到指定地方,但在路由之前要先過濾。

官方文檔:https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.2.RELEASE/reference/html/

(2)引入gulimall-gateway模塊

新建gulimall-gateway模塊,用Spring Initaliz的方法,並導入gateway模塊,建好後,在pom.xml中導入gulimall-common的模塊依賴。

<dependency>
	<groupId>com.atguigu.gulimall</groupId>
	<artifactId>gulimall-common</artifactId>
	<version>0.0.1-SNAPSHOT</version>
</dependency>

gulimall-gateway模塊,同樣需要註冊到Nacos註冊中心和配置中心,下面先弄註冊到Nacos註冊中心的配置,需要在application.properties文件中指定Nacos註冊中心的地址

spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
spring.application.name=gulimall-gateway
server.port=88

而要使用Nacos配置中心,需要在bootstrap.properties文件中指定Nacos配置中心的地址:

spring.application.name=gulimall-gateway

spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.cloud.nacos.config.namespace=7df3fe8a-4e08-46d5-8535-da50e6834bfb

這裏的7df3fe8a-4e08-46d5-8535-da50e6834bfb是指Nacos配置中心的gateway命名空間所對應的ID。

最後,在application.yml中寫上gateway使用的配置規則,比如路由,斷言,過濾等。比如:

spring:
  cloud:
    gateway:
      routes:
        - id: test_route
          uri: https://www.baidu.com
          predicates:
            - Query=url,baidu
        - id: qq_route
          uri: https://www.qq.com
          predicates:
            - Query=url,qq

訪問:http://localhost:88/hello?url=qq,就會轉到這qq個url地址:https://www.qq.com/hello,同樣的,訪問:http://localhost:88/hello?url=baidu,就會轉到百度的url地址.

至此,關於的SpringCloud Alibaba的基本使用告一段落。

 

接下來,就是前端的基本知識學習,由於篇幅的限制等原因,就另外開專門開一篇文章來做前端的筆記。

尚硅谷2020微服務分佈式電商項目《穀粒商城》(Alibaba+Vue)開發教程學習筆記(二)

https://blog.csdn.net/ok_wolf/article/details/105456170

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章