当前位置:   article > 正文

从零开始快速搭建SpringBoot+Mybatis+小程序应用--微信小程序的入门和前后端的联调_小程序前后端联调

小程序前后端联调

目录

项目介绍

 vx小程序简介

VX开发工具介绍

列表页开发

list的编写 

 列表页前后端联调

 信息编辑页开发

operation的编写

区域信息编辑页的联调


项目介绍

从0搭建后端的Springboot+mybatis框架

实现后端的业务功能

实现本地微信小程序的前端开发

前端与后端的调控

技术储备要求

1.基础的java知识

2.基础的前端开发知识(简单了解HTML,JS等)

3.Spring,Mybatis基础知识(不会也没关系)


 vx小程序简介

是一种连接用户服务的方式,小程序是vx内嵌的微小程序。

 根目录有一个app.json和project.json,是用来做全职配置的

 

每生成一个页面,就在pages上写一个路由 。

工具配置 project.config.json(vx会自动,透明的完成)

页面配置 page.json

xxx.json就是针对xxx页面下的风格、配色等相关的配置

 WXML模板 充当HTML的角色

具体不同参照vx开发者文档

WXSS模板 充当CSS的角色 

JS交互文件


VX开发工具介绍

集成了公众号网页调试和小程序调试两种开发模式

打开我们的开发工具:

 vx的开发者工具主要由模拟器,编辑器和调试器

模拟器就类似我们的页面UI,我们对页面做的任何改变都能看到我们小程序的样子。

 编辑器就是我们能够在里面写我们的wxml,wxss,还有js等,

 调试器就类似我们网页Chrome里面的开发者工具,我们能够在控制台里看见报错的信息。


3.创建新的小程序

创建新的小程序,指定项目的目录

 项目一旦启动,就会初始化两个界面出来

 


列表页开发

1.列表展示

2.删除功能

最终效果:

首先我们要掌握一些主键的功能:

 view与div一样是个视图容器

 scroll-view可滚动视图区

 text文本

 navigator类似html的a标签(超链接)

 button 按钮

 block区块 可以在里面写逻辑


项目准备:

index.js:

  1. //index.js
  2. //获取应用实例
  3. const app = getApp()
  4. Page({
  5. data: {
  6. motto: 'Hello World',
  7. userInfo: {},
  8. hasUserInfo: false,
  9. canIUse: wx.canIUse('button.open-type.getUserInfo')
  10. },
  11. //事件处理函数
  12. bindViewTap: function() {
  13. wx.navigateTo({//导航到list页面下
  14. url: '../list/list'
  15. })
  16. },
  17. onLoad: function () {
  18. if (app.globalData.userInfo) {
  19. this.setData({
  20. userInfo: app.globalData.userInfo,
  21. hasUserInfo: true
  22. })
  23. } else if (this.data.canIUse){
  24. // 由于 getUserInfo 是网络请求,可能会在 Page.onLoad 之后才返回
  25. // 所以此处加入 callback 以防止这种情况
  26. app.userInfoReadyCallback = res => {
  27. this.setData({
  28. userInfo: res.userInfo,
  29. hasUserInfo: true
  30. })
  31. }
  32. } else {
  33. // 在没有 open-type=getUserInfo 版本的兼容处理
  34. wx.getUserInfo({
  35. success: res => {
  36. app.globalData.userInfo = res.userInfo
  37. //
  38. this.setData({
  39. userInfo: res.userInfo,
  40. hasUserInfo: true
  41. })
  42. }
  43. })
  44. }
  45. },
  46. getUserInfo: function(e) {
  47. console.log(e)
  48. app.globalData.userInfo = e.detail.userInfo
  49. this.setData({
  50. userInfo: e.detail.userInfo,
  51. hasUserInfo: true
  52. })
  53. }
  54. })

index.wxml:

  1. <!--index.wxml-->
  2. <view class="container">
  3. <view class="userinfo">
  4. <button wx:if="{{!hasUserInfo && canIUse}}" open-type="getUserInfo" bindgetuserinfo="getUserInfo"> 获取头像昵称 </button>
  5. <block wx:else>
  6. <image bindtap="bindViewTap" class="userinfo-avatar" src="{{userInfo.avatarUrl}}" background-size="cover"></image>
  7. </block>
  8. </view>
  9. <view class="usermotto">
  10. <text class="user-motto">{{motto}}</text>
  11. </view>
  12. </view>

index.wxss:

  1. /**index.wxss**/
  2. .userinfo {
  3. display: flex;
  4. flex-direction: column;
  5. align-items: center;
  6. }
  7. .userinfo-avatar {
  8. width: 128rpx;
  9. height: 128rpx;
  10. margin: 20rpx;
  11. border-radius: 50%;
  12. }
  13. .userinfo-nickname {
  14. color: #aaa;
  15. }
  16. .usermotto {
  17. margin-top: 200px;
  18. }


list的编写 

list.wxml:

  1. <!-- pages/list/list.wxml -->
  2. <view class="container">
  3. <view class="widget">
  4. <text class="column">ID</text>
  5. <text class="column">区域名</text>
  6. <text class="column">优先级</text>
  7. <text class="link-column">操作</text>
  8. </view>
  9. <!-- 滚动 -->
  10. <scroll-view scroll-y="true">
  11. <view>
  12. <!-- 循环,list任意命名 -->
  13. <block wx:for="{{list}}">
  14. <view class="widget">
  15. <view>
  16. <!-- 取每一个的元素 -->
  17. <text class="column">{{item.areaId}}</text>
  18. <text class="column">{{item.areaName}}</text>
  19. <text class="column">{{item.priority}}</text>
  20. <view class="link-column">
  21. <!-- 操作是固定的 url:是链接到我们需要的界面区域信息表单 -->
  22. <!--传递了参数,areaId-->
  23. <navigator class="link" url="../operation/operation?areaId={{item.areaId}}">编辑</navigator>|
  24. <!-- 点击删除,会启动事件deleteArea 它会读取控件里的areaId 还有 areaName ,删除之后也要删除界面里的一条信息-->
  25. <text class="link" bindtap="deleteArea" data-areaid="{{item.areaId}}" data-areaname="{{item.areaName}}" data-index="{{index}}">删除</text>
  26. </view>
  27. </view>
  28. </view>
  29. </block>
  30. </view>
  31. </scroll-view>
  32. <!-- tap与点击相关 -->
  33. <button type="primary" bindtap="addArea">添加区域信息</button>
  34. </view>

 list.wxss:

  1. /* pages/list/list.wxss */
  2. .widget {
  3. position: relative;
  4. margin-top: 5rpx;
  5. margin-bottom: 5rpx;
  6. padding-top: 10rpx;
  7. padding-bottom: 10rpx;
  8. padding-left: 40rpx;
  9. padding-right: 40rpx;
  10. border: #ddd 1px solid;
  11. }
  12. .container {
  13. height: 100%;
  14. display: table;
  15. align-items: center;
  16. justify-content: space-between;
  17. box-sizing: border-box;
  18. padding-top: 10rpx;
  19. padding-bottom: 10rpx;
  20. text-align: center;
  21. }
  22. .column {
  23. width: 4rem;
  24. display: table-cell;
  25. }
  26. .link-column {
  27. width: 6rem;
  28. display: table-cell;
  29. }
  30. .link {
  31. color: blue;
  32. display: inline-table;
  33. }

list.js

  1. // pages/list/list.js
  2. Page({
  3. /**
  4. * 页面的初始数据,wxml想读取的list,就是从data中获取
  5. */
  6. data: {
  7. list: []
  8. },
  9. /**
  10. * 生命周期函数--监听页面加载
  11. * -当页面加载时,就会触发里面的方法
  12. */
  13. onLoad: function (options) {
  14. },
  15. /**
  16. * 生命周期函数--监听页面初次渲染完成
  17. */
  18. onReady: function () {
  19. },
  20. /**
  21. * 生命周期函数--监听页面显示
  22. * 当页面显示时,就会触发里面的方法
  23. */
  24. onShow: function () {
  25. var that = this;
  26. //第一个this,表示的是整个页面
  27. // 访问后台,获取区域信息
  28. wx.request({
  29. //url去访问后台的方法,获取它的areaList的值,127.0.0.1,端口8080,生效的是demo/superadmin/listarea
  30. url: "http://127.0.0.1:8080/demo/superadmin/listarea",
  31. data: {},
  32. //访问方法
  33. method: 'GET',
  34. //访问成功之后需要做的事情
  35. success: function (res) {
  36. var list = res.data.areaList;
  37. if (list == null) {
  38. //弹出获取失败
  39. var toastText = '获取数据失败' + res.data.errMsg;
  40. wx.showToast({
  41. title: toastText,
  42. icon: '',
  43. // 出错窗口,弹出两秒钟
  44. duration: 2000
  45. });
  46. } else {
  47. //此时this变化,所以要用最开始的this(that)才能够设置上data里面的list
  48. that.setData({
  49. list: list
  50. });
  51. }
  52. }
  53. })
  54. },
  55. /**
  56. * 生命周期函数--监听页面隐藏
  57. */
  58. onHide: function () {
  59. },
  60. /**
  61. * 生命周期函数--监听页面卸载
  62. */
  63. onUnload: function () {
  64. },
  65. /**
  66. * 页面相关事件处理函数--监听用户下拉动作
  67. */
  68. onPullDownRefresh: function () {
  69. },
  70. /**
  71. * 页面上拉触底事件的处理函数
  72. */
  73. onReachBottom: function () {
  74. },
  75. /**
  76. * 用户点击右上角分享
  77. */
  78. onShareAppMessage: function () {
  79. },
  80. addArea: function () {
  81. //跳转界面,但是没有传参
  82. wx.navigateTo({
  83. url: '../operation/operation',
  84. })
  85. },
  86. deleteArea: function (e) {
  87. //保存窗口
  88. var that = this;
  89. //判断是否进行操作
  90. wx.showModal({
  91. title: '提示',
  92. //区域名的获取通过,这里传入的参数是e,e代表的是控键text
  93. content: '确定要删除[' + e.target.dataset.areaname + ']吗?',
  94. //用户点击确认就能访问后台
  95. success: function (sm) {
  96. if (sm.confirm) {
  97. // 用户点击了确定 可以调用删除方法了
  98. wx.request({
  99. url: "http://127.0.0.1:8080/demo/superadmin/removearea",
  100. //传入areaId
  101. data: { "areaId": e.target.dataset.areaid },
  102. method: 'GET',
  103. success: function (res) {
  104. //一旦返回获取result,获取success的字段
  105. var result = res.data.success
  106. var toastText = "删除成功!";
  107. if (result != true) {
  108. toastText = "删除失败" + res.data.errMsg;
  109. } else{
  110. //删除成功也需要将list原来的数据删除,index表示数组的第几行,删除1个
  111. that.data.list.splice(e.target.dataset.index, 1)
  112. //渲染数据
  113. //删除成功之后,重新setData
  114. that.setData({
  115. list: that.data.list
  116. });
  117. }
  118. //不管删除是否成功,都会弹出我们之前提前设定好的toastText
  119. wx.showToast({
  120. title: toastText,
  121. icon: '',
  122. //弹出两秒钟
  123. duration: 2000
  124. });
  125. }
  126. })
  127. }
  128. }
  129. })
  130. }
  131. })

onLoad与onShow的区别,即页面的加载与显示的区别:

当我们从operation返回list界面时,不会触发onLoad,只会触发onShow,通过触发列表访问方法,来更新此时我们页面最新的信息。所以我们要在onShow里面编写我们的方法。

勾选上:不校验合法域名等,此时我们才能使url有效,因为vx不会默认端口访问 


 列表页前后端联调

选择list.js,打开调试器,进行断点调试

第一个断点设置在deleteArea方法内

 我们还要在后台进行调试,即removerarea,这里设置一个断点,注意用debug的形式启动

启动好之后,回到我们的页面,选择删除东苑,它就会进入到我们deleteArea里设置好的断点,

我们可以查看this里面就是页面句柄。

 点击F10进入下一步,这里它就会弹出窗口,提示你是否删除东苑。

第二步将断点打在97行,就是if里面,如果用户操作点击了确定,点击F8跳入我们的下一个断点,

如果没有跳断点,就执行完所有的。它通过判断confirm,我们这里是true,所以就会wx.request去访问我们的后台。

接着我们要在在success方法里设置断点,因为它这时候会访问我们的后台,断点就会进入我们的后台方法中,执行完之后,才会返回来。

这里进入到我们idea的断点中,我们在idea中做调试,此时areaId传进来了,为1.

我们直接点击step over(F8)

我们可以看见modelMap, key为success,value为true,表示删除操作成功。我们完成了验证。接着我们跳出后台,就能发现我们的断点来到了103行,这里的success为true。

点击F10下一步删除成功,我们调用setData更新List,之后showToast,它将删除成功的弹窗弹出。

这里就完成了我们区域列表的开发。


 信息编辑页开发

区域信息添加

区域信息更新

operation的编写

 operation.wxml:

  1. <!--pages/operation.wxml-->
  2. <view class="container">
  3. <!-- 属性绑定formSubmit方法,bindreset绑定框架默认自带的formReset,会自动清空里面的内容,包括区域名 -->
  4. <!-- formSubmit需要我们自己去编写 -->
  5. <form bindsubmit="formSubmit" bindreset="formReset">
  6. <view class="row">
  7. <text>区域名:</text>
  8. <input type="text" name="areaName" placeholder="请输入区域名" value="{{areaName}}" />
  9. </view>
  10. <view class="row">
  11. <text>优先级:</text>
  12. <input type="number" name="priority" placeholder="数值越大越靠前" value="{{priority}}" />
  13. </view>
  14. <view class="row">
  15. <button type="primary" form-type="submit">提交</button>
  16. <!-- 点击,框架自带的formReset就会清空 -->
  17. <button type="primary" form-type="reset">清空</button>
  18. </view>
  19. </form>
  20. </view>

 operation.js:

  1. // pages/operation.js
  2. Page({
  3. /**
  4. * 页面的初始数据
  5. * 需要用到的全局变量放在这里
  6. */
  7. data: {
  8. // list里面我们会通过点击添加或者点击编辑进入到这个界面,我们通过有没有携带areaId参数来判断。
  9. areaId: undefined,
  10. areaName: '',
  11. priority: '',
  12. // 访问我们后台区域和修改区域的url
  13. addUrl: "http://127.0.0.1:8080/demo/superadmin/addarea",
  14. modifyUrl: "http://127.0.0.1:8080/demo/superadmin/modifyarea"
  15. },
  16. /**
  17. * 生命周期函数--监听页面加载
  18. */
  19. //这里用onLoad是因为这个界面没有返回按钮,每次打开它都是重新加载,当然用onShow也可以
  20. onLoad: function (options) {
  21. var that = this;
  22. // 页面初始化 options为页面跳转所带来的参数
  23. this.setData({
  24. areaId: options.areaId
  25. });
  26. if (options.areaId == undefined) {
  27. return;
  28. }
  29. wx.request({
  30. url: "http://127.0.0.1:8080/demo/superadmin/getareabyid",
  31. data: { "areaId": options.areaId },
  32. method: 'GET',
  33. success: function (res) {
  34. var area = res.data.area;
  35. if (area == undefined) {
  36. var toastText = '获取数据失败' + res.data.errMsg;
  37. wx.showToast({
  38. title: toastText,
  39. icon: '',
  40. duration: 2000
  41. });
  42. } else {
  43. that.setData({
  44. areaName: area.areaName,
  45. priority: area.priority
  46. });
  47. }
  48. }
  49. })
  50. },
  51. /**
  52. * 生命周期函数--监听页面初次渲染完成
  53. */
  54. onReady: function () {
  55. },
  56. /**
  57. * 生命周期函数--监听页面显示
  58. */
  59. onShow: function () {
  60. },
  61. /**
  62. * 生命周期函数--监听页面隐藏
  63. */
  64. onHide: function () {
  65. },
  66. /**
  67. * 生命周期函数--监听页面卸载
  68. */
  69. onUnload: function () {
  70. },
  71. /**
  72. * 页面相关事件处理函数--监听用户下拉动作
  73. */
  74. onPullDownRefresh: function () {
  75. },
  76. /**
  77. * 页面上拉触底事件的处理函数
  78. */
  79. onReachBottom: function () {
  80. },
  81. /**
  82. * 用户点击右上角分享
  83. */
  84. onShareAppMessage: function () {
  85. },
  86. //参数e表示表单
  87. formSubmit: function (e) {
  88. var that = this;
  89. //这个formData的json数据就是表单里的areaName,priorty的值
  90. var formData = e.detail.value;
  91. var url = that.data.addUrl;
  92. if (that.data.areaId != undefined) {
  93. //不为undefined,就是编辑的
  94. formData.areaId = that.data.areaId;
  95. url = that.data.modifyUrl;
  96. }
  97. //进入后台
  98. wx.request({
  99. url: url,
  100. //通过JSON.stringify将json转化为字符串的形式
  101. //formData如果为添加,仅有areaName和priority,如果是更改,还多了一个areaId
  102. data: JSON.stringify(formData),
  103. method: 'POST',
  104. header: {
  105. 'Content-Type': 'application/json'
  106. },
  107. //添加或者更改成功就会返回一给success
  108. success: function (res) {
  109. var result = res.data.success
  110. var toastText = "操作成功!";
  111. if (result != true) {
  112. toastText = "操作失败" + res.data.errMsg;
  113. }
  114. wx.showToast({
  115. title: toastText,
  116. icon: '',
  117. duration: 2000
  118. });
  119. //这里一旦提交成功,它就会返回我们的list页面
  120. if (that.data.areaId == undefined) {
  121. wx.redirectTo({
  122. url: '../list/list',
  123. })
  124. }
  125. }
  126. })
  127. }
  128. })

operation.wxss:

  1. /* pages/operation/operation.wxss */
  2. .container{
  3. padding: 1rem;
  4. font-size: 0.9rem;
  5. line-height: 1.5rem;
  6. }
  7. .row{
  8. display: flex;
  9. align-items: center;
  10. margin-bottom: 0.8rem;
  11. }
  12. .row text{
  13. flex-grow: 1;
  14. text-align: right;
  15. }
  16. .row input{
  17. font-size: 0.7rem;
  18. flex-grow: 3;
  19. border: 1px solid #0099CC;
  20. display: inline-block;
  21. border-radius: 0.3rem;
  22. box-shadow: 0 0 0.15rem #aaa;
  23. padding: 0.3rem;
  24. }
  25. .row button{
  26. padding: 0 2rem;
  27. margin: 3rem 1rem;
  28. }

区域信息编辑页的联调

设置断点

 

 后台也要设置想应断点

 开始调试:

 获取到了area信息

 f8获取,发现数据被填充进来

 修改优先级为3,

 

 后台接收到了。最后f8,发现更新成功。

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

闽ICP备14008679号