转自:https://idig8.com/2018/09/09/xiaochengxujavashizhanxiaochengxutouxiangtupianshangchuan44/

接下来,我们应该通过用户的id,调用后端的接口,查询出来点赞的数量,关注的数量,粉丝数量,直接更新头像图片。源码:https://github.com/limingios/wxProgram.git 中wx-springboot 和 No.15

后端开发

spring boot-service 增加通过user的id,获得Users的方法

  • UserService.java
  1. package com.idig8.service;
  2. import com.idig8.pojo.Users;
  3. public interface UserService {
  4. /**
  5. * 判断用户名是否存在
  6. * @param username
  7. * @return
  8. */
  9. public boolean queryUsernameIsExist(String username);
  10. /**
  11. * 保存用户
  12. * @param user
  13. * @return
  14. */
  15. public void saveUser(Users user);
  16. /**
  17. * 查询用户对象
  18. * @param username
  19. * @return
  20. */
  21. public Users queryUserIsExist(Users user);
  22. /**
  23. * 更新对象
  24. * @param username
  25. * @return
  26. */
  27. public void updateUser(Users user);
  28. /**
  29. * userId查询用户对象
  30. * @param username
  31. * @return
  32. */
  33. public Users queryUserId(String userId);
  34. }

  • UserServiceImpl.java
  1. package com.idig8.service;
  2. import org.n3r.idworker.Sid;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.boot.autoconfigure.security.SecurityProperties.User;
  5. import org.springframework.stereotype.Service;
  6. import org.springframework.transaction.annotation.Propagation;
  7. import org.springframework.transaction.annotation.Transactional;
  8. import com.idig8.mapper.UsersMapper;
  9. import com.idig8.pojo.Users;
  10. import com.idig8.utils.MD5Utils;
  11. import tk.mybatis.mapper.entity.Example;
  12. import tk.mybatis.mapper.entity.Example.Criteria;
  13. @Service
  14. public class UserServiceImpl implements UserService {
  15. @Autowired
  16. private UsersMapper usersMapper;
  17. @Autowired
  18. private Sid sid;
  19. @Transactional(propagation =Propagation.SUPPORTS)
  20. @Override
  21. public boolean queryUsernameIsExist(String username) {
  22. Users user = new Users();
  23. user.setUsername(username);
  24. Users result = usersMapper.selectOne(user);
  25. return result==null? false:true;
  26. }
  27. @Transactional(propagation =Propagation.REQUIRED)
  28. @Override
  29. public void saveUser(Users user) {
  30. String userId =sid.nextShort();
  31. user.setId(userId);
  32. usersMapper.insert(user);
  33. }
  34. @Transactional(propagation =Propagation.SUPPORTS)
  35. @Override
  36. public Users queryUserIsExist(Users user) {
  37. Example queryExample = new Example(Users.class);
  38. Criteria criteria = queryExample.createCriteria();
  39. criteria.andEqualTo("username",user.getUsername());
  40. try {
  41. criteria.andEqualTo("password",MD5Utils.getMD5Str(user.getPassword()));
  42. } catch (Exception e) {
  43. // TODO Auto-generated catch block
  44. e.printStackTrace();
  45. }
  46. Users userOne = usersMapper.selectOneByExample(queryExample);
  47. return userOne;
  48. }
  49. @Transactional(propagation =Propagation.REQUIRED)
  50. @Override
  51. public void updateUser(Users user) {
  52. Example userExample = new Example(Users.class);
  53. Criteria criteria = userExample.createCriteria();
  54. criteria.andEqualTo("id", user.getId());
  55. usersMapper.updateByExampleSelective(user, userExample);
  56. }
  57. @Transactional(propagation =Propagation.SUPPORTS)
  58. @Override
  59. public Users queryUserId(String userId){
  60. Example queryExample = new Example(Users.class);
  61. Criteria criteria = queryExample.createCriteria();
  62. criteria.andEqualTo("id",userId);
  63. Users userOne = usersMapper.selectOneByExample(queryExample);
  64. return userOne;
  65. }
  66. }

  • spring boot -api 中 在UserController中添加方法

增加controller 接口,传递user中的id参数

  1. package com.idig8.controller;
  2. import org.apache.commons.lang3.StringUtils;
  3. import org.springframework.beans.BeanUtils;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.beans.factory.annotation.Value;
  6. import org.springframework.web.bind.annotation.PostMapping;
  7. import org.springframework.web.bind.annotation.RequestMapping;
  8. import org.springframework.web.bind.annotation.RequestParam;
  9. import org.springframework.web.bind.annotation.RestController;
  10. import org.springframework.web.multipart.MultipartFile;
  11. import com.idig8.pojo.Users;
  12. import com.idig8.pojo.vo.UsersVO;
  13. import com.idig8.service.UserService;
  14. import com.idig8.utils.JSONResult;
  15. import com.idig8.utils.file.FileUtil;
  16. import io.swagger.annotations.Api;
  17. import io.swagger.annotations.ApiImplicitParam;
  18. import io.swagger.annotations.ApiImplicitParams;
  19. import io.swagger.annotations.ApiOperation;
  20. @RestController
  21. @Api(value="用户接口",tags={"用户的controller"})
  22. @RequestMapping(value = "/user")
  23. public class UserController extends BasicController{
  24. @Autowired
  25. private UserService userService;
  26. @Value("${server.face.path}")
  27. private String fileSpace;
  28. @ApiOperation(value="用户上传头像",notes="用户上传头像的接口")
  29. @ApiImplicitParams({
  30. @ApiImplicitParam(name="userId",value="用户id",required=true,dataType="String",paramType="query"),
  31. @ApiImplicitParam(name="file",value="文件上传",required=true,dataType="String",paramType="query"),
  32. })
  33. @PostMapping("/uploadFace")
  34. public JSONResult uploadFace(String userId,@RequestParam("file") MultipartFile file) {
  35. if (StringUtils.isBlank(userId)) {
  36. return JSONResult.errorMsg("用户id不能为空...");
  37. }
  38. // 文件保存的命名空间
  39. String fileName = file.getOriginalFilename();
  40. // 保存到数据库中的相对路径
  41. String path = "";
  42. try {
  43. path = FileUtil.uploadFile(file.getBytes(), fileSpace, fileName);
  44. } catch (Exception e) {
  45. e.getStackTrace();
  46. return JSONResult.errorMsg(e.getMessage());
  47. }
  48. Users user = new Users();
  49. user.setId(userId);
  50. user.setFaceImage(path);
  51. userService.updateUser(user);
  52. return JSONResult.ok(path);
  53. }
  54. @ApiOperation(value="通过用户Id获取用户信息",notes="通过用户Id获取用户信息的接口")
  55. @ApiImplicitParam(name="userId",value="用户id",required=true,dataType="String",paramType="query")
  56. @PostMapping("/queryByUserId")
  57. public JSONResult queryByUserId(String userId) {
  58. if (StringUtils.isBlank(userId)) {
  59. return JSONResult.errorMsg("用户id不能为空...");
  60. }
  61. Users user = userService.queryUserId(userId);
  62. UsersVO usersVO= new UsersVO();
  63. BeanUtils.copyProperties(user, usersVO);
  64. return JSONResult.ok(usersVO);
  65. }
  66. }

  • 运行后端项目,查看swagger2的效果

小程序开发

主要通过的是小程序生命周期中的onload方法,当进入页面的时候请求后台获取信息,用于页面的展示。

  1. // pages/mine/mine.js
  2. const app = getApp()
  3. Page({
  4. /**
  5. * 页面的初始数据
  6. */
  7. data: {
  8. faceImage: "../../resource/images/noneface.png",
  9. nickname: "昵称",
  10. fansCounts: 0,
  11. followCounts: 0,
  12. receiveLikeCounts: 0,
  13. },
  14. /**
  15. * 用户注销
  16. */
  17. logout:function(e){
  18. var user = app.userInfo;
  19. wx.showLoading({
  20. title: '正在注销中。。。'
  21. });
  22. wx.request({
  23. url: app.serverUrl + "/logout?userId="+user.id,
  24. method: "POST",
  25. header: {
  26. 'content-type': 'application/json' // 默认值
  27. },
  28. success: function (res) {
  29. console.log(res.data);
  30. var status = res.data.status;
  31. wx.hideLoading();
  32. if (status == 200) {
  33. wx.showToast({
  34. title: "用户注销成功~!",
  35. icon: 'none',
  36. duration: 3000
  37. })
  38. app.userInfo = null;
  39. wx.redirectTo({
  40. url: '../userRegister/userRegister',
  41. })
  42. } else if (status == 500) {
  43. wx.showToast({
  44. title: res.data.msg,
  45. icon: 'none',
  46. duration: 3000
  47. })
  48. }
  49. }
  50. })
  51. },
  52. /**
  53. * 头像上传
  54. */
  55. uploadFace:function(e){
  56. var user = app.userInfo;
  57. var me = this;
  58. wx.chooseImage({
  59. count: 1, // 默认9
  60. sizeType: ['compressed'], // 可以指定是原图还是压缩图,默认二者都有
  61. sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有
  62. success: function (res) {
  63. // 返回选定照片的本地文件路径列表,tempFilePath可以作为img标签的src属性显示图片
  64. var tempFilePaths = res.tempFilePaths
  65. if (tempFilePaths.length>0){
  66. console.log(tempFilePaths[0]);
  67. wx.uploadFile({
  68. url: app.serverUrl + "/user/uploadFace?userId=" + user.id, //仅为示例,非真实的接口地址
  69. filePath: tempFilePaths[0],
  70. name: 'file',
  71. success: function (res) {
  72. var data = JSON.parse(res.data);
  73. console.log(data);
  74. wx.hideLoading();
  75. if (data.status == 200) {
  76. wx.showToast({
  77. title: "用户上传成功~!",
  78. icon: 'none',
  79. duration: 3000
  80. })
  81. me.setData({
  82. faceUrl: app.serverUrl+data.data
  83. })
  84. } else if (data.status == 500) {
  85. wx.showToast({
  86. title: data.msg,
  87. icon: 'none',
  88. duration: 3000
  89. })
  90. }
  91. }
  92. })
  93. }
  94. }
  95. })
  96. },
  97. /**
  98. * 生命周期函数--监听页面加载
  99. */
  100. onLoad: function (options) {
  101. var me = this;
  102. wx.showLoading({
  103. title: '正在获取用户信息。。。'
  104. });
  105. wx.request({
  106. url: app.serverUrl + "/user/queryByUserId?userId=" + app.userInfo.id,
  107. method: "POST",
  108. header: {
  109. 'content-type': 'application/json' // 默认值
  110. },
  111. success: function (res) {
  112. console.log(res.data);
  113. var status = res.data.status;
  114. var userInfo = res.data.data;
  115. wx.hideLoading();
  116. var faceImage = me.data.faceUrl;
  117. if (userInfo.faceImage != null && userInfo.faceImage != '' && userInfo.faceImage!=undefined){
  118. faceImage = app.serverUrl +userInfo.faceImage;
  119. }
  120. me.setData({
  121. faceImage: faceImage,
  122. fansCounts: userInfo.fansCounts,
  123. followCounts: userInfo.followCounts,
  124. receiveLikeCounts: userInfo.receiveLikeCounts,
  125. nickname: userInfo.nickname
  126. })
  127. }
  128. })
  129. },
  130. /**
  131. * 生命周期函数--监听页面初次渲染完成
  132. */
  133. onReady: function () {
  134. },
  135. /**
  136. * 生命周期函数--监听页面显示
  137. */
  138. onShow: function () {
  139. },
  140. /**
  141. * 生命周期函数--监听页面隐藏
  142. */
  143. onHide: function () {
  144. },
  145. /**
  146. * 生命周期函数--监听页面卸载
  147. */
  148. onUnload: function () {
  149. },
  150. /**
  151. * 页面相关事件处理函数--监听用户下拉动作
  152. */
  153. onPullDownRefresh: function () {
  154. },
  155. /**
  156. * 页面上拉触底事件的处理函数
  157. */
  158. onReachBottom: function () {
  159. },
  160. /**
  161. * 用户点击右上角分享
  162. */
  163. onShareAppMessage: function () {
  164. }
  165. })

PS:这个小程序获取用户信息和后端的一个联调。

「小程序JAVA实战」小程序头像图片上传(下)(45)的更多相关文章

  1. 「小程序JAVA实战」小程序的举报功能开发(68)

    转自:https://idig8.com/2018/09/25/xiaochengxujavashizhanxiaochengxudeweixinapicaidancaozuo66-2/ 通过点击举报 ...

  2. 「小程序JAVA实战」小程序的个人信息作品,收藏,关注(66)

    转自:https://idig8.com/2018/09/24/xiaochengxujavashizhanxiaochengxudegerenxinxizuopinshoucangguanzhu65 ...

  3. 「小程序JAVA实战」小程序的关注功能(65)

    转自:https://idig8.com/2018/09/24/xiaochengxujavashizhanxiaochengxudeguanzhugongneng64/ 在个人页面,根据发布者个人和 ...

  4. 「小程序JAVA实战」小程序的视频点赞功能开发(62)

    转自:https://idig8.com/2018/09/24/xiaochengxujavashizhanxiaochengxudeshipindianzangongnengkaifa61/ 视频点 ...

  5. 「小程序JAVA实战」小程序的springboot后台拦截器(61)

    转自:https://idig8.com/2018/09/24/xiaochengxujavashizhanxiaochengxudespringboothoutailanjieqi60/ 之前咱们把 ...

  6. 「小程序JAVA实战」小程序首页视频(49)

    转自:https://idig8.com/2018/09/21/xiaochengxujavashizhanxiaochengxushouyeshipin48/ 视频显示的内容是视频的截图,用户的头像 ...

  7. 「小程序JAVA实战」小程序视频封面处理(48)

    转自:https://idig8.com/2018/09/16/xiaochengxujavashizhanxiaochengxushipinfengmianchuli47/ 截图这块,在微信小程序工 ...

  8. 「小程序JAVA实战」小程序上传短视频(46)

    转自:https://idig8.com/2018/09/14/xiaochengxujavashizhanxiaochengxushangchuanduanshipin45/ 个人信息:用户上传短视 ...

  9. 「小程序JAVA实战」小程序头像图片上传(上)(43)

    转自:https://idig8.com/2018/09/08/xiaochengxujavashizhanxiaochengxutouxiangtupianshangchuan40/ 在微信小程序中 ...

随机推荐

  1. nodejs调用百度统计api摆脱人肉数据统计

    var http = require("https"); var url = require('url'); var postData = JSON.stringify( { &q ...

  2. js检测三角形是否包含一个点

    pointInTriangle:function(x0, y0, x1, y1, x2, y2, x3, y3) { var divisor = (y2 - y3)*(x1 - x3) + (x3 - ...

  3. Struts标签库详解,非常好的Struts标签详解

    Struts提供了五个标签库,即:HTML.Bean.Logic.Template和Nested. HTML 标签:         用来创建能够和Struts 框架和其他相应的HTML 标签交互的H ...

  4. 拷贝ssh公钥到多台服务器上

    这篇文章几乎是对Push SSH public keys to multiple host的翻译,谢谢该作者. 使用SSH登陆.执行命令到远程机器需要输入密码,很多系统需要免输密码访问远程机器,比如h ...

  5. BZOJ3209 花神的数论题 【组合数学+数位DP+快速幂】*

    BZOJ3209 花神的数论题 Description 背景 众所周知,花神多年来凭借无边的神力狂虐各大 OJ.OI.CF.TC …… 当然也包括 CH 啦. 描述 话说花神这天又来讲课了.课后照例有 ...

  6. Codeforces 382E Ksenia and Combinatorics 【组合计数】*

    Codeforces 382E Ksenia and Combinatorics Ksenia has her winter exams. Today she is learning combinat ...

  7. python 正则表达式字符说明

    . 元字符 说明 . 代表任意字符 | 逻辑或操作符 [ ] 匹配内部的任一字符或子表达式 [^] 对字符集和取非 - 定义一个区间 \ 对下一字符取非(通常是普通变特殊,特殊变普通) * 匹配前面的 ...

  8. MySQL 根据身份证查找年龄段

    SELECT       idcard,YEAR (NOW()) - substring(idcard, 7, 4) as nFROM es_members where idcard >0 HA ...

  9. 关于fpga优化的set input delay 和 set output delay

    set input delay 和set output delay 首先必须明确的是指的外部delay,而非input或output的内部delay,那么这外部delay包含什么呢?包含1,外部路径延 ...

  10. IDEA使用介绍

    https://blog.csdn.net/qq_27093465/article/details/77449117