系统展示
用户前台界面
管理员后台界面
系统背景
当前社会各行业领域竞争压力非常大,随着当前时代的信息化,科学化发展,让社会各行业领域都争相使用新的信息技术,对行业内的各种相关数据进行科学化,规范化管理。这样的大环境让那些止步不前,不接受信息改革带来的信息技术的企业随时面临被淘汰,被取代的风险。所以当今,各个行业领域,不管是传统的教育行业,餐饮行业,还是旅游行业,医疗行业等领域都将使用新的信息技术进行信息革命,改变传统的纸质化,需要人手工处理工作事务的办公环境。软件信息技术能够覆盖社会各行业领域是时代的发展要求,各种数据以及文件真正实现电子化是信息社会发展的不可逆转的必然趋势。本牙科就诊管理系统也是紧跟科学技术的发展,运用当今一流的软件技术实现软件系统的开发,让牙科就诊管理系统完全通过管理系统实现科学化,规范化,程序化管理。从而帮助信息管理者节省事务处理的时间,降低数据处理的错误率,对于基础数据的管理水平可以起到促进作用,也从一定程度上对随意的业务管理工作进行了避免,同时,牙科就诊管理系统的数据库里面存储的各种动态信息,也为上层管理人员作出重大决策提供了大量的事实依据。总之,牙科就诊管理系统是一款可以真正提升管理者的办公效率的软件系统。
目的意义
现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本牙科就诊管理系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息,使用这种软件工具可以帮助管理人员提高事务处理效率,达到事半功倍的效果。此牙科就诊管理系统利用当下成熟完善的SSM框架,使用跨平台的可开发大型商业网站的Java语言,以及最受欢迎的RDBMS应用软件之一的Mysql数据库进行程序开发。实现了用户在线查看数据。管理员管理病例管理、字典管理、公告管理、药单管理、药品管理、药品收藏管理、药品评价管理、药品订单管理、牙医管理、牙医收藏管理、牙医评价管理、牙医挂号管理、用户管理、管理员管理等功能。牙科就诊管理系统的开发根据操作人员需要设计的界面简洁美观,在功能模块布局上跟同类型网站保持一致,程序在实现基本要求功能时,也为数据信息面临的安全问题提供了一些实用的解决方案。可以说该程序在帮助管理者高效率地处理工作事务的同时,也实现了数据信息的整体化,规范化与自动化。伴随着互联网发展,现今信息类型愈来愈多,信息量也非常大,那也是信息时代的缩影。近些年,电子元器件信息科学合理发展的趋势变的越来越快,系统的开发也日趋成熟。因而,在生活各行各业,只要是有信息管理方法,基本都有电子计算机黑影。可以这么说,很多行业都利用计算机来处理信息。与手工制做对比,一个新的信息解决方法具备安全系数强、能力强、内存空间大、成本费用低等特点。对于销售商品高效信息管理方法,牙科就诊管理系统的挑选可以有效的管理方法,使信息管理方法更科学。与软件工具管理方法信息、散播信息、分享信息,提升总体水平,提升市场竞争力,从数次残酷竞争中获取发展契机。针对特色产品市场销售信息各自为政、差错率高、信息安全系数差、工作强度高、用时费劲等一系列问题,经剖析考虑到,目前可引进牙科就诊管理系统,可以解决以上问题的最佳方式。它不仅可以马上处理信息,还能够降低管理人员的信息智能管理系统,使之系统化、规范性。与此同时,还能够提高效率,节省管理人员信息管理处必须人力资源和资产。因而,牙科就诊管理系统是产品销售信息管理方面不可或缺的专用型管理系统软件,对管理人员尤为重要。
技术介绍
IDEA的诞生在Java集成开发工具行业正所谓平地起雷,瞬间震动了整个Java开发行业。真的是每个人用过的都说好。IDEA之所以相比于其他比如MyEclipse或者Eclipse之类的Java开发工具来讲比较好,原因首先在于设计方面。IDEA采用了所谓的人体工程学设计原理,让使用IDEA的人员用了就忘记不了。软件打开首先要设置主题,可以选择常规的白色或者暗色系列,长时间的白色或者长时间的暗色会让开发人员的眼睛疲劳加重,首先从这个细节就让程序开发人员备受青睐,让程序员看着舒服;然后再对一些常用性插件进行归类,让程序的开发注重于提升生产效率,而不是一味的让开发者找各种插件,有时候插件之间的版本还会存在不兼容,IDEA就把兼容的插件双手呈现,如此贴心的IDEA怎么能让人不喜爱。所以选择IDEA用来开发本项目就理所当然的了。本设计用到的数据库就是MySQL数据库[3],之所以用到这个数据库的原因很多。首先,从满足功能需求上面来讲,MySQL是符合的;其次,从学习程度来讲,MySQL相比其他数据库不管是从安装还是使用上面来讲,都比较简单,最重要的是学习起来相当便捷,比较容易入手;再次,MySQL数据库对电脑要求不高,不管是什么样的电脑都可以安装MySQL数据库,并且并不会对电脑性能造成过多的影响。所以,就平常普普通通的电脑就可以作为开发用的电脑,不需要进行额外的电脑升级。虽然自从MySQL数据库被Oracle数据库收购后,有了一些闭源的风险,但是使用者还是很多,MySQL数据库目前的开发人员已经超过五百人了,对数据库开发者来讲已经是一个很大的开发团队了。MySQL在使用上面来讲,普通的增删改查操作已经可以满足大部分业务需求,像一些数据导出导入,以及一些函数,都可以满足一些不同的需求,最重要的是MySQL数据库可以创建索引,可以大大的提高数据的查询效率,当然,物极必反,如果因为索引好用而滥用,索引弄得比数据库表还要多,这样会造成MySQL数据库更新表数据时候的运行效率。总而言之,MySQL数据库在本次设计的使用上,是完全符合使用要求的。
目录参考
1 绪论
1.1 研究背景
1.2 目的和意义
1.3 研究内容
2 相关技术
2.1Java语言
2.2 B/S结构介绍
2.3 MySQL数据库介绍
2.4 SpringBoot框架介绍
2.5 Vue框架介绍
3 系统分析
3.1 系统可行性分析
3.1.1 技术可行性分析
3.1.2 经济可行性分析
3.1.3 运行可行性分析
3.2 系统性能分析
3.2.1 易用性指标
3.2.2 可扩展性指标
3.2.3 健壮性指标
3.2.4 安全性指标
3.3 系统流程分析
3.3.1 操作流程分析
3.3.2 登录流程分析
3.3.3 信息添加流程分析
3.3.4 信息删除流程分析
3.4 系统功能分析
4 系统设计
4.1 系统概要设计
4.2 系统功能结构设计
4.3 数据库设计
4.3.1 数据库E-R图设计
4.3.2 数据库表结构设计
5 系统实现
5.1 用户前台设计与实现
5.2 管理员后台的设计与实现
6 系统测试
6.1 系统测试的特点
6.2 系统功能测试
6.2.1 登录功能测试
6.2.2 添加班级功能测试
6.3 测试结果分析
代码展示
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("/yaopin")
public class YaopinController {private static final Logger logger = LoggerFactory.getLogger(YaopinController.class);private static final String TABLE_NAME = "yaopin";@Autowiredprivate YaopinService yaopinService;@Autowiredprivate TokenService tokenService;@Autowiredprivate BingliService bingliService;//病例@Autowiredprivate DictionaryService dictionaryService;//字典@Autowiredprivate GonggaoService gonggaoService;//公告@Autowiredprivate YaodanService yaodanService;//药单@Autowiredprivate YaopinCollectionService yaopinCollectionService;//药品收藏@Autowiredprivate YaopinCommentbackService yaopinCommentbackService;//药品评价@Autowiredprivate YaopinOrderService yaopinOrderService;//药品订单@Autowiredprivate YayiService yayiService;//牙医@Autowiredprivate YayiCollectionService yayiCollectionService;//牙医收藏@Autowiredprivate YayiCommentbackService yayiCommentbackService;//牙医评价@Autowiredprivate YayiOrderService yayiOrderService;//牙医挂号@Autowiredprivate YonghuService yonghuService;//用户@Autowiredprivate UsersService usersService;//管理员/*** 后端列表*/@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"));else if("牙医".equals(role))params.put("yayiId",request.getSession().getAttribute("userId"));params.put("yaopinDeleteStart",1);params.put("yaopinDeleteEnd",1);CommonUtil.checkMap(params);PageUtils page = yaopinService.queryPage(params);//字典表数据转换List<YaopinView> list =(List<YaopinView>)page.getList();for(YaopinView 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);YaopinEntity yaopin = yaopinService.selectById(id);if(yaopin !=null){//entity转viewYaopinView view = new YaopinView();BeanUtils.copyProperties( yaopin , view );//把实体数据重构到view中//修改对应字典表字段dictionaryService.dictionaryConvert(view, request);return R.ok().put("data", view);}else {return R.error(511,"查不到数据");}}/*** 后端保存*/@RequestMapping("/save")public R save(@RequestBody YaopinEntity yaopin, HttpServletRequest request){logger.debug("save方法:,,Controller:{},,yaopin:{}",this.getClass().getName(),yaopin.toString());String role = String.valueOf(request.getSession().getAttribute("role"));if(false)return R.error(511,"永远不会进入");Wrapper<YaopinEntity> queryWrapper = new EntityWrapper<YaopinEntity>().eq("yaopin_name", yaopin.getYaopinName()).eq("yaopin_types", yaopin.getYaopinTypes()).eq("yaopin_kucun_number", yaopin.getYaopinKucunNumber()).eq("yaopin_cangku", yaopin.getYaopinCangku()).eq("shangxia_types", yaopin.getShangxiaTypes()).eq("yaopin_delete", 1);logger.info("sql语句:"+queryWrapper.getSqlSegment());YaopinEntity yaopinEntity = yaopinService.selectOne(queryWrapper);if(yaopinEntity==null){yaopin.setYaopinClicknum(1);yaopin.setShangxiaTypes(1);yaopin.setYaopinDelete(1);yaopin.setInsertTime(new Date());yaopin.setCreateTime(new Date());yaopinService.insert(yaopin);return R.ok();}else {return R.error(511,"表中有相同数据");}}/*** 后端修改*/@RequestMapping("/update")public R update(@RequestBody YaopinEntity yaopin, HttpServletRequest request) throws NoSuchFieldException, ClassNotFoundException, IllegalAccessException, InstantiationException {logger.debug("update方法:,,Controller:{},,yaopin:{}",this.getClass().getName(),yaopin.toString());YaopinEntity oldYaopinEntity = yaopinService.selectById(yaopin.getId());//查询原先数据String role = String.valueOf(request.getSession().getAttribute("role"));
// if(false)
// return R.error(511,"永远不会进入");if("".equals(yaopin.getYaopinPhoto()) || "null".equals(yaopin.getYaopinPhoto())){yaopin.setYaopinPhoto(null);}if("".equals(yaopin.getYaopinContent()) || "null".equals(yaopin.getYaopinContent())){yaopin.setYaopinContent(null);}if("".equals(yaopin.getYaopinJinjiContent()) || "null".equals(yaopin.getYaopinJinjiContent())){yaopin.setYaopinJinjiContent(null);}if("".equals(yaopin.getYaopinGongxiaoContent()) || "null".equals(yaopin.getYaopinGongxiaoContent())){yaopin.setYaopinGongxiaoContent(null);}if("".equals(yaopin.getYaopinShuomingshuContent()) || "null".equals(yaopin.getYaopinShuomingshuContent())){yaopin.setYaopinShuomingshuContent(null);}yaopinService.updateById(yaopin);//根据id更新return R.ok();}/*** 删除*/@RequestMapping("/delete")public R delete(@RequestBody Integer[] ids, HttpServletRequest request){logger.debug("delete:,,Controller:{},,ids:{}",this.getClass().getName(),ids.toString());List<YaopinEntity> oldYaopinList =yaopinService.selectBatchIds(Arrays.asList(ids));//要删除的数据ArrayList<YaopinEntity> list = new ArrayList<>();for(Integer id:ids){YaopinEntity yaopinEntity = new YaopinEntity();yaopinEntity.setId(id);yaopinEntity.setYaopinDelete(2);list.add(yaopinEntity);}if(list != null && list.size() >0){yaopinService.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");//.eq("time", new SimpleDateFormat("yyyy-MM-dd").format(new Date()))try {List<YaopinEntity> yaopinList = 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("static/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){//循环YaopinEntity yaopinEntity = new YaopinEntity();yaopinList.add(yaopinEntity);if(seachFields.containsKey("yaopinUuidNumber")){List<String> yaopinUuidNumber = seachFields.get("yaopinUuidNumber");yaopinUuidNumber.add(data.get(0));//要改的}else{List<String> yaopinUuidNumber = new ArrayList<>();yaopinUuidNumber.add(data.get(0));//要改的seachFields.put("yaopinUuidNumber",yaopinUuidNumber);}}//查询是否重复//药品编号List<YaopinEntity> yaopinEntities_yaopinUuidNumber = yaopinService.selectList(new EntityWrapper<YaopinEntity>().in("yaopin_uuid_number", seachFields.get("yaopinUuidNumber")).eq("yaopin_delete", 1));if(yaopinEntities_yaopinUuidNumber.size() >0 ){ArrayList<String> repeatFields = new ArrayList<>();for(YaopinEntity s:yaopinEntities_yaopinUuidNumber){repeatFields.add(s.getYaopinUuidNumber());}return R.error(511,"数据库的该表中的 [药品编号] 字段已经存在 存在数据为:"+repeatFields.toString());}yaopinService.insertBatch(yaopinList);return R.ok();}}}}catch (Exception e){e.printStackTrace();return R.error(511,"批量插入数据异常,请联系管理员");}}/*** 个性推荐*/@IgnoreAuth@RequestMapping("/gexingtuijian")public R gexingtuijian(@RequestParam Map<String, Object> params, HttpServletRequest request){logger.debug("gexingtuijian方法:,,Controller:{},,params:{}",this.getClass().getName(),JSONObject.toJSONString(params));CommonUtil.checkMap(params);List<YaopinView> returnYaopinViewList = new ArrayList<>();//查询订单Map<String, Object> params1 = new HashMap<>(params);params1.put("sort","id");params1.put("yonghuId",request.getSession().getAttribute("userId"));params1.put("shangxiaTypes",1);params1.put("yaopinYesnoTypes",2);PageUtils pageUtils = yaopinOrderService.queryPage(params1);List<YaopinOrderView> orderViewsList =(List<YaopinOrderView>)pageUtils.getList();Map<Integer,Integer> typeMap=new HashMap<>();//购买的类型listfor(YaopinOrderView orderView:orderViewsList){Integer yaopinTypes = orderView.getYaopinTypes();if(typeMap.containsKey(yaopinTypes)){typeMap.put(yaopinTypes,typeMap.get(yaopinTypes)+1);}else{typeMap.put(yaopinTypes,1);}}List<Integer> typeList = new ArrayList<>();//排序后的有序的类型 按最多到最少typeMap.entrySet().stream().sorted((o1, o2) -> o2.getValue() - o1.getValue()).forEach(e -> typeList.add(e.getKey()));//排序Integer limit = Integer.valueOf(String.valueOf(params.get("limit")));for(Integer type:typeList){Map<String, Object> params2 = new HashMap<>(params);params2.put("yaopinTypes",type);params2.put("shangxiaTypes",1);params2.put("yaopinYesnoTypes",2);PageUtils pageUtils1 = yaopinService.queryPage(params2);List<YaopinView> yaopinViewList =(List<YaopinView>)pageUtils1.getList();returnYaopinViewList.addAll(yaopinViewList);if(returnYaopinViewList.size()>= limit) break;//返回的推荐数量大于要的数量 跳出循环}params.put("shangxiaTypes",1);params.put("yaopinYesnoTypes",2);//正常查询出来商品,用于补全推荐缺少的数据PageUtils page = yaopinService.queryPage(params);if(returnYaopinViewList.size()<limit){//返回数量还是小于要求数量int toAddNum = limit - returnYaopinViewList.size();//要添加的数量List<YaopinView> yaopinViewList =(List<YaopinView>)page.getList();for(YaopinView yaopinView:yaopinViewList){Boolean addFlag = true;for(YaopinView returnYaopinView:returnYaopinViewList){if(returnYaopinView.getId().intValue() ==yaopinView.getId().intValue()) addFlag=false;//返回的数据中已存在此商品}if(addFlag){toAddNum=toAddNum-1;returnYaopinViewList.add(yaopinView);if(toAddNum==0) break;//够数量了}}}else {returnYaopinViewList = returnYaopinViewList.subList(0, limit);}for(YaopinView c:returnYaopinViewList)dictionaryService.dictionaryConvert(c, request);page.setList(returnYaopinViewList);return R.ok().put("data", page);}/*** 前端列表*/@IgnoreAuth@RequestMapping("/list")public R list(@RequestParam Map<String, Object> params, HttpServletRequest request){logger.debug("list方法:,,Controller:{},,params:{}",this.getClass().getName(),JSONObject.toJSONString(params));CommonUtil.checkMap(params);PageUtils page = yaopinService.queryPage(params);//字典表数据转换List<YaopinView> list =(List<YaopinView>)page.getList();for(YaopinView c:list)dictionaryService.dictionaryConvert(c, request); //修改对应字典表字段return R.ok().put("data", page);}/*** 前端详情*/@RequestMapping("/detail/{id}")public R detail(@PathVariable("id") Integer id, HttpServletRequest request){logger.debug("detail方法:,,Controller:{},,id:{}",this.getClass().getName(),id);YaopinEntity yaopin = yaopinService.selectById(id);if(yaopin !=null){//点击数量加1yaopin.setYaopinClicknum(yaopin.getYaopinClicknum()+1);yaopinService.updateById(yaopin);//entity转viewYaopinView view = new YaopinView();BeanUtils.copyProperties( yaopin , view );//把实体数据重构到view中//修改对应字典表字段dictionaryService.dictionaryConvert(view, request);return R.ok().put("data", view);}else {return R.error(511,"查不到数据");}}/*** 前端保存*/@RequestMapping("/add")public R add(@RequestBody YaopinEntity yaopin, HttpServletRequest request){logger.debug("add方法:,,Controller:{},,yaopin:{}",this.getClass().getName(),yaopin.toString());Wrapper<YaopinEntity> queryWrapper = new EntityWrapper<YaopinEntity>().eq("yaopin_name", yaopin.getYaopinName()).eq("yaopin_uuid_number", yaopin.getYaopinUuidNumber()).eq("yaopin_types", yaopin.getYaopinTypes()).eq("yaopin_kucun_number", yaopin.getYaopinKucunNumber()).eq("yaopin_cangku", yaopin.getYaopinCangku()).eq("yaopin_clicknum", yaopin.getYaopinClicknum()).eq("shangxia_types", yaopin.getShangxiaTypes()).eq("yaopin_delete", yaopin.getYaopinDelete());logger.info("sql语句:"+queryWrapper.getSqlSegment());YaopinEntity yaopinEntity = yaopinService.selectOne(queryWrapper);if(yaopinEntity==null){yaopin.setYaopinClicknum(1);yaopin.setYaopinDelete(1);yaopin.setInsertTime(new Date());yaopin.setCreateTime(new Date());yaopinService.insert(yaopin);return R.ok();}else {return R.error(511,"表中有相同数据");}}}
源码文档
如需观看详细演示视频请联系我