DUMP3 企業級電商項目

【開發模式】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」

相關文章
相關標籤/搜索