From 7c3facd75b358cbbee94b00f2fdb5bba59666492 Mon Sep 17 00:00:00 2001 From: JoeyG Date: Wed, 16 Nov 2022 11:50:45 +0800 Subject: [PATCH] =?UTF-8?q?wh=E7=9A=84=E5=90=88=E5=B9=B6web=E9=A1=B9?= =?UTF-8?q?=E7=9B=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/demo/pom.xml | 8 +- .../com/example/demo/DemoApplication.java | 2 +- .../com/example/demo/common/GlobalResult.java | 6 +- .../com/example/demo/common/HttpGetUtil.java | 14 +- .../demo/common/util/FormatResponseUtil.java | 47 +++++ .../demo/common/util/ResponseResult.java | 34 ++++ .../config/BaseEntityMetaObjectHandler.java | 33 ++++ .../demo/config/config/MybatisPlusConfig.java | 27 +++ .../example/demo/config/config/WebConfig.java | 19 ++ .../demo/controller/ControllerText.java | 67 ------- .../com/example/demo/controller/Demmo.java | 107 ----------- .../demo/controller/TaskuploadController.java | 7 +- .../demo/controller/UserController.java | 176 ++++++++++++------ .../demo/controller/Webcontroller.java | 164 ++++++++++++++-- .../demo/controller/taskController.java | 47 +++++ .../java/com/example/demo/domain/Rcode.java | 61 ++++++ .../java/com/example/demo/domain/Task.java | 118 ++++++++++++ .../java/com/example/demo/domain/Taskson.java | 5 + .../java/com/example/demo/domain/User.java | 11 +- .../com/example/demo/mapper/RcodeMapper.java | 10 + .../com/example/demo/mapper/TaskMapper.java | 18 ++ .../example/demo/mapper/xml/TaskMapper.xml | 5 + .../example/demo/service/ITaskService.java | 29 +++ .../demo/service/impl/TaskServiceImpl.java | 56 ++++++ src/demo/src/main/resources/application.yaml | 2 +- .../src/main/resources/static/js/logincode.js | 14 ++ .../main/resources/templates/dashboard.html | 1 - .../src/main/resources/templates/list.html | 2 +- 28 files changed, 826 insertions(+), 264 deletions(-) create mode 100644 src/demo/src/main/java/com/example/demo/common/util/FormatResponseUtil.java create mode 100644 src/demo/src/main/java/com/example/demo/common/util/ResponseResult.java create mode 100644 src/demo/src/main/java/com/example/demo/config/config/BaseEntityMetaObjectHandler.java create mode 100644 src/demo/src/main/java/com/example/demo/config/config/MybatisPlusConfig.java create mode 100644 src/demo/src/main/java/com/example/demo/config/config/WebConfig.java delete mode 100644 src/demo/src/main/java/com/example/demo/controller/ControllerText.java delete mode 100644 src/demo/src/main/java/com/example/demo/controller/Demmo.java create mode 100644 src/demo/src/main/java/com/example/demo/controller/taskController.java create mode 100644 src/demo/src/main/java/com/example/demo/domain/Rcode.java create mode 100644 src/demo/src/main/java/com/example/demo/domain/Task.java create mode 100644 src/demo/src/main/java/com/example/demo/mapper/RcodeMapper.java create mode 100644 src/demo/src/main/java/com/example/demo/mapper/TaskMapper.java create mode 100644 src/demo/src/main/java/com/example/demo/mapper/xml/TaskMapper.xml create mode 100644 src/demo/src/main/java/com/example/demo/service/ITaskService.java create mode 100644 src/demo/src/main/java/com/example/demo/service/impl/TaskServiceImpl.java create mode 100644 src/demo/src/main/resources/static/js/logincode.js diff --git a/src/demo/pom.xml b/src/demo/pom.xml index 431a469..0200cfd 100644 --- a/src/demo/pom.xml +++ b/src/demo/pom.xml @@ -22,6 +22,7 @@ spring-boot-starter-web + org.springframework.boot spring-boot-starter-test @@ -80,7 +81,7 @@ com.baomidou mybatis-plus-boot-starter - 3.1.1 + 3.4.2 @@ -107,6 +108,11 @@ org.springframework.boot spring-boot-starter-thymeleaf + + cn.hutool + hutool-all + 5.7.22 + diff --git a/src/demo/src/main/java/com/example/demo/DemoApplication.java b/src/demo/src/main/java/com/example/demo/DemoApplication.java index faac4b1..ae4d683 100644 --- a/src/demo/src/main/java/com/example/demo/DemoApplication.java +++ b/src/demo/src/main/java/com/example/demo/DemoApplication.java @@ -7,7 +7,7 @@ import org.springframework.context.annotation.ComponentScan; @SpringBootApplication -@ComponentScan(basePackages = {"com.example.demo.controller" ,"com.example.demo.config"}) +@ComponentScan(basePackages = {"com.example.demo.controller", "com.example.demo.config", "com.example.demo.service.impl"}) @MapperScan("com.example.demo.mapper") public class DemoApplication { diff --git a/src/demo/src/main/java/com/example/demo/common/GlobalResult.java b/src/demo/src/main/java/com/example/demo/common/GlobalResult.java index a66f5e4..4f120c1 100644 --- a/src/demo/src/main/java/com/example/demo/common/GlobalResult.java +++ b/src/demo/src/main/java/com/example/demo/common/GlobalResult.java @@ -2,9 +2,9 @@ package com.example.demo.common; /** * @Description: 自定义响应数据结构 - * 这个类是提供给门户,ios,安卓,微信商城用的 - * 门户接受此类数据后需要使用本类的方法转换成对于的数据类型格式(类,或者list) - * 其他自行处理 + * + * + * * 200:表示成功 * 500:表示错误,错误信息在msg字段中 * 501:bean验证错误,不管多少个错误都以map形式返回 diff --git a/src/demo/src/main/java/com/example/demo/common/HttpGetUtil.java b/src/demo/src/main/java/com/example/demo/common/HttpGetUtil.java index 420d91f..444ede9 100644 --- a/src/demo/src/main/java/com/example/demo/common/HttpGetUtil.java +++ b/src/demo/src/main/java/com/example/demo/common/HttpGetUtil.java @@ -10,10 +10,10 @@ import java.util.Map; public class HttpGetUtil { public static String httpRequestToString(String url, - Map params) { + Map params, String type) { String result = null; try { - InputStream is = httpRequestToStream(url, params); + InputStream is = httpRequestToStream(url, params, type); BufferedReader in = new BufferedReader(new InputStreamReader(is, "UTF-8")); StringBuffer buffer = new StringBuffer(); @@ -31,17 +31,17 @@ public class HttpGetUtil { } private static InputStream httpRequestToStream(String url, - Map params) { + Map params, String type) { InputStream is = null; try { String parameters = ""; boolean hasParams = false; - for(Object key : params.keySet()){ + for (Object key : params.keySet()) { String value = URLEncoder.encode((String) params.get(key), "UTF-8"); - parameters += key +"="+ value +"&"; + parameters += key + "=" + value + "&"; hasParams = true; } - if(hasParams){ + if (hasParams) { parameters = parameters.substring(0, parameters.length()-1); } @@ -57,7 +57,7 @@ public class HttpGetUtil { conn.setReadTimeout(50000); conn.setDoInput(true); //设置请求方式,默认为GET - conn.setRequestMethod("GET"); + conn.setRequestMethod(type); is = conn.getInputStream(); } catch (UnsupportedEncodingException e) { diff --git a/src/demo/src/main/java/com/example/demo/common/util/FormatResponseUtil.java b/src/demo/src/main/java/com/example/demo/common/util/FormatResponseUtil.java new file mode 100644 index 0000000..4300190 --- /dev/null +++ b/src/demo/src/main/java/com/example/demo/common/util/FormatResponseUtil.java @@ -0,0 +1,47 @@ +package com.example.demo.common.util; + +public class FormatResponseUtil { + /** + * 请求成功,不携带数据 + */ + public static ResponseResult formatResponse() { + ResponseResult result = null; + return formatResponse(result); + } + + private static ResponseResult formatResponse(ResponseResult result) { + if (result == null) { + result = new ResponseResult(true, "请求成功", null); + } + return result; + } + + /** + * 请求成功,带数据 + */ + public static ResponseResult formatResponse(Object object) { + return new ResponseResult(true, "请求成功", object); + } + + /** + * 请求成功,携带提示信息和数据 + */ + public static ResponseResult formatResponse(String msg, Object object) { + return new ResponseResult(true, msg, object); + } + + /** + * 请求失败,返回错误和错误信息 + */ + public static ResponseResult error(Exception e) { + return new ResponseResult(false, e.getMessage()); + } + + /** + * 请求失败,返回异常信息 + */ + public static ResponseResult error(String exception) { + return new ResponseResult(false, exception); + } +} + diff --git a/src/demo/src/main/java/com/example/demo/common/util/ResponseResult.java b/src/demo/src/main/java/com/example/demo/common/util/ResponseResult.java new file mode 100644 index 0000000..03bc9e8 --- /dev/null +++ b/src/demo/src/main/java/com/example/demo/common/util/ResponseResult.java @@ -0,0 +1,34 @@ +package com.example.demo.common.util; + +import lombok.Data; + +@Data +public class ResponseResult { + /** + * 请求状态 + */ + private boolean success; + /** + * 返回提示信息 + */ + private String msg; + /** + * 返回数据 + */ + private Object data; + + public ResponseResult(boolean success, String msg, Object data) { + this.success = success; + this.msg = msg; + this.data = data; + } + + public ResponseResult(boolean code, String msg) { + this.success = success; + this.msg = msg; + } + + public ResponseResult(boolean success) { + this.success = success; + } +} diff --git a/src/demo/src/main/java/com/example/demo/config/config/BaseEntityMetaObjectHandler.java b/src/demo/src/main/java/com/example/demo/config/config/BaseEntityMetaObjectHandler.java new file mode 100644 index 0000000..1bc6134 --- /dev/null +++ b/src/demo/src/main/java/com/example/demo/config/config/BaseEntityMetaObjectHandler.java @@ -0,0 +1,33 @@ +package com.example.demo.config.config; + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; +import com.example.demo.domain.Task; +import org.apache.ibatis.reflection.MetaObject; +import org.springframework.stereotype.Component; + +import java.time.LocalDateTime; + + +@Component +public class BaseEntityMetaObjectHandler implements MetaObjectHandler { + + + @Override + public void insertFill(MetaObject metaObject) { + // 创建时间自动填充 + if (metaObject.hasSetter(Task.CREATE_TIME) && ObjectUtil.isNull(getFieldValByName(Task.CREATE_TIME, metaObject))) { + this.strictInsertFill(metaObject, Task.CREATE_TIME, LocalDateTime.class, LocalDateTime.now()); + } + } + + @Override + public void updateFill(MetaObject metaObject) { + //修改时间自动填充 + if (metaObject.hasSetter(Task.MODIFIED_TIME) && ObjectUtil.isNull(getFieldValByName(Task.MODIFIED_TIME, metaObject))) { + this.strictUpdateFill(metaObject, Task.MODIFIED_TIME, LocalDateTime.class, LocalDateTime.now()); + } + + } + +} diff --git a/src/demo/src/main/java/com/example/demo/config/config/MybatisPlusConfig.java b/src/demo/src/main/java/com/example/demo/config/config/MybatisPlusConfig.java new file mode 100644 index 0000000..6e4d511 --- /dev/null +++ b/src/demo/src/main/java/com/example/demo/config/config/MybatisPlusConfig.java @@ -0,0 +1,27 @@ +package com.example.demo.config.config; + +import com.baomidou.mybatisplus.annotation.DbType; +import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * MybatisPlus 配置类 + * + * @author huang + * @since 2022-03-18 + */ + +@Configuration +public class MybatisPlusConfig { + /** + * 分页插件 + */ + @Bean + public MybatisPlusInterceptor mybatisPlusInterceptor() { + MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); + interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); + return interceptor; + } +} diff --git a/src/demo/src/main/java/com/example/demo/config/config/WebConfig.java b/src/demo/src/main/java/com/example/demo/config/config/WebConfig.java new file mode 100644 index 0000000..38b92f8 --- /dev/null +++ b/src/demo/src/main/java/com/example/demo/config/config/WebConfig.java @@ -0,0 +1,19 @@ +package com.example.demo.config.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +/** + * Web 配置类 + * + * @author huang + * @since 2022-03-18 + */ +@Configuration +public class WebConfig implements WebMvcConfigurer { + @Override + public void addViewControllers(ViewControllerRegistry registry) { + registry.addViewController("/").setViewName("login/login"); + } +} diff --git a/src/demo/src/main/java/com/example/demo/controller/ControllerText.java b/src/demo/src/main/java/com/example/demo/controller/ControllerText.java deleted file mode 100644 index 0b9de03..0000000 --- a/src/demo/src/main/java/com/example/demo/controller/ControllerText.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.example.demo.controller; - - -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import io.swagger.v3.oas.annotations.tags.Tags; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.jdbc.core.JdbcTemplate; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@RestController -@SpringBootApplication -@Tag(name ="你的接口",description = "test") -public class ControllerText { - @Operation(summary = "获取用户列表",description = "test") - @RequestMapping("getUser") - - public Map getUser(){ - System.out.println("微信小程序正在调用。。。"); - Map map = new HashMap(); - List list = new ArrayList(); - list.add("zhangsan"); - list.add("lisi"); - list.add("wanger"); - list.add("mazi"); - map.put("list",list); - System.out.println("微信小程序调用完成。。。"); - return map; - } - @Operation(summary = "获取用户表",description = "test") - @RequestMapping("getWord") - public Map getText(String word){ - Map map = new HashMap(); - String message = "我能力有限,不要为难我"; - if ("后来".equals(word)) { - message="正在热映的后来的我们是刘若英的处女作。"; - }else if("微信小程序".equals(word)){ - message= "想获取更多微信小程序相关知识,请更多的阅读微信官方文档,还有其他更多微信开发相关的内容,学无止境。"; - }else if("cauc".equals(word)){ - message="yes"; - } - map.put("message", message); - return map; - } - - @Autowired - JdbcTemplate jct; - @Operation(summary = "取用户列表",description = "test") - @GetMapping("userslist") - public List> userlist(){ - String sql = "select * from user"; - List> map = jct.queryForList(sql); - System.out.println("调用sql"); - return map; - } - - - -} diff --git a/src/demo/src/main/java/com/example/demo/controller/Demmo.java b/src/demo/src/main/java/com/example/demo/controller/Demmo.java deleted file mode 100644 index 0592173..0000000 --- a/src/demo/src/main/java/com/example/demo/controller/Demmo.java +++ /dev/null @@ -1,107 +0,0 @@ -package com.example.demo.controller; - -import com.alibaba.fastjson.JSONObject; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.example.demo.common.HttpGetUtil; -import com.example.demo.domain.User; -import com.example.demo.mapper.UserMapper; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.*; - -import javax.management.Query; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.UnsupportedEncodingException; -import java.util.*; - -@Tag(name = "真·用户接口",description = "用户登录,") -@RestController -public class Demmo { - @RequestMapping("/index") - public String first(){ - return "index"; - } - @Autowired - private UserMapper userMapper; - @GetMapping("atlogin") - @Operation(summary = "真·微信登录接口") - - public Map getOpenId( HttpServletRequest request, - HttpServletResponse response, - @RequestParam(value = "code", required = false) String code) throws UnsupportedEncodingException { - response.setContentType("text/html"); - request.setCharacterEncoding("UTF-8"); - response.setCharacterEncoding("UTF-8"); - Map params = new HashMap(); - params.put("appid", "wx954296403ec15396"); - params.put("secret", "3317b29d14270cebb8f4e3521506f285"); - params.put("js_code", code); - params.put("grant_type", "authorization_code"); - - System.out.println(params); - String result = HttpGetUtil.httpRequestToString( - "https://api.weixin.qq.com/sns/jscode2session", params); - JSONObject jsonObject = JSONObject.parseObject(result); - - String openid = jsonObject.get("openid").toString(); - System.out.println("得到的openid为:"+openid); - String sessionKey=jsonObject.get("session_key").toString(); - User user = this.userMapper.selectById(openid); - // uuid生成唯一key,用于维护微信小程序用户与服务端的会话 - String skey = UUID.randomUUID().toString(); - if (user == null) { - // 用户信息入库 -// String nickName = rawDataJson.getString("nickName"); -// String avatarUrl = rawDataJson.getString("avatarUrl"); -// String gender = rawDataJson.getString("gender"); -// String city = rawDataJson.getString("city"); -// String country = rawDataJson.getString("country"); -// String province = rawDataJson.getString("province"); - - user = new User(); - user.setOpenId(openid); - user.setSkey(skey); - user.setCreateTime(new Date()); - user.setLastVisitTime(new Date()); - user.setSessionKey(sessionKey); -// user.setCity(city); -// user.setProvince(province); -// user.setCountry(country); -// user.setAvatarUrl(avatarUrl); -// user.setGender(Integer.parseInt(gender)); -// user.setNickName(nickName); - - this.userMapper.insert(user); - } else { - // 已存在,更新用户登录时间 - user.setLastVisitTime(new Date()); - // 重新设置会话skey - user.setSkey(skey); - this.userMapper.updateById(user); - } - Map skeymap = new HashMap(); - skeymap.put("skey",skey); - - return skeymap; - } - @RequestMapping("/atbind") - @Operation(summary = "用户绑定接口") - public void atbind(@RequestParam(value = "studentnumber",required = true) String studentnumber, - @RequestParam(value = "name",required = true) String name, - @RequestParam(value = "skey",required = true) String skey) - { - QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.like("skey", skey); - User user = this.userMapper.selectOne(queryWrapper); - user.setStudentNumber(studentnumber); - user.setName(name); - this.userMapper.updateById(user); - System.out.println(user); - - } - -} diff --git a/src/demo/src/main/java/com/example/demo/controller/TaskuploadController.java b/src/demo/src/main/java/com/example/demo/controller/TaskuploadController.java index fc1ac78..94fa529 100644 --- a/src/demo/src/main/java/com/example/demo/controller/TaskuploadController.java +++ b/src/demo/src/main/java/com/example/demo/controller/TaskuploadController.java @@ -33,7 +33,8 @@ public class TaskuploadController { @RequestMapping(value = "/taskupload", method = RequestMethod.POST) @Operation(summary = "任务上传接口") public String taskupload(HttpServletRequest request, - @RequestParam(name = "skey", required = true) String skey) { + @RequestParam(name = "skey", required = true) String skey, + @RequestParam(name = "Task_id", required = true) Integer Taskid) { //skey 查表 QueryWrapper queryWrapper = new QueryWrapper<>(); @@ -42,11 +43,11 @@ public class TaskuploadController { System.out.println(user); QueryWrapper queryWrapper1 = new QueryWrapper<>(); queryWrapper1.like("studentnumber", user.getStudentNumber()); - queryWrapper1.like("Task_id", 1); //任务表(需修改) + queryWrapper1.like("Task_id", Taskid); //任务表(需修改) Taskson taskson = this.tasksonMapper.selectOne(queryWrapper1); if (taskson == null) { taskson = new Taskson(); - taskson.setTaskid(1);//任务id(需修改) + taskson.setTaskid(Taskid);//任务id(需修改) taskson.setStudentnumber(user.getStudentNumber()); this.tasksonMapper.insert(taskson); } diff --git a/src/demo/src/main/java/com/example/demo/controller/UserController.java b/src/demo/src/main/java/com/example/demo/controller/UserController.java index 23bf15b..5aba5b6 100644 --- a/src/demo/src/main/java/com/example/demo/controller/UserController.java +++ b/src/demo/src/main/java/com/example/demo/controller/UserController.java @@ -1,84 +1,77 @@ package com.example.demo.controller; - +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.example.demo.common.HttpGetUtil; +import com.example.demo.domain.Rcode; import com.example.demo.domain.User; -import com.example.demo.common.GlobalResult; +import com.example.demo.mapper.RcodeMapper; import com.example.demo.mapper.UserMapper; -import com.example.demo.common.WechatUtil; - -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; -import org.apache.commons.codec.digest.DigestUtils; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; -import java.util.Date; -import java.util.UUID; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.UnsupportedEncodingException; +import java.util.*; -/** - * - */ -@Tag(name = "用户接口",description = "用户登录,") -@Controller +@Tag(name = "真·用户接口", description = "用户登录,") +@RestController public class UserController { + @RequestMapping("/index") + public String first() { + return "index"; + } @Autowired private UserMapper userMapper; /** - * 微信用户登录详情 + * 微信小程序用户登录接口 + * + * @param request + * @param response + * @param code + * @return + * @throws UnsupportedEncodingException + * @auth:kirito */ - @PostMapping("wx/login") - @Operation(summary = "微信登录接口") - @ResponseBody - public GlobalResult user_login(@RequestParam(value = "code", required = false) String code, - @RequestParam(value = "rawData", required = false) String rawData, - @RequestParam(value = "signature", required = false) String signature, - @RequestParam(value = "encrypteData", required = false) String encrypteData, - @RequestParam(value = "iv", required = false) String iv) { - // 用户非敏感信息:rawData - // 签名:signature - JSONObject rawDataJson = JSON.parseObject(rawData); - // 1.接收小程序发送的code - // 2.开发者服务器 登录凭证校验接口 appi + appsecret + code - JSONObject SessionKeyOpenId = WechatUtil.getSessionKeyOrOpenId(code); - // 3.接收微信接口服务 获取返回的参数 - String openid = SessionKeyOpenId.getString("openid"); - String sessionKey = SessionKeyOpenId.getString("session_key"); + @GetMapping("atlogin") + @Operation(summary = "真·微信登录接口") + public Map getOpenId(HttpServletRequest request, + HttpServletResponse response, + @RequestParam(value = "code", required = false) String code) throws UnsupportedEncodingException { + response.setContentType("text/html"); + request.setCharacterEncoding("UTF-8"); + response.setCharacterEncoding("UTF-8"); + Map params = new HashMap(); + params.put("appid", "wx954296403ec15396"); + params.put("secret", "3317b29d14270cebb8f4e3521506f285"); + params.put("js_code", code); + params.put("grant_type", "authorization_code"); + + System.out.println(params); + String result = HttpGetUtil.httpRequestToString( + "https://api.weixin.qq.com/sns/jscode2session", params, "GET"); + JSONObject jsonObject = JSONObject.parseObject(result); - // 4.校验签名 小程序发送的签名signature与服务器端生成的签名signature2 = sha1(rawData + sessionKey) - String signature2 = DigestUtils.sha1Hex(rawData + sessionKey); -// if (!signature.equals(signature2)) { -// return GlobalResult.build(500, "签名校验失败", null); -// } - // 5.根据返回的User实体类,判断用户是否是新用户,是的话,将用户信息存到数据库;不是的话,更新最新登录时间 + String openid = jsonObject.get("openid").toString(); + System.out.println("得到的openid为:" + openid); + String sessionKey = jsonObject.get("session_key").toString(); User user = this.userMapper.selectById(openid); // uuid生成唯一key,用于维护微信小程序用户与服务端的会话 String skey = UUID.randomUUID().toString(); if (user == null) { // 用户信息入库 -// String nickName = rawDataJson.getString("nickName"); -// String avatarUrl = rawDataJson.getString("avatarUrl"); -// String gender = rawDataJson.getString("gender"); -// String city = rawDataJson.getString("city"); -// String country = rawDataJson.getString("country"); -// String province = rawDataJson.getString("province"); - user = new User(); user.setOpenId(openid); user.setSkey(skey); user.setCreateTime(new Date()); user.setLastVisitTime(new Date()); user.setSessionKey(sessionKey); -// user.setCity(city); -// user.setProvince(province); -// user.setCountry(country); -// user.setAvatarUrl(avatarUrl); -// user.setGender(Integer.parseInt(gender)); -// user.setNickName(nickName); + this.userMapper.insert(user); } else { @@ -88,11 +81,80 @@ public class UserController { user.setSkey(skey); this.userMapper.updateById(user); } - //encrypteData比rowData多了appid和openid - //JSONObject userInfo = WechatUtil.getUserInfo(encrypteData, sessionKey, iv); - //6. 把新的skey返回给小程序 - GlobalResult result = GlobalResult.build(200, null, skey); - return result; + User user2 = this.userMapper.selectById(openid); + Map skeymap = new HashMap(); + skeymap.put("skey", skey); + skeymap.put("power", user2.getPower()); + return skeymap; + } + + /** + * 用户绑定接口 + * + * @param studentnumber + * @param name + * @param skey + * @auth:kirito + * @date:2022/10/20 + */ + @RequestMapping("/atbind") + @Operation(summary = "用户绑定接口") + public void atbind(@RequestParam(value = "studentnumber", required = true) String studentnumber, + @RequestParam(value = "name", required = true) String name, + @RequestParam(value = "skey", required = true) String skey) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.like("skey", skey); + User user = this.userMapper.selectOne(queryWrapper); + user.setStudentNumber(studentnumber); + user.setName(name); + this.userMapper.updateById(user); + System.out.println(user); + + } + + @Autowired + RcodeMapper rcodeMapper; + + /** + * 获取验证码 + * + * @param skey + * @return code + * @auth:kirito + * @date:2022/11/12 + */ + @RequestMapping("/getrcode") + @Operation(summary = "获取验证码") + public String getrcode(@RequestParam(value = "skey", required = true) String skey) { + Rcode rcode = this.rcodeMapper.selectById(skey); + String code = ""; + if (rcode == null) { + rcode = new Rcode(); + rcode.setSkey(skey); + code = rcode.createCode(); + this.rcodeMapper.insert(rcode); + } else { + code = rcode.createCode(); + rcode.setCode(code); + this.rcodeMapper.updateById(rcode); + } + return code; + } + + /** + * 用户登录接口(现阶段使用) + * 采用微信小程序获取验证码登录 + * + * @auth:kirito + */ + @RequestMapping("/webblogin") + @Operation(summary = "登录") + public void weblogin(@RequestParam(value = "code") String code) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.like("code", code); + Rcode authrcode = this.rcodeMapper.selectOne(queryWrapper); + String skey = authrcode.getSkey(); + System.out.println(skey); } } diff --git a/src/demo/src/main/java/com/example/demo/controller/Webcontroller.java b/src/demo/src/main/java/com/example/demo/controller/Webcontroller.java index 4739ab3..deb075d 100644 --- a/src/demo/src/main/java/com/example/demo/controller/Webcontroller.java +++ b/src/demo/src/main/java/com/example/demo/controller/Webcontroller.java @@ -1,25 +1,167 @@ package com.example.demo.controller; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.example.demo.common.HttpGetUtil; +import com.example.demo.domain.Rcode; import com.example.demo.domain.User; +import com.example.demo.mapper.RcodeMapper; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.apache.commons.codec.binary.Base64; + +import org.apache.tomcat.util.http.ResponseUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; -import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.client.RestTemplate; + +import javax.servlet.http.HttpServletRequest; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.PrintWriter; +import java.net.URL; +import java.net.URLConnection; +import java.nio.Buffer; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + @Controller +@RequestMapping("/web") +@Tag(name = "web端") public class Webcontroller { - @RequestMapping("/dashboard.html") - - public String login(){ + @RequestMapping("/dashboard") + public String login() { return "dashboard"; } + @RequestMapping("/list") - public String numer(){ - return "list"; + public String numer() { + return "list"; + } + + /** + * 获取qrcode + * issue: 小程序未上线,无法使用获取二维码接口。 + * 此接口未启用,后续小程序上线可以启用替换验证码登录 + * + * @return + */ + @RequestMapping("/getqrcode") + public Object getqrcode() { + RestTemplate restTemplate = new RestTemplate(); + //首先获取ACCESS_TOKEN + String getAccessTokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=wx08c675f6ba5b2cdc&secret=0c28388c09ff373d391fe66d085dd39d"; + JSONObject tokenResult = restTemplate.getForObject(getAccessTokenUrl, JSONObject.class); + assert tokenResult != null; + String accessToken = tokenResult.getString("access_token"); + //System.out.println(accessToken); + //然后调用微信官方api生成二维码 + String createQrCodeUrl = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=" + accessToken; + //此处我是使用的阿里巴巴的fastJson + JSONObject createQrParam = new JSONObject(); + //createQrParam.put("scene", scene); + //createQrParam.put("page", page); + + + PrintWriter out = null; + InputStream in = null; + try { + URL realUrl = new URL(createQrCodeUrl); + // 打开和URL之间的连接 + URLConnection conn = realUrl.openConnection(); + // 设置通用的请求属性 + conn.setRequestProperty("accept", "*/*"); + conn.setRequestProperty("connection", "Keep-Alive"); + conn.setRequestProperty("user-agent", + "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); + // 发送POST请求必须设置如下两行 + conn.setDoOutput(true); + conn.setDoInput(true); + // 获取URLConnection对象对应的输出流 + out = new PrintWriter(conn.getOutputStream()); + // 发送请求参数,利用connection的输出流,去写数据到connection中,我的参数数据流出我的电脑内存到connection中,让connection把参数帮我传到URL中去请求。 + out.print(createQrParam); + // flush输出流的缓冲 + out.flush(); + //获取URL的connection中的输入流,这个输入流就是我请求的url返回的数据,返回的数据在这个输入流中,流入我内存,我将从此流中读取数据。 + in = conn.getInputStream(); + //定义个空字节数组 + byte[] data = null; + // 读取图片字节数组 + try { + //创建字节数组输出流作为中转仓库,等待被写入数据 + ByteArrayOutputStream swapStream = new ByteArrayOutputStream(); + byte[] buff = new byte[100]; + int rc = 0; + while ((rc = in.read(buff, 0, 100)) > 0) { + //向中转的输出流循环写出输入流中的数据 + swapStream.write(buff, 0, rc); + } + //此时connection的输入流返回给我们的请求结果数据已经被完全地写入了我们定义的中转输出流swapStream中 + data = swapStream.toByteArray(); + } catch (IOException e) { + e.printStackTrace(); + } finally { + if (in != null) { + try { + in.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + String base64Code = new String(Objects.requireNonNull(Base64.encodeBase64(data))); + //Base64转byte[]数组 + System.out.println(base64Code); + } catch (Exception e) { + System.out.println("发送 POST 请求出现异常!" + e); + e.printStackTrace(); + } + + // 使用finally块来关闭输出流、输入流 + finally { + try { + if (out != null) { + out.close(); + } + if (in != null) { + in.close(); + } + } catch (IOException ex) { + ex.printStackTrace(); + } + } + return null; } + + /** + * 用户登录接口(现阶段使用) + * 采用微信小程序获取验证码登录 + * + * @auth:kirito + */ @Autowired - User user; - /*public String list(Model model){ - user. - return - }*/ + RcodeMapper rcodeMapper; + + @RequestMapping("/login") + @Operation(summary = "登录") + public void weblogin(@RequestParam(value = "code") String code) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.like("code", code); + Rcode authrcode = this.rcodeMapper.selectOne(queryWrapper); + String skey = authrcode.getSkey(); + + } + + + } + + + diff --git a/src/demo/src/main/java/com/example/demo/controller/taskController.java b/src/demo/src/main/java/com/example/demo/controller/taskController.java new file mode 100644 index 0000000..cc99be2 --- /dev/null +++ b/src/demo/src/main/java/com/example/demo/controller/taskController.java @@ -0,0 +1,47 @@ +package com.example.demo.controller; +import com.example.demo.domain.Task; +import com.example.demo.service.impl.TaskServiceImpl; +import com.example.demo.common.util.FormatResponseUtil; +import com.example.demo.common.util.ResponseResult; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +@RestController +@Tag(name = "WXL") +@RequestMapping("/task") + +public class taskController { + + @Autowired + public TaskServiceImpl taskService; + + @Operation(summary = "获取任务信息") + @GetMapping("/taskList") + public ResponseResult queryAll() { + return FormatResponseUtil.formatResponse(taskService.queryAll()); + } + + @PostMapping("/addTask") + public ResponseResult addTask(@RequestBody Task task) { + return FormatResponseUtil.formatResponse(taskService.save(task)); + } + + @DeleteMapping("/delete")//这里执行的是物理删除 + public ResponseResult delTaskById(Integer id){ + return FormatResponseUtil.formatResponse(taskService.delTaskById(id)); + } + + @GetMapping("/one") + public ResponseResult queryById(int id){ + return FormatResponseUtil.formatResponse(taskService.queryTaskById(id)); + } + + @PostMapping("/taskInfo") + public ResponseResult updateArea(@RequestBody Task task){ + return FormatResponseUtil.formatResponse(taskService.updateById(task)); + } + +} + diff --git a/src/demo/src/main/java/com/example/demo/domain/Rcode.java b/src/demo/src/main/java/com/example/demo/domain/Rcode.java new file mode 100644 index 0000000..76e467e --- /dev/null +++ b/src/demo/src/main/java/com/example/demo/domain/Rcode.java @@ -0,0 +1,61 @@ +package com.example.demo.domain; + +import java.util.Random; + +public class Rcode { + private String code; + private String skey; + + public Rcode() { + } + + public Rcode(String code, String skey) { + this.code = code; + this.skey = skey; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getSkey() { + return skey; + } + + public void setSkey(String skey) { + this.skey = skey; + } + + public String createCode() { + //定义字符串记录 + String code = ""; + Random r = new Random(); + //for 循环5次,依次生成随机字符 + for (int i = 0; i < 5; i++) { + int type = r.nextInt(3);//0 1 2 + switch (type) { + case 0: + //大写字符(A 65-Z 65+25) + char ch = (char) (r.nextInt(26) + 65); + code += ch; + break; + case 1: + //小写字符(a 97-z 97+25) + char ch1 = (char) (r.nextInt(26) + 97); + code += ch1; + break; + case 2: + //数字字符 + code += r.nextInt(10);//0-9 + break; + } + } + this.code = code; + return code; + + } +} diff --git a/src/demo/src/main/java/com/example/demo/domain/Task.java b/src/demo/src/main/java/com/example/demo/domain/Task.java new file mode 100644 index 0000000..911a9ec --- /dev/null +++ b/src/demo/src/main/java/com/example/demo/domain/Task.java @@ -0,0 +1,118 @@ +package com.example.demo.domain; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.time.LocalDateTime; +@TableName("task") +public class Task { + private static final long serialVersionUID = 1L; + + public static final String CREATE_TIME = "createTime"; + public static final String MODIFIED_TIME = "lastTime"; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + private String name; + + /* + * 任务内容 + * */ + private String property; + + //任务关联学号 + private String stuid; + + //任务截止时间 + private String deadtime; + + //任务状态:默认0(未完成) + private Integer status; + /** + * 创建时间戳 + */ + @TableField(fill = FieldFill.INSERT) + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createTime; + + /** + * 最后修改时间戳 + */ + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime lastTime; + + public String getDeadtime() { + return deadtime; + } + + public void setDeadtime(String deadtime) { + this.deadtime = deadtime; + } + public String getStuid() { + return stuid; + } + + public void setStuid(String stuid) { + this.stuid = stuid; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getProperty() { + return property; + } + + public void setProperty(String property) { + this.property = property; + } + + public LocalDateTime getCreateTime() { + return createTime; + } + + public void setCreateTime(LocalDateTime createTime) { + this.createTime = createTime; + } + + public LocalDateTime getLastTime() { + return lastTime; + } + + public void setLastTime(LocalDateTime lastEditTime) { + this.lastTime = lastEditTime; + } + + @Override + public String toString() { + return "Task{" + + "id=" + id + + ", name=" + name + + ", priority=" + property + + ", createTime=" + createTime + + ", lastEditTime=" + lastTime + + "}"; + } +} diff --git a/src/demo/src/main/java/com/example/demo/domain/Taskson.java b/src/demo/src/main/java/com/example/demo/domain/Taskson.java index 34bcdd3..f3d4a8a 100644 --- a/src/demo/src/main/java/com/example/demo/domain/Taskson.java +++ b/src/demo/src/main/java/com/example/demo/domain/Taskson.java @@ -72,6 +72,11 @@ public class Taskson extends Wrapper { return null; } + @Override + public void clear() { + + } + /** * SQL 片段 */ diff --git a/src/demo/src/main/java/com/example/demo/domain/User.java b/src/demo/src/main/java/com/example/demo/domain/User.java index 2b623bc..24d4f4c 100644 --- a/src/demo/src/main/java/com/example/demo/domain/User.java +++ b/src/demo/src/main/java/com/example/demo/domain/User.java @@ -12,19 +12,17 @@ import org.springframework.format.annotation.DateTimeFormat; import java.util.Date; /** - * - * * */ @Data @TableName("user") -public class User extends Wrapper { +public class User extends Wrapper { private static final long serialVersionUID = 1L; /** * open_id */ - @TableId(value = "open_id",type = IdType.INPUT) + @TableId(value = "open_id", type = IdType.INPUT) private String openId; /** * skey @@ -108,6 +106,11 @@ public class User extends Wrapper { return null; } + @Override + public void clear() { + + } + @Override public String getSqlSegment() { return null; diff --git a/src/demo/src/main/java/com/example/demo/mapper/RcodeMapper.java b/src/demo/src/main/java/com/example/demo/mapper/RcodeMapper.java new file mode 100644 index 0000000..18a47aa --- /dev/null +++ b/src/demo/src/main/java/com/example/demo/mapper/RcodeMapper.java @@ -0,0 +1,10 @@ +package com.example.demo.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.example.demo.domain.Rcode; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface RcodeMapper extends BaseMapper { + +} diff --git a/src/demo/src/main/java/com/example/demo/mapper/TaskMapper.java b/src/demo/src/main/java/com/example/demo/mapper/TaskMapper.java new file mode 100644 index 0000000..06a6d3b --- /dev/null +++ b/src/demo/src/main/java/com/example/demo/mapper/TaskMapper.java @@ -0,0 +1,18 @@ +package com.example.demo.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.example.demo.domain.Task; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * Mapper 接口 + *

+ * + * @author huang + * @since 2022-03-27 + */ +@Mapper +public interface TaskMapper extends BaseMapper { + +} diff --git a/src/demo/src/main/java/com/example/demo/mapper/xml/TaskMapper.xml b/src/demo/src/main/java/com/example/demo/mapper/xml/TaskMapper.xml new file mode 100644 index 0000000..29a04fd --- /dev/null +++ b/src/demo/src/main/java/com/example/demo/mapper/xml/TaskMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/src/demo/src/main/java/com/example/demo/service/ITaskService.java b/src/demo/src/main/java/com/example/demo/service/ITaskService.java new file mode 100644 index 0000000..c58ed21 --- /dev/null +++ b/src/demo/src/main/java/com/example/demo/service/ITaskService.java @@ -0,0 +1,29 @@ +package com.example.demo.service; +import com.baomidou.mybatisplus.extension.service.IService; +import com.example.demo.domain.Task; + +import java.util.List; + +/** + *

+ * 服务类 + *

+ */ +public interface ITaskService extends IService { + + /** + * 查询所有Area + */ + List queryAll(); + + /** + * 通过Id查询Task + */ + Task queryTaskById(int id); + + /** + * 通过Id删除Task + */ + boolean delTaskById(int id); + +} diff --git a/src/demo/src/main/java/com/example/demo/service/impl/TaskServiceImpl.java b/src/demo/src/main/java/com/example/demo/service/impl/TaskServiceImpl.java new file mode 100644 index 0000000..bef3e01 --- /dev/null +++ b/src/demo/src/main/java/com/example/demo/service/impl/TaskServiceImpl.java @@ -0,0 +1,56 @@ +package com.example.demo.service.impl; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.example.demo.domain.Task; +import com.example.demo.mapper.TaskMapper; +import com.example.demo.service.ITaskService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Repository; +import org.springframework.stereotype.Service; + +import java.util.Date; +import java.util.List; + +/** + *

+ * 服务实现类 + *

+ * + */ +@Service + +public class TaskServiceImpl extends ServiceImpl implements ITaskService { + + @Autowired(required = false) + TaskMapper taskMapper; + + @Override + public List queryAll() { + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.orderByAsc(Task::getId); + List taskList = taskMapper.selectList(wrapper); + return taskList; + } + + + @Override + public Task queryTaskById(int id) { + Task task = taskMapper.selectById(id); + return task; + } + + + @Override + public boolean delTaskById(int id) { + boolean ans; + int i = taskMapper.deleteById(id); + return ans = i>0 ? true:false; + } + +} + diff --git a/src/demo/src/main/resources/application.yaml b/src/demo/src/main/resources/application.yaml index 23af40f..60687fe 100644 --- a/src/demo/src/main/resources/application.yaml +++ b/src/demo/src/main/resources/application.yaml @@ -9,7 +9,7 @@ spring: datasource: driver-class-name: com.mysql.jdbc.Driver - url: jdbc:mysql://localhost:3306 + url: jdbc:mysql://127.0.0.1:3306/wxlogin?useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true&useSSL=false username: root password: Dq20020808 thymeleaf: diff --git a/src/demo/src/main/resources/static/js/logincode.js b/src/demo/src/main/resources/static/js/logincode.js new file mode 100644 index 0000000..ef63495 --- /dev/null +++ b/src/demo/src/main/resources/static/js/logincode.js @@ -0,0 +1,14 @@ +/** + * 网页登录二维码生成 + * auther:wangh + * 2022.11.6 + */ +createCode() +{ + let codeNumber = ''; + for (var i = 0; i < 0; i++) { + codeNumber += Math.floor(Math.random() * 10); + } + this.codeNumber = codeNumber; + this.qrCode = '' +} diff --git a/src/demo/src/main/resources/templates/dashboard.html b/src/demo/src/main/resources/templates/dashboard.html index ee5a862..79d7ee8 100644 --- a/src/demo/src/main/resources/templates/dashboard.html +++ b/src/demo/src/main/resources/templates/dashboard.html @@ -52,7 +52,6 @@ -