From f43689a7e9dc42fbc2a1edbff7b14e427560006b Mon Sep 17 00:00:00 2001 From: ronger Date: Mon, 1 Feb 2021 18:12:13 +0800 Subject: [PATCH 01/19] :bug: https://github.com/rymcu/forest/issues/30 --- .../rymcu/forest/config/BaseShiroRealm.java | 19 ++-- .../forest/core/constant/ShiroConstants.java | 8 +- .../core/exception/TransactionException.java | 35 ++++++++ .../rymcu/forest/core/result/ResultCode.java | 24 ++--- .../forest/core/service/AbstractService.java | 9 +- .../rymcu/forest/core/service/Service.java | 89 ++++++++++++++++--- .../forest/enumerate/TransactionCode.java | 28 ++++++ ...{SponsorEnum.java => TransactionEnum.java} | 12 +-- .../service/impl/SponsorServiceImpl.java | 10 ++- 9 files changed, 190 insertions(+), 44 deletions(-) create mode 100644 src/main/java/com/rymcu/forest/core/exception/TransactionException.java create mode 100644 src/main/java/com/rymcu/forest/enumerate/TransactionCode.java rename src/main/java/com/rymcu/forest/enumerate/{SponsorEnum.java => TransactionEnum.java} (57%) diff --git a/src/main/java/com/rymcu/forest/config/BaseShiroRealm.java b/src/main/java/com/rymcu/forest/config/BaseShiroRealm.java index 46aa766..bdd6323 100644 --- a/src/main/java/com/rymcu/forest/config/BaseShiroRealm.java +++ b/src/main/java/com/rymcu/forest/config/BaseShiroRealm.java @@ -29,7 +29,7 @@ import java.util.List; * @author ronger * @since 2018/05/28 11:00 * 自定义权限匹配和账号密码匹配 - * */ + */ public class BaseShiroRealm extends AuthorizingRealm { @Resource private RoleService roleService; @@ -43,13 +43,13 @@ public class BaseShiroRealm extends AuthorizingRealm { @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo(); - Principal principal = (Principal)principals.getPrimaryPrincipal(); + Principal principal = (Principal) principals.getPrimaryPrincipal(); User user = new User(); user.setIdUser(principal.getId()); try { List roles = roleService.selectRoleByUser(user); for (Role role : roles) { - if(StringUtils.isNotBlank(role.getInputCode())){ + if (StringUtils.isNotBlank(role.getInputCode())) { authorizationInfo.addRole(role.getInputCode()); } } @@ -70,7 +70,7 @@ public class BaseShiroRealm extends AuthorizingRealm { /** * 认证回调函数, 登录时调用,主要是用来进行身份认证的,也就是说验证用户输入的账号和密码是否正确。 - * */ + */ @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authcToken) throws AuthenticationException { UsernamePasswordToken token = (UsernamePasswordToken) authcToken; @@ -90,10 +90,11 @@ public class BaseShiroRealm extends AuthorizingRealm { if (user == null) { return null; } - if (!"0".equals(user.getStatus())) { //账户冻结(是否允许登陆) + // 账户冻结(是否允许登陆) + if (!"0".equals(user.getStatus())) { throw new LockedAccountException(); } - byte[] salt = Encodes.decodeHex(user.getPassword().substring(0,16)); + byte[] salt = Encodes.decodeHex(user.getPassword().substring(0, 16)); return new SimpleAuthenticationInfo(new Principal(user, token.isMobileLogin()), user.getPassword().substring(16), ByteSource.Util.bytes(salt), getName()); } @@ -101,7 +102,7 @@ public class BaseShiroRealm extends AuthorizingRealm { /** * 授权用户信息 */ - public static class Principal implements Serializable { + public static class Principal implements Serializable { private static final long serialVersionUID = 1L; @@ -139,9 +140,9 @@ public class BaseShiroRealm extends AuthorizingRealm { * 获取SESSIONID */ public String getSessionid() { - try{ + try { return (String) Utils.getSession().getId(); - }catch (Exception e) { + } catch (Exception e) { return ""; } } diff --git a/src/main/java/com/rymcu/forest/core/constant/ShiroConstants.java b/src/main/java/com/rymcu/forest/core/constant/ShiroConstants.java index 8b7476d..1c5d116 100644 --- a/src/main/java/com/rymcu/forest/core/constant/ShiroConstants.java +++ b/src/main/java/com/rymcu/forest/core/constant/ShiroConstants.java @@ -2,10 +2,10 @@ package com.rymcu.forest.core.constant; /** * Shiro通用常量 - * + * + * @author ronger */ -public interface ShiroConstants -{ +public interface ShiroConstants { /** * 当前登录的用户 */ @@ -54,7 +54,7 @@ public interface ShiroConstants /** * 验证码 */ - public static final String CURRENT_VALIDATECODE = "validateCode"; + public static final String CURRENT_VALIDATE_CODE = "validateCode"; /** * 验证码错误 diff --git a/src/main/java/com/rymcu/forest/core/exception/TransactionException.java b/src/main/java/com/rymcu/forest/core/exception/TransactionException.java new file mode 100644 index 0000000..16e66b2 --- /dev/null +++ b/src/main/java/com/rymcu/forest/core/exception/TransactionException.java @@ -0,0 +1,35 @@ +package com.rymcu.forest.core.exception; + +import com.rymcu.forest.enumerate.TransactionCode; + +/** + * @author ronger + */ +public class TransactionException extends Exception { + + private int code; + + private String message; + + public TransactionException(TransactionCode transactionCode) { + super(transactionCode.getMessage()); + this.code = transactionCode.getCode(); + } + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + @Override + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/src/main/java/com/rymcu/forest/core/result/ResultCode.java b/src/main/java/com/rymcu/forest/core/result/ResultCode.java index c0f894e..40c43fe 100644 --- a/src/main/java/com/rymcu/forest/core/result/ResultCode.java +++ b/src/main/java/com/rymcu/forest/core/result/ResultCode.java @@ -2,18 +2,22 @@ package com.rymcu.forest.core.result; /** * 响应码枚举,参考HTTP状态码的语义 + * + * @author ronger */ public enum ResultCode { - SUCCESS(1, "SUCCESS"),//成功 - FAIL(400, "访问失败"),//失败 - UNAUTHORIZED(401, "签名错误"),//未认证(签名错误) - NOT_FOUND(404, "此接口不存在"),//接口不存在 - INTERNAL_SERVER_ERROR(500, "系统繁忙,请稍后再试"),//服务器内部错误 - INVALID_PARAM(10000, "参数错误"), - - - - ; + // 成功 + SUCCESS(1, "SUCCESS"), + // 失败 + FAIL(400, "访问失败"), + // 未认证(签名错误) + UNAUTHORIZED(401, "签名错误"), + // 接口不存在 + NOT_FOUND(404, "此接口不存在"), + // 服务器内部错误 + INTERNAL_SERVER_ERROR(500, "系统繁忙,请稍后再试"), + // 参数错误 + INVALID_PARAM(10000, "参数错误"); private int code; private String message; diff --git a/src/main/java/com/rymcu/forest/core/service/AbstractService.java b/src/main/java/com/rymcu/forest/core/service/AbstractService.java index a1e2eb2..e973449 100644 --- a/src/main/java/com/rymcu/forest/core/service/AbstractService.java +++ b/src/main/java/com/rymcu/forest/core/service/AbstractService.java @@ -7,19 +7,24 @@ import org.apache.ibatis.exceptions.TooManyResultsException; import org.springframework.beans.factory.annotation.Autowired; import tk.mybatis.mapper.entity.Condition; +import javax.annotation.Resource; import java.lang.reflect.Field; import java.lang.reflect.ParameterizedType; import java.util.List; /** * 基于通用MyBatis Mapper插件的Service接口的实现 + * + * @author ronger */ public abstract class AbstractService implements Service { @Autowired protected Mapper mapper; - - private Class modelClass; // 当前泛型真实类型的Class + /** + * 当前泛型真实类型的Class + */ + private Class modelClass; public AbstractService() { ParameterizedType pt = (ParameterizedType) this.getClass().getGenericSuperclass(); diff --git a/src/main/java/com/rymcu/forest/core/service/Service.java b/src/main/java/com/rymcu/forest/core/service/Service.java index bf69a13..b755c14 100644 --- a/src/main/java/com/rymcu/forest/core/service/Service.java +++ b/src/main/java/com/rymcu/forest/core/service/Service.java @@ -8,16 +8,85 @@ import java.util.List; /** * Service 层 基础接口,其他Service 接口 请继承该接口 + * + * @author ronger */ public interface Service { - void save(T model);//持久化 - void save(List models);//批量持久化 - void deleteById(String id);//通过主鍵刪除 - void deleteByIds(String ids);//批量刪除 eg:ids -> “1,2,3,4” - void update(T model);//更新 - T findById(String id);//通过ID查找 - T findBy(String fieldName, Object value) throws TooManyResultsException, ServiceException; //通过Model中某个成员变量名称(非数据表中column的名称)查找,value需符合unique约束 - List findByIds(String ids);//通过多个ID查找//eg:ids -> “1,2,3,4” - List findByCondition(Condition condition);//根据条件查找 - List findAll();//获取所有 + /** + * 持久化 + * + * @param model + */ + void save(T model); + + /** + * 批量持久化 + * + * @param models + */ + void save(List models); + + /** + * 通过主鍵刪除 + * + * @param id + */ + void deleteById(String id); + + /** + * 批量刪除 eg:ids -> “1,2,3,4” + * + * @param ids + */ + void deleteByIds(String ids); + + /** + * 更新 + * + * @param model + */ + void update(T model); + + /** + * 通过ID查找 + * + * @param id + * @return + */ + T findById(String id); + + /** + * 通过Model中某个成员变量名称(非数据表中column的名称)查找,value需符合unique约束 + * + * @param fieldName + * @param value + * @return + * @throws TooManyResultsException + * @throws ServiceException + */ + T findBy(String fieldName, Object value) throws TooManyResultsException, ServiceException; + + + /** + * 通过多个ID查找//eg:ids -> “1,2,3,4” + * + * @param ids + * @return + */ + List findByIds(String ids); + + /** + * 根据条件查找 + * + * @param condition + * @return + */ + List findByCondition(Condition condition); + + /** + * 获取所有 + * + * @return + */ + List findAll(); } diff --git a/src/main/java/com/rymcu/forest/enumerate/TransactionCode.java b/src/main/java/com/rymcu/forest/enumerate/TransactionCode.java new file mode 100644 index 0000000..233331a --- /dev/null +++ b/src/main/java/com/rymcu/forest/enumerate/TransactionCode.java @@ -0,0 +1,28 @@ +package com.rymcu.forest.enumerate; + +/** + * @author ronger + */ + +public enum TransactionCode { + + InsufficientBalance(901, "余额不足"); + + private int code; + + private String message; + + TransactionCode(int code, String message) { + this.code = code; + this.message = message; + } + + + public String getMessage() { + return this.message; + } + + public int getCode() { + return this.code; + } +} diff --git a/src/main/java/com/rymcu/forest/enumerate/SponsorEnum.java b/src/main/java/com/rymcu/forest/enumerate/TransactionEnum.java similarity index 57% rename from src/main/java/com/rymcu/forest/enumerate/SponsorEnum.java rename to src/main/java/com/rymcu/forest/enumerate/TransactionEnum.java index 7efc1e7..2eb7202 100644 --- a/src/main/java/com/rymcu/forest/enumerate/SponsorEnum.java +++ b/src/main/java/com/rymcu/forest/enumerate/TransactionEnum.java @@ -4,14 +4,16 @@ package com.rymcu.forest.enumerate; * @author ronger */ -public enum SponsorEnum { - Article("0", 20); +public enum TransactionEnum { + ArticleSponsor("0", 20), + Answer("1", 30), + CorrectAnswer("2", 50); private String dataType; private Integer money; - SponsorEnum(String dataType, Integer money) { + TransactionEnum(String dataType, Integer money) { this.dataType = dataType; this.money = money; } @@ -24,7 +26,7 @@ public enum SponsorEnum { return this.money; } - public boolean isArticle() { - return Article.equals(this); + public boolean isArticleSponsor() { + return ArticleSponsor.equals(this); } } diff --git a/src/main/java/com/rymcu/forest/service/impl/SponsorServiceImpl.java b/src/main/java/com/rymcu/forest/service/impl/SponsorServiceImpl.java index 8b1e589..9401c38 100644 --- a/src/main/java/com/rymcu/forest/service/impl/SponsorServiceImpl.java +++ b/src/main/java/com/rymcu/forest/service/impl/SponsorServiceImpl.java @@ -1,11 +1,13 @@ package com.rymcu.forest.service.impl; +import com.rymcu.forest.core.exception.TransactionException; import com.rymcu.forest.core.service.AbstractService; import com.rymcu.forest.dto.ArticleDTO; import com.rymcu.forest.entity.Sponsor; import com.rymcu.forest.entity.TransactionRecord; import com.rymcu.forest.entity.User; -import com.rymcu.forest.enumerate.SponsorEnum; +import com.rymcu.forest.enumerate.TransactionCode; +import com.rymcu.forest.enumerate.TransactionEnum; import com.rymcu.forest.mapper.SponsorMapper; import com.rymcu.forest.service.ArticleService; import com.rymcu.forest.service.SponsorService; @@ -39,7 +41,7 @@ public class SponsorServiceImpl extends AbstractService implements Spon map.put("success", false); map.put("message", "数据异常"); } else { - SponsorEnum result = Arrays.stream(SponsorEnum.values()).filter(sponsorEnum -> sponsorEnum.getDataType().equals(sponsor.getDataType())).findFirst().orElse(SponsorEnum.Article); + TransactionEnum result = TransactionEnum.valueOf(sponsor.getDataType()); BigDecimal money = BigDecimal.valueOf(result.getMoney()); sponsor.setSponsorshipMoney(money); User user = UserUtils.getCurrentUserByToken(); @@ -47,11 +49,11 @@ public class SponsorServiceImpl extends AbstractService implements Spon sponsor.setSponsorshipTime(new Date()); sponsorMapper.insertSelective(sponsor); // 赞赏金额划转 - if (result.isArticle()) { + if (result.isArticleSponsor()) { ArticleDTO articleDTO = articleService.findArticleDTOById(sponsor.getDataId(), 1); TransactionRecord transactionRecord = transactionRecordService.transferByUserId(articleDTO.getArticleAuthorId(), user.getIdUser(), money); if (Objects.isNull(transactionRecord.getIdTransactionRecord())) { - throw new Exception("余额不足"); + throw new TransactionException(TransactionCode.InsufficientBalance); } // 更新文章赞赏数 sponsorMapper.updateArticleSponsorCount(articleDTO.getIdArticle()); From 95d2e6747e0327ff261064d3fb34c7ce71a9a671 Mon Sep 17 00:00:00 2001 From: ronger Date: Tue, 2 Feb 2021 09:43:58 +0800 Subject: [PATCH 02/19] :bug: https://github.com/rymcu/forest/issues/30 --- .../forest/config/BaseExceptionHandler.java | 44 +++++++++++-------- .../core/exception/TransactionException.java | 13 ------ .../forest/enumerate/TransactionEnum.java | 6 +++ .../service/impl/SponsorServiceImpl.java | 2 +- .../impl/TransactionRecordServiceImpl.java | 4 +- 5 files changed, 36 insertions(+), 33 deletions(-) diff --git a/src/main/java/com/rymcu/forest/config/BaseExceptionHandler.java b/src/main/java/com/rymcu/forest/config/BaseExceptionHandler.java index 5d60bf3..a73714f 100644 --- a/src/main/java/com/rymcu/forest/config/BaseExceptionHandler.java +++ b/src/main/java/com/rymcu/forest/config/BaseExceptionHandler.java @@ -2,8 +2,10 @@ package com.rymcu.forest.config; import com.alibaba.fastjson.support.spring.FastJsonJsonView; import com.rymcu.forest.core.exception.ServiceException; +import com.rymcu.forest.core.exception.TransactionException; import com.rymcu.forest.core.result.GlobalResult; import com.rymcu.forest.core.result.ResultCode; +import com.rymcu.forest.enumerate.TransactionCode; import com.rymcu.forest.web.api.exception.BaseApiException; import org.apache.shiro.authz.UnauthenticatedException; import org.apache.shiro.authz.UnauthorizedException; @@ -25,7 +27,7 @@ import java.util.Map; * 全局异常处理器 * * @author ronger - * */ + */ @RestControllerAdvice public class BaseExceptionHandler { @@ -33,10 +35,10 @@ public class BaseExceptionHandler { @SuppressWarnings("Duplicates") @ExceptionHandler(Exception.class) - public Object errorHandler(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex){ - if(isAjax(request)){ + public Object errorHandler(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { + if (isAjax(request)) { GlobalResult result = new GlobalResult(); - if (ex instanceof BaseApiException){ + if (ex instanceof BaseApiException) { result.setCode(401); result.setMessage("用户未登录"); logger.info("用户未登录"); @@ -48,7 +50,7 @@ public class BaseExceptionHandler { result.setCode(1000002); result.setMessage("用户无权限"); logger.info("用户无权限"); - }else if (ex instanceof ServiceException) { + } else if (ex instanceof ServiceException) { //业务失败的异常,如“账号或密码错误” result.setCode(((ServiceException) ex).getCode()); result.setMessage(ex.getMessage()); @@ -59,7 +61,10 @@ public class BaseExceptionHandler { } else if (ex instanceof ServletException) { result.setCode(ResultCode.FAIL.getCode()); result.setMessage(ex.getMessage()); - }else { + } else if (ex instanceof TransactionException) { + result.setCode(TransactionCode.InsufficientBalance.getCode()); + result.setMessage(ex.getMessage()); + } else { //系统内部异常,不返回给客户端,内部记录错误日志 result.setCode(ResultCode.INTERNAL_SERVER_ERROR.getCode()); String message; @@ -78,11 +83,11 @@ public class BaseExceptionHandler { } result.setSuccess(false); return result; - }else { + } else { ModelAndView mv = new ModelAndView(); FastJsonJsonView view = new FastJsonJsonView(); Map attributes = new HashMap(2); - if (ex instanceof BaseApiException){ + if (ex instanceof BaseApiException) { attributes.put("code", "401"); attributes.put("message", "用户未登录"); } else if (ex instanceof UnauthenticatedException) { @@ -93,18 +98,21 @@ public class BaseExceptionHandler { attributes.put("message", "用户无权限"); } else if (ex instanceof ServiceException) { //业务失败的异常,如“账号或密码错误” - attributes.put("code",((ServiceException) ex).getCode()); - attributes.put("message",ex.getMessage()); + attributes.put("code", ((ServiceException) ex).getCode()); + attributes.put("message", ex.getMessage()); logger.info(ex.getMessage()); } else if (ex instanceof NoHandlerFoundException) { - attributes.put("code",ResultCode.NOT_FOUND.getCode()); - attributes.put("message",ResultCode.NOT_FOUND.getMessage()); + attributes.put("code", ResultCode.NOT_FOUND.getCode()); + attributes.put("message", ResultCode.NOT_FOUND.getMessage()); } else if (ex instanceof ServletException) { - attributes.put("code",ResultCode.FAIL.getCode()); - attributes.put("message",ex.getMessage()); - }else { + attributes.put("code", ResultCode.FAIL.getCode()); + attributes.put("message", ex.getMessage()); + } else if (ex instanceof TransactionException) { + attributes.put("code", TransactionCode.InsufficientBalance.getCode()); + attributes.put("message", ex.getMessage()); + } else { //系统内部异常,不返回给客户端,内部记录错误日志 - attributes.put("code",ResultCode.INTERNAL_SERVER_ERROR.getCode()); + attributes.put("code", ResultCode.INTERNAL_SERVER_ERROR.getCode()); String message; if (handler instanceof HandlerMethod) { HandlerMethod handlerMethod = (HandlerMethod) handler; @@ -117,9 +125,9 @@ public class BaseExceptionHandler { message = ex.getMessage(); } logger.error(message, ex); - attributes.put("message","操作失败"); + attributes.put("message", "操作失败"); } - attributes.put("success",false); + attributes.put("success", false); view.setAttributesMap(attributes); mv.setView(view); return mv; diff --git a/src/main/java/com/rymcu/forest/core/exception/TransactionException.java b/src/main/java/com/rymcu/forest/core/exception/TransactionException.java index 16e66b2..5ecb5dd 100644 --- a/src/main/java/com/rymcu/forest/core/exception/TransactionException.java +++ b/src/main/java/com/rymcu/forest/core/exception/TransactionException.java @@ -19,17 +19,4 @@ public class TransactionException extends Exception { public int getCode() { return code; } - - public void setCode(int code) { - this.code = code; - } - - @Override - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } } diff --git a/src/main/java/com/rymcu/forest/enumerate/TransactionEnum.java b/src/main/java/com/rymcu/forest/enumerate/TransactionEnum.java index 2eb7202..e8eb801 100644 --- a/src/main/java/com/rymcu/forest/enumerate/TransactionEnum.java +++ b/src/main/java/com/rymcu/forest/enumerate/TransactionEnum.java @@ -1,5 +1,7 @@ package com.rymcu.forest.enumerate; +import java.util.Arrays; + /** * @author ronger */ @@ -18,6 +20,10 @@ public enum TransactionEnum { this.money = money; } + public static TransactionEnum findTransactionEnum(String dataType) { + return Arrays.stream(TransactionEnum.values()).filter(transactionEnum -> transactionEnum.getDataType().equals(dataType)).findFirst().orElse(TransactionEnum.ArticleSponsor); + } + public String getDataType() { return this.dataType; } diff --git a/src/main/java/com/rymcu/forest/service/impl/SponsorServiceImpl.java b/src/main/java/com/rymcu/forest/service/impl/SponsorServiceImpl.java index 9401c38..e6555ff 100644 --- a/src/main/java/com/rymcu/forest/service/impl/SponsorServiceImpl.java +++ b/src/main/java/com/rymcu/forest/service/impl/SponsorServiceImpl.java @@ -41,7 +41,7 @@ public class SponsorServiceImpl extends AbstractService implements Spon map.put("success", false); map.put("message", "数据异常"); } else { - TransactionEnum result = TransactionEnum.valueOf(sponsor.getDataType()); + TransactionEnum result = TransactionEnum.findTransactionEnum(sponsor.getDataType()); BigDecimal money = BigDecimal.valueOf(result.getMoney()); sponsor.setSponsorshipMoney(money); User user = UserUtils.getCurrentUserByToken(); diff --git a/src/main/java/com/rymcu/forest/service/impl/TransactionRecordServiceImpl.java b/src/main/java/com/rymcu/forest/service/impl/TransactionRecordServiceImpl.java index 7925da4..94c16da 100644 --- a/src/main/java/com/rymcu/forest/service/impl/TransactionRecordServiceImpl.java +++ b/src/main/java/com/rymcu/forest/service/impl/TransactionRecordServiceImpl.java @@ -1,12 +1,14 @@ package com.rymcu.forest.service.impl; import com.rymcu.forest.core.exception.ServiceException; +import com.rymcu.forest.core.exception.TransactionException; import com.rymcu.forest.core.service.AbstractService; import com.rymcu.forest.core.service.redis.RedisService; import com.rymcu.forest.dto.BankAccountDTO; import com.rymcu.forest.dto.TransactionRecordDTO; import com.rymcu.forest.entity.BankAccount; import com.rymcu.forest.entity.TransactionRecord; +import com.rymcu.forest.enumerate.TransactionCode; import com.rymcu.forest.mapper.TransactionRecordMapper; import com.rymcu.forest.service.BankAccountService; import com.rymcu.forest.service.TransactionRecordService; @@ -47,7 +49,7 @@ public class TransactionRecordServiceImpl extends AbstractService Date: Tue, 2 Feb 2021 09:45:46 +0800 Subject: [PATCH 03/19] :bug: https://github.com/rymcu/forest/issues/31 --- src/main/java/com/rymcu/forest/mapper/ArticleMapper.java | 6 ++++++ .../com/rymcu/forest/service/impl/ArticleServiceImpl.java | 2 ++ src/main/java/mapper/ArticleMapper.xml | 3 +++ 3 files changed, 11 insertions(+) diff --git a/src/main/java/com/rymcu/forest/mapper/ArticleMapper.java b/src/main/java/com/rymcu/forest/mapper/ArticleMapper.java index 4f9d5ca..58a34d2 100644 --- a/src/main/java/com/rymcu/forest/mapper/ArticleMapper.java +++ b/src/main/java/com/rymcu/forest/mapper/ArticleMapper.java @@ -184,4 +184,10 @@ public interface ArticleMapper extends Mapper
{ * @return */ int updatePerfect(@Param("idArticle") Integer idArticle, @Param("articlePerfect") String articlePerfect); + + /** + * 删除文章关联文章内容表信息 + * @param idArticle + */ + void deleteArticleContent(@Param("idArticle") Integer idArticle); } diff --git a/src/main/java/com/rymcu/forest/service/impl/ArticleServiceImpl.java b/src/main/java/com/rymcu/forest/service/impl/ArticleServiceImpl.java index faaa500..386dee6 100644 --- a/src/main/java/com/rymcu/forest/service/impl/ArticleServiceImpl.java +++ b/src/main/java/com/rymcu/forest/service/impl/ArticleServiceImpl.java @@ -268,6 +268,8 @@ public class ArticleServiceImpl extends AbstractService
implements Arti articleMapper.deleteLinkedPortfolioData(id); // 删除引用标签记录 articleMapper.deleteTagArticle(id); + // 删除文章内容表 + articleMapper.deleteArticleContent(id); } @Override diff --git a/src/main/java/mapper/ArticleMapper.xml b/src/main/java/mapper/ArticleMapper.xml index 240f694..6378b98 100644 --- a/src/main/java/mapper/ArticleMapper.xml +++ b/src/main/java/mapper/ArticleMapper.xml @@ -97,6 +97,9 @@ delete from forest_portfolio_article where id_article = #{id} + + delete from forest_article_content where id_article = #{idArticle} + + \ No newline at end of file From eacb753e55ea769f05bcf83a8cd7f18d3b8b2313 Mon Sep 17 00:00:00 2001 From: ronger Date: Wed, 24 Feb 2021 09:08:56 +0800 Subject: [PATCH 05/19] =?UTF-8?q?:bug:=20=E6=B6=88=E6=81=AF=E9=80=9A?= =?UTF-8?q?=E7=9F=A5=E5=88=86=E9=A1=B5=E9=97=AE=E9=A2=98=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/rymcu/forest/mapper/NotificationMapper.java | 3 ++- .../forest/service/impl/NotificationServiceImpl.java | 9 ++++----- src/main/java/mapper/NotificationMapper.xml | 11 ++++++++++- 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/rymcu/forest/mapper/NotificationMapper.java b/src/main/java/com/rymcu/forest/mapper/NotificationMapper.java index 8a3dd6f..2ae27ad 100644 --- a/src/main/java/com/rymcu/forest/mapper/NotificationMapper.java +++ b/src/main/java/com/rymcu/forest/mapper/NotificationMapper.java @@ -1,6 +1,7 @@ package com.rymcu.forest.mapper; import com.rymcu.forest.core.mapper.Mapper; +import com.rymcu.forest.dto.NotificationDTO; import com.rymcu.forest.entity.Notification; import org.apache.ibatis.annotations.Param; @@ -23,7 +24,7 @@ public interface NotificationMapper extends Mapper { * @param idUser * @return */ - List selectNotifications(@Param("idUser") Integer idUser); + List selectNotifications(@Param("idUser") Integer idUser); /** * 获取消息数据 diff --git a/src/main/java/com/rymcu/forest/service/impl/NotificationServiceImpl.java b/src/main/java/com/rymcu/forest/service/impl/NotificationServiceImpl.java index 7aef442..4883182 100644 --- a/src/main/java/com/rymcu/forest/service/impl/NotificationServiceImpl.java +++ b/src/main/java/com/rymcu/forest/service/impl/NotificationServiceImpl.java @@ -49,13 +49,12 @@ public class NotificationServiceImpl extends AbstractService imple @Override public List findNotifications(Integer idUser) { - List list = notificationMapper.selectNotifications(idUser); - List notifications = new ArrayList<>(); + List list = notificationMapper.selectNotifications(idUser); list.forEach(notification -> { NotificationDTO notificationDTO = genNotification(notification); // 判断关联数据是否已删除 if (Objects.nonNull(notificationDTO.getAuthor())) { - notifications.add(notificationDTO); + BeanCopierUtil.copy(notificationDTO, notification); } else { // 关联数据已删除,且未读 if (unRead.equals(notification.getHasRead())) { @@ -66,10 +65,10 @@ public class NotificationServiceImpl extends AbstractService imple dto.setDataType("-1"); dto.setHasRead("1"); dto.setCreatedTime(notification.getCreatedTime()); - notifications.add(dto); + BeanCopierUtil.copy(dto, notification); } }); - return notifications; + return list; } private NotificationDTO genNotification(Notification notification) { diff --git a/src/main/java/mapper/NotificationMapper.xml b/src/main/java/mapper/NotificationMapper.xml index 81fa9b0..80ef662 100644 --- a/src/main/java/mapper/NotificationMapper.xml +++ b/src/main/java/mapper/NotificationMapper.xml @@ -10,6 +10,15 @@ + + + + + + + + + insert into forest_notification (id_user, data_type, data_id, data_summary, created_time) values (#{idUser}, #{dataType}, #{dataId}, #{dataSummary}, sysdate()) @@ -19,7 +28,7 @@ - select * from forest_notification where id_user = #{idUser} order by created_time desc - select * from forest_transaction_record where form_bank_account = #{bankAccount} or to_bank_account = #{bankAccount} + select * from forest_transaction_record where form_bank_account = #{bankAccount} or to_bank_account = #{bankAccount} order by transaction_time desc select * from forest_user where id = #{id} + \ No newline at end of file From 0652405281a79d0dcbc707f5e56f6ef7445cfd1e Mon Sep 17 00:00:00 2001 From: ronger Date: Sat, 6 Mar 2021 10:00:42 +0800 Subject: [PATCH 09/19] =?UTF-8?q?:bug:=20=E6=B6=88=E6=81=AF=E4=B8=AD?= =?UTF-8?q?=E5=BF=83=E6=8E=92=E5=BA=8F=E9=97=AE=E9=A2=98=E4=BC=98=E5=8C=96?= =?UTF-8?q?,=E6=9C=AA=E8=AF=BB=E6=B6=88=E6=81=AF=E4=BC=98=E5=85=88?= =?UTF-8?q?=E5=B1=95=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/mapper/NotificationMapper.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/mapper/NotificationMapper.xml b/src/main/java/mapper/NotificationMapper.xml index 80ef662..144d4ca 100644 --- a/src/main/java/mapper/NotificationMapper.xml +++ b/src/main/java/mapper/NotificationMapper.xml @@ -29,7 +29,7 @@ select * from forest_notification where has_read = '0' and id_user = #{idUser} order by created_time desc \ No newline at end of file From 9aa0aad6554143fb38cedf8a7ed0aea0803eb330 Mon Sep 17 00:00:00 2001 From: ronger Date: Sat, 6 Mar 2021 21:31:31 +0800 Subject: [PATCH 11/19] =?UTF-8?q?:sparkles:=20=E4=BD=9C=E5=93=81=E9=9B=86?= =?UTF-8?q?=E9=9D=A2=E6=9D=BF=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../forest/web/api/common/CommonApiController.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/main/java/com/rymcu/forest/web/api/common/CommonApiController.java b/src/main/java/com/rymcu/forest/web/api/common/CommonApiController.java index d9e330a..ca68996 100644 --- a/src/main/java/com/rymcu/forest/web/api/common/CommonApiController.java +++ b/src/main/java/com/rymcu/forest/web/api/common/CommonApiController.java @@ -7,6 +7,7 @@ import com.rymcu.forest.core.result.GlobalResultGenerator; import com.rymcu.forest.core.result.GlobalResultMessage; import com.rymcu.forest.core.service.log.annotation.VisitLogger; import com.rymcu.forest.dto.*; +import com.rymcu.forest.entity.Portfolio; import com.rymcu.forest.entity.User; import com.rymcu.forest.service.*; import com.rymcu.forest.util.UserUtils; @@ -140,4 +141,16 @@ public class CommonApiController { List list = SearchService.initialSearch(); return GlobalResultGenerator.genSuccessResult(list); } + + @GetMapping("/portfolios") + public GlobalResult portfolios(@RequestParam(defaultValue = "0") Integer page, @RequestParam(defaultValue = "10") Integer rows) { + PageHelper.startPage(page, rows); + List list = portfolioService.findAll(); + PageInfo pageInfo = new PageInfo(list); + Map map = new HashMap(2); + map.put("portfolios", pageInfo.getList()); + Map pagination = Utils.getPagination(pageInfo); + map.put("pagination", pagination); + return GlobalResultGenerator.genSuccessResult(map); + } } From e7afb5e67edecac3fc21f47ebb32786f2022976c Mon Sep 17 00:00:00 2001 From: ronger Date: Mon, 8 Mar 2021 10:35:49 +0800 Subject: [PATCH 12/19] =?UTF-8?q?:art:=20=E6=89=A9=E5=B1=95=20`forest=5Fco?= =?UTF-8?q?mment`=20=E8=A1=A8=20`comment=5Fua`=20=E5=AD=97=E6=AE=B5(varcha?= =?UTF-8?q?r(128)=20->=20varchar(512))?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/static/forest.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/static/forest.sql b/src/main/resources/static/forest.sql index bd27ce5..b492f44 100644 --- a/src/main/resources/static/forest.sql +++ b/src/main/resources/static/forest.sql @@ -84,7 +84,7 @@ create table forest_comment comment_original_comment_id bigint null comment '父评论 id', comment_status char default '0' null comment '状态', comment_ip varchar(128) null comment '评论 IP', - comment_ua varchar(128) null comment 'User-Agent', + comment_ua varchar(512) null comment 'User-Agent', comment_anonymous char null comment '0:公开回帖,1:匿名回帖', comment_reply_count int null comment '回帖计数', comment_visible char null comment '0:所有人可见,1:仅楼主和自己可见', From 198cff64a5727ac5c25318997f656ba7249226f1 Mon Sep 17 00:00:00 2001 From: ronger Date: Mon, 15 Mar 2021 21:21:27 +0800 Subject: [PATCH 13/19] =?UTF-8?q?:art:=20=E4=BD=9C=E5=93=81=E9=9B=86?= =?UTF-8?q?=E5=B1=95=E7=A4=BA=E6=95=88=E6=9E=9C=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/rymcu/forest/mapper/PortfolioMapper.java | 6 ++++++ .../java/com/rymcu/forest/service/PortfolioService.java | 6 ++++++ .../com/rymcu/forest/service/impl/PortfolioServiceImpl.java | 5 +++++ .../rymcu/forest/web/api/common/CommonApiController.java | 4 ++-- src/main/java/mapper/PortfolioMapper.xml | 3 +++ 5 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/rymcu/forest/mapper/PortfolioMapper.java b/src/main/java/com/rymcu/forest/mapper/PortfolioMapper.java index 7439e31..d90c0b0 100644 --- a/src/main/java/com/rymcu/forest/mapper/PortfolioMapper.java +++ b/src/main/java/com/rymcu/forest/mapper/PortfolioMapper.java @@ -73,4 +73,10 @@ public interface PortfolioMapper extends Mapper { * @return */ Integer unbindArticle(@Param("idPortfolio") Integer idPortfolio, @Param("idArticle") Integer idArticle); + + /** + * 获取作品集列表数据 + * @return + */ + List selectPortfolios(); } diff --git a/src/main/java/com/rymcu/forest/service/PortfolioService.java b/src/main/java/com/rymcu/forest/service/PortfolioService.java index 9413ccd..df8d2e7 100644 --- a/src/main/java/com/rymcu/forest/service/PortfolioService.java +++ b/src/main/java/com/rymcu/forest/service/PortfolioService.java @@ -77,4 +77,10 @@ public interface PortfolioService extends Service { * @return */ Map deletePortfolio(Integer idPortfolio); + + /** + * 获取作品集列表数据 + * @return + */ + List findPortfolios(); } diff --git a/src/main/java/com/rymcu/forest/service/impl/PortfolioServiceImpl.java b/src/main/java/com/rymcu/forest/service/impl/PortfolioServiceImpl.java index b6aa53c..af9a0fc 100644 --- a/src/main/java/com/rymcu/forest/service/impl/PortfolioServiceImpl.java +++ b/src/main/java/com/rymcu/forest/service/impl/PortfolioServiceImpl.java @@ -174,6 +174,11 @@ public class PortfolioServiceImpl extends AbstractService implements return map; } + @Override + public List findPortfolios() { + return portfolioMapper.selectPortfolios(); + } + private PortfolioDTO genPortfolioAuthor(PortfolioDTO portfolioDTO, Author author) { portfolioDTO.setPortfolioAuthorAvatarUrl(author.getUserAvatarURL()); portfolioDTO.setPortfolioAuthorName(author.getUserNickname()); diff --git a/src/main/java/com/rymcu/forest/web/api/common/CommonApiController.java b/src/main/java/com/rymcu/forest/web/api/common/CommonApiController.java index ca68996..88d4931 100644 --- a/src/main/java/com/rymcu/forest/web/api/common/CommonApiController.java +++ b/src/main/java/com/rymcu/forest/web/api/common/CommonApiController.java @@ -143,9 +143,9 @@ public class CommonApiController { } @GetMapping("/portfolios") - public GlobalResult portfolios(@RequestParam(defaultValue = "0") Integer page, @RequestParam(defaultValue = "10") Integer rows) { + public GlobalResult portfolios(@RequestParam(defaultValue = "0") Integer page, @RequestParam(defaultValue = "12") Integer rows) { PageHelper.startPage(page, rows); - List list = portfolioService.findAll(); + List list = portfolioService.findPortfolios(); PageInfo pageInfo = new PageInfo(list); Map map = new HashMap(2); map.put("portfolios", pageInfo.getList()); diff --git a/src/main/java/mapper/PortfolioMapper.xml b/src/main/java/mapper/PortfolioMapper.xml index 58c6eb9..ac07b15 100644 --- a/src/main/java/mapper/PortfolioMapper.xml +++ b/src/main/java/mapper/PortfolioMapper.xml @@ -51,4 +51,7 @@ + \ No newline at end of file From ab45193ae81fc70795efc055bfe93601225819ca Mon Sep 17 00:00:00 2001 From: ronger Date: Tue, 16 Mar 2021 11:00:26 +0800 Subject: [PATCH 14/19] =?UTF-8?q?:arrow=5Fup:=20XStream=20<=201.4.15=20?= =?UTF-8?q?=E5=8F=8D=E5=BA=8F=E5=88=97=E5=8C=96=E6=BC=8F=E6=B4=9E=EF=BC=88?= =?UTF-8?q?CVE-2020-26258=E3=80=81CVE-2020-26259=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 69e23de..bff52cb 100644 --- a/pom.xml +++ b/pom.xml @@ -172,7 +172,7 @@ com.github.binarywang weixin-java-open - 3.9.0 + 4.0.0 commons-codec @@ -182,8 +182,17 @@ commons-io commons-io + + com.thoughtworks.xstream + xstream + + + com.thoughtworks.xstream + xstream + 1.4.15 + com.github.jedis-lock jedis-lock From d568139748086cabafe43d99ba0f573ed3e15495 Mon Sep 17 00:00:00 2001 From: ronger Date: Wed, 17 Mar 2021 09:58:12 +0800 Subject: [PATCH 15/19] :arrow_up: wx-java-open --- .../forest/wx/mp/controller/WxRedirectController.java | 8 ++++---- .../rymcu/forest/wx/mp/controller/WxoAuthController.java | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/rymcu/forest/wx/mp/controller/WxRedirectController.java b/src/main/java/com/rymcu/forest/wx/mp/controller/WxRedirectController.java index 0395f65..2e0364c 100644 --- a/src/main/java/com/rymcu/forest/wx/mp/controller/WxRedirectController.java +++ b/src/main/java/com/rymcu/forest/wx/mp/controller/WxRedirectController.java @@ -1,10 +1,10 @@ package com.rymcu.forest.wx.mp.controller; import lombok.AllArgsConstructor; +import me.chanjar.weixin.common.bean.WxOAuth2UserInfo; +import me.chanjar.weixin.common.bean.oauth2.WxOAuth2AccessToken; import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.mp.api.WxMpService; -import me.chanjar.weixin.mp.bean.result.WxMpOAuth2AccessToken; -import me.chanjar.weixin.mp.bean.result.WxMpUser; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.PathVariable; @@ -27,8 +27,8 @@ public class WxRedirectController { } try { - WxMpOAuth2AccessToken accessToken = wxService.getOAuth2Service().getAccessToken(code); - WxMpUser user = wxService.getOAuth2Service().getUserInfo(accessToken, null); + WxOAuth2AccessToken accessToken = wxService.getOAuth2Service().getAccessToken(code); + WxOAuth2UserInfo user = wxService.getOAuth2Service().getUserInfo(accessToken, null); map.put("user", user); } catch (WxErrorException e) { e.printStackTrace(); diff --git a/src/main/java/com/rymcu/forest/wx/mp/controller/WxoAuthController.java b/src/main/java/com/rymcu/forest/wx/mp/controller/WxoAuthController.java index d302914..7e0ba87 100644 --- a/src/main/java/com/rymcu/forest/wx/mp/controller/WxoAuthController.java +++ b/src/main/java/com/rymcu/forest/wx/mp/controller/WxoAuthController.java @@ -4,10 +4,10 @@ import com.rymcu.forest.service.WxUserService; import com.rymcu.forest.util.ContextHolderUtils; import me.chanjar.weixin.common.api.WxConsts; import me.chanjar.weixin.common.bean.WxJsapiSignature; +import me.chanjar.weixin.common.bean.oauth2.WxOAuth2AccessToken; import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.common.util.http.URIUtil; import me.chanjar.weixin.mp.api.WxMpService; -import me.chanjar.weixin.mp.bean.result.WxMpOAuth2AccessToken; import me.chanjar.weixin.mp.bean.result.WxMpUser; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Controller; @@ -52,7 +52,7 @@ public class WxoAuthController { @GetMapping("getAccessToken") public String getAccessToken(@PathVariable String appId, @RequestParam(name = "code") String code, @RequestParam(name = "redirectUrl") String redirectUrl) throws Exception { wxMpService.switchoverTo(appId); - WxMpOAuth2AccessToken oAuth2AccessToken = wxMpService.getOAuth2Service().getAccessToken(code); + WxOAuth2AccessToken oAuth2AccessToken = wxMpService.getOAuth2Service().getAccessToken(code); boolean valid = wxMpService.getOAuth2Service().validateAccessToken(oAuth2AccessToken); if (!valid) { throw new Exception("无权限"); From ec642e3f2e61daa7a4a395b43994c12b5b035905 Mon Sep 17 00:00:00 2001 From: ronger Date: Wed, 17 Mar 2021 09:59:24 +0800 Subject: [PATCH 16/19] =?UTF-8?q?:sparkles:=20=E9=80=9A=E8=BF=87=E8=AF=BB?= =?UTF-8?q?=E5=8F=96=E6=9C=AC=E5=9C=B0=20json=20=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E5=88=9B=E5=BB=BA=E5=85=AC=E4=BC=97=E5=8F=B7=E8=8F=9C=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wx/mp/controller/WxMenuController.java | 54 +++---------------- .../forest/wx/mp/service/WxMenuService.java | 17 ++++++ .../wx/mp/service/impl/WxMenuServiceImpl.java | 46 ++++++++++++++++ src/main/resources/wxMpMenus.json | 21 ++++++++ 4 files changed, 92 insertions(+), 46 deletions(-) create mode 100644 src/main/java/com/rymcu/forest/wx/mp/service/WxMenuService.java create mode 100644 src/main/java/com/rymcu/forest/wx/mp/service/impl/WxMenuServiceImpl.java create mode 100644 src/main/resources/wxMpMenus.json diff --git a/src/main/java/com/rymcu/forest/wx/mp/controller/WxMenuController.java b/src/main/java/com/rymcu/forest/wx/mp/controller/WxMenuController.java index 09668aa..1a0e8ad 100644 --- a/src/main/java/com/rymcu/forest/wx/mp/controller/WxMenuController.java +++ b/src/main/java/com/rymcu/forest/wx/mp/controller/WxMenuController.java @@ -1,5 +1,6 @@ package com.rymcu.forest.wx.mp.controller; +import com.rymcu.forest.wx.mp.service.WxMenuService; import lombok.AllArgsConstructor; import me.chanjar.weixin.common.bean.menu.WxMenu; import me.chanjar.weixin.common.bean.menu.WxMenuButton; @@ -7,8 +8,11 @@ import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.mp.api.WxMpService; import me.chanjar.weixin.mp.bean.menu.WxMpGetSelfMenuInfoResult; import me.chanjar.weixin.mp.bean.menu.WxMpMenu; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import java.io.IOException; import java.net.MalformedURLException; import static me.chanjar.weixin.common.api.WxConsts.MenuButtonType; @@ -21,7 +25,8 @@ import static me.chanjar.weixin.common.api.WxConsts.MenuButtonType; @RequestMapping("/wx/menu/{appId}") public class WxMenuController { private final WxMpService wxService; - + @Resource + private WxMenuService wxMenuService; /** *
      * 自定义菜单创建接口
@@ -38,52 +43,9 @@ public class WxMenuController {
     }
 
     @GetMapping("/create")
-    public String menuCreateSample(@PathVariable String appId) throws WxErrorException, MalformedURLException {
-        WxMenu menu = new WxMenu();
-        WxMenuButton button1 = new WxMenuButton();
-        button1.setType(MenuButtonType.VIEW);
-        button1.setName("官方网站");
-        button1.setUrl("https://rymcu.com");
-
-//        WxMenuButton button2 = new WxMenuButton();
-//        button2.setType(WxConsts.BUTTON_MINIPROGRAM);
-//        button2.setName("小程序");
-//        button2.setAppId("wx286b93c14bbf93aa");
-//        button2.setPagePath("pages/lunar/index.html");
-//        button2.setUrl("http://mp.weixin.qq.com");
-
-        WxMenuButton button3 = new WxMenuButton();
-        button3.setName("学习教程");
-
-        menu.getButtons().add(button1);
-//        menu.getButtons().add(button2);
-        menu.getButtons().add(button3);
-
-        WxMenuButton button31 = new WxMenuButton();
-        button31.setType(MenuButtonType.VIEW);
-        button31.setName("51单片机入门教程");
-        button31.setUrl("https://mp.weixin.qq.com/mp/homepage?__biz=MzA3NjMzMzM1Mw==&hid=1&sn=672df75323f9976d990f6be14355070b");
-
-//        WxMenuButton button34 = new WxMenuButton();
-//        button34.setType(MenuButtonType.VIEW);
-//        button34.setName("获取用户信息");
-//
-//        ServletRequestAttributes servletRequestAttributes =
-//            (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
-//        if (servletRequestAttributes != null) {
-//            HttpServletRequest request = servletRequestAttributes.getRequest();
-//            URL requestURL = new URL(request.getRequestURL().toString());
-//            String url = this.wxService.switchoverTo(appId).oauth2buildAuthorizationUrl(
-//                String.format("%s://%s/wx/redirect/%s/greet", requestURL.getProtocol(), requestURL.getHost(), appId),
-//                WxConsts.OAuth2Scope.SNSAPI_USERINFO, null);
-//            button34.setUrl(url);
-//        }
-
-        button3.getSubButtons().add(button31);
-//        button3.getSubButtons().add(button34);
-
+    public String menuCreateSample(@PathVariable String appId) throws WxErrorException, IOException {
         this.wxService.switchover(appId);
-        return this.wxService.getMenuService().menuCreate(menu);
+        return this.wxService.getMenuService().menuCreate(wxMenuService.getMenus());
     }
 
     /**
diff --git a/src/main/java/com/rymcu/forest/wx/mp/service/WxMenuService.java b/src/main/java/com/rymcu/forest/wx/mp/service/WxMenuService.java
new file mode 100644
index 0000000..b67745d
--- /dev/null
+++ b/src/main/java/com/rymcu/forest/wx/mp/service/WxMenuService.java
@@ -0,0 +1,17 @@
+package com.rymcu.forest.wx.mp.service;
+
+import me.chanjar.weixin.common.bean.menu.WxMenu;
+
+import java.io.IOException;
+
+/**
+ * @author ronger
+ */
+public interface WxMenuService {
+    /**
+     * 获取公众号菜单配置
+     * @return
+     * @throws IOException
+     */
+    WxMenu getMenus() throws IOException;
+}
diff --git a/src/main/java/com/rymcu/forest/wx/mp/service/impl/WxMenuServiceImpl.java b/src/main/java/com/rymcu/forest/wx/mp/service/impl/WxMenuServiceImpl.java
new file mode 100644
index 0000000..f70493c
--- /dev/null
+++ b/src/main/java/com/rymcu/forest/wx/mp/service/impl/WxMenuServiceImpl.java
@@ -0,0 +1,46 @@
+package com.rymcu.forest.wx.mp.service.impl;
+
+import com.rymcu.forest.wx.mp.service.WxMenuService;
+import me.chanjar.weixin.common.bean.menu.WxMenu;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.core.io.Resource;
+import org.springframework.stereotype.Service;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Scanner;
+
+/**
+ * @author ronger
+ */
+@Service
+public class WxMenuServiceImpl implements WxMenuService {
+    @Value("classpath:wxMpMenus.json")
+    private Resource menuResource;
+
+    @Override
+    public WxMenu getMenus() throws IOException {
+        File file = menuResource.getFile();
+        String menuJson = this.jsonRead(file);
+        WxMenu wxMenu = WxMenu.fromJson(menuJson);
+        return wxMenu;
+    }
+
+    private String jsonRead(File file) {
+        Scanner scanner = null;
+        StringBuilder buffer = new StringBuilder();
+        try {
+            scanner = new Scanner(file, "utf-8");
+            while (scanner.hasNextLine()) {
+                buffer.append(scanner.nextLine());
+            }
+        } catch (Exception e) {
+
+        } finally {
+            if (scanner != null) {
+                scanner.close();
+            }
+        }
+        return buffer.toString();
+    }
+}
diff --git a/src/main/resources/wxMpMenus.json b/src/main/resources/wxMpMenus.json
new file mode 100644
index 0000000..e2518f1
--- /dev/null
+++ b/src/main/resources/wxMpMenus.json
@@ -0,0 +1,21 @@
+{
+  "menu": {
+    "button": [
+      {
+        "type": "view",
+        "name": "官方网站",
+        "url": "https://rymcu.com"
+      },
+      {
+        "name": "学习教程",
+        "sub_button": [
+          {
+            "type": "view",
+            "name": "51单片机入门教程",
+            "url": "https://mp.weixin.qq.com/mp/homepage?__biz=MzA3NjMzMzM1Mw==&hid=1&sn=672df75323f9976d990f6be14355070b"
+          }
+        ]
+      }
+    ]
+  }
+}
\ No newline at end of file

From f9528399bf42e3549406725dec9d705b42916774 Mon Sep 17 00:00:00 2001
From: ronger 
Date: Thu, 25 Mar 2021 21:49:21 +0800
Subject: [PATCH 17/19] :poop: websocket

---
 .../forest/config/WebSocketStompConfig.java   |  2 +-
 .../web/api/common/WebSocketController.java   | 39 ++++---------------
 2 files changed, 8 insertions(+), 33 deletions(-)

diff --git a/src/main/java/com/rymcu/forest/config/WebSocketStompConfig.java b/src/main/java/com/rymcu/forest/config/WebSocketStompConfig.java
index a158e49..3eb259f 100644
--- a/src/main/java/com/rymcu/forest/config/WebSocketStompConfig.java
+++ b/src/main/java/com/rymcu/forest/config/WebSocketStompConfig.java
@@ -30,7 +30,7 @@ public class WebSocketStompConfig implements WebSocketMessageBrokerConfigurer {
     public void configureMessageBroker(MessageBrokerRegistry registry) {
 
         // 订阅Broker名称 user点对点 topic广播即群发
-        registry.enableSimpleBroker("/user","/public");
+        registry.enableSimpleBroker("/topic", "/user");
         // 全局(客户端)使用的消息前缀
         registry.setApplicationDestinationPrefixes("/app");
         // 点对点使用的前缀 无需配置 默认/user
diff --git a/src/main/java/com/rymcu/forest/web/api/common/WebSocketController.java b/src/main/java/com/rymcu/forest/web/api/common/WebSocketController.java
index 62f5e26..7a3a4b1 100644
--- a/src/main/java/com/rymcu/forest/web/api/common/WebSocketController.java
+++ b/src/main/java/com/rymcu/forest/web/api/common/WebSocketController.java
@@ -1,7 +1,6 @@
 package com.rymcu.forest.web.api.common;
 
 import com.alibaba.fastjson.JSONObject;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.messaging.handler.annotation.MessageMapping;
 import org.springframework.messaging.handler.annotation.SendTo;
 import org.springframework.messaging.simp.SimpMessagingTemplate;
@@ -9,7 +8,7 @@ import org.springframework.messaging.simp.annotation.SendToUser;
 import org.springframework.messaging.simp.stomp.StompHeaderAccessor;
 import org.springframework.stereotype.Controller;
 
-import java.util.HashMap;
+import javax.annotation.Resource;
 
 /**
  * @author ronger
@@ -17,42 +16,18 @@ import java.util.HashMap;
 @Controller
 public class WebSocketController {
 
-    @Autowired
+    @Resource
     private SimpMessagingTemplate template;
 
     @MessageMapping("/sendMessage")
-    @SendTo("/public/greetings")
-    public void sendMessage(JSONObject message, StompHeaderAccessor headerAccessor){
-        this.template.convertAndSend("/public/greetings",message);
+    @SendTo("/topic/greening")
+    public void sendMessage(JSONObject message, StompHeaderAccessor headerAccessor) {
+        this.template.convertAndSend("/topic/greening", message);
     }
 
     @MessageMapping("/message")
     @SendToUser("/message")
-    public void message(JSONObject message){
-        String type = message.get("type").toString();
-        HashMap res = (HashMap) message.get("data");
-        HashMap mine = (HashMap) res.get("mine");
-        HashMap to = (HashMap) res.get("to");
-        System.out.println(to.get("type"));
-        boolean flag = to.get("type").equals("friend")?true:false;
-        String id = to.get("id").toString();
-        HashMap map = new HashMap();
-        map.put("id",mine.get("id"));
-        map.put("avatar",mine.get("avatar"));
-        map.put("formid",mine.get("id"));
-        map.put("username",mine.get("username"));
-        map.put("type",to.get("type"));
-        map.put("content",mine.get("content"));
-        map.put("mine",false);
-        map.put("cid",0);
-        map.put("timestamp","");
-        JSONObject json = new JSONObject();
-        json.put("type",type);
-        json.put("data",map);
-        if(flag){
-            this.template.convertAndSendToUser(id,"/message",json);
-        }else{
-            this.template.convertAndSendToUser(id,"/message",json);
-        }
+    public void message(JSONObject message, StompHeaderAccessor headerAccessor) {
+        this.template.convertAndSendToUser(message.getString("to"), "/message", message);
     }
 }

From 13edb5a063f4e66e83c50b5965fecf51c412b955 Mon Sep 17 00:00:00 2001
From: ronger 
Date: Fri, 26 Mar 2021 10:46:21 +0800
Subject: [PATCH 18/19] =?UTF-8?q?:recycle:=20=E4=B8=AA=E4=BA=BA=E4=B8=AD?=
 =?UTF-8?q?=E5=BF=83=E8=B7=AF=E5=BE=84=20/user/nickname=20->=20/user/accou?=
 =?UTF-8?q?nt?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 pom.xml                                       |  2 +-
 .../forest/config/MybatisConfigurer.java      |  2 +-
 .../java/com/rymcu/forest/dto/Author.java     |  2 ++
 .../com/rymcu/forest/mapper/UserMapper.java   |  4 +--
 .../com/rymcu/forest/service/UserService.java | 10 +++---
 .../service/impl/ArticleServiceImpl.java      |  2 ++
 .../service/impl/PortfolioServiceImpl.java    |  5 +--
 .../forest/service/impl/UserServiceImpl.java  |  6 ++--
 .../forest/web/api/user/UserController.java   | 36 +++++++++----------
 .../wx/mp/controller/WxoAuthController.java   |  6 ++--
 src/main/java/mapper/UserMapper.xml           |  5 +--
 src/main/resources/wxMpMenus.json             |  5 +++
 12 files changed, 46 insertions(+), 39 deletions(-)

diff --git a/pom.xml b/pom.xml
index bff52cb..8edbd3b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -191,7 +191,7 @@
         
             com.thoughtworks.xstream
             xstream
-            1.4.15
+            1.4.16
         
         
             com.github.jedis-lock
diff --git a/src/main/java/com/rymcu/forest/config/MybatisConfigurer.java b/src/main/java/com/rymcu/forest/config/MybatisConfigurer.java
index 594882c..9aa708d 100644
--- a/src/main/java/com/rymcu/forest/config/MybatisConfigurer.java
+++ b/src/main/java/com/rymcu/forest/config/MybatisConfigurer.java
@@ -45,7 +45,7 @@ public class MybatisConfigurer {
         //添加XML目录
         ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
         factory.setMapperLocations(resolver.getResources("classpath:mapper/**/*.xml"));
-        factory.setTypeHandlersPackage("com.rymcu.forest.util.handlers");
+//        factory.setTypeHandlersPackage("com.rymcu.forest.util.handlers");
         return factory.getObject();
     }
 
diff --git a/src/main/java/com/rymcu/forest/dto/Author.java b/src/main/java/com/rymcu/forest/dto/Author.java
index 5dca54e..3782f01 100644
--- a/src/main/java/com/rymcu/forest/dto/Author.java
+++ b/src/main/java/com/rymcu/forest/dto/Author.java
@@ -12,6 +12,8 @@ public class Author {
 
     private String userNickname;
 
+    private String userAccount;
+
     private String userAvatarURL;
 
     private String userArticleCount;
diff --git a/src/main/java/com/rymcu/forest/mapper/UserMapper.java b/src/main/java/com/rymcu/forest/mapper/UserMapper.java
index 2d61a58..f23b726 100644
--- a/src/main/java/com/rymcu/forest/mapper/UserMapper.java
+++ b/src/main/java/com/rymcu/forest/mapper/UserMapper.java
@@ -39,10 +39,10 @@ public interface UserMapper extends Mapper {
 
     /**
      * 根据用户昵称获取用户信息
-     * @param nickname
+     * @param account
      * @return
      */
-    UserDTO selectUserDTOByNickname(@Param("nickname") String nickname);
+    UserDTO selectUserDTOByAccount(@Param("account") String account);
 
     /**
      * 修改用户密码
diff --git a/src/main/java/com/rymcu/forest/service/UserService.java b/src/main/java/com/rymcu/forest/service/UserService.java
index 7fcca8f..31ad8c3 100644
--- a/src/main/java/com/rymcu/forest/service/UserService.java
+++ b/src/main/java/com/rymcu/forest/service/UserService.java
@@ -43,11 +43,11 @@ public interface UserService extends Service {
     Map login(String account, String password);
 
     /**
-     * 通过 nickname 获取用户信息接口
-     * @param nickname 昵称
+     * 通过 account 获取用户信息接口
+     * @param account 昵称
      * @return  UserDTO
      * */
-    UserDTO findUserDTOByNickname(String nickname);
+    UserDTO findUserDTOByAccount(String account);
 
     /**
      * 找回密码接口
@@ -118,10 +118,10 @@ public interface UserService extends Service {
 
     /**
      * 获取用户扩展信息
-     * @param nickname
+     * @param account
      * @return
      */
-    UserExtend selectUserExtendByNickname(String nickname);
+    UserExtend selectUserExtendByAccount(String account);
 
     /**
      * 更换邮箱
diff --git a/src/main/java/com/rymcu/forest/service/impl/ArticleServiceImpl.java b/src/main/java/com/rymcu/forest/service/impl/ArticleServiceImpl.java
index 9bbbb54..af287d1 100644
--- a/src/main/java/com/rymcu/forest/service/impl/ArticleServiceImpl.java
+++ b/src/main/java/com/rymcu/forest/service/impl/ArticleServiceImpl.java
@@ -388,9 +388,11 @@ public class ArticleServiceImpl extends AbstractService
implements Arti private Author genAuthor(ArticleDTO article) { Author author = new Author(); + User user = userService.findById(String.valueOf(article.getArticleAuthorId())); author.setUserNickname(article.getArticleAuthorName()); author.setUserAvatarURL(article.getArticleAuthorAvatarUrl()); author.setIdUser(article.getArticleAuthorId()); + author.setUserAccount(user.getAccount()); return author; } } diff --git a/src/main/java/com/rymcu/forest/service/impl/PortfolioServiceImpl.java b/src/main/java/com/rymcu/forest/service/impl/PortfolioServiceImpl.java index af9a0fc..b843722 100644 --- a/src/main/java/com/rymcu/forest/service/impl/PortfolioServiceImpl.java +++ b/src/main/java/com/rymcu/forest/service/impl/PortfolioServiceImpl.java @@ -39,10 +39,7 @@ public class PortfolioServiceImpl extends AbstractService implements @Override public List findUserPortfoliosByUser(UserDTO userDTO) { List list = portfolioMapper.selectUserPortfoliosByIdUser(userDTO.getIdUser()); - Author author = new Author(); - author.setIdUser(userDTO.getIdUser()); - author.setUserAvatarURL(userDTO.getAvatarUrl()); - author.setUserNickname(userDTO.getNickname()); + Author author = userService.selectAuthor(userDTO.getIdUser()); list.forEach(portfolioDTO -> { genPortfolioAuthor(portfolioDTO,author); }); diff --git a/src/main/java/com/rymcu/forest/service/impl/UserServiceImpl.java b/src/main/java/com/rymcu/forest/service/impl/UserServiceImpl.java index 2ae4446..891cf7c 100644 --- a/src/main/java/com/rymcu/forest/service/impl/UserServiceImpl.java +++ b/src/main/java/com/rymcu/forest/service/impl/UserServiceImpl.java @@ -116,8 +116,8 @@ public class UserServiceImpl extends AbstractService implements UserServic } @Override - public UserDTO findUserDTOByNickname(String nickname) { - UserDTO user = userMapper.selectUserDTOByNickname(nickname); + public UserDTO findUserDTOByAccount(String account) { + UserDTO user = userMapper.selectUserDTOByAccount(account); return user; } @@ -239,7 +239,7 @@ public class UserServiceImpl extends AbstractService implements UserServic } @Override - public UserExtend selectUserExtendByNickname(String nickname) { + public UserExtend selectUserExtendByAccount(String nickname) { return userExtendMapper.selectUserExtendByNickname(nickname); } diff --git a/src/main/java/com/rymcu/forest/web/api/user/UserController.java b/src/main/java/com/rymcu/forest/web/api/user/UserController.java index f7e154e..9976387 100644 --- a/src/main/java/com/rymcu/forest/web/api/user/UserController.java +++ b/src/main/java/com/rymcu/forest/web/api/user/UserController.java @@ -37,16 +37,16 @@ public class UserController { @Resource private FollowService followService; - @GetMapping("/{nickname}") + @GetMapping("/{account}") @VisitLogger - public GlobalResult detail(@PathVariable String nickname){ - UserDTO userDTO = userService.findUserDTOByNickname(nickname); + public GlobalResult detail(@PathVariable String account){ + UserDTO userDTO = userService.findUserDTOByAccount(account); return GlobalResultGenerator.genSuccessResult(userDTO); } - @GetMapping("/{nickname}/articles") - public GlobalResult userArticles(@RequestParam(defaultValue = "0") Integer page, @RequestParam(defaultValue = "12") Integer rows, @PathVariable String nickname){ - UserDTO userDTO = userService.findUserDTOByNickname(nickname); + @GetMapping("/{account}/articles") + public GlobalResult userArticles(@RequestParam(defaultValue = "0") Integer page, @RequestParam(defaultValue = "12") Integer rows, @PathVariable String account){ + UserDTO userDTO = userService.findUserDTOByAccount(account); if (userDTO == null){ return GlobalResultGenerator.genErrorResult("用户不存在!"); } @@ -57,9 +57,9 @@ public class UserController { return GlobalResultGenerator.genSuccessResult(map); } - @GetMapping("/{nickname}/portfolios") - public GlobalResult userPortfolios(@RequestParam(defaultValue = "0") Integer page, @RequestParam(defaultValue = "12") Integer rows, @PathVariable String nickname){ - UserDTO userDTO = userService.findUserDTOByNickname(nickname); + @GetMapping("/{account}/portfolios") + public GlobalResult userPortfolios(@RequestParam(defaultValue = "0") Integer page, @RequestParam(defaultValue = "12") Integer rows, @PathVariable String account){ + UserDTO userDTO = userService.findUserDTOByAccount(account); if (userDTO == null){ return GlobalResultGenerator.genErrorResult("用户不存在!"); } @@ -73,9 +73,9 @@ public class UserController { return GlobalResultGenerator.genSuccessResult(map); } - @GetMapping("/{nickname}/followers") - public GlobalResult userFollowers(@RequestParam(defaultValue = "0") Integer page, @RequestParam(defaultValue = "12") Integer rows, @PathVariable String nickname){ - UserDTO userDTO = userService.findUserDTOByNickname(nickname); + @GetMapping("/{account}/followers") + public GlobalResult userFollowers(@RequestParam(defaultValue = "0") Integer page, @RequestParam(defaultValue = "12") Integer rows, @PathVariable String account){ + UserDTO userDTO = userService.findUserDTOByAccount(account); if (userDTO == null){ return GlobalResultGenerator.genErrorResult("用户不存在!"); } @@ -89,9 +89,9 @@ public class UserController { return GlobalResultGenerator.genSuccessResult(map); } - @GetMapping("/{nickname}/followings") - public GlobalResult userFollowings(@RequestParam(defaultValue = "0") Integer page, @RequestParam(defaultValue = "12") Integer rows, @PathVariable String nickname){ - UserDTO userDTO = userService.findUserDTOByNickname(nickname); + @GetMapping("/{account}/followings") + public GlobalResult userFollowings(@RequestParam(defaultValue = "0") Integer page, @RequestParam(defaultValue = "12") Integer rows, @PathVariable String account){ + UserDTO userDTO = userService.findUserDTOByAccount(account); if (userDTO == null){ return GlobalResultGenerator.genErrorResult("用户不存在!"); } @@ -105,9 +105,9 @@ public class UserController { return GlobalResultGenerator.genSuccessResult(map); } - @GetMapping("/{nickname}/user-extend") - public GlobalResult userExtend(@PathVariable String nickname) { - UserExtend userExtend = userService.selectUserExtendByNickname(nickname); + @GetMapping("/{account}/user-extend") + public GlobalResult userExtend(@PathVariable String account) { + UserExtend userExtend = userService.selectUserExtendByAccount(account); return GlobalResultGenerator.genSuccessResult(userExtend); } diff --git a/src/main/java/com/rymcu/forest/wx/mp/controller/WxoAuthController.java b/src/main/java/com/rymcu/forest/wx/mp/controller/WxoAuthController.java index 7e0ba87..8638bf5 100644 --- a/src/main/java/com/rymcu/forest/wx/mp/controller/WxoAuthController.java +++ b/src/main/java/com/rymcu/forest/wx/mp/controller/WxoAuthController.java @@ -44,7 +44,7 @@ public class WxoAuthController { baseUrl = new StringBuilder(domain).append(contextPath); } StringBuilder accessTokenUrl = baseUrl.append("/wx/oauth/" + appId + "/getAccessToken?redirectUrl=").append(URIUtil.encodeURIComponent(redirectUrl)); - String oauth2Url = wxMpService.getOAuth2Service().buildAuthorizationUrl(accessTokenUrl.toString(), WxConsts.OAuth2Scope.SNSAPI_BASE, null); + String oauth2Url = wxMpService.getOAuth2Service().buildAuthorizationUrl(accessTokenUrl.toString(), WxConsts.OAuth2Scope.SNSAPI_USERINFO, null); return "redirect:" + oauth2Url; } @@ -58,8 +58,8 @@ public class WxoAuthController { throw new Exception("无权限"); } - WxMpUser wxMpUser =wxMpService.getUserService().userInfo(oAuth2AccessToken.getOpenId()); - wxUserService.saveUser(wxMpUser,appId); + WxMpUser wxMpUser = wxMpService.getUserService().userInfo(oAuth2AccessToken.getOpenId()); + wxUserService.saveUser(wxMpUser, appId); ContextHolderUtils.getSession2().setAttribute("wxUser", wxMpUser); return "redirect:" + redirectUrl; } diff --git a/src/main/java/mapper/UserMapper.xml b/src/main/java/mapper/UserMapper.xml index adaf741..d7e0615 100644 --- a/src/main/java/mapper/UserMapper.xml +++ b/src/main/java/mapper/UserMapper.xml @@ -45,6 +45,7 @@ + insert into forest_user_role (id_user,id_role,created_time) values (#{idUser},#{idRole},sysdate()) @@ -81,8 +82,8 @@ - + select id, nickname, avatar_type, avatar_url, account, signature from forest_user where account = #{account} and status = 0