IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> 传智健康项目第二天 -> 正文阅读

[大数据]传智健康项目第二天

一、需求分析

传智健康管理系统是应用于健康管理机构的业务系统,实现健康管理机构工作内容可视化、患者管理专业化、健康评估数字化、健康干预流程化、知识库集成化,从而提高健康管理师的工作效率,加强与患者间的互动,增强管理者对健康管理机构运营情况的了解。
系统分为传智健康后台管理系统和移动端应用两部分。其中后台系统提供给健康管理机构内部人员(包括系统管理员、健康管理师等)使用,微信端应用提供给健康管理机构的用户(体检用户)使用。

二、基础环境搭建

2.1 导入预约管理模块数据表

根据项目的pdm文件在PowerDesigner中使用逆向工程导出为SQL脚本,这里直接给出对应的SQL脚本内容。

/*==============================================================*/
/* DBMS name:      MySQL 5.0                                    */
/* Created on:     2021/11/29 17:13:01                          */
/*==============================================================*/

drop table if exists t_checkgroup;

drop table if exists t_checkgroup_checkitem;

drop table if exists t_checkitem;

drop table if exists t_member;

drop table if exists t_menu;

drop table if exists t_order;

drop table if exists t_ordersetting;

drop table if exists t_permission;

drop table if exists t_role;

drop table if exists t_role_menu;

drop table if exists t_role_permission;

drop table if exists t_setmeal;

drop table if exists t_setmeal_checkgroup;

drop table if exists t_user;

drop table if exists t_user_role;

/*==============================================================*/
/* Table: t_checkgroup                                          */
/*==============================================================*/
create table t_checkgroup
(
   id                   int(11) not null auto_increment,
   code                 varchar(32) default NULL,
   name                 varchar(32) default NULL,
   helpCode             varchar(32) default NULL,
   sex                  char(1) default NULL,
   remark               varchar(128) default NULL,
   attention            varchar(128) default NULL,
   primary key (id)
);

alter table t_checkgroup comment '体检检查组';

/*==============================================================*/
/* Table: t_checkgroup_checkitem                                */
/*==============================================================*/
create table t_checkgroup_checkitem
(
   checkgroup_id        int(11) not null default 0,
   checkitem_id         int(11) not null default 0,
   primary key (checkgroup_id, checkitem_id)
);

/*==============================================================*/
/* Table: t_checkitem                                           */
/*==============================================================*/
create table t_checkitem
(
   id                   int(11) not null auto_increment,
   code                 varchar(16) default NULL,
   name                 varchar(32) default NULL,
   sex                  char(1) default NULL,
   age                  varchar(32) default NULL,
   price                float default NULL,
   type                 char(1) default NULL comment '查检项类型,分为检查和检验两种',
   attention            varchar(128) default NULL,
   remark               varchar(128) default NULL,
   primary key (id)
);

alter table t_checkitem comment '体检检查项';

/*==============================================================*/
/* Table: t_member                                              */
/*==============================================================*/
create table t_member
(
   id                   int(11) not null auto_increment,
   fileNumber           varchar(32) default NULL,
   name                 varchar(32) default NULL,
   sex                  varchar(8) default NULL,
   idCard               varchar(18) default NULL,
   phoneNumber          varchar(11) default NULL,
   regTime              date default NULL,
   password             varchar(32) default NULL,
   email                varchar(32) default NULL,
   birthday             date default NULL,
   remark               varchar(128) default NULL,
   primary key (id)
);

/*==============================================================*/
/* Table: t_menu                                                */
/*==============================================================*/
create table t_menu
(
   id                   int not null auto_increment,
   name                 varchar(128),
   linkUrl              varchar(128),
   path                 varchar(128),
   priority             int,
   description          varchar(128),
   parentMenuId         int,
   icon                 varchar(64),
   level                int,
   primary key (id)
);

/*==============================================================*/
/* Table: t_order                                               */
/*==============================================================*/
create table t_order
(
   id                   int(11) not null auto_increment,
   member_id            int(11) default NULL comment '员会id',
   orderDate            date default NULL comment '约预日期',
   orderType            varchar(8) default NULL comment '约预类型 电话预约/微信预约',
   orderStatus          varchar(8) default NULL comment '预约状态(是否到诊)',
   setmeal_id           int(11) default NULL comment '餐套id',
   primary key (id)
);

/*==============================================================*/
/* Table: t_ordersetting                                        */
/*==============================================================*/
create table t_ordersetting
(
   id                   int(11) not null auto_increment,
   orderDate            date default NULL comment '约预日期',
   number               int(11) default NULL comment '可预约人数',
   reservations         int(11) default NULL comment '已预约人数',
   primary key (id)
);

alter table t_ordersetting comment '预约设置';

/*==============================================================*/
/* Table: t_permission                                          */
/*==============================================================*/
create table t_permission
(
   id                   int not null auto_increment,
   name                 varchar(32),
   keyword              varchar(64),
   description          varchar(128),
   primary key (id)
);

/*==============================================================*/
/* Table: t_role                                                */
/*==============================================================*/
create table t_role
(
   id                   int not null auto_increment,
   name                 varchar(32),
   keyword              varchar(64),
   description          varchar(128),
   primary key (id)
);

/*==============================================================*/
/* Table: t_role_menu                                           */
/*==============================================================*/
create table t_role_menu
(
   role_id              int not null,
   menu_id              int not null,
   primary key (role_id, menu_id)
);

/*==============================================================*/
/* Table: t_role_permission                                     */
/*==============================================================*/
create table t_role_permission
(
   role_id              int not null,
   permission_id        int not null,
   primary key (role_id, permission_id)
);

/*==============================================================*/
/* Table: t_setmeal                                             */
/*==============================================================*/
create table t_setmeal
(
   id                   int(11) not null auto_increment,
   name                 varchar(128) default NULL,
   code                 varchar(8) default NULL,
   helpCode             varchar(16) default NULL,
   sex                  char(1) default NULL,
   age                  varchar(32) default NULL,
   price                float default NULL,
   remark               varchar(128) default NULL,
   attention            varchar(128) default NULL,
   img                  varchar(128) default NULL,
   primary key (id)
);

alter table t_setmeal comment '体检套餐';

/*==============================================================*/
/* Table: t_setmeal_checkgroup                                  */
/*==============================================================*/
create table t_setmeal_checkgroup
(
   setmeal_id           int(11) not null default 0,
   checkgroup_id        int(11) not null default 0,
   primary key (setmeal_id, checkgroup_id)
);

/*==============================================================*/
/* Table: t_user                                                */
/*==============================================================*/
create table t_user
(
   id                   int not null auto_increment,
   birthday             date,
   gender               varchar(1),
   username             varchar(32),
   password             varchar(36),
   remark               varchar(32),
   station              varchar(1),
   telephone            varchar(11),
   primary key (id)
);

/*==============================================================*/
/* Table: t_user_role                                           */
/*==============================================================*/
create table t_user_role
(
   user_id              int not null,
   role_id              int not null,
   primary key (user_id, role_id)
);

alter table t_checkgroup_checkitem add constraint FK_Reference_5 foreign key (checkitem_id)
      references t_checkitem (id) on delete restrict on update restrict;

alter table t_checkgroup_checkitem add constraint group_id foreign key (checkgroup_id)
      references t_checkgroup (id);

alter table t_menu add constraint FK_Reference_13 foreign key (parentMenuId)
      references t_menu (id) on delete restrict on update restrict;

alter table t_order add constraint FK_Reference_6 foreign key (setmeal_id)
      references t_setmeal (id) on delete restrict on update restrict;

alter table t_order add constraint key_member_id foreign key (member_id)
      references t_member (id);

alter table t_role_menu add constraint FK_Reference_10 foreign key (menu_id)
      references t_menu (id) on delete restrict on update restrict;

alter table t_role_menu add constraint FK_Reference_9 foreign key (role_id)
      references t_role (id) on delete restrict on update restrict;

alter table t_role_permission add constraint FK_Reference_11 foreign key (role_id)
      references t_role (id) on delete restrict on update restrict;

alter table t_role_permission add constraint FK_Reference_12 foreign key (permission_id)
      references t_permission (id) on delete restrict on update restrict;

alter table t_setmeal_checkgroup add constraint checkgroup_key foreign key (checkgroup_id)
      references t_checkgroup (id);

alter table t_setmeal_checkgroup add constraint setmeal_key foreign key (setmeal_id)
      references t_setmeal (id);

alter table t_user_role add constraint FK_Reference_7 foreign key (user_id)
      references t_user (id) on delete restrict on update restrict;

alter table t_user_role add constraint FK_Reference_8 foreign key (role_id)
      references t_role (id) on delete restrict on update restrict;

2.2 导入预约管理模块的实体类

将POJO实体类复制到health_common工程中

2.3 导入项目所需的公共资源

项目开发过程中会提供公共资源,供多个模块或者系统来使用。
今天导入的公共资源有:
(1) 返回消息常量类MessageConstant,放到health_common工程中。该消息常量类的功能是,将后台操作的结果信息返回给前台,用于告诉用户操作的结果。

package com.itheima.constant;
/**
 * 消息常量
 */
public class MessageConstant {
    public static final String DELETE_CHECKITEM_FAIL = "删除检查项失败";
    public static final String DELETE_CHECKITEM_SUCCESS = "删除检查项成功";
    public static final String ADD_CHECKITEM_SUCCESS = "新增检查项成功";
    public static final String ADD_CHECKITEM_FAIL = "新增检查项失败";
    public static final String EDIT_CHECKITEM_FAIL = "编辑检查项失败";
    public static final String EDIT_CHECKITEM_SUCCESS = "编辑检查项成功";
    public static final String QUERY_CHECKITEM_SUCCESS = "查询检查项成功";
    public static final String QUERY_CHECKITEM_FAIL = "查询检查项失败";
    public static final String UPLOAD_SUCCESS = "上传成功";
    public static final String ADD_CHECKGROUP_FAIL = "新增检查组失败";
    public static final String ADD_CHECKGROUP_SUCCESS = "新增检查组成功";
    public static final String DELETE_CHECKGROUP_FAIL = "删除检查组失败";
    public static final String DELETE_CHECKGROUP_SUCCESS = "删除检查组成功";
    public static final String QUERY_CHECKGROUP_SUCCESS = "查询检查组成功";
    public static final String QUERY_CHECKGROUP_FAIL = "查询检查组失败";
    public static final String EDIT_CHECKGROUP_FAIL = "编辑检查组失败";
    public static final String EDIT_CHECKGROUP_SUCCESS = "编辑检查组成功";
    public static final String PIC_UPLOAD_SUCCESS = "图片上传成功";
    public static final String PIC_UPLOAD_FAIL = "图片上传失败";
    public static final String ADD_SETMEAL_FAIL = "新增套餐失败";
    public static final String ADD_SETMEAL_SUCCESS = "新增套餐成功";
    public static final String IMPORT_ORDERSETTING_FAIL = "批量导入预约设置数据失败";
    public static final String IMPORT_ORDERSETTING_SUCCESS = "批量导入预约设置数据成功";
    public static final String GET_ORDERSETTING_SUCCESS = "获取预约设置数据成功";
    public static final String GET_ORDERSETTING_FAIL = "获取预约设置数据失败";
    public static final String ORDERSETTING_SUCCESS = "预约设置成功";
    public static final String ORDERSETTING_FAIL = "预约设置失败";
    public static final String ADD_MEMBER_FAIL = "新增会员失败";
    public static final String ADD_MEMBER_SUCCESS = "新增会员成功";
    public static final String DELETE_MEMBER_FAIL = "删除会员失败";
    public static final String DELETE_MEMBER_SUCCESS = "删除会员成功";
    public static final String EDIT_MEMBER_FAIL = "编辑会员失败";
    public static final String EDIT_MEMBER_SUCCESS = "编辑会员成功";
    public static final String TELEPHONE_VALIDATECODE_NOTNULL = "手机号和验证码都不能为空";
    public static final String LOGIN_SUCCESS = "登录成功";
    public static final String VALIDATECODE_ERROR = "验证码输入错误";
    public static final String QUERY_ORDER_SUCCESS = "查询预约信息成功";
    public static final String QUERY_ORDER_FAIL = "查询预约信息失败";
    public static final String QUERY_SETMEALLIST_SUCCESS = "查询套餐列表数据成功";
    public static final String QUERY_SETMEALLIST_FAIL = "查询套餐列表数据失败";
    public static final String QUERY_SETMEAL_SUCCESS = "查询套餐数据成功";
    public static final String QUERY_SETMEAL_FAIL = "查询套餐数据失败";
    public static final String SEND_VALIDATECODE_FAIL = "验证码发送失败";
    public static final String SEND_VALIDATECODE_SUCCESS = "验证码发送成功";
    public static final String SELECTED_DATE_CANNOT_ORDER = "所选日期不能进行体检预约";
    public static final String ORDER_FULL = "预约已满";
    public static final String HAS_ORDERED = "已经完成预约,不能重复预约";
    public static final String ORDER_SUCCESS = "预约成功";
    public static final String GET_USERNAME_SUCCESS = "获取当前登录用户名称成功";
    public static final String GET_USERNAME_FAIL = "获取当前登录用户名称失败";
    public static final String GET_MENU_SUCCESS = "获取当前登录用户菜单成功";
    public static final String GET_MENU_FAIL = "获取当前登录用户菜单失败";
    public static final String GET_MEMBER_NUMBER_REPORT_SUCCESS = "获取会员统计数据成功";
    public static final String GET_MEMBER_NUMBER_REPORT_FAIL = "获取会员统计数据失败";
    public static final String GET_SETMEAL_COUNT_REPORT_SUCCESS = "获取套餐统计数据成功";
    public static final String GET_SETMEAL_COUNT_REPORT_FAIL = "获取套餐统计数据失败";
    public static final String GET_BUSINESS_REPORT_SUCCESS = "获取运营统计数据成功";
    public static final String GET_BUSINESS_REPORT_FAIL = "获取运营统计数据失败";
    public static final String GET_SETMEAL_LIST_SUCCESS = "查询套餐列表数据成功";
    public static final String GET_SETMEAL_LIST_FAIL = "查询套餐列表数据失败";
}

(2) 返回结果Result和PageResult类,放到health_common工程中
Result:

package com.itheima.entity;
import java.io.Serializable;
/**
 * 封装返回结果
 */
public class Result implements Serializable{
    private boolean flag;//执行结果,true为执行成功 false为执行失败
    private String message;//返回结果信息
    private Object data;//返回数据
    public Result(boolean flag, String message) {
        super();
        this.flag = flag;
        this.message = message;
    }

    public Result(boolean flag, String message, Object data) {
        this.flag = flag;
        this.message = message;
        this.data = data;
    }

    public boolean isFlag() {
        return flag;
    }
    public void setFlag(boolean flag) {
        this.flag = flag;
    }
    public String getMessage() {
        return message;
    }
    public void setMessage(String message) {
        this.message = message;
    }

    public Object getData() {
        return data;
    }

    public void setData(Object data) {
        this.data = data;
    }
}

PageResult:

package com.itheima.entity;
import java.io.Serializable;
import java.util.List;
/**
 * 分页结果封装对象
 */
public class PageResult implements Serializable{
    private Long total;//总记录数
    private List rows;//当前页结果
    public PageResult(Long total, List rows) {
        super();
        this.total = total;
        this.rows = rows;
    }
    public Long getTotal() {
        return total;
    }
    public void setTotal(Long total) {
        this.total = total;
    }
    public List getRows() {
        return rows;
    }
    public void setRows(List rows) {
        this.rows = rows;
    }
}

(3) 封装查询条件的QueryPageBean类,放到health_common工程中

package com.itheima.entity;
import java.io.Serializable;
/**
 * 封装查询条件
 */
public class QueryPageBean implements Serializable{
    private Integer currentPage;//页码
    private Integer pageSize;//每页记录数
    private String queryString;//查询条件

    public Integer getCurrentPage() {
        return currentPage;
    }

    public void setCurrentPage(Integer currentPage) {
        this.currentPage = currentPage;
    }

    public Integer getPageSize() {
        return pageSize;
    }

    public void setPageSize(Integer pageSize) {
        this.pageSize = pageSize;
    }

    public String getQueryString() {
        return queryString;
    }

    public void setQueryString(String queryString) {
        this.queryString = queryString;
    }
}

(4) html、js、css、图片等静态资源,放到health_backend工程中,随着后续的开发,还会陆续导入其它的一些公共资源。

三、新增检查项

3.1 完善页面

检查项管理页面对应的是checkitem.html页面,只需在静态页面的基础上,完善前后台交互的前端代码即可。

3.1.1 弹出新增窗口

页面中已经提供了新增窗口,只是处于隐藏状态。只需要将控制展示状态的属性dialogFormVisible改为
true就可以显示出新增窗口。
新建按钮绑定的方法为handleCreate,所以在handleCreate方法中修改dialogFormVisible属性的值为
true即可。同时为了增加用户体验度,需要每次点击新建按钮时清空表单输入项。

// 弹出添加窗口
handleCreate() {
	this.dialogFormVisible = true;
	this.resetForm();
}
// 重置表单
resetForm() {
	this.formData = {}; // 重置表单数据
	if (this.$refs['dataAddForm'] != undefined) {
    	this.$refs['dataAddForm'].resetFields();    // 重置新建表单检验结果显示
	}
	if (this.$refs['dataEditForm'] != undefined) {
    	this.$refs['dataEditForm'].resetFields();    // 重置编辑表单检验结果显示
	}
},

3.1.2 输入校验

rules: {//校验规则
	code: [{ required: true, message: '项目编码为必填项', trigger: 'blur' }],
	name: [{ required: true, message: '项目名称为必填项', trigger: 'blur' }]
}

3.1.3 提交表单数据

点击新增窗口中的确定按钮时,触发handleAdd方法,所以需要在handleAdd方法中进行完善。

//添加
handleAdd () {
	// 进行表单校验
	this.$refs['dataAddForm'].validate((valid) => {
		// valid返回整体校验的结果
         if (valid) {
             // 表单校验通过,发送ajax请求,将录入的数据提交到后台进行处理
             axios.post('/checkitem/add.do', this.formData).then(res => {
                 if (res.data.flag) { // 执行成功
                     // 新增成功后,重新调用分页查询方法,查询出最新的数据
                     this.findPage();
                     // 弹出提示信息
                     this.$message({
                         message: res.data.message,
                         type: 'success'
                     });
                     // 关闭新增窗口
                     this.dialogFormVisible = false;
                 } else { // 执行失败
                     // 弹出提示
                     this.$message.error(res.data.message);
                 }
             });
         } else {
             // 表单校验未通过
             this.$message.error("数据校验失败,请检查你的输入信息是否正确!");
             return false;
         }
     });
 }

3.2 后台代码

3.2.1 Controller

在health_backend工程中创建CheckItemController

package com.itheima.controller;

import com.alibaba.dubbo.config.annotation.Reference;
import com.itheima.constant.MessageConstant;
import com.itheima.entity.PageResult;
import com.itheima.entity.QueryPageBean;
import com.itheima.entity.Result;
import com.itheima.pojo.CheckItem;
import com.itheima.service.CheckItemService;
import org.springframework.web.bind.annotation.*;
/**
 * 检查项管理
 */
@RestController // 包含Controller的功能,且返回值都是ResponseBody类型的
@RequestMapping("/checkitem")
public class CheckItemController {

    @Reference  // 查找服务
    private CheckItemService checkItemService;

    /**
     * 新增检查项
     * @param checkItem 前端发送的新增检查项表单数据
     * @return 返回Result对象,这里Resutl对象只封装了执行结果的boolean和消息提示
     */
    @PostMapping("/add") // 这里不需要加.do的原因?
    public Result add(@RequestBody CheckItem checkItem) { // @RequestBody注解,封装前端返回的JSON格式的对象
        // 企业开发这里都用try...catch进行异常的捕获
        try {
            checkItemService.add(checkItem);
        } catch (Exception e) {
            e.printStackTrace();
            // 服务调用失败
            return new Result(false, MessageConstant.ADD_CHECKITEM_FAIL);
        }
        return new Result(true, MessageConstant.ADD_CHECKITEM_SUCCESS);
   
    }
}

3.2.2 服务接口

在health_interface工程中创建CheckItemService接口

package com.itheima.service;

import com.itheima.entity.PageResult;
import com.itheima.entity.QueryPageBean;
import com.itheima.entity.Result;
import com.itheima.pojo.CheckItem;
import java.util.List;
/**
 * 检查项服务接口
 */
public interface CheckItemService {
    /**
     * 新增检查项
     * @param checkItem
     * @throws Exception
     */
    public void add(CheckItem checkItem) throws Exception;
}

3.2.3 服务实习类

在health_service_provider工程中创建CheckItemServiceImpl实习类

package com.itheima.service.impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.itheima.dao.CheckItemDao;
import com.itheima.entity.PageResult;
import com.itheima.entity.QueryPageBean;
import com.itheima.pojo.CheckItem;
import com.itheima.service.CheckItemService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
/**
 * 检查项服务
 */
@Service(interfaceClass = CheckItemService.class) // 指定接口类型
@Transactional
public class CheckItemServiceImpl implements CheckItemService {
    // 注入dao对象
    @Autowired
    private CheckItemDao checkItemDao;

    /**
     * 新增检查项
     * @param checkItem
     * @throws Exception
     */
    @Override
    public void add(CheckItem checkItem) throws Exception {
        checkItemDao.add(checkItem);
    }
}

3.2.4 Dao接口

在health_service_provider工程中创建CheckItemDao接口,本项目是基于Mybatis的Mapper代理技术实现持久层操作,故只需提供接口和Mapper映射文件,无需提供实习类

package com.itheima.dao;

import com.github.pagehelper.Page;
import com.itheima.pojo.CheckItem;
/**
 * 使用MyBatis动态代理来实现数据库操作,无需提供实现类,但是需要提供一个映射文件
 */
public interface CheckItemDao {
    /**
     * 增加检查项
     * @param checkItem 检查项
     * @throws Exception
     */
    public void add(CheckItem checkItem) throws Exception;

3.2.5 Mapper映射文件

在health_service_provider工程中创建CheckItemDao.xml映射文件,需要和CheckItemDao接口在同一目录下

<?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.itheima.dao.CheckItemDao">

    <!-- 新增 -->
    <!-- id是对应接口的方法名,paramterType是对应接口的参数类型 -->
    <insert id="add" parameterType="com.itheima.pojo.CheckItem">
        insert into t_checkitem(code, name, sex, age, price, type, attention, remark)
        values(#{code}, #{name}, #{sex}, #{age}, #{price}, #{type}, #{attention}, #{remark})
    </insert>
</mapper>

四、检查项分页

本项目所有分页功能都是基于ajax的异步请求来完成的,请求参数和后台响应数据都使用json数据格式。
请求参数包括页码、每页显示的记录数、查询条件。
请求参数的json格式为:{currentPage:1, pageSize:10, queryString:’’}
后台响应数据包括总记录数,当前页需要展示的数据集合。
响应数据的json格式为:{total:1000, rows:[]}
如下图:其中ajax请求携带请求参数的json格式,响应携带响应数据的json格式

4.1 完善页面

4.1.1 定义分页相关模型数据

pagination: {//分页相关模型数据
	  currentPage: 1,//当前页码
	  pageSize:10,//每页显示的记录数
	  total:0,//总记录数
	  queryString:null//查询条件
},
dataList: [],//当前页要展示的分页列表数据

4.1.2 定义分页方法

在页面中提供了findPage方法用于分页查询,为了能够在checkitem.html页面加载后直接可以展示分页数据,可以在VUE提供的钩子函数created中调用findPage方法。

//钩子函数,VUE对象初始化完成后自动执行
created() {
    this.findPage();
}
//分页查询
findPage() {
    // 发送ajax请求,提交分页相关请求参数(页码、每页显示的记录数、查询条件)
    var param = {
        currentPage: this.pagination.currentPage, // 页码
        pageSize: this.pagination.pageSize, // 每页显示的记录数
        queryString: this.pagination.queryString // 查询条件
    };
    // 请求后台
    axios.post('/checkitem/findPage.do', param).then((res) => {
        // 解析Controller响应回的数据,为模型数据赋值
        this.pagination.total = res.data.total; //总记录数
        this.dataList = res.data.rows; //当前页要展示的分页列表数据
    });
},

4.1.3 完善分页方法执行时机

除了在created钩子函数中调用findPage方法查询分页数据之外,当用户点击查询按钮或者点击分页条中的页码时也需要调用findPage方法重新发起查询请求。
为查询按钮绑定单击事件,调用findPage方法

<el-button @click="findPage()" class="dalfBut">查询</el-button>

为分页条组件绑定current-change事件,此事件是分页条组件自己定义的事件,当页码改变时触发,对
应的处理函数为handleCurrentChange

<el-pagination
	class="pagiantion"
	@current-change="handleCurrentChange"
	:current-page="pagination.currentPage"
	:page-size="pagination.pageSize"
	layout="total, prev, pager, next, jumper"
	:total="pagination.total">
</el-pagination>

定义handleCurrentChange方法

//切换页码
handleCurrentChange(currentPage) {
     // 设置最新的页码
     this.pagination.currentPage = currentPage;
     // 重新调用findPage方法进行分页查询
     this.findPage();
 }

4.2 后台代码

4.2.1 Controller

在CheckItemController中增加分页查询方法

/**
* 检查项分页查询
* @param queryPageBean 封装前端发送的分页查询相关数据的对象
* @return
*/
@PostMapping("/findPage")
public PageResult findPage(@RequestBody QueryPageBean queryPageBean) {
   PageResult pageResult = null;
   try {
       pageResult = checkItemService.findPage(queryPageBean);
   } catch (Exception e) {
       e.printStackTrace();
       return new PageResult(null, null);
   }
   return pageResult;
}

4.2.2 服务接口

在CheckItemService服务接口中扩展分页方法

public PageResult pageQuery(Integer currentPage, Integer pageSize, String queryString);

4.2.3 服务实习类

在CheckItemServiceImpl服务实现类中实现分页查询方法,基于Mybatis分页助手插件实现分页

/**
* 检查项分页查询
* @param queryPageBean
* @return
* @throws Exception
*/
@Override
public PageResult findPage(QueryPageBean queryPageBean) throws Exception {
   Integer currentPage = queryPageBean.getCurrentPage();
   Integer pageSize = queryPageBean.getPageSize();
   String queryString = queryPageBean.getQueryString(); // 查询条件
   // 完成分页查询,基于mybatis框架提供的分页助手插件完成、
   if (queryString == null || "".equals(queryString)) {
       PageHelper.startPage(currentPage, pageSize); // 底层是线程绑定?拦截器 + 字符串拼接
   } else {
       PageHelper.startPage(1, pageSize);
   }
   // select * from t_checkitem limit 0, 10
   Page<CheckItem> page = checkItemDao.selectByCondition(queryString); // Page对象继承自ArrayList
   Long total = page.getTotal();
   List<CheckItem> rows = page.getResult();
   return new PageResult(total, rows);
}

4.2.4 Dao接口

在CheckItemDao接口中扩展分页查询方法

public Page<CheckItem> selectByCondition(String queryString);

4.2.5 Mapper映射文件

在CheckItemDao.xml文件中增加SQL定义

<!-- 查询 -->
<select id="selectByCondition" parameterType="String" resultType="com.itheima.pojo.CheckItem">
    select * from t_checkitem
    <if test="value != null and value.length > 0"> <!-- 这里必须为value -->
        where code = #{value} or name = #{value}
    </if>
</select>

五、删除检查项

5.1 完善页面

为了防止用户误操作,点击删除按钮时需弹出确认删除的提示,用户点击取消则不做任何操作,用户点击确定按钮再提交删除请求。

5.1.1 绑定单击事件

需要为删除按钮绑定单击事件,并且将当前行数据作为参数传递给处理函数

<el-button size="mini" type="danger" @click="handleDelete(scope.row)">删除</el-button>
// 删除
handleDelete(row) {
}

5.1.2 弹出确认操作提示

用户点击删除按钮会执行handleDelete方法,此处需要完善handleDelete方法,弹出确认提示信息。
ElementUI提供了$confirm方法来实现确认提示消息弹框效果

// 防止误操作的弹框
this.$confirm("您确定要删除这条数据吗?", "提示", {
    // 默认给出确定和取消按钮
    type: 'warning'
})

5.1.3 发送请求

如果用户点击确定按钮就需要发送ajax请求,并且将当前检查项的id作为参数提交到后台进行删除操作

// 删除
handleDelete(row) {
    // 防止误操作的弹框
    this.$confirm("您确定要删除这条数据吗?", "提示", {
        // 默认给出确定和取消按钮
        type: 'warning'
    }).then(() => {
        // 确定,发送ajax请求
        axios.get('/checkitem/deleteById.do?id=' + row.id).then((res) => {
            if (res.data.flag) { // 执行成功
                // 弹出成功提示信息
                this.$message({
                    message: res.data.message,
                    type: 'success'
                });
                // 重新进行分页查询
                this.findPage();
            } else { // 执行失败
                this.$message.error(res.data.message);
            }
        });
    }).catch(() => {
        this.$message({
            message: '操作已取消',
            type: 'info'
        });
    });
}

5.2 后台代码

5.2.1 Controller

在CheckItemController中增加删除方法

/**
* 根据id删除数据
* @param id
* @return
*/
@GetMapping("/deleteById")
public Result deleteById(Integer id) {
   try {
       checkItemService.deleteById(id);
   } catch (Exception e) {
       e.printStackTrace();
    return new Result(false, MessageConstant.DELETE_CHECKITEM_FAIL);
   }
   return new Result(true, MessageConstant.DELETE_CHECKITEM_SUCCESS);
}

在CheckItemService服务接口中扩展删除方法

/**
* 根据id删除检查项
* @param id
* @throws Exception
*/
public void deleteById(Integer id) throws Exception;

5.2.3 服务实现类

注意:不能直接删除,需要判断当前检查项是否和检查组关联,如果已经和检查组进行了关联则不允许删除

/**
* 根据id删除检查项
* @param id
* @throws Exception
*/
@Override
public void deleteById(Integer id) throws Exception {
   // 判断当前检查项是否已经关联到检查组
   Long count = checkItemDao.findCountByCheckItemId(id);
   if (count > 0) {
       // 当前检查项已经关联检查组,不能删除
       new RuntimeException();
   }
   checkItemDao.deleteById(id);
}

5.2.4 Dao接口

在CheckItemDao接口中扩展方法findCountByCheckItem和deleteById

/**
* 查询检查项关联检查组的次数
* @param id
* @throws Exception
*/
public Long findCountByCheckItemId(Integer id) throws Exception;

/**
* 根据id删除检查项
* @param id
* @throws Exception
*/
public void deleteById(Integer id) throws Exception;

5.2.5 Mapper映射文件

在CheckItemDao.xml中扩展SQL语句

<!-- 查询检查项关联检查组的次数 -->
<select id="findCountByCheckItemId" parameterType="Integer" resultType="Long">
    select count(*) from t_checkgroup_checkitem where checkItem_id = #{checkItem_id}
</select>

<!-- 通过id删除检查项 -->
<delete id="deleteById" parameterType="Integer">
    delete from t_checkitem where id = #{id}
</delete>

六、编辑检查项

6.1 完善页面

用户点击编辑按钮时,需要弹出编辑窗口并且将当前记录的数据进行回显,用户修改完成后点击确定按钮将修改后的数据提交到后台进行数据库操作。

6.1.1 绑定单击事件

需要为编辑按钮绑定单击事件,并且将当前行数据作为参数传递给处理函数

handleUpdate(row) {
}

6.1.2 弹出编辑窗口回显数据

当前页面中的编辑窗口已经提供好了,默认处于隐藏状态。在handleUpdate方法中需要将编辑窗口展
示出来,并且需要发送ajax请求查询当前检查项数据用于回显

// 弹出编辑窗口
handleUpdate(row) {
    this.resetForm();
    // 回显数据,发送ajax请求根据id查询当前检查项数据
    axios.get('/checkitem/findById.do?id=' + row.id).then((res) => {
        if (res.data.flag) { // 执行成功
            // 进行数据回显,基于VUE的数据绑定实现
            this.formData = res.data.data;
            // 弹出编辑窗口
            this.dialogFormVisible4Edit = true;
        } else {
            // 查询失败,弹出提示
            this.$message.error(res.data.message);
        }
    });
}

6.1.3 发送请求

在编辑窗口中修改完成后,点击确定按钮需要提交请求,所以需要为确定按钮绑定事件并提供处理函数
handleEdit

<el-button type="primary" @click="handleEdit()">确定</el-button>
//编辑
handleEdit() {
    // 进行表单校验
    this.$refs['dataEditForm'].validate((valid) => {
        if (valid) { // 表单校验通过,可以提交数据
            // 发送ajax请求,修改数据
            axios.post('/checkitem/update.do', this.formData).then((res) => {
                if (res.data.flag) { // 执行成功
                    this.dialogFormVisible4Edit = false;
                    this.$message({
                        message: res.data.message,
                        type: 'success'
                    });
                } else { // 执行失败
                    this.$message.error(res.data.message);
                }
            }).finally(() => {
                // 不管成功还是失败,都调用分页查询方法
                this.findPage();
            });
        } else { // 表单校验不通过
            this.$message.error("数据校验失败!");
            return false;
        }
    });
},

6.2 后台代码

6.2.1 Controller

在CheckItemController中增加编辑方法

/**
* 根据id查询检查项信息
* @param id
* @return
* @throws Exception
*/
@Override
public CheckItem findByid(Integer id) throws Exception {
   return checkItemDao.findById(id);
}
/**
* 编辑修改检查项
* @param checkItem
* @return
*/
@PostMapping("/update")
public Result update(@RequestBody CheckItem checkItem) {
   try {
       checkItemService.update(checkItem);
   } catch (Exception e) {
       e.printStackTrace();
       return new Result(false, MessageConstant.EDIT_CHECKITEM_FAIL);
   }
   return new Result(true, MessageConstant.EDIT_CHECKITEM_SUCCESS);
}

6.2.2 服务接口

在CheckItemService服务接口中扩展编辑方法

/**
* 根据id查询检查项数据
* @param id
* @return
* @throws Exception
*/
public CheckItem findByid(Integer id) throws Exception;
/**
* 更新检查项
* @param checkItem
*/
public void update(CheckItem checkItem) throws Exception;

6.2.3 服务实现类

在CheckItemServiceImpl实现类中实现编辑方法

/**
* 根据id查询检查项信息
* @param id
* @return
* @throws Exception
*/
@Override
public CheckItem findByid(Integer id) throws Exception {
   return checkItemDao.findById(id);
}
/**
* 更新检查项
* @param checkItem
* @throws Exception
*/
@Override
public void update(CheckItem checkItem) throws Exception {
   checkItemDao.update(checkItem);
}

6.2.4 Dao接口

在CheckItemDao接口中扩展edit方法

/**
* 根据id查询检查项信息
* @param id
* @return
*/
public CheckItem findById(Integer id);
/**
* 更新检查项
* @param checkItem
*/
public void update(CheckItem checkItem);

6.2.5 Mapper映射文件

在CheckItemDao.xml中扩展SQL语句

<!-- 根据id查找检查项 -->
<select id="findById" parameterType="Integer" resultType="com.itheima.pojo.CheckItem">
    select * from t_checkitem where id = #{id}
</select>

<!-- 修改表单项数据 -->
<update id="update" parameterType="com.itheima.pojo.CheckItem">
    update t_checkitem
    <set>
        <if test="code != null">
            code = #{code},
        </if>
        <if test="name != null">
            name = #{name},
        </if>
        <if test="sex != null">
            sex = #{sex},
        </if>
        <if test="age != null">
            age = #{age},
        </if>
        <if test="price != null">
            price = #{price},
        </if>
        <if test="type != null">
            type = #{type},
        </if>
        <if test="attention != null">
            attention = #{attention},
        </if>
        <if test="remark != null">
            remark = #{remark}
        </if>
    </set>
    where id = #{id}
</update>
  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-12-05 12:06:24  更:2021-12-05 12:08:28 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 10:30:26-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码