校园心声墙小程序

博主主页:一点素材
博主简介:专注Java技术领域和毕业设计项目实战、Java、微信小程序、安卓等技术开发,远程调试部署、代码讲解、文档指导、ppt制作等技术指导。
主要内容:毕业设计(Java项目、小程序等)、简历模板、学习资料、面试题库、技术咨询。🍅文末获取联系🍅

精彩专栏推荐订阅👇🏻👇🏻 不然下次找不到哟

uniapp小程序《1000套》持续更新中

http://t.csdn.cn/5lMgm

一、前言介绍

校园心声墙小程序的应用范围很广,很多学校都会建立一套具有自己学校风格的心声墙小程序,来方便学校学生之间的日常联系和交流心声的建立对学生之间的信息的传播,知识的交流提供了一个很好的平台,增加了学生课余生活的情趣。本校园心声墙是基于小程序开发的一套系统。校园心声墙小程序的主要功能就是方便同学之间的联系,促进同窗好友的感情,校园心声墙小程序系统功能齐全,含有留言,搜索,上传和后台管理等功能。

校园心声墙小程序的设计主要是对系统所要实现的功能进行详细考虑,确定所要实现的功能后进行界面的设计,在这中间还要考虑如何可以更好的将功能及页面进行很好的结合,方便用户可以很容易明了的找到自己所需要的信息,还有系统平台后期的可操作性,通过对信息内容的详细了解进行技术的开发。

校园心声墙小程序的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与校园心声墙小程序管理的实际需求相结合,讨论了基于校园心声墙小程序管理的使用。

二、系统功能分析

校园心声墙小程序中的web管理端管理端采用了IntelliJ IDEA 2019.3.4 开发工具,配合了java开发语言中springboot开发框架以及tomcat8.0服务器、jdk1.8,用户端采用了微信开发者工具稳定版1.05.2111300,页面使用wxss和wxml进行布局,用户端和web管理端管理端采用json接口通信。

校园心声墙小程序中的管理端管理员角色主要负责了如下功能操作。

(1)网站管理功能需求:网站管理包括了轮播图、公告信息两部分,管理员可以对这两部分进行添加,修改,删除和查询等。

(2)人员管理功能需求:人员管理部分包括了管理员,学生用户两个角色,管理员可以对这两个角色进行添加,修改,删除以及查询等。

(3)内容管理功能需求:内容管理主要实现了心声墙、心声分类、热门话题、话题分类的功能,管理员可以进行维护管理操作。

校园心声墙小程序中的用户端用户角色主负责了如下功能操作。

(1)用户查看系统信息功能需求:用户可以通过系统首页查看校园心声墙小程序信息,包括首页,心声墙、热门话题、我的等模块。

(2)用户登录与注册功能需求:用户可以通过注册获取帐户。

(3)首页:可查看管理员发布所有公告消息;

(4)心声墙:可搜索查看心声墙所有帖子,对喜欢的帖子进行收藏、点赞评,也可发布帖子;

(5)热门话题:用户登录用户端以后,是可以对资讯信息进行查看、点赞、收藏、评论等操作;

(6)我的:用户可对个人信息、头像、密码、昵称进行修改等操作。

校园心声墙小程序功能模块图

三、小程序端功能(前端)

3.1 用户端主页功能实现

用户进入首页之后会显示如下的一个窗口。系统以上中下的布局进行展示,首先映入眼帘的是系统的导航栏,下面是网站公告,再往下是各种各样的资讯,其主界面展示如下图

3.2 用户注册登录功能实现

不是校园心声墙小程序中正式用户的是可以在线进行注册的,当用户点击右上角的“注册”的时候,,当填写上自己的账号+密码+确认密码+昵称+邮箱+手机号+选择身份登信息后,后再点击“注册”按钮后将会先验证输入的有没有空数据,再次验证密码和确认密码是否是一样的,最后验证输入的账户名和数据库表中已经注册的账户名是否重复,只有都验证没问题后即可注册成功。用户注册界面展示如下图

3.3 登录功能实现

校园心声墙小程序中的用户端上注册后的用户是可以通过自己的账户名和密码进行登录的,当用户输入完整的自己的账户名和密码信息并点击“登录”按钮后,将会首先验证输入的有没有空数据,再次验证输入的账户名+密码和数据库中当前保存的用户信息是否一致,只有在一致后将会登录成功并自动跳转到校园心声墙小程序的首页中;否则将会提示相应错误信息,用户登录界面如下图

3.4 心声墙功能实现

当用户点击“心声墙”后,用户可以搜索查看心声墙所有帖子,对喜欢的帖子进行收藏、点赞评,也可发布帖子;如图

3.5 热门话题功能实现

当用户点击“热门话题”后,是可以对热门话题进行查看、点赞、收藏、评论等操作;具体的实现界面如下图

3.6 我的功能实现

从基于微信小程序校园心声墙小程序用户端底部的“我的”菜单进入后选择“基本信息”后可以对头像、昵称、密码等信息进行修书,界面如下图

四、管理员功能模块(后端) 

4.1 管理端管理员登录功能实现

校园心声墙小程序中的管理端的管理员是可以通过自己的账户名和密码进行登录的,当管理员输入完整的自己的账户名和密码信息并点击“登录”按钮后,将会首先验证输入的有没有空数据,再次验证输入的账户名+密码和数据库中当前保存的用户信息是否一致,只有在一致后将会登录成功并自动跳转到校园心声墙小程序的首页中;否则将会提示相应错误信息,管理员登录界面如下图所示。

4.2 人员管理功能实现

管理员在人员管理模块,可以对用户信息进行管理,人员管理模块由管理员,学生用户两部分组成,这里以学生用户管理为例,具体的实现界面如下图

4.3 网站管理功能实现

校园心声墙小程序中的管理人员在“网站管理”这一菜单中是可以对用户端显示的轮播图以及公告信息进行管控。界面如下图

4.4 轮播图管理界面

管理人员在“轮播图管理”这一菜单中是可以对前台显示的轮播图进行增删改查,具体的实现界面如下图

4.5 公告消息界面

管理系统中的管理人员在“公告消息”这一菜单中是可以对校园心声墙小程序内的公告消息可以进行增删改查操作,具体的实现界面如下图

4.6 内容管理功能实现

管理人员在“内容管理”这一菜单下是可以对心声墙、心声分类、热门话题、话题分类,这四个子菜单,管理员能够对这四个模块进行管控的,具体的实现界面如下图

五、部分核心代码

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

  });
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值