分类管理
功能:
获取节点
增加节点
修改名字
获取分类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 语句的动态拼装