分類管理
功能:
獲取節點
增加節點
修改名字
獲取分類ID
遞歸子節點ID
接口:
注:
1 在對功能的操作前,要對安全性進行檢驗,如:是否登錄(使用session);管理員權限(role值的檢查);參數是否為空; 用戶登錄密碼的MD5加密;
2 Set<Category>:使用set集合,Category要重寫equal和hashcode
學習目標
遞歸查詢子節點
商品管理:
功能:
前台功能: 產品搜索,動態排序列表產品詳情,分頁功能
后台功能:商品列表,商品搜索,圖片上傳,富文本上傳,商品詳情,商品上下架,增加商品,更新商品
接口:
前台接口: 1 產品搜索及動態排序list;2 產品detail ;
后台接口 :1 產品list ;2 產品搜索 ; 3 圖片上傳 ;4 產品詳情; 5 產品上下架 ; 6 新增產品或修改產品 ;7 富文本上傳圖片
注:
1 寫業務邏輯時,先校驗參數或者其他,如果校驗不通過直接return,校驗通過后再編寫業務邏輯
學習目標:
0 FTP服務的對接
1.使用MultipartFile上傳文件到達項目發布后的web-app目錄的upload,再把文件上傳到ftp服務器,再刪除掉web-app目錄的upload里邊的文件
1 SpringMVC文件的上傳:
SpringMVC文件上傳:1 首先創建FileServiceImpl,用於上傳文件,2 創建FTPUtil用於創建上傳到FTP服務器,3 再把上傳到web-app里邊的文件刪除
package com.eshop.service.impl; import com.eshop.service.IFileService; import com.eshop.util.FTPUtil; import com.google.common.collect.Lists; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import java.io.File; import java.io.IOException; import java.util.UUID; @Service("iFileService") public class FileServiceImpl implements IFileService { private static Logger logger= LoggerFactory.getLogger(FileServiceImpl.class); @Override public String upload (MultipartFile file, String path){ //文件名 String fileName=file.getOriginalFilename(); //擴展名 abc.jpg ----> jpg String fileExtensionName=fileName.substring(fileName.lastIndexOf(".")+1); //要上傳的文件名 String uploadFileName= UUID.randomUUID().toString()+"."+fileExtensionName; logger.info("開始上傳文件,上傳的文件夾名:{},上傳路徑:{},新文件夾名:{}",fileName,path,uploadFileName); //判斷有沒有該文件夾,沒有就創建 File fileDir=new File(path); if(!fileDir.exists()){ //創建文件夾前,要打開 可寫的權限 ,防止tomcat沒有開權限 fileDir.setWritable(true); fileDir.mkdirs(); } //創建一個完全的文件 File targetFile=new File(path,uploadFileName); try { file.transferTo(targetFile); //文件上傳已完成 //將targetFile上傳到FTP服務器上面 FTPUtil.uploadFile(Lists.newArrayList(targetFile)); //上傳完后,把targetFile刪除 targetFile.delete(); } catch (IOException e) { logger.error("上傳文件異常",e); return null; } return targetFile.getName(); } }
package com.eshop.util; import org.apache.commons.net.ftp.FTPClient; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.List; public class FTPUtil { private static Logger logger= LoggerFactory.getLogger(FTPUtil.class); private static String ftpIp =PropertiesUtil.getProperty("ftp.server.ip"); private static String ftpUser =PropertiesUtil.getProperty("ftp.user"); private static String ftpPass =PropertiesUtil.getProperty("ftp.pass"); private String ip; private int port; private String user; private String pwd; private FTPClient ftpClient; /** * * @param ip * @param port 端口 * @param user * @param pwd */ public FTPUtil(String ip, int port, String user, String pwd) { this.ip = ip; this.port = port; this.user = user; this.pwd = pwd; } /** * 開發出去的上傳文件的靜態方法 * @param fileList * @return */ public static boolean uploadFile(List<File> fileList) throws IOException { FTPUtil ftpUtil=new FTPUtil(ftpIp,21,ftpUser,ftpPass); logger.info("開始連接FTP服務器"); boolean result= ftpUtil.uploadFile("img",fileList); logger.info("連接服務器結束,上傳結果為:{}",result); return result; } /** * 上傳文件的具體邏輯 * @param remotePath 遠程路徑:Linux里邊的FTP服務器是一個文件夾,如果要上傳的是到這個文件夾下邊的文件夾,就要使用remotePath * @param fileList * @return */ private boolean uploadFile(String remotePath, List<File> fileList) throws IOException { boolean uploaded=true; FileInputStream fis=null; //連接ftp服務器 if(connectServer(this.ip,this.port,this.user,this.pwd)){ try { //切換工作目錄 ftpClient.changeWorkingDirectory(remotePath); //設置緩沖區 ftpClient.setBufferSize(1024); //設置編碼方式 ftpClient.setControlEncoding("UTP-8"); //文件類型設置為二進制的文件類型 ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE); //切換工作模式 ftpClient.enterLocalPassiveMode(); /* 開始上傳文件到ftp !!!*/ for(File fileItem:fileList){ fis=new FileInputStream(fileItem); ftpClient.storeFile(fileItem.getName(),fis); } } catch (IOException e) { logger.error("上傳文件異常",e); uploaded=false; }finally { //關閉資源 fis.close(); ftpClient.disconnect(); } } return uploaded; } private boolean connectServer(String ip, int port, String user, String pwd){ boolean isSuccess=false; ftpClient=new FTPClient(); try { ftpClient.connect(ip,port); isSuccess=ftpClient.login(user,pwd); } catch (IOException e) { logger.error("連接FTP服務器異常",e); } return isSuccess; } public String getIp() { return ip; } public void setIp(String ip) { this.ip = ip; } public int getPort() { return port; } public void setPort(int port) { this.port = port; } public String getUser() { return user; } public void setUser(String user) { this.user = user; } public String getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd = pwd; } public FTPClient getFtpClient() { return ftpClient; } public void setFtpClient(FTPClient ftpClient) { this.ftpClient = ftpClient; } }
應用:
@RequestMapping("upload.do") @ResponseBody public ServerResponce upload(HttpSession session,@RequestParam(name = "upload_name",required = false) MultipartFile file, HttpServletRequest request){ User user=(User)session.getAttribute(Const.CURRENT_USER); if(user==null){ //強制用戶登錄 return ServerResponce.createByErrorCodeMessage(ResponseCode.NEED_LOGIN.getCode(),"用戶未登錄,請登錄"); } if(iUserService.checkAdminRole(user).isSuccess()){ //填充業務 String path=request.getSession().getServletContext().getRealPath("upload"); String targetFileName = iFileService.upload(file, path); String url= PropertiesUtil.getProperty("ftp.server.http.prefix")+targetFileName; Map fileMap= Maps.newHashMap(); fileMap.put("uri",targetFileName); fileMap.put("url",url); return ServerResponce.createBySuccess(fileMap); }else { return ServerResponce.createByErrorMessage("無權限操作"); } }
2 流讀取Properties配置文件:
package com.eshop.util; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; import java.io.InputStreamReader; import java.util.Properties; public class PropertiesUtil { private static Logger logger= LoggerFactory.getLogger(PropertiesUtil.class); private static Properties properties; /*靜態代碼塊(只執行一次) 優於 普通代碼塊 優於 構造代碼塊*/ static { String fileName="eshop.properties"; properties=new Properties(); try { properties.load(new InputStreamReader(PropertiesUtil.class.getClassLoader().getResourceAsStream(fileName),"UTF-8")); } catch (IOException e) { logger.error("配置文件讀取異常",e); } } /** * 得到配置文件里邊的值 * @param key * @return */ public static String getProperty(String key){ //避免key左右有空格,trim()去掉空格 String value=properties.getProperty(key.trim()); if(StringUtils.isBlank(value)){ return null; } return value.trim(); } public static String getProperty(String key,String defaultVaule){ //避免key左右有空格,trim()去掉空格 String value=properties.getProperty(key.trim()); if(StringUtils.isBlank(value)){ return defaultVaule; } return value.trim(); } }
3 抽象POJO,BO,VO對象的轉換關系及解決思路
4 joda-time快速入門
package com.eshop.util; import org.apache.commons.lang3.StringUtils; import org.joda.time.DateTime; import org.joda.time.format.DateTimeFormat; import org.joda.time.format.DateTimeFormatter; import java.util.Date; public class DateTimeUtil { //使用joda-time對時間進行處理 //1.string --> date 2.date --> string private static String STANDARD_FORMAT="yyyy-MM-dd HH:mm:ss"; /** * 字符串裝換時間格式,傳入一個事件格式 * @param dateTimeStr * @param formatStr 事件格式 * @return */ public static Date strToDate(String dateTimeStr,String formatStr){ DateTimeFormatter dateTimeFormatter= DateTimeFormat.forPattern(formatStr); DateTime dateTime=dateTimeFormatter.parseDateTime(dateTimeStr); return dateTime.toDate(); } public static String dateToStr(Date date,String formatStr){ if(date==null){ return StringUtils.EMPTY; } DateTime dateTime=new DateTime(date); return dateTime.toString(formatStr); } /** * 字符串裝換時間格式,默認事件格式 * @param dateTimeStr * @return */ public static Date strToDate(String dateTimeStr){ DateTimeFormatter dateTimeFormatter= DateTimeFormat.forPattern(STANDARD_FORMAT); DateTime dateTime=dateTimeFormatter.parseDateTime(dateTimeStr); return dateTime.toDate(); } public static String dateToStr(Date date){ if(date==null){ return StringUtils.EMPTY; } DateTime dateTime=new DateTime(date); return dateTime.toString(STANDARD_FORMAT); } }
5 靜態塊
靜態代碼塊(只執行一次) 優於 普通代碼塊 優於 構造代碼塊
6 Mybatis-PageHelper 分頁和動態排序
7 Mybatis對 list 集合遍歷的方法
8 Mybatis對 where 語句的動態拼裝