zoukankan      html  css  js  c++  java
  • 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 语句的动态拼装

  • 相关阅读:
    www.insidesql.org
    kevinekline----------------- SQLSERVER MVP
    Sys.dm_os_wait_stats Sys.dm_performance_counters
    如何使用 DBCC MEMORYSTATUS 命令来监视 SQL Server 2005 中的内存使用情况
    VITAM POST MORTEM – ANALYZING DEADLOCKED SCHEDULERS MINI DUMP FROM SQL SERVER
    Cargo, Rust’s Package Manager
    建筑识图入门(初学者 入门)
    Tracing SQL Queries in Real Time for MySQL Databases using WinDbg and Basic Assembler Knowledge
    Microsoft SQL Server R Services
    The Rambling DBA: Jonathan Kehayias
  • 原文地址:https://www.cnblogs.com/Lemonades/p/11418192.html
Copyright © 2011-2022 走看看