SpringBoot+shiro(仿shengxian)纯代码分享

目录结构

src-maiin-java-com-shengxian-config/constant/controller/dto/mapper/pojo/realm/service/vo

resources-mapper-CategoryMapper.xml/GoodsMapper.xml/UserMapper.xml

resources-static-css/images/js

resources-templates-403.html/back_add.html/back_insert.html/back_list.html/back_update.html/cart.html/category.html/detail.html/foot.html/head.html/index.html/index.html/list.html/login.html/place_order.html/register.html/suggest.html/user_center_info.html/user_center_order.html/user_center_site.html

resources-application.yml

test-ShengxianTests/mappper-UsersMapperTest

pom.xml

java

config.KaptchaConfig

package com.itqf.shengxian1125.config;

import com.google.code.kaptcha.impl.DefaultKaptcha;
import com.google.code.kaptcha.util.Config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.Properties;

@Configuration
public class KaptchaConfig {
@Bean
public DefaultKaptcha getDefaultKaptcha(){
    com.google.code.kaptcha.impl.DefaultKaptcha defaultKaptcha = new com.google.code.kaptcha.impl.DefaultKaptcha();
    Properties properties = new Properties();
    properties.setProperty("kaptcha.border", "no");
    properties.setProperty("kaptcha.background.clear.to", "211,229,237");
	//        properties.setProperty("kaptcha.session.key", "code");
    properties.setProperty("kaptcha.textproducer.char.length", "6");
    properties.setProperty("kaptcha.textproducer.font.names", "宋体,楷体,微软雅黑");
    properties.setProperty("kaptcha.textproducer.char.string", "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789");
    Config config = new Config(properties);
    defaultKaptcha.setConfig(config);
    return defaultKaptcha;
}
}

config.ShiroConfig

package com.itqf.shengxian1125.config;

import com.itqf.shengxian1125.realm.MyRealm;
import org.apache.shiro.authc.credential.HashedCredentialsMatcher;
import org.apache.shiro.spring.web.config.DefaultShiroFilterChainDefinition;
import org.apache.shiro.spring.web.config.ShiroFilterChainDefinition;
import org.apache.shiro.web.mgt.CookieRememberMeManager;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.apache.shiro.web.servlet.SimpleCookie;
import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.security.NoSuchAlgorithmException;
import java.util.Map;

@Configuration
public class ShiroConfig {

//记住我时间控制
@Bean
public SimpleCookie simpleCookie(){
    SimpleCookie rememberMe = new SimpleCookie("rememberMe");
    rememberMe.setMaxAge(600);
    return rememberMe;
}

//记住我管理器
@Bean //记住我管理器
public CookieRememberMeManager cookieRememberMeManager(SimpleCookie simpleCookie){
    CookieRememberMeManager cookieRememberMeManager = new CookieRememberMeManager();
    cookieRememberMeManager.setCookie(simpleCookie);
    return cookieRememberMeManager;
}

@Bean
public DefaultWebSecurityManager webSecurityManager(CookieRememberMeManager cookieRememberMeManager){
    DefaultWebSecurityManager defaultWebSecurityManager = new DefaultWebSecurityManager();
    defaultWebSecurityManager.setRealm(createRealm());
    //设置记住我
    defaultWebSecurityManager.setRememberMeManager(cookieRememberMeManager);
    return defaultWebSecurityManager;
}

@Bean
public MyRealm createRealm(){
    MyRealm myRealm = new MyRealm();
    HashedCredentialsMatcher hashedCredentialsMatcher = new HashedCredentialsMatcher();
    hashedCredentialsMatcher.setHashIterations(1024);
    hashedCredentialsMatcher.setHashAlgorithmName("SHA-256");
    myRealm.setCredentialsMatcher(hashedCredentialsMatcher);
    return myRealm;
}

/**
 * 控制注解权限管理一定生效
 *
 */
@Bean
public static DefaultAdvisorAutoProxyCreator getDefaultAdvisorAutoProxyCreator() {
    DefaultAdvisorAutoProxyCreator creator = new DefaultAdvisorAutoProxyCreator();

    //setUsePrefix(false)用于解决一个奇怪的bug。在引入spring aop的情况下。
    //在@Controller注解的类的方法中加入@RequiresRole注解,会导致该方法无法映射请求,导致返回404。
    //加入这项配置能解决这个bug

    creator.setUsePrefix(true);
    return creator;
}

/**
 * 过滤链的声明
 */

@Bean
public ShiroFilterChainDefinition shiroFilterChainDefinition() {

    //创建一个过滤连
    DefaultShiroFilterChainDefinition chain = new DefaultShiroFilterChainDefinition();
    Map<String, String> filterChainMap = chain.getFilterChainMap();
    // all paths are managed via annotations
    filterChainMap.put("/css/**","anon");
    filterChainMap.put("/js/**", "anon");
    filterChainMap.put("/images/**", "anon");
    chain.addPathDefinition("/getRegist", "anon");
    chain.addPathDefinition("/regist", "anon");
    chain.addPathDefinition("/verify", "anon");
    chain.addPathDefinition("/getLogin", "anon");
    chain.addPathDefinition("/login", "anon");
    chain.addPathDefinition("/captcha", "anon");
    chain.addPathDefinition("/captcha/verify", "anon");
    chain.addPathDefinition("/", "anon");
    chain.addPathDefinition("/403", "anon");
    chain.addPathDefinition("/logout", "logout");
    chain.addPathDefinition("/back/getAdd", "roles[卖家]");
    chain.addPathDefinition("/back/add", "roles[卖家]");
    chain.addPathDefinition("/back/getUpdate/*", "roles[卖家]");
    chain.addPathDefinition("/back/update", "roles[卖家]");
    chain.addPathDefinition("/back/del/*", "roles[卖家]");
    chain.addPathDefinition("/back/pic", "roles[卖家]");
    chain.addPathDefinition("/back/pic2", "roles[卖家]");
    chain.addPathDefinition("/**", "authc");
    return chain;
}
}

constant.MyConstant

package com.itqf.shengxian1125.constant;

public class MyConstant {

public static final Integer iteConstant = 1024;

}

controller.CategoryController

package com.itqf.shengxian1125.controller;

import com.itqf.shengxian1125.pojo.Category;
import com.itqf.shengxian1125.service.CategoryService;
import com.itqf.shengxian1125.vo.UserVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.ArrayList;
import java.util.List;

@Controller
public class CategoryController {

@Autowired
private CategoryService categoryService;

@RequestMapping("/findCategory")
public String findCategory(Model model){
    List<Category> categories = categoryService.queryAll();
    model.addAttribute("cates",categories);
    return "category";
}

@RequestMapping("/category/ids")
@ResponseBody
public List categoryIds(){
    List<Category> categories = categoryService.queryAll();
    List list = new ArrayList();
    for (Category category : categories) {
        list.add(category.getId());
    }
    return list;
}
}

controller.GoodsController

package com.itqf.shengxian1125.controller;

import com.github.pagehelper.PageInfo;
import com.itqf.shengxian1125.dto.Page;
import com.itqf.shengxian1125.pojo.Category;
import com.itqf.shengxian1125.pojo.Goods;
import com.itqf.shengxian1125.service.CategoryService;
import com.itqf.shengxian1125.service.GoodsService;
import com.sun.org.apache.xpath.internal.operations.Mod;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.util.ClassUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.awt.*;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Controller
public class GoodsController {

@Autowired
private GoodsService goodsService;
@Autowired
private CategoryService categoryService;

@RequestMapping("/suggest/{categoryId}")
public String querySuggest(@PathVariable Integer categoryId, Model model){
    List<Goods> list = goodsService.queryGoodsByCid(categoryId, new Page()).getList();
    model.addAttribute("goods",list);
    System.out.println("list = " + list);;
    for (Goods goods : list) {
        System.out.println(goods);
    }
    return "suggest";
}

@RequestMapping("/goods/{goodsId}")
public String queryGoods(@PathVariable Integer goodsId,Model model){
    Goods goods = goodsService.queryGoodsById(goodsId);
    model.addAttribute("goods",goods);
    return "detail";
}

@RequestMapping("/allGoods/{categoryId}")
public String queryAllGoods(@PathVariable Integer categoryId,
                              Page page,@RequestParam(defaultValue = "0") Integer condition,
                            Model model){
    PageInfo<Goods> goodsPageInfo = goodsService.queryGoodsByCidAndCondition(categoryId, page, condition);
    model.addAttribute("info",goodsPageInfo);
    model.addAttribute("page",page);
    model.addAttribute("condition",condition);
    System.out.println(goodsPageInfo);
    System.out.println(page);
    return "list";
}

//获取后台展示页面
@RequestMapping("/back/getList")
public String getList(){
    return "back_list";
}

//后台展示页面
@RequestMapping("/back/list")
public String backList(@RequestParam(defaultValue = "1")int pageNum,
                                @RequestParam(defaultValue = "3")int pageSize,
                                @RequestParam(defaultValue = "")String title,
                                Model model){
    PageInfo<Goods> pageInfo = goodsService.selectAllGoodsByTitle(title, pageNum, pageSize);
    model.addAttribute("title",title);
    model.addAttribute("pageInfo",pageInfo);
    return "back_list";
}

@RequestMapping("/back/getAdd")
public String getAdd(Model model){
    List<Category> categories = categoryService.queryAll();
    model.addAttribute("categories",categories);
    return "back_insert";
}

@RequestMapping("/back/add")
@ResponseBody
public Map insertGoods(Goods goods){
    int i = goodsService.insertGoods(goods);
    Map<String,Integer> map = new HashMap<String,Integer>();
    if (i == 0){
        map.put("code",0);
        return map;
    }
    map.put("code",1);
    return map;
}

@RequestMapping("/back/getUpdate/{id}")
public String getUpdate(Model model,@PathVariable Integer id){
    List<Category> categories = categoryService.queryAll();
    model.addAttribute("categories",categories);
    Goods goods = goodsService.queryGoodsById(id);
    model.addAttribute("goods",goods);
    return "back_update";
}

@RequestMapping("/back/update")
@ResponseBody
public Map backUpdate(Goods goods){
    int i = goodsService.updateGoods(goods);
    Map<String,Integer> map = new HashMap<String,Integer>();
    if (i != 0){
        map.put("code",i);
        return map;
    }else {
        map.put("code",0);
        return map;
    }
}

@RequestMapping("/back/del/{id}")
@ResponseBody
public Integer del(@PathVariable Integer id){
    return goodsService.deleteGoods(id);
}

@PostMapping("/pic")
@ResponseBody
public Map pic(HttpServletRequest request, MultipartFile tou) throws IOException {

    //获得服务器项目地址
    String path = ClassUtils.getDefaultClassLoader().getResource("").getPath();
    String filename = tou.getOriginalFilename();
    String fullPath = (path+"static/images/goods/"+filename);
    System.out.println("fullPath = " + fullPath);
    tou.transferTo(new File(fullPath));
    Map map = new HashMap();
    map.put("iName",filename);
    return map;
}
@PostMapping("/pic2")
@ResponseBody
public Map pic2(HttpServletRequest request, MultipartFile tou) throws IOException {

    //获得服务器项目地址
    String path = ClassUtils.getDefaultClassLoader().getResource("").getPath();
    String filename = tou.getOriginalFilename();
    String fullPath = (path+"static/images/"+filename);
    System.out.println("fullPath = " + fullPath);
    tou.transferTo(new File(fullPath));
    Map map = new HashMap();
    map.put("iName",filename);
    return map;
}
}

controller.UserController

package com.itqf.shengxian1125.controller;

import com.google.code.kaptcha.impl.DefaultKaptcha;
import com.itqf.shengxian1125.pojo.User;
import com.itqf.shengxian1125.service.UserService;
import com.itqf.shengxian1125.vo.UserVo;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.subject.Subject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.imageio.ImageIO;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.awt.image.BufferedImage;
import java.io.IOException;

@Controller
public class UserController {

@Autowired
private UserService userService;
@Autowired
private DefaultKaptcha defaultKaptcha;

//首页
@RequestMapping("/")
public String index(){
    return "redirect:/getLogin";
}

@RequestMapping("/verify")
@ResponseBody
public UserVo verify(String uUsername) throws InterruptedException {
    Thread.sleep(2000);
    User user = userService.selectUserByUsername(uUsername);
    UserVo userVo = new UserVo();
    if (StringUtils.isEmpty(user)){
        userVo.setCode(1);
        userVo.setMsg("您的用户名可用!");
        userVo.setData(user);
    }else {
        userVo.setCode(0);
        userVo.setMsg("您的用户名不可用!");
        userVo.setData(null);
    }
    return userVo;
}

@RequestMapping("/getRegist")
public String getRegist(){
    return "register";
}

@RequestMapping("/regist")
@ResponseBody
public UserVo regist(User user){
    int i = userService.insertUser(user);
    UserVo userVo = new UserVo();
    if (i != 0){
        userVo.setCode(1);
        userVo.setMsg("您已经成功注册!");
        userVo.setData(null);
    }else {
        userVo.setCode(0);
        userVo.setMsg("出现位置异常!");
        userVo.setData(null);
    }
    return userVo;
}

@RequestMapping("/getLogin")
public String getLogin(Model model){
    if (SecurityUtils.getSubject().getPrincipal()!=null) {
        String  userName = ((User) SecurityUtils.getSubject().getPrincipal()).getUUsername();
        model.addAttribute("showUsername", userName);
    }
    return "login";
}

@RequestMapping("/login")
@ResponseBody
public UserVo login(User user,Integer remember,HttpSession session){
    System.out.println("doLogin");
    Subject subject = SecurityUtils.getSubject();
    UsernamePasswordToken token = new UsernamePasswordToken(user.getUUsername(), user.getUPassword());
    if (!StringUtils.isEmpty(remember) && remember == 1){
        token.setRememberMe(true);
    }
    UserVo userVo = new UserVo();
    try {
        subject.login(token);
        User user1 = (User)subject.getPrincipal();
        if (!StringUtils.isEmpty(session.getAttribute("user"))){
            session.removeAttribute("user");
        }
        session.setAttribute("user",user1);
        userVo.setCode(1);
        userVo.setMsg("成功登录!");
        userVo.setData(user1);
        return userVo;
    } catch (AuthenticationException e) {
        e.printStackTrace();
        userVo.setCode(0);
        userVo.setMsg("登录失败!");
        userVo.setData(null);
        return userVo;
    }
}

@RequestMapping("/getIndex")
public String getIndex(){
    return "index";
}

@GetMapping("/captcha")
public void getCaptcha(HttpSession session, HttpServletResponse response) throws IOException {
    response.setDateHeader("Expires", 0);
    response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate");
    response.addHeader("Cache-Control", "post-check=0, pre-check=0");
    response.setHeader("Pragma", "no-cache");
    response.setContentType("image/jpeg");
    //生成验证码
    String capText = defaultKaptcha.createText();
    session.setAttribute("code", capText);
    //向客户端写出
    BufferedImage bi = defaultKaptcha.createImage(capText);
    ServletOutputStream out = response.getOutputStream();
    ImageIO.write(bi, "jpg", out);
    try {
        out.flush();
    } finally {
        out.close();
    }
}

//验证code
@RequestMapping("/captcha/verify")
@ResponseBody
public UserVo verifyCaptcha(String captcha,HttpSession session){
    String code = (String)session.getAttribute("code");
    UserVo userVo = new UserVo();
    if (captcha.equalsIgnoreCase(code)){
        userVo.setCode(1);
        userVo.setMsg("验证成功!");
        userVo.setData(null);
        return userVo;
    }else {
        userVo.setCode(0);
        userVo.setMsg("验证失败!");
        userVo.setData(null);
        return userVo;
    }
}

//403
@RequestMapping("/403")
public String getUnAuth(){
    return "403";
}

//退出
@RequestMapping("/logout")
public String logout(){
    return "login";
}
}

dto.Page

package com.itqf.shengxian1125.dto;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Page {

private Integer pageNum = 1;
private Integer pageSize = 4;

}

mapper.CategoryMapper

package com.itqf.shengxian1125.mapper;

import com.itqf.shengxian1125.pojo.Category;

import java.util.List;

public interface CategoryMapper {
//查所有
List<Category> queryAll();
}

mapper.GoodsMapper

package com.itqf.shengxian1125.mapper;

import com.itqf.shengxian1125.pojo.Goods;
import org.apache.ibatis.annotations.Param;

import java.util.List;

public interface GoodsMapper {

//通过类别id查询
List<Goods> queryGoodsByCid(Integer cateId);
//查询详情
Goods queryGoodsById(Integer id);

//通过商品名称查询
List<Goods> selectAllGoodsByTitle(@Param("title")String title);
//添加商品
int insertGoods(Goods goods);
//删除商品
int deleteGoods(int id);
//修改商品
int updateGoods(Goods goods);
}

mapper.UserMapper

package com.itqf.shengxian1125.mapper;

import com.itqf.shengxian1125.pojo.User;

import java.util.Set;

public interface UserMapper {

//注册
int insertUser(User user);

//检查用户名是否存在
User selectUserByUsername(String uUsermame);

//查权限角色
User selectUsersAndRolesAndPermissions(String uUsername);

//查角色
Set<String> selectRolesByUsername(String uUsername);

//查权限
Set<String> selectPermissionsByRoles(Set<String> roleList);
}

pojo.Category

package com.itqf.shengxian1125.pojo;

import lombok.*;

import java.io.Serializable;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Category implements Serializable {

private Integer id;

private String title;

private String imgClass;

private String bannerFile;

private java.util.Date createTime;
}

pojo.Goods

package com.itqf.shengxian1125.pojo;

import lombok.*;
import org.springframework.format.annotation.DateTimeFormat;

import java.io.Serializable;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Goods implements Serializable {

private Integer id;

private String title;

private String detail;

private String description;

private java.math.BigDecimal price;

private String imgFile;

private String detailImgFile;

@DateTimeFormat(pattern = "yyyy-MM-dd")
private java.util.Date createTime;

private Integer cateId;

private Category category;

}

pojo.Menu

package com.itqf.shengxian1125.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Menu implements Serializable {

private Integer mId;
private String mName;
private String mUrl;
}

pojo.Role

package com.itqf.shengxian1125.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;
import java.util.List;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Role implements Serializable {

private Integer rId;
private String rName;
private List<Menu> menuList;

}

pojo.User

package com.itqf.shengxian1125.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class User implements Serializable {

private Integer uId;
private String uUsername;
private String uPassword;
private Integer uState;
private String uEmail;
private String uSalt;
private Date uCreatetime;
private List<Role> roleList;

}

realm.MyRealm

package com.itqf.shengxian1125.realm;

import com.itqf.shengxian1125.pojo.User;
import com.itqf.shengxian1125.service.UserService;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.apache.shiro.util.ByteSource;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.Set;

public class MyRealm extends AuthorizingRealm {

@Autowired
private UserService userService;

@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
    User user = (User)principalCollection.getPrimaryPrincipal();
    Set<String> roleList = userService.selectRolesByUsername(user.getUUsername());
    System.out.println("roleList = " + roleList);
    Set<String> permissions = userService.selectPermissionsByRoles(roleList);
    System.out.println("permissions = " + permissions);
    SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo();
    simpleAuthorizationInfo.setRoles(roleList);
    simpleAuthorizationInfo.setStringPermissions(permissions);
    return simpleAuthorizationInfo;
}

@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
    String uUsername = (String)authenticationToken.getPrincipal();
    User user = userService.selectUsersAndRolesAndPermissions(uUsername);
    System.out.println("user = " + user);
    if (user == null){
        return null;
    }else {
        System.out.println(ByteSource.Util.bytes(user.getUSalt()));
        SimpleAuthenticationInfo simpleAuthenticationInfo = new SimpleAuthenticationInfo(user,user.getUPassword(), ByteSource.Util.bytes(user.getUSalt()),"MyRealm");
        return simpleAuthenticationInfo;
    }
}
}

service.CategoryService

package com.itqf.shengxian1125.service;

import com.itqf.shengxian1125.pojo.Category;

import java.util.List;

public interface CategoryService {

//查所有
List<Category> queryAll();

}

service.GoodsService

package com.itqf.shengxian1125.service;

import com.github.pagehelper.PageInfo;
import com.itqf.shengxian1125.dto.Page;
import com.itqf.shengxian1125.pojo.Goods;

import java.util.List;

public interface GoodsService {

//通过类别id查询
PageInfo<Goods> queryGoodsByCid(Integer cateId, Page page);
//查询详情
Goods queryGoodsById(Integer id);
//通过类别id查询
PageInfo<Goods> queryGoodsByCidAndCondition(Integer cateId, Page page, Integer condition);

//通过商品名称查询
PageInfo<Goods> selectAllGoodsByTitle(String title,int currentPage,int pageSize);
//添加商品
int insertGoods(Goods goods);
//删除商品
int deleteGoods(int id);
//修改商品
int updateGoods(Goods goods);

}

service.UserService

package com.itqf.shengxian1125.service;

import com.itqf.shengxian1125.pojo.User;

import java.util.Set;

public interface UserService {

//注册
int insertUser(User user);

//检查用户名是否存在
User selectUserByUsername(String uUsermame);

//查权限角色
User selectUsersAndRolesAndPermissions(String uUsername);

//查角色
Set<String> selectRolesByUsername(String uUsername);

//查权限
Set<String> selectPermissionsByRoles(Set<String> roleList);

}

service.impl.CategoryServiceImpl

package com.itqf.shengxian1125.service.impl;

import com.itqf.shengxian1125.mapper.CategoryMapper;
import com.itqf.shengxian1125.pojo.Category;
import com.itqf.shengxian1125.service.CategoryService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class CategoryServiceImpl implements CategoryService {

@Autowired
private CategoryMapper categoryMapper;

@Override
public List<Category> queryAll() {
    return categoryMapper.queryAll();
}
}

service.impl.GoodsServiceImpl

package com.itqf.shengxian1125.service.impl;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.itqf.shengxian1125.dto.Page;
import com.itqf.shengxian1125.mapper.GoodsMapper;
import com.itqf.shengxian1125.pojo.Goods;
import com.itqf.shengxian1125.service.GoodsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Service
public class GoodsServiceImpl implements GoodsService {

@Autowired
private GoodsMapper goodsMapper;

@Override
public PageInfo<Goods> queryGoodsByCid(Integer cateId, Page page) {
    PageHelper.startPage(page.getPageNum(),page.getPageSize());
    PageHelper.orderBy("goods.create_time desc");
    return new PageInfo<>(goodsMapper.queryGoodsByCid(cateId));
}

@Override
public Goods queryGoodsById(Integer id) {
    return goodsMapper.queryGoodsById(id);
}

//分页查
@Override
public PageInfo<Goods> queryGoodsByCidAndCondition(Integer cateId, Page page ,Integer condition) {
    PageHelper.startPage(page.getPageNum(),page.getPageSize());
    System.out.println(condition);
    if (condition == 0){
        PageHelper.orderBy("goods.id desc");
    }else if (condition == 1){
        PageHelper.orderBy("goods.price desc");
    }else if (condition == 2){
        PageHelper.orderBy("goods.create_time desc");
    }
    List<Goods> goods = goodsMapper.queryGoodsByCid(cateId);
    return new PageInfo<>(goods);
}

@Override
public PageInfo<Goods> selectAllGoodsByTitle(String title, int currentPage, int pageSize) {
    PageHelper.startPage(currentPage,pageSize);
    PageHelper.orderBy("goods.id desc");
    return new PageInfo<>(goodsMapper.selectAllGoodsByTitle(title));
}

@Override
@Transactional
public int insertGoods(Goods goods) {
    return goodsMapper.insertGoods(goods);
}

@Override
@Transactional
public int deleteGoods(int id) {
    return goodsMapper.deleteGoods(id);
}

@Override
@Transactional
public int updateGoods(Goods goods) {
    return goodsMapper.updateGoods(goods);
}
}

service.impl.UserServiceImpl

package com.itqf.shengxian1125.service.impl;

import com.itqf.shengxian1125.mapper.UserMapper;
import com.itqf.shengxian1125.pojo.User;
import com.itqf.shengxian1125.service.UserService;
import org.apache.shiro.crypto.hash.Sha256Hash;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Set;
import java.util.UUID;

import static com.itqf.shengxian1125.constant.MyConstant.iteConstant;

@Service
public class UserServiceImpl implements UserService {

@Autowired
private UserMapper userMapper;

@Override
@Transactional
public int insertUser(User user) {
    //SHA-256
    String salt = UUID.randomUUID().toString();
    String enPassword = new Sha256Hash(user.getUPassword(),salt,iteConstant).toString();
    user.setUPassword(enPassword);
    user.setUSalt(salt);
    return userMapper.insertUser(user);
}

@Override
public User selectUserByUsername(String uUsermame) {
    return userMapper.selectUserByUsername(uUsermame);
}

@Override
public User selectUsersAndRolesAndPermissions(String uUsername) {
    return userMapper.selectUsersAndRolesAndPermissions(uUsername);
}

@Override
public Set<String> selectRolesByUsername(String uUsername) {
    return userMapper.selectRolesByUsername(uUsername);
}

@Override
public Set<String> selectPermissionsByRoles(Set<String> roleList) {
    return userMapper.selectPermissionsByRoles(roleList);
}
}

vo.UserVo

package com.itqf.shengxian1125.vo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class UserVo {

private Integer code;
private String msg;
private Object data;

}

ShengxianApplication

package com.itqf.shengxian1125;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@SpringBootApplication
@MapperScan(basePackages = "com.itqf.shengxian1125.mapper")
@EnableTransactionManagement
public class Shengxian1125Application {

public static void main(String[] args) {
    SpringApplication.run(Shengxian1125Application.class, args);
}

}

resources

mapper.CategoryMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.itqf.shengxian1125.mapper.CategoryMapper">

<!--//查所有-->
<!--List<Category> queryAll();-->
<select id="queryAll" resultType="Category">
    select * from category
</select>

</mapper>

mapper.GoodsMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.itqf.shengxian1125.mapper.GoodsMapper">

<!--//通过类别id查询-->
<!--List<Goods> queryGoodsByCid(Integer cateId);-->
<resultMap id="goods" type="Goods">
    <id property="id" column="id"></id>
    <association property="category" javaType="Category">
        <id column="cid" property="id"></id>
        <result column="ctitle" property="title"></result>
    </association>
</resultMap>
<select id="queryGoodsByCid" resultMap="goods">
    select
    goods.id,goods.title,detail,description,price,img_file imgFile,detail_img_file detailImgFile,goods.create_time createTime,
    category.id cid,category.banner_file bannerFile,category.title ctitle
    from category join goods on category.id = goods.cate_id
    where category.id = #{cateId}
</select>

<!--//查询详情-->
<!--Goods queryGoodsById(Integer id);-->
<select id="queryGoodsById" resultType="Goods">
    select id, title, detail, description, price, img_file, detail_img_file, create_time, cate_id
    from goods
    where id = #{id}
</select>


<!--//通过商品名称查询-->
<!--List<Goods> selectAllGoodsByTitle(@Param("title")String title);-->
<resultMap id="goods2" type="Goods">
    <id property="id" column="id"></id>
    <association property="category" javaType="Category">
        <id column="cid" property="id"></id>
        <result column="ctitle" property="title"></result>
    </association>
</resultMap>
<select id="selectAllGoodsByTitle" resultMap="goods2">
    select
    goods.id,goods.title,detail,description,price,img_file imgFile,detail_img_file detailImgFile,goods.create_time createTime,
    category.id cid,category.banner_file bannerFile,category.title ctitle
    from category join goods on category.id = goods.cate_id
    <where>
        <if test="title != null and title != ''">
            and goods.title like "%"#{title}"%"
        </if>
    </where>
</select>

<!--//添加商品-->
<!--int insertGoods(Goods goods);-->
<insert id="insertGoods" parameterType="Goods">
    insert into goods (title, detail, description, price, img_file, detail_img_file, create_time, cate_id)
    values (#{title}, #{detail}, #{description}, #{price}, #{imgFile}, #{detailImgFile}, #{createTime}, #{cateId})
</insert>
<!--//删除商品-->
<!--int deleteGoods(int id);-->
<delete id="deleteGoods">
    delete from goods where id = #{id}
</delete>
<!--//修改商品-->
<!--int updateGoods(Goods goods);-->
<update id="updateGoods" parameterType="Goods">
    update goods
    <set>
        <if test="title != null and title != ''">
            title = #{title}
        </if>
        <if test="detail != null and detail != ''">
            ,detail = #{detail}
        </if>
        <if test="description != null and description != ''">
            ,description = #{description}
        </if>
        <if test="price != null and price != ''">
            ,price = #{price}
        </if>
        <if test="imgFile != null and imgFile != ''">
            ,img_file = #{imgFile}
        </if>
        <if test="detailImgFile != null and detailImgFile != ''">
            ,detail_img_file = #{detailImgFile}
        </if>
        <if test="createTime != null">
            ,create_time = #{createTime}
        </if>
        <if test="cateId != null and cateId != ''">
            ,cate_id = #{cateId}
        </if>
    </set>
    where id = #{id}
</update>

</mapper>

UserMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.itqf.shengxian1125.mapper.UserMapper">

<!--//注册-->
<!--int insertUser(User user);    -->
<insert id="insertUser" parameterType="User">
    insert into user(u_username, u_password, u_email, u_salt)
    values (#{uUsername},#{uPassword},#{uEmail},#{uSalt})
</insert>

<!--//检查用户名是否存在-->
<!--int selectUserByUsername(String uUsermame);-->
<select id="selectUserByUsername" resultType="User">
    select * from user where u_username = #{uUsername};
</select>

<!--//查权限角色-->
<!--Users selectUsersAndRolesAndPermissions(String uUsername);-->
<resultMap id="usermap" type="user">
    <id property="uId" column="u_id"/>
    <collection property="roleList" ofType="role">
        <id column="rId" property="r_id"/>
        <collection property="menuList" ofType="menu">
            <id property="mId" column="m_id"/>
        </collection>
    </collection>
</resultMap>
<select id="selectUsersAndRolesAndPermissions" resultMap="usermap">
    select u.*,r.*,m.*
    from user u join user_role ur on u.u_id = ur.u_id
    join role r on ur.r_id = r.r_id
    join role_menu rm on rm.r_id = r.r_id
    join menu m on rm.m_id = m.m_id
    where u.u_username = #{uUsername}
</select>

<!--//查角色-->
<!--Set<String> selectRolesByUsername(String uUsername);-->
<select id="selectRolesByUsername" resultType="String">
    select r.r_name
    from user u join user_role ur on u.u_id=ur.u_id
    join role r on ur.r_id = r.r_id
    where u.u_username = #{uUsername}
</select>

<!--//查权限-->
<!--Set<String> selectPermissionsByRoles(Set<String> roleList);-->
<select id="selectPermissionsByRoles" resultType="String">
    select  m.m_name
    from role r join role_menu rm on r.r_id = rm.r_id
    join menu m on rm.m_id = m.m_id
    where r.r_name in
    <foreach collection="collection" open="(" close=")" separator="," item="rname">
        #{rname}
    </foreach>
</select>

</mapper>

static.css/images/js

templates.403.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title></title>
</head>
<body>
<div style="text-align: center">
    <h2 style="color: red">
        您没有权限哦!
    </h2>
    <div>
        <button type="button" onclick="history.back();" class="btn btn-success">返回</button>
    </div>
</div>
</body>
</html>

templates.back_add.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
</body>
</html>

templates.back_insert.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>添加</title>
<script type="text/javascript" th:src="@{/js/jquery-1.11.0.js}"></script>
<script type="text/javascript" th:src="@{/js/bootstrap.js}" ></script>
<link href="https://cdn.bootcss.com/twitter-bootstrap/3.0.1/css/bootstrap.css" rel="stylesheet">
</head>
<body>
<div class="container">
<div class="row clearfix">
    <div class="col-md-12 column">
        <h3 class="text-success" style="text-align: center">
            添加商品
        </h3>
        <form class="form-horizontal" role="form" id="form">
            <div class="form-group">
                <label for="title" class="col-sm-2 control-label">商品名称</label>
                <div class="col-sm-10">
                    <input type="text" class="form-control" id="title" name="title"/>
                </div>
            </div>
            <div class="form-group">
                <label for="detail" class="col-sm-2 control-label">商品详情</label>
                <div class="col-sm-10">
                    <input type="text" class="form-control" id="detail" name="detail"/>
                </div>
            </div>
            <div class="form-group">
                <label for="description" class="col-sm-2 control-label">商品描述</label>
                <div class="col-sm-10">
                    <input type="text" class="form-control" id="description" name="description" />
                </div>
            </div>
            <div class="form-group">
                <label for="price" class="col-sm-2 control-label">商品价格</label>
                <div class="col-sm-10">
                    <input type="text" class="form-control" id="price" name="price"/>
                </div>
            </div>
            <div class="form-group">
                <label for="imgFile2" class="col-sm-2 control-label">商品图片</label>
                <div class="col-sm-10" id="tou1">
                    <input id="imgFile" type="hidden" name="imgFile" >
                    <input type="file" class="form-control" id="imgFile2" name="imgFile2" placeholder="请上传图片"/>
                    <button type="button" onclick="upimg1()">上传</button>
                </div>
            </div>
            <div class="form-group">
                <label for="detailImgFile2" class="col-sm-2 control-label">商品详图</label>
                <div class="col-sm-10" id="tou2">
                    <input id="detailImgFile" type="hidden" name="detailImgFile" >
                    <input type="file" class="form-control" id="detailImgFile2" name="detailImgFile2" placeholder="请上传详图"/>
                    <button type="button" onclick="upimg2()">上传</button>
                </div>
            </div>
            <div class="form-group">
                <label for="createTime" class="col-sm-2 control-label">上架时间</label>
                <div class="col-sm-10">
                    <input type="date" class="form-control" id="createTime" name="createTime"/>
                </div>
            </div>
            <div class="form-group">
                <label for="cateId" class="col-sm-2 control-label">商品类别</label>
                <div class="col-sm-10">
                    <select required id="cateId" name="cateId">
                        <option selected disabled>--请选择--</option>
                        <option th:each="category : ${categories}" th:value="${category.id}" th:text="${category.title}" ></option>
                    </select>
                </div>
            </div>
            <div class="form-group">
                <div class="col-sm-offset-2 col-sm-10">
                    <button type="button" class="btn btn-default" onclick="add()">添加</button>
                    <button type="button" onclick="history.back();" class="btn btn-success">返回</button>
                </div>
            </div>
        </form>
    </div>
</div>
</div>
</body>
<script type="text/javascript">

function add() {
    var data = $("form").serialize();
    $.ajax({
        url:"/back/add",
        type:"post",
        data:data,
        dataType:"json",
        success:function (data) {
            if (data.code === 0){
                alert("添加失败!");
                location.href="/back/getAdd";
            } else {
                alert("添加成功!");
                location.href="/back/list";
            }
        }
    });
}

function upimg1(){
    var formData = new FormData;
    formData.append("tou",$("#imgFile2")[0].files[0]);
    var tou = $("#imgFile");
    $.ajax({
        url:"/pic",
        type:"post",
        data:formData,
        processData:false,
        contentType:false,
        success:function (data) {
            alert('上传成功!');
            var img = '<img alt="商品图片" src="http://localhost/images/goods/'+data.iName+'" width="100px" height="100px">';
            tou.attr('value',data.iName);
            $("#tou1").append(img);
        }
    })
}

function upimg2(){
    var formData = new FormData;
    formData.append("tou",$("#detailImgFile2")[0].files[0]);
    var tou = $("#detailImgFile");
    $.ajax({
        url:"/pic2",
        type:"post",
        data:formData,
        processData:false,
        contentType:false,
        success:function (data) {
            alert('上传成功!');
            var img = '<img alt="商品详图" src="http://localhost/images/'+data.iName+'" width="150px" height="150px">';
            tou.attr('value',data.iName);
            $("#tou2").append(img);
        }
    })
}

</script>
</html>

templates.back_list.html

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>后台首页</title>
<link href="https://cdn.bootcss.com/twitter-bootstrap/2.0.4/css/bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet" type="text/css" th:href="@{/css/reset.css}">
<link rel="stylesheet" type="text/css" th:href="@{/css/main.css}">
<script type="text/javascript" th:src="@{/js/jquery-1.12.4.min.js}"></script>
<script type="text/javascript" th:src="@{/js/jquery-ui.min.js}"></script>
</head>
<body>
<div class="container-fluid">

<div class="row-fluid">
    <div>
        <a th:href="@{/getIndex}" class="logo fl"><img th:src="@{/images/logo.png}"></a>
        <h1 style="margin-left: 500px;margin-top:50px;font-size: 50px;color: red">
            商品信息列表
        </h1>
    </div>
</div>
<div class="row-fluid">
    <div class="span8">
        <form id="form" th:action="@{/back/list}" method="get" class="form-horizontal">
            <input id="page" name="pageNum" value="1" type="hidden" />
            <div class="control-group">
                <label class="control-label" for="title">商品名</label>
                <div class="controls">
                    <input id="title" name="title" th:value="${title}" type="text" placeholder="请输入查询条件"/>
                    &nbsp;&nbsp;&nbsp;&nbsp;
                    <button type="submit" class="btn">查询</button>
                </div>
            </div>
        </form>
    </div>
    <div class="span4">
        <button class="btn" type="button" onclick="location.href='/back/getAdd'">添加商品</button>
    </div>
</div>
<div class="row-fluid">
    <div class="span12">
        <table class="table table-bordered table-hover table-condensed">
            <thead>
            <tr>
                <th>
                    序号
                </th>
                <th>
                    商品名
                </th>
                <th>
                    详情
                </th>
                <th>
                    描述
                </th>
                <th>
                    价格
                </th>
                <th>
                    图片
                </th>
                <th>
                    大图
                </th>
                <th>
                    上架时间
                </th>
                <th>
                    类别
                </th>
                <th>
                    操作
                </th>
            </tr>
            </thead>
            <tbody>
            <tr th:each="goods : ${pageInfo.list}">
                <td th:text="${goods.id}"></td>
                <td th:text="${goods.title}"></td>
                <td width="250px" th:text="${goods.detail}"></td>
                <td width="400px" th:text="${goods.description}"></td>
                <td th:text="${goods.price}"></td>
                <td><img width="80px" th:src="@{/images/goods/__${goods.imgFile}__}" alt="小图"></td>
                <td><img width="80px" th:src="@{/images/__${goods.detailImgFile}__}" alt="详情图"></td>
                <td th:text="${#dates.format(goods.createTime,'yyyy/MM/dd')}"></td>
                <td th:text="${goods.category.title}"></td>
                <td>
                    <a href="javascript:;" th:onclick="'update(this,' + ${goods.id} + ')'">修改</a>
                    <a href="javascript:;" th:onclick="'del(this,' + ${goods.id} + ')'">删除</a>
                </td>
            </tr>
            </tbody>
        </table>
        <div class="pagination" style="text-align: center">
            <ul >
                <li>
                    <a href="javascript:;" th:onclick="page(1)" th:if="${pageInfo.pageNum>1}">首页</a>
                </li>
                <li >
                    <a href="javascript:;" th:onclick="'page(' + ${pageInfo.prePage} + ')'" th:style="${pageInfo.pageNum}>1?'':'pointer-events: none'">上一页</a>
                </li>
                <li>
                    <a href="javascript:;" th:onclick="'page(' + ${pageInfo.nextPage} + ')'" th:style="${pageInfo.pageNum}<${pageInfo.pages}?'':'pointer-events: none;'" >下一页</a>
                </li>
                <li>
                    <a href="javascript:;" th:onclick="'page(' + ${pageInfo.pages} + ')'" th:if="${pageInfo.pageNum<pageInfo.pages}">尾页</a>
                </li>
            </ul>
            <div th:if=" ${pageInfo.pageNum>0}">当前第 <i th:text="${pageInfo.pageNum}"></i> 页 / 共 <i th:text="${pageInfo.pages}"></i> 页 (共 <i th:text="${pageInfo.total}"></i> 条)</div>
        </div>
    </div>
</div>
<div th:replace="foot::footer"></div>
</div>
<script type="text/javascript" th:inline="javascript">
// 分页
function page(pageNum){
    //1. 选中form表单中的隐藏域,赋值.
    document.getElementById("page").value = pageNum;
    //2. 选中form标签对象,手动提交.
    document.getElementById("form").submit();
}

// 删除
function del(obj,id){
    // 发送ajax请求删除.
    $.ajax({
        url:"/back/del/" + id,
        data:null,
        success:function (ret) {
            if (ret === 1){
                $(obj).parent().parent().remove();
                alert("删除成功!");
            } else{
                alert("删除失败!");
            }
        }
    });
}

// 修改
function update(obj,id){
   location.href='/back/getUpdate/'+id;
}

</script>
</body>
</html>

templates.back_update.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>修改</title>
<script type="text/javascript" th:src="@{/js/jquery-1.11.0.js}"></script>
<script type="text/javascript" th:src="@{/js/bootstrap.js}" ></script>
<link href="https://cdn.bootcss.com/twitter-bootstrap/3.0.1/css/bootstrap.css" rel="stylesheet">
</head>
<body>
<div class="container">
<div class="row clearfix">
    <div class="col-md-12 column">
        <h3 class="text-success" style="text-align: center">
            修改商品
        </h3>
        <form class="form-horizontal" role="form" id="form">
            <input type="hidden" class="form-control" id="id" name="id" th:value="${goods.id}"/>
            <div class="form-group">
                <label for="title" class="col-sm-2 control-label">商品名称</label>
                <div class="col-sm-10">
                    <input type="text" class="form-control" id="title" name="title" th:value="${goods.title}"/>
                </div>
            </div>
            <div class="form-group">
                <label for="detail" class="col-sm-2 control-label">商品详情</label>
                <div class="col-sm-10">
                    <input type="text" class="form-control" id="detail" name="detail" th:value="${goods.detail}"/>
                </div>
            </div>
            <div class="form-group">
                <label for="description" class="col-sm-2 control-label">商品描述</label>
                <div class="col-sm-10">
                    <input type="text" class="form-control" id="description" name="description" th:value="${goods.description}"/>
                </div>
            </div>
            <div class="form-group">
                <label for="price" class="col-sm-2 control-label">商品价格</label>
                <div class="col-sm-10">
                    <input type="text" class="form-control" id="price" name="price" th:value="${goods.price}"/>
                </div>
            </div>
            <div class="form-group">
                <label for="imgFile2" class="col-sm-2 control-label">商品图片</label>
                <div class="col-sm-10" id="tou1">
                    <input id="imgFile" type="hidden" name="imgFile" >
                    <input type="file" class="form-control" id="imgFile2" name="imgFile2" placeholder="请上传图片"/>
                    <button type="button"  onclick="upimg1()">上传</button>
                    <img id="imgfile3" alt="商品图片" th:src="'http://localhost/images/goods/'+${goods.imgFile}" width="100px" height="100px"/>
                </div>
            </div>
            <div class="form-group">
                <label for="detailImgFile2" class="col-sm-2 control-label">商品详图</label>
                <div class="col-sm-10" id="tou2">
                    <input id="detailImgFile" type="hidden" name="detailImgFile" >
                    <input type="file" class="form-control" id="detailImgFile2" name="detailImgFile2" placeholder="请上传详图"/>
                    <button type="button" onclick="upimg2()">上传</button>
                    <img  id="detailImgFile3" alt="商品详图" th:src="'http://localhost/images/'+${goods.detailImgFile}" width="150px" height="150px"/>;
                </div>
            </div>
            <div class="form-group">
                <label for="createTime" class="col-sm-2 control-label">上架时间</label>
                <div class="col-sm-10">
                    <input type="date" class="form-control" id="createTime" name="createTime" placeholder="yyyy-MM-dd" th:value="${#dates.format(goods.createTime,'yyyy/MM/dd')}"/>
                </div>
            </div>
            <div class="form-group">
                <label for="cateId" class="col-sm-2 control-label">商品类别</label>
                <div class="col-sm-10">
                    <select required id="cateId" name="cateId">
                        <option th:each="category : ${categories}" th:value="${category.id}" th:text="${category.title}" th:selected="${goods.cateId == category.id}"></option>
                        <option disabled hidden >--请选择--</option>
                    </select>
                </div>
            </div>
            <div class="form-group">
                <div class="col-sm-offset-2 col-sm-10">
                    <button type="button" class="btn btn-default" onclick="update()">修改</button>
                    <button type="button" onclick="history.back();" class="btn btn-success">返回</button>
                </div>
            </div>
        </form>
    </div>
</div>
</div>
</body>
<script type="text/javascript">

function update() {
    var data = $("form").serialize();
    $.ajax({
        url:"/back/update",
        type:"post",
        data:data,
        dataType:"json",
        success:function (data) {
            if (data.code === 0){
                alert("修改失败!");
                location.href="/back/getUpdate";
            } else {
                alert("修改成功!");
                location.href="/back/list";
            }
        }
    });
}

function upimg1(){
    var formData = new FormData;
    formData.append("tou",$("#imgFile2")[0].files[0]);
    var tou = $("#imgFile");
    $.ajax({
        url:"/pic",
        type:"post",
        data:formData,
        processData:false,
        contentType:false,
        success:function (data) {
            alert('上传成功!');
            var img = '<img alt="商品图片" src="http://localhost/images/goods/'+data.iName+'" width="100px" height="100px">';
            tou.attr('value',data.iName);
            $("#imgfile3").remove();
            $("#tou1").append(img);
        }
    })
}

function upimg2(){
    var formData = new FormData;
    formData.append("tou",$("#detailImgFile2")[0].files[0]);
    var tou = $("#detailImgFile");
    $.ajax({
        url:"/pic2",
        type:"post",
        data:formData,
        processData:false,
        contentType:false,
        success:function (data) {
            alert('上传成功!');
            var img = '<img alt="商品详图" src="http://localhost/images/'+data.iName+'" width="150px" height="150px">';
            tou.attr('value',data.iName);
            $("#detailImgFile3").remove();
            $("#tou2").append(img);
        }
    })
}

</script>
</html>

templates.cart.html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 			"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>天天生鲜-购物车</title>
<link rel="stylesheet" type="text/css" href="css/reset.css">
<link rel="stylesheet" type="text/css" href="css/main.css">
</head>
<body>
<div class="header_con">
	<div class="header">
		<div class="welcome fl">欢迎来到天天生鲜!</div>
		<div class="fr">
			<div class="login_info fl">
				欢迎您:<em>张 山</em>
			</div>
			<div class="login_btn fl">
				<a href="login.html">登录</a>
				<span>|</span>
				<a href="register.html">注册</a>
			</div>
			<div class="user_link fl">
				<span>|</span>
				<a href="user_center_info.html">用户中心</a>
				<span>|</span>
				<a href="cart.html">我的购物车</a>
				<span>|</span>
				<a href="user_center_order.html">我的订单</a>
			</div>
		</div>
	</div>		
</div>

<div class="search_bar clearfix">
	<a href="index.html" class="logo fl"><img src="images/logo.png"></a>
	<div class="sub_page_name fl">|&nbsp;&nbsp;&nbsp;&nbsp;购物车</div>
	<div class="search_con fr">
		<input type="text" class="input_text fl" name="" placeholder="搜索商品">
		<input type="button" class="input_btn fr" name="" value="搜索">
	</div>		
</div>

<div class="total_count">全部商品<em>2</em>件</div>	
<ul class="cart_list_th clearfix">
	<li class="col01">商品名称</li>
	<li class="col02">商品单位</li>
	<li class="col03">商品价格</li>
	<li class="col04">数量</li>
	<li class="col05">小计</li>
	<li class="col06">操作</li>
</ul>
<ul class="cart_list_td clearfix">
	<li class="col01"><input type="checkbox" name="" checked></li>
	<li class="col02"><img src="images/goods/goods012.jpg"></li>
	<li class="col03">奇异果<br><em>25.80元/500g</em></li>
	<li class="col04">500g</li>
	<li class="col05">25.80元</li>
	<li class="col06">
		<div class="num_add">
			<a href="javascript:;" class="add fl">+</a>
			<input type="text" class="num_show fl" value="1">	
			<a href="javascript:;" class="minus fl">-</a>	
		</div>
	</li>
	<li class="col07">25.80元</li>
	<li class="col08"><a href="javascript:;">删除</a></li>
</ul>

<ul class="cart_list_td clearfix">
	<li class="col01"><input type="checkbox" name="" checked></li>
	<li class="col02"><img src="images/goods/goods003.jpg"></li>
	<li class="col03">大兴大棚草莓<br><em>16.80元/500g</em></li>
	<li class="col04">500g</li>
	<li class="col05">16.80元</li>
	<li class="col06">
		<div class="num_add">
			<a href="javascript:;" class="add fl">+</a>
			<input type="text" class="num_show fl" value="1">	
			<a href="javascript:;" class="minus fl">-</a>	
		</div>
	</li>
	<li class="col07">16.80元</li>
	<li class="col08"><a href="javascript:;">删除</a></li>
</ul>


<ul class="settlements">
	<li class="col01"><input type="checkbox" name="" checked=""></li>
	<li class="col02">全选</li>
	<li class="col03">合计(不含运费):<span>¥</span><em>42.60</em><br>共计<b>2</b>件商品</li>
	<li class="col04"><a href="place_order.html">去结算</a></li>
</ul>

<div class="footer">
	<div class="foot_link">
		<a href="#">关于我们</a>
		<span>|</span>
		<a href="#">联系我们</a>
		<span>|</span>
		<a href="#">招聘人才</a>
		<span>|</span>
		<a href="#">友情链接</a>		
	</div>
	<p>CopyRight © 2016 技术有限公司 All Rights Reserved</p>
	<p>电话:010-****888    京ICP备*******8号</p>
</div>

</body>
</html>

templates.category.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">

<ul class="subnav fl">
    <li th:each="cate:${cates}">
        <a th:href="'#'+${cate.id}" th:class="${cate.imgClass}" th:text="${cate.title}"></a>
    </li>
</ul>

</html>

templates.detail.html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" xml:lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>天天生鲜-商品详情</title>
<link rel="stylesheet" type="text/css" th:href="@{/css/reset.css}">
<link rel="stylesheet" type="text/css" th:href="@{/css/main.css}">

</head>
<body>
<div th:replace="head::header"></div>
<div th:replace="head::search"></div>

<div class="navbar_con">
	<div class="navbar clearfix">
		<div class="subnav_con fl">
			<h1>全部商品分类</h1>	
			<span></span>			
			<ul class="subnav">
				<li><a href="#" class="fruit">新鲜水果</a></li>
				<li><a href="#" class="seafood">海鲜水产</a></li>
				<li><a href="#" class="meet">猪牛羊肉</a></li>
				<li><a href="#" class="egg">禽类蛋品</a></li>
				<li><a href="#" class="vegetables">新鲜蔬菜</a></li>
				<li><a href="#" class="ice">速冻食品</a></li>
			</ul>
		</div>
		<ul class="navlist fl">
			<li><a href="">首页</a></li>
			<li class="interval">|</li>
			<li><a href="">手机生鲜</a></li>
			<li class="interval">|</li>
			<li><a href="">抽奖</a></li>
		</ul>
	</div>
</div>

<div class="breadcrumb">
	<a href="#">全部分类</a>
	<span>></span>
	<a href="#">新鲜水果</a>
	<span>></span>
	<a href="#">商品详情</a>
</div>

<div class="goods_detail_con clearfix">
	<div class="goods_detail_pic fl"><img th:src="@{/images/goods/__${goods.imgFile}__}"></div>

	<div class="goods_detail_list fr">
		<h3 th:text="${goods.title}"></h3>
		<p th:text="${goods.detail}"></p>
		<div class="prize_bar">
			<span class="show_pirze">¥<em th:text="${goods.price}"></em></span>
			<span class="show_unit">单  位:500g</span>
		</div>
		<div class="goods_num clearfix">
			<div class="num_name fl">数 量:</div>
			<div class="num_add fl">
				<input type="text" class="num_show fl" value="1">
				<a href="javascript:;" class="add fr">+</a>
				<a href="javascript:;" class="minus fr">-</a>	
			</div> 
		</div>
		<div class="total">总价:<em>16.80元</em></div>
		<div class="operate_btn">
			<a href="javascript:;" class="buy_btn">立即购买</a>
			<a href="javascript:;" class="add_cart" id="add_cart">加入购物车</a>				
		</div>
	</div>
</div>

<div class="main_wrap clearfix">
	<div class="l_wrap fl clearfix">
		<div class="new_goods">
			<h3>新品推荐</h3>
			<ul>
				<li>
					<a href="#"><img th:src="@{/images/goods/goods001.jpg}"></a>
					<h4><a href="#">进口柠檬</a></h4>
					<div class="prize">¥3.90</div>
				</li>
				<li>
					<a href="#"><img th:src="@{/images/goods/goods002.jpg}"></a>
					<h4><a href="#">玫瑰香葡萄</a></h4>
					<div class="prize">¥16.80</div>
				</li>
			</ul>
		</div>
	</div>

	<div class="r_wrap fr clearfix">
		<ul class="detail_tab clearfix">
			<li class="active">商品介绍</li>
			<li>评论</li>
		</ul>

		<div class="tab_content">
			<dl>
				<dt>商品详情:</dt>
				<dd>草莓采摘园位于北京大兴区 庞各庄镇四各庄村 ,每年1月-6月面向北京以及周围城市提供新鲜草莓采摘和精品礼盒装草莓,草莓品种多样丰富,个大香甜。所有草莓均严格按照有机标准培育,不使用任何化肥和农药。草莓在采摘期间免洗可以直接食用。欢迎喜欢草莓的市民前来采摘,也欢迎各大单位选购精品有机草莓礼盒,有机草莓礼盒是亲朋馈赠、福利送礼的最佳选择。 </dd>
			</dl>
		</div>

	</div>
</div>

<div th:replace="foot::footer"></div>
<div class="add_jump"></div>

<script type="text/javascript" th:src="@{/js/jquery-1.12.2.js}"></script>
<script type="text/javascript">
	var $add_x = $('#add_cart').offset().top;
	var $add_y = $('#add_cart').offset().left;

	var $to_x = $('#show_count').offset().top;
	var $to_y = $('#show_count').offset().left;

	$(".add_jump").css({'left':$add_y+80,'top':$add_x+10,'display':'block'})
	$('#add_cart').click(function(){
		$(".add_jump").stop().animate({
			'left': $to_y+7,
			'top': $to_x+7},
			"fast", function() {
				$(".add_jump").fadeOut('fast',function(){
					$('#show_count').html(2);
				});

		});
	})
</script>

</body>
</html>

templates.foot.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<div class="footer" th:fragment="footer">
<div class="foot_link">
    <a href="#">关于我们</a>
    <span>|</span>
    <a href="#">联系我们</a>
    <span>|</span>
    <a href="#">招聘人才</a>
    <span>|</span>
    <a href="#">友情链接</a>
</div>
<p>CopyRight © 2016 技术有限公司 All Rights Reserved</p>
<p>电话:010-****888    京ICP备*******8号</p>
</div>
</html>

templates.head.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">

<div class="header_con" th:fragment="header">
<div class="header">
    <div class="welcome fl">欢迎来到天天生鲜!欢迎您:<span style="color: blue" th:text="${session.user.getUUsername()}"></span></div>
    <div class="fr">
        <div class="login_btn fl">
            <a th:href="@{/logout}">退出登录</a>
            <span>|</span>
            <a th:href="@{/back/list}">后台管理</a>
        </div>
        <div class="user_link fl">
            <span>|</span>
            <a href="user_center_info.html">用户中心</a>
            <span>|</span>
            <a href="cart.html">我的购物车</a>
            <span>|</span>
            <a href="user_center_order.html">我的订单</a>
        </div>
    </div>
</div>
</div>

<div class="search_bar clearfix" th:fragment="search">
<a th:href="@{/getIndex}" class="logo fl"><img th:src="@{/images/logo.png}"></a>
<div class="search_con fl">
    <input type="text" class="input_text fl" name="" placeholder="搜索商品">
    <input type="button" class="input_btn fr" name="" value="搜索">
</div>
<div class="guest_cart fr">
    <a href="#" class="cart_name fl">我的购物车</a>
    <div class="goods_count fl" id="show_count">1</div>
</div>
</div>

</html>

templates.index.html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" xml:lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>天天生鲜-首页</title>
<link rel="stylesheet" type="text/css" th:href="@{/css/reset.css}">
<link rel="stylesheet" type="text/css" th:href="@{/css/main.css}">
<script type="text/javascript" th:src="@{/js/jquery-1.12.4.min.js}"></script>
<script type="text/javascript" th:src="@{/js/jquery-ui.min.js}"></script>
<script type="text/javascript" th:src="@{/js/slide.js}"></script>
</head>
<body>

<div th:replace="head::header"></div>
<div th:replace="head::search"></div>

<div class="navbar_con">
	<div class="navbar">
		<h1 class="fl">全部商品分类</h1>
		<ul class="navlist fl">
			<li><a href="">首页</a></li>
			<li class="interval">|</li>
			<li><a href="">手机生鲜</a></li>
			<li class="interval">|</li>
			<li><a href="">抽奖</a></li>
		</ul>
	</div>
</div>

<div class="center_con clearfix">
    <div id="cate"></div>
    <script type="text/javascript" th:inline="javascript">
        var path = /*[[@{/findCategory}]]*/ 1;
        $("#cate").load(path);
    </script>
	<!--<ul class="subnav fl">-->
	<!--	<li><a href="#model01" class="fruit">新鲜水果</a></li>-->
	<!--	<li><a href="#model02" class="seafood">海鲜水产</a></li>-->
	<!--	<li><a href="#model03" class="meet">猪牛羊肉</a></li>-->
	<!--	<li><a href="#model04" class="egg">禽类蛋品</a></li>-->
	<!--	<li><a href="#model05" class="vegetables">新鲜蔬菜</a></li>-->
	<!--	<li><a href="#model06" class="ice">速冻食品</a></li>-->
	<!--</ul>-->
	<div class="slide fl">
		<ul class="slide_pics">
			<li><img th:src="@{/images/slide.jpg}" alt="幻灯片"></li>
			<li><img th:src="@{/images/slide02.jpg}" alt="幻灯片"></li>
			<li><img th:src="@{/images/slide03.jpg}" alt="幻灯片"></li>
			<li><img th:src="@{/images/slide04.jpg}" alt="幻灯片"></li>
		</ul>
		<div class="prev"></div>
		<div class="next"></div>
		<ul class="points"></ul>
	</div>
	<div class="adv fl">
		<a href="#"><img th:src="@{/images/adv01.jpg}"></a>
		<a href="#"><img th:src="@{/images/adv02.jpg}"></a>
	</div>
</div>

<!--推荐-->
<script type="text/javascript" th:inline="javascript">
	var path = /*[[@{/category/ids}]]*/ 1;
	var path2 = /*[[@{/suggest/}]]*/ 1;
	$.ajax({
		url:path,
		type:"get",
		success:function (ret) {
			console.log(ret);
			for (var i = 0;i < ret.length;i++){
				var a = $('<div class="list_model"></div>');
				$('#suggest').append(a);
				a.load(path2+ret[i]);
			}
		}
	});
</script>
<div id="suggest"></div>

<div th:replace="foot::footer"></div>

<!--<script type="text/javascript" th:src="@{/js/slideshow.js}"></script>-->
<script type="text/javascript">
	// BCSlideshow('focuspic');
	var oFruit = document.getElementById('fruit_more');
	var oShownum = document.getElementById('show_count');

	var hasorder = localStorage.getItem('order_finish');

	if(hasorder)
	{
		oShownum.innerHTML = '2';
	}

	// oFruit.onclick = function(){
	// 	window.location.href = 'list.html';
	// }
</script>
</body>
</html>

templates.list.html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" xml:lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>天天生鲜-商品列表</title>
<link rel="stylesheet" type="text/css" th:href="@{/css/reset.css}">
<link rel="stylesheet" type="text/css" th:href="@{/css/main.css}">
<script type="text/javascript" th:src="@{/js/jquery-1.12.4.min.js}"></script>
<script type="text/javascript" th:src="@{/js/jquery-ui.min.js}"></script>
</head>
<body>
<div th:replace="head::header"></div>
<div th:replace="head::search"></div>

<div class="navbar_con">
	<div class="navbar clearfix">
		<div class="subnav_con fl">
			<h1>全部商品分类</h1>	
			<span></span>			
			<ul class="subnav">
				<li><a href="#" class="fruit">新鲜水果</a></li>
				<li><a href="#" class="seafood">海鲜水产</a></li>
				<li><a href="#" class="meet">猪牛羊肉</a></li>
				<li><a href="#" class="egg">禽类蛋品</a></li>
				<li><a href="#" class="vegetables">新鲜蔬菜</a></li>
				<li><a href="#" class="ice">速冻食品</a></li>
			</ul>
		</div>
		<ul class="navlist fl">
			<li><a href="">首页</a></li>
			<li class="interval">|</li>
			<li><a href="">手机生鲜</a></li>
			<li class="interval">|</li>
			<li><a href="">抽奖</a></li>
		</ul>
	</div>
</div>

<div class="breadcrumb">
	<a th:href="@{/getIndex}">全部分类</a>
	<span>></span>
	<a href="#" th:text="${info.list[0].category.title}">新鲜水果</a>
</div>

<div class="main_wrap clearfix">
	<div class="l_wrap fl clearfix">
		<div class="new_goods">
			<h3>新品推荐</h3>
			<ul>
				<li>
					<a href="#"><img th:src="@{/images/goods/goods001.jpg}"></a>
					<h4><a href="#">进口柠檬</a></h4>
					<div class="prize">¥3.90</div>
				</li>
				<li>
					<a href="#"><img th:src="@{/images/goods/goods002.jpg}"></a>
					<h4><a href="#">玫瑰香葡萄</a></h4>
					<div class="prize">¥16.80</div>
				</li>
			</ul>
		</div>
	</div>

	<div class="r_wrap fr clearfix">
		<div class="sort_bar">
			<a th:href="@{/allGoods/__${info.list[0].category.id}__?pageNum=__${info.pageNum}__&condition=0}" th:class="${(condition==0)?'active':''}">默认</a>
			<a th:href="@{/allGoods/__${info.list[0].category.id}__?pageNum=__${info.pageNum}__&condition=1}" th:class="${(condition==1)?'active':''}">价格</a>
			<a th:href="@{/allGoods/__${info.list[0].category.id}__?pageNum=__${info.pageNum}__&condition=2}" th:class="${(condition==2)?'active':''}">上架时间</a>
		</div>

		<ul class="goods_type_list clearfix">
			<li th:each="goods:${info.list}">
				<a th:href="@{/goods/__${goods.id}__}"><img th:src="@{/images/goods/__${goods.imgFile}__}"></a>
				<h4><a th:href="@{/goods/__${goods.id}__}" th:text="${goods.title}"></a></h4>
				<div class="operate">
					<span class="prize">¥<span th:text="${goods.price}"></span></span>
					<span class="unit"><span th:text="${goods.price}"></span>/500g</span>
					<a href="#" class="add_goods" title="加入购物车"></a>
				</div>
			</li>
		</ul>

		<div class="pagenation">
			<a th:href="@{/allGoods/__${info.list[0].category.id}__?pageNum=__${info.prePage}__&condition=__${condition}__}" th:if="${info.hasPreviousPage}">&lt;上一页</a>
			<a th:each="number:${info.navigatepageNums}" th:text="${number}" th:href="@{/allGoods/__${info.list[0].category.id}__?pageNum=__${number}__&condition=__${condition}__}" th:class="${(number==info.pageNum)?'active':''}" ></a>
			<a th:href="@{/allGoods/__${info.list[0].category.id}__?pageNum=__${info.nextPage}__&condition=__${condition}__}" th:if="${info.hasNextPage}">&gt;下一页</a>
		</div>
	</div>
</div>

<div th:replace="foot::footer"></div>

</body>
</html>

templates.login.html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" xml:lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>天天生鲜-登录</title>
<link rel="stylesheet" type="text/css" th:href="@{/css/reset.css}">
<link rel="stylesheet" type="text/css" th:href="@{/css/main.css}">
<script type="text/javascript" th:src="@{/js/jquery-1.12.4.min.js}"></script>
<script type="text/javascript" th:inline="javascript">

	function refresh_captcha() {
		var path = [[@{/captcha}]];
			$("#cap").attr("src",path);
		}

	function verify_captcha(a) {
		var cap = $(a).val().trim();
		var path3 = [[@{/captcha/verify}]];
		$.ajax({
			url:path3,
			type:"post",
			data:"captcha="+cap,
			success:function (ret) {
				if (ret.code === 1){
					uname = 1;
					$("#cap_tip").text(ret.msg);
				}else {
					uname = 0;
					$("#cap_tip").text(ret.msg);
				}
			}
		});
	}

	function login() {
		if (!uname){
			return;
		}
		var path = [[@{/login}]];
		var path1 = [[@{/back/list}]];
		var path2 = [[@{/getLogin}]];
		$.ajax({
			url:path,
			type:"post",
			data:$("form").serialize(),
			success:function (ret) {
				if (ret.code === 1){
					alert(ret.msg);
					location.href = path1;
				}else {
					alert(ret.msg);
					location.href = path2;
				}
			}
		});

	}

</script>
</head>
<body>
<div class="login_top clearfix">
	<a href="index.html" class="login_logo"><img th:src="@{/images/logo02.png}"></a>
</div>

<div class="login_form_bg">
	<div class="login_form_wrap clearfix">
		<div class="login_banner fl"></div>
		<div class="slogan fl">日夜兼程 · 急速送达</div>
		<div class="login_form fr">
			<div class="login_title clearfix">
				<h1>用户登录</h1>
				<a th:href="@{/getRegist}">立即注册</a>
			</div>
			<div class="form_input">
				<form action="index.html">
					<input type="text" name="uUsername" id="uUsername" class="name_input" placeholder="请输入用户名" th:value="${showUsername}" >
					<div class="user_error">输入错误</div>
					<input type="password" name="uPassword" id="uPassword" class="pass_input" placeholder="请输入密码">
					<div class="pwd_error">输入错误</div>
					<div style="position: absolute;left: 0;top: 120px;">
						<img id="cap" onclick="refresh_captcha();" th:src="@{/captcha}" style="width: 100px;vertical-align: middle"/>
						<input id="cap_text" onblur="verify_captcha(this);" style=" background: #fdfdfd;height: 25px;width: 100px;">
						<span id="cap_tip" style="color: magenta"></span>
					</div>
					<div class="more_input clearfix">
						<input type="checkbox" name="remember" value="1" checked="checked">
						<label>记住用户名</label>
						<a href="#">忘记密码</a>
					</div>
					<input type="button" name="btn" value="登录" class="input_submit" onclick="login()">
				</form>
			</div>
		</div>
	</div>
</div>

<div class="footer no-mp">
	<div class="foot_link">
		<a href="#">关于我们</a>
		<span>|</span>
		<a href="#">联系我们</a>
		<span>|</span>
		<a href="#">招聘人才</a>
		<span>|</span>
		<a href="#">友情链接</a>		
	</div>
	<p>CopyRight © 2016 技术有限公司 All Rights Reserved</p>
	<p>电话:010-****888    京ICP备*******8号</p>
</div>

</body>
</html>

templates.place_order.html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 	"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>天天生鲜-提交订单</title>
<link rel="stylesheet" type="text/css" href="css/reset.css">
<link rel="stylesheet" type="text/css" href="css/main.css">
</head>
<body>
<div class="header_con">
	<div class="header">
		<div class="welcome fl">欢迎来到天天生鲜!</div>
		<div class="fr">
			<div class="login_info fl">
				欢迎您:<em>张 山</em>
			</div>
			<div class="login_btn fl">
				<a href="login.html">登录</a>
				<span>|</span>
				<a href="register.html">注册</a>
			</div>
			<div class="user_link fl">
				<span>|</span>
				<a href="user_center_info.html">用户中心</a>
				<span>|</span>
				<a href="cart.html">我的购物车</a>
				<span>|</span>
				<a href="user_center_order.html">我的订单</a>
			</div>
		</div>
	</div>		
</div>

<div class="search_bar clearfix">
	<a href="index.html" class="logo fl"><img src="images/logo.png"></a>
	<div class="sub_page_name fl">|&nbsp;&nbsp;&nbsp;&nbsp;提交订单</div>
	<div class="search_con fr">
		<input type="text" class="input_text fl" name="" placeholder="搜索商品">
		<input type="button" class="input_btn fr" name="" value="搜索">
	</div>		
</div>

<h3 class="common_title">确认收货地址</h3>

<div class="common_list_con clearfix">
	<dl>
		<dt>寄送到:</dt>
		<dd><input type="radio" name="" checked="">北京市 海淀区 中关村软件园 (张山 收) 182****7528</dd>
	</dl>
	<a href="user_center_site.html" class="edit_site">编辑收货地址</a>

</div>

<h3 class="common_title">支付方式</h3>	
<div class="common_list_con clearfix">
	<div class="pay_style_con clearfix">
		<input type="radio" name="pay_style" checked>
		<label class="cash">货到付款</label>
		<input type="radio" name="pay_style">
		<label class="weixin">微信支付</label>
		<input type="radio" name="pay_style">
		<label class="zhifubao"></label>
		<input type="radio" name="pay_style">
		<label class="bank">银行卡支付</label>
	</div>
</div>

<h3 class="common_title">商品列表</h3>

<div class="common_list_con clearfix">
	<ul class="goods_list_th clearfix">
		<li class="col01">商品名称</li>
		<li class="col02">商品单位</li>
		<li class="col03">商品价格</li>
		<li class="col04">数量</li>
		<li class="col05">小计</li>		
	</ul>
	<ul class="goods_list_td clearfix">
		<li class="col01">1</li>			
		<li class="col02"><img src="images/goods/goods012.jpg"></li>
		<li class="col03">奇异果</li>
		<li class="col04">500g</li>
		<li class="col05">25.80元</li>
		<li class="col06">1</li>
		<li class="col07">25.80元</li>	
	</ul>
	<ul class="goods_list_td clearfix">
		<li class="col01">2</li>			
		<li class="col02"><img src="images/goods/goods003.jpg"></li>
		<li class="col03">大兴大棚草莓</li>
		<li class="col04">500g</li>
		<li class="col05">16.80元</li>
		<li class="col06">1</li>
		<li class="col07">16.80元</li>	
	</ul>
</div>

<h3 class="common_title">总金额结算</h3>

<div class="common_list_con clearfix">
	<div class="settle_con">
		<div class="total_goods_count">共<em>2</em>件商品,总金额<b>42.60元</b></div>
		<div class="transit">运费:<b>10元</b></div>
		<div class="total_pay">实付款:<b>52.60元</b></div>
	</div>
</div>

<div class="order_submit clearfix">
	<a href="javascript:;" id="order_btn">提交订单</a>
</div>	

<div class="footer">
	<div class="foot_link">
		<a href="#">关于我们</a>
		<span>|</span>
		<a href="#">联系我们</a>
		<span>|</span>
		<a href="#">招聘人才</a>
		<span>|</span>
		<a href="#">友情链接</a>		
	</div>
	<p>CopyRight © 2016 技术有限公司 All Rights Reserved</p>
	<p>电话:010-****888    京ICP备*******8号</p>
</div>

<div class="popup_con">
	<div class="popup">
		<p>订单提交成功!</p>
	</div>
	
	<div class="mask"></div>
</div>
<script type="text/javascript" src="js/jquery-1.12.2.js"></script>
<script type="text/javascript">
	$('#order_btn').click(function() {
		localStorage.setItem('order_finish',2);

		$('.popup_con').fadeIn('fast', function() {

			setTimeout(function(){
				$('.popup_con').fadeOut('fast',function(){
					window.location.href = 'index.html';
				});	
			},3000)
			
		});
	});
</script>
</body>
</html>

templates.register.html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" xml:lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>天天生鲜-注册</title>
<link rel="stylesheet" type="text/css" th:href="@{/css/reset.css}">
<link rel="stylesheet" type="text/css" th:href="@{/css/main.css}">
<script type="text/javascript" th:src="@{/js/jquery-1.12.4.min.js}"></script>
<script type="text/javascript" th:inline="javascript">
        function verify(v) {
            var uUsername = $(v).val().trim();
            if (uUsername === ''){
                uname = 0;
                alert("用户名不能为空");
                return;
            }
            var path = [[@{/verify}]];
                var load_path = [[@{/images/load.gif}]];
                var ok_path = [[@{/images/ok.gif}]];
                var error_path = [[@{/images/error.jpg}]];
                $("#tip").attr("src",load_path);
                $.ajax({
                    url:path,
                    type:"get",
                    data:"uUsername="+uUsername,
                    success:function (ret) {
                        var msg = ret.msg;
                        if (ret.code === 1){
                            $(v).next().text(msg).show();
                            uname = 1;
                            $("#tip").attr("src",ok_path);
                        }else {
                            $(v).next().text(msg).show();
                            uname = 0;
                            $("#tip").attr("src",error_path);
                        }
                    }
                });
        }

        function register() {
            if (!uname){
                return;
            }
            var path1 = [[@{/regist}]];
            var path2 = [[@{/getLogin}]];
            $.ajax({
                url:path1,
                type:"post",
                data:$("form").serialize(),
                success:function (ret) {
                    if (ret.code === 1) {
                        alert(ret.msg);
                        location.href=path2;
                    }else {
                        location.href=path1;
                    }
                }
            });
        }
</script>
</head>
<body>
<div class="register_con">
	<div class="l_con fl">
		<a class="reg_logo"><img th:src="@{/images/logo02.png}"></a>
		<div class="reg_slogan">足不出户  ·  新鲜每一天</div>
		<div class="reg_banner"></div>
	</div>

	<div class="r_con fr">
		<div class="reg_title clearfix">
			<h1>用户注册</h1>
			<a th:href="@{/}">登录</a>
		</div>
		<div class="reg_form clearfix">
			<form id="form">
			<ul>
				<li>
					<label>用户名:</label>
					<input type="text" name="uUsername" id="uUsername" onblur="verify(this)">
					<span class="error_tip">提示信息</span>
                    <img style="height: 25px" id="tip" alt="">
				</li>					
				<li>
					<label>密码:</label>
					<input type="password" name="uPassword" id="uPassword" onkeyup="keyUp()">
					<span class="error_tip">提示信息</span>
				</li>
				<li>
					<label>确认密码:</label>
					<input type="password" name="cPassword" id="cPassword" onkeyup="keyUp()">
					<span class="error_tip" id="pInfo">提示信息</span>
				</li>
				<li>
					<label>邮箱:</label>
					<input type="text" name="uEmail" id="uEmail">
					<span class="error_tip">提示信息</span>
				</li>
				<li class="agreement">
					<input type="checkbox" name="allow" id="allow" checked="checked">
					<label>同意”天天生鲜用户使用协议“</label>
					<span class="error_tip2">提示信息</span>
				</li>
				<li class="reg_sub">
					<input type="button" value="注 册" id="btn" name="btn" onclick="register()">
				</li>
			</ul>				
			</form>
		</div>

	</div>

</div>

<div class="footer no-mp">
	<div class="foot_link">
		<a href="#">关于我们</a>
		<span>|</span>
		<a href="#">联系我们</a>
		<span>|</span>
		<a href="#">招聘人才</a>
		<span>|</span>
		<a href="#">友情链接</a>		
	</div>
	<p>CopyRight © 2016 技术有限公司 All Rights Reserved</p>
	<p>电话:010-****888    京ICP备*******8号</p>
</div>
</body>
<script type="text/javascript" th:inline="javascript">

// 校验两次密码
function keyUp() {
	var a = $('#uPassword').val();
	var b = $('#cPassword').val();
	if (a === b) {
		$('#btn').removeAttr('disabled');
		$("#pInfo").text("密码一致");
	}else {
		$('#btn').attr('disabled', 'disabled');
		$("#pInfo").text("两次密码不一致!").show();
	}
}

</script>
</html>

templates.suggest.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">

<div class="list_model">
<div class="list_title clearfix">
    <h3 class="fl" th:id="${goods[0].category.id}" th:text="${goods[1].category.title}"></h3>
    <div class="subtitle fl">
        <span>|</span>
        <a th:href="@{/goods/__${goods[0].id}__}" th:text="${goods[0].title}"></a>
        <a th:href="@{/goods/__${goods[1].id}__}" th:text="${goods[1].title}"></a>
        <a th:href="@{/goods/__${goods[2].id}__}" th:text="${goods[2].title}"></a>
    </div>
    <a th:href="@{/allGoods/__${goods[0].category.id}__}" class="goods_more fr" id="fruit_more">查看更多 ></a>
</div>

<div class="goods_con clearfix">
    <div class="goods_banner fl"><img th:src="@{/images/__${goods[0].category.bannerFile}__}"></div>
    <ul class="goods_list fl">
        <li th:each="good:${goods}">
            <h4><a th:href="@{/goods/__${good.id}__}" th:text="${good.title}"></a></h4>
            <a th:href="@{/goods/__${good.id}__}"><img th:src="@{/images/goods/__${good.imgFile}__}"></a>
            <div class="prize">¥ <span th:text="${good.price}"></span></div>
        </li>
    </ul>
</div>
</div>
</html>

templates.user_center_info.html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>天天生鲜-用户中心</title>
<link rel="stylesheet" type="text/css" href="css/reset.css">
<link rel="stylesheet" type="text/css" href="css/main.css">
</head>
<body>
<div class="header_con">
	<div class="header">
		<div class="welcome fl">欢迎来到天天生鲜!</div>
		<div class="fr">
			<div class="login_info fl">
				欢迎您:<em>张 山</em>
			</div>
			<div class="login_btn fl">
				<a href="login.html">登录</a>
				<span>|</span>
				<a href="register.html">注册</a>
			</div>
			<div class="user_link fl">
				<span>|</span>
				<a href="user_center_info.html">用户中心</a>
				<span>|</span>
				<a href="cart.html">我的购物车</a>
				<span>|</span>
				<a href="user_center_order.html">我的订单</a>
			</div>
		</div>
	</div>		
</div>

<div class="search_bar clearfix">
	<a href="index.html" class="logo fl"><img src="images/logo.png"></a>
	<div class="sub_page_name fl">|&nbsp;&nbsp;&nbsp;&nbsp;用户中心</div>
	<div class="search_con fr">
		<input type="text" class="input_text fl" name="" placeholder="搜索商品">
		<input type="button" class="input_btn fr" name="" value="搜索">
	</div>		
</div>

<div class="main_con clearfix">
	<div class="left_menu_con clearfix">
		<h3>用户中心</h3>
		<ul>
			<li><a href="user_center_info.html" class="active">· 个人信息</a></li>
			<li><a href="user_center_order.html">· 全部订单</a></li>
			<li><a href="user_center_site.html">· 收货地址</a></li>
		</ul>
	</div>
	<div class="right_content clearfix">
			<div class="info_con clearfix">
			<h3 class="common_title2">基本信息</h3>
					<ul class="user_info_list">
						<li><span>用户名:</span>18210569700</li>
						<li><span>联系方式:</span>18210569700</li>
						<li><span>联系地址:</span>北京市昌平区</li>			
					</ul>
			</div>
			
			<h3 class="common_title2">最近浏览</h3>
			<div class="has_view_list">
				<ul class="goods_type_list clearfix">
			<li>
				<a href="detail.html"><img src="images/goods/goods003.jpg"></a>
				<h4><a href="detail.html">大兴大棚草莓</a></h4>
				<div class="operate">
					<span class="prize">¥16.80</span>
					<span class="unit">16.80/500g</span>
					<a href="#" class="add_goods" title="加入购物车"></a>
				</div>
			</li>

			<li>
				<a href="#"><img src="images/goods/goods004.jpg"></a>
				<h4><a href="#">吐鲁番梨光杏</a></h4>
				<div class="operate">
					<span class="prize">¥5.50</span>
					<span class="unit">5.50/500g</span>
					<a href="#" class="add_goods" title="加入购物车"></a>
				</div>
			</li>

			<li>
				<a href="#"><img src="images/goods/goods005.jpg"></a>
				<h4><a href="#">黄肉桃</a></h4>
				<div class="operate">
					<span class="prize">¥10.00</span>
					<span class="unit">10.00/500g</span>
					<a href="#" class="add_goods" title="加入购物车"></a>
				</div>
			</li>

			<li>
				<a href="#"><img src="images/goods/goods006.jpg"></a>
				<h4><a href="#">进口西梅</a></h4>
				<div class="operate">
					<span class="prize">¥28.80</span>
					<span class="unit">28.8/500g</span>
					<a href="#" class="add_goods" title="加入购物车"></a>
				</div>
			</li>

			<li>
				<a href="#"><img src="images/goods/goods007.jpg"></a>
				<h4><a href="#">香梨</a></h4>
				<div class="operate">
					<span class="prize">¥6.45</span>
					<span class="unit">6.45/500g</span>
					<a href="#" class="add_goods" title="加入购物车"></a>
				</div>
			</li>
		</ul>
	</div>
	</div>
</div>

<div class="footer">
	<div class="foot_link">
		<a href="#">关于我们</a>
		<span>|</span>
		<a href="#">联系我们</a>
		<span>|</span>
		<a href="#">招聘人才</a>
		<span>|</span>
		<a href="#">友情链接</a>		
	</div>
	<p>CopyRight © 2016 技术有限公司 All Rights Reserved</p>
	<p>电话:010-****888    京ICP备*******8号</p>
</div>
</body>
</html>

templates.user_center_order.html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>天天生鲜-用户中心</title>
<link rel="stylesheet" type="text/css" href="css/reset.css">
<link rel="stylesheet" type="text/css" href="css/main.css">
</head>
<body>
<div class="header_con">
	<div class="header">
		<div class="welcome fl">欢迎来到天天生鲜!</div>
		<div class="fr">
			<div class="login_info fl">
				欢迎您:<em>张 山</em>
			</div>
			<div class="login_btn fl">
				<a href="login.html">登录</a>
				<span>|</span>
				<a href="register.html">注册</a>
			</div>
			<div class="user_link fl">
				<span>|</span>
				<a href="user_center_info.html">用户中心</a>
				<span>|</span>
				<a href="cart.html">我的购物车</a>
				<span>|</span>
				<a href="user_center_order.html">我的订单</a>
			</div>
		</div>
	</div>		
</div>

<div class="search_bar clearfix">
	<a href="index.html" class="logo fl"><img src="images/logo.png"></a>
	<div class="sub_page_name fl">|&nbsp;&nbsp;&nbsp;&nbsp;用户中心</div>
	<div class="search_con fr">
		<input type="text" class="input_text fl" name="" placeholder="搜索商品">
		<input type="button" class="input_btn fr" name="" value="搜索">
	</div>		
</div>

<div class="main_con clearfix">
	<div class="left_menu_con clearfix">
		<h3>用户中心</h3>
		<ul>
			<li><a href="user_center_info.html">· 个人信息</a></li>
			<li><a href="user_center_order.html" class="active">· 全部订单</a></li>
			<li><a href="user_center_site.html">· 收货地址</a></li>
		</ul>
	</div>
	<div class="right_content clearfix">
			<h3 class="common_title2">全部订单</h3>
			<ul class="order_list_th w978 clearfix">
				<li class="col01">2016-8-21 17:36:24</li>
				<li class="col02">订单号:56872934</li>
				<li class="col02 stress">未支付</li>		
			</ul>

			<table class="order_list_table w980">
				<tbody>
					<tr>
						<td width="55%">
							<ul class="order_goods_list clearfix">					
								<li class="col01"><img src="images/goods02.jpg"></li>
								<li class="col02">嘎啦苹果嘎啦苹果<em>11.80元/500g</em></li>	
								<li class="col03">1</li>
								<li class="col04">11.80元</li>	
							</ul>
							<ul class="order_goods_list clearfix">					
								<li class="col01"><img src="images/goods02.jpg"></li>
								<li class="col02">嘎啦苹果嘎啦苹果<em>11.80元/500g</em></li>	
								<li class="col03">1</li>
								<li class="col04">11.80元</li>	
							</ul>
						</td>
						<td width="15%">33.60元</td>
						<td width="15%">待付款</td>
						<td width="15%"><a href="#" class="oper_btn">去付款</a></td>
					</tr>
				</tbody>
			</table>
			
			<ul class="order_list_th w978 clearfix">
				<li class="col01">2016-8-21 17:36:24</li>
				<li class="col02">订单号:56872934</li>
				<li class="col02 stress">已支付</li>			
			</ul>
			<table class="order_list_table w980">
				<tbody>
					<tr>
						<td width="55%">
							<ul class="order_goods_list clearfix">					
								<li class="col01"><img src="images/goods02.jpg"></li>
								<li class="col02">嘎啦苹果嘎啦苹果<em>11.80元/500g</em></li>	
								<li class="col03">1</li>
								<li class="col04">11.80元</li>	
							</ul>
							<ul class="order_goods_list clearfix">					
								<li class="col01"><img src="images/goods02.jpg"></li>
								<li class="col02">嘎啦苹果嘎啦苹果<em>11.80元/500g</em></li>	
								<li class="col03">1</li>
								<li class="col04">11.80元</li>	
							</ul>
						</td>
						<td width="15%">33.60元</td>
						<td width="15%">已付款</td>
						<td width="15%"><a href="#" class="oper_btn">查看物流</a></td>
					</tr>
				</tbody>
			</table>

			<div class="pagenation">
				<a href="#"><上一页</a>
				<a href="#" class="active">1</a>
				<a href="#">2</a>
				<a href="#">3</a>
				<a href="#">4</a>
				<a href="#">5</a>
				<a href="#">下一页></a>
			</div>
	</div>
</div>



<div class="footer">
	<div class="foot_link">
		<a href="#">关于我们</a>
		<span>|</span>
		<a href="#">联系我们</a>
		<span>|</span>
		<a href="#">招聘人才</a>
		<span>|</span>
		<a href="#">友情链接</a>		
	</div>
	<p>CopyRight © 2016 技术有限公司 All Rights Reserved</p>
	<p>电话:010-****888    京ICP备*******8号</p>
</div>

</body>
</html>

templates.user_center_site.html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>天天生鲜-用户中心</title>
<link rel="stylesheet" type="text/css" href="css/reset.css">
<link rel="stylesheet" type="text/css" href="css/main.css">
</head>
<body>
<div class="header_con">
	<div class="header">
		<div class="welcome fl">欢迎来到天天生鲜!</div>
		<div class="fr">
			<div class="login_info fl">
				欢迎您:<em>张 山</em>
			</div>
			<div class="login_btn fl">
				<a href="login.html">登录</a>
				<span>|</span>
				<a href="register.html">注册</a>
			</div>
			<div class="user_link fl">
				<span>|</span>
				<a href="user_center_info.html">用户中心</a>
				<span>|</span>
				<a href="cart.html">我的购物车</a>
				<span>|</span>
				<a href="user_center_order.html">我的订单</a>
			</div>
		</div>
	</div>		
</div>

<div class="search_bar clearfix">
	<a href="index.html" class="logo fl"><img src="images/logo.png"></a>
	<div class="sub_page_name fl">|&nbsp;&nbsp;&nbsp;&nbsp;用户中心</div>
	<div class="search_con fr">
		<input type="text" class="input_text fl" name="" placeholder="搜索商品">
		<input type="button" class="input_btn fr" name="" value="搜索">
	</div>		
</div>

<div class="main_con clearfix">
	<div class="left_menu_con clearfix">
		<h3>用户中心</h3>
		<ul>
			<li><a href="user_center_info.html">· 个人信息</a></li>
			<li><a href="user_center_order.html">· 全部订单</a></li>
			<li><a href="user_center_site.html" class="active">· 收货地址</a></li>
		</ul>
	</div>
	<div class="right_content clearfix">
			<h3 class="common_title2">收货地址</h3>
			<div class="site_con">
				<dl>
					<dt>当前地址:</dt>
					<dd>北京市 海淀区 中关村软件园 (张山 收) 182****7528</dd>
				</dl>					
			</div>
			<h3 class="common_title2">编辑地址</h3>
			<div class="site_con">
				<form>
					<div class="form_group">
						<label>收件人:</label>
						<input type="text" name="">
					</div>
					<div class="form_group form_group2">
						<label>详细地址:</label>
						<textarea class="site_area"></textarea>
					</div>
					<div class="form_group">
						<label>邮编:</label>
						<input type="text" name="">
					</div>
					<div class="form_group">
						<label>手机:</label>
						<input type="text" name="">
					</div>

					<input type="submit" name="" value="提交" class="info_submit">
				</form>
			</div>
	</div>
</div>



<div class="footer">
	<div class="foot_link">
		<a href="#">关于我们</a>
		<span>|</span>
		<a href="#">联系我们</a>
		<span>|</span>
		<a href="#">招聘人才</a>
		<span>|</span>
		<a href="#">友情链接</a>		
	</div>
	<p>CopyRight © 2016 技术有限公司 All Rights Reserved</p>
	<p>电话:010-****888    京ICP备*******8号</p>
</div>

</body>
</html>

application.yml

server:
  port: 80

spring:
  datasource:
	driver-class-name: com.mysql.jdbc.Driver
 url: jdbc:mysql:///shengxian?	characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false
 username: root
 password: dong1995

servlet:
 multipart:
  max-file-size: 500MB
  max-request-size: 1000MB
 resources:
  static-locations: classpath:/static

mybatis:
  mapper-locations: classpath:mapper/*.xml
 type-aliases-package: com.itqf.shengxian1125.pojo
configuration:
  map-underscore-to-camel-case: true
  auto-mapping-behavior: full
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
shiro:
loginUrl: /getLogin
unauthorizedUrl: /403
enabled: true #web项目的支持

test

test.ShengxianApplicatioinTests

package com.itqf.shengxian1125;

import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class Shengxian1125ApplicationTests {

@Test
void contextLoads() {
}

}

test.mapper.UserMapperTest

package com.itqf.shengxian1125.mapper;

import com.itqf.shengxian1125.Shengxian1125Application;
import com.itqf.shengxian1125.pojo.User;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.util.StringUtils;

import java.util.Date;

import static org.junit.Assert.*;

@RunWith(SpringRunner.class)
@SpringBootTest(classes = Shengxian1125Application.class)
public class UserMapperTest {

@Autowired
private UserMapper userMapper;

@Test
public void insertUser() {

    User user = new User();
    user.setUUsername("大佬");
    user.setUPassword("123");
    user.setUEmail("123@123.com");
    user.setUCreatetime(new Date());
    int i = userMapper.insertUser(user);
    if (i != 0){
        System.out.println("插入成功!");
    }
}

@Test
public void selectUserByUsername(){
    String uUsername = "大佬";
    User user = userMapper.selectUserByUsername(uUsername);
    if (!StringUtils.isEmpty(user)){
        System.out.println("用户名已经存在!");
        System.out.println(user);
    }
}
}

test.UserServiceTest

package com.itqf.shengxian1125.service;

import com.itqf.shengxian1125.Shengxian1125Application;
import com.itqf.shengxian1125.pojo.User;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.util.StringUtils;

import java.util.Date;

import static org.junit.Assert.*;

@RunWith(SpringRunner.class)
@SpringBootTest(classes = Shengxian1125Application.class)
public class UserServiceTest {

@Autowired
private UserService userService;

@Test
public void insertUser() {
    User user = new User();
    user.setUUsername("大佬2");
    user.setUPassword("123");
    user.setUEmail("123@123.com");
    user.setUCreatetime(new Date());
    int i = userService.insertUser(user);
    if (i != 0){
        System.out.println("插入成功!");
    }
}

@Test
public void selectUserByUsername() {
    String uUsername = "大佬2";
    User user = userService.selectUserByUsername(uUsername);
    if (!StringUtils.isEmpty(user)){
        System.out.println("用户名已经存在!");
        System.out.println(user);
    }
}
}

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.2.1.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.itqf</groupId>
<artifactId>shengxian1125</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>shengxian1125</name>
<description>Demo project for Spring Boot</description>

<properties>
    <java.version>1.8</java.version>
</properties>

<dependencies>
    <!-- web -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!-- mybatis -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid-spring-boot-starter</artifactId>
        <version>1.1.13</version>
    </dependency>
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>1.3.1</version>
    </dependency>
    <dependency>
        <groupId>com.github.pagehelper</groupId>
        <artifactId>pagehelper-spring-boot-starter</artifactId>
        <version>1.2.5</version>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.8</version>
        <scope>provided</scope>
    </dependency>
    <!-- shiro -->
    <dependency>
        <groupId>org.apache.shiro</groupId>
        <artifactId>shiro-spring-boot-web-starter</artifactId>
        <version>1.4.0</version>
    </dependency>
    <!-- 集成junit测试 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
    </dependency>

    <!-- thymeleaf 依赖 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>

    <!-- 验证码 -->
    <dependency>
        <groupId>com.github.penggle</groupId>
        <artifactId>kaptcha</artifactId>
        <version>2.3.2</version>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

</project>
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很抱歉,由于篇幅和涉及版权等问题,无法提供完整的代码实现。以下是基于springboot+shiro+layui实现qq聊天室功能的代码结构和主要实现思路供参考: 1. 后端代码结构 - controller:控制层,实现用户登录、注册等接口。 - service:服务层,实现用户管理、聊天消息管理等业务逻辑。 - dao:数据访问层,实现对数据库的增删改查操作。 - entity:实体类,包括用户信息、聊天消息等。 - config:配置类,实现Shiro安全框架的配置。 - websocket:WebSocket实现,接收消息并广播给在线用户。 2. 前端代码结构 - index.html:聊天室主页面。 - login.html:用户登录页面。 - register.html:用户注册页面。 - layui:Layui框架相关文件。 - js:前端JS代码,实现聊天室界面和逻辑。 3. 主要实现思路 - 用户登录:前端发送用户名和密码到后台,后台进行密码验证并返回登录结果。 - 用户注册:前端发送用户名和密码到后台,后台将用户信息保存到数据库中。 - 聊天室界面:前端使用Layui实现聊天室界面,包括聊天消息显示和发送消息等功能。 - 实时通讯:使用WebSocket实现前后端实时通讯功能,后端接收消息并将消息广播给所有在线用户,前端接收消息并显示在聊天室界面中。 - 私聊功能:在聊天室界面中添加私聊功能,用户可以选择一个在线用户进行私聊,后端接收私聊消息并发送给对应的用户。 - 数据库存储:使用MySQL作为持久化存储,将用户信息、聊天记录等数据保存到数据库中。 以上是springboot+shiro+layui实现qq聊天室功能的主要实现思路和代码结构,具体实现过程需要根据实际需求进行调整和改进。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值