ssm實戰(4,5)------分類管理,商品管理


分類管理

功能:

獲取節點

增加節點

修改名字

獲取分類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 語句的動態拼裝

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM