This commit is contained in:
parent
f6e00e61ce
commit
f43689a7e9
@ -29,7 +29,7 @@ import java.util.List;
|
|||||||
* @author ronger
|
* @author ronger
|
||||||
* @since 2018/05/28 11:00
|
* @since 2018/05/28 11:00
|
||||||
* 自定义权限匹配和账号密码匹配
|
* 自定义权限匹配和账号密码匹配
|
||||||
* */
|
*/
|
||||||
public class BaseShiroRealm extends AuthorizingRealm {
|
public class BaseShiroRealm extends AuthorizingRealm {
|
||||||
@Resource
|
@Resource
|
||||||
private RoleService roleService;
|
private RoleService roleService;
|
||||||
@ -43,13 +43,13 @@ public class BaseShiroRealm extends AuthorizingRealm {
|
|||||||
@Override
|
@Override
|
||||||
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
|
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
|
||||||
SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();
|
SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();
|
||||||
Principal principal = (Principal)principals.getPrimaryPrincipal();
|
Principal principal = (Principal) principals.getPrimaryPrincipal();
|
||||||
User user = new User();
|
User user = new User();
|
||||||
user.setIdUser(principal.getId());
|
user.setIdUser(principal.getId());
|
||||||
try {
|
try {
|
||||||
List<Role> roles = roleService.selectRoleByUser(user);
|
List<Role> roles = roleService.selectRoleByUser(user);
|
||||||
for (Role role : roles) {
|
for (Role role : roles) {
|
||||||
if(StringUtils.isNotBlank(role.getInputCode())){
|
if (StringUtils.isNotBlank(role.getInputCode())) {
|
||||||
authorizationInfo.addRole(role.getInputCode());
|
authorizationInfo.addRole(role.getInputCode());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -70,7 +70,7 @@ public class BaseShiroRealm extends AuthorizingRealm {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 认证回调函数, 登录时调用,主要是用来进行身份认证的,也就是说验证用户输入的账号和密码是否正确。
|
* 认证回调函数, 登录时调用,主要是用来进行身份认证的,也就是说验证用户输入的账号和密码是否正确。
|
||||||
* */
|
*/
|
||||||
@Override
|
@Override
|
||||||
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authcToken) throws AuthenticationException {
|
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authcToken) throws AuthenticationException {
|
||||||
UsernamePasswordToken token = (UsernamePasswordToken) authcToken;
|
UsernamePasswordToken token = (UsernamePasswordToken) authcToken;
|
||||||
@ -90,10 +90,11 @@ public class BaseShiroRealm extends AuthorizingRealm {
|
|||||||
if (user == null) {
|
if (user == null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
if (!"0".equals(user.getStatus())) { //账户冻结(是否允许登陆)
|
// 账户冻结(是否允许登陆)
|
||||||
|
if (!"0".equals(user.getStatus())) {
|
||||||
throw new LockedAccountException();
|
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()),
|
return new SimpleAuthenticationInfo(new Principal(user, token.isMobileLogin()),
|
||||||
user.getPassword().substring(16), ByteSource.Util.bytes(salt), getName());
|
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;
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
@ -139,9 +140,9 @@ public class BaseShiroRealm extends AuthorizingRealm {
|
|||||||
* 获取SESSIONID
|
* 获取SESSIONID
|
||||||
*/
|
*/
|
||||||
public String getSessionid() {
|
public String getSessionid() {
|
||||||
try{
|
try {
|
||||||
return (String) Utils.getSession().getId();
|
return (String) Utils.getSession().getId();
|
||||||
}catch (Exception e) {
|
} catch (Exception e) {
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2,10 +2,10 @@ package com.rymcu.forest.core.constant;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Shiro通用常量
|
* 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";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 验证码错误
|
* 验证码错误
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
@ -2,18 +2,22 @@ package com.rymcu.forest.core.result;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 响应码枚举,参考HTTP状态码的语义
|
* 响应码枚举,参考HTTP状态码的语义
|
||||||
|
*
|
||||||
|
* @author ronger
|
||||||
*/
|
*/
|
||||||
public enum ResultCode {
|
public enum ResultCode {
|
||||||
SUCCESS(1, "SUCCESS"),//成功
|
// 成功
|
||||||
FAIL(400, "访问失败"),//失败
|
SUCCESS(1, "SUCCESS"),
|
||||||
UNAUTHORIZED(401, "签名错误"),//未认证(签名错误)
|
// 失败
|
||||||
NOT_FOUND(404, "此接口不存在"),//接口不存在
|
FAIL(400, "访问失败"),
|
||||||
INTERNAL_SERVER_ERROR(500, "系统繁忙,请稍后再试"),//服务器内部错误
|
// 未认证(签名错误)
|
||||||
INVALID_PARAM(10000, "参数错误"),
|
UNAUTHORIZED(401, "签名错误"),
|
||||||
|
// 接口不存在
|
||||||
|
NOT_FOUND(404, "此接口不存在"),
|
||||||
|
// 服务器内部错误
|
||||||
;
|
INTERNAL_SERVER_ERROR(500, "系统繁忙,请稍后再试"),
|
||||||
|
// 参数错误
|
||||||
|
INVALID_PARAM(10000, "参数错误");
|
||||||
private int code;
|
private int code;
|
||||||
private String message;
|
private String message;
|
||||||
|
|
||||||
|
@ -7,19 +7,24 @@ import org.apache.ibatis.exceptions.TooManyResultsException;
|
|||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import tk.mybatis.mapper.entity.Condition;
|
import tk.mybatis.mapper.entity.Condition;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
import java.lang.reflect.ParameterizedType;
|
import java.lang.reflect.ParameterizedType;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 基于通用MyBatis Mapper插件的Service接口的实现
|
* 基于通用MyBatis Mapper插件的Service接口的实现
|
||||||
|
*
|
||||||
|
* @author ronger
|
||||||
*/
|
*/
|
||||||
public abstract class AbstractService<T> implements Service<T> {
|
public abstract class AbstractService<T> implements Service<T> {
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
protected Mapper<T> mapper;
|
protected Mapper<T> mapper;
|
||||||
|
/**
|
||||||
private Class<T> modelClass; // 当前泛型真实类型的Class
|
* 当前泛型真实类型的Class
|
||||||
|
*/
|
||||||
|
private Class<T> modelClass;
|
||||||
|
|
||||||
public AbstractService() {
|
public AbstractService() {
|
||||||
ParameterizedType pt = (ParameterizedType) this.getClass().getGenericSuperclass();
|
ParameterizedType pt = (ParameterizedType) this.getClass().getGenericSuperclass();
|
||||||
|
@ -8,16 +8,85 @@ import java.util.List;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Service 层 基础接口,其他Service 接口 请继承该接口
|
* Service 层 基础接口,其他Service 接口 请继承该接口
|
||||||
|
*
|
||||||
|
* @author ronger
|
||||||
*/
|
*/
|
||||||
public interface Service<T> {
|
public interface Service<T> {
|
||||||
void save(T model);//持久化
|
/**
|
||||||
void save(List<T> models);//批量持久化
|
* 持久化
|
||||||
void deleteById(String id);//通过主鍵刪除
|
*
|
||||||
void deleteByIds(String ids);//批量刪除 eg:ids -> “1,2,3,4”
|
* @param model
|
||||||
void update(T model);//更新
|
*/
|
||||||
T findById(String id);//通过ID查找
|
void save(T model);
|
||||||
T findBy(String fieldName, Object value) throws TooManyResultsException, ServiceException; //通过Model中某个成员变量名称(非数据表中column的名称)查找,value需符合unique约束
|
|
||||||
List<T> findByIds(String ids);//通过多个ID查找//eg:ids -> “1,2,3,4”
|
/**
|
||||||
List<T> findByCondition(Condition condition);//根据条件查找
|
* 批量持久化
|
||||||
List<T> findAll();//获取所有
|
*
|
||||||
|
* @param models
|
||||||
|
*/
|
||||||
|
void save(List<T> 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<T> findByIds(String ids);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据条件查找
|
||||||
|
*
|
||||||
|
* @param condition
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
List<T> findByCondition(Condition condition);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取所有
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
List<T> findAll();
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
@ -4,14 +4,16 @@ package com.rymcu.forest.enumerate;
|
|||||||
* @author ronger
|
* @author ronger
|
||||||
*/
|
*/
|
||||||
|
|
||||||
public enum SponsorEnum {
|
public enum TransactionEnum {
|
||||||
Article("0", 20);
|
ArticleSponsor("0", 20),
|
||||||
|
Answer("1", 30),
|
||||||
|
CorrectAnswer("2", 50);
|
||||||
|
|
||||||
private String dataType;
|
private String dataType;
|
||||||
|
|
||||||
private Integer money;
|
private Integer money;
|
||||||
|
|
||||||
SponsorEnum(String dataType, Integer money) {
|
TransactionEnum(String dataType, Integer money) {
|
||||||
this.dataType = dataType;
|
this.dataType = dataType;
|
||||||
this.money = money;
|
this.money = money;
|
||||||
}
|
}
|
||||||
@ -24,7 +26,7 @@ public enum SponsorEnum {
|
|||||||
return this.money;
|
return this.money;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isArticle() {
|
public boolean isArticleSponsor() {
|
||||||
return Article.equals(this);
|
return ArticleSponsor.equals(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,11 +1,13 @@
|
|||||||
package com.rymcu.forest.service.impl;
|
package com.rymcu.forest.service.impl;
|
||||||
|
|
||||||
|
import com.rymcu.forest.core.exception.TransactionException;
|
||||||
import com.rymcu.forest.core.service.AbstractService;
|
import com.rymcu.forest.core.service.AbstractService;
|
||||||
import com.rymcu.forest.dto.ArticleDTO;
|
import com.rymcu.forest.dto.ArticleDTO;
|
||||||
import com.rymcu.forest.entity.Sponsor;
|
import com.rymcu.forest.entity.Sponsor;
|
||||||
import com.rymcu.forest.entity.TransactionRecord;
|
import com.rymcu.forest.entity.TransactionRecord;
|
||||||
import com.rymcu.forest.entity.User;
|
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.mapper.SponsorMapper;
|
||||||
import com.rymcu.forest.service.ArticleService;
|
import com.rymcu.forest.service.ArticleService;
|
||||||
import com.rymcu.forest.service.SponsorService;
|
import com.rymcu.forest.service.SponsorService;
|
||||||
@ -39,7 +41,7 @@ public class SponsorServiceImpl extends AbstractService<Sponsor> implements Spon
|
|||||||
map.put("success", false);
|
map.put("success", false);
|
||||||
map.put("message", "数据异常");
|
map.put("message", "数据异常");
|
||||||
} else {
|
} 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());
|
BigDecimal money = BigDecimal.valueOf(result.getMoney());
|
||||||
sponsor.setSponsorshipMoney(money);
|
sponsor.setSponsorshipMoney(money);
|
||||||
User user = UserUtils.getCurrentUserByToken();
|
User user = UserUtils.getCurrentUserByToken();
|
||||||
@ -47,11 +49,11 @@ public class SponsorServiceImpl extends AbstractService<Sponsor> implements Spon
|
|||||||
sponsor.setSponsorshipTime(new Date());
|
sponsor.setSponsorshipTime(new Date());
|
||||||
sponsorMapper.insertSelective(sponsor);
|
sponsorMapper.insertSelective(sponsor);
|
||||||
// 赞赏金额划转
|
// 赞赏金额划转
|
||||||
if (result.isArticle()) {
|
if (result.isArticleSponsor()) {
|
||||||
ArticleDTO articleDTO = articleService.findArticleDTOById(sponsor.getDataId(), 1);
|
ArticleDTO articleDTO = articleService.findArticleDTOById(sponsor.getDataId(), 1);
|
||||||
TransactionRecord transactionRecord = transactionRecordService.transferByUserId(articleDTO.getArticleAuthorId(), user.getIdUser(), money);
|
TransactionRecord transactionRecord = transactionRecordService.transferByUserId(articleDTO.getArticleAuthorId(), user.getIdUser(), money);
|
||||||
if (Objects.isNull(transactionRecord.getIdTransactionRecord())) {
|
if (Objects.isNull(transactionRecord.getIdTransactionRecord())) {
|
||||||
throw new Exception("余额不足");
|
throw new TransactionException(TransactionCode.InsufficientBalance);
|
||||||
}
|
}
|
||||||
// 更新文章赞赏数
|
// 更新文章赞赏数
|
||||||
sponsorMapper.updateArticleSponsorCount(articleDTO.getIdArticle());
|
sponsorMapper.updateArticleSponsorCount(articleDTO.getIdArticle());
|
||||||
|
Loading…
Reference in New Issue
Block a user