物流系统

1.东软介绍

东软睿新科技集团总部位于大连,是中国领先的数字化人才教育服务提供者、教医养康旅生态先行者。2020年9月29日公司成功登陆香港联合交易所主板上市。如今,集团正依托“教育+科技+医养”的创新研发能力,打造“教医养康旅”五位一体融合发展新生态。


教育科技

以“东软教育科技集团”作为运营主体,依托东软雄厚的产业优势与学历教育丰厚的办学积淀,将领先的教育理念、方法、模式、体系、标准等数字化、产品化、平台化,构建起涵盖资源、软件、平台、数据四个层级的4S产品服务体系(CaaS-内容即服务,SaaS-软件即服务,PaaS-平台即服务, DaaS-数据即服务),以专业共建与产业学院、智慧教育平台与教学内容、实训室解决方案等多种形式,以数字工场作为实施载体,用一流的教育产品和服务为更多的普通高校和职业院校赋能。
截至目前,已与全国700余所本科和职业院校合作,其中包括 30余所“双一流”建设高校及建设学科名单的普通高校,及60余所被纳入中国职业教育“双高计划”建设学校的职业学校。

2.生产实习-时间安排



3.软件工程-项目阶段

瀑布模型将软件开发分为以下顺序阶段,每个阶段有明确的输入和输出:

  1. 需求分析(Requirements Analysis)
    目标:明确用户需求,定义系统功能和非功能需求。
    输出:《软件需求规格说明书》(SRS)。
    关键活动:用户访谈、需求调研、用例分析。

  2. 系统设计(System Design)
    目标:基于需求设计系统架构和详细方案。
    输出:《系统设计文档》(SDD),包括:
    高层设计(架构设计):模块划分、数据流图(DFD)、ER图。
    详细设计:类图、算法设计、数据库表结构。

  3. 实现(Implementation / Coding)
    目标:编写代码,实现设计。
    输出:可执行程序 + 源代码。
    关键活动:编码规范、单元测试、版本控制(Git)。

  4. 测试(Testing)
    目标:发现并修复缺陷,确保软件符合需求。
    输出:《测试报告》,包括:
    单元测试(开发者)
    集成测试(模块组合测试)
    系统测试(整体功能验证)
    验收测试(用户确认)

5.部署与维护(Deployment & Maintenance)
目标:交付用户使用并持续优化。
输出:上线系统 + 运维文档。
关键活动:
纠错性维护(修复Bug)
适应性维护(适应新环境,如操作系统升级)
完善性维护(新增功能)

4.数据库设计原则

数据库设计是软件系统开发的关键环节,良好的数据库设计能提高数据存储效率、查询性能、可维护性和扩展性。以下是数据库设计的核心原则:

1. 规范化设计(Normalization)

目标:减少数据冗余,避免异常(插入、更新、删除异常)。
常用范式:
第一范式(1NF):字段不可再分(原子性),无重复列。
第二范式(2NF):满足1NF,且非主键字段完全依赖主键(消除部分依赖)。
第三范式(3NF):满足2NF,且非主键字段不传递依赖主键(消除冗余)。
适用场景:事务型系统(OLTP),如电商、ERP、MS。
反规范化:为提高查询性能,可适度冗余。
下面将通过一个具体的例子来说明三个范式。
假设我们有一个"学生课程记录"表:


第一范式(1NF):确保每列都是原子的
要求:每个字段都是不可再分的最小数据单元,没有重复的列。
我们的初始表已经满足1NF,因为:
每个字段都是最小单元(学号、姓名等都不能再分)
没有重复的列

第二范式(2NF):消除部分依赖
要求:在1NF基础上,非主键字段必须完全依赖于整个主键(不能只依赖于主键的一部分)。
问题分析:
主键应该是(学号,课程号)组合
但"学生姓名"、"系名"、"系主任"只依赖于学号
"课程名称"只依赖于课程号
解决方案:拆分成三个表


第三范式(3NF):消除传递依赖
要求:在2NF基础上,非主键字段不能依赖于其他非主键字段(即不能有传递依赖)。
问题分析:
在学生表中,"系主任"依赖于"系名",而"系名"又依赖于"学号"
存在传递依赖:学号 → 系名 → 系主任
解决方案:进一步拆分学生表

2. 合理的表结构设计

主键(Primary Key):
唯一标识记录(如自增ID、UUID或业务主键)。
尽量使用简单、稳定的键(避免频繁更新)。
外键(Foreign Key):
确保引用完整性(可加级联删除/更新约束)。
注意性能影响(大数据量时可能降低写入速度)。
字段类型选择:
用最小够用的数据类型(如TINYINT代替INT存储状态值)。
避免NULL(可用默认值替代,减少索引复杂度)。

3. 索引优化

索引原则:
为高频查询条件(WHERE、JOIN、ORDER BY)创建索引。
避免过多索引(影响写入性能)。
联合索引遵循最左前缀原则(如INDEX(a, b)可优化WHERE a=1 AND b=2,但不优化WHERE b=2)。
避免索引失效:
不要在索引列上使用函数(如WHERE YEAR(create_time)=2023)。

4. 性能与扩展性

读写分离:高频读操作用从库,写操作用主库。
分库分表:
水平分表:按数据行拆分(如按用户ID哈希)。
垂直分表:按列拆分(冷热数据分离)。
缓存层:用Redis缓存热点数据(如商品详情)。

5. 安全性与维护

数据安全:
敏感数据加密(如密码用哈希存储,信用卡号加密)。
定期备份(全量+增量备份)。
可维护性:
表名、字段名见名知义(如user_account而非tbl_ua)。
添加注释(COMMENT)说明字段用途。

5.前端页面设计原则

前端页面设计不仅关乎美观,更影响用户体验、可访问性和性能。以下是现代前端设计的关键原则:

1. 用户体验(UX)优先原则

以用户为中心:设计始终围绕用户需求和目标
一致性:保持界面元素、交互方式和视觉风格的一致性
直观性:用户无需思考就能理解界面功能
反馈机制:对用户操作提供即时、清晰的反馈(如按钮点击效果)

2. 视觉设计原则

层次结构:通过大小、颜色、间距建立清晰的视觉层次
对比度:确保文字与背景有足够对比度
留白:合理使用空白区域避免界面拥挤
色彩系统:限制主色数量(通常3-5种),建立配色方案

3. 可用性原则

Fitts定律:增大可点击目标尺寸,减少操作距离
希克定律:减少选择项以加速决策过程
米勒定律:人类短期记忆限制为7±2项,控制菜单项数量
邻近原则:相关元素应彼此靠近

4. 性能优化原则

关键渲染路径优化:优先加载可视区域内容
图片优化:适当压缩,使用现代格式(WebP/AVIF)
代码精简:删除未使用代码,最小化资源
延迟加载:非关键资源延迟加载

5. 可访问性原则

语义化HTML:正确使用HTML5语义标签
键盘导航:确保所有功能可通过键盘操作
替代文本:为所有非文本内容提供文本替代

6. 现代开发实践

组件化设计:构建可复用的UI组件
设计系统:建立统一的设计语言和模式库
渐进增强:确保基础功能在所有浏览器可用
无障碍优先:从项目开始就考虑可访问性

7. 实用设计模式示例

导航:固定头部、面包屑、分页
表单:内联验证、清晰标签、合理分组
内容展示:卡片布局、分栏、渐进披露
反馈:Toast通知、加载状态、空状态设计

优秀的前端设计是艺术与工程的结合,需要在美观性、功能性、性能和维护性之间取得平衡。随着Web技术的不断发展,这些原则也在持续演进,但以用户为中心的核心思想始终不变。

5.编码实现

MVC设计模式


mvc.png

后端核心类
1、Dao层
全称为Data Access Object,负责数据库执行sql,完成增删查改的功能。提供接口给Service层。
2、Service层
调用Dao层提供的接口,业务处理,为Controller层提供接口。
3、Controller层
负责请求转发,接收用户传来的参数,通过调用Service层提供的接口,实现将数据转发给Service层处理。接收Service的返回值,再转发给用户。
4、POJO
负责数据封装,便于各层之间数据传递

5.1数据库

5.1.1 新建库

库名

ldm

5.1.2 建表语句

DROP TABLE IF EXISTS manager;
DROP TABLE IF EXISTS customer;

CREATE TABLE manager -- 管理员表
(
  mid  INT  PRIMARY KEY auto_increment, -- 管理员id
  username VARCHAR(15) UNIQUE NOT NULL, -- 用户名
  password VARCHAR(12) ,                -- 登录密码
  role     VARCHAR(7) -- 角色 客服 调度中心管理员 配送中心管理员 中心库房管理员 分站库房管理员 分站管理员 配送员
);
INSERT INTO manager(username,password,role)
VALUES('ok','123','客服');


CREATE TABLE customer -- 客户表
(
  cid  INT  PRIMARY KEY auto_increment, -- 客户id
  name VARCHAR(15)  NOT NULL,           -- 客户姓名
  idNumber CHAR(18) ,                   -- 身份证
  workunit      VARCHAR(30),            -- 工作单位
  landline      CHAR(8),                -- 座机
  mobile        CHAR(11),               -- 移动电话
  contactAddress VARCHAR(50),           -- 联系地址
  post           CHAR(6) ,              -- 邮编 
  email           VARCHAR(20)           -- email 
);


INSERT INTO customer(name,idNumber,workunit,landline,mobile,contactAddress,post,email)
VALUES('孟子义','130984199512053333','青岛江河湖海文化传媒工作室','85603066','18302225678','明志楼南103室','710124','zsbgs@mdit.edu.cn');

5.2JakartaEE项目

5.2.1新建项目


5.2.2修改pom.xml文件

        <!-- lombok 提升po开发效率 -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.38</version>
        </dependency>
        <!-- fastjson Json数据格式工具 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>2.0.37</version>
        </dependency>
        <!-- commons-dbcp2 开源数据源 -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-dbcp2</artifactId>
            <version>2.9.0</version>
        </dependency>
        <!-- commons-dbutils jdbc封装 -->
        <dependency>
            <groupId>commons-dbutils</groupId>
            <artifactId>commons-dbutils</artifactId>
            <version>1.7</version>
        </dependency>
        <!-- mysql-connector-java 数据库驱动 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.32</version>
        </dependency>

5.2.3创建如下包接口

5.2.4新建DBUtil.java类

在util包新建DBUtil

import org.apache.commons.dbcp2.BasicDataSource;
import javax.sql.DataSource;

public class DBUtil {
    private static final DataSource DATA_SOURCE;

    static {
        BasicDataSource ds = new BasicDataSource();
        ds.setDriverClassName("com.mysql.cj.jdbc.Driver");
        ds.setUrl("jdbc:mysql://localhost:3306/ldm?characterEncoding=utf8&serverTimezone=Asia/Shanghai");
        ds.setUsername("root");
        ds.setPassword("root");//密码不是root需要修改
        ds.setInitialSize(5);
        ds.setMaxTotal(10);
        DATA_SOURCE = ds;
    }

    public static DataSource getDataSource() {
        return DATA_SOURCE;
    }
}

5.2.5登录功能-后端实现

1.po包下Manager.java

import lombok.Data;
//po类用于数据,与数据库中的表对应
//需要定义私有属性,属性和表中列对应
@Data //生成 setter/getter方法
public class Manager {
    private Integer mid;
    private String username;
    private String password;
    private String role;
}

2.dao包下ManagerDao.java

import cn.edu.mdit.ldm.po.Manager;
import cn.edu.mdit.ldm.util.DBUtil;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import java.sql.SQLException;

public class ManagerDao {
     //定义QueryRunner类型属性,执行sql语句
    private QueryRunner runner = new QueryRunner( DBUtil.getDataSource() );

    public Manager selectByUsernameAndPassword(  Manager manager  ) {
        Manager result = null;
        String sql = "select * from manager where username=? and password=?";
        try {
            result = runner.query(sql, new BeanHandler<>(Manager.class) , manager.getUsername(),manager.getPassword() );
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
        return  result;
    }
}

3.service包下的ManagerService.java

import cn.edu.mdit.ldm.dao.ManagerDao;
import cn.edu.mdit.ldm.po.Manager;

public class ManagerService {
    //定义ManagerDao类型属性
    private ManagerDao dao =  new ManagerDao();

    public Manager login( Manager manager ){
        return dao.selectByUsernameAndPassword(manager);
    }
}

4.controller包下的LoginController.java

import cn.edu.mdit.ldm.po.Manager;
import cn.edu.mdit.ldm.service.ManagerService;
import com.alibaba.fastjson.JSON;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/login") //注册servlet并配置url -- 必须以/开头,不能重复
public class LoginController extends HttpServlet {
    //定义ManagerService类型属性
    private ManagerService service = new ManagerService();

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.设置请求及响应
        request.setCharacterEncoding("utf-8");
        response.setContentType("application/json;charset=utf-8");
        //2.获取请求参数数据(前端发送的数据)
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        Manager manager = new Manager();
        manager.setUsername(username);
        manager.setPassword(password);
        //3.调用业务类方法处理数据,获得处理结果
        Manager result = service.login(manager);
        //4.将处理结果转化为json格式字符串数据,发送给前端
        PrintWriter out = response.getWriter();
        out.print( JSON.toJSONString(result)  );

    }
}

5.2.6登录功能-前端实现

使用LayUI组件库-->LayUI
将layui文件夹复制到webapp文件夹下

1.png

login.html登录页面

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>管理员登录</title>
   <link href="./layui/css/layui.css" rel="stylesheet">
   <script src="./layui/layui.js"></script>
  <style>
    html,body{width: 100%;height: fit-content; background-color: rgba(255, 255, 255, 0.7); /* 半透明白色 */
      backdrop-filter: blur(10px); /* 毛玻璃模糊 */}
    .demo-login-container{width: 320px; margin: 21px auto 0;}
    .demo-login-other .layui-icon{position: relative; display: inline-block; margin: 0 2px; top: 2px; font-size: 26px;}
    .layui-form{ margin-top: 100px;}
  </style>
</head>
<body>
<form class="layui-form">
  <div class="demo-login-container">
    <div class="layui-form-item">
      <div class="layui-input-wrap">
        <div class="layui-input-prefix">
          <i class="layui-icon layui-icon-username"></i>
        </div>
        <input type="text" id="username" name="username" value="" lay-verify="required" placeholder="用户名" lay-reqtext="请填写用户名" autocomplete="off" class="layui-input" lay-affix="clear">
      </div>
    </div>
    <div class="layui-form-item">
      <div class="layui-input-wrap">
        <div class="layui-input-prefix">
          <i class="layui-icon layui-icon-password"></i>
        </div>
        <input id="password"  type="password" name="password" value="" lay-verify="required" placeholder="密   码" lay-reqtext="请填写密码" autocomplete="off" class="layui-input" lay-affix="eye">
      </div>
    </div>
 
    <div class="layui-form-item">
      <a href="regist.html" style="float: right; margin-top: 7px;">注册</a>
    </div>
    <div class="layui-form-item">
      <button type="button" class="layui-btn layui-btn-fluid" lay-submit lay-filter="login">登录</button>
    </div>
  </div>
</form>
</body>
<script>
  //表单提交
  layui.use(()=>{
    let form = layui.form;//获得表单
    let $ = layui.jquery;//简化jQuery调用
    // 校验通过
    form.on('submit(login)', formData => {
      // 此处可执行 发送Ajax请求 操作
      $.post('http://localhost:9999/login',formData.field)
              .then( res => {
                if( res ){
                  layer.msg('登录成功',{icon: 1})
                } else {
                  layer.msg('登录失败,用户名或密码不正确',{icon: 2})
                }
              })
    });
  });

</script>
</html>

5.2.7注册功能-后端实现

1.dao包中ManagerDao类中新增插入管理员数据方法

 public int insert(Manager manager){
        int result = 0;
        String sql = "INSERT INTO manager (username, password, role) VALUES (?, ?, ?)";
        try {
            result = queryRunner.update(sql,manager.getUsername(),manager.getPassword(),manager.getRole());
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
        return result;//返回插入数据结果,1代表成功 0代表失败
    }

2.service包中ManagerService类中新增注册管理员方法

public String regist(Manager manager){
        return  dao.insert(manager)==1?"注册成功":"注册失败";
}

3.controller包中增加RegistController.java类

import cn.edu.mdit.ldm.po.Manager;
import cn.edu.mdit.ldm.service.ManagerService;
import com.alibaba.fastjson.JSON;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet("/regist")
public class RegistController extends HttpServlet {
    //依赖service
    private ManagerService service = new ManagerService();

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.设置请求及响应
        request.setCharacterEncoding("utf-8");
        response.setContentType("application/json;charset=utf-8");
        //2.获取请求参数数据(注册数据)
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        String role = request.getParameter("role");
        Manager manager = new Manager();
        manager.setUsername(username);
        manager.setPassword(password);
        manager.setRole(role);
        //3.调用业务类方法,获得注册结果
        String result = service.regist(manager);
        //4.发送响应
        PrintWriter out = response.getWriter();
        out.print( JSON.toJSONString(result)  );
    }
}

5.2.8注册功能-前端实现

regist.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>注册</title>
    <link href="./layui/css/layui.css" rel="stylesheet">
    <script src="./layui/layui.js"></script>
    <style>
        .demo-reg-container{width: 320px; margin: 21px auto 0;}
        .demo-reg-other .layui-icon{position: relative; display: inline-block; margin: 0 2px; top: 2px; font-size: 26px;}
    </style>
</head>
<body>
<form class="layui-form">
    <div class="demo-reg-container">
        <div class="layui-form-item">
            <div class="layui-input-wrap">
                <div class="layui-input-prefix">
                    <i class="layui-icon layui-icon-username"></i>
                </div>
                <input type="text" id="username" name="username" value="" lay-verify="required" placeholder="用户名" autocomplete="off" class="layui-input" lay-affix="clear">
            </div>
        </div>
        <div class="layui-form-item">
            <div class="layui-input-wrap">
                <div class="layui-input-prefix">
                    <i class="layui-icon layui-icon-password"></i>
                </div>
                <input type="password" id="password" name="password" value="" lay-verify="required" placeholder="密码" autocomplete="off" class="layui-input"  lay-affix="eye">
            </div>
        </div>
        <div class="layui-form-item">
            <div class="layui-input-wrap">
                <div class="layui-input-prefix">
                    <i class="layui-icon layui-icon-password"></i>
                </div>
                <input type="password" id="confirmPassword" name="confirmPassword" value="" lay-verify="required|confirmPassword" placeholder="确认密码" autocomplete="off" class="layui-input" lay-affix="eye">
            </div>
        </div>

        <div class="layui-form-item">
            <label class="layui-form-label">管理员角色</label>
            <div class="layui-input-block">
                <select name="role">
                    <option value="客服">客服</option>
                    <option value="调度中心管理员">调度中心管理员</option>
                    <option value="配送中心管理员">配送中心管理员</option>
                    <option value="配送中心管理员">中心库房管理员</option>
                    <option value="配送中心管理员">分站库房管理员</option>
                    <option value="配送中心管理员">分站管理员</option>
                    <option value="配送中心管理员">配送员</option>
                </select>
            </div>
        </div>
        <div class="layui-form-item">
            <button id="btn-regist" class="layui-btn layui-btn-fluid" type="button" lay-submit lay-filter="reg">注册</button>
        </div>
        <div class="layui-form-item demo-reg-other">
            <label>社交账号注册</label>
            <span style="padding: 0 21px 0 6px;">
        <a href="javascript:;"><i class="layui-icon layui-icon-login-qq" style="color: #3492ed;"></i></a>
        <a href="javascript:;"><i class="layui-icon layui-icon-login-wechat" style="color: #4daf29;"></i></a>
        <a href="javascript:;"><i class="layui-icon layui-icon-login-weibo" style="color: #cf1900;"></i></a>
      </span>
            <a href="login.html">登录已有帐号</a>
        </div>
    </div>
</form>
</body>
<script>
    layui.use(()=>{
        let form = layui.form;
        let $ = layui.jquery;
        // 自定义验证规则
        form.verify({
            // 确认密码
            confirmPassword: (value, item)=>{
                let passwordValue = $('#password').val();
                if(value !== passwordValue){
                    return '两次密码输入不一致';
                }
            }
        });

        // 校验通过
        form.on('submit(reg)', formData => {
            // 此处可执行 发送Ajax请求 操作
           let loadIndex = layer.load(2,{content: '处理中'})
            $.post('http://localhost:9999/regist',formData.field)
                .then(res=>{
                    layer.close(loadIndex);
                    layer.msg(res)
                })
        });
    });
</script>
</html>

5.2.9 登录成功后跳转首页

1.新增index.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>物流配送系统</title>
  <meta name="renderer" content="webkit">
  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link href="./layui/css/layui.css" rel="stylesheet">
  <script src="./layui/layui.js"></script>
</head>
<body>
<div class="layui-layout layui-layout-admin">
  <div class="layui-header">
    <div class="layui-logo layui-hide-xs layui-bg-black">物流配送管理系统</div>
    <ul class="layui-nav layui-layout-right">
      <li class="layui-nav-item layui-hide layui-show-sm-inline-block">
         <span id="username">tester</span>
      </li>
    </ul>
  </div>
  <div class="layui-side layui-bg-black">
    <div class="layui-side-scroll">
      <!-- 左侧导航区域(可配合layui已有的垂直导航) -->
      <ul class="layui-nav layui-nav-tree" lay-filter="test">
        <li class="layui-nav-item layui-nav-itemed">
          <a class="" href="javascript:;">客户服务中心</a>
          <dl class="layui-nav-child">
          </dl>
        </li>
      </ul>

    </div>
  </div>
  <div class="layui-body">
    <!-- 内容主体区域 -->
    <div id="main" style="padding: 15px;">
      <blockquote class="layui-elem-quote layui-text">
       物流配送管理系统
      </blockquote>
      <div class="layui-card layui-panel">
        <div class="layui-card-body">
           随着流通经济的发展,现代物流的重要性越来越受到人们的关注,<br>
           为了降低成本、提高效益、充分发挥自身核心竞争力、增强企业对环境的迅速应变能力、<br>
           第三方物流这种新兴物流形态和管理模式开始引起人们的重视。<br>
           第三方物流企业引进先进的信息处理技术,<br>
           不仅会提高物流企业的自动化程度和信息共享度、降低成本、提高工作效率还会从根本上改变物流企业的发展战略。<br>
           当前第三方物流的竞争主要围绕着信息资源的占有而展开。
        </div>
      </div>
    </div>
  </div>
</div>
</body>
<script>
  let $ = layui.jquery
  //初始化菜单
  const menus = [
    {
      name: '客户维护管理',
      path: './customerquery.html'
    }
  ]
  menus.forEach( menu => {
      let dd = $('<dd>')
      let a = $('<a></a>')
      a.text(menu.name)
      a.click(()=>{
        $('#main').html('')
        $("#main").load(menu.path);
      })

    dd.append(a)
    $('.layui-nav-child').append(dd)
  })

</script>
</html>

2.修改login.html
将原来的登录成功后,弹出消息

   layer.msg('登录成功',{icon: 1})     

替换为

 sessionStorage.setItem('manager', JSON.stringify(res));
 window.location.assign('./index.html');

5.2.10 客户信息查询功能-后端开发

1.在po包下新建Customer类

import lombok.Data;
@Data
public class Customer {
    private Integer cid;
    private String name;
    private String idNumber;
    private String workunit;
    private String landline;
    private String mobile;
    private String contactAddress;
    private String post;
    private String email;
}

2.在po包下新建TableData类

import lombok.Data;
import java.util.List;
@Data
public class TableData {
    private Integer code;
    private String msg;
    private Integer count;
    private List data;
}

3.在dao包下新增CustomerDao类

import cn.edu.mdit.ldm.po.Customer;
import cn.edu.mdit.ldm.util.DBUtil;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import java.sql.SQLException;
import java.util.List;

public class CustomerDao {

    private QueryRunner runner = new QueryRunner( DBUtil.getDataSource() );

    public List<Customer> selectByName(String name){
        List<Customer> list = null;
        String sql = "select * from customer where name like ?";

        try {
            list = runner.query(sql,new BeanListHandler<>(Customer.class),"%"+name+"%"  );
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }

        return list;
    }
}

4.在service包下新增CustomerService类

import cn.edu.mdit.ldm.dao.CustomerDao;
import cn.edu.mdit.ldm.po.Customer;
import java.util.List;

public class CustomerService {
    private CustomerDao dao = new CustomerDao();

    public List<Customer> queryCustomer(String name) {
        return dao.selectByName(name);
    }
}

5.在controller包下新增CustomerQueryController类

import cn.edu.mdit.ldm.po.Customer;
import cn.edu.mdit.ldm.po.TableData;
import cn.edu.mdit.ldm.service.CustomerService;
import com.alibaba.fastjson.JSON;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
@WebServlet("/customer/query")
public class CustomerQueryController extends HttpServlet {

    private CustomerService service = new CustomerService();

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        response.setContentType("application/json;charset=UTF-8");

        String name = request.getParameter("name");

        List<Customer> result = service.queryCustomer(name);

        PrintWriter out = response.getWriter();
        //将查询客户数据封装到layui需要的数据结构
        TableData tableData = new TableData();
        tableData.setCode(0);
        tableData.setMsg("success");
        tableData.setCount( result.size() );
        tableData.setData( result );

        out.print( JSON.toJSONString(tableData) );
    }
}

5.2.11 客户信息查询功能-前端开发

在webapp下新增customerquery.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <blockquote class="layui-elem-quote layui-text">
       客户维护管理
    </blockquote>
    <div class="layui-card layui-panel">
        <div class="layui-card-body">
          <input type="text"  style="width: 200px;display: inline;" id="name" placeholder="请输入查询客户姓名" class="layui-input">
          <button type="button" id="btn-query" class="layui-btn layui-bg-blue">查询</button>
          <button type="button" id="btn-add" class="layui-btn">增加</button>
        </div>
    </div>
    <table class="layui-table" id="table"></table>
</body>    
<script>
   

    $('#btn-add').click(()=>{
        layer.open({
        type: 2,
        title: '增加',
        shadeClose: true,
        shade: 0.1,
        area: ['580px', '90%'],
        content: './customeradd.html'
      });
    })
</script>
</html>

客户新增页面customeradd.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta name="renderer" content="webkit">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link href="./layui/css/layui.css" rel="stylesheet">
    <script src="./layui/layui.js"></script>
    <style>.layui-input{width: 80%}</style>
</head>
<body>
    <form class="layui-form" >
        <div class="layui-form-item">
            <label class="layui-form-label">客户姓名</label>
            <div class="layui-input-block">
                <input type="text" name="name" lay-verify="required" lay-reqtext="请填写客户姓名" placeholder="请输入客户姓名" autocomplete="off" class="layui-input">
            </div>
        </div>
        <div class="layui-form-item">
            <label class="layui-form-label">身份证编号</label>
            <div class="layui-input-block">
                <input type="text" name="idNumber" lay-verify="required" lay-reqtext="请填写身份证编号" placeholder="请输入身份证编号" autocomplete="off" class="layui-input">
            </div>
        </div>
        <div class="layui-form-item">
            <label class="layui-form-label">工作单位</label>
            <div class="layui-input-block">
                <input type="text" name="workunit"  placeholder="请输入工作单位" autocomplete="off" class="layui-input">
            </div>
        </div>
        <div class="layui-form-item">
            <label class="layui-form-label">座机</label>
            <div class="layui-input-block">
                <input type="text" name="landline"  placeholder="请输入座机" autocomplete="off" class="layui-input">
            </div>
        </div>
        <div class="layui-form-item">
            <label class="layui-form-label">移动电话</label>
            <div class="layui-input-block">
                <input type="text" name="mobile" lay-verify="required" lay-reqtext="请填写移动电话"  placeholder="请输入移动电话" autocomplete="off" class="layui-input">
            </div>
        </div>
        <div class="layui-form-item">
            <label class="layui-form-label">联系地址</label>
            <div class="layui-input-block">
                <input type="text" name="contactAddress" lay-verify="required" lay-reqtext="请填写联系地址"  placeholder="请输入联系地址" autocomplete="off" class="layui-input">
            </div>
        </div>
        <div class="layui-form-item">
            <label class="layui-form-label">邮编</label>
            <div class="layui-input-block">
                <input type="text" name="post"  placeholder="请输入邮编" autocomplete="off" class="layui-input">
            </div>
        </div>
        <div class="layui-form-item">
            <label class="layui-form-label">E-mail</label>
            <div class="layui-input-block">
                <input type="text" name="email"  placeholder="请输入E-mail" autocomplete="off" class="layui-input">
            </div>
        </div>
        <div class="layui-form-item">
            <div class="layui-input-block">
                <button type="button" class="layui-btn" lay-submit lay-filter="customeradd">提交</button>
            </div>
        </div>
    </form>
</body>
<script>
    layui.use(()=>{
        let form = layui.form;//获得表单
        // 校验通过
        form.on('submit(customeradd)', formData => {
            // 此处可执行 发送Ajax请求 操作

        });
    });
</script>
</html>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容