基于javaweb+mysql的ssm网上电商系统(java+ssm+mysql+tomcat+jsp)
运行环境
Java≥8、MySQL≥5.7、Tomcat≥8
开发工具
eclipse/idea/myeclipse/sts等均可配置运行
适用
课程设计,大作业,毕业设计,项目练习,学习演示等
功能说明
基于javaweb+mysql的SSM网上电商系统(java+ssm+mysql+tomcat+jsp)
一、项目简述
功能:本系统分用户前台和管理员后台。 前台展示+后台管理,前台界面可实现用户登录,用户注 册,商品展示,商品明细展示,用户信息修改,密码修 改,购物车添加,商品购买,商品结算,订单查询,购物 车查询,后台管理可实现商品管理,订单管理,用户管理
二、项目运行
环境配置: Jdk1.8 + Tomcat8.5 + mysql + Eclispe (IntelliJ IDEA,Eclispe,MyEclispe,Sts 都支持)
项目技术: JSP +Spring + SpringMVC + MyBatis + html+ css + JavaScript + JQuery + Ajax + layui等等。
@GetMapping("/logout")
public String logout(HttpSession session) {
session.removeAttribute("user");
session.removeAttribute("cartCount");
return "/index/login.jsp";
}
/**
* 查看积分
*/
@GetMapping("/mypoint")
public String mypoint() {
return "/index/mypoint.jsp";
}
//积分充值
@RequestMapping("/addPoint")
public String addPoint(double point,HttpSession session,HttpServletRequest request){
Users users = (Users)session.getAttribute("user");
BigDecimal bigDecimal = new BigDecimal(Double.toString(point)).add(new BigDecimal(Double.toString(users.getPoint())));
users.setPoint(bigDecimal.doubleValue());
int count = userService.updatePoint(users);
if(count > 0){
session.setAttribute("user",users);
request.setAttribute("msg","充值成功!");
}else{
request.setAttribute("msg","充值失败!");
}
return "/index/mypoint.jsp";
}
/**
* 查看购物车
* @return
*/
@GetMapping("/cart")
public String cart(HttpServletRequest request, HttpSession session) {
Users user = (Users) session.getAttribute("user");
request.setAttribute("cartList", cartService.getList(user.getId()));
request.setAttribute("cartCount", cartService.getCount(user.getId()));
request.setAttribute("cartTotal", cartService.getTotal(user.getId()));
return "/index/cart.jsp";
}
/**
* 购物车总金额
* @return
*/
@GetMapping("/cartTotal")
return "/index/detail.jsp";
}
}
/**
* 解决get和post请求 全部乱码的过滤器
*/
public class GenericEncodingFilter implements Filter {
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
//处理response的字符编码
HttpServletResponse myResponse=(HttpServletResponse) response;
myResponse.setContentType("text/html;charset=UTF-8");
// 转型为与协议相关对象
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
// 对request包装增强
HttpServletRequest myrequest = new MyRequest(httpServletRequest);
chain.doFilter(myrequest, response);
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
}
//自定义request对象,HttpServletRequest的包装类
class MyRequest extends HttpServletRequestWrapper {
private HttpServletRequest request;
//是否编码的标记
private boolean hasEncode;
//定义一个可以传入HttpServletRequest对象的构造函数,以便对其进行装饰
public MyRequest(HttpServletRequest request) {
super(request);// super必须写
this.request = request;
}
// 类目列表
List<Types> typeList = typeService.getList();
List<Map<String, Object>> dataList = new ArrayList<>();
for(Types type : typeList) {
Map<String, Object> map = new HashMap<>();
map.put("type", type);
map.put("goodList", goodService.getListByType(type.getId(), 1, 15)); // 取前15个
dataList.add(map);
}
request.setAttribute("dataList", dataList);
return "/index/index.jsp";
}
/**
* 商品分类
* @return
* @throws UnsupportedEncodingException
*/
@GetMapping("/type")
public String type(HttpServletRequest request,
@RequestParam(required=false, defaultValue="0")int id,
@RequestParam(required=false, defaultValue="1")int page,
@RequestParam(required=false, defaultValue="10")int size) throws UnsupportedEncodingException {
request.setAttribute("type", typeService.get(id));
request.setAttribute("goodList", goodService.getListByType(id, page, size));
request.setAttribute("pageHtml", PageUtil.getPageHtml(request, goodService.getCountByType(id), page, size));
return "/index/goods.jsp";
}
/**
* 今日推荐
* @return
* @throws UnsupportedEncodingException
*/
@GetMapping("/today")
public String today(HttpServletRequest request,
@RequestParam(required=false, defaultValue="1")int page,
@RequestParam(required=false, defaultValue="10")int size) throws UnsupportedEncodingException {
request.setAttribute("flag", 2);
request.setAttribute("goodList", goodService.getListByTopType(Tops.TYPE_TODAY, page, size));
request.setAttribute("pageHtml", PageUtil.getPageHtml(request, goodService.getCountByTopType(Tops.TYPE_TODAY), page, size));
return "/index/goods.jsp";
return "redirect:goodList?flag=2&page="+page;
}
/**
* 产品更新
* @return
*/
@GetMapping("/goodEdit")
public String goodEdit(int id, HttpServletRequest request) {
request.setAttribute("flag", 2);
request.setAttribute("typeList", typeService.getList());
request.setAttribute("good", goodService.get(id));
return "/admin/good_edit.jsp";
}
/**
* 产品更新
* @return
* @throws Exception
*/
@PostMapping("/goodUpdate")
public String goodUpdate(Goods good, MultipartFile file,
@RequestParam(required=false, defaultValue="1") int page) throws Exception {
if (Objects.nonNull(file) && !file.isEmpty()) {
good.setCover(UploadUtil.upload(file));
}
goodService.update(good);
return "redirect:goodList?flag=2&page="+page;
}
/**
* 产品删除
* @return
*/
@GetMapping("/goodDelete")
public String goodDelete(int id,
@RequestParam(required=false, defaultValue="1") int page) {
goodService.delete(id);
return "redirect:goodList?flag=2&page="+page;
}
/**
* 添加推荐
* @return
*/
@PostMapping("/topSave")
public @ResponseBody String topSave(int goodId, byte type) {
return topService.add(goodId, type) ? "ok" : null;
}
/**
* 删除推荐
* @return
private CartService cartService;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
request.setAttribute("typeList", typeService.getList()); // 为所有页面设置类目列表
// 拦截指定路径
String uri = request.getRequestURI();
if(uri.contains("index/cart") || uri.contains("index/order") || uri.contains("index/my")) {
Object user = request.getSession().getAttribute("user");
if (Objects.isNull(user)) {
response.sendRedirect("login");
return false;
}
} // 默认放过
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
// 拦截指定路径
String uri = request.getRequestURI();
if(uri.contains("index/cart")) { // 购物车相关请求后 更新session
Users user = (Users) request.getSession().getAttribute("user");
request.getSession().setAttribute("cartCount", cartService.getCount(user.getId()));
}
super.postHandle(request, response, handler, modelAndView);
}
}
/**
* 统一处理业务异常 controller
*/
@ControllerAdvice
public class ExceptionConfig {
/**
* 业务异常
* @param exception
* @return
*/
@ExceptionHandler(MyException.class)
public String exception(MyException exception, HttpServletRequest request){
* excel表头数组,存放"姓名#name"格式字符串,"姓名"为excel标题行, "name"为对象字段名
* @param dataList
* 数据集合,需与表头数组中的字段名一致,并且符合javabean规范
* @return 返回一个HSSFWorkbook
* @throws Exception
*/
public static <T> HSSFWorkbook export(HttpServletResponse response, String fileName, String[] excelHeader,
Collection<T> dataList) throws Exception {
// 设置请求
response.setContentType("application/application/vnd.ms-excel");
response.setHeader("Content-disposition",
"attachment;filename=" + URLEncoder.encode(fileName + ".xls", "UTF-8"));
// 创建一个Workbook,对应一个Excel文件
HSSFWorkbook wb = new HSSFWorkbook();
// 设置标题样式
HSSFCellStyle titleStyle = wb.createCellStyle();
// 设置单元格边框样式
titleStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);// 上边框 细边线
titleStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);// 下边框 细边线
titleStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);// 左边框 细边线
titleStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);// 右边框 细边线
// 设置单元格对齐方式
titleStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 水平居中
titleStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER); // 垂直居中
// 设置字体样式
Font titleFont = wb.createFont();
titleFont.setFontHeightInPoints((short) 15); // 字体高度
titleFont.setFontName("黑体"); // 字体样式
titleStyle.setFont(titleFont);
// 在Workbook中添加一个sheet,对应Excel文件中的sheet
HSSFSheet sheet = wb.createSheet(fileName);
// 标题数组
String[] titleArray = new String[excelHeader.length];
// 字段名数组
String[] fieldArray = new String[excelHeader.length];
for (int i = 0; i < excelHeader.length; i++) {
String[] tempArray = excelHeader[i].split("#");// 临时数组 分割#
titleArray[i] = tempArray[0];
fieldArray[i] = tempArray[1];
}
// 在sheet中添加标题行
HSSFRow row = sheet.createRow((int) 0);// 行数从0开始
public String orderFinish(int id, byte status,
@RequestParam(required=false, defaultValue="1") int page) {
orderService.finish(id);
return "redirect:orderList?flag=3&status="+status+"&page="+page;
}
/**
* 订单删除
* @return
*/
@GetMapping("/orderDelete")
public String orderDelete(int id, byte status,
@RequestParam(required=false, defaultValue="1") int page) {
orderService.delete(id);
return "redirect:orderList?flag=3&status="+status+"&page="+page;
}
/**
* 顾客管理
* @return
*/
@GetMapping("/userList")
public String userList(HttpServletRequest request,
@RequestParam(required=false, defaultValue="1") int page,
@RequestParam(required=false, defaultValue="10") int size) {
request.setAttribute("flag", 4);
request.setAttribute("userList", userService.getList(page, size));
request.setAttribute("pageTool", PageUtil.getPageTool(request, userService.getCount(), page, size));
return "/admin/user_list.jsp";
}
/**
* 顾客添加
* @return
*/
@GetMapping("/userAdd")
public String userAdd(HttpServletRequest request) {
request.setAttribute("flag", 4);
return "/admin/user_add.jsp";
}
/**
* 顾客添加
* @return
*/
@PostMapping("/userSave")
public String userSave(Users user, HttpServletRequest request,
@RequestParam(required=false, defaultValue="1") int page) {
if (Objects.nonNull(userService.getByUsername(user.getUsername()))) {
request.setAttribute("msg", "用户名已存在!");
* @param page 当前页面
* @param size 每页数量
* @return
* @throws UnsupportedEncodingException
*/
public static String getPageHtml(HttpServletRequest request, long total, int page, int size) throws UnsupportedEncodingException{
if (total <= 0) {
return null;
}
// 计算总页数
int pages = (int) (total % size ==0 ? total/size : total /size + 1);
pages = pages == 0 ? 1 : pages;
// 请求地址
String url = request.getRequestURL().toString();
System.out.println(url);
// 请求参数
StringBuilder paramBuilder = new StringBuilder();
Enumeration<String> params = request.getParameterNames();
while (params.hasMoreElements()) {
String param = params.nextElement();
if(param.indexOf("page") > -1) {
continue;
}
paramBuilder.append("&").append(param).append("=").append(new String(request.getParameter(param).getBytes("ISO8859-1"),"utf-8"));
}
System.out.println(paramBuilder);
// 分页字符串
StringBuilder pageBuilder = new StringBuilder();
pageBuilder.append("<div class='holder'>");
// 上一页
if (page <= 1) { // 如果已经是第一页, 上一页按钮disabled
// pageBuilder.append("<a title='已是首页'>首页</a>");
// pageBuilder.append("<a title='已是首页'>上页</a>");
}else{
pageBuilder.append("<a href='").append(url).append("?").append("page=1")
.append(paramBuilder).append("'>首页</a>");
pageBuilder.append("<a href='").append(url).append("?").append("page=").append(page-1)
.append(paramBuilder).append("'>上页</a>");
}
// 中间数字页码
if (pages <= 7) { // 全部显示
for (int i = 1; i <= pages; i++) {
pageBuilder.append(packPageItem(url, paramBuilder.toString(), page, i));
}
}else{ // 显示部分
if (page<4 || page>pages-3) { // 1 2 3 ... pages-2 pages-1 pages
pageBuilder.append(packPageItem(url, paramBuilder.toString(), page, 1));
pageBuilder.append(packPageItem(url, paramBuilder.toString(), page, 2));
pageBuilder.append(packPageItem(url, paramBuilder.toString(), page, 3));
pageBuilder.append(" ... ");
/**
* 后台管理接口
*/
@Controller
@RequestMapping("/admin")
public class AdminController {
@Autowired
private AdminService adminService;
@Autowired
private OrderService orderService;
@Autowired
private UserService userService;
@Autowired
private GoodService goodService;
@Autowired
private TopService topService;
@Autowired
private TypeService typeService;
/**
* 管理员登录 (逻辑判断)
* @return
*/
@GetMapping("/login")
public String log() {
return "/admin/login.jsp";
}
/**
* 管理员登录
* @return
*/
@PostMapping("/login")
public String login(String username, String password,
HttpServletRequest request, HttpSession session) {
Admins admin = adminService.getByUsernameAndPassword(username, password);
if (Objects.nonNull(admin)) {
session.setAttribute("admin", admin);
return "redirect:index";
}
request.setAttribute("msg", "用户名或密码错误!");
return "/admin/login.jsp";
}
/**
* 删除
*/
@PostMapping("/cartDelete")
public @ResponseBody boolean cartDelete(int id){
return cartService.delete(id);
}
/**
* 查看订单
* @return
* @throws UnsupportedEncodingException
*/
@GetMapping("/order")
public String order(HttpServletRequest request, HttpSession session,
@RequestParam(required=false, defaultValue="1")int page,
@RequestParam(required=false, defaultValue="6")int size) throws UnsupportedEncodingException{
Users user = (Users) session.getAttribute("user");
request.setAttribute("orderList", orderService.getListByUserid(user.getId(), page, size));
request.setAttribute("pageHtml", PageUtil.getPageHtml(request, orderService.getCountByUserid(user.getId()), page, size));
return "/index/order.jsp";
}
/**
* 直接购买
* @return
* @throws MyException
*/
@PostMapping("/orderAdd")
public String orderAdd(int goodId, HttpSession session) throws MyException{
Users user = (Users) session.getAttribute("user");
int orderId = orderService.add(goodId, user.getId());
return "redirect:orderPay?id="+orderId; // 跳转支付
}
/**
* 购物车结算
* @return
* @throws MyException
*/
@GetMapping("/orderSave")
public String orderSave(ServletRequest request, HttpSession session) throws MyException{
Users user = (Users) session.getAttribute("user");
int orderId = orderService.save(user.getId());
session.removeAttribute("cartCount"); // 清理购物车session
return "redirect:orderPay?id="+orderId; // 跳转支付
}
/**
* 支付页面
* @return
/**
* 用户相关接口
*/
@Controller
@RequestMapping("/index")
public class UserController{
@Resource
private UserService userService;
@Resource
private GoodService goodService;
@Resource
private OrderService orderService;
@Resource
private CartService cartService;
/**
* 用户注册
* @return
*/
@GetMapping("/register")
public String reg() {
return "/index/register.jsp";
}
/**
* 用户注册
* @return
*/
@PostMapping("/register")
public String register(Users user, HttpServletRequest request){
if (user.getUsername().isEmpty()) {
}
}
// 下一页
if (page >= pages) { // 如果已经是最后一页, 上一页按钮disabled
// pageBuilder.append("<a title='已是尾页'>下页</a>");
// pageBuilder.append("<a title='已是尾页'>尾页</a>");
}else{
pageBuilder.append("<a href='").append(url).append("?").append("page=").append(page+1)
.append(paramBuilder).append("'>下页</a>");
pageBuilder.append("<a href='").append(url).append("?").append("page=").append(pages)
.append(paramBuilder).append("'>尾页</a>");
}
pageBuilder.append("</div>");
return pageBuilder.toString();
}
/**
* 封装分页项
* @param url
* @param params
* @param page
* @param i
* @return
*/
private static String packPageItem(String url, String params, int page, int i) {
StringBuilder pageBuilder = new StringBuilder();
if (i == page) {
pageBuilder.append("<a class='jp-current'>").append(i).append("</a>");
}else{
pageBuilder.append("<a title='第").append(i).append("页' href='").append(url).append("?").append("page=").append(i)
.append(params).append("'>");pageBuilder.append(i).append("</a>");
}
return pageBuilder.toString();
}
/**
* 获取分页代码
* @param total 总记录数
* @param page 当前页面
* @param size 每页数量
* @return
*/
public static String getPageTool(HttpServletRequest request, long total, int page, int size){
long pages = total % size ==0 ? total/size : total /size + 1;
pages = pages==0 ? 1 : pages;
String url = request.getRequestURL().toString();
StringBuilder queryString = new StringBuilder();
Enumeration<String> enumeration = request.getParameterNames();
try { // 拼装请求参数
while (enumeration.hasMoreElements()) {
String element = (String) enumeration.nextElement();
if(!element.contains("page")) { // 跳过page参数
queryString.append("&").append(element).append("=").append(java.net.URLEncoder.encode(request.getParameter(element),"UTF-8"));
@GetMapping("/adminList")
public String adminList(HttpServletRequest request,
@RequestParam(required=false, defaultValue="1") int page,
@RequestParam(required=false, defaultValue="10") int size) {
request.setAttribute("flag", 5);
request.setAttribute("adminList", adminService.getList(page, size));
request.setAttribute("pageTool", PageUtil.getPageTool(request, adminService.getCount(), page, size));
return "/admin/admin_list.jsp";
}
/**
* 管理员添加
* @return
*/
@GetMapping("/adminAdd")
public String adminAdd(HttpServletRequest request) {
request.setAttribute("flag", 5);
return "/admin/admin_add.jsp";
}
/**
* 管理员密码重置
* @return
*/
@GetMapping("/adminRe")
public String adminRe(int id, HttpServletRequest request) {
request.setAttribute("flag", 5);
request.setAttribute("admin", adminService.get(id));
return "/admin/admin_reset.jsp";
}
/**
* 管理员密码重置
* @return
*/
@PostMapping("/adminReset")
public String adminReset(int id, String password, HttpServletRequest request,
@RequestParam(required=false, defaultValue="1") int page) {
adminService.update(id, password);
return "redirect:adminList?page="+page;
}
/**
* 管理员添加
* @return
*/
@PostMapping("/adminSave")
public String adminSave(Admins admin, HttpServletRequest request,
@RequestParam(required=false, defaultValue="1") int page) {
if (Objects.nonNull(adminService.getByUsername(admin.getUsername()))) {
request.setAttribute("msg", "用户名已存在!");
return "/admin/admin_add.jsp";
}
adminService.add(admin);
/**
* 用户相关接口
*/
@Controller
@RequestMapping("/index")
public class UserController{
@Resource
private UserService userService;
@Resource
private GoodService goodService;
@Resource
private OrderService orderService;
@Resource
private CartService cartService;
/**
* 用户注册
* @return
*/
@GetMapping("/register")
public String reg() {
return "/index/register.jsp";
}
/**
* 用户注册
* @return
*/
* @throws UnsupportedEncodingException
*/
@GetMapping("/today")
public String today(HttpServletRequest request,
@RequestParam(required=false, defaultValue="1")int page,
@RequestParam(required=false, defaultValue="10")int size) throws UnsupportedEncodingException {
request.setAttribute("flag", 2);
request.setAttribute("goodList", goodService.getListByTopType(Tops.TYPE_TODAY, page, size));
request.setAttribute("pageHtml", PageUtil.getPageHtml(request, goodService.getCountByTopType(Tops.TYPE_TODAY), page, size));
return "/index/goods.jsp";
}
/**
* 热销推荐
* @return
* @throws UnsupportedEncodingException
*/
@GetMapping("/hot")
public String hot(HttpServletRequest request,
@RequestParam(required=false, defaultValue="1")int page,
@RequestParam(required=false, defaultValue="10")int size) throws UnsupportedEncodingException{
request.setAttribute("flag", 3);
request.setAttribute("goodList", goodService.getListOrderSales(page, size));
request.setAttribute("pageHtml", PageUtil.getPageHtml(request, goodService.getCount(), page, size));
return "/index/goods.jsp";
}
/**
* 新品上市
* @return
* @throws UnsupportedEncodingException
*/
@GetMapping("/new")
public String news(HttpServletRequest request,
@RequestParam(required=false, defaultValue="1")int page,
@RequestParam(required=false, defaultValue="10")int size) throws UnsupportedEncodingException{
request.setAttribute("flag", 4);
request.setAttribute("goodList", goodService.getList(page, size));
request.setAttribute("pageHtml", PageUtil.getPageHtml(request, goodService.getCount(), page, size));
return "/index/goods.jsp";
}
/**
* 搜索
* @return
@RequestParam(required=false, defaultValue="1") int page,
@RequestParam(required=false, defaultValue="10") int size) {
request.setAttribute("flag", 4);
request.setAttribute("userList", userService.getList(page, size));
request.setAttribute("pageTool", PageUtil.getPageTool(request, userService.getCount(), page, size));
return "/admin/user_list.jsp";
}
/**
* 顾客添加
* @return
*/
@GetMapping("/userAdd")
public String userAdd(HttpServletRequest request) {
request.setAttribute("flag", 4);
return "/admin/user_add.jsp";
}
/**
* 顾客添加
* @return
*/
@PostMapping("/userSave")
public String userSave(Users user, HttpServletRequest request,
@RequestParam(required=false, defaultValue="1") int page) {
if (Objects.nonNull(userService.getByUsername(user.getUsername()))) {
request.setAttribute("msg", "用户名已存在!");
return "/admin/user_add.jsp";
}
userService.add(user);
return "redirect:userList?flag=4&page="+page;
}
/**
* 顾客密码重置页面
* @return
*/
@GetMapping("/userRe")
public String userRe(int id, HttpServletRequest request) {
request.setAttribute("flag", 4);
request.setAttribute("user", userService.get(id));
return "/admin/user_reset.jsp";
}
/**
* 顾客密码重置
* @return
*/
@PostMapping("/userReset")
public String userReset(int id, String password,
@RequestParam(required=false, defaultValue="1") int page) {
userService.updatePassword(id, password);
return "redirect:userList?page="+page;
//取一个值
@Override
public String getParameter(String name) {
Map<String, String[]> parameterMap = getParameterMap();
String[] values = parameterMap.get(name);
if (values == null) {
return null;
}
return values[0]; // 取回参数的第一个值
}
//取所有值
@Override
public String[] getParameterValues(String name) {
Map<String, String[]> parameterMap = getParameterMap();
String[] values = parameterMap.get(name);
return values;
}
}
/**
* 前台拦截器
*/
public class IndexInterceptor extends HandlerInterceptorAdapter{