Bladeren bron

Merge branch 'dev_20230202' into ponline

# Conflicts:
#	service.md
Eric 2 jaren geleden
bovenliggende
commit
0ca9101876
22 gewijzigde bestanden met toevoegingen van 538 en 54 verwijderingen
  1. 10 0
      cooleshow-auth/auth-api/src/main/java/com/yonge/cooleshow/auth/api/entity/LoginEntity.java
  2. 16 0
      cooleshow-auth/auth-server/pom.xml
  3. 11 10
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/core/filter/PhoneLoginAuthenticationFilter.java
  4. 37 12
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/core/provider/PhoneAuthenticationProvider.java
  5. 33 0
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/open/AdminClient.java
  6. 10 0
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/open/OpenUserAccountController.java
  7. 14 0
      cooleshow-user/user-biz/pom.xml
  8. 10 4
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/SubjectDao.java
  9. 11 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/MusicSheetSearch.java
  10. 12 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/MusicSheet.java
  11. 12 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/Student.java
  12. 8 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/MusicSheetService.java
  13. 12 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/StudentService.java
  14. 27 3
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MusicSheetServiceImpl.java
  15. 132 10
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/StudentServiceImpl.java
  16. 77 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/StudentWrapper.java
  17. 3 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/MusicSheetMapper.xml
  18. 5 1
      cooleshow-user/user-biz/src/main/resources/config/mybatis/SubjectMapper.xml
  19. 38 6
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/MusicSheetController.java
  20. 35 6
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/MusicSheetController.java
  21. 2 1
      cooleshow-user/user-website/src/main/java/com/yonge/cooleshow/website/controller/open/OpenMusicSheetController.java
  22. 23 0
      pom.xml

+ 10 - 0
cooleshow-auth/auth-api/src/main/java/com/yonge/cooleshow/auth/api/entity/LoginEntity.java

@@ -18,6 +18,8 @@ public class LoginEntity {
     private String deviceNum;
     //二维码code
     private String qrCode;
+    //关联帐号授权码
+    private String authToken;
     
     public Boolean getIsSurportRegister() {
 		return isSurportRegister;
@@ -82,4 +84,12 @@ public class LoginEntity {
     public void setQrCode(String qrCode) {
         this.qrCode = qrCode;
     }
+
+    public String getAuthToken() {
+        return authToken;
+    }
+
+    public void setAuthToken(String authToken) {
+        this.authToken = authToken;
+    }
 }

+ 16 - 0
cooleshow-auth/auth-server/pom.xml

@@ -17,6 +17,22 @@
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
     </properties>
     <dependencies>
+
+        <dependency>
+            <groupId>com.microsvc.toolkit.config</groupId>
+            <artifactId>microsvc-config-jwt</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.security</groupId>
+            <artifactId>spring-security-jwt</artifactId>
+            <version>1.0.9.RELEASE</version>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>1.2.79</version>
+        </dependency>
+
         <dependency>
             <groupId>com.yonge.toolset</groupId>
             <artifactId>toolset-mybatis</artifactId>

+ 11 - 10
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/core/filter/PhoneLoginAuthenticationFilter.java

@@ -1,12 +1,8 @@
 package com.yonge.cooleshow.auth.core.filter;
 
-import java.io.IOException;
-
-import javax.servlet.FilterChain;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
+import com.yonge.cooleshow.auth.api.entity.LoginEntity;
+import com.yonge.cooleshow.auth.config.token.PhoneAuthenticationToken;
+import com.yonge.cooleshow.common.security.SecurityConstants;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.security.authentication.AbstractAuthenticationToken;
 import org.springframework.security.authentication.AuthenticationServiceException;
@@ -15,9 +11,11 @@ import org.springframework.security.core.AuthenticationException;
 import org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter;
 import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
 
-import com.yonge.cooleshow.auth.api.entity.LoginEntity;
-import com.yonge.cooleshow.auth.config.token.PhoneAuthenticationToken;
-import com.yonge.cooleshow.common.security.SecurityConstants;
+import javax.servlet.FilterChain;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
 
 public class PhoneLoginAuthenticationFilter extends AbstractAuthenticationProcessingFilter {
 
@@ -27,6 +25,7 @@ public class PhoneLoginAuthenticationFilter extends AbstractAuthenticationProces
 	private static final String IS_SURPORT_REGISTER = "isSurportRegister";
 	private static final String LOGIN_USER_TYPE = "loginUserType";
 	private static final String QR_CODE = "qrCode";
+	private static final String AUTH_TOKEN = "token";
 
 	private static final String DEVICE_NUM = "deviceNum";
 
@@ -51,6 +50,7 @@ public class PhoneLoginAuthenticationFilter extends AbstractAuthenticationProces
 		boolean isRegister = StringUtils.equals("true", request.getParameter(IS_SURPORT_REGISTER));
 		String loginUserType = obtainParameter(request, LOGIN_USER_TYPE);
 		String qrCode = obtainParameter(request, QR_CODE);
+		String authToken = obtainParameter(request, AUTH_TOKEN);
 
 		String clientId = request.getParameter(clientIdParameter).toUpperCase();
 
@@ -70,6 +70,7 @@ public class PhoneLoginAuthenticationFilter extends AbstractAuthenticationProces
 		loginEntity.setLoginUserType(loginUserType);
 		loginEntity.setDeviceNum(deviceNum);
 		loginEntity.setQrCode(qrCode);
+		loginEntity.setAuthToken(authToken);
 
 		authRequest = new PhoneAuthenticationToken(SecurityConstants.PHONE_PRINCIPAL_PREFIX + principal, loginEntity);
 

+ 37 - 12
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/core/provider/PhoneAuthenticationProvider.java

@@ -1,8 +1,15 @@
 package com.yonge.cooleshow.auth.core.provider;
 
-import java.util.Date;
-import java.util.Objects;
-
+import com.microsvc.toolkit.config.jwt.utils.RsaKeyHelper;
+import com.yonge.cooleshow.auth.api.dto.SysUserInfo;
+import com.yonge.cooleshow.auth.api.entity.LoginEntity;
+import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.auth.config.token.PhoneAuthenticationToken;
+import com.yonge.cooleshow.auth.service.SysUserDeviceService;
+import com.yonge.cooleshow.auth.service.SysUserService;
+import com.yonge.cooleshow.common.service.IdGeneratorService;
+import com.yonge.toolset.base.exception.BizException;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.security.authentication.BadCredentialsException;
 import org.springframework.security.authentication.InternalAuthenticationServiceException;
@@ -12,16 +19,15 @@ import org.springframework.security.core.AuthenticationException;
 import org.springframework.security.core.userdetails.UserDetails;
 import org.springframework.security.core.userdetails.UserDetailsService;
 import org.springframework.security.core.userdetails.UsernameNotFoundException;
+import org.springframework.security.jwt.Jwt;
+import org.springframework.security.jwt.JwtHelper;
+import org.springframework.security.jwt.crypto.sign.RsaVerifier;
 import org.springframework.transaction.annotation.Transactional;
 
-import com.yonge.cooleshow.auth.api.dto.SysUserInfo;
-import com.yonge.cooleshow.auth.api.entity.LoginEntity;
-import com.yonge.cooleshow.auth.api.entity.SysUser;
-import com.yonge.cooleshow.auth.config.token.PhoneAuthenticationToken;
-import com.yonge.cooleshow.auth.service.SysUserDeviceService;
-import com.yonge.cooleshow.auth.service.SysUserService;
-import com.yonge.cooleshow.common.service.IdGeneratorService;
-
+import java.security.interfaces.RSAPublicKey;
+import java.util.Date;
+import java.util.Objects;
+@Slf4j
 public class PhoneAuthenticationProvider extends AbstractAuthenticationProvider {
 
     private UserDetailsService userDetailsService;
@@ -49,13 +55,32 @@ public class PhoneAuthenticationProvider extends AbstractAuthenticationProvider
 
         String smsCode = loginEntity.getSmsCode();
         String phone = loginEntity.getPhone();
+        // 二维码登录
         String qrCode = loginEntity.getQrCode();
-        if (StringUtils.isNotEmpty(qrCode) && StringUtils.isEmpty(smsCode)) {
+        // 授权Token登录
+        String authToken = loginEntity.getAuthToken();
+        if (StringUtils.isNotEmpty(qrCode)) {
             // 二维码验证
             boolean b = sysUserService.verifyQrCode(phone, qrCode);
             if (!b) {
                 throw new BadCredentialsException("二维码校验失败");
             }
+        } else if (StringUtils.isNotEmpty(authToken)) {
+            // 授权authToken登录
+            try {
+                RSAPublicKey rsaPublicKey = RsaKeyHelper.getRSAPublicKey("jmedu", "dayaedu", "jmedu.jks", "dayaedu");
+                Jwt jwt = JwtHelper.decodeAndVerify(authToken, new RsaVerifier(rsaPublicKey));
+
+                //获取jwt原始内容
+                String claims = jwt.getClaims();
+                if (StringUtils.isEmpty(claims)) {
+                    throw new BizException("三方授权校验失败");
+                }
+                log.info("retrieveUser claims={}", claims);
+            } catch (Exception e) {
+                log.error("retrieveUser authToken={}", authToken, e);
+            }
+
         } else {
             // 验证码验证
             boolean b = smsCodeService.verifyValidCode(phone, smsCode, "SMS_VERIFY_CODE_LOGIN");

+ 33 - 0
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/open/AdminClient.java

@@ -1,5 +1,6 @@
 package com.yonge.cooleshow.admin.controller.open;
 
+import com.microsvc.toolkit.config.jwt.utils.RsaKeyHelper;
 import com.yonge.cooleshow.admin.io.request.coupon.CouponOrderVO;
 import com.yonge.cooleshow.api.feign.dto.CouponInfoApi;
 import com.yonge.cooleshow.api.feign.dto.EmployeeApi;
@@ -17,24 +18,32 @@ import com.yonge.cooleshow.biz.dal.service.EmployeeService;
 import com.yonge.cooleshow.biz.dal.service.StudentService;
 import com.yonge.cooleshow.biz.dal.service.TeacherService;
 import com.yonge.cooleshow.biz.dal.service.UserFirstTimeService;
+import com.yonge.cooleshow.biz.dal.wrapper.StudentWrapper;
 import com.yonge.cooleshow.biz.dal.wrapper.coupon.CouponOrderWrapper;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.common.enums.UserFirstTimeTypeEnum;
+import com.yonge.toolset.base.exception.BizException;
 import io.swagger.annotations.ApiOperation;
 import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.joda.time.DateTime;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.jwt.Jwt;
+import org.springframework.security.jwt.JwtHelper;
+import org.springframework.security.jwt.crypto.sign.RsaVerifier;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
 import java.math.BigDecimal;
+import java.security.interfaces.RSAPublicKey;
 import java.util.Arrays;
 import java.util.List;
 import java.util.stream.Collectors;
@@ -88,6 +97,30 @@ public class AdminClient extends BaseController {
         return succeed(studentApi);
     }
 
+    @ApiOperation(value = "学生帐号关联Id", notes = "CouponOrderVO.PageRequest")
+    @PostMapping("/unionStudent")
+    public HttpResponseResult<StudentWrapper.UnionStudentResp> unionStudent(@RequestBody StudentWrapper.UnionStudent info) {
+
+        if (StringUtils.isAnyBlank(info.getToken(), info.getMobile())) {
+            throw new BizException("请求参数错误");
+        }
+
+        // 校验三方帐号关联请求合法性
+        RSAPublicKey rsaPublicKey = RsaKeyHelper.getRSAPublicKey("jmedu", "dayaedu", "jmedu.jks", "dayaedu");
+        Jwt jwt = JwtHelper.decodeAndVerify(info.getToken(), new RsaVerifier(rsaPublicKey));
+
+        //获取jwt原始内容
+        String claims = jwt.getClaims();
+        if (StringUtils.isEmpty(claims)) {
+            throw new BizException("三方授权校验失败");
+        }
+
+        // 学生帐号关联
+        StudentWrapper.UnionStudentResp studentResp = studentService.unionStudent(info);
+
+        return succeed(studentResp);
+    }
+
     @GetMapping("/getEmployee")
     public HttpResponseResult<EmployeeApi> getEmployee(@RequestParam("userId") Long userId) {
         Employee employee = employeeService.get(userId);

+ 10 - 0
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/open/OpenUserAccountController.java

@@ -18,6 +18,7 @@ import org.springframework.web.bind.annotation.RestController;
 
 import javax.validation.Valid;
 import java.util.List;
+import java.util.Objects;
 
 @RestController
 @RequestMapping("/open")
@@ -60,4 +61,13 @@ public class OpenUserAccountController extends BaseController {
         return succeed(musicSheetService.updateMusicImg(musicImgDto, musicImgDto.getMusicSheetId()));
     }
 
+    @ApiOperation(value = "曲目数据修复")
+    @PostMapping(value="/music/sheet/musicCorrect")
+    public HttpResponseResult<Boolean> musicCorrect(@RequestBody MusicImgDto musicImgDto) {
+        if (Objects.isNull(musicImgDto.getMusicSheetId())) {
+            failed("曲目Id参数错误");
+        }
+        return succeed(musicSheetService.updateMusicCorrect(musicImgDto, musicImgDto.getMusicSheetId()));
+    }
+
 }

+ 14 - 0
cooleshow-user/user-biz/pom.xml

@@ -23,6 +23,20 @@
             <artifactId>cooleshow-common</artifactId>
             <version>${project.version}</version>
         </dependency>
+        <dependency>
+            <groupId>com.microsvc.toolkit.config</groupId>
+            <artifactId>microsvc-config-jwt</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.security</groupId>
+            <artifactId>spring-security-jwt</artifactId>
+            <version>1.0.9.RELEASE</version>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>1.2.79</version>
+        </dependency>
 
         <dependency>
             <groupId>com.spring4all</groupId>

+ 10 - 4
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/SubjectDao.java

@@ -1,11 +1,10 @@
 package com.yonge.cooleshow.biz.dal.dao;
 
-import java.util.List;
-
-import org.apache.ibatis.annotations.Param;
-
 import com.yonge.cooleshow.biz.dal.entity.Subject;
 import com.yonge.toolset.mybatis.dal.BaseDAO;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 public interface SubjectDao extends BaseDAO<Long, Subject> {
     /***
@@ -55,4 +54,11 @@ public interface SubjectDao extends BaseDAO<Long, Subject> {
     Subject queryByName(@Param("name") String name);
 
     List<Subject> subjectSelect(@Param("type") String type);
+
+    /**
+     * 声部模糊匹配
+     * @param subjectName 声部匹配
+     * @return Subject
+     */
+    Subject getSubjectMatchByName(@Param("name") String subjectName);
 }

+ 11 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/MusicSheetSearch.java

@@ -88,6 +88,9 @@ public class MusicSheetSearch  extends QueryInfo{
     @ApiModelProperty("数据恢复")
     private String dataRecovery;
 
+    @ApiModelProperty("是否可以转简谱(0:否,1:是)")
+    private YesOrNoEnum notation;
+
     public MusicSortType getMusicSortType() {
         return musicSortType;
     }
@@ -259,4 +262,12 @@ public class MusicSheetSearch  extends QueryInfo{
     public void setDataRecovery(String dataRecovery) {
         this.dataRecovery = dataRecovery;
     }
+
+    public YesOrNoEnum getNotation() {
+        return notation;
+    }
+
+    public void setNotation(YesOrNoEnum notation) {
+        this.notation = notation;
+    }
 }

+ 12 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/MusicSheet.java

@@ -246,6 +246,10 @@ public class MusicSheet implements Serializable {
 	@ApiModelProperty(value = "假删除标识 0:未删除 1:已删除")
 	private Boolean delFlag;
 
+	@TableField("correct_time_")
+	@ApiModelProperty(value = "数据修复时间")
+	private Date correctTime;
+
 	public Integer getVirtualNumber() {
 		return virtualNumber;
 	}
@@ -694,4 +698,12 @@ public class MusicSheet implements Serializable {
 		this.fixedTone = fixedTone;
 		return this;
 	}
+
+	public Date getCorrectTime() {
+		return correctTime;
+	}
+
+	public void setCorrectTime(Date correctTime) {
+		this.correctTime = correctTime;
+	}
 }

+ 12 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/Student.java

@@ -75,6 +75,10 @@ public class Student implements Serializable {
     @TableField(value = "evaluate_time_")
     private Long evaluateTime;
 
+    @ApiModelProperty("帐号关联Id ")
+    @TableField(value = "union_id_")
+    private Long unionId;
+
 	@TableField(value = "create_time_")
     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
@@ -179,4 +183,12 @@ public class Student implements Serializable {
     public void setEvaluateTime(Long evaluateTime) {
         this.evaluateTime = evaluateTime;
     }
+
+    public Long getUnionId() {
+        return unionId;
+    }
+
+    public void setUnionId(Long unionId) {
+        this.unionId = unionId;
+    }
 }

+ 8 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/MusicSheetService.java

@@ -336,6 +336,14 @@ public interface MusicSheetService extends IService<MusicSheet> {
     Boolean updateMusicImg(MusicImgDto musicImgDto, Long musicSheetId);
 
     /**
+     * 曲目修复
+     * @param musicImgDto MusicImgDto
+     * @param musicSheetId 曲目Id
+     * @return Boolean
+     */
+    Boolean updateMusicCorrect(MusicImgDto musicImgDto, Long musicSheetId);
+
+    /**
      *
      * @param authMusicSheetId 曲目审核id
      */

+ 12 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/StudentService.java

@@ -7,7 +7,11 @@ import com.yonge.cooleshow.biz.dal.dto.search.QueryMyFollowSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.StudentSearch;
 import com.yonge.cooleshow.biz.dal.entity.Student;
 import com.yonge.cooleshow.biz.dal.entity.Subject;
-import com.yonge.cooleshow.biz.dal.vo.*;
+import com.yonge.cooleshow.biz.dal.vo.MyFollow;
+import com.yonge.cooleshow.biz.dal.vo.StudentHomeVo;
+import com.yonge.cooleshow.biz.dal.vo.StudentVo;
+import com.yonge.cooleshow.biz.dal.vo.TeacherVo;
+import com.yonge.cooleshow.biz.dal.wrapper.StudentWrapper;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 
 import java.util.List;
@@ -93,4 +97,11 @@ public interface StudentService extends IService<Student> {
      * @return
      */
     HttpResponseResult<Map<String, TeacherVo>> bindTeacher(String phone, Long userId, Boolean isUpdate);
+
+    /**
+     * 学生帐号关联
+     * @param info StudentWrapper.UnionStudent
+     * @return StudentWrapper.UnionStudentResp
+     */
+    StudentWrapper.UnionStudentResp unionStudent(StudentWrapper.UnionStudent info);
 }

+ 27 - 3
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MusicSheetServiceImpl.java

@@ -103,6 +103,7 @@ import com.yonge.toolset.utils.easyexcel.ErrMsg;
 import com.yonge.toolset.utils.easyexcel.ExcelDataReaderProperty;
 import com.yonge.toolset.utils.easyexcel.ExcelException;
 import org.apache.commons.collections.CollectionUtils;
+import org.joda.time.DateTime;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.BeanUtils;
@@ -694,11 +695,15 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
         boolean flag;
         Long originalMusicSheetId = musicSheetAuthRecordService.audit(param, userId);
         musicSheet.setAuditStatus(param.getAuthStatus());
-        if (param.getAuthStatus().equals(AuthStatusEnum.PASS) && StringUtil.isEmpty(param.getMusicImg())) {
+        // 生成图片统一使用开放接口,去掉当前校验规则
+        /*if (param.getAuthStatus().equals(AuthStatusEnum.PASS) && StringUtil.isEmpty(param.getMusicImg())) {
             throw new BizException("曲目渲染失败");
-        } else if (param.getAuthStatus().equals(AuthStatusEnum.PASS) && !StringUtil.isEmpty(param.getMusicImg())) {
+        } else*/
+
+        if (param.getAuthStatus().equals(AuthStatusEnum.PASS) && !StringUtil.isEmpty(param.getMusicImg())) {
             musicSheet.setMusicImg(param.getMusicImg());
         }
+
         musicSheet.setUpdateBy(userId);
         musicSheet.setUpdateTime(new Date());
         if (AuthStatusEnum.PASS.getCode().equals(param.getAuthStatus().getCode())) {
@@ -1554,7 +1559,26 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
         return true;
     }
 
-	private SysUser getSysUser(Long userId) {
+    /**
+     * 曲目修复
+     *
+     * @param musicImgDto  MusicImgDto
+     * @param musicSheetId 曲目Id
+     * @return Boolean
+     */
+    @Override
+    public Boolean updateMusicCorrect(MusicImgDto musicImgDto, Long musicSheetId) {
+
+        MusicSheet musicSheet = new MusicSheet();
+        musicSheet.setCorrectTime(DateTime.now().toDate());
+        musicSheet.setFixedTone(musicImgDto.getFixedTone());
+        musicSheet.setId(musicSheetId);
+        this.updateById(musicSheet);
+
+        return true;
+    }
+
+    private SysUser getSysUser(Long userId) {
         return Optional.ofNullable(userId)
                 .map(sysUserFeignService::queryUserById)
                 .orElseThrow(() -> new BizException("用户不存在"));

+ 132 - 10
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/StudentServiceImpl.java

@@ -5,20 +5,28 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.biz.dal.dao.StudentDao;
+import com.yonge.cooleshow.biz.dal.dao.SubjectDao;
 import com.yonge.cooleshow.biz.dal.dao.TeacherDao;
 import com.yonge.cooleshow.biz.dal.dao.UserBindingTeacherDao;
 import com.yonge.cooleshow.biz.dal.dto.search.QueryMyFollowSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.StudentSearch;
+import com.yonge.cooleshow.biz.dal.entity.Student;
 import com.yonge.cooleshow.biz.dal.entity.StudentTotal;
 import com.yonge.cooleshow.biz.dal.entity.Subject;
 import com.yonge.cooleshow.biz.dal.entity.UserBindingTeacher;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.mapper.SysUserMapper;
 import com.yonge.cooleshow.biz.dal.service.ImUserFriendService;
-import com.yonge.cooleshow.biz.dal.service.TeacherService;
-import com.yonge.cooleshow.common.enums.CacheNameEnum;
+import com.yonge.cooleshow.biz.dal.service.StudentService;
 import com.yonge.cooleshow.biz.dal.service.StudentTotalService;
-import com.yonge.cooleshow.biz.dal.vo.*;
+import com.yonge.cooleshow.biz.dal.vo.MyFollow;
+import com.yonge.cooleshow.biz.dal.vo.StudentHomeVo;
+import com.yonge.cooleshow.biz.dal.vo.StudentVo;
+import com.yonge.cooleshow.biz.dal.vo.TeacherVo;
+import com.yonge.cooleshow.biz.dal.wrapper.StudentWrapper;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.cooleshow.common.enums.CacheNameEnum;
 import com.yonge.cooleshow.common.enums.UserLockFlag;
 import com.yonge.toolset.base.util.StringUtil;
 import com.yonge.toolset.utils.date.DateUtil;
@@ -28,13 +36,17 @@ import org.redisson.api.RedissonClient;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
-import com.yonge.cooleshow.biz.dal.entity.Student;
-import com.yonge.cooleshow.biz.dal.dao.StudentDao;
-import com.yonge.cooleshow.biz.dal.service.StudentService;
+import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
 import java.text.MessageFormat;
-import java.util.*;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
 import java.util.concurrent.TimeUnit;
 
 
@@ -48,10 +60,12 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, Student> impleme
     private ImUserFriendService imUserFriendService;
     @Resource
     private UserBindingTeacherDao userBindingTeacherDao;
-    @Autowired
-    private StudentService studentService;
     @Resource
     private TeacherDao teacherDao;
+    @Autowired
+    private SysUserMapper sysUserMapper;
+    @Autowired
+    private SubjectDao subjectDao;
 
     @Override
     public StudentVo detail(Long userId) {
@@ -165,7 +179,7 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, Student> impleme
         }
         resMap.put("old", old);
 
-        StudentVo studentVo = studentService.detailByPhone(phone);
+        StudentVo studentVo = detailByPhone(phone);
 
         if (null == studentVo) {
             return HttpResponseResult.failed("未找到用户信息");
@@ -202,4 +216,112 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, Student> impleme
         return HttpResponseResult.succeed(resMap);
     }
 
+    /**
+     * 学生帐号关联
+     *
+     * @param info StudentWrapper.UnionStudent
+     * @return StudentWrapper.UnionStudentResp
+     */
+    @Transactional
+    @Override
+    public StudentWrapper.UnionStudentResp unionStudent(StudentWrapper.UnionStudent info) {
+
+        // 帐号关联响应数据
+        StudentWrapper.UnionStudentResp studentResp = StudentWrapper.UnionStudentResp
+                .builder()
+                .unionId(info.getUnionId())
+                .mobile(info.getMobile())
+                .updateFlag(false)
+                .build();
+
+        // 手机号查询用户信息
+        StudentVo studentVo = detailByPhone(info.getMobile());
+        if (Objects.isNull(studentVo)) {
+
+            com.yonge.cooleshow.biz.dal.entity.SysUser sysUser = sysUserMapper.selectOne(Wrappers.<com.yonge.cooleshow.biz.dal.entity.SysUser>lambdaQuery()
+                    .eq(com.yonge.cooleshow.biz.dal.entity.SysUser::getPhone, info.getMobile()));
+
+            if (Objects.isNull(sysUser)) {
+
+                // 自动注册创建用户
+                com.yonge.cooleshow.biz.dal.entity.SysUser user = new com.yonge.cooleshow.biz.dal.entity.SysUser();
+                user.setUsername(info.getUsername());
+                user.setPhone(info.getMobile());
+                user.setLockFlag(0);
+                user.setGender(info.getGender());
+                sysUserMapper.insert(user);
+
+                String subjectId = null;
+                // 学生声部
+                Subject subject = subjectDao.getSubjectMatchByName(info.getSubjectName());
+                if (Objects.nonNull(subject)) {
+                    subjectId = String.valueOf(subject.getId());
+                }
+
+                // 添加学生帐号
+                Student student = new Student();
+                student.setUserId(user.getId());
+                student.setSubjectId(subjectId);
+                student.setUnionId(info.getUnionId());
+                save(student);
+
+                // 更新标识
+                studentResp.setUpdateFlag(true);
+            } else {
+
+                com.yonge.cooleshow.biz.dal.entity.SysUser updateEntity = new com.yonge.cooleshow.biz.dal.entity.SysUser();
+                updateEntity.setId(sysUser.getId());
+                updateEntity.setDelFlag(0); // 激活帐号
+                // 激活帐号
+                sysUserMapper.updateById(updateEntity);
+
+                studentResp.username(sysUser.getUsername()).userId(sysUser.getId());
+
+                Student student = lambdaQuery().eq(Student::getUserId, sysUser.getId()).one();
+
+                // 更新学生关联帐号
+                updateStudentUnionStatus(info, studentResp, student);
+
+            }
+
+        } else {
+
+            studentResp.username(studentVo.getUsername()).userId(studentVo.getUserId());
+
+            Student student = lambdaQuery().eq(Student::getUserId, studentVo.getUserId()).one();
+
+            // 更新学生关联帐号
+            updateStudentUnionStatus(info, studentResp, student);
+        }
+
+        return studentResp;
+    }
+
+    /**
+     * 更新学生关联帐号
+     * @param info StudentWrapper.UnionStudent
+     * @param studentResp StudentWrapper.UnionStudentResp
+     * @param student Student
+     */
+    private void updateStudentUnionStatus(StudentWrapper.UnionStudent info,
+                                          StudentWrapper.UnionStudentResp studentResp, Student student) {
+
+        if (Objects.nonNull(student)) {
+
+            if (Objects.isNull(student.getUnionId())) {
+
+                // 更新学生关联Id
+                lambdaUpdate()
+                        .eq(Student::getUserId, student.getUserId())
+                        .set(Student::getUnionId, info.getUnionId())
+                        .update();
+            } else {
+                studentResp.setUnionId(student.getUnionId());
+            }
+
+            // 更新标识
+            studentResp.setUpdateFlag(true);
+        }
+    }
+
 }

+ 77 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/StudentWrapper.java

@@ -0,0 +1,77 @@
+package com.yonge.cooleshow.biz.dal.wrapper;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+/**
+ * 学生封装类
+ * Created by Eric.Shang on 2023/1/6.
+ */
+public class StudentWrapper {
+
+    @Data
+    @Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    @ApiModel("学生帐号关联")
+    public static class UnionStudent implements Serializable {
+
+        @ApiModelProperty("帐号关联Id")
+        private Long unionId;
+
+        @ApiModelProperty("授权Token")
+        private String token;
+
+        @ApiModelProperty("联系方式")
+        private String mobile;
+
+        @ApiModelProperty("声部名称")
+        private String subjectName;
+
+        @ApiModelProperty("用户名")
+        private String username;
+
+        @ApiModelProperty("性别(0,女  1,男)")
+        private Integer gender;
+
+    }
+
+    @Data
+    @Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    @ApiModel("帐号关联响应")
+    public static class UnionStudentResp implements Serializable {
+
+        @ApiModelProperty("帐号关联Id")
+        private Long unionId;
+
+        @ApiModelProperty("联系方式")
+        private String mobile;
+
+        @ApiModelProperty("用户Id")
+        private Long userId;
+
+        @ApiModelProperty("用户名")
+        private String username;
+
+        @ApiModelProperty("更新标识")
+        private Boolean updateFlag;
+
+        public UnionStudentResp userId(Long userId) {
+            this.userId = userId;
+            return this;
+        }
+
+        public UnionStudentResp username(String username) {
+            this.username = username;
+            return this;
+        }
+    }
+}

+ 3 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/MusicSheetMapper.xml

@@ -108,6 +108,9 @@
             <if test="param.dataRecovery != null">
                 AND (t.music_svg_ = '' OR t.music_svg_ IS NULL OR t.music_first_svg_ = '' OR t.music_first_svg_ IS NULL OR t.music_jian_svg_ = '' OR t.music_jian_svg_ IS NULL)
             </if>
+            <if test="param.notation">
+                AND t.notation_ = #{param.notation}
+            </if>
         </where>
         order by
         <if test="param.myself == null or param.myself == false ">

+ 5 - 1
cooleshow-user/user-biz/src/main/resources/config/mybatis/SubjectMapper.xml

@@ -200,6 +200,10 @@
         where  t.id_ = #{id}
     </select>
 
-
+    <!--声部模糊匹配-->
+    <select id="getSubjectMatchByName" resultType="com.yonge.cooleshow.biz.dal.entity.Subject">
+        SELECT * FROM subject WHERE del_flag_ = 0 and name_ LIKE CONCAT('%', #{name}, '%') LIMIT 1
+    </select>
+    <!--声部模糊匹配-->
 
 </mapper>

+ 38 - 6
cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/MusicSheetController.java

@@ -1,14 +1,15 @@
 package com.yonge.cooleshow.student.controller;
 
-import com.yonge.cooleshow.biz.dal.dto.AppMusicSheetVo;
-import com.yonge.cooleshow.biz.dal.enums.MusicSortType;
-import com.yonge.cooleshow.biz.dal.enums.album.PurchaseRecordTypeEnum;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
 
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.Optional;
+
 import javax.validation.Valid;
 
 import org.apache.commons.lang3.StringUtils;
@@ -25,13 +26,18 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.dto.RealnameAuthReq;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.biz.dal.dto.AppMusicSheetVo;
+import com.yonge.cooleshow.biz.dal.dto.MusicSheetRenderDto;
 import com.yonge.cooleshow.biz.dal.dto.search.MusicAlbumSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.MusicSheetRelatedQueryInfo;
 import com.yonge.cooleshow.biz.dal.dto.search.StudentMusicSheetSearch;
+import com.yonge.cooleshow.biz.dal.entity.MusicSheet;
 import com.yonge.cooleshow.biz.dal.entity.Student;
 import com.yonge.cooleshow.biz.dal.enums.AuthStatusEnum;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.enums.MusicSortType;
 import com.yonge.cooleshow.biz.dal.enums.SourceTypeEnum;
+import com.yonge.cooleshow.biz.dal.enums.album.PurchaseRecordTypeEnum;
 import com.yonge.cooleshow.biz.dal.service.AppVersionInfoService;
 import com.yonge.cooleshow.biz.dal.service.MusicAlbumService;
 import com.yonge.cooleshow.biz.dal.service.MusicSheetService;
@@ -50,9 +56,6 @@ import com.yonge.toolset.base.util.StringUtil;
 import com.yonge.toolset.mybatis.support.PageUtil;
 import com.yonge.toolset.utils.idcard.IdcardInfoExtractor;
 
-import java.util.ArrayList;
-import java.util.Optional;
-
 /**
  * 曲谱表 web 控制层
  * @author yzp
@@ -132,6 +135,35 @@ public class MusicSheetController extends BaseController {
         return succeed(PageUtil.pageInfo(musicSheetVoIPage));
     }
 
+    @ApiOperation(value = "修改", httpMethod="POST", consumes="application/json", produces="application/json")
+    @PostMapping(value="/updateRenderFile", consumes="application/json", produces="application/json")
+    public HttpResponseResult<Object> updateRenderFile(@Valid @RequestBody MusicSheetRenderDto musicSheetRenderDto) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null  || sysUser.getId() == null) {
+            return failed("用户信息获取失败");
+        }
+        if (musicSheetRenderDto.getMusicSheetId()==null){
+            return failed("缺少ID");
+        }
+        MusicSheet musicSheet = musicSheetService.getById(musicSheetRenderDto.getMusicSheetId());
+        
+        if(musicSheet == null){
+        	return failed("参数异常");
+        }
+        musicSheet.setMusicFirstSvg(musicSheetRenderDto.getMusicFirstSvg());
+        musicSheet.setMusicJianSvg(musicSheetRenderDto.getMusicJianSvg());
+        musicSheet.setMusicJSON(musicSheetRenderDto.getMusicJSON());
+        musicSheet.setMusicSvg(musicSheetRenderDto.getMusicSvg());
+
+        musicSheet.setUpdateBy(sysUser.getId());
+        musicSheet.setUpdateTime(new Date());
+        if ( musicSheetService.updateById(musicSheet)){
+            return succeed("修改成功");
+        } else {
+            return failed("修改失败");
+        }
+    }
+
     @ApiOperation(value = "乐谱(专辑和曲目同时查询)分页查询", httpMethod="POST", consumes="application/json", produces="application/json")
     @PostMapping(value="/albumAndSheetList", consumes="application/json", produces="application/json")
     public HttpResponseResult<AlbumAndSheetVo> albumAndSheetList(@RequestBody StudentMusicSheetSearch query) {

+ 35 - 6
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/MusicSheetController.java

@@ -1,11 +1,5 @@
 package com.yonge.cooleshow.teacher.controller;
 
-import com.yonge.cooleshow.biz.dal.dto.AppMusicSheetVo;
-import com.yonge.cooleshow.biz.dal.entity.Student;
-import com.yonge.cooleshow.biz.dal.enums.MusicSortType;
-import com.yonge.cooleshow.biz.dal.enums.album.PurchaseRecordTypeEnum;
-import com.yonge.cooleshow.common.enums.EStatus;
-import com.yonge.toolset.base.page.QueryInfo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
@@ -29,7 +23,9 @@ import org.springframework.web.bind.annotation.RestController;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.biz.dal.dto.AppMusicSheetVo;
 import com.yonge.cooleshow.biz.dal.dto.MusicSheetDto;
+import com.yonge.cooleshow.biz.dal.dto.MusicSheetRenderDto;
 import com.yonge.cooleshow.biz.dal.dto.search.MusicSheetRelatedQueryInfo;
 import com.yonge.cooleshow.biz.dal.dto.search.StudentMusicSheetSearch;
 import com.yonge.cooleshow.biz.dal.entity.MusicSheet;
@@ -37,7 +33,9 @@ import com.yonge.cooleshow.biz.dal.entity.Teacher;
 import com.yonge.cooleshow.biz.dal.enums.AuthStatusEnum;
 import com.yonge.cooleshow.biz.dal.enums.ChargeTypeEnum;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.enums.MusicSortType;
 import com.yonge.cooleshow.biz.dal.enums.SourceTypeEnum;
+import com.yonge.cooleshow.biz.dal.enums.album.PurchaseRecordTypeEnum;
 import com.yonge.cooleshow.biz.dal.service.AppVersionInfoService;
 import com.yonge.cooleshow.biz.dal.service.MusicSheetService;
 import com.yonge.cooleshow.biz.dal.service.TeacherService;
@@ -46,8 +44,10 @@ import com.yonge.cooleshow.biz.dal.vo.MusicSheetShareVo;
 import com.yonge.cooleshow.biz.dal.vo.MusicSheetVo;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.cooleshow.common.enums.EStatus;
 import com.yonge.cooleshow.common.enums.YesOrNoEnum;
 import com.yonge.toolset.base.page.PageInfo;
+import com.yonge.toolset.base.page.QueryInfo;
 import com.yonge.toolset.base.util.StringUtil;
 import com.yonge.toolset.mybatis.support.PageUtil;
 
@@ -96,6 +96,35 @@ public class MusicSheetController extends BaseController {
         return succeed(detail);
     }
 
+    @ApiOperation(value = "修改", httpMethod="POST", consumes="application/json", produces="application/json")
+    @PostMapping(value="/updateRenderFile", consumes="application/json", produces="application/json")
+    public HttpResponseResult<Object> updateRenderFile(@Valid @RequestBody MusicSheetRenderDto musicSheetRenderDto) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null  || sysUser.getId() == null) {
+            return failed("用户信息获取失败");
+        }
+        if (musicSheetRenderDto.getMusicSheetId()==null){
+            return failed("缺少ID");
+        }
+        MusicSheet musicSheet = musicSheetService.getById(musicSheetRenderDto.getMusicSheetId());
+        
+        if(musicSheet == null){
+        	return failed("参数异常");
+        }
+        musicSheet.setMusicFirstSvg(musicSheetRenderDto.getMusicFirstSvg());
+        musicSheet.setMusicJianSvg(musicSheetRenderDto.getMusicJianSvg());
+        musicSheet.setMusicJSON(musicSheetRenderDto.getMusicJSON());
+        musicSheet.setMusicSvg(musicSheetRenderDto.getMusicSvg());
+
+        musicSheet.setUpdateBy(sysUser.getId());
+        musicSheet.setUpdateTime(new Date());
+        if ( musicSheetService.updateById(musicSheet)){
+            return succeed("修改成功");
+        } else {
+            return failed("修改失败");
+        }
+    }
+
 	@ApiOperation(value = "新增", httpMethod="POST", consumes="application/json", produces="application/json")
     @PostMapping(value="/create", consumes="application/json", produces="application/json")
     public HttpResponseResult<Object> create(@Valid @RequestBody MusicSheetDto musicSheetDto) {

+ 2 - 1
cooleshow-user/user-website/src/main/java/com/yonge/cooleshow/website/controller/open/OpenMusicSheetController.java

@@ -154,7 +154,8 @@ public class OpenMusicSheetController extends BaseController {
 
     @ApiOperation(value = "新增曲谱渲染图")
     @PostMapping(value="/img")
-    public HttpResponseResult<Boolean> img(@RequestBody @Valid MusicImgDto musicImgDto) {
+    public HttpResponseResult<Boolean>
+    img(@RequestBody @Valid MusicImgDto musicImgDto) {
         return succeed(musicSheetService.updateMusicImg(musicImgDto, musicImgDto.getMusicSheetId()));
     }
 

+ 23 - 0
pom.xml

@@ -57,6 +57,14 @@
 			</dependency>
 
 			<dependency>
+				<groupId>com.microsvc.toolkit</groupId>
+				<artifactId>microsvc-dependencies-bom</artifactId>
+				<version>1.0.0</version>
+				<type>pom</type>
+				<scope>import</scope>
+			</dependency>
+
+			<dependency>
 				<groupId>com.yonge.cooleshow</groupId>
 				<artifactId>auth-api</artifactId>
 				<version>${project.cooleshow.version}</version>
@@ -215,6 +223,16 @@
 
 	<repositories>
 		<repository>
+			<id>alimaven</id>
+			<name>aliyun maven</name>
+			<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+		</repository>
+		<repository>
+			<id>anigiomaven</id>
+			<name>AnigioMaven</name>
+			<url>http://maven.anigio.com/nexus/content/groups/public/</url>
+		</repository>
+		<repository>
 			<id>spring-milestones</id>
 			<name>Spring Milestones</name>
 			<url>https://repo.spring.io/libs-milestone</url>
@@ -292,6 +310,11 @@
 			<artifactId>slf4j-api</artifactId>
 			<scope>provided</scope>
 		</dependency>
+		<dependency>
+			<groupId>com.alibaba</groupId>
+			<artifactId>fastjson</artifactId>
+			<version>1.2.79</version>
+		</dependency>
 	</dependencies>
 
 	<build>