DUMP3 企业级电商项目
【開發模式】controller - service(合法校驗問題) - dao? ?反過來也沒問題??
?
用戶模塊
登錄 注冊 用戶名驗證(實時反饋前端) 忘記密碼 重置密碼 退出登錄 更新用戶信息 獲取用戶信息 提交問題答案
【用戶實體設計】portal backend 以 role常量 區分(小技巧 常量可以用 interface 進行分組)
??
【MD5不對稱加密 , 加 salt 值】MD5Util?
【高可用服務響應對象】 統一接口設計 status msg data
【?和 user_id 關聯的session】【登錄 session.setAttribute() 】【注銷 session.removeAttribute()】【獲取 session.getAttribute()】
?
安全:橫向越權(平級用戶訪問另一個平級用戶) 縱向越權(低級用戶訪問高級用戶)?
【提交問題答案】獲得token => 【忘記重置密碼】
1.guava 緩存 封裝一個 TokenCache ,后期可以改成 redis? ??
2.token 降低了橫向越權的可能性
?
【檢查 email 是否合法】根據當前session user_id,統計其他用戶 email = #{email} 。
select count(1) from user where email = #{newEmail} and id != #{userId}
【檢查舊的密碼】默認要是當前用戶 user_id = #{userId}
【更新用戶信息】user.setId(sessionUser.getId())? 降低越權。
?……………………………………………………………………………………………………………………
品類模塊
獲取節點 增加節點 修改名字 獲取分類ID 遞歸子節點ID?
?
無限層級樹狀數據結構 遞歸
function recursiveSearch(categorySets,categoryId){
Category identify = categoryMapper.selectByPK(categoryId);
if( identify != null){
categorySets.add(identify);
}
List<Category> categoryList = categoryMapper.selectByParent(categoryId);
for(category:categoryList){
recursiveSearch(categorySets,category.getId());
}
return categorySets;
}
?
復雜對象排重?equal > hashcode
……………………………………………………………………………………………………………………………………………………………………
商品模塊
商品列表 商品搜索 圖片上傳 富文本上傳 商品詳情 商品上下架 商品實體增刪改
?
【相關 dispatcher-servlet.xml配置】
<!-- 文件上傳 --><bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"><property name="maxUploadSize" value="10485760"/> <!-- 10m --><property name="maxInMemorySize" value="4096" /><property name="defaultEncoding" value="UTF-8"></property></bean>?
【FTP文件服務】 FTPUtil
?
【SpringMVC 文件上傳】配合 nginx + switchhost(域名轉發) + vsftpd - tomcat(8080) 來測試這個功能。
瀏覽器地址欄 =》Hosts www->ip =》nginx port 服務器localhost/服務器 ftp =》使用ftp上傳到vsftpd返回 nginx 地址。(nginx -> vsftpd文件資源文件夾)
【0】request.getSession.getServletContext.getRealPath("upload")獲得上傳路徑? ? ?/web-app/upload? ?這個web-app相當于host/context-path這個位置。
【1】修改文件名 => UUID.random一個文件名。
【2】multiFilePart.transferTo(targetFile)? ?
【3】FTPUtil.upload
?
【富文本上傳】simditor ,要求返回這個插件所需要的 結構體。
?
【流讀取properties配置文件 靜態塊】通過這種方法 支持熱部署。(最主要中心思想 一切皆對象 一切皆文件)
=》全局變量 常量 靜態變量 局部變量(方法內)?
【固有印象】提到全局我最先想到是配置文件、還有就是聲明在公開類里面的 public static final 變量。
【實例變量】是清晰的,明確要我們初始化類才有的。單純 public 的變量? =? ?non-static 變量 = 實例變量,所以大家愛說的全局變量說的是 public static 變量。
【結論】全局變量就是 public static? 強調類屬關系,所以初始化順序應該最先一個。
=》因為我們要在 tomcat 啟動加載到 配置項,全局變量 -> 靜態變量? -> 靜態塊 -> 普通代碼塊 -> 構造器 -> 實例變量??
=》靜態塊有且僅執行1次,最后可以實現 一個 PropertiesUtil 負責加載配置項工具。
?
【抽象 pojo? bo vo 之間轉換思路? ? ?】
1期 pojo valueobject 2期 pojo businessobject viewobject
這種轉換的意思是,把 pojo assemble 成所需要的一種對象,vo 。(assemble 增加一些返回字段 裝載原來的pojo)
?
【joda-time專業庫】自己封裝一個 DateTimeUtil
DateTime DateTimeFormat DateTimeFormatter 實現 字符串到Date的轉換。
?
【Mybatis-PageHelper 分頁】原理AOP。使用文檔
其中一種使用方法//??use static method startPage
PageHelper.startPage(pageNum,pageSize)
// Mapper? ?查詢 sql
PageInfo 使用 查詢結果初始化。
?
實現方式
1. 使用 list 接口 subList(int startIndex,int endIndex);
2. 直接使用數據庫 sql 語句 【mysql:limit offset,length】select * from t_student limit 0,10??
3. hibernate 框架? Criteria 設置 firstResult , maxResult? ? ? 【復雜查詢轉成的SQL性能差】
4. mybatis 使用 sql 語句。
【Mybatis-PageHelper 動態排序】約定 product_asc? product_desc? ,實體_下劃_排序 。
if(StringUtils.isNotBlank(orderBy)){if (Const.ProductListOrderby.PRICE_ASC_DESC.contains(orderBy)){String[] orderArr = orderBy.split("_");PageHelper.orderBy(orderArr[0]+" "+orderArr[1]);}} PageInfo pageInfo = new PageInfo(productList);pageInfo.setList(productListVOList);return ServerResponse.createBySuccess(pageInfo);注意點:1. 使用 page(AOP監聽生成) 去初始化PageInfo。 2. 根據需要修改成實際需要返回的裝配數據
?
【Mybatis對where動態拼裝】
<where>去除無用的 “and”
?
轉載于:https://www.cnblogs.com/chenhui7373/p/9169334.html
總結
以上是生活随笔為你收集整理的DUMP3 企业级电商项目的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: get请求中文乱码问题
- 下一篇: 李嘉诚语录_1