# 超市订单管理系统 **Repository Path**: lkim1999/SMBMS ## Basic Information - **Project Name**: 超市订单管理系统 - **Description**: SMBMS超市订单管理系统是一款小型比较完善的管理系统,实现了登录注销、用户管理、订单管理、供应商管理三大模块。 - **Primary Language**: Java - **License**: GPL-3.0 - **Default Branch**: fix-sql - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 14 - **Forks**: 0 - **Created**: 2022-06-23 - **Last Updated**: 2025-06-23 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 超市订单管理系统(SMBMS) ![img](https://camo.githubusercontent.com/e228d5fcdac259eeeb7a4bdea40cd058d675f37f76ac3f9165a1fcdce395fa72/68747470733a2f2f67697465652e636f6d2f6d6172696f3531372f696d6167652f7261772f6d61737465722f6373646e2f32636463656162323238376235653738626532653266353233656164363064342e706e67) - 技术栈:HTML5+CSS3+JavaScript+AJAX+JSP+JSTL+JavaWeb+MySql+Jdbc - 开发工具:eclipse、VScode - 项目责任:后端开发+编写前端接口请求 - 项目描述:SMBMS超市订单管理系统是一款小型比较完善的管理系统,实现了登录注销、用户管理、订单管理、供应商管理三大模块。 系统功能结构图: ![img](https://img-blog.csdnimg.cn/img_convert/42a227ff6f8c44456edaaed10f5d41f4.png) 数据库结构要素: ![img](https://img-blog.csdnimg.cn/img_convert/df221a70058c6c8695e7e49cda2a7b9d.png) 模块描述: 登录注销模块: ![img](https://img-blog.csdnimg.cn/img_convert/077f0790cefe6ea1689fb605bd4d6309.png) - 登录:在登录界面login.jsp输入用户名和密码,用户名和密码在前端界面使用了Ajax技术异步检验输入规范性(input标签失去焦点后即发送异步请求,动态更新页面部分),检验通过后将表单数据发送到后台检验,检验通过后即可登录后后台首页,然后将用户信息对象存放至session域中,否则,将错误信息存至request域中给前端页面通过EL表达式来显示。 ```html <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> My JSP 'index.jsp' starting page 用户名: ``` - 注销:移除session域中用户信息对象 - 密码修改:先检验一次旧密码,验证后经过Ajax发送请求到后台修改密码 用户管理模块:包含获取用户数量的功能、根据输入条件获取当前的用户列表、根据用户输入的条件来(模糊)查询用户角色以及用户角色的新增、编辑、删除 订单管理模块:包含增加订单、删除订单、修改订单信息、根据供应商ID查询其订单数量以及根据条件(模糊)查询供应商列表 供应商管理模块:包含增加供应商、删除供应商、查询供应商详细信息、修改供应商信息、根据条件(模糊)查询供应商 技术描述: 1. 前端采用HTML5+CSS3+JavaScript+Ajax+JQuery+JSP+EL+JSTL 2. 后端采用JavaEE+MySQL+JDBC 3. 设计思想:采用自顶向下设计,自顶向上实现。先写基本逻辑,后逐步完善功能 4. 请求通过Servlet来处理,返回结果存放至JSP6大内置对象中(request、response、session、application、out、exception),前端页面通过EL表达式+JSTL来显示结果 ```java private void query(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ List providerList = new ArrayList<>(); ProviderService providerService = new ProviderServiceImpl(); //先获取全部的供应商信息列表(Bill和Provider两张表共有的属性) providerList = providerService.getProviderList("", ""); //将该列表存放于request域,给前端使用 request.setAttribute("providerList", providerList); //从前端页面获取查询条件信息 String queryProductName = request.getParameter("queryProductName"); String queryProviderId = request.getParameter("queryProviderId"); String queryIsPayment = request.getParameter("queryIsPayment"); if(StringUtils.isNullOrEmpty(queryProductName)) { queryProductName = ""; } //获取Bill列表信息 List billList = new ArrayList(); BillService billService = new BillServiceImpl(); Bill bill = new Bill(); if(StringUtils.isNullOrEmpty(queryIsPayment)){ // bill.setIsPayment(0); }else{ bill.setIsPayment(Integer.parseInt(queryIsPayment)); } if(StringUtils.isNullOrEmpty(queryProviderId)){ // bill.setProviderId(0); }else{ bill.setProviderId(Integer.parseInt(queryProviderId)); } bill.setProductName(queryProductName); billList = billService.getBillList(bill); System.out.println("执行了吗???"); billList.forEach(System.out::println); request.setAttribute("billList", billList); request.setAttribute("queryProductName", queryProductName); request.setAttribute("queryProviderId", queryProviderId); request.setAttribute("queryIsPayment", queryIsPayment); request.getRequestDispatcher("billlist.jsp").forward(request, response); } private void add(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ //获取登录用户实例 User user = (User) request.getSession().getAttribute(Constants.USER_SESSION); //从前端页面获取新订单的信息 String billCode = request.getParameter("billCode"); String productName = request.getParameter("productName"); String productDesc = request.getParameter("productDesc");// String productUnit = request.getParameter("productUnit"); String productCount = request.getParameter("productCount"); String totalPrice = request.getParameter("totalPrice"); String providerId = request.getParameter("providerId"); String isPayment = request.getParameter("isPayment"); Bill bill = new Bill(); bill.setBillCode(billCode); bill.setProductName(productName); bill.setProductDesc(productDesc); bill.setProductUnit(productUnit); //BigDecimal设置只保留小数点后两位 bill.setProductCount(new BigDecimal(productCount).setScale(2, BigDecimal.ROUND_DOWN)); bill.setIsPayment(Integer.parseInt(isPayment)); bill.setTotalPrice(new BigDecimal(totalPrice).setScale(2, BigDecimal.ROUND_DOWN)); bill.setProviderId(Integer.parseInt(providerId)); bill.setCreatedBy((int)user.getId()); bill.setCreationDate(Date.valueOf(LocalDate.now())); boolean flag = false; BillService billService = new BillServiceImpl(); flag = billService.add(bill); if(flag) { response.sendRedirect(request.getContextPath() + "/jsp/bill.do?method=query"); } else { request.getRequestDispatcher("billadd.jsp").forward(request, response); } } ``` ```html <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@include file="/jsp/common/head.jsp"%>
你现在所在的位置是: 订单管理页面
``` 5. 数据库采用MyBatis,连接数据库采用JDBC,并且使用连接池来,执行SQL语句是使用PreparedStatement防止SQL注入(${}是插入字符串,包含"dsadsadsa",而#{}利用占位符,将数据插至对应""位置中),返回的结果ResultSet对象接收,通过反射来将数据库对应字段的数据填充至Java对象中的对应属性当中 6. 登录注销模块添加了拦截器,实现拦截未登录用户去查看或操作某些模块 7. 用户管理、订单管理以及供应商管理模块中,查询在dao实现类中采用字符串StringBuffer进行SQL拼接来实现模糊查询 ```java //根据用户名或角色查询用户总数[最难理解的SQL语句] @Override public int getUserCount(Connection conn, String username, int userRole) throws SQLException { PreparedStatement ps = null; ResultSet rs = null; int resultCount = 0; if(conn != null) { //使用字符串拼接(StringBuffer是多线程的,性能较StringBuilder差一点) StringBuffer sql = new StringBuffer(); sql.append("SELECT count(*) as count FROM smbms_user u, smbms_role r WHERE u.userRole = r.id"); //存放参数 ArrayList list = new ArrayList<>(); //如果用户名不为空 if(!StringUtils.isNullOrEmpty(username)) { sql.append(" AND u.userName LIKE ?"); //模糊查询 list.add("%" + username + "%");//index:0 } //如果角色号不为空 if(userRole > 0) { sql.append(" AND u.userRole = ?"); list.add(userRole);//index:1 } //将list转换为数组 Object[] params = list.toArray(); System.out.println("UserDaoImpl-->getUserCount:" + sql.toString()); rs = BaseDao.executeQuery(conn, sql.toString(), params, ps, rs); if(rs.next()) { resultCount = rs.getInt("count");//从结果集中获取最终的数量 } JDBCUtils.closeResource(null, ps, rs); } return resultCount; } ``` 8. 在用户管理、订单管理以及供应商管理模块中,通过传入的参数以及拼接SQL语句(使用limit)来实现分页功能 ```java @Override public List getUserList(Connection conn, String userName, int userRole, int currentPageNo, int pageSize) throws Exception { /* * params * userName: 用户名 * userRole: 用户角色编号 * currentPageNo: 想要跳转的页数 * pageSize: 页数的数据量 * (currentPageNo - 1) * pageSize 是想要跳转页数的第一条数据的索引值 */ PreparedStatement ps = null; ResultSet rs = null; List userList = null; if(conn != null) { userList = new ArrayList<>(); StringBuffer sql = new StringBuffer(); sql.append("SELECT u.*, r.roleName AS userRoleName FROM smbms_user u, smbms_role r WHERE u.userRole = r.id"); List list = new ArrayList<>(); if(!StringUtils.isNullOrEmpty(userName)) { sql.append(" and u.userName like ?"); list.add("%" + userName + "%"); } if(userRole > 0) { sql.append(" and u.userRole = ?"); list.add(userRole); } //在数据库中,分页显示 limit startIndex,pageSize;总数 //当前页数据起始索引 (当前页-1)*页面大小 //0,5 1,0 01234 //5,5 5,0 56789 //10,5 10,0 10~ sql.append(" order by creationDate DESC limit ?, ?"); //传进的参数currentPageNo是当前页面的页码号 //而(currentPageNo-1)*pageSize得出的是当前页面第一条数据的index currentPageNo = (currentPageNo-1)*pageSize; list.add(currentPageNo); list.add(pageSize); Object[] params = list.toArray(); //测试 System.out.println("sql ----> " + sql.toString()); rs = BaseDao.executeQuery(conn, sql.toString(), params, ps, rs); while(rs.next()) { User user = new User(); user.setId(rs.getInt("id")); user.setUserCode(rs.getString("userCode")); user.setUserName(rs.getString("userName")); user.setGender(rs.getInt("gender")); user.setBirthday(rs.getDate("birthday")); user.getAge(); user.setPhone(rs.getString("phone")); user.setUserRole(rs.getInt("userRole")); user.setUserRoleName(rs.getString("userRoleName")); userList.add(user); } JDBCUtils.closeResource(null, ps, rs); } return userList; } @Test public void test3() throws Exception { java.util.Date date = new java.util.Date(); Instant instant = date.toInstant(); ZoneId zone = ZoneId.systemDefault(); LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, zone); System.out.println(localDateTime.toString()); System.out.println("由时间中获取年"); DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH);// 设定格式 String sToTimestamp = "2005-8-18"; try { java.util.Date timeDate = dateFormat.parse(sToTimestamp); Calendar calendar = Calendar.getInstance(); calendar.setTime(timeDate); int year = calendar.get(Calendar.YEAR); System.out.println("year:"+year); } catch (Exception e) { System.out.println(e.toString()); } Connection conn = JDBCUtils.getConnection(); List userList = getUserList(conn, "", 2, 1, 8); // userList.forEach(System.out::println); for(User user: userList) { System.out.println(user.getAge()); System.out.println(user.getBirthday().toString()); } } @Override public int add(Connection connection, User user) throws Exception { PreparedStatement ps = null; int updateRows = 0; if(null != connection){ String sql = "insert into smbms_user (userCode,userName,userPassword," + "userRole,gender,birthday,phone,address,creationDate,createdBy) " + "values(?,?,?,?,?,?,?,?,?,?)"; Object[] params = {user.getUserCode(),user.getUserName(),user.getUserPassword(), user.getUserRole(),user.getGender(),user.getBirthday(), user.getPhone(),user.getAddress(),user.getCreationDate(),user.getCreatedBy()}; updateRows = BaseDao.update(connection, sql, params, ps); JDBCUtils.closeResource(null, ps, null); } return updateRows; } ```