ssh_crm:客戶列表、BaseDao封裝

客戶列表

分析:

步驟:

1.封裝PageBean


package cn.itcast.utils;

import java.util.List;

public class PageBean {
	//當前頁數
	private Integer currentPage;
	//總記錄數
	private Integer totalCount;
	//每頁顯示條數
	private Integer pageSize;
	//總頁數
	private Integer totalPage;
	//分頁列表數據
	private List	list;
	public PageBean(Integer currentPage, Integer totalCount, Integer pageSize) {
		this.totalCount = totalCount;
		
		this.pageSize =  pageSize;
		
		this.currentPage = currentPage;
		
		if(this.currentPage == null){
			//如頁面沒有指定顯示那一頁.顯示第一頁.
			this.currentPage = 1;
		}
		
		if(this.pageSize == null){
			//如果每頁顯示條數沒有指定,默認每頁顯示3條
			this.pageSize = 3;
		}
		
		//計算總頁數
		this.totalPage = (this.totalCount+this.pageSize-1)/this.pageSize;
		
		//判斷當前頁數是否超出範圍
		//不能小於1
		if(this.currentPage < 1){
			this.currentPage = 1;
		}
		//不能大於總頁數
		if(this.currentPage > this.totalPage){
			this.currentPage = this.totalPage;
		}
		
	}
	//計算起始索引
	public int getStart(){
		return (this.currentPage-1)*this.pageSize;
	}
	
	public Integer getCurrentPage() {
		return currentPage;
	}
	public void setCurrentPage(Integer currentPage) {
		this.currentPage = currentPage;
	}
	public Integer getTotalCount() {
		return totalCount;
	}
	public void setTotalCount(Integer totalCount) {
		this.totalCount = totalCount;
	}
	public Integer getPageSize() {
		return pageSize;
	}
	public void setPageSize(Integer pageSize) {
		this.pageSize = pageSize;
	}
	public Integer getTotalPage() {
		return totalPage;
	}
	public void setTotalPage(Integer totalPage) {
		this.totalPage = totalPage;
	}
	public List getList() {
		return list;
	}
	public void setList(List list) {
		this.list = list;
	}
	
	
	
	
	
	
}


2.書寫Action

package cn.itcast.web.action;

import org.apache.commons.lang3.StringUtils;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Restrictions;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;

import cn.itcast.domain.Customer;
import cn.itcast.domain.User;
import cn.itcast.service.CustomerService;
import cn.itcast.service.UserService;
import cn.itcast.utils.PageBean;

public class CustomerAction extends ActionSupport implements ModelDriven<Customer> {
	private Customer customer = new Customer();
	
	private CustomerService cs;

	private Integer currentPage;
	private Integer pageSize;
	public String list() throws Exception {
		//封裝離線查詢對象
		DetachedCriteria dc = DetachedCriteria.forClass(Customer.class);
		//判斷並封裝參數
		if(StringUtils.isNotBlank(customer.getCust_name())){
			dc.add(Restrictions.like("cust_name", "%"+customer.getCust_name()+"%"));
		}
		
		//1 調用Service查詢分頁數據(PageBean)
		PageBean pb = cs.getPageBean(dc,currentPage,pageSize);
		//2 將PageBean放入request域,轉發到列表頁面顯示
		ActionContext.getContext().put("pageBean", pb);
		return "list";
	}

	@Override
	public Customer getModel() {
		return customer;
	}

	public void setCs(CustomerService cs) {
		this.cs = cs;
	}

	public Integer getCurrentPage() {
		return currentPage;
	}

	public void setCurrentPage(Integer currentPage) {
		this.currentPage = currentPage;
	}

	public Integer getPageSize() {
		return pageSize;
	}

	public void setPageSize(Integer pageSize) {
		this.pageSize = pageSize;
	}

	
	
}


3.書寫Service

package cn.itcast.service.impl;

import java.util.List;

import org.hibernate.criterion.DetachedCriteria;

import cn.itcast.dao.CustomerDao;
import cn.itcast.domain.Customer;
import cn.itcast.service.CustomerService;
import cn.itcast.utils.PageBean;

public class CustomerServiceImpl implements CustomerService {
	private CustomerDao cd;
	@Override
	public PageBean getPageBean(DetachedCriteria dc, Integer currentPage, Integer pageSize) {
		//1 調用Dao查詢總記錄數
		Integer totalCount = cd.getTotalCount(dc);
		//2 創建PageBean對象
		PageBean pb = new PageBean(currentPage, totalCount, pageSize);
		//3 調用Dao查詢分頁列表數據
		
		List<Customer> list = cd.getPageList(dc,pb.getStart(),pb.getPageSize());
		//4 列表數據放入pageBean中.並返回
		pb.setList(list);
		return pb;
	}
	public void setCd(CustomerDao cd) {
		this.cd = cd;
	}

}


4.書寫Dao


package cn.itcast.dao.impl;

import java.util.List;

import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Projections;
import org.springframework.orm.hibernate5.support.HibernateDaoSupport;

import cn.itcast.dao.CustomerDao;
import cn.itcast.domain.Customer;

public class CustomerDaoImpl extends HibernateDaoSupport implements CustomerDao {

	public Integer getTotalCount(DetachedCriteria dc) {
		
		dc.setProjection(Projections.rowCount());
		List<Long> list = (List<Long>) super.getHibernateTemplate().findByCriteria(dc);
		dc.setProjection(null);
		if(list!=null && list.size()>0) {
			return list.get(0).intValue();
		}else {
			
			return null;
		}
	}

	public List<Customer> getPageList(DetachedCriteria dc, int start, Integer pageSize) {
		
		List<Customer> list = (List<Customer>) super.getHibernateTemplate().findByCriteria(dc,start,pageSize);
		
		return list;
	}

}


5.完成strutx以及spring的配置

<?xml version="1.0" encoding="UTF-8"?>
  <!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
	"http://struts.apache.org/dtds/struts-2.3.dtd">
	
<struts>
	<!-- #  struts.objectFactory = spring	將action的創建交給spring容器	
			struts.objectFactory.spring.autoWire = name spring負責裝配Action依賴屬性
			-->
	<constant name="struts.objectFactory" value="spring"></constant>

	<package name="crm" namespace="/" extends="struts-default" >
		<global-exception-mappings>
			<exception-mapping result="error" exception="java.lang.RuntimeException"></exception-mapping>
		</global-exception-mappings>
	
		<!-- 整合方案1:class屬性上仍然配置action的完整類名
				struts2仍然創建action,由spring負責組裝Action中的依賴屬性
		 -->
		 <!-- 
		 	整合方案2:class屬性上填寫spring中action對象的BeanName
		 		完全由spring管理action生命週期,包括Action的創建
		 		注意:需要手動組裝依賴屬性
		  -->
		<action name="UserAction_*" class="userAction" method="{1}" >
			<result name="toHome" type="redirect" >/index.htm</result>
			<result name="error" >/login.jsp</result>
		</action>
		
		<action name="CustomerAction_*" class="customerAction" method="{1}" >
			<result name="list"  >/jsp/customer/list.jsp</result>
		</action>
	</package>
</struts>
	



<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		xmlns="http://www.springframework.org/schema/beans" 
		xmlns:context="http://www.springframework.org/schema/context"
		xmlns:aop="http://www.springframework.org/schema/aop" 
		xmlns:tx="http://www.springframework.org/schema/tx"
		xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd 
							http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd 
							http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd 
							http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd ">
	
	<!-- 讀取db.properties文件 -->
	<context:property-placeholder location="classpath:db.properties" />
	<!-- 配置c3p0連接池 -->
	<bean name="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" >
		<property name="jdbcUrl" value="${jdbc.jdbcUrl}" ></property>
		<property name="driverClass" value="${jdbc.driverClass}" ></property>
		<property name="user" value="${jdbc.user}" ></property>
		<property name="password" value="${jdbc.password}" ></property>
	</bean>
	
	<!-- 核心事務管理器 -->
	<bean name="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager" >
		<property name="sessionFactory" ref="sessionFactory" ></property>
	</bean>
	
	<!-- 配置通知 -->
	<!-- <tx:advice id="txAdvice" transaction-manager="transactionManager" >
		<tx:attributes>
			<tx:method name="save*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false" />
			<tx:method name="persist*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false" />
			<tx:method name="update*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false" />
			<tx:method name="modify*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false" />
			<tx:method name="delete*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false" />
			<tx:method name="remove*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false" />
			<tx:method name="get*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="true" />
			<tx:method name="find*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="true" />
		</tx:attributes>
	</tx:advice> -->
	<!-- 配置將通知織入目標對象
	配置切點
	配置切面 -->
	<!-- <aop:config>
		<aop:pointcut expression="execution(* cn.itcast.service.impl.*ServiceImpl.*(..))" id="txPc"/>
		<aop:advisor advice-ref="txAdvice" pointcut-ref="txPc" />
	</aop:config> -->
	<!-- ========================================================================================= -->
	<!-- 開啓註解事務 -->
	<tx:annotation-driven transaction-manager="transactionManager" />
	
	<!-- 將SessionFactory配置到spring容器中 -->
	<!-- 加載配置方案1:仍然使用外部的hibernate.cfg.xml配置信息 -->
	<!-- <bean name="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean" >
		<property name="configLocation" value="classpath:hibernate.cfg.xml" ></property>
	</bean> -->
	<!-- 加載配置方案2:在spring配置中放置hibernate配置信息 -->
	<bean name="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean" >
		<!-- 將連接池注入到sessionFactory, hibernate會通過連接池獲得連接 -->
		<property name="dataSource" ref="dataSource" ></property>
		<!-- 配置hibernate基本信息 -->
		<property name="hibernateProperties">
			<props>
				<!--  必選配置 -->
			<!-- 	<prop key="hibernate.connection.driver_class" >com.mysql.jdbc.Driver</prop>
				<prop key="hibernate.connection.url" >jdbc:mysql:///crm_32</prop>
				<prop key="hibernate.connection.username" >root</prop>
				<prop key="hibernate.connection.password" >1234</prop> -->
				<prop key="hibernate.dialect" >org.hibernate.dialect.MySQLDialect</prop>
				
				<!--  可選配置 -->
				<prop key="hibernate.show_sql" >true</prop>
				<prop key="hibernate.format_sql" >true</prop>
				<prop key="hibernate.hbm2ddl.auto" >update</prop>
			</props>
		</property>
		<!-- 引入orm元數據,指定orm元數據所在的包路徑,spring會自動讀取包中的所有配置 -->
		<property name="mappingDirectoryLocations" value="classpath:cn/itcast/domain" ></property>
	</bean>
	
	<!-- action -->
	<!-- 注意:Action對象作用範圍一定是多例的.這樣才符合struts2架構 -->
	<bean name="userAction" class="cn.itcast.web.action.UserAction" scope="prototype" >
		<property name="userService" ref="userService" ></property>
	</bean>
	<bean name="customerAction" class="cn.itcast.web.action.CustomerAction" scope="prototype" >
		<property name="cs" ref="customerService" ></property>
	</bean>
	<!-- service -->
	<bean name="userService" class="cn.itcast.service.impl.UserServiceImpl" >
		<property name="ud" ref="userDao" ></property>
	</bean>
	<bean name="customerService" class="cn.itcast.service.impl.CustomerServiceImpl" >
		<property name="cd" ref="customerDao" ></property>
	</bean>
	<!-- dao -->
	<bean name="userDao" class="cn.itcast.dao.impl.UserDaoImpl" >
		<!-- 注入sessionFactory -->
		<property name="sessionFactory" ref="sessionFactory" ></property>
	</bean>
	<bean name="customerDao" class="cn.itcast.dao.impl.CustomerDaoImpl" >
		<!-- 注入sessionFactory -->
		<property name="sessionFactory" ref="sessionFactory" ></property>
	</bean>
</beans>




6.書寫前臺list.jsp頁面


1)顯示客戶列表


2)顯示共幾條記錄幾頁



3)顯示select選項 每頁顯示條數



4)顯示當前頁



5)點擊篩選、下一頁、上一頁、go  跳轉到顯示頁面

分析:點擊其中的一個都會觸發事件,重新請求aciton獲得pageBean,並顯示

:請求action需要3個參數:customer.cust_name、 currentPage、pageSize


上一頁、下一頁、go實現步驟:

(1).重新設置form表單位置,並加上2個隱藏域,作爲數據傳遞



(2).設置上一頁、下一頁、go 觸發的點擊事件函數changePage,並攜帶參數


(3).編寫點擊事件函數changPage



點擊篩選步驟:

(1)加入onchange事件changePageSize函數 並攜帶參數 (注意JQuery取值方法)


(2)編寫changePageSize函數


<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib  prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<TITLE>客戶列表</TITLE> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<LINK href="${pageContext.request.contextPath }/css/Style.css" type=text/css rel=stylesheet>
<LINK href="${pageContext.request.contextPath }/css/Manage.css" type=text/css
	rel=stylesheet>
<script type="text/javascript" src="${pageContext.request.contextPath }/js/jquery-1.4.4.min.js"></script>
<SCRIPT language=javascript>
	function changePage(pageNum){
		//將頁碼值放在對應表單中
		$("#currentPageInput").val(pageNum);
		//提交表單
		$("#pageForm").submit();
	}
	
	function changePageSize(pageSize){
		//將每頁顯示條數值放在對應表單中
		$("#pageSizeInput").val(pageSize);
		//提交表單
		$("#pageForm").submit();
	}
	
</SCRIPT>

<META content="MSHTML 6.00.2900.3492" name=GENERATOR>
</HEAD>
<BODY>
		
		<TABLE cellSpacing=0 cellPadding=0 width="98%" border=0>
			<TBODY>
				<TR>
					<TD width=15><IMG src="${pageContext.request.contextPath }/images/new_019.jpg"
						border=0></TD>
					<TD width="100%" background="${pageContext.request.contextPath }/images/new_020.jpg"
						height=20></TD>
					<TD width=15><IMG src="${pageContext.request.contextPath }/images/new_021.jpg"
						border=0></TD>
				</TR>
			</TBODY>
		</TABLE>
		<TABLE cellSpacing=0 cellPadding=0 width="98%" border=0>
			<TBODY>
				<TR>
					<TD width=15 background=${pageContext.request.contextPath }/images/new_022.jpg><IMG
						src="${pageContext.request.contextPath }/images/new_022.jpg" border=0></TD>
					<TD vAlign=top width="100%" bgColor=#ffffff>
						<TABLE cellSpacing=0 cellPadding=5 width="100%" border=0>
							<TR>
								<TD class=manageHead>當前位置:客戶管理 > 客戶列表</TD>
							</TR>
							<TR>
								<TD height=2></TD>
							</TR>
						</TABLE>
						<TABLE borderColor=#cccccc cellSpacing=0 cellPadding=0
							width="100%" align=center border=0>
							<TBODY>
								<TR>
									<TD height=25>
									<!-- 修改id以便取出 -->
									<FORM id="pageForm" name="customerForm"
										action="${pageContext.request.contextPath }/CustomerAction_list"
										method=post>
										<!-- 隱藏域 當前頁  注意value值回顯-->
										<input type="hidden" name="currentPage" id="currentPageInput" value="<s:property value='#pageBean.currentPage'/>" />
										<!-- 隱藏域  每頁顯示條數 注意value值回顯-->
										<input type="hidden" name="pageSize" id="pageSizeInput" value="<s:property value='#pageBean.pageSize'/>" />
										<TABLE cellSpacing=0 cellPadding=2 border=0>
											<TBODY>
												<TR>
													<TD>客戶名稱:</TD>
													<TD><INPUT class=textbox id=sChannel2
														style="WIDTH: 80px" maxLength=50 name="cust_name" value="${param.cust_name}"></TD>
													
													<TD><INPUT class=button id=sButton2 type=submit
														value=" 篩選 " name=sButton2></TD>
												</TR>
											</TBODY>
										</TABLE>
									</FORM>	
									</TD>
								</TR>
							    
								<TR>
									<TD>
										<TABLE id=grid
											style="BORDER-TOP-WIDTH: 0px; FONT-WEIGHT: normal; BORDER-LEFT-WIDTH: 0px; BORDER-LEFT-COLOR: #cccccc; BORDER-BOTTOM-WIDTH: 0px; BORDER-BOTTOM-COLOR: #cccccc; WIDTH: 100%; BORDER-TOP-COLOR: #cccccc; FONT-STYLE: normal; BACKGROUND-COLOR: #cccccc; BORDER-RIGHT-WIDTH: 0px; TEXT-DECORATION: none; BORDER-RIGHT-COLOR: #cccccc"
											cellSpacing=1 cellPadding=2 rules=all border=0>
											<TBODY>
												<TR
													style="FONT-WEIGHT: bold; FONT-STYLE: normal; BACKGROUND-COLOR: #eeeeee; TEXT-DECORATION: none">
													<TD>客戶名稱</TD>
													<TD>客戶級別</TD>
													<TD>客戶來源</TD>
													<TD>聯繫人</TD>
													<TD>電話</TD>
													<TD>手機</TD>
													<TD>操作</TD>
												</TR>
												<!-- struts表達式取出pageBean對象,並遍歷出list屬性 -->
												<s:iterator value="#pageBean.list" var="cust" >
												<TR 		
													style="FONT-WEIGHT: normal; FONT-STYLE: normal; BACKGROUND-COLOR: white; TEXT-DECORATION: none">
													<TD>
														<s:property value="#cust.cust_name" />
													</TD>
													<TD>
													<s:property value="#cust.cust_level" />
													</TD>
													<TD>
													<s:property value="#cust.cust_source" />
													</TD>
													<TD>
													<s:property value="#cust.cust_linkman" />
													</TD>
													<TD>
													<s:property value="#cust.cust_phone" />
													</TD>
													<TD>
													<s:property value="#cust.cust_mobile" />
													</TD>
													<TD>
													<a href="${pageContext.request.contextPath }/customerServlet?method=edit&custId=${customer.cust_id}">修改</a>
													  
													<a href="${pageContext.request.contextPath }/customerServlet?method=delete&custId=${customer.cust_id}">刪除</a>
													</TD>
												</TR>
												</s:iterator>
												<%-- <s:iterator value="#list"  >
												<TR 		
													style="FONT-WEIGHT: normal; FONT-STYLE: normal; BACKGROUND-COLOR: white; TEXT-DECORATION: none">
													<TD>
														<s:property value="cust_name" />
													</TD>
													<TD>
													<s:property value="cust_level" />
													</TD>
													<TD>
													<s:property value="cust_source" />
													</TD>
													<TD>
													<s:property value="cust_linkman" />
													</TD>
													<TD>
													<s:property value="cust_phone" />
													</TD>
													<TD>
													<s:property value="cust_mobile" />
													</TD>
													<TD>
													<a href="${pageContext.request.contextPath }/customerServlet?method=edit&custId=${customer.cust_id}">修改</a>
													  
													<a href="${pageContext.request.contextPath }/customerServlet?method=delete&custId=${customer.cust_id}">刪除</a>
													</TD>
												</TR>
												</s:iterator> --%>
												<%-- <c:forEach items="${list }" var="customer">
												<TR 		
													style="FONT-WEIGHT: normal; FONT-STYLE: normal; BACKGROUND-COLOR: white; TEXT-DECORATION: none">
													<TD>${customer.cust_name }</TD>
													<TD>${customer.cust_level }</TD>
													<TD>${customer.cust_source }</TD>
													<TD>${customer.cust_linkman }</TD>
													<TD>${customer.cust_phone }</TD>
													<TD>${customer.cust_mobile }</TD>
													<TD>
													<a href="${pageContext.request.contextPath }/customerServlet?method=edit&custId=${customer.cust_id}">修改</a>
													  
													<a href="${pageContext.request.contextPath }/customerServlet?method=delete&custId=${customer.cust_id}">刪除</a>
													</TD>
												</TR>
												
												</c:forEach> --%>

											</TBODY>
										</TABLE>
									</TD>
								</TR>
								
								<TR>
									<TD><SPAN id=pagelink>
											<DIV
												style="LINE-HEIGHT: 20px; HEIGHT: 20px; TEXT-ALIGN: right">
												<!-- struts取出總條數與總頁數 -->
												共[<B><s:property value="#pageBean.totalCount" /></B>]條記錄,[<B><s:property value="#pageBean.totalPage" /></B>]頁
												,每頁顯示
												<!-- struts 取出並判斷值,並按照值設置select選中該option -->
												<%-- $('pageSizeSelect option').filter(':selected').val() --%>
												<select name="pageSize" οnchange="changePageSize($('#pageSizeSelect option:selected').val())" id="pageSizeSelect" >
													<option value="3" <s:property value="#pageBean.pageSize==3?'selected':''" />>3</option>
													<option value="5" <s:property value="#pageBean.pageSize==5?'selected':''" />>5</option>
												</select>
												條
												<!-- 上一頁點擊事件 -->
												[<A href="javascript:void(0);" οnclick="changePage(<s:property value='#pageBean.currentPage-1' />)" >前一頁</A>]
												<!-- struts 顯示當前頁 -->
												<B><s:property value="#pageBean.currentPage" /></B>
												<!-- 下一頁點擊事件 -->
												[<A href="javascript:void(0);" οnclick="changePage(<s:property value='#pageBean.currentPage+1' />)"  >後一頁</A>] 
												<!-- struts 顯示當前頁 -->
												<!-- go 點擊事件 -->
												到
												<input type="text" size="3" id="page" name="page" value="<s:property value='#pageBean.currentPage' />"/>
												頁
												<input type="button" value="Go" οnclick="changePage($('#page').val())" />
											</DIV>
									</SPAN></TD>
								</TR>
							</TBODY>
						</TABLE>
					</TD>
					<TD width=15 background="${pageContext.request.contextPath }/images/new_023.jpg"><IMG
						src="${pageContext.request.contextPath }/images/new_023.jpg" border=0></TD>
				</TR>
			</TBODY>
		</TABLE>
		<TABLE cellSpacing=0 cellPadding=0 width="98%" border=0>
			<TBODY>
				<TR>
					<TD width=15><IMG src="${pageContext.request.contextPath }/images/new_024.jpg"
						border=0></TD>
					<TD align=middle width="100%"
						background="${pageContext.request.contextPath }/images/new_025.jpg" height=15></TD>
					<TD width=15><IMG src="${pageContext.request.contextPath }/images/new_026.jpg"
						border=0></TD>
				</TR>
			</TBODY>
		</TABLE>
</BODY>
</HTML>

BaseDao封裝

抽取BaseDao




BaseDao設計思路



BaseDao接口書寫




BaseDao的實現類











業務Dao中的應用




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