返回

SSM框架+VUE+Mysql实现的疫苗预约接种管理系统(功能包含分角色,登录/注册、疫苗管理、接种点管理、用户管理、疫苗类型管理、我的预约、预约接种管理、关于等)

发布时间:2022-11-02 07:25:17 364
# java# ios# 技术# 信息# 工具

(博客目录)

SSM框架+VUE+Mysql实现的疫苗预约接种管理系统

本系统为了解决疫苗线下预约场景复杂,预约难等一系列问题,开发了疫苗接种管理平台,很好的提供了疫苗的管理和接种整个流程,使得接种疫苗变得高效。

实现功能截图

用户注册 请添加图片描述 登录 请添加图片描述 我的预约 请添加图片描述 疫苗管理 请添加图片描述 添加疫苗 请添加图片描述 疫苗类型管理 请添加图片描述 添加疫苗类型 请添加图片描述 接种点管理 请添加图片描述 添加接种点 请添加图片描述 预约接种管理 请添加图片描述 用户管理 请添加图片描述

系统功能

本系统实现了以下功能: 1、注册登录 2、疫苗预约 3、我的预约 4、疫苗管理 5、添加疫苗 6、疫苗类型管理 7、添加疫苗类型 8、预约接种管理 9、接种点管理 10、用户管理 等

使用技术

数据库:mysql 开发工具:Idea(Myeclispe、Eclipse也可以) 知识点:SSM框架+VUE

项目结构 请添加图片描述

代码

java端 实体类 Inject.java

package com.code2life.pojo;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;

import java.sql.Date;

/**
 * 接种预约类--对应t_inject表
 */
@TableName(value = "t_inject",resultMap = "injectMap")
public class Inject {
    @TableId // 注解主键
    private Integer id; // id INT PRIMARY KEY auto_increment, 编号
    private Integer userId; // user_id INT, 用户id
    private Integer inoSiteId; // ino_site_id INT, 接种点id
    private Date date; // date DATE, 接种日期
    private String times; // times VARCHAR(20), 接种时间: “上午”或“下午”
    @TableField(exist = false)
    private String userName;
    @TableField(exist = false)
    private String inoSiteName;
    @TableField(exist = false)
    private User userBean; // 一对一关联对象
    private InoSite inoSiteBean;

    @Override
    public String toString() {
        return "Inject{" +
                "id=" + id +
                ", userId=" + userId +
                ", inoSiteId=" + inoSiteId +
                ", date=" + date +
                ", times='" + times + '\'' +
                ", userName='" + userName + '\'' +
                ", inoSiteName='" + inoSiteName + '\'' +
                ", userBean=" + userBean +
                ", inoSiteBean=" + inoSiteBean +
                '}';
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public Integer getUserId() {
        return userId;
    }

    public void setUserId(Integer userId) {
        this.userId = userId;
    }

    public Integer getInoSiteId() {
        return inoSiteId;
    }

    public void setInoSiteId(Integer inoSiteId) {
        this.inoSiteId = inoSiteId;
    }

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }

    public String getTimes() {
        return times;
    }

    public void setTimes(String times) {
        this.times = times;
    }

    public User getUserBean() {
        return userBean;
    }

    public void setUserBean(User userBean) {
        this.userBean = userBean;
    }

    public InoSite getInoSiteBean() {
        return inoSiteBean;
    }

    public void setInoSiteBean(InoSite inoSiteBean) {
        this.inoSiteBean = inoSiteBean;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getInoSiteName() {
        return inoSiteName;
    }

    public void setInoSiteName(String inoSiteName) {
        this.inoSiteName = inoSiteName;
    }
}

Vaccine.java

package com.code2life.pojo;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;

/**
 * 疫苗类--对应t_vaccine表
 */
@TableName(value = "t_vaccine",resultMap = "vaccineMap")
public class Vaccine {
    @TableId
    private Integer id; // id INT PRIMARY KEY auto_increment, 编号
    private String name; //name VARCHAR(64), 名称
    private String company; // company VARCHAR(64), 生产厂商
    private Integer vacTypeId; // vac_type_id INT 疫苗类型编号(一对一级联所用字段)
    @TableField(exist = false)
    private VacType vacTypeBean; // 一对一关联对象
    @Override
    public String toString() {
        return "Vaccine{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", company='" + company + '\'' +
                ", vacTypeId=" + vacTypeId +
                ", vacTypeBean=" + vacTypeBean +
                '}';
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getCompany() {
        return company;
    }

    public void setCompany(String company) {
        this.company = company;
    }

    public Integer getVacTypeId() {
        return vacTypeId;
    }

    public void setVacTypeId(Integer vacTypeId) {
        this.vacTypeId = vacTypeId;
    }

    public VacType getVacTypeBean() {
        return vacTypeBean;
    }

    public void setVacTypeBean(VacType vacTypeBean) {
        this.vacTypeBean = vacTypeBean;
    }
}

Dao层 InjectMapper.java

package com.code2life.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.*;
import com.code2life.pojo.Inject;
import org.springframework.stereotype.Repository;

@Repository
public interface InjectMapper extends BaseMapper {
    // 生成接种预约
    int createOrder(@Param("userId") int userId, @Param("inoSiteId") int inoSiteId,
                    @Param("times") String times);
}

VaccineMapper.java

package com.code2life.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.code2life.pojo.Vaccine;
import org.springframework.stereotype.Repository;

@Repository
public interface VaccineMapper extends BaseMapper {
}

service层 InjectServiceImpl.java

package com.code2life.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.code2life.mapper.InjectMapper;
import com.code2life.pojo.Inject;
import com.code2life.service.InjectService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;

@Transactional
@Service
public class InjectServiceImpl extends ServiceImpl
        implements InjectService {
    @Resource
    private InjectMapper injectMapper;

    @Override
    public boolean createOrder(int userId, int inoSiteId, String times) {
        return injectMapper.createOrder(userId,inoSiteId,times)>0;
    }
}

VaccineServiceImpl.java

package com.code2life.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.code2life.pojo.Vaccine;
import com.code2life.mapper.VaccineMapper;
import com.code2life.service.VaccineService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.List;

@Transactional
@Service
public class VaccineServiceImpl extends ServiceImpl
        implements VaccineService {
    @Resource
    private VaccineMapper vaccineMapper;

    @Override
    public Vaccine findById(int id) {
        return vaccineMapper.selectById(id);
    }
    // 列表数据
    @Override
    public List list() {
        QueryWrapper query = new QueryWrapper<>();
        return vaccineMapper.selectList(query);
    }
    // 添加
    @Override
    public boolean save(Vaccine vaccine) {
        return vaccineMapper.insert(vaccine)>0;
    }
    // 更新
    @Override
    public boolean update(Vaccine vaccine) {
        return vaccineMapper.updateById(vaccine)>0;
    }
    // 删除
    @Override
    public boolean delete(int id) {
        return vaccineMapper.deleteById(id)>0;
    }
    // 疫苗分类查询列表
    @Override
    public Page vacTypeList(int pageNo, int size, int vacTypeId) {
        System.out.println("疫苗分类查询列表");
        Page page=new Page<>(pageNo,size);
        QueryWrapper query= new QueryWrapper<>();
        query.eq("vac_type_id",vacTypeId);
        return vaccineMapper.selectPage(page,query);
    }
}

controller层 InjectController.java

package com.code2life.controller;

import com.alibaba.fastjson.JSONObject;
import com.code2life.pojo.Inject;
import com.code2life.until.ResponseBean;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import com.code2life.service.InjectService;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.List;

@Api(tags = "预约接种管理")
@RestController
@RequestMapping("/order")
public class InjectController {
    @Resource
    private InjectService injectService;

    @ApiOperation("预约")
    @PostMapping
    public ResponseBean createOrder(@RequestBody JSONObject json) {
        System.out.println("create order: "+json);
        int userId = json.getObject("userId",Integer.class);
        int inoSiteId = json.getObject("inoSiteId",Integer.class);
        String times = json.getObject("times",String.class);
        System.out.println(userId+", "+inoSiteId+", "+times);
        boolean result = injectService.createOrder(userId,inoSiteId,times);
        if (result) {
            return ResponseBean.success(true);
        } else {
            return ResponseBean.failure(false);
        }
    }

//    @ApiOperation("预约分页列表")
//    @GetMapping
//    public ResponseBean orderList(@RequestParam int pageNo,@RequestParam int size,@RequestParam int userId){
//        // 新建分页对象
//        Page page = new Page<>(pageNo,size);
//        return ResponseBean.success(injectService.list(page,userId));
//    }

    @ApiOperation("查询列表")
    @GetMapping("/list")
    public ResponseBean selectAll() {
        List list = injectService.list();
        System.out.println(list);
        return ResponseBean.success(list);
    }

    @DeleteMapping("/{id}")
    public ResponseBean delete(@PathVariable int id){
        boolean result = injectService.removeById(id);
        if (result){
            return ResponseBean.success(result);
        }else{
            return ResponseBean.failure();
        }
    }
}

VaccineController.java

package com.code2life.controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.code2life.pojo.Vaccine;
import com.code2life.service.VaccineService;
import com.code2life.until.ResponseBean;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.List;

@Api(tags = "疫苗管理")
@RestController
@RequestMapping("/vaccine")
public class VaccineController {
    @Resource
    private VaccineService vaccineService;

    @ApiOperation("查询列表") // 显示所有种类的疫苗
    @GetMapping("/list")
    public ResponseBean selectAll(){
        List list = vaccineService.list();
        System.out.println(list);
        return ResponseBean.success(list);
    }

    @ApiOperation("分页查询列表")
    @GetMapping("/page")
    @ResponseBody
    public ResponseBean list(@RequestParam int pageNo, @RequestParam int size){
        System.out.println("list:"+pageNo);
        Page page=new Page<>(pageNo,size);
//        page.setCurrent(PageNo);
//        page.setSize(size);
        Page pages= vaccineService.page(page,null);
        System.out.println("pages"+pages.getPages());
        System.out.println("total"+pages.getTotal());
        System.out.println(pages.getRecords());
        return ResponseBean.success(pages);
    }
    @ApiOperation("添加疫苗")
    @PostMapping
    public ResponseBean addVacType(@RequestBody Vaccine vaccine){
        System.out.println("添加疫苗:"+vaccine);
        boolean result=vaccineService.save(vaccine);
        if (result){
            return ResponseBean.success(result);
        }else {
            return ResponseBean.failure(result);
        }
    }

    @ApiOperation("删除疫苗")
    @DeleteMapping("/{id}")
    public ResponseBean delVacType(@PathVariable int id){
        System.out.println("删除疫苗种类的编号:"+id);
        boolean result=vaccineService.removeById(id);
        if (result){
            return ResponseBean.success(result);
        }else {
            return ResponseBean.failure(result);
        }
    }

    @ApiOperation("修改疫苗")
    @PutMapping
    public ResponseBean updateVacType(@RequestBody Vaccine vaccine){
        System.out.println("修改疫苗种类:"+vaccine);
        boolean result=vaccineService.updateById(vaccine);
        if (result){
            return ResponseBean.success(result);
        }else {
            return ResponseBean.failure(result);
        }
    }
    // 查询一个疫苗(根据疫苗编号查询)
    @ApiOperation("查询疫苗")
    @GetMapping("/{id}")
    public ResponseBean selectByName(@PathVariable int id){
        System.out.println("selectByName:"+id);
        System.out.println(vaccineService);
        Vaccine vaccine = vaccineService.getById(id);
        return ResponseBean.success(vaccine);
    }
    // 疫苗分类查询
    @ApiOperation("分类查询疫苗")
    @GetMapping("/type")  //映射的url = "/vaccine/{type}"
    public ResponseBean typeList(@RequestParam int pageNo, @RequestParam int size, @RequestParam int vacTypeId){
        System.out.println("查询类型:"+vacTypeId);
        Page page=new Page<>();
        page.setCurrent(pageNo);
        page.setSize(size);
        QueryWrapper query = new QueryWrapper<>();
        //设置条件
        query.eq("vac_type_id", vacTypeId);
        Page pages=vaccineService.page(page,query);
        return ResponseBean.success(pages);
    }
}

vue端 store: index.js

import Vue from 'vue'
import Vuex from 'vuex'
import { default as axios } from '../util/index'

Vue.use(Vuex)

const store = new Vuex.Store({
    state: {},
    getters: {},
    mutations: {},
    actions: {
        // 异步获取用户信息
        getUserInfo() {
            let token = localStorage.getItem('Authorization');
            return new Promise((resolve, reject) => {
                console.log("...store获取用户信息,token: ", token)
                axios({
                    url: '/api/login/info',
                    method: 'post',
                    data: token
                }).then(res => {
                    console.log("2.store->user获取用户信息,进行权限处理", res)
                    // 保存用户权限列表信息
                    localStorage.setItem('SET_USER', JSON.stringify(res.data.data));
                    resolve(res)
                }).catch(error => {
                    reject(error)
                })
            })
        },
    },
    modules: {}
})
export default store;

router:index.js

import Vue from 'vue'
import store from '../store/index'
import VueRouter from 'vue-router'
import HomeView from '../views/HomeView.vue'

Vue.use(VueRouter)

const routes = [{
        path: '/', // 首页面,静态加载(速度快),在访问到根目录时打开
        name: 'home',
        meta: {
            show: false,
            title: '首页',
            icon: ''
        },
        component: HomeView,
        children: [{
                path: '/user',
                name: 'user',
                meta: {
                    show: true,
                    title: '用户管理',
                    icon: 'el-icon-user'
                },
                //懒加载,路由到此页面时才加载
                component: () => import( /* webpackChunkName: "user" */ '../views/UserView.vue')
            },
            {
                path: '/inoSite',
                name: 'inoSite',
                meta: {
                    show: true,
                    title: '接种点管理',
                    icon: ''
                },
                component: () => import( /* webpackChunkName: "inoSite" */ '../views/InoSiteView.vue')
            },
            {
                path: '/vaccine',
                name: 'vaccine',
                meta: {
                    show: true,
                    title: '疫苗管理',
                    icon: ''
                },
                component: () => import( /* webpackChunkName: "vaccine" */ '../views/VaccineView.vue')
            },
            {
                path: '/vacType',
                name: 'vacType',
                meta: {
                    show: true,
                    title: '疫苗类型管理',
                    icon: ''
                },
                component: () => import( /* webpackChunkName: "hospital" */ '../views/VacTypeView.vue')
            },
            {
                path: '/order',
                name: 'order',
                meta: {
                    show: true,
                    title: '预约接种管理',
                    icon: ''
                },
                component: () => import( /* webpackChunkName: "order" */ '../views/OrderView.vue')
            },
            {
                path: '/personal',
                name: 'personal',
                meta: {
                    show: true,
                    title: '我的预约',
                    icon: ''
                },
                component: () => import( /* webpackChunkName: "order" */ '../views/PersonalView.vue')
            },
            {
                path: '/about',
                name: 'about',
                meta: {
                    show: true,
                    title: '关于',
                    icon: ''
                },
                // route level code-splitting
                // this generates a separate chunk (about.[hash].js) for this route
                // which is lazy-loaded when the route is visited.
                component: () => import( /* webpackChunkName: "about" */ '../views/AboutView.vue')
            }
        ]
    },
    {
        path: '/login',
        name: 'login',
        meta: {
            show: false,
            title: '',
            icon: ''
        },
        // 懒加载(lazy-loaded), 路由到此页面时才加载(when the route is visited.)
        component: () => import( /* webpackChunkName: "login" */ '../views/LoginView.vue')
    },
    {
        path: '/registry',
        name: 'registry',
        meta: {
            show: false,
            title: '',
            icon: ''
        },
        // 懒加载(lazy-loaded), 路由到此页面时才加载(when the route is visited.)
        component: () => import( /* webpackChunkName: "registry" */ '../views/RegistryView.vue')
    }
]

const router = new VueRouter({
    mode: 'history',
    base: process.env.BASE_URL,
    routes
})

/**
 * 路由拦截器
 * 功能:全局导航守卫,对路由进行处理
 * 参数:
 * to 将要访问的路径
 * from 代表从那个路径跳转而来
 * next 是一个函数 表示放行
 * ---- next():放行
 * ---- next('/home'):强制跳转到home这个页面
 */
router.beforeEach(async (to, from, next) => {
    if (to.path === '/login') {
        next(); // 正常放行
    } else {
        // 取token
        let token = localStorage.getItem('Authorization');
        console.log("导航守卫1", token);
        if (token === null || token === '') { // 如果token不存在
            console.log("导航守卫2 token==null to /login", token)
            next('/login'); // 跳转至登录页面
        } else {
            // 调用store,来分发请求,获取登录用户的信息
            await store.dispatch('getUserInfo').then((res) => {
                console.log("导航守卫,start4 用户信息:", res);
                localStorage.setItem("SET_USER", JSON.stringify(res.data.data));
                next(); //放行
            }).catch(res => {
                console.log("导航守卫,start5: ", res);
                next(); // 放行
            });
        }
    }
});

export default router

views: InoSiteView.vue







写在最后

完整源码点头像查看个人签名 如果运行代码中遇到问题,或者需要完整源码和报告,可以和博主交流

觉得有用,记得一键三连哦!

特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报
评论区(0)
按点赞数排序
用户头像
精选文章
thumb 中国研究员首次曝光美国国安局顶级后门—“方程式组织”
thumb 俄乌线上战争,网络攻击弥漫着数字硝烟
thumb 从网络安全角度了解俄罗斯入侵乌克兰的相关事件时间线
下一篇
Spring源码分析之AOP 2022-11-02 06:39:37