點贊再看,養成習慣
專案介紹及流程
拍賣系統采用ssm架構搭建,頁面資料渲染采用jsp的初級簡易拍賣系統,拍賣流程為 普通用戶注冊、登錄后,進入個人中心發布商品后, 系統管理員進行商品審核, 審核不通過,用戶發布串列展示拒絕原因, 審核通過后,首頁及分類可查詢展示,非發布人員進行商品競價, 競價完成,發布者進行商品發貨, 拍賣獲得者進行付款, 完成最終交易,
開發環境:
- jdk 8
- intellij idea
- tomcat 8
- mysql 5.7
所用技術:
專案框架:ssm
前端渲染:jsp
前端技術:js/jquery
專案目錄結構

- controller,視圖控制層,
- service,業務邏輯層
- dao,資料庫操作層
- jsp,頁面進行資料渲染
- mapper.xml,此檔案定義了操作資料庫的sql,每個sql是一個statement,映射檔案是mybatis的核心
- jdbc.properties,資料庫帳號密碼配置
運行效果
- 注冊

- 首頁

- 發布商品

- 商品競價

- 瀏覽記錄

- 后端-商品管理

核心專案配置:
1.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:p="http://www.springframework.org/schema/p"
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-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">
<mvc:annotation-driven/>
<!-- 自動掃描 @Controller-->
<context:component-scan base-package="com.pmxt.controller"/>
<mvc:resources mapping="/js/**" location="/js/"/>
<mvc:resources mapping="/css/**" location="/css/"/>
<mvc:resources mapping="/images/**" location="/images/"/>
<mvc:resources mapping="/view/**" location="/view/"/>
<mvc:resources mapping="/upload/**" location="/upload/"/>
<!--避免IE執行AJAX時,回傳JSON出現下載檔案 -->
<bean id="mappingJacksonHttpMessageConverter"
>
<property name="supportedMediaTypes">
<list>
<value>text/html;charset=UTF-8</value>
</list>
</property>
</bean>
<!-- 啟動SpringMVC的注解功能,完成請求和注解POJO的映射 -->
<bean >
<property name="messageConverters">
<list>
<ref bean="mappingJacksonHttpMessageConverter"/> <!-- JSON轉換器 -->
</list>
</property>
</bean>
<!-- 定義跳轉的檔案的前后綴 ,視圖模式配置 -->
<bean >
<property name="prefix" value="https://www.cnblogs.com/WEB-INF/jsp/"/>
<property name="suffix" value="https://www.cnblogs.com/code200/archive/2020/12/25/.jsp"/>
</bean>
<!-- 檔案上傳配置 -->
<bean id="multipartResolver" >
<!-- 默認編碼 -->
<property name="defaultEncoding" value="https://www.cnblogs.com/code200/archive/2020/12/25/UTF-8"/>
<!-- 上傳檔案大小限制為31M,31*1024*1024 -->
<property name="maxUploadSize" value="https://www.cnblogs.com/code200/archive/2020/12/25/32505856"/>
<!-- 記憶體中的最大值 -->
<property name="maxInMemorySize" value="https://www.cnblogs.com/code200/archive/2020/12/25/4096"/>
</bean>
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<mvc:exclude-mapping path="/showLogin"/>
<mvc:exclude-mapping path="/getVerifyCode"/>
<mvc:exclude-mapping path="/checkLogin"/>
<mvc:exclude-mapping path="/showReg"/>
<mvc:exclude-mapping path="/forget"/>
<mvc:exclude-mapping path="/checkUname"/>
<mvc:exclude-mapping path="/forgetPassword"/>
<mvc:exclude-mapping path="/reg"/>
<mvc:exclude-mapping path="/css/**"/>
<mvc:exclude-mapping path="/images/**"/>
<mvc:exclude-mapping path="/js/**"/>
<mvc:exclude-mapping path="/upload/**"/>
<mvc:exclude-mapping path="/WEB-INF/jsp/login.jsp"/>
<bean ></bean>
</mvc:interceptor>
</mvc:interceptors>
<!--500錯誤和404請求失敗-->
<bean >
<property name="exceptionMappings">
<map>
<entry key="ResourceNotFoundException" value="https://www.cnblogs.com/code200/archive/2020/12/25/common/error/resourceNotFoundError" />
<entry key=".DataAccessException" value="https://www.cnblogs.com/code200/archive/2020/12/25/common/error/dataAccessError" />
</map>
</property>
<property name="statusCodes">
<map>
<entry key="common/error/resourceNotFoundError" value="https://www.cnblogs.com/code200/archive/2020/12/25/404" />
<entry key="common/error/dataAccessError" value="https://www.cnblogs.com/code200/archive/2020/12/25/500" />
</map>
</property>
</bean>
</beans>
2.spring-mybatis.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" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<!-- 自動掃描 -->
<context:component-scan base-package="com.pmxt"/>
<bean id="dataSource" >
<property name="driverClassName">
<value>com.mysql.jdbc.Driver</value>
</property>
<property name="url">
<value>jdbc:mysql://localhost:3306/pmxt?characterEncoding=UTF-8</value>
</property>
<property name="username">
<value>root</value>
</property>
<property name="password">
<value>root123</value>
</property>
</bean>
<!-- mybatis和spring完美整合,不需要mybatis的配置映射檔案 -->
<bean id="sqlSessionFactory" >
<property name="dataSource" ref="dataSource"/>
<!-- 自動掃描mapping.xml檔案 -->
<property name="mapperLocations" value="https://www.cnblogs.com/code200/archive/2020/12/25/classpath:mapping/*.xml"></property>
</bean>
<!-- DAO介面所在包名,Spring會自動查找其下的類 -->
<bean >
<property name="basePackage" value="https://www.cnblogs.com/code200/archive/2020/12/25/com.pmxt.dao"/>
<property name="sqlSessionFactoryBeanName" value="https://www.cnblogs.com/code200/archive/2020/12/25/sqlSessionFactory"></property>
</bean>
<!-- (事務管理)transaction manager, use JtaTransactionManager for global tx -->
<bean id="transactionManager" >
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- (事務管理)transaction manager, use JtaTransactionManager for global tx -->
<tx:annotation-driven transaction-manager="transactionManager"/>
</beans>
3.登錄驗證
@RequestMapping("/checkLogin")
@ResponseBody
public int checkLogin(HttpServletRequest request, String uname, String upassword, String verifyCode) {
HttpSession session = request.getSession();
String sessionVerifyCode = (String) session.getAttribute("verifyCodeValue");
if (!verifyCode.equalsIgnoreCase(sessionVerifyCode)) {
int flag = 4;
return flag;
} else {
List<PUsersModel> pUsersModels = pUserService.checkLogin(uname, upassword);
if (pUsersModels.isEmpty()) {
return 0;//用戶名不存在
}
String relpassword = pUsersModels.get(0).getUpassword();
int utype = pUsersModels.get(0).getUtype();
if (upassword.equals(relpassword)) {
session = request.getSession();
session.setAttribute("uname", uname);
session.setAttribute("utype", utype);
session.setAttribute("pUsersModel", pUsersModels.get(0));
if (utype == 1) {
return 3;//管理員
}
return 1;//密碼正確
} else {
return 2;//密碼不正確
}
}
}
4.系統推薦
@RequestMapping("/sysRecommend")
public String sysRecommend(HttpSession session, Model model, String page)
{
PUsersModel pUsersModel=(PUsersModel)session.getAttribute("pUsersModel");
//先判斷當前用戶是否已經瀏覽過商品
LookshistoryModel lookModel=new LookshistoryModel();
lookModel.setUserid(pUsersModel.getUid());
List<LookshistoryModel> lists=lookshistoryService.selectLookshistory(lookModel); //查詢總記錄并做降序處理
Map<Integer,Integer> gmap=new HashMap<Integer, Integer>();
if(lists!=null&lists.size()>0){ //根據做商品過濾篩選 精準推薦
int hits=0; //獲取瀏覽總數
for(LookshistoryModel m:lists){
gmap.put(m.getPgtype(),m.getHits()); //填充商品占比情況
hits+=m.getHits(); //疊加瀏覽次數
}
Map<Integer,Integer> gpmap=new HashMap<Integer, Integer>(); //物件儲存轉換,型別--->>次數 模式
for (Map.Entry<Integer, Integer> entry : gmap.entrySet()) {
BigDecimal percentage=new BigDecimal(entry.getValue()).divide(new BigDecimal(hits),2,BigDecimal.ROUND_HALF_DOWN); //當前最高商品的占比
int result=percentage.multiply(new BigDecimal(12)).intValue(); //推薦每個商品出現的占比情況
gpmap.put(entry.getKey(),result);
}
List<GoodsModel> afterGoodsModels =new ArrayList<GoodsModel>();
int afterPageNums =0;
for (Map.Entry<Integer, Integer> entry : gmap.entrySet()) { //最終推薦出商品情況
int afterPageItem = goodsService.countAfterGoodsByKinds(entry.getKey());
final int afterPageSize = entry.getValue();
if (page == null)
{
page = "1";
}
PageUtil afterPageUtil = new PageUtil(afterPageItem, afterPageSize, Integer.parseInt(page));
int afterPageNum = afterPageUtil.getPageNum();
afterPageNums+=afterPageNum;
int afterStartRow = afterPageUtil.getStartRow();
List<GoodsModel> goodsModels = goodsService.getAfterCheckGoodsByPageBykinds(afterStartRow, afterPageSize, entry.getKey());
Boolean afterHasNextPage = (Integer.parseInt(page) != afterPageNum) && (afterPageNum != 0);
model.addAttribute("afterHasPrePage", Integer.parseInt(page) != 1);
model.addAttribute("afterHasNextPage", afterHasNextPage);
model.addAttribute("afterGoodsModels", afterGoodsModels);
model.addAttribute("afterPageItem", afterPageItem);
model.addAttribute("nowPage", Integer.parseInt(page));
afterGoodsModels.addAll(goodsModels);
}
model.addAttribute("afterPrePage", Integer.parseInt(page) - 1);
model.addAttribute("afterNextPage", Integer.parseInt(page) + 1);
model.addAttribute("afterPageNum", afterPageNums); //總頁面
model.addAttribute("afterGoodsModels", afterGoodsModels);//總商品
}else{ //根據大眾瀏覽推薦
lists=lookshistoryService.selectLookshistory(new LookshistoryModel()); //根據大眾瀏覽次數多的多推薦
if(lists!=null&lists.size()>0){
int hits=0; //獲取瀏覽總數
for(LookshistoryModel m:lists){
gmap.put(m.getPgtype(),m.getHits()); //填充商品占比情況
hits+=m.getHits(); //疊加瀏覽次數
}
Map<Integer,Integer> gpmap=new HashMap<Integer, Integer>();//商品占比存盤物件
for (Map.Entry<Integer, Integer> entry : gmap.entrySet()) {
BigDecimal percentage=new BigDecimal(entry.getValue()).divide(new BigDecimal(hits)); //當前最高商品的占比
int result=percentage.multiply(new BigDecimal(12)).intValue(); //推薦每個商品出現的占比情況
gpmap.put(entry.getKey(),result);
}
List<GoodsModel> afterGoodsModels =new ArrayList<GoodsModel>();
int afterPageNums =0;
for (Map.Entry<Integer, Integer> entry : gmap.entrySet()) { //最終推薦出商品情況
int afterPageItem = goodsService.countAfterGoodsByKinds(entry.getKey());
final int afterPageSize = entry.getValue();
if (page == null)
{
page = "1";
}``
PageUtil afterPageUtil = new PageUtil(afterPageItem, afterPageSize, Integer.parseInt(page));
int afterPageNum = afterPageUtil.getPageNum();
afterPageNums+=afterPageNum;
int afterStartRow = afterPageUtil.getStartRow();
List<GoodsModel> goodsModels = goodsService.getAfterCheckGoodsByPageBykinds(afterStartRow, afterPageSize, entry.getKey());
Boolean afterHasNextPage = (Integer.parseInt(page) != afterPageNum) && (afterPageNum != 0);
model.addAttribute("afterHasPrePage", Integer.parseInt(page) != 1);
model.addAttribute("afterHasNextPage", afterHasNextPage);
model.addAttribute("afterGoodsModels", afterGoodsModels);
model.addAttribute("afterPageItem", afterPageItem);
model.addAttribute("nowPage", Integer.parseInt(page));
afterGoodsModels.addAll(goodsModels);
}
model.addAttribute("afterPrePage", Integer.parseInt(page) - 1);
model.addAttribute("afterNextPage", Integer.parseInt(page) + 1);
model.addAttribute("afterPageNum", afterPageNums); //總頁面
model.addAttribute("afterGoodsModels", afterGoodsModels);//總商品
}else{
int lindid=(int)Math.random()*(1); //沒有瀏覽次數系統隨機推薦
int afterPageItem = goodsService.countAfterGoodsByKinds(lindid);
final int afterPageSize = 12;
if (page == null)
{
page = "1";
}
PageUtil afterPageUtil = new PageUtil(afterPageItem, afterPageSize, Integer.parseInt(page));
int afterPageNum = afterPageUtil.getPageNum();
int afterStartRow = afterPageUtil.getStartRow();
List<GoodsModel> afterGoodsModels = goodsService.getAfterCheckGoodsByPageBykinds(afterStartRow, afterPageSize, 0);
Boolean afterHasNextPage = (Integer.parseInt(page) != afterPageNum) && (afterPageNum != 0);
model.addAttribute("afterHasPrePage", Integer.parseInt(page) != 1);
model.addAttribute("afterHasNextPage", afterHasNextPage);
model.addAttribute("afterPrePage", Integer.parseInt(page) - 1);
model.addAttribute("afterNextPage", Integer.parseInt(page) + 1);
model.addAttribute("afterGoodsModels", afterGoodsModels);
model.addAttribute("afterPageItem", afterPageItem);
model.addAttribute("afterPageNum", afterPageNum);
model.addAttribute("nowPage", Integer.parseInt(page));
}
}
return "otherkinds";
}
專案總結
目前此版本為簡易拍賣系統,其他拍賣邏輯或者額外功能,后續迭代排期開發,敬請關注!
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/240431.html
標籤:其他
上一篇:Vue2+Koa2+Typescript前后端框架教程--02后端KOA2框架自動重啟編譯服務(nodemon)
下一篇:Vue2+Koa2+Typescript前后端框架教程--02后端KOA2框架自動重啟編譯服務(nodemon)
