微信小程序> 基于java的微信小程序的实现二登录注册注销接口的实现-微信小程序能注销吗-微信解绑小程序

基于java的微信小程序的实现二登录注册注销接口的实现-微信小程序能注销吗-微信解绑小程序

浏览量:2055 时间: 来源:lexBBQ
文章目录1.开发工具以及相关环境的配置2.编写注册接口1.在api中创建一个专门提供注册和登录接口的controller2.然后在公共模块中创建一个用来返回给前端结果的工具类,密码加密md5工具类,redis工具类3.注册的需求分析4.代码实现3.编写用户登录的接口1.登录需求分析2.代码实现4.编写用户注销接口1.需求分析2.代码实现1.开发工具以及相关环境的配置1.

1.首先关于IDE,前端小程序端采用的是微信官方的微信开发者工具,后端使用的是idea(idea是真的智能,再也不想回去eclipse了呢),关于前端的一些代码,主要是参照微信官方的API进行开发的,整体的文件结构也和js,css,html也很相似。

2.

2.关于测试环境的配置,因为小程序的调试需要认证的https域名才能进行调试,在pc端调试需要开启debug模式,所以相关功能测试,我是使用的内网穿透工具,这样就可以实现在手机端的测试访问

3.

3.为了开发方便,在后台搭建的为聚合工程项目结构如下

api模块为直接给前端调用的所有接口common模块用来存放一些公共的工具类,以及项目所需要的全部依赖mapper用来存放jap的dao接口pojo用来存放对应数据库的实体类以及对应前端数据需要返回的一些特定的Vo包装类service用来存放项目的服务层接口和实现类4.

4.编写项目的配置文件,为了方便开发,项目采用yml文件的格式

spring:datasource:username:rootpassword:rooturl:jdbc:mysql://localhost:3306/videos?useUnicodetruecharacterEncodingutf8driver-class-name:com.mysql.jdbc.Driverhttp:multipart:max-file-size:100Mbmax-request-size:100Mbjpa:show-sql:true5.

注:useUnicodetrue,这个在配置的时候一定要加上,就因为之前开发时候没有写这个配置,导致中文数据存到数据库里面全都是问好,而且查询语句还无法查询到,当时我找了大半天才解决,切记一定要加上!!!

2.编写注册接口1.在api中创建一个专门提供注册和登录接口的controller2.然后在公共模块中创建一个用来返回给前端结果的工具类,密码加密md5工具类,redis工具类importlombok.Data;/***@Description:自定义响应数据结构*这个类是提供给门户,ios,安卓,微信商城用的*门户接受此类数据后需要使用本类的方法转换成对于的数据类型格式(类,或者list)*其他自行处理*200:表示成功*500:表示错误,错误信息在msg字段中*501:bean验证错误,不管多少个错误都以map形式返回*502:拦截器拦截到用户token出错*555:异常抛出信息*/@DatapublicclassLexJSONResult{//响应业务状态privateIntegerstatus;//响应消息privateStringmsg;//响应中的数据privateObjectdata;privateStringok;publicstaticLexJSONResultbuild(Integerstatus,Stringmsg,Objectdata){returnnewLexJSONResult(status,msg,data);}publicstaticLexJSONResultok(Objectdata){returnnewLexJSONResult(data);}publicstaticLexJSONResultok(){returnnewLexJSONResult(null);}publicstaticLexJSONResulterrorMsg(Stringmsg){returnnewLexJSONResult(500,msg,null);}publicstaticLexJSONResulterrorMap(Objectdata){returnnewLexJSONResult(501,"error",data);}publicstaticLexJSONResulterrorTokenMsg(Stringmsg){returnnewLexJSONResult(502,msg,null);}publicstaticLexJSONResulterrorException(Stringmsg){returnnewLexJSONResult(555,msg,null);}publicLexJSONResult(){}publicLexJSONResult(Integerstatus,Stringmsg,Objectdata){this.statusstatus;this.msgmsg;this.datadata;}publicLexJSONResult(Objectdata){this.status200;this.msg"OK";this.datadata;}}publicclassMD5Utils{/***@Description:对字符串进行md5加密*/publicstaticStringgetMD5Str(StringstrValue)throwsException{MessageDigestmd5MessageDigest.getInstance("MD5");StringnewstrBase64.encodeBase64String(md5.digest(strValue.getBytes()));returnnewstr;}publicstaticvoidmain(String[]args){try{Stringmd5getMD5Str("imooc");System.out.println(md5);}catch(Exceptione){e.printStackTrace();}}}@ComponentpublicclassRedisOperator{//@Autowired//privateRedisTemplateString,ObjectredisTemplate;@AutowiredprivateStringRedisTemplateredisTemplate;//Key(键),简单的key-value操作/***实现命令:TTLkey,以秒为单位,返回给定key的剩余生存时间(TTL,timetolive)。**@paramkey*@return*/publiclongttl(Stringkey){returnredisTemplate.getExpire(key);}/***实现命令:expire设置过期时间,单位秒**@paramkey*@return*/publicvoidexpire(Stringkey,longtimeout){redisTemplate.expire(key,timeout,TimeUnit.SECONDS);}/***实现命令:INCRkey,增加key一次**@paramkey*@return*/publiclongincr(Stringkey,longdelta){returnredisTemplate.opsForValue().increment(key,delta);}/***实现命令:KEYSpattern,查找所有符合给定模式pattern的key*/publicSetStringkeys(Stringpattern){returnredisTemplate.keys(pattern);}/***实现命令:DELkey,删除一个key**@paramkey*/publicvoiddel(Stringkey){redisTemplate.delete(key);}//String(字符串)/***实现命令:SETkeyvalue,设置一个key-value(将字符串值value关联到key)**@paramkey*@paramvalue*/publicvoidset(Stringkey,Stringvalue){redisTemplate.opsForValue().set(key,value);}/***实现命令:SETkeyvalueEXseconds,设置key-value和超时时间(秒)**@paramkey*@paramvalue*@paramtimeout*(以秒为单位)*/publicvoidset(Stringkey,Stringvalue,longtimeout){redisTemplate.opsForValue().set(key,value,timeout,TimeUnit.SECONDS);}/***实现命令:GETkey,返回key所关联的字符串值。**@paramkey*@returnvalue*/publicStringget(Stringkey){return(String)redisTemplate.opsForValue().get(key);}//Hash(哈希表)/***实现命令:HSETkeyfieldvalue,将哈希表key中的域field的值设为value**@paramkey*@paramfield*@paramvalue*/publicvoidhset(Stringkey,Stringfield,Objectvalue){redisTemplate.opsForHash().put(key,field,value);}/***实现命令:HGETkeyfield,返回哈希表key中给定域field的值**@paramkey*@paramfield*@return*/publicStringhget(Stringkey,Stringfield){return(String)redisTemplate.opsForHash().get(key,field);}/***实现命令:HDELkeyfield[field...],删除哈希表key中的一个或多个指定域,不存在的域将被忽略。**@paramkey*@paramfields*/publicvoidhdel(Stringkey,Object...fields){redisTemplate.opsForHash().delete(key,fields);}/***实现命令:HGETALLkey,返回哈希表key中,所有的域和值。**@paramkey*@return*/publicMapObject,Objecthgetall(Stringkey){returnredisTemplate.opsForHash().entries(key);}//List(列表)/***实现命令:LPUSHkeyvalue,将一个值value插入到列表key的表头**@paramkey*@paramvalue*@return执行LPUSH命令后,列表的长度。*/publiclonglpush(Stringkey,Stringvalue){returnredisTemplate.opsForList().leftPush(key,value);}/***实现命令:LPOPkey,移除并返回列表key的头元素。**@paramkey*@return列表key的头元素。*/publicStringlpop(Stringkey){return(String)redisTemplate.opsForList().leftPop(key);}/***实现命令:RPUSHkeyvalue,将一个值value插入到列表key的表尾(最右边)。**@paramkey*@paramvalue*@return执行LPUSH命令后,列表的长度。*/publiclongrpush(Stringkey,Stringvalue){returnredisTemplate.opsForList().rightPush(key,value);}}3.注册的需求分析首先我需要前端传来一个User对象对传来的对象进行非空判断,如果对象的用户名或者密码为空的话就返回一个带有错误信息的结果类,并传入,用户信息不能空然后要判断该用户是否已经被注册过了,如果已经存在返回给前端用户已被注册信息需要对密码进行加密,使用封装好的md5工具类,对前端传过来的密码进行加密,并存入数据库使用UUID生成一个该用户的一个唯一的token,把USER:+用户的id作为redis的key,该token作为value存入redis中,并设置过期时间为30分钟4.代码实现6.

dao层代码

publicinterfaceUsersDaoextendsJpaRepositoryUsers,String{}7.

service层代码

/***根据传入的用户的用户名在数据库中进行查找*如果该用户存在就将该用户返回,如果不存在则返回的就为null*@paramusers用户的pojo类*@return*/@OverridepublicUsersfindUserIsExist(Usersusers){UsersunewUsers();u.setUsername(users.getUsername());ExampleUsersexampleExample.of(u);returnusersDao.findOne(example);}/***将用户信息存入数据库*@paramusers*@return*/@Override@TransactionalpublicUserssave(Usersusers){users.setId(IdUtils.getId());returnusersDao.save(users);}8.

controller层代码

@AutowiredprivateUserServiceuserService;@AutowiredprivateRedisOperatorredisOperator;publicfinalStringUSERSESSIONID"user-session-id";@ApiOperation(value"用户注册",notes"用户注册的接口")@PostMapping("/regist")publicLexJSONResultregist(@RequestBodyUsersusers)throwsException{//1.判断用户名和密码是否为空if(StringUtils.isEmpty(users.getUsername())){returnLexJSONResult.errorMsg("用户名不能为空");}if(StringUtils.isEmpty(users.getPassword())){returnLexJSONResult.errorMsg("密码不能为空");}//2.查询数据库看该用户名是否已经被注册UsersuserIsExistuserService.findUserIsExist(users);//如果为空说明没有注册过if(!StringUtils.isEmpty(userIsExist)){returnLexJSONResult.errorMsg("该用户名已经被注册");}//3.初始化用户信息,并存入数据库Stringmd5StrMD5Utils.getMD5Str(users.getPassword());users.setPassword(md5Str);users.setNickname(users.getUsername());users.setFansCounts(0);users.setFollowCounts(0);users.setReceiveLikeCounts(0);UserssaveuserService.save(users);save.setPassword("");StringtokenUUID.randomUUID().toString();redisOperator.set(USERSESSIONID+":"+save.getId(),token,60*30);UsersVousersVonewUsersVo();BeanUtils.copyProperties(save,usersVo);//将生成的token信息返回给前端,做一些相关的验证usersVo.setToken(token);returnLexJSONResult.ok();}3.编写用户登录的接口1.登录需求分析接受到前端传来的user对象,首先对该对象进行判断,如果该对象的用户名或者密码为空的话,返回用户名密码不能为空需要判断该用户是否存在,查询数据库,如果不存在返回该用户不存在先获取到用户密码,然后通过md5加密生成的加密字符串存入该对象,通过用户名查询数据库,校验密码是否一致,如果不一致返回密码错误2.代码实现9.

service层的相关代码

/***通过用户名校验用户密码是否正确,如正确则将查询到的对象返回*若果错误则返回null*@paramusers*@return*/@OverridepublicUserscheckPassword(Usersusers){//根据用户名查询用户密码是否正确UsersunewUsers();u.setUsername(users.getUsername());ExampleUsersexampleExample.of(u);UsersoneusersDao.findOne(example);//如果密码相同就将该对象返回,密码正确if(users.getPassword().equals(one.getPassword())){returnone;}//如果返回null,则说明密码错误returnnull;/***将用户信息存入数据库*@paramusers*@return*/@Override@TransactionalpublicUserssave(Usersusers){users.setId(IdUtils.getId());returnusersDao.save(users);}10.

controller层代码实现

@ApiOperation(value"用户登录",notes"用户登录的接口")@PostMapping("/login")publicLexJSONResultlogin(@RequestBodyUsersusers)throwsException{//判断用户名和密码不能为空if(StringUtils.isEmpty(users.getUsername())){returnLexJSONResult.errorMsg("用户名不能为空");}if(StringUtils.isEmpty(users.getPassword())){returnLexJSONResult.errorMsg("密码不能为空");}//查询该用户是否存在UsersuserIsExistuserService.findUserIsExist(users);if(StringUtils.isEmpty(userIsExist)){returnLexJSONResult.errorMsg("对不起,该用户不存在");}//检验密码和用户名是否相符users.setPassword(MD5Utils.getMD5Str(users.getPassword()));UsersuuserService.checkPassword(users);if(StringUtils.isEmpty(u)){returnLexJSONResult.errorMsg("对不起,你输入的密码不正确");}u.setPassword("");UsersVousersVonewUsersVo();BeanUtils.copyProperties(u,usersVo);usersVo.setToken(token);returnLexJSONResult.ok(usersVo);}11.

userVo对象,该类在原有的user类中新添加了一个token字段,返回给前端,用来做后面的一些相关的权限验证

@DatapublicclassUsersVo{@ApiModelProperty(hiddentrue)privateStringid;/***用户登陆后生成的令牌*/privateStringtoken;/***用户名*/@ApiModelProperty(value"用户名",name"username",example"123",requiredtrue)privateStringusername;/***密码*/@ApiModelProperty(value"用户密码",name"password",example"123",requiredtrue)@JsonIgnoreprivateStringpassword;/***我的头像,如果没有默认给一张*/@ApiModelProperty(hiddentrue)privateStringfaceImage;/***昵称*/@ApiModelProperty(hiddentrue)privateStringnickname;/***我的粉丝数量*/@ApiModelProperty(hiddentrue)privateIntegerfansCounts;/***我关注的人总数*/@ApiModelProperty(hiddentrue)privateIntegerfollowCounts;/***我接受到的赞美/收藏的数量*/@ApiModelProperty(hiddentrue)privateIntegerreceiveLikeCounts;}4.编写用户注销接口1.需求分析12.

用户注销接口相对来说比较简单,用户如果调用该接口只需要将redis中用户对应的数据删除即可

2.代码实现@ApiOperation(value"用户注销",notes"用户注销的接口")@ApiImplicitParam(name"id",value"用户id",requiredtrue,dataType"String",paramType"query")@PostMapping("/logout")publicLexJSONResultlogout(Stringid){//将redis中的数据删除redisOperator.del(USERSESSIONID+":"+id);returnLexJSONResult.ok();}

版权声明

即速应用倡导尊重与保护知识产权。如发现本站文章存在版权问题,烦请提供版权疑问、身份证明、版权证明、联系方式等发邮件至197452366@qq.com ,我们将及时处理。本站文章仅作分享交流用途,作者观点不等同于即速应用观点。用户与作者的任何交易与本站无关,请知悉。

产品经理

手机 : 13312967497

擅长 : 小程序流量变现

扫码领取礼包

最新资讯

热门模板

  • 头条
  • 搜狐
  • 微博
  • 百家
  • 一点资讯
  • 知乎