SSM=Maven構建項目以及Maven分模塊構建項目

一.軟件開發常識

(1)項目開發流程

1. 立項
    項目可實施性分析:(某項目)100W項目,開發週期預計6個月,需要10人,運營(人力)成本2W/人
    產品經理入住銀行,進行需求調研《需求設計說明書》
    需求研討會:團隊所有成員參加

2. 設計
    UI/UE工程師:《頁面原型》
    架構師:統一開發環境,項目技術選項,項目架構設計,數據庫設計等等《概要設計說明書》
    產品經理:接口規範、方法規範、參數規範、步驟要求等等《詳細設計說明書》

3. 開發
    coding(編碼),碼農

4. 測試
    白盒測試:代碼邏輯和性能
    黑盒測試:用戶體驗
    灰盒測試:黑+白

5. 部署
    運維人員產品部署上傳維護....

(2)UML統一建模語言

統一建模語言(UML,UnifiedModelingLanguage)是面向對象軟件的標準化建模語言。

簡單來說:通過一些專業化的圖形,直觀的展示項目需求(用例圖、時序圖、類圖)等等。

用例圖: user case

  • 圖形化的形式展示項目中的所有功能,以及功能的參與者

設計工具PowerDesigner(PD)

  • 繪製用例圖、數據庫等

(3)開發環境:

jdk版本1.8

maven版本:3.5.2

mysql版本:5.7

(4)創建新的工作空間

設置sdk,以及其他:

整體項目編碼的設置

maven的設置

 

二.Maven:

(1)基礎回顧

Maven項目管理工具

依賴管理,項目構建

 

(2)Maven的依賴傳遞

什麼是依賴傳遞

在maven中,依賴是可以傳遞的,假設存在三個項目,分別是項目A,項目B以及項目C。假設A依賴B,B依賴C,那麼我們可以根據maven項目依賴的特徵不難推出項目A也依賴C。

如果我們項目直接依賴的座標過多,可能就會產生版本衝突問題:

 

(3) 如何解決依賴衝突問題?

 1.依賴調節原則:

第一聲明優先原則:

在 pom 文件中定義依賴,誰先聲明就用誰

 

路徑近者優先原則

在pom 文件中定義依賴,誰的路徑近就用誰

 

2.排除依賴

通過在pom文件中排除不需要的依賴jar包

3.版本鎖定

在pom文件中,直接指定項目依賴的所有版本號,導入依賴的時候就不需要指定版本

  1. properties中定義所有的公共版本號常量

  2. 通過dependencyManagement鎖定版本號:不會導入依賴jar包

  3. dependencies導入依賴:不需要指定版本號

<!--1.定義版本號常量-->
<properties>
    <spring.version>5.2.5.RELEASE</spring.version>
    <junit.version>4.12</junit.version>
</properties>
<!--2.版本鎖定-->
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>${junit.version}</version>
        </dependency>
    </dependencies>
</dependencyManagement>

<!--3.依賴管理-->
<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
    </dependency>
</dependencies>

三.Maven構建ssm項目

基於maven構建ssm工程,規範依賴管理。場景:查詢所有企業信息

(1)創建數據庫

(2)創建web模塊“

(3)導入相關依賴:

<!--統一版本號-->
    <properties>
        <spring.version>5.0.5.RELEASE</spring.version>
        <springmvc.version>5.0.5.RELEASE</springmvc.version>
        <mybatis.version>3.4.5</mybatis.version>
    </properties>

    <!--鎖定依賴版本-->
    <dependencyManagement>
        <dependencies>
            <!-- Mybatis -->
            <dependency>
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis</artifactId>
                <version>${mybatis.version}</version>
            </dependency>

            <!-- springMVC -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-webmvc</artifactId>
                <version>${springmvc.version}</version>
            </dependency>


            <!-- spring -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-aspects</artifactId>
                <version>${spring.version}</version>
            </dependency>

            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context-support</artifactId>
                <version>${spring.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-test</artifactId>
                <version>${spring.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-jdbc</artifactId>
                <version>${spring.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-tx</artifactId>
                <version>${spring.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>
    
    <!--添加依賴-->
    <dependencies>
        <!-- Mybatis和mybatis與spring的整合 -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>1.3.1</version>
        </dependency>

        <!-- MySql驅動 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.32</version>
        </dependency>

        <!-- druid數據庫連接池 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.0.9</version>
        </dependency>

        <!-- springMVC核心-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
        </dependency>

        <!-- spring相關 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
        </dependency>
        <!-- junit測試 -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>2.5</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.0</version>
            <scope>provided</scope>
        </dependency>

        <!-- jstl -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
		
		<dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.6</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
        <!-- 設置編譯版本爲1.8 -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.1</version >
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
                <encoding>UTF-8</encoding>
            </configuration>
        </plugin>
        </plugins>
    </build>

注意:自動導入

(3)搭建MyBatis

Company實體類:

@Data
public class Company implements Serializable {

    private String id; // 企業id
    private String name; // 企業名稱
    private Date expirationDate;  //到期時間
    private String address; // 企業地址
    private String licenseId; // 營業執照編號
    private String representative; // 法人代表
    private String phone; // 手機號
    private String companySize; // 企業規模
    private String industry; // 行業
    private String remarks; // 備註
    private Integer state; // 狀態
    private Double balance; // 餘額
    private String city; // 城市
}

CompanyDao接口和映射文件

public interface CompanyDao {
  
    // 查詢所有
    List<Company> findAll();
}

同時在resources文件夾創建映射文件“

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.wsl.dao.company.CompanyDao">

    <resultMap id="BaseResultMap" type="com.wsl.domain.company.Company">
        <id column="id" property="id"></id>
        <!--把不一樣的字段,改一下-->
        <result column="expiration_date" property="expirationDate"></result>
        <result column="license_id" property="licenseId"></result>
        <result column="company_size" property="companySize"></result>
    </resultMap>

    <select id="findAll" resultMap="BaseResultMap">
        SELECT * FROM ss_company
    </select>
</mapper>

spring整合MyBatis

jdbc.properties

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/saas?characterEncoding=utf-8&useSSL=false
jdbc.username=root
jdbc.password=root

applicationContext-dao.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="
       	http://www.springframework.org/schema/beans
		http://www.springframework.org/schema/beans/spring-beans.xsd
       	http://www.springframework.org/schema/context
		http://www.springframework.org/schema/context/spring-context.xsd">

    <!--druid連接池-->
    <context:property-placeholder location="classpath:jdbc.properties"/>

    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="${jdbc.driver}"></property>
        <property name="url" value="${jdbc.url}"></property>
        <property name="username" value="${jdbc.username}"></property>
        <property name="password" value="${jdbc.password}"></property>
    </bean>

    <!-- 讓spring管理sqlsessionfactory 使用mybatis和spring整合包中的 -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!-- 數據庫連接池 -->
        <property name="dataSource" ref="dataSource" />
        <property name="typeAliasesPackage" value="com.wsl.domain"></property>
    </bean>

    <!-- mapper掃描器 :用來產生代理對象-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.wsl.dao"></property>
    </bean>
</beans>

測試:

@RunWith(SpringRunner.class)
@ContextConfiguration("classpath:spring/applicationContext-dao.xml")
public class MyBatisTest {

    @Autowired
    private CompanyDao companyDao;

    @Test
    public void testFindAll()throws Exception{
        List<Company> list = companyDao.findAll();
        System.out.println(list);
    }
}

 

(4)搭建spring

CompanyService接口和實現

public interface CompanyService {
    
    // 查詢所有
    List<Company> findAll();
}

applicationContext-service.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
      http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">


    <!--開啓註解組件掃描-->
    <context:component-scan base-package="com.wsl.service"/>



</beans>

applicationContext-tx.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd

       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
      http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">


    <!--配置事務-->
    <!--1.事務管理器-->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"></property>
    </bean>
    <!--2.事務通知-->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="find*" read-only="true"/>
            <tx:method name="save*" read-only="false" propagation="REQUIRED"/>
            <tx:method name="update*" read-only="false" propagation="REQUIRED"/>
            <tx:method name="delete*" read-only="false" propagation="REQUIRED"/>
            <tx:method name="*" read-only="false" propagation="REQUIRED"/>
        </tx:attributes>
    </tx:advice>
    <!--3.aop-->
    <aop:config>
        <aop:pointcut id="pt" expression="execution( * com.wsl.service..*.*(..))"></aop:pointcut>
        <aop:advisor advice-ref="txAdvice" pointcut-ref="pt"></aop:advisor>
    </aop:config>

</beans>

測試:

@RunWith(SpringRunner.class)
@ContextConfiguration("classpath:spring/applicationContext-*.xml")
public class SpringTest {

    @Autowired
    private CompanyService companyService;

    @Test
    public void testFindAll()throws Exception{
        List<Company> list = companyService.findAll();
        System.out.println(list);
    }
}

 

(5)搭建SpringMVC

1.頁面資源導入“

2.CompanyController和頁面

@Controller
@RequestMapping(value = "/company", name = "企業管理")
public class CompanyController {

    @Autowired
    private CompanyService companyService;

    @RequestMapping(value = "/list", name = "查詢列表")
    public String list(HttpServletRequest request) {
        List<Company> list = companyService.findAll();
        request.setAttribute("list", list);
        return "company/company-list";
    }
}

3.spring-mvc.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">


    <!--開啓註解組件掃描-->
    <context:component-scan base-package="com.wsl.web"/>

    <!--mvc註解支持-->
    <mvc:annotation-driven/>


    <!--視圖解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/pages/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
</beans>

4.web.xml

前端控制器,過濾器,監聽器

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	version="2.5">
	<!--前端控制器-->
	<servlet>
		<servlet-name>springmvc</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<!-- 指定加載的配置文件 ,通過參數contextConfigLocation加載-->
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>classpath:spring/spring-mvc.xml</param-value>
		</init-param>
		<load-on-startup>4</load-on-startup>
	</servlet>

	<servlet-mapping>
		<servlet-name>springmvc</servlet-name>
		<url-pattern>*.do</url-pattern>
	</servlet-mapping>

	<!-- 監聽器監聽其他的spring配置文件 -->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<!--
			classpath:掃描當前工程類路徑下的配置文件
			classpath*:掃描當前工程和依賴工程類路徑下的配置文件
		-->
		<param-value>classpath*:spring/applicationContext-*.xml</param-value>
	</context-param>
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>



	<!-- 解決post亂碼 -->
	<filter>
		<filter-name>CharacterEncodingFilter</filter-name>
		<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
		<init-param>
			<param-name>encoding</param-name>
			<param-value>utf-8</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>CharacterEncodingFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
</web-app>

5.部署測試

完整的項目結構見開始

 

四.Maven分模塊構建:

什麼是分模塊構建

常見的拆分方式有兩種:

  • 按照業務模塊進行拆分,每個模塊拆分成一個maven工程,例如將一個項目分爲用戶模塊、訂單模塊、購物車模塊等,每個模塊對應就是一個maven工程

  • 按照進行拆分,例如持久層、業務層、表現層等,每個層對應就是一個maven工程

不管是上面哪種拆分方式,通常都會提供一個父工程,將一些公共的代碼和配置提取到父工程中進行統一管理和配置。

(1)Maven工程繼承

在Java語言中,類之間是可以繼承的,通過繼承,子類就可以引用父類中非private的屬性和方法。

同樣,在maven工程之間也可以繼承,子工程繼承父工程後,就可以使用在父工程中引入的依賴。繼承的目的是爲了消除重複代碼

創建父工程

創建子模塊

(2)Maven工程聚合

在maven工程的pom.xml文件中可以使用<modules>標籤將其他maven工程聚合到一起,聚合的目的是爲了進行統一操作

注意,不是子工程也可以聚合在一起,統一管理...

一般情況下,父工程都會作爲聚合工程,管理自己的子模塊...

 

五.分模塊構建SSM工程

改造剛纔的ssm工程爲分模塊開發

(1)創建一個父工程

(2)export_commons

(3)export_domain

(4) export_dao

(5)export_system_dao

(6)export_manager_web

子模塊之間的傳遞依賴思想

測試:

同樣配置服務器部署

 

 

六.Maven私服

說明:

maven倉庫分爲本地倉庫和遠程倉庫,而遠程倉庫又分爲maven中央倉庫、其他遠程倉庫和私服。

maven私服就是公司局域網內的maven遠程倉庫,每個員工的電腦上安裝maven軟件並且連接maven私服,程序員可以將自己開發的項目打成jar併發布到私服,其它項目組成員就可以從私服下載所依賴的jar。私服還充當一個代理服務器的角色,當私服上沒有jar包時會從maven中央倉庫自動下載。

例如:進入企業開發,不同的項目組開發不同的工程

  • A團隊:export_dao工程開發完畢,發佈到私服。

  • B團隊:export_system_service從私服下載export_dao

(1)nexus 搭建私服環境

nexus 是一個maven倉庫管理器(其實就是一個軟件),nexus可以充當maven私服,同時nexus還提供強大的倉庫管理、構件搜索等功能

- 下載:
	http://www.sonatype.org/nexus/archived/
	
- 安裝:
	1.解壓:nexus-2.14.10-01-bundle.zip
	2.進入解壓後的bin目錄,打開cmd窗口
	3.執行nexus.bat install
		注意:需要以管理員身份運行cmd命令
	
- 卸載:
	cmd進入bin目錄執行nexus.bat uninstall
		注意:需要以管理員身份運行cmd命令
		
- 啓動:
	方式一:cmd進入bin目錄,執行nexus.bat start
	方式二:在Windows系統服務中啓動nexus
	
- 訪問:
	http://localhost:8081/nexus
		用戶名:admin
		密碼:admin123

 

(2)倉庫類型

通過前面的倉庫列表可以看到,nexus默認內置了很多倉庫,這些倉庫可以劃分爲4種類型,每種類型的倉庫用於存放特定的jar包,具體說明如下:

1. hosted,宿主倉庫
	部署自己的jar到這個類型的倉庫,包括Releases和Snapshots兩部分
		Releases爲公司內部發布版本倉庫、 Snapshots爲公司內部測試版本倉庫 

2. proxy,代理倉庫
	用於代理遠程的公共倉庫,如maven中央倉庫,用戶連接私服,私服自動去中央倉庫下載jar包或者插件

3. group,倉庫組
	用來合併多個hosted/proxy倉庫,通常我們配置自己的maven連接倉庫組

4. virtual(虛擬):兼容Maven1版本的jar或者插件

 

(3)將項目發佈到私服

在maven的setting.xml文件中配置:

<server>
    <id>releases</id>
    <username>admin</username>
    <password>admin123</password>
</server>
<server>
    <id>snapshots</id>
    <username>admin</username>
    <password>admin123</password>
</server>

在需要發佈工程的pom.xml文件中配置:

<distributionManagement>
    <repository>
        <id>releases</id>
        <url>http://localhost:8081/nexus/content/repositories/releases/</url>
    </repository>
    <snapshotRepository>
        <id>snapshots</id>
        <url>http://localhost:8081/nexus/content/repositories/snapshots/</url>
    </snapshotRepository>
</distributionManagement>

在需要發佈的工程執行deploy

在部署之前,一定要安裝到本地倉庫,才能上傳到私服

 

(4)從私服下載jar包

在maven的setting.xml文件中配置

<profile>
    <id>dev</id>
    <repositories>
        <repository>
            <id>nexus</id>
            <!--倉庫地址,即nexus倉庫組的地址-->
            <url>
                http://localhost:8081/nexus/content/groups/public/</url>
            <!--是否下載releases構件-->
            <releases>
                <enabled>true</enabled>
            </releases>
            <!--是否下載snapshots構件-->
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
        </repository>
    </repositories>
    <pluginRepositories>
        <!-- 插件倉庫,maven的運行依賴插件,也需要從私服下載插件 -->
        <pluginRepository>
            <id>public</id>
            <name>Public Repositories</name>
            <url>
                http://localhost:8081/nexus/content/groups/public/
            </url>
        </pluginRepository>
    </pluginRepositories>
</profile>

激活

<activeProfiles>
    <activeProfile>dev</activeProfile>
</activeProfiles>

注意,要想實現私服的下載,必須先刪除本地倉庫jar包.

 

資料:

私服搭建:https://www.cnblogs.com/knowledgesea/p/11190579.html

https://blog.csdn.net/gyshun/article/details/79297460

maven分模塊搭建項目:https://blog.csdn.net/javanotes/article/details/81128020

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