项目介绍
通过移动互联网这几年的发展,单独的开发某些APP已经到了日暮西山的地步,原因不在于单个的APP功能丰富与否,而是因为用户生态体系的问题。使用智能手机的用户经过多年的使用习惯,已经越来越不喜欢安装各种的APP,除了正常生活和工作所必须的APP,不喜欢因为喜欢某些内容而被强制安装APP软件了。最近几年,随着微信生态的布局,通过开发微信小程序接口,让广大用户可以通过微信直接访问小程序,不需要去专门安装那些APP,这一点让很多用户喜爱,基本上只要能转向微信生态的业务,许多企业都已经开始拥抱微信小程序。本课题就是研究和实现一款基于微信小程序的疫苗预约系统。
基于微信小程序的疫苗预约系统通过MySQL数据库与微信开发者工具进行开发,基于微信小程序的疫苗预约系统能够实现论坛管理,公告信息管理,疫苗信息管理,疫苗评价管理,疫苗收藏管理,疫苗预约管理,用户管理等功能。
基于微信小程序的疫苗预约系统让疫苗信息,疫苗预约信息等相关信息集中在后台让管理员管理,让用户在小程序端预约疫苗,查看疫苗预约信息,该系统让信息管理变得高效,也让用户预约疫苗,查看疫苗预约等信息变得越来越方便。
开发环境
编程语言:Java
数据库 :Mysql
系统架构:B/S
后端框架:SSM
编译工具:idea或者eclipse,微信开发者工具,jdk1.8,maven
支持定做:java/php/python/android/小程序vue/爬虫/c#/asp.net
系统实现
5.1管理员功能实现
5.1.1 论坛管理
管理员进入如图5-1所示的论坛管理界面之后,管理员点击信息显示栏中最右侧的修改,删除帖子按钮可依次完成论坛帖子信息的修改,删除等操作,管理员也能在当前界面查看论坛帖子回复信息。
图5-1 论坛管理界面
5.1.2 疫苗信息管理
管理员进入如图5-2所示的疫苗信息管理界面之后,管理员点击信息显示栏中最右侧的修改,删除,增加库存,减少库存按钮可依次完成疫苗信息的修改,删除,疫苗库存增加,疫苗库存减少等操作。
图5-2 疫苗信息管理界面
5.1.3 疫苗评价管理
管理员进入如图5-3所示的疫苗评价管理界面之后,管理员点击信息显示栏右侧的回复,删除按钮可依次完成疫苗评价信息回复,删除等操作。
图5-3 疫苗评价管理界面
5.1.4 疫苗预约管理
管理员进入如图5-4所示的疫苗预约管理界面之后,管理员点击信息显示栏中最右侧的详情,删除按钮可依次完成疫苗预约信息的详情查看,删除操作,管理员在本界面也能查询疫苗预约信息等。
图5-4 疫苗预约管理界面
5.2用户功能实现
5.2.1 疫苗信息
用户进入如图5-5所示的疫苗信息界面之后,用户查看疫苗剩余数量,疫苗接种前后禁忌,适宜接种人群等信息,用户可以对能够预定的疫苗进行预约。
图5-5 疫苗信息界面
5.2.2 订单确认
用户进入如图5-6所示的订单确认界面之后,用户点击确认支付就可以支付订单。进入订单确认界面前,需要用户对疫苗进行预定,才可以进入订单确认界面。
图5-6 订单确认界面
5.2.3 我的疫苗预约
用户进入如图5-7所示的我的疫苗预约界面之后,用户可以查看疫苗预约信息,有已经评价的疫苗预约信息,有已支付的疫苗预约信息,有退款的疫苗预约信息等。
图5-7 我的疫苗预约界面
5.2.4 我的发帖
用户进入如图5-8所示的我的发帖界面之后,用户点击新增按钮即可编辑发布自己的帖子,本模块显示的帖子都是用户本人发布的帖子,用户可以修改,可以删除帖子。
图5-8 我的发帖界面
5.2.5 用户充值
用户进入如图5-9所示的用户充值界面之后,用户输入充值金额,然后提交就能对账户进行充值。
图5-9 用户充值界面
核心代码
package com.controller;
import java.io.File;
import java.math.BigDecimal;
import java.net.URL;
import java.text.SimpleDateFormat;
import com.alibaba.fastjson.JSONObject;
import java.util.*;
import org.springframework.beans.BeanUtils;
import javax.servlet.http.HttpServletRequest;
import org.springframework.web.context.ContextLoader;
import javax.servlet.ServletContext;
import com.service.TokenService;
import com.utils.*;
import java.lang.reflect.InvocationTargetException;
import com.service.DictionaryService;
import org.apache.commons.lang3.StringUtils;
import com.annotation.IgnoreAuth;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.entity.*;
import com.entity.view.*;
import com.service.*;
import com.utils.PageUtils;
import com.utils.R;
import com.alibaba.fastjson.*;
/**
* 疫苗信息
* 后端接口
* @author
* @email
*/
@RestController
@Controller
@RequestMapping("/yimiao")
public class YimiaoController {
private static final Logger logger = LoggerFactory.getLogger(YimiaoController.class);
@Autowired
private YimiaoService yimiaoService;
@Autowired
private TokenService tokenService;
@Autowired
private DictionaryService dictionaryService;
//级联表service
@Autowired
private YonghuService yonghuService;
/**
* 后端列表
*/
@RequestMapping("/page")
public R page(@RequestParam Map<String, Object> params, HttpServletRequest request){
logger.debug("page方法:,,Controller:{},,params:{}",this.getClass().getName(),JSONObject.toJSONString(params));
String role = String.valueOf(request.getSession().getAttribute("role"));
if(false)
return R.error(511,"永不会进入");
else if("用户".equals(role))
params.put("yonghuId",request.getSession().getAttribute("userId"));
params.put("yimiaoDeleteStart",1);params.put("yimiaoDeleteEnd",1);
if(params.get("orderBy")==null || params.get("orderBy")==""){
params.put("orderBy","id");
}
PageUtils page = yimiaoService.queryPage(params);
//字典表数据转换
List<YimiaoView> list =(List<YimiaoView>)page.getList();
for(YimiaoView c:list){
//修改对应字典表字段
dictionaryService.dictionaryConvert(c, request);
}
return R.ok().put("data", page);
}
/**
* 后端详情
*/
@RequestMapping("/info/{id}")
public R info(@PathVariable("id") Long id, HttpServletRequest request){
logger.debug("info方法:,,Controller:{},,id:{}",this.getClass().getName(),id);
YimiaoEntity yimiao = yimiaoService.selectById(id);
if(yimiao !=null){
//entity转view
YimiaoView view = new YimiaoView();
BeanUtils.copyProperties( yimiao , view );//把实体数据重构到view中
//修改对应字典表字段
dictionaryService.dictionaryConvert(view, request);
return R.ok().put("data", view);
}else {
return R.error(511,"查不到数据");
}
}
/**
* 后端保存
*/
@RequestMapping("/save")
public R save(@RequestBody YimiaoEntity yimiao, HttpServletRequest request){
logger.debug("save方法:,,Controller:{},,yimiao:{}",this.getClass().getName(),yimiao.toString());
String role = String.valueOf(request.getSession().getAttribute("role"));
if(false)
return R.error(511,"永远不会进入");
Wrapper<YimiaoEntity> queryWrapper = new EntityWrapper<YimiaoEntity>()
.eq("yimiao_name", yimiao.getYimiaoName())
.eq("yimiao_types", yimiao.getYimiaoTypes())
.eq("yimiao_kucun_number", yimiao.getYimiaoKucunNumber())
.eq("yimiao_renqun", yimiao.getYimiaoRenqun())
.eq("yimiao_text", yimiao.getYimiaoText())
.eq("yimiao_delete", yimiao.getYimiaoDelete())
;
logger.info("sql语句:"+queryWrapper.getSqlSegment());
YimiaoEntity yimiaoEntity = yimiaoService.selectOne(queryWrapper);
if(yimiaoEntity==null){
yimiao.setYimiaoDelete(1);
yimiao.setCreateTime(new Date());
yimiaoService.insert(yimiao);
return R.ok();
}else {
return R.error(511,"表中有相同数据");
}
}
/**
* 后端修改
*/
@RequestMapping("/update")
public R update(@RequestBody YimiaoEntity yimiao, HttpServletRequest request){
logger.debug("update方法:,,Controller:{},,yimiao:{}",this.getClass().getName(),yimiao.toString());
String role = String.valueOf(request.getSession().getAttribute("role"));
// if(false)
// return R.error(511,"永远不会进入");
//根据字段查询是否有相同数据
Wrapper<YimiaoEntity> queryWrapper = new EntityWrapper<YimiaoEntity>()
.notIn("id",yimiao.getId())
.andNew()
.eq("yimiao_name", yimiao.getYimiaoName())
.eq("yimiao_types", yimiao.getYimiaoTypes())
.eq("yimiao_kucun_number", yimiao.getYimiaoKucunNumber())
.eq("yimiao_renqun", yimiao.getYimiaoRenqun())
.eq("yimiao_text", yimiao.getYimiaoText())
.eq("yimiao_delete", yimiao.getYimiaoDelete())
;
logger.info("sql语句:"+queryWrapper.getSqlSegment());
YimiaoEntity yimiaoEntity = yimiaoService.selectOne(queryWrapper);
if("".equals(yimiao.getYimiaoPhoto()) || "null".equals(yimiao.getYimiaoPhoto())){
yimiao.setYimiaoPhoto(null);
}
if(yimiaoEntity==null){
yimiaoService.updateById(yimiao);//根据id更新
return R.ok();
}else {
return R.error(511,"表中有相同数据");
}
}
/**
* 删除
*/
@RequestMapping("/delete")
public R delete(@RequestBody Integer[] ids){
logger.debug("delete:,,Controller:{},,ids:{}",this.getClass().getName(),ids.toString());
ArrayList<YimiaoEntity> list = new ArrayList<>();
for(Integer id:ids){
YimiaoEntity yimiaoEntity = new YimiaoEntity();
yimiaoEntity.setId(id);
yimiaoEntity.setYimiaoDelete(2);
list.add(yimiaoEntity);
}
if(list != null && list.size() >0){
yimiaoService.updateBatchById(list);
}
return R.ok();
}
/**
* 批量上传
*/
@RequestMapping("/batchInsert")
public R save( String fileName, HttpServletRequest request){
logger.debug("batchInsert方法:,,Controller:{},,fileName:{}",this.getClass().getName(),fileName);
Integer yonghuId = Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId")));
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
List<YimiaoEntity> yimiaoList = new ArrayList<>();//上传的东西
Map<String, List<String>> seachFields= new HashMap<>();//要查询的字段
Date date = new Date();
int lastIndexOf = fileName.lastIndexOf(".");
if(lastIndexOf == -1){
return R.error(511,"该文件没有后缀");
}else{
String suffix = fileName.substring(lastIndexOf);
if(!".xls".equals(suffix)){
return R.error(511,"只支持后缀为xls的excel文件");
}else{
URL resource = this.getClass().getClassLoader().getResource("../../upload/" + fileName);//获取文件路径
File file = new File(resource.getFile());
if(!file.exists()){
return R.error(511,"找不到上传文件,请联系管理员");
}else{
List<List<String>> dataList = PoiUtil.poiImport(file.getPath());//读取xls文件
dataList.remove(0);//删除第一行,因为第一行是提示
for(List<String> data:dataList){
//循环
YimiaoEntity yimiaoEntity = new YimiaoEntity();
// yimiaoEntity.setYimiaoName(data.get(0)); //疫苗名称 要改的
// yimiaoEntity.setYimiaoTypes(Integer.valueOf(data.get(0))); //疫苗类型 要改的
// yimiaoEntity.setYimiaoPhoto("");//详情和图片
// yimiaoEntity.setYimiaoKucunNumber(Integer.valueOf(data.get(0))); //剩余数量 要改的
// yimiaoEntity.setYimiaoNewMoney(data.get(0)); //疫苗价格 要改的
// yimiaoEntity.setYimiaoRenqun(data.get(0)); //适宜接种人群 要改的
// yimiaoEntity.setYimiaoText(data.get(0)); //接种前后禁忌 要改的
// yimiaoEntity.setYimiaoContent("");//详情和图片
// yimiaoEntity.setYimiaoDelete(1);//逻辑删除字段
// yimiaoEntity.setCreateTime(date);//时间
yimiaoList.add(yimiaoEntity);
//把要查询是否重复的字段放入map中
}
//查询是否重复
yimiaoService.insertBatch(yimiaoList);
return R.ok();
}
}
}
}catch (Exception e){
e.printStackTrace();
return R.error(511,"批量插入数据异常,请联系管理员");
}
}
/**
* 前端列表
*/
@IgnoreAuth
@RequestMapping("/list")
public R list(@RequestParam Map<String, Object> params, HttpServletRequest request){
logger.debug("list方法:,,Controller:{},,params:{}",this.getClass().getName(),JSONObject.toJSONString(params));
// 没有指定排序字段就默认id倒序
if(StringUtil.isEmpty(String.valueOf(params.get("orderBy")))){
params.put("orderBy","id");
}
PageUtils page = yimiaoService.queryPage(params);
//字典表数据转换
List<YimiaoView> list =(List<YimiaoView>)page.getList();
for(YimiaoView c:list)
dictionaryService.dictionaryConvert(c, request); //修改对应字典表字段
return R.ok().put("data", page);
}
/**
* 前端详情
*/
@RequestMapping("/detail/{id}")
public R detail(@PathVariable("id") Long id, HttpServletRequest request){
logger.debug("detail方法:,,Controller:{},,id:{}",this.getClass().getName(),id);
YimiaoEntity yimiao = yimiaoService.selectById(id);
if(yimiao !=null){
//entity转view
YimiaoView view = new YimiaoView();
BeanUtils.copyProperties( yimiao , view );//把实体数据重构到view中
//修改对应字典表字段
dictionaryService.dictionaryConvert(view, request);
return R.ok().put("data", view);
}else {
return R.error(511,"查不到数据");
}
}
/**
* 前端保存
*/
@RequestMapping("/add")
public R add(@RequestBody YimiaoEntity yimiao, HttpServletRequest request){
logger.debug("add方法:,,Controller:{},,yimiao:{}",this.getClass().getName(),yimiao.toString());
Wrapper<YimiaoEntity> queryWrapper = new EntityWrapper<YimiaoEntity>()
.eq("yimiao_name", yimiao.getYimiaoName())
.eq("yimiao_types", yimiao.getYimiaoTypes())
.eq("yimiao_kucun_number", yimiao.getYimiaoKucunNumber())
.eq("yimiao_renqun", yimiao.getYimiaoRenqun())
.eq("yimiao_text", yimiao.getYimiaoText())
.eq("yimiao_delete", yimiao.getYimiaoDelete())
;
logger.info("sql语句:"+queryWrapper.getSqlSegment());
YimiaoEntity yimiaoEntity = yimiaoService.selectOne(queryWrapper);
if(yimiaoEntity==null){
yimiao.setYimiaoDelete(1);
yimiao.setCreateTime(new Date());
yimiaoService.insert(yimiao);
return R.ok();
}else {
return R.error(511,"表中有相同数据");
}
}
}
论文参考
目 录
第一章 绪论 1
1.1 选题背景 1
1.2 选题意义 1
1.3 研究内容 2
第二章 开发环境 3
2.1 Java语言 3
2.2 MYSQL数据库 3
2.3 Eclipse开发工具 4
2.4 SSM框架 4
2.5微信开发者工具 5
第三章 系统分析 6
3.1可行性分析 6
3.1.1技术可行性 6
3.1.2操作可行性 6
3.1.3经济可行性 6
3.2系统流程分析 7
3.3系统性能分析 10
3.3.1系统安全性 10
3.3.2数据完整性 11
3.3.3系统可扩展性 11
3.4系统功能分析 11
第四章 系统设计 14
4.1 系统设计目标 14
4.2功能结构设计 15
4.3数据库设计 16
4.3.1 数据库概念设计 16
4.3.2 数据库物理设计 19
第五章 系统实现 23
5.1管理员功能实现 23
5.1.1 论坛管理 23
5.1.2 疫苗信息管理 23
5.1.3 疫苗评价管理 24
5.1.4 疫苗预约管理 24
5.2用户功能实现 25
5.2.1 疫苗信息 25
5.2.2 订单确认 26
5.2.3 我的疫苗预约 27
5.2.4 我的发帖 28
5.2.5 用户充值 29
第六章 系统测试 31
6.1系统测试的特点 31
6.2 系统功能测试 31
6.2.1 用户登录测试 31
6.2.2 疫苗查询功能测试 32
6.3 系统测试结果 32
结 论 33
致 谢 35
参考文献 36