博主主页:一点素材
博主简介:专注Java技术领域和毕业设计项目实战、Java、微信小程序、安卓等技术开发,远程调试部署、代码讲解、文档指导、ppt制作等技术指导。
主要内容:毕业设计(Java项目、小程序等)、简历模板、学习资料、面试题库、技术咨询。🍅文末获取联系🍅精彩专栏推荐订阅👇🏻👇🏻 不然下次找不到哟
uniapp小程序《1000套》持续更新中
目录
一、前言
中医“知源”小程序主要功能模块包括公告信息管理、养生知识管理、用户管理、中医典籍管理、饮食养生管理、疾病防治管理,采取面对对象的开发模式进行软件的开发和硬体的架设,能很好的满足实际使用的需求,完善了对应的软体架设以及程序编码的工作,采取MySQL作为后台数据的主要存储单元,采用Springboot框架、Java技术和小程序微信开发者工具进行业务系统的编码及其开发,实现了本系统的全部功能。本次报告,首先分析了研究的背景、作用、意义,为研究工作的合理性打下了基础。针对中医“知源”小程序的各项需求以及技术问题进行分析,证明了系统的必要性和技术可行性,然后对设计系统需要使用的技术软件以及设计思想做了基本的介绍,最后来实现中医“知源”小程序和部署运行使用它。
二、技术介绍
开发语言:Java
框架:ssm
JDK版本:JDK1.8
服务器:tomcat7
数据库:mysql 5.7/8.0
数据库工具:Navicat11
开发软件:eclipse/myeclipse/idea
Maven包:Maven3.3.9
浏览器:谷歌浏览器
小程序框架:uniapp
小程序开发软件:HBuilder X
小程序运行软件:微信开发者
三、系统分析
3.1 功能需求分析
中医“知源”小程序的功能主要分为前台用户根据自己的需求进行注册登录,浏览中医典籍、饮食养生、疾病防治等资讯。后台系统管理员主要对公告信息管理、养生知识管理、用户管理、中医典籍、饮食养生、疾病防治进行处理。
用户用例图如下所示。
管理员用例图如下所示。
3.1.1 前台用户功能
前台用户可分为未注册用户需求和已注册用户需求。
未注册用户的功能如下:
注册账号:用户填写个人信息,并验证手机号码。
已注册用户的功能如下:
登录:根据账号密码进行登录操作。
维护个人信息:用户因个人信息的变更可以随时修改自己注册信息。
浏览公告信息:用户可以浏览主页面的公告信息来了解系统的最新公告信息。
浏览养生知识:用户可以根据养生知识类型浏览养生知识的信息,并选中某个养生知识查看详情,例如:养生知识名称、养生知识类别、养生知识规格、销售单价、库存、养生知识图片等。
浏览中医典籍:用户可以根据中医典籍类型浏览中医典籍的信息,并选中某个中医典籍查看详情,例如:中医典籍名、所在位置、养生知识品类、照片等。
浏览评论信息:选中某个养生知识可查看其用户的评论。
评论:用户可以根据自己的观点看法对相关养生知识进行评论。
3.1.2 后台管理员功能
后台管理员功能如下:
修改密码:管理员可以随时修改自己进入系统的登录密码,以保证系统的安全性。
养生知识信息管理:对养生知识信息进行维护,添加、删除、修改信息。
中医典籍信息管理:对中医典籍信息进行维护,添加、删除、修改信息。
疾病防治信息管理:对疾病防治信息进行维护,添加、删除、修改信息。
公告信息信息管理:发布、删除相关的公告信息信息。
评论信息管理:可以查看用户的评论,及时了解用户发起的建议。
四、系统设计
4.1 系统总体设计
中医“知源”小程序总体分为前台用户模块和后台管理员模块。
两个模块表现上是分别独立存在,但是访问的数据库是一样的。每一个模块的功能都是根据先前完成的需求分析,并查阅相关资料后整理制作的。
综上所述,系统功能结构图如下图所示。
4.2 系统功能设计
评论模块:评论区促进用户之间的交流,发表个人意见、建议、看法等,在评论区可以查看已有的评论记录,发布新评论,可以展示个人动态头像,个人匿名昵称等。
公告信息模块:可分为公告信息浏览、公告信息检索、公告信息维护三个模块,管理员对公告信息有维护的权限,发布新的公告信息、更新已有的公告信息等。
养生知识管理模块:养生知识管理分为养生知识添加、修改和养生知识订购。养生知识信息由管理员进行修改、添加、删除操作;养生知识订购由普通用户来执行。
中医典籍管理模块:中医典籍管理分为中医典籍添加、修改和中医典籍在线咨询。中医典籍信息由管理员进行修改、添加、删除操作;中医典籍在线咨询由普通用户来执行。
疾病防治管理模块:疾病防治管理分为疾病防治添加、修改和删除。疾病防治信息由管理员进行修改、添加、删除操作。
4.3 数据库设计
4.3.1 数据需求分析
从前面可以分析到数据库中最重要的是中医典籍信息,养生知识信息,疾病防治信息,同时存在评论信息。分析可以得到如下数据描述:
平台用户:用于记录用户的各种信息,包括用户名、密码、姓名、性别、地址、邮箱、联系方式等数据项。
管理员:记录管理员的登录信息。包括用户名,密码,权限等数据项。
中医典籍:存储各种中医典籍信息。包括典籍名称、类别、作者、具体内容、主治疾病、图片等数据项。
养生知识:存放给养生知识的内容,包括养生知识标题、类别、作者、具体内容、养生范围、养生知识图片等数据项。
疾病防治:存放给疾病防治的内容,包括疾病防治标题、疾病名称、防治类别、防治方法、疾病防治图片等数据项。
4.3.2 数据库概念设计
根据前面的数据流程图,结合系统的功能模块设计,设计出符合系统的各信息实体。
系统ER图如下图所示。
五、系统实现
5.1用户前台功能(前端)
5.1.1 用户注册模块
用户在填写数据的时候必须与注册页面上的验证相匹配否则会注册失败,注册页面的表单验证是通过JavaScript进行验证的,用户名的长度必须在6到18之间,邮箱必须带有@符号,密码和密码确认必须相同,你输入的密码,系统会根据你输入密码的强度给出指定的值,电话号码和身份证号码必须要求输入格式与生活相符合,当你前台验证通过的时候你点击注册,表单会将你输入的值通过name值传递给后台并保存到数据库中。
用户注册流程图如下图所示。
注册,通过填写用户名、密码、姓名、手机等信息,输入完成后选择提交即可注册成功,如下图所示。
5.1.2 用户登录模块
系统的登录窗口是用户的入口,用户只有在登录成功后才可以进入访问。通过在登录提交表单,后台处理判断是否为合法用户,进行页面跳转,进入系统中去。
登录合法性判断过程:用户输入账号和密码后,系统首先确定输入输入数据合法性,然后在login.jsp页面发送登录请求,调用src下的mainctrl类的dopost方法来验证。
用户登录模块的IPO如下所示:
输入:用户名和密码。
处理:
1)检测用户输入的账号、密码是否正确及在数据库已对应存在。
2)从数据库中提取记录,并储存在本地的session中(timeout默认=30min)。
3)根据用户名,将其显示在系统首页上。
输出:是否成功的信息。
登录流程图如下所示。
系统登录界面如下所示。
5.1.3 用户首页模块
用户登录进入首页,可以进行查看等功能模块的查看与操作,如下图所示。
5.1.4 中医典籍模块
用户点击中医典籍页面,可以看到各类的医疗中医典籍信息,包括典籍名称、典籍类型、典籍简介等,也可以对典籍进行点赞、收藏、发表评论等操作。
中医典籍展示界面如下图所示。
5.1.5 养生知识信息模块
5.1.6 疾病防治信息模块
用户点击疾病防治页面,可以看到各类的疾病防治信息,包括疾病防治名称、类型、症状简介、疾病反应等,也可以对疾病防治信息进行点赞、收藏、发表评论等操作。
疾病防治信息展示界面如下图所示。
5.2 管理员功能模块(后端)
5.2.1 管理员登录首页模块
在管理员功能页面可以查看系统首页、个人中心、用户管理、中医典籍信息管理、零售中医典籍管理、养生知识分类管理、养生知识订购管理、医保类型管理、参保信息管理、缴费信息管理、系统管理等内容进行相对应操作,如下图所示。
5.2.2 用户管理模块
用户管理,在用户管理页面可以查看用户名、姓名、性别、头像、用户积分等信息,并可根据需要进行修改或删除操作,如下图所示。
5.2.3 资源管理模块
资源管理,分为养生知识和资讯分类列表。养生知识信息由管理员进行修改、添加、删除操作。
养生知识管理如下图所示。
5.2.4 中医典籍管理模块
中医典籍添加页面设计效果如下图所示。
中医典籍管理页面效果如下图所示。
5.2.5 饮食养生管理模块
养生知识信息添加界面如下图所示。
饮食养生信息管理界面如下图所示。
六、系统论文参考
七、实现代码
7.1登录系统主要代码
form.on('submit(login)', function(data) {
data = data.field;
if (vue.roles.length!=1) {
if (!data.role) {
layer.msg('请选择登录用户类型', {
time: 2000,
icon: 5
});
return false;
}
} else {
data.role = vue.roles[0].tableName;
}
http.request(data.role + '/login', 'get', data, function(res) {
layer.msg('登录成功', {
time: 2000,
icon: 6
});
// 登录凭证
localStorage.setItem('Token', res.token);
var roleName = "";
if(typeof(jquery('#role:checked').attr('title')) == "undefined") {
roleName = vue.roles[0].roleName;
} else {
roleName = jquery('#role:checked').attr('title');
}
localStorage.setItem('role', roleName);
// 当前登录用户角色
localStorage.setItem('userTable', data.role);
localStorage.setItem('sessionTable', data.role);
// 用户名称
localStorage.setItem('adminName', data.username);
http.request(data.role + '/session', 'get', {}, function(res) {
// 用户id
localStorage.setItem('userid', res.data.id);
if(res.data.vip) {
localStorage.setItem('vip', res.data.vip);
}
// 路径访问设置
window.location.href = '../../index.html';
})
});
return false
});
});
/**
* 跳转登录
* @param {Object} tablename
*/
function registerClick(tablename) {
window.location.href = '../' + tablename + '/register.html?tablename=' + tablename;
}
7.2用户注册主要代码
*/
@IgnoreAuth
@RequestMapping("/register")
public R register(@RequestBody YonghuEntity yonghu){
//ValidatorUtils.validateEntity(yonghu);
YonghuEntity user = yonghuService.selectOne(new EntityWrapper<YonghuEntity>().eq("yonghuming", yonghu.getYonghuming()));
if(user!=null) {
return R.error("注册用户已存在");
}
Long uId = new Date().getTime();
yonghu.setId(uId);
yonghuService.insert(yonghu);
return R.ok();
}
7.3小程序端首页主要代码
methods: {
jump(url) {
if (this.queryIndex == 0) {
localStorage.setItem('indexQueryCondition', document.getElementById("dianyingxinxidianyingmingcheng").value);
}
jump(url)
},
queryChange(event) {
this.queryIndex = event.target.value;
if (this.queryIndex == 0) {
this.dianyingxinxidianyingmingcheng = this.queryList[event.target.value].queryName;
}
}
}
});
layui.use(['layer', 'form', 'element', 'carousel', 'http', 'jquery'], function() {
var layer = layui.layer;
var element = layui.element;
var form = layui.form;
var carousel = layui.carousel;
var http = layui.http;
var jquery = layui.jquery;
vue.baseurl=http.baseurl;
// 获取轮播图 数据
http.request('config/list', 'get', {
page: 1,
limit: 5
}, function(res) {
if (res.data.list.length > 0) {
let swiperList = [];
res.data.list.forEach(element => {
if (element.value != null) {
swiperList.push({
img: http.baseurl + element.value
});
}
});
vue.swiperList = swiperList;
vue.$nextTick(() => {
carousel.render({
elem: '#test1',
width: '89.6%',
height: '500px',
arrow: 'hover',
anim: 'default',
autoplay: 'true',
interval: '3000',
indicator: 'inside'
});
})
// vue.$nextTick(()=>{
// window.xznSlide();
// });
}
});
http.request('news/list', 'get', {
page: 1,
order: 'desc'
}, function(res) {
var newsList = res.data.list;
for(var i = 0; i<newsList.length; i++) {
let d = newsList[i].addtime.split(' ')
d = d[0].split('-')
newsList[i].year = d[0]
newsList[i].month = d[1] + '-' + d[2]
}
vue.newsList = newsList;
if (newsList.length > 0 && newsList.length <= 2) {
vue.leftNewsList = res.data.list
} else {
var leftNewsList = []
for (let i = 0; i <= 2; i++) {
leftNewsList.push(newsList[i]);
}
vue.leftNewsList = leftNewsList
}
if (newsList.length > 2 && newsList.length <= 8) {
var rightNewsList = []
for (let i = 3; i <= newsList.length; i++) {
rightNewsList.push(newsList[i]);
}
vue.rightNewsList = rightNewsList
}
let flag = 10;
let options = {"navigation":{"nextEl":".swiper-button-next","prevEl":".swiper-button-prev"},"slidesPerView":5,"loop":true,"spaceBetween":20,"autoplay":{"delay":3000,"disableOnInteraction":false}}
options.pagination = {el:'null'}
if(flag == 3) {
vue.$nextTick(() => {
new Swiper('#newsnews', options)
})
}
if(flag == 6) {
let sixSwiper = {
loop: true,
speed: 2500,
slidesPerView: 3,
spaceBetween: 10,
centeredSlides: true,
watchSlidesProgress: true,
autoplay: {
delay: 0,
stopOnLastSlide: false,
disableOnInteraction: false
}
}
vue.$nextTick(() => {
new Swiper('#new-list-6', sixSwiper)
})
}
});
// 获取推荐信息
var autoSortUrl = "dianyingxinxi/autoSort";
if(localStorage.getItem('userid')!=null) {
autoSortUrl = "dianyingxinxi/autoSort2";
}
http.request(autoSortUrl, 'get', {
page: 1,
limit: 3 * 1
}, function(res) {
vue.dianyingxinxiRecommend = res.data.list
let flag = 1;
let options = {"navigation":{"nextEl":".swiper-button-next","prevEl":".swiper-button-prev"},"slidesPerView":5,"loop":true,"spaceBetween":20,"autoplay":{"delay":3000,"disableOnInteraction":false}}
options.pagination = {el:'null'}
if(flag == 3) {
vue.$nextTick(() => {
new Swiper('#recommenddianyingxinxi', options)
})
}
if(flag == 5) {
vue.$nextTick(() => {
var swiper = new Swiper('#recommend-five-swiperdianyingxinxi', {
loop: true,
speed: 500,
slidesPerView: 5,
spaceBetween: 10,
autoplay: {"delay":3000,"disableOnInteraction":false},
centeredSlides: true,
watchSlidesProgress: true,
on: {
setTranslate: function() {
slides = this.slides
for (i = 0; i < slides.length; i++) {
slide = slides.eq(i)
progress = slides[i].progress
// slide.html(progress.toFixed(2)); //看清楚progress是怎么变化的
slide.css({
'opacity': '',
'background': ''
});
slide.transform(''); //清除样式
slide.transform('scale(' + (1.5 - Math.abs(progress) / 4) + ')');
}
},
setTransition: function(transition) {
for (var i = 0; i < this.slides.length; i++) {
var slide = this.slides.eq(i)
slide.transition(transition);
}
},
},
navigation: {"nextEl":".swiper-button-next","prevEl":".swiper-button-prev"},
pagination: {"el":".swiper-pagination","clickable":true},
});
})
}
});
});
八、获取源码
大家点赞、收藏、关注、评论啦 、关注下二维码获取联系方式👇🏻👇🏻