博主主页:一点素材
博主简介:专注Java技术领域和毕业设计项目实战、Java、微信小程序、安卓等技术开发,远程调试部署、代码讲解、文档指导、ppt制作等技术指导。
主要内容:毕业设计(Java项目、小程序等)、简历模板、学习资料、面试题库、技术咨询。精彩专栏推荐订阅👇🏻👇🏻 不然下次找不到哟
uniapp小程序《1000套》持续更新中
🍅文末获取联系🍅
项目介绍:
在此基础上,结合现有短文写作竞赛体系的特点,运用新技术,构建了以 springboot为基础的短文写作竞赛管理体系。首先,以需求为依据,对目前传统的短文写作竞赛管理基础业务进行了较为详尽的了解和分析。根据需求分析结果进行了系统的设计,并将其划分为管理员、学生、评委和负责人四种角色:主要功能包括系统首页、个人中心、负责人管理、学生管理、评委管理、专业管理、班级管理、竞赛类别管理、竞赛信息管理、竞赛报名管理、竞赛成果管理、竞赛评分管理、系统管理等。使用目前市场主流的技术 SpringBoot框架和Maven进行项目构建,使用Java开发语言和MySQL数据库对系统进行高内聚低耦合的设计,最终完成了短文写作竞赛管理系统小程序的实现。
系统包含技术:
开发语言:Java
框架:springboot
JDK版本:JDK1.8
数据库:mysql 5.7/8.0
开发软件:eclipse/myeclipse/idea
Maven包:Maven3.3.9
小程序框架:uniapp
小程序开发软件:HBuilder X
小程序运行软件:微信开发者
系统用例分析:
在设计系统的过程中,用例图是系统设计过程中必不可少的模型,用例图可以更为细致的,结合系统中人员的有关分配,能够从细节上描绘出系统中有关功能所完成的具体事件,确切的反映出某个操作以及它们相互之间的内部联系。
其中参与者就是和系统能够发生交互的外在实体,一般可以指系统的某个用户。一个用例图就能对应出系统中的一个功能过程,系统中完整的功能都是由许多不同的用例图所组成的。
系统用例图如下所示:
(1)管理员可以对系统首页、个人中心、负责人管理、学生管理、评委管理、专业管理、班级管理、竞赛类别管理、竞赛信息管理、竞赛报名管理、竞赛成果管理、竞赛评分管理、系统管理等进行基本的信息管理。其用例分析如图
(2) 负责人可以对系统首页、个人中心、竞赛信息管理、竞赛报名管理、竞赛成果管理、竞赛评分管理等进行基本的信息管理。负责人用例分析如图
(3)评委可以实现对系统首页、个人中心、竞赛信息管理、竞赛报名管理、竞赛评分管理进行操作,评委用例分析如图
(4)学生可以实现对个人中心、竞赛报名、竞赛成果、竞赛评分等信息进行操作,学生用例分析如图
系统结构设计
系统实现:
登录界面的实现
首先双击打开小程序客户端,连上网络之后会显示出本系统的登录界面,这是进入小程序的初始页面“登录”,能成功进入到该登录界面则代表小程序的开启是成功的,接下来就可以操作本系统所带有的其他所有的功能。登录界面如图
小程序首页功能的实现
小程序首页是学生注册登录后进入的第一个界面,在这里,人们能够看到小程序的导航条,内容包括首页、竞赛信息、竞赛成果、我的等。小程序首页界面如图
竞赛信息;在竞赛信息页面可以查看到竞赛名称、竞赛编号、竞赛类别、报名开始时间、报名截止时间、发布时间、负责人账号、负责人姓名、报名条件等详细信息,并根据需要进行报名操作;如图
学生功能
学生登录成功后,点击“我的”进入我的页面,在我的页面可以对个人中心、竞赛报名、竞赛成果、竞赛评分等进行详细操作。学生功能界面如图
后台功能的实现
后台登录,系统用户在登录页面通过选择角色,正确填写账号和密码等信息进行登录操作,如图
管理员点击负责人管理。在负责人页面输入负责人账号、负责人姓名进行查询、新增或删除负责人列表,并根据需要对负责人详情信息进行详情、修改或删除操作;如图
管理员点击专业管理。在专业页面输入专业进行查询、新增或删除专业列表,并根据需要对专业详情信息进行详情、修改或删除操作;如图
管理员点击班级管理。在班级页面输入班级进行查询、新增或删除班级列表,并根据需要对班级详情信息进行详情、修改或删除操作;如图
管理员点击竞赛类别管理。在竞赛类别页面输入竞赛类别进行查询、新增或删除竞赛类别列表,并根据需要对竞赛类别详情信息进行详情、修改或删除操作;如图
管理员点击竞赛报名管理。在竞赛报名页面输入竞赛名称和选择是否通过进行查询、删除或批量审核竞赛报名列表,并根据需要对竞赛报名详情信息进行详情、修改或删除操作;如图
部分核心代码:
登录系统主要代码
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;
}
用户注册主要代码
*/
@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();
}
小程序端首页主要代码
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},
});
})
}
});
});