基于Java+SSM+Vue+uniapp实现微信小程序的学生签到系统小程序

文末获取源码

开发语言:Java

框架:SSM

JDK版本:JDK1.8

服务器:tomcat7

数据库:mysql 5.7/8.0

数据库工具:Navicat11

开发软件:eclipse/myeclipse/idea

Maven包:Maven3.3.9

浏览器:谷歌浏览器

小程序框架:uniapp

小程序开发软件:HBuilder X

小程序运行软件:微信开发者

一、前言介绍

社会发展日新月异,用计算机应用实现数据管理功能已经算是很完善的了,但是随着移动互联网的到来,处理信息不再受制于地理位置的限制,处理信息及时高效,备受人们的喜爱。所以各大互联网厂商都瞄准移动互联网这个潮流进行各大布局,经过多年的大浪淘沙,各种移动操作系统的不断面世,而目前市场占有率最高的就是微信小程序,本次开发一套基于微信小程序的生签到系统,有管理员,教师,学生三个角色。管理员功能有个人中心,学生管理,教师管理,签到管理,学生签到管理,班课信息管理,加入班课管理,请假信息管理,审批信息管理,销假信息管理,系统管理。教师和学生都可以在微信端注册和登录,教师可以管理签到信息,管理班课信息,审批请假信息,查看学生签到,查看加入班级,查看审批信息和销假信息。学生可以查看教师发布的学生签到信息,可以自己选择加入班课信息,添加请假信息,查看审批信息,进行销假操作。基于微信小程序的生签到系统服务端用Java开发的网站后台,接收并且处理微信小程序端传入的json数据,数据库用到了MySQL数据库作为数据的存储。这样就让用户用着方便快捷,都通过同一个后台进行业务处理,而后台又可以根据并发量做好部署,用硬件和软件进行协作,满足于数据的交互式处理,让用户的数据存储更安全,得到数据更方便。 

二、功能结构设计

在管理员功能模块确定下来的基础上,对管理员各个功能进行设计,确定管理员功能的详细模块。绘制的管理员功能结构见下图。

三、数据库设计

与功能结构设计一样,数据库设计也是程序开发不可避免的设计环节,数据库设计最主要的目的就是帮助运行程序存储相应的数据信息。数据库设计包含的内容有数据表结构的设计,也包含了数据库E-R图的设计。

3.1数据库E-R图

在绘制E-R图之前,先要找出数据库的实体,明确各个实体具有的属性,比如用户信息这个实体,它具备的属性包括了用户的姓名属性,用户的密码属性,用户的创建时间属性等,所以明确了用户这个实体,以及用户实体具备的属性之后,就需要根据这些信息绘制用户实体对应的实体属性图了。绘制软件选用当下认可度高,使用范围广,操作便利的微软旗下的Visio工具。

(1)管理员实体属性图通过Visio工具绘制,绘制结果展示如下:

(2)学生实体属性图通过Visio工具绘制,绘制结果展示如下:

(3)公告实体属性图通过Visio工具绘制,绘制结果展示如下:

3.2部分数据库表结构

在进行这部分设计之前,需要明白和掌握数据类型以及各个数据类型的长度范围等知识,因为在一张具体的数据表中,为了方便理解,这里就举个简单的例子。比如用户信息表,这个表格的字段就是用户这个实体具备的属性,这时就需要对字段进行数据类型,以及字段长度的设置,也要设置一个主键来作为用户信息表的唯一标识。这些都是数据库表结构设计需要完成的内容。根据基于微信小程序的生签到系统的功能设计以及数据库设计要求,展示该系统的数据表结构。

通知公告表

序号

列名

数据类型

说明

允许空

1

Id

Int

id

2

addtime

Date

创建时间

3

title

String

标题

4

introduction

String

简介

5

picture

String

图片

6

content

String

内容

学生表

序号

列名

数据类型

说明

允许空

1

Id

Int

id

2

addtime

Date

创建时间

3

xueshengzhanghao

String

学生账号

4

xueshengxingming

String

学生姓名

5

mima

String

密码

6

xingbie

String

性别

7

touxiang

String

头像

8

nianling

Integer

年龄

9

dianhuahaoma

String

电话号码

10

banji

String

班级

11

zhuanye

String

专业

签到表

序号

列名

数据类型

说明

允许空

1

Id

Int

id

2

addtime

Date

创建时间

3

banji

String

班级

4

qiandaodidian

String

签到地点

5

qiandaoshijian

String

签到时间

6

tupian

String

图片

7

fabushijian

date

发布时间

8

jiaoshigonghao

String

教师工号

9

jiaoshixingming

String

教师姓名

10

xueshengzhanghao

String

学生账号

11

xueshengxingming

String

学生姓名

12

userid

Integer

用户id

四、系统实现

系统实现这个章节的内容主要还是展示系统的功能界面设计效果,在实现系统基本功能,比如修改,比如添加,比如删除等管理功能的同时,也显示出系统各个功能的界面实现效果,该部分内容一方面与前面提到的系统分析,系统设计的内容相呼应,另一方面也是一个实际成果的展示。

4.1微信小程序功能实现

4.1.1首页

微信小程序输入正确的账号密码后就会默认进入首页显示界面。首页主要有轮播图,班级信息,以及下面的导航为主要组成部分。

4.1.2公告信息展示

用户可以在公告展示界面对公告进行搜索和查看。

4.1.3班课信息

学生登录后可以查看班课信息,可以选择立即加入。

4.1.4我的

我的里面主要是可以进行退出,点击小齿轮就可以选择退出当前账户,也可以点击其他信息进行操作。

4.1.5签到信息

4.2管理员后台功能

4.2.1学生管理

管理员可以对学生信息进行添加,修改,删除,查询操作。

4.2.2教师信息管理

此页面管理员可以对教师信息进行添加,修改,删除,查询操作。

4.2.3公告信息管理

此页面管理员可以对公告信息进行添加,修改,删除,查询操作。

4.2.4签到信息管理

此页面管理员可以对签到信息进行修改,删除,查询操作。

五、部分核心代码

5.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;
        }

5.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();
    }

5.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},
					});
				})
			}
		});

  });

六、项目总结

基于微信小程序的生签到系统的开发制作,从题目确定到成品完成,自己投入的精力与心血是非常多的。这也是我第一次使用微信小程序语言,开发的这个比较简单的基于微信小程序的生签到系统。

基于微信小程序的生签到系统开发过程中,自己之前觉得比较抽象的许多门课程,例如数据库原理,软件工程,动态网站开发等课程开始变得很清晰,只有自己独立开发程序,才会觉得这些开发类的课程在实践中具有的重要作用。为了让自己设计的作品能够顺利的完成,我把所学知识全部运用在程序的开发流程中,包括了程序的需求分析环节,程序的编码环节,程序的测试环节等,让程序软件在开发周期内完成制作,并能够保证程序质量达标,力求程序开发流程规范化,程序对应的配套文档标准化。

独立开发程序期间,才会发现有许多知识都是现学现用得来的,毕竟大学期间所学知识比较有限,专业知识掌握得比较浅显,这也给自己制造了许多麻烦,比如程序开发期间遇到的中文乱码问题,程序对应数据库的数据安全问题,程序开发中框架的使用问题等,这些问题都需要随时去翻阅书籍,或通过百度浏览器等方式寻找解决办法,这也耽误了许多程序开发的宝贵时间,后期我也通过对周边同学的请教,以及指导老师的悉心指导,让我找到了程序开发的相关技巧,也积累了一定的知识量,慢慢地纠正了许多不该犯的错误。也推动了我的程序开发进程。

基于微信小程序的生签到系统现已完成了开发,除了基本功能可以符合用户需求外,在页面设计层面上没有融入更多的设计元素,需要从美学角度进行优化,另外在程序的代码层面,也有许多重合部分,需要进行整理归类,让代码变得更加的简洁。

实践出真知,但是知识也是通过实践变得更加深刻,这次作品制作,让自己的专业知识水平与解决问题的能力得到了提高。也让自己更加明白活到老学到老的真正含义。

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本资源是一份基于微信小程序学生签到系统的设计与实现,采用了SSM框架(Spring、SpringMVC、MyBatis)进行开发。系统主要包括前端展示层、后端业务逻辑层和数据访问层。前端使用微信小程序Vue.js框架进行开发,后端采用Java语言编写。 该系统主要实现了以下功能: 1. 学生签到学生可以通过扫描二维码或者在地图上选择位置进行签到签到信息实时上传至服务器。 2. 签到记录查询:学生可以查看自己的签到记录,包括签到时间、签到地点等信息。 3. 教师管理:教师可以查看学生签到情况,包括签到次数、未签到次数等统计数据。 4. 课程管理:教师可以管理课程信息,包括添加课程、修改课程、删除课程等操作。 5. 学生管理:教师可以管理学生信息,包括添加学生、修改学生、删除学生等操作。 6. 通知公告:教师可以发布通知公告,学生可以查看通知公告。 7. 数据统计:系统可以根据签到数据进行统计分析,生成报表。 8. 权限管理:系统对不同角色(学生、教师、管理员)的权限进行管理,确保数据安全。 技术亮点: 1. 使用微信小程序作为前端展示层,方便学生随时随地进行签到操作。 2. 采用Vue.js框架进行前端开发,提高页面渲染性能。 3. 后端采用SSM框架进行开发,实现业务逻辑与数据访问的分离,便于维护和扩展。 4. 使用MyBatis作为持久层框架,简化数据库操作。 5. 利用微信API实现地理位置信息的获取,提高签到准确性。 6. 采用RESTful API设计风格,提高前后端交互的可读性和可维护性。 通过本资源的学习和实践,可以帮助开发者掌握微信小程序开发、Vue.js框架、SSM框架等相关技术,为今后的项目开发积累经验。
PHP基于微信小程序的健康管理系统代码是一种结合了PHP后端开发和微信小程序前端开发的技术方案。该系统主要用于提供用户健康数据的收集、分析和展示功能,帮助用户管理自己的健康。 系统的后端主要使用PHP来编写API接口,用于接收和处理前端小程序发来的请求。以下是一个简单的例子: ```php <?php // 简单的接收用户提交的健康数据并保存的API接口例子 // 假设已经建立了与数据库的连接,并具有相应的健康数据表"halth_data" // 接收小程序提交的健康数据 $userId = $_POST['userId']; $heartRate = $_POST['heartRate']; $bloodPressure = $_POST['bloodPressure']; // 将数据保存到数据库 $sql = "INSERT INTO health_data (user_id, heart_rate, blood_pressure) VALUES ($userId, $heartRate, $bloodPressure)"; $result = mysqli_query($conn, $sql); if ($result) { echo json_encode(['status' => 'success', 'message' => '保存成功']); } else { echo json_encode(['status' => 'error', 'message' => '保存失败']); } ?> ``` 上述代码接收到小程序发送的用户健康数据后,将数据插入到数据库中,并向小程序返回保存结果的JSON数据。 此外,系统还可以提供其他功能,比如根据用户ID获取健康数据、健康数据统计等。具体的代码根据系统需求进行开发,涉及登录鉴权、数据校验、数据分析等方面。前端小程序代码也需要进行开发,负责用户的输入和展示等功能。 总之,PHP基于微信小程序的健康管理系统代码主要包括后端API接口和前端小程序代码,通过这两者的结合实现了用户健康数据的管理和展示功能。以上是一个简单的例子,实际开发中需要根据具体需求进行更全面的开发和测试。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值