【開發模式】controller - service(合法校驗問題) - dao 反過來也沒問題 前端
用戶模塊mysql
登陸 註冊 用戶名驗證(實時反饋前端) 忘記密碼 重置密碼 退出登陸 更新用戶信息 獲取用戶信息 提交問題答案nginx
【用戶實體設計】portal backend 以 role常量 區分(小技巧 常量能夠用 interface 進行分組)git
【MD5不對稱加密 , 加 salt 值】MD5Util github
【高可用服務響應對象】 統一接口設計 status msg dataweb
【 和 user_id 關聯的session】【登陸 session.setAttribute() 】【註銷 session.removeAttribute()】【獲取 session.getAttribute()】redis
安全:橫向越權(平級用戶訪問另外一個平級用戶) 縱向越權(低級用戶訪問高級用戶) spring
【提交問題答案】得到token => 【忘記重置密碼】sql
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」