当前位置:   article > 正文

基于微信小程序的快递管理平台设计与实现_基于微信小程序的乡村快递代拿系统设计与实现

基于微信小程序的乡村快递代拿系统设计与实现

文末联系获取源码

开发语言: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.配送信息表

2.配送完成表 

3.确认完成表

四、微信小程序功能实现

4.1首页

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

4.2快递信息

用户点击快递信息可以查看自己的快递信息,还可以搜索自己的快递。

4.3配送信息

用户可以在配送信息里面查看配送信息。

4.4我的

我的里面主要是可以进行退出,点击小齿轮就可以选择退出当前账户,也可以快递信息,配送信息等。

五、管理员后台功能实现 

5.1用户管理

管理员可以对用户信息进行添加,修改,删除,查询管理。

5.2平台公告管理

管理员可以对平台公告信息进行添加,修改,删除,查询管理。

5.3配送员管理

管理员可以对配送员信息进行添加,修改,删除,查询管理。

5.4快递信息管理

管理员可以对快递信息进行修改,删除,查询管理。

六、部分核心代码

6.1登录系统主要代码

  1. form.on('submit(login)', function(data) {
  2. data = data.field;
  3. if (vue.roles.length!=1) {
  4. if (!data.role) {
  5. layer.msg('请选择登录用户类型', {
  6. time: 2000,
  7. icon: 5
  8. });
  9. return false;
  10. }
  11. } else {
  12. data.role = vue.roles[0].tableName;
  13. }
  14. http.request(data.role + '/login', 'get', data, function(res) {
  15. layer.msg('登录成功', {
  16. time: 2000,
  17. icon: 6
  18. });
  19. // 登录凭证
  20. localStorage.setItem('Token', res.token);
  21. var roleName = "";
  22. if(typeof(jquery('#role:checked').attr('title')) == "undefined") {
  23. roleName = vue.roles[0].roleName;
  24. } else {
  25. roleName = jquery('#role:checked').attr('title');
  26. }
  27. localStorage.setItem('role', roleName);
  28. // 当前登录用户角色
  29. localStorage.setItem('userTable', data.role);
  30. localStorage.setItem('sessionTable', data.role);
  31. // 用户名称
  32. localStorage.setItem('adminName', data.username);
  33. http.request(data.role + '/session', 'get', {}, function(res) {
  34. // 用户id
  35. localStorage.setItem('userid', res.data.id);
  36. if(res.data.vip) {
  37. localStorage.setItem('vip', res.data.vip);
  38. }
  39. // 路径访问设置
  40. window.location.href = '../../index.html';
  41. })
  42. });
  43. return false
  44. });
  45. });
  46. /**
  47. * 跳转登录
  48. * @param {Object} tablename
  49. */
  50. function registerClick(tablename) {
  51. window.location.href = '../' + tablename + '/register.html?tablename=' + tablename;
  52. }

6.2用户注册主要代码

  1. */
  2. @IgnoreAuth
  3. @RequestMapping("/register")
  4. public R register(@RequestBody YonghuEntity yonghu){
  5. //ValidatorUtils.validateEntity(yonghu);
  6. YonghuEntity user = yonghuService.selectOne(new EntityWrapper<YonghuEntity>().eq("yonghuming", yonghu.getYonghuming()));
  7. if(user!=null) {
  8. return R.error("注册用户已存在");
  9. }
  10. Long uId = new Date().getTime();
  11. yonghu.setId(uId);
  12. yonghuService.insert(yonghu);
  13. return R.ok();
  14. }

6.3小程序端首页主要代码

  1. methods: {
  2. jump(url) {
  3. if (this.queryIndex == 0) {
  4. localStorage.setItem('indexQueryCondition', document.getElementById("dianyingxinxidianyingmingcheng").value);
  5. }
  6. jump(url)
  7. },
  8. queryChange(event) {
  9. this.queryIndex = event.target.value;
  10. if (this.queryIndex == 0) {
  11. this.dianyingxinxidianyingmingcheng = this.queryList[event.target.value].queryName;
  12. }
  13. }
  14. }
  15. });
  16. layui.use(['layer', 'form', 'element', 'carousel', 'http', 'jquery'], function() {
  17. var layer = layui.layer;
  18. var element = layui.element;
  19. var form = layui.form;
  20. var carousel = layui.carousel;
  21. var http = layui.http;
  22. var jquery = layui.jquery;
  23. vue.baseurl=http.baseurl;
  24. // 获取轮播图 数据
  25. http.request('config/list', 'get', {
  26. page: 1,
  27. limit: 5
  28. }, function(res) {
  29. if (res.data.list.length > 0) {
  30. let swiperList = [];
  31. res.data.list.forEach(element => {
  32. if (element.value != null) {
  33. swiperList.push({
  34. img: http.baseurl + element.value
  35. });
  36. }
  37. });
  38. vue.swiperList = swiperList;
  39. vue.$nextTick(() => {
  40. carousel.render({
  41. elem: '#test1',
  42. width: '89.6%',
  43. height: '500px',
  44. arrow: 'hover',
  45. anim: 'default',
  46. autoplay: 'true',
  47. interval: '3000',
  48. indicator: 'inside'
  49. });
  50. })
  51. // vue.$nextTick(()=>{
  52. // window.xznSlide();
  53. // });
  54. }
  55. });
  56. http.request('news/list', 'get', {
  57. page: 1,
  58. order: 'desc'
  59. }, function(res) {
  60. var newsList = res.data.list;
  61. for(var i = 0; i<newsList.length; i++) {
  62. let d = newsList[i].addtime.split(' ')
  63. d = d[0].split('-')
  64. newsList[i].year = d[0]
  65. newsList[i].month = d[1] + '-' + d[2]
  66. }
  67. vue.newsList = newsList;
  68. if (newsList.length > 0 && newsList.length <= 2) {
  69. vue.leftNewsList = res.data.list
  70. } else {
  71. var leftNewsList = []
  72. for (let i = 0; i <= 2; i++) {
  73. leftNewsList.push(newsList[i]);
  74. }
  75. vue.leftNewsList = leftNewsList
  76. }
  77. if (newsList.length > 2 && newsList.length <= 8) {
  78. var rightNewsList = []
  79. for (let i = 3; i <= newsList.length; i++) {
  80. rightNewsList.push(newsList[i]);
  81. }
  82. vue.rightNewsList = rightNewsList
  83. }
  84. let flag = 10;
  85. let options = {"navigation":{"nextEl":".swiper-button-next","prevEl":".swiper-button-prev"},"slidesPerView":5,"loop":true,"spaceBetween":20,"autoplay":{"delay":3000,"disableOnInteraction":false}}
  86. options.pagination = {el:'null'}
  87. if(flag == 3) {
  88. vue.$nextTick(() => {
  89. new Swiper('#newsnews', options)
  90. })
  91. }
  92. if(flag == 6) {
  93. let sixSwiper = {
  94. loop: true,
  95. speed: 2500,
  96. slidesPerView: 3,
  97. spaceBetween: 10,
  98. centeredSlides: true,
  99. watchSlidesProgress: true,
  100. autoplay: {
  101. delay: 0,
  102. stopOnLastSlide: false,
  103. disableOnInteraction: false
  104. }
  105. }
  106. vue.$nextTick(() => {
  107. new Swiper('#new-list-6', sixSwiper)
  108. })
  109. }
  110. });
  111. // 获取推荐信息
  112. var autoSortUrl = "dianyingxinxi/autoSort";
  113. if(localStorage.getItem('userid')!=null) {
  114. autoSortUrl = "dianyingxinxi/autoSort2";
  115. }
  116. http.request(autoSortUrl, 'get', {
  117. page: 1,
  118. limit: 3 * 1
  119. }, function(res) {
  120. vue.dianyingxinxiRecommend = res.data.list
  121. let flag = 1;
  122. let options = {"navigation":{"nextEl":".swiper-button-next","prevEl":".swiper-button-prev"},"slidesPerView":5,"loop":true,"spaceBetween":20,"autoplay":{"delay":3000,"disableOnInteraction":false}}
  123. options.pagination = {el:'null'}
  124. if(flag == 3) {
  125. vue.$nextTick(() => {
  126. new Swiper('#recommenddianyingxinxi', options)
  127. })
  128. }
  129. if(flag == 5) {
  130. vue.$nextTick(() => {
  131. var swiper = new Swiper('#recommend-five-swiperdianyingxinxi', {
  132. loop: true,
  133. speed: 500,
  134. slidesPerView: 5,
  135. spaceBetween: 10,
  136. autoplay: {"delay":3000,"disableOnInteraction":false},
  137. centeredSlides: true,
  138. watchSlidesProgress: true,
  139. on: {
  140. setTranslate: function() {
  141. slides = this.slides
  142. for (i = 0; i < slides.length; i++) {
  143. slide = slides.eq(i)
  144. progress = slides[i].progress
  145. // slide.html(progress.toFixed(2)); //看清楚progress是怎么变化的
  146. slide.css({
  147. 'opacity': '',
  148. 'background': ''
  149. });
  150. slide.transform(''); //清除样式
  151. slide.transform('scale(' + (1.5 - Math.abs(progress) / 4) + ')');
  152. }
  153. },
  154. setTransition: function(transition) {
  155. for (var i = 0; i < this.slides.length; i++) {
  156. var slide = this.slides.eq(i)
  157. slide.transition(transition);
  158. }
  159. },
  160. },
  161. navigation: {"nextEl":".swiper-button-next","prevEl":".swiper-button-prev"},
  162. pagination: {"el":".swiper-pagination","clickable":true},
  163. });
  164. })
  165. }
  166. });
  167. });

七、获取源码

大家点赞、收藏、关注、评论 、 下方联系获取源码

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/155571
推荐阅读
相关标签
  

闽ICP备14008679号