分类管理
功能:
获取节点
增加节点
修改名字
获取分类ID
递归子节点ID
接口:
注:
1 在对功能的操作前,要对安全性进行检验,如:是否登录(使用session);管理员权限(role值的检查);参数是否为空; 用户登录密码的MD5加密;
2 Set
学习目标
递归查询子节点
商品管理:
功能:
前台功能: 产品搜索,动态排序列表产品详情,分页功能
后台功能:商品列表,商品搜索,图片上传,富文本上传,商品详情,商品上下架,增加商品,更新商品
接口:
前台接口: 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 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 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 语句的动态拼装