目录结构
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="请输入查询条件"/>
<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">| 购物车</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}"><上一页</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}">>下一页</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">| 提交订单</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">| 用户中心</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">| 用户中心</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">| 用户中心</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>