x1ongzhu 6 years ago
parent
commit
5b5f21d0bb
46 changed files with 570 additions and 386 deletions
  1. BIN
      img.png
  2. 0 220
      src/main/java/com/izouma/walkchina/configuration/MiniAppConfig.java
  3. 17 3
      src/main/java/com/izouma/walkchina/configuration/WechatConfig.java
  4. 8 6
      src/main/java/com/izouma/walkchina/constant/AppConstants.java
  5. 7 0
      src/main/java/com/izouma/walkchina/constant/Strings.java
  6. 29 0
      src/main/java/com/izouma/walkchina/domain/FormId.java
  7. 2 2
      src/main/java/com/izouma/walkchina/domain/FriendInfo.java
  8. 1 1
      src/main/java/com/izouma/walkchina/domain/FriendInfoKey.java
  9. 1 1
      src/main/java/com/izouma/walkchina/dto/JsApiTicket.java
  10. 0 22
      src/main/java/com/izouma/walkchina/dto/MyFriend.java
  11. 35 0
      src/main/java/com/izouma/walkchina/dto/UserDTO.java
  12. 0 22
      src/main/java/com/izouma/walkchina/dto/UserTeamMember.java
  13. 6 2
      src/main/java/com/izouma/walkchina/dto/WxAccessToken.java
  14. 10 0
      src/main/java/com/izouma/walkchina/repo/FormIdRepository.java
  15. 19 0
      src/main/java/com/izouma/walkchina/repo/FriendInfoRepository.java
  16. 1 2
      src/main/java/com/izouma/walkchina/repo/JsApiTicketRepository.java
  17. 10 3
      src/main/java/com/izouma/walkchina/repo/TeamMemberRepository.java
  18. 7 0
      src/main/java/com/izouma/walkchina/repo/UserCoinRecordRepository.java
  19. 0 18
      src/main/java/com/izouma/walkchina/repo/UserFriendRepository.java
  20. 1 2
      src/main/java/com/izouma/walkchina/repo/WxAccessTokenRepository.java
  21. 74 0
      src/main/java/com/izouma/walkchina/service/CoinService.java
  22. 36 0
      src/main/java/com/izouma/walkchina/service/FormIdService.java
  23. 132 51
      src/main/java/com/izouma/walkchina/service/TeamService.java
  24. 5 5
      src/main/java/com/izouma/walkchina/service/UserInfoService.java
  25. 13 0
      src/main/java/com/izouma/walkchina/utils/ImageUtils.java
  26. 25 0
      src/main/java/com/izouma/walkchina/web/CoinController.java
  27. 36 1
      src/main/java/com/izouma/walkchina/web/TeamController.java
  28. 1 0
      src/main/resources/logback-spring.xml
  29. BIN
      src/main/resources/static/PingFangMedium.ttf
  30. BIN
      src/main/resources/static/PingFangRegular.ttf
  31. BIN
      src/main/resources/static/Roboto-Black.ttf
  32. BIN
      src/main/resources/static/level_1.png
  33. BIN
      src/main/resources/static/level_2.png
  34. BIN
      src/main/resources/static/level_3.png
  35. BIN
      src/main/resources/static/level_4.png
  36. BIN
      src/main/resources/static/level_5.png
  37. BIN
      src/main/resources/static/level_6.png
  38. BIN
      src/main/resources/static/share_img.png
  39. BIN
      src/main/resources/static/wxaqrcode.jpg
  40. BIN
      src/main/resources/static/未命名.sketch
  41. 6 7
      src/test/java/com/izouma/walkchina/CommonTest.java
  42. 9 13
      src/test/java/com/izouma/walkchina/RedisTest.java
  43. 29 0
      src/test/java/com/izouma/walkchina/repo/FriendInfoRepositoryTest.java
  44. 2 2
      src/test/java/com/izouma/walkchina/repo/TeamMemberRepositoryTest.java
  45. 1 3
      src/test/java/com/izouma/walkchina/repo/WxAccessTokenRepositoryTest.java
  46. 47 0
      src/test/java/com/izouma/walkchina/service/TeamServiceTest.java

BIN
img.png


+ 0 - 220
src/main/java/com/izouma/walkchina/configuration/MiniAppConfig.java

@@ -1,220 +0,0 @@
-package com.izouma.walkchina.configuration;
-
-import cn.binarywang.wx.miniapp.config.WxMaConfig;
-import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder;
-import com.izouma.walkchina.domain.JsApiTicket;
-import com.izouma.walkchina.repo.JsApiTicketRepository;
-import com.izouma.walkchina.repo.WxAccessTokenRepository;
-import lombok.Data;
-import me.chanjar.weixin.common.bean.WxAccessToken;
-import me.chanjar.weixin.common.util.http.apache.ApacheHttpClientBuilder;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.context.properties.ConfigurationProperties;
-import org.springframework.stereotype.Component;
-
-import java.io.File;
-import java.util.Date;
-import java.util.concurrent.locks.Lock;
-import java.util.concurrent.locks.ReentrantLock;
-
-@Data
-@Component
-@ConfigurationProperties(prefix = "wx.miniapp")
-public class MiniAppConfig implements WxMaConfig {
-
-    @Autowired
-    private WxAccessTokenRepository wxAccessTokenRepository;
-    @Autowired
-    private JsApiTicketRepository   jsApiTicketRepository;
-
-    private String appId;
-    private String appSecret;
-    private String msgToken;
-    private String msgAesKey;
-    private String msgFormat;
-
-    private volatile String httpProxyHost;
-    private volatile int    httpProxyPort;
-    private volatile String httpProxyUsername;
-    private volatile String httpProxyPassword;
-
-    private volatile String cardApiTicket;
-    private volatile long   cardApiTicketExpiresTime;
-
-    private Lock accessTokenLock   = new ReentrantLock();
-    private Lock jsapiTicketLock   = new ReentrantLock();
-    private Lock cardApiTicketLock = new ReentrantLock();
-
-    /**
-     * 临时文件目录
-     */
-    protected volatile File tmpDirFile;
-
-    private volatile ApacheHttpClientBuilder apacheHttpClientBuilder;
-
-    @Override
-    public String getAccessToken() {
-        com.izouma.walkchina.domain.WxAccessToken wxAccessToken = wxAccessTokenRepository.findByAppId(appId);
-        if (wxAccessToken != null) {
-            if (!new Date(wxAccessToken.getExpiresAt()).before(new Date())) {
-                return wxAccessToken.getToken();
-            }
-        }
-        return null;
-    }
-
-    @Override
-    public Lock getAccessTokenLock() {
-        return this.accessTokenLock;
-    }
-
-    public void setAccessTokenLock(Lock accessTokenLock) {
-        this.accessTokenLock = accessTokenLock;
-    }
-
-    @Override
-    public boolean isAccessTokenExpired() {
-        com.izouma.walkchina.domain.WxAccessToken wxAccessToken = wxAccessTokenRepository.findByAppId(appId);
-        if (wxAccessToken != null) {
-            return new Date(wxAccessToken.getExpiresAt()).before(new Date());
-        }
-        return true;
-    }
-
-    @Override
-    public synchronized void updateAccessToken(WxAccessToken accessToken) {
-        updateAccessToken(accessToken.getAccessToken(), accessToken.getExpiresIn());
-    }
-
-    @Override
-    public synchronized void updateAccessToken(String accessToken, int expiresInSeconds) {
-        long expiresAt = System.currentTimeMillis() + (expiresInSeconds - 200) * 1000L;
-        com.izouma.walkchina.domain.WxAccessToken wxAccessToken = wxAccessTokenRepository.findByAppId(appId);
-        if (wxAccessToken != null) {
-            wxAccessTokenRepository.delete(wxAccessToken);
-        }
-        wxAccessToken = new com.izouma.walkchina.domain.WxAccessToken(appId, accessToken, expiresAt);
-        wxAccessTokenRepository.save(wxAccessToken);
-    }
-
-    @Override
-    public String getJsapiTicket() {
-        JsApiTicket jsApiTicket = jsApiTicketRepository.findByAppId(appId);
-        if (jsApiTicket != null) {
-            if (!new Date(jsApiTicket.getExpiresAt()).before(new Date())) {
-                return jsApiTicket.getTicket();
-            }
-        }
-        return null;
-    }
-
-    @Override
-    public Lock getJsapiTicketLock() {
-        return this.jsapiTicketLock;
-    }
-
-    @Override
-    public boolean isJsapiTicketExpired() {
-        com.izouma.walkchina.domain.JsApiTicket jsApiTicket = jsApiTicketRepository.findByAppId(appId);
-        if (jsApiTicket != null) {
-            return new Date(jsApiTicket.getExpiresAt()).before(new Date());
-        }
-        return true;
-    }
-
-    @Override
-    public void expireJsapiTicket() {
-        jsApiTicketRepository.delete(new JsApiTicket(appId, null, null));
-    }
-
-    @Override
-    public void updateJsapiTicket(String jsapiTicket, int expiresInSeconds) {
-        long expiresAt = System.currentTimeMillis() + (expiresInSeconds - 200) * 1000L;
-        com.izouma.walkchina.domain.JsApiTicket jsApiTicket = jsApiTicketRepository.findByAppId(appId);
-        jsApiTicketRepository.delete(jsApiTicket);
-        jsApiTicket = new com.izouma.walkchina.domain.JsApiTicket(appId, jsapiTicket, expiresAt);
-        jsApiTicketRepository.save(jsApiTicket);
-    }
-
-
-    @Override
-    public String getCardApiTicket() {
-        return this.cardApiTicket;
-    }
-
-    @Override
-    public Lock getCardApiTicketLock() {
-        return this.cardApiTicketLock;
-    }
-
-    @Override
-    public boolean isCardApiTicketExpired() {
-        return System.currentTimeMillis() > this.cardApiTicketExpiresTime;
-    }
-
-    @Override
-    public void expireCardApiTicket() {
-        this.cardApiTicketExpiresTime = 0;
-    }
-
-    @Override
-    public void updateCardApiTicket(String cardApiTicket, int expiresInSeconds) {
-        this.cardApiTicket = cardApiTicket;
-        // 预留200秒的时间
-        this.cardApiTicketExpiresTime = System.currentTimeMillis() + (expiresInSeconds - 200) * 1000L;
-    }
-
-    @Override
-    public void expireAccessToken() {
-        wxAccessTokenRepository.delete(new com.izouma.walkchina.domain.WxAccessToken(appId, null, null));
-    }
-
-    @Override
-    public String getSecret() {
-        return this.appSecret;
-    }
-
-    @Override
-    public String getToken() {
-        return this.msgToken;
-    }
-
-    @Override
-    public long getExpiresTime() {
-        com.izouma.walkchina.domain.WxAccessToken wxAccessToken = wxAccessTokenRepository.findByAppId(appId);
-        if (wxAccessToken != null) {
-            return wxAccessToken.getExpiresAt();
-        }
-        return 0;
-    }
-
-    @Override
-    public String getAesKey() {
-        return this.msgAesKey;
-    }
-
-    @Override
-    public String getMsgDataFormat() {
-        return this.msgFormat;
-    }
-
-    @Override
-    public String toString() {
-        return WxMaGsonBuilder.create().toJson(this);
-    }
-
-    @Override
-    public boolean autoRefreshToken() {
-        return true;
-    }
-
-    public void setAppid(String appid) {
-        this.appId = appid;
-    }
-
-    @Override
-    public String getAppid() {
-        return appId;
-    }
-
-}

+ 17 - 3
src/main/java/com/izouma/walkchina/configuration/WechatConfig.java

@@ -2,20 +2,34 @@ package com.izouma.walkchina.configuration;
 
 import cn.binarywang.wx.miniapp.api.WxMaService;
 import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl;
+import cn.binarywang.wx.miniapp.config.WxMaInMemoryConfig;
+import lombok.Data;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.context.properties.ConfigurationProperties;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 
 @Configuration
+@Data
+@ConfigurationProperties(prefix = "wx.miniapp")
 public class WechatConfig {
 
-    @Autowired
-    private MiniAppConfig miniAppConfig;
+    private String appId;
+    private String appSecret;
+    private String msgToken;
+    private String msgAesKey;
+    private String msgFormat;
 
     @Bean
     public WxMaService wxMaService() {
         WxMaService service = new WxMaServiceImpl();
-        service.setWxMaConfig(miniAppConfig);
+        WxMaInMemoryConfig config = new WxMaInMemoryConfig();
+        config.setAppid(appId);
+        config.setSecret(appSecret);
+        config.setToken(msgToken);
+        config.setAesKey(msgAesKey);
+        config.setMsgDataFormat(msgFormat);
+        service.setWxMaConfig(config);
         return service;
     }
 }

+ 8 - 6
src/main/java/com/izouma/walkchina/constant/AppConstants.java

@@ -23,11 +23,13 @@ public interface AppConstants {
     }
 
     interface CoinRecordType {
-        int STAGE    = 1; // 领取阶段奖励
-        int STEAL    = 2; // 偷奖金
-        int ARRIVAL  = 3; // 到达城市
-        int HIRE     = 4; // 雇佣
-        int BE_HIRED = 5; // 被雇佣
-        int BUY      = 6; // 购买商品
+        int STAGE     = 1; // 领取阶段奖励
+        int STEAL     = 2; // 偷奖金
+        int ARRIVAL   = 3; // 到达城市
+        int HIRE      = 4; // 雇佣
+        int BE_HIRED  = 5; // 被雇佣
+        int BUY       = 6; // 购买商品
+        int REWARD    = 7; // 打赏
+        int BE_REWARD = 8; // 被打赏
     }
 }

+ 7 - 0
src/main/java/com/izouma/walkchina/constant/Strings.java

@@ -15,6 +15,8 @@ public interface Strings {
 
     String MSG_AWARD_STOLEN = "%s偷了你%s商城币";
 
+    String MSG_BE_REWARD = "%s打赏了你%s商城币";
+
     String REMARK_HIRE = "雇佣队员";
 
     String REMARK_BE_HIRED = "队员佣金";
@@ -23,5 +25,10 @@ public interface Strings {
 
     String REMARK_STEAL_STAGE_AWARD = "偷奖金";
 
+    String REMARK_REWARD = "打赏队员";
+
+    String REMARK_BE_REWARD = "队长打赏";
+
     String GRAB_FAIL = "很遗憾,Ta已经被别人抢走了~";
+
 }

+ 29 - 0
src/main/java/com/izouma/walkchina/domain/FormId.java

@@ -0,0 +1,29 @@
+package com.izouma.walkchina.domain;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import java.util.Date;
+
+@Data
+@Entity
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class FormId {
+    @Id
+    @GeneratedValue(strategy = GenerationType.AUTO)
+    private Long id;
+
+    private Long userId;
+
+    private String formId;
+
+    private Date expiresAt;
+}

+ 2 - 2
src/main/java/com/izouma/walkchina/domain/UserFriend.java → src/main/java/com/izouma/walkchina/domain/FriendInfo.java

@@ -21,8 +21,8 @@ import java.util.Date;
 @Builder
 @JsonInclude(JsonInclude.Include.NON_NULL)
 @EntityListeners(AuditingEntityListener.class)
-@IdClass(UserFriendKey.class)
-public class UserFriend {
+@IdClass(FriendInfoKey.class)
+public class FriendInfo {
 
     @Id
     private Long userId;

+ 1 - 1
src/main/java/com/izouma/walkchina/domain/UserFriendKey.java → src/main/java/com/izouma/walkchina/domain/FriendInfoKey.java

@@ -5,7 +5,7 @@ import lombok.Data;
 import java.io.Serializable;
 
 @Data
-public class UserFriendKey implements Serializable {
+public class FriendInfoKey implements Serializable {
     private static final long serialVersionUID = -2193777760224400194L;
 
     private Long userId;

+ 1 - 1
src/main/java/com/izouma/walkchina/domain/JsApiTicket.java → src/main/java/com/izouma/walkchina/dto/JsApiTicket.java

@@ -1,4 +1,4 @@
-package com.izouma.walkchina.domain;
+package com.izouma.walkchina.dto;
 
 import lombok.Data;
 import lombok.NoArgsConstructor;

+ 0 - 22
src/main/java/com/izouma/walkchina/dto/MyFriend.java

@@ -1,22 +0,0 @@
-package com.izouma.walkchina.dto;
-
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-@Data
-@NoArgsConstructor
-public class MyFriend {
-    private Long    userId;
-    private String  nickname;
-    private String  avatar;
-    private Long    todaySteps;
-    private Long    totalSteps;
-    private Boolean hired;
-
-    public MyFriend(Long userId, String nickname, String avatar, Long totalSteps) {
-        this.userId = userId;
-        this.nickname = nickname;
-        this.avatar = avatar;
-        this.totalSteps = totalSteps;
-    }
-}

+ 35 - 0
src/main/java/com/izouma/walkchina/dto/UserDTO.java

@@ -0,0 +1,35 @@
+package com.izouma.walkchina.dto;
+
+import com.izouma.walkchina.constant.AppConstants;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+
+@Data
+@NoArgsConstructor
+public class UserDTO {
+    private Long    userId;
+    private String  nickname;
+    private String  avatar;
+    private Long    todaySteps;
+    private Long    totalSteps;
+    private Boolean hired;
+    private boolean shouldWake;
+
+    public UserDTO(Long userId, String nickname, String avatar, Long totalSteps) {
+        this.userId = userId;
+        this.nickname = nickname;
+        this.avatar = avatar;
+        this.totalSteps = totalSteps;
+    }
+
+    public double getPrice() {
+        if (totalSteps != null) {
+            return BigDecimal.valueOf(totalSteps * AppConstants.HIRE_PRICE_RATE).setScale(1, RoundingMode.FLOOR).doubleValue();
+        }
+        return 0;
+    }
+}

+ 0 - 22
src/main/java/com/izouma/walkchina/dto/UserTeamMember.java

@@ -1,22 +0,0 @@
-package com.izouma.walkchina.dto;
-
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-@Data
-@NoArgsConstructor
-public class UserTeamMember {
-    private Long    userId;
-    private String  nickname;
-    private String  avatar;
-    private Long    todaySteps;
-    private Long    totalSteps;
-    private boolean shouldWake;
-
-    public UserTeamMember(Long userId, String nickname, String avatar, Long todaySteps) {
-        this.userId = userId;
-        this.nickname = nickname;
-        this.avatar = avatar;
-        this.todaySteps = todaySteps;
-    }
-}

+ 6 - 2
src/main/java/com/izouma/walkchina/domain/WxAccessToken.java → src/main/java/com/izouma/walkchina/dto/WxAccessToken.java

@@ -1,4 +1,4 @@
-package com.izouma.walkchina.domain;
+package com.izouma.walkchina.dto;
 
 import lombok.Data;
 import lombok.NoArgsConstructor;
@@ -6,12 +6,16 @@ import lombok.ToString;
 import org.springframework.data.redis.core.RedisHash;
 
 import javax.persistence.Id;
+import java.io.Serializable;
 
 @Data
 @NoArgsConstructor
 @ToString
 @RedisHash("WxAccessToken")
-public class WxAccessToken {
+public class WxAccessToken implements Serializable {
+
+    private static final long serialVersionUID = -1134075456439740254L;
+
     @Id
     private String id;
     private String appId;

+ 10 - 0
src/main/java/com/izouma/walkchina/repo/FormIdRepository.java

@@ -0,0 +1,10 @@
+package com.izouma.walkchina.repo;
+
+import com.izouma.walkchina.domain.FormId;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import java.util.List;
+
+public interface FormIdRepository extends JpaRepository<FormId, Long> {
+   List<FormId> findByUserId(Long userId);
+}

+ 19 - 0
src/main/java/com/izouma/walkchina/repo/FriendInfoRepository.java

@@ -0,0 +1,19 @@
+package com.izouma.walkchina.repo;
+
+import com.izouma.walkchina.domain.FriendInfo;
+import com.izouma.walkchina.domain.FriendInfoKey;
+import com.izouma.walkchina.dto.UserDTO;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+
+import java.util.Date;
+import java.util.List;
+
+public interface FriendInfoRepository extends JpaRepository<FriendInfo, FriendInfoKey> {
+
+    @Query("select new com.izouma.walkchina.dto.UserDTO(uf.friendId, u.nickname, u.avatar, u.totalSteps) " +
+            "from FriendInfo uf " +
+            "join UserInfo u on uf.friendId = u.id " +
+            "where uf.userId = ?1 ")
+    List<UserDTO> findUserFriend(Long userId, Date date);
+}

+ 1 - 2
src/main/java/com/izouma/walkchina/repo/JsApiTicketRepository.java

@@ -1,8 +1,7 @@
 package com.izouma.walkchina.repo;
 
-import com.izouma.walkchina.domain.JsApiTicket;
+import com.izouma.walkchina.dto.JsApiTicket;
 import org.springframework.data.repository.CrudRepository;
 
 public interface JsApiTicketRepository extends CrudRepository<JsApiTicket, String> {
-    JsApiTicket findByAppId(String appId);
 }

+ 10 - 3
src/main/java/com/izouma/walkchina/repo/TeamMemberRepository.java

@@ -1,7 +1,7 @@
 package com.izouma.walkchina.repo;
 
 import com.izouma.walkchina.domain.TeamMember;
-import com.izouma.walkchina.dto.UserTeamMember;
+import com.izouma.walkchina.dto.UserDTO;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.Query;
 
@@ -14,7 +14,14 @@ public interface TeamMemberRepository extends JpaRepository<TeamMember, Long> {
             "and ((t.startDate <= ?2 and t.endDate >= ?2) or t.startDate > ?2) order by t.startDate desc")
     TeamMember findActive(Long userId, Date date);
 
-    @Query("select new com.izouma.walkchina.dto.UserTeamMember(t.userId, u.nickname, u.avatar, u.totalSteps) " +
+    @Query("select new com.izouma.walkchina.dto.UserDTO(t.userId, u.nickname, u.avatar, u.totalSteps) " +
             "from TeamMember t join UserInfo u on u.id = t.userId where t.leader = ?1 and t.grabbed = 0")
-    List<UserTeamMember> findUserTeam(Long userId);
+    List<UserDTO> findUserTeam(Long userId);
+
+    @Query("select t from TeamMember t where t.leader = ?1 and t.userId = ?2 and ((t.startDate <= ?3 and t.endDate >= ?3) or t.startDate > ?3)")
+    TeamMember findByLeaderAndUserId(Long leader, Long userId, Date date);
+
+    @Query("select new com.izouma.walkchina.dto.UserDTO(t.leader, u.nickname, u.avatar, u.totalSteps) from TeamMember t join UserInfo u on t.leader = u.id " +
+            "where t.userId = ?1 and ((t.startDate <= ?2 and t.endDate >= ?2) or t.startDate > ?2)")
+    UserDTO findLeader(Long userId, Date date);
 }

+ 7 - 0
src/main/java/com/izouma/walkchina/repo/UserCoinRecordRepository.java

@@ -2,6 +2,13 @@ package com.izouma.walkchina.repo;
 
 import com.izouma.walkchina.domain.UserCoinRecord;
 import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+
+import java.math.BigDecimal;
+import java.util.Optional;
 
 public interface UserCoinRecordRepository extends JpaRepository<UserCoinRecord, Long> {
+
+    @Query(value = "select sum(modify) from user_coin_record where user_id = ?1 and modify > 0", nativeQuery = true)
+    Optional<BigDecimal> sumTotalAward(Long userId);
 }

+ 0 - 18
src/main/java/com/izouma/walkchina/repo/UserFriendRepository.java

@@ -1,18 +0,0 @@
-package com.izouma.walkchina.repo;
-
-import com.izouma.walkchina.domain.UserFriend;
-import com.izouma.walkchina.domain.UserFriendKey;
-import com.izouma.walkchina.dto.MyFriend;
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.Query;
-
-import java.util.Date;
-import java.util.List;
-
-public interface UserFriendRepository extends JpaRepository<UserFriend, UserFriendKey> {
-
-    @Query("select new com.izouma.walkchina.dto.MyFriend(uf.friendId, u.nickname, u.avatar, u.totalSteps) from UserFriend uf " +
-            "join UserInfo u on uf.friendId = u.id join WalkData w on uf.friendId = w.userId " +
-            "where uf.userId = ?1 and w.date = ?2")
-    List<MyFriend> findMyFriend(Long userId, Date date);
-}

+ 1 - 2
src/main/java/com/izouma/walkchina/repo/WxAccessTokenRepository.java

@@ -1,8 +1,7 @@
 package com.izouma.walkchina.repo;
 
-import com.izouma.walkchina.domain.WxAccessToken;
+import com.izouma.walkchina.dto.WxAccessToken;
 import org.springframework.data.repository.CrudRepository;
 
 public interface WxAccessTokenRepository extends CrudRepository<WxAccessToken, String> {
-    WxAccessToken findByAppId(String appId);
 }

+ 74 - 0
src/main/java/com/izouma/walkchina/service/CoinService.java

@@ -0,0 +1,74 @@
+package com.izouma.walkchina.service;
+
+import com.izouma.walkchina.constant.AppConstants;
+import com.izouma.walkchina.constant.Strings;
+import com.izouma.walkchina.domain.Message;
+import com.izouma.walkchina.domain.UserCoinRecord;
+import com.izouma.walkchina.domain.UserInfo;
+import com.izouma.walkchina.exception.ServiceException;
+import com.izouma.walkchina.repo.MessageRepository;
+import com.izouma.walkchina.repo.UserCoinRecordRepository;
+import com.izouma.walkchina.repo.UserInfoRepository;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.util.Optional;
+
+@Slf4j
+@Service
+public class CoinService {
+
+    @Autowired
+    private UserCoinRecordRepository userCoinRecordRepository;
+    @Autowired
+    private UserInfoRepository       userInfoRepository;
+    @Autowired
+    private MessageRepository        messageRepository;
+
+    public void reward(Long userId, Long target, BigDecimal amount) {
+        UserInfo userInfo = userInfoRepository.findById(userId).orElseThrow(new ServiceException("用户不存在"));
+        UserInfo targetUserInfo = userInfoRepository.findById(target).orElseThrow(new ServiceException("用户不存在"));
+        BigDecimal balance = Optional.ofNullable(userInfo.getCoin()).orElse(BigDecimal.ZERO);
+        if (balance.compareTo(amount) < 0) {
+            throw new ServiceException("打赏失败,余额不足");
+        }
+        balanceChange(userInfo, amount.negate(), AppConstants.CoinRecordType.REWARD, Strings.REMARK_REWARD, null);
+
+        balanceChange(targetUserInfo, amount, AppConstants.CoinRecordType.BE_REWARD, Strings.REMARK_BE_REWARD,
+                String.format(Strings.MSG_BE_REWARD, userInfo.getNickname(), amount));
+    }
+
+    public void balanceChange(UserInfo userInfo, BigDecimal amount, int type, String remark, String message) {
+        BigDecimal balance = Optional.ofNullable(userInfo.getCoin()).orElse(BigDecimal.ZERO);
+        balance = balance.add(amount);
+        userInfo.setCoin(balance);
+        userInfoRepository.save(userInfo);
+
+        UserCoinRecord record = UserCoinRecord.builder()
+                .userId(userInfo.getId())
+                .modify(amount)
+                .balance(balance)
+                .type(type)
+                .remark(remark)
+                .build();
+        userCoinRecordRepository.save(record);
+
+        if (StringUtils.isNotEmpty(message)) {
+            Message msg = Message.builder()
+                    .userId(userInfo.getId())
+                    .content(message)
+                    .type(AppConstants.MessageType.NORMAL)
+                    .isRead(false)
+                    .active(true)
+                    .build();
+            messageRepository.save(msg);
+        }
+    }
+
+    public BigDecimal totalAward(Long userId) {
+        return userCoinRecordRepository.sumTotalAward(userId).orElse(BigDecimal.ZERO);
+    }
+}

+ 36 - 0
src/main/java/com/izouma/walkchina/service/FormIdService.java

@@ -0,0 +1,36 @@
+package com.izouma.walkchina.service;
+
+import com.izouma.walkchina.domain.FormId;
+import com.izouma.walkchina.repo.FormIdRepository;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+import java.util.List;
+
+@Slf4j
+@Service
+public class FormIdService {
+    @Autowired
+    private FormIdRepository formIdRepository;
+
+    public void save(Long userId, String formId) {
+        formIdRepository.save(FormId.builder()
+                .userId(userId)
+                .formId(formId)
+                .expiresAt(new Date(System.currentTimeMillis() + 7 * 24 * 60 * 59 * 1000L))
+                .build());
+    }
+
+    public String get(Long userId) {
+        List<FormId> list = formIdRepository.findByUserId(userId);
+        for (FormId formId : list) {
+            formIdRepository.delete(formId);
+            if (formId.getExpiresAt().after(new Date())) {
+                return formId.getFormId();
+            }
+        }
+        return null;
+    }
+}

+ 132 - 51
src/main/java/com/izouma/walkchina/service/TeamService.java

@@ -1,18 +1,34 @@
 package com.izouma.walkchina.service;
 
+import cn.binarywang.wx.miniapp.api.WxMaService;
+import cn.binarywang.wx.miniapp.bean.WxMaCodeLineColor;
+import cn.binarywang.wx.miniapp.bean.WxMaTemplateMessage;
+import cn.binarywang.wx.miniapp.bean.WxMaUniformMessage;
 import com.izouma.walkchina.constant.AppConstants;
 import com.izouma.walkchina.constant.Strings;
 import com.izouma.walkchina.domain.*;
-import com.izouma.walkchina.dto.UserTeamMember;
+import com.izouma.walkchina.dto.UserDTO;
 import com.izouma.walkchina.exception.ServiceException;
 import com.izouma.walkchina.repo.*;
+import com.izouma.walkchina.utils.ImageUtils;
+import com.sun.imageio.plugins.common.ImageUtil;
 import lombok.extern.slf4j.Slf4j;
+import me.chanjar.weixin.common.error.WxErrorException;
 import org.apache.commons.lang3.time.DateUtils;
+import org.joda.time.Days;
+import org.joda.time.LocalDate;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import javax.imageio.ImageIO;
+import java.awt.*;
+import java.awt.image.BufferedImage;
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.IOException;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
+import java.net.URL;
 import java.util.Date;
 import java.util.List;
 import java.util.Optional;
@@ -21,15 +37,19 @@ import java.util.Optional;
 @Slf4j
 public class TeamService {
     @Autowired
-    private TeamMemberRepository     teamMemberRepository;
+    private TeamMemberRepository teamMemberRepository;
     @Autowired
-    private UserInfoRepository       userInfoRepository;
+    private UserInfoRepository   userInfoRepository;
     @Autowired
-    private UserCoinRecordRepository userCoinRecordRepository;
+    private MessageRepository    messageRepository;
     @Autowired
-    private MessageRepository        messageRepository;
+    private WalkDataRepository   walkDataRepository;
     @Autowired
-    private WalkDataRepository       walkDataRepository;
+    private FriendInfoRepository friendInfoRepository;
+    @Autowired
+    private CoinService          coinService;
+    @Autowired
+    private WxMaService          wxMaService;
 
     public void hire(Long userId, Long target) {
         Date now = new Date();
@@ -66,9 +86,11 @@ public class TeamService {
             throw new ServiceException("雇佣失败,商城币不足");
         }
 
-        balance = balance.subtract(price);
-        userInfo.setCoin(balance);
-        userInfoRepository.save(userInfo);
+        coinService.balanceChange(userInfo, price.negate(), AppConstants.CoinRecordType.HIRE, Strings.REMARK_HIRE,
+                String.format(Strings.MSG_HIRE, price, targetUserInfo.getNickname()));
+
+        coinService.balanceChange(targetUserInfo, price, AppConstants.CoinRecordType.BE_HIRED, Strings.REMARK_BE_HIRED,
+                String.format(Strings.MSG_HIRED, targetUserInfo.getNickname(), price));
 
         TeamMember newTeamMember = TeamMember.builder()
                 .userId(target)
@@ -79,41 +101,6 @@ public class TeamService {
                 .active(true)
                 .build();
         teamMemberRepository.save(newTeamMember);
-
-        UserCoinRecord hireRecord = UserCoinRecord.builder()
-                .userId(userId)
-                .modify(price.negate())
-                .balance(balance)
-                .type(AppConstants.CoinRecordType.HIRE)
-                .remark(Strings.REMARK_HIRE)
-                .build();
-        userCoinRecordRepository.save(hireRecord);
-        Message hireMsg = Message.builder()
-                .userId(userId)
-                .type(AppConstants.MessageType.NORMAL)
-                .content(String.format(Strings.MSG_HIRE, price, targetUserInfo.getNickname()))
-                .active(true)
-                .isRead(false)
-                .build();
-        messageRepository.save(hireMsg);
-
-        BigDecimal targetBalance = Optional.ofNullable(targetUserInfo.getCoin()).orElse(BigDecimal.ZERO).add(price);
-        UserCoinRecord beHiredRecord = UserCoinRecord.builder()
-                .userId(target)
-                .modify(price)
-                .balance(targetBalance)
-                .type(AppConstants.CoinRecordType.BE_HIRED)
-                .remark(Strings.REMARK_BE_HIRED)
-                .build();
-        userCoinRecordRepository.save(beHiredRecord);
-        Message beHireMsg = Message.builder()
-                .userId(userId)
-                .type(AppConstants.MessageType.NORMAL)
-                .content(String.format(Strings.MSG_HIRED, targetUserInfo.getNickname(), price))
-                .active(true)
-                .isRead(false)
-                .build();
-        messageRepository.save(beHireMsg);
     }
 
     public boolean canHire(Long userId, Long target) {
@@ -128,18 +115,112 @@ public class TeamService {
         return true;
     }
 
-    public List<UserTeamMember> userTeam(Long userId) {
-        List<UserTeamMember> list = teamMemberRepository.findUserTeam(userId);
+    public List<UserDTO> userTeam(Long userId) {
+        List<UserDTO> list = teamMemberRepository.findUserTeam(userId);
         Date now = new Date();
-        for (UserTeamMember userTeamMember : list) {
-            WalkData walkData = walkDataRepository.findByUserIdAndDate(userTeamMember.getUserId(), now);
+        for (UserDTO userDTO : list) {
+            WalkData walkData = walkDataRepository.findByUserIdAndDate(userDTO.getUserId(), now);
             if (walkData != null) {
-                userTeamMember.setTodaySteps(walkData.getSteps());
+                userDTO.setTodaySteps(walkData.getSteps());
             } else {
-                userTeamMember.setTodaySteps(0L);
-                userTeamMember.setShouldWake(true);
+                userDTO.setTodaySteps(0L);
+                userDTO.setShouldWake(true);
             }
         }
         return list;
     }
+
+    public List<UserDTO> userFriend(Long userId) {
+        Date now = new Date();
+        List<UserDTO> list = friendInfoRepository.findUserFriend(userId, now);
+        for (UserDTO userDTO : list) {
+            WalkData walkData = walkDataRepository.findByUserIdAndDate(userDTO.getUserId(), now);
+            if (walkData != null) {
+                userDTO.setTodaySteps(walkData.getSteps());
+            } else {
+                userDTO.setTodaySteps(0L);
+            }
+
+            TeamMember teamMember = teamMemberRepository.findByLeaderAndUserId(userId, userDTO.getUserId(), now);
+            userDTO.setHired(teamMember != null);
+        }
+        return list;
+    }
+
+    public UserDTO userLeader(Long userId) {
+        UserDTO userDTO = teamMemberRepository.findLeader(userId, new Date());
+        WalkData walkData = walkDataRepository.findByUserIdAndDate(userDTO.getUserId(), new Date());
+        if (walkData != null) {
+            userDTO.setTodaySteps(walkData.getSteps());
+        } else {
+            userDTO.setTodaySteps(0L);
+        }
+        return userDTO;
+    }
+
+    public BufferedImage recruitImg(Long userId) throws IOException, FontFormatException, WxErrorException {
+        UserInfo userInfo = userInfoRepository.findById(userId).orElseThrow(new ServiceException("用户不存在"));
+
+        Font pingFangRegular = Font.createFont(Font.TRUETYPE_FONT, new File(ClassLoader.getSystemResource("static/PingFangRegular.ttf").getFile()));
+        Font pingFangMedium = Font.createFont(Font.TRUETYPE_FONT, new File(ClassLoader.getSystemResource("static/PingFangMedium.ttf").getFile()));
+        Font robot = Font.createFont(Font.TRUETYPE_FONT, new File(ClassLoader.getSystemResource("static/Roboto-Black.ttf").getFile()));
+        BufferedImage shareImg = ImageIO.read(ClassLoader.getSystemResource("static/share_img.png"));
+        Graphics2D g = shareImg.createGraphics();
+        g.setComposite(AlphaComposite.Src);
+        g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
+        g.setComposite(AlphaComposite.SrcOver);
+        BufferedImage avatarImg = ImageUtils.makeRoundedCorner(ImageUtils
+                .scale(ImageIO.read(new URL(userInfo.getAvatar())),
+                        46 * 3, 46 * 3,
+                        ImageUtils.Fit.COVER), 23 * 3);
+        g.drawImage(avatarImg, 145 * 3, 177 * 3, null);
+
+        BufferedImage levelImg = ImageIO.read(ClassLoader.getSystemResource("static/level_" + userInfo.getLevel() + ".png"));
+        g.drawImage(levelImg, (shareImg.getWidth() - levelImg.getWidth()) / 2, 251 * 3, null);
+
+
+        Font nicknameFont = pingFangRegular.deriveFont(14f * 3);
+        g.setColor(Color.BLACK);
+        ImageUtils.drawCenteredString(g, userInfo.getNickname(), new Rectangle(0, 230 * 3, shareImg.getWidth(), 20 * 3), nicknameFont);
+
+        Font walkDataFont = pingFangMedium.deriveFont(17f * 3);
+        ImageUtils.drawCenteredString(g, Days.daysBetween(LocalDate.fromDateFields(userInfo.getCreatedAt()), LocalDate.fromDateFields(new Date())).getDays() + "", new Rectangle(20 * 3, 295 * 3, 295 * 3 / 2, 24 * 3), walkDataFont);
+        ImageUtils.drawCenteredString(g, String.valueOf(userInfo.getWalkCities()), new Rectangle(295 * 3 / 2 + 20 * 3, 295 * 3, 295 * 3 / 2, 24 * 3), walkDataFont);
+        ImageUtils.drawCenteredString(g, String.valueOf(userInfo.getTotalSteps()), new Rectangle(20 * 3, 353 * 3, 295 * 3 / 2, 24 * 3), walkDataFont);
+        ImageUtils.drawCenteredString(g, coinService.totalAward(userId).toString(), new Rectangle(295 * 3 / 2 + 20 * 3, 353 * 3, 295 * 3 / 2, 24 * 3), walkDataFont);
+
+        Font labelFont = pingFangRegular.deriveFont(12f * 3);
+        g.setColor(new Color(128, 128, 128));
+        ImageUtils.drawCenteredString(g, "参赛天数", new Rectangle(20 * 3, 321 * 3, 295 * 3 / 2, 24 * 3), labelFont);
+        ImageUtils.drawCenteredString(g, "途经城市", new Rectangle(295 * 3 / 2 + 20 * 3, 321 * 3, 295 * 3 / 2, 24 * 3), labelFont);
+        ImageUtils.drawCenteredString(g, "总步数", new Rectangle(20 * 3, 376 * 3, 295 * 3 / 2, 24 * 3), labelFont);
+        ImageUtils.drawCenteredString(g, "获得奖金", new Rectangle(295 * 3 / 2 + 20 * 3, 376 * 3, 295 * 3 / 2, 24 * 3), labelFont);
+
+        String userNum = String.valueOf(userInfoRepository.count());
+        Font numberFont = robot.deriveFont(39f * 3);
+        g.setColor(new Color(76, 128, 255));
+        g.setFont(numberFont);
+        g.drawString(userNum, 20 * 3, 505 * 3);
+
+        int numberWidth = g.getFontMetrics(numberFont).stringWidth(userNum);
+        g.setFont(pingFangRegular.deriveFont(14f * 3));
+        g.drawString("位", 20 * 3 + numberWidth, 505 * 3);
+
+//        byte[] bytes = wxMaService.getQrcodeService().createWxaCodeUnlimitBytes("recruit", "pages/home/home?from=" + userId, 72 * 3, true, new WxMaCodeLineColor("0", "0", "0"), true);
+//        ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);
+//        BufferedImage codeImg = ImageIO.read(byteArrayInputStream);
+
+        BufferedImage codeImg = ImageIO.read(ClassLoader.getSystemResource("static/wxaqrcode.jpg"));
+
+        g.drawImage(ImageUtils.scale(codeImg, 72 * 3, 72 * 3, ImageUtils.Fit.COVER), 235 * 3, 425 * 3, null);
+
+        return shareImg;
+    }
+
+    public void wake(Long userId, Long target) throws WxErrorException {
+        UserInfo userInfo = userInfoRepository.findById(userId).orElseThrow(new ServiceException("用户不存在"));
+        UserInfo targetUserInfo = userInfoRepository.findById(target).orElseThrow(new ServiceException("用户不存在"));
+        WxMaTemplateMessage msg = new WxMaTemplateMessage();
+        wxMaService.getMsgService().sendTemplateMsg(msg);
+    }
 }

+ 5 - 5
src/main/java/com/izouma/walkchina/service/UserInfoService.java

@@ -4,11 +4,11 @@ import cn.binarywang.wx.miniapp.api.WxMaService;
 import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
 import cn.binarywang.wx.miniapp.bean.WxMaUserInfo;
 import com.izouma.walkchina.constant.AppConstants;
-import com.izouma.walkchina.domain.UserFriend;
+import com.izouma.walkchina.domain.FriendInfo;
 import com.izouma.walkchina.domain.UserInfo;
 import com.izouma.walkchina.dto.UserWalkStats;
 import com.izouma.walkchina.exception.ServiceException;
-import com.izouma.walkchina.repo.UserFriendRepository;
+import com.izouma.walkchina.repo.FriendInfoRepository;
 import com.izouma.walkchina.repo.UserInfoRepository;
 import com.izouma.walkchina.repo.WalkDataRepository;
 import com.izouma.walkchina.service.storage.StorageService;
@@ -36,7 +36,7 @@ public class UserInfoService implements UserDetailsService {
     @Autowired
     private StorageService       storageService;
     @Autowired
-    private UserFriendRepository userFriendRepository;
+    private FriendInfoRepository friendInfoRepository;
     @Autowired
     private WalkDataRepository   walkDataRepository;
 
@@ -146,11 +146,11 @@ public class UserInfoService implements UserDetailsService {
 
     public void saveFriend(Long userId1, Long userId2) {
         try {
-            userFriendRepository.save(UserFriend.builder().userId(userId1).friendId(userId2).build());
+            friendInfoRepository.save(FriendInfo.builder().userId(userId1).friendId(userId2).build());
         } catch (Exception ignored) {
         }
         try {
-            userFriendRepository.save(UserFriend.builder().userId(userId2).friendId(userId1).build());
+            friendInfoRepository.save(FriendInfo.builder().userId(userId2).friendId(userId1).build());
         } catch (Exception ignored) {
         }
     }

+ 13 - 0
src/main/java/com/izouma/walkchina/utils/ImageUtils.java

@@ -127,4 +127,17 @@ public class ImageUtils {
         byteArrayOutputStream.close();
         return inputStream;
     }
+
+    public static void drawCenteredString(Graphics g, String text, Rectangle rect, Font font) {
+        // Get the FontMetrics
+        FontMetrics metrics = g.getFontMetrics(font);
+        // Determine the X coordinate for the text
+        int x = rect.x + (rect.width - metrics.stringWidth(text)) / 2;
+        // Determine the Y coordinate for the text (note we add the ascent, as in java 2d 0 is top of the screen)
+        int y = rect.y + ((rect.height - metrics.getHeight()) / 2) + metrics.getAscent();
+        // Set the font
+        g.setFont(font);
+        // Draw the String
+        g.drawString(text, x, y);
+    }
 }

+ 25 - 0
src/main/java/com/izouma/walkchina/web/CoinController.java

@@ -0,0 +1,25 @@
+package com.izouma.walkchina.web;
+
+import com.izouma.walkchina.dto.Result;
+import com.izouma.walkchina.service.CoinService;
+import com.izouma.walkchina.utils.SecurityUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+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;
+
+@RestController
+@RequestMapping("/coin")
+public class CoinController {
+    @Autowired
+    private CoinService coinService;
+
+    @PostMapping("/reward")
+    public Result reward(@RequestParam("userId") Long userId) {
+        coinService.reward(SecurityUtils.getAuthenticatedUser().getId(), userId, BigDecimal.valueOf(10));
+        return Result.ok();
+    }
+}

+ 36 - 1
src/main/java/com/izouma/walkchina/web/TeamController.java

@@ -2,11 +2,19 @@ package com.izouma.walkchina.web;
 
 import com.izouma.walkchina.domain.UserInfo;
 import com.izouma.walkchina.dto.Result;
+import com.izouma.walkchina.dto.UserDTO;
 import com.izouma.walkchina.service.TeamService;
 import com.izouma.walkchina.utils.SecurityUtils;
+import me.chanjar.weixin.common.error.WxErrorException;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
+import javax.imageio.ImageIO;
+import javax.servlet.http.HttpServletResponse;
+import java.awt.*;
+import java.awt.image.BufferedImage;
+import java.io.IOException;
+
 @RestController
 @RequestMapping("/team")
 public class TeamController {
@@ -31,7 +39,34 @@ public class TeamController {
     }
 
     @GetMapping("/userTeam")
-    public Result userTeam(@RequestParam("userId") Long userId) {
+    public Result userTeam(Long userId) {
+        if (userId == null) {
+            userId = SecurityUtils.getAuthenticatedUser().getId();
+        }
         return Result.ok(teamService.userTeam(userId));
     }
+
+    @GetMapping("/userFriend")
+    public Result userFriend(Long userId) {
+        if (userId == null) {
+            userId = SecurityUtils.getAuthenticatedUser().getId();
+        }
+        return Result.ok(teamService.userFriend(userId));
+    }
+
+    @GetMapping("/myLeader")
+    public Result myLeader() {
+        UserDTO myLeader = teamService.userLeader(SecurityUtils.getAuthenticatedUser().getId());
+        if (myLeader != null) {
+            return Result.ok(myLeader);
+        }
+        return Result.error();
+    }
+
+    @GetMapping("/recruitImg")
+    public void recruitImg(HttpServletResponse response) throws FontFormatException, WxErrorException, IOException {
+        BufferedImage image = teamService.recruitImg(SecurityUtils.getAuthenticatedUser().getId());
+        response.setContentType("image/png");
+        ImageIO.write(image, "png", response.getOutputStream());
+    }
 }

+ 1 - 0
src/main/resources/logback-spring.xml

@@ -36,6 +36,7 @@
         <logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="TRACE"/>
         <logger name="org.springframework.jdbc.core.JdbcTemplate" level="DEBUG"/>
         <logger name="org.springframework.jdbc.core.StatementCreatorUtils" level="TRACE"/>
+        <logger name="cn.binarywang.wx.miniapp" level="DEBUG"/>
     </springProfile>
 
 </configuration>

BIN
src/main/resources/static/PingFangMedium.ttf


BIN
src/main/resources/static/PingFangRegular.ttf


BIN
src/main/resources/static/Roboto-Black.ttf


BIN
src/main/resources/static/level_1.png


BIN
src/main/resources/static/level_2.png


BIN
src/main/resources/static/level_3.png


BIN
src/main/resources/static/level_4.png


BIN
src/main/resources/static/level_5.png


BIN
src/main/resources/static/level_6.png


BIN
src/main/resources/static/share_img.png


BIN
src/main/resources/static/wxaqrcode.jpg


BIN
src/main/resources/static/未命名.sketch


+ 6 - 7
src/test/java/com/izouma/walkchina/CommonTest.java

@@ -1,15 +1,20 @@
 package com.izouma.walkchina;
 
 import com.izouma.walkchina.utils.ImageUtils;
-import org.apache.commons.lang3.time.DateUtils;
 import org.joda.time.Days;
 import org.joda.time.LocalDate;
 import org.junit.Test;
+import org.springframework.core.io.ClassPathResource;
+import org.springframework.core.io.Resource;
 
 import javax.imageio.ImageIO;
+import java.awt.*;
+import java.awt.image.BufferedImage;
 import java.io.File;
 import java.io.IOException;
+import java.io.InputStream;
 import java.math.BigDecimal;
+import java.net.URL;
 import java.text.MessageFormat;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
@@ -38,10 +43,4 @@ public class CommonTest {
         System.out.println(message);
         System.out.println(String.format("%.2f", BigDecimal.valueOf(1.11111)));
     }
-
-    @Test
-    public void a() {
-        System.out.println(Days.daysBetween(LocalDate.fromDateFields(new Date()),
-                LocalDate.fromDateFields(DateUtils.addDays(new Date(), -2))).getDays());
-    }
 }

+ 9 - 13
src/test/java/com/izouma/walkchina/RedisTest.java

@@ -1,7 +1,6 @@
 package com.izouma.walkchina;
 
-import com.izouma.walkchina.domain.UserInfo;
-import me.chanjar.weixin.common.bean.WxAccessToken;
+import com.izouma.walkchina.dto.WxAccessToken;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -9,25 +8,22 @@ import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.test.context.junit4.SpringRunner;
 
-import java.util.HashMap;
-import java.util.Map;
+import java.util.Set;
 
 @RunWith(SpringRunner.class)
 @SpringBootTest
 public class RedisTest {
     @Autowired
-    private RedisTemplate redisTemplate;
+    private RedisTemplate<String, Object> redisTemplate;
 
-    @Test
-    public void redisTest() {
-        Map<String, Object> map = new HashMap<>();
-        map.put("accessToken", "123");
-        map.put("expiresAt", System.currentTimeMillis() + 7200 * 1000);
-        redisTemplate.opsForValue().set("miniAppAccessToken", map);
 
-        Map<String, Object> newMap = (Map<String, Object>) redisTemplate.opsForValue().get("miniAppAccessToken1");
-        System.out.println(newMap);
+    @Test
+    public void testRedis() {
+        WxAccessToken token = new WxAccessToken("wx6517cbf58115c508", null, null);
+        redisTemplate.opsForHash().put("wxAccessToken", token.hashCode() + "", token);
 
+        Set keys = redisTemplate.opsForHash().keys("wxAccessToken");
 
+        System.out.println();
     }
 }

+ 29 - 0
src/test/java/com/izouma/walkchina/repo/FriendInfoRepositoryTest.java

@@ -0,0 +1,29 @@
+package com.izouma.walkchina.repo;
+
+import com.izouma.walkchina.domain.FriendInfo;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest
+public class FriendInfoRepositoryTest {
+    @Autowired
+    private FriendInfoRepository friendInfoRepository;
+
+    @Test
+    public void addTestFriend() {
+        for (long userId = 750; userId < 759; userId++) {
+            friendInfoRepository.save(FriendInfo.builder()
+                    .userId(890L)
+                    .friendId(userId)
+                    .build());
+            friendInfoRepository.save(FriendInfo.builder()
+                    .userId(userId)
+                    .friendId(890L)
+                    .build());
+        }
+    }
+}

+ 2 - 2
src/test/java/com/izouma/walkchina/repo/TeamMemberRepositoryTest.java

@@ -1,7 +1,7 @@
 package com.izouma.walkchina.repo;
 
 import com.izouma.walkchina.domain.TeamMember;
-import com.izouma.walkchina.dto.UserTeamMember;
+import com.izouma.walkchina.dto.UserDTO;
 import org.apache.commons.lang3.time.FastDateFormat;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -37,7 +37,7 @@ public class TeamMemberRepositoryTest {
 
     @Test
     public void findUserTeam() {
-        List<UserTeamMember> list = teamMemberRepository.findUserTeam(890L);
+        List<UserDTO> list = teamMemberRepository.findUserTeam(890L);
         System.out.println(list);
     }
 

+ 1 - 3
src/test/java/com/izouma/walkchina/repo/WxAccessTokenRepositoryTest.java

@@ -1,14 +1,12 @@
 package com.izouma.walkchina.repo;
 
-import com.izouma.walkchina.domain.WxAccessToken;
+import com.izouma.walkchina.dto.WxAccessToken;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.test.context.junit4.SpringRunner;
 
-import static org.junit.Assert.*;
-
 @RunWith(SpringRunner.class)
 @SpringBootTest
 public class WxAccessTokenRepositoryTest {

+ 47 - 0
src/test/java/com/izouma/walkchina/service/TeamServiceTest.java

@@ -0,0 +1,47 @@
+package com.izouma.walkchina.service;
+
+import me.chanjar.weixin.common.error.WxErrorException;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import java.awt.*;
+import java.io.IOException;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest
+public class TeamServiceTest {
+    @Autowired
+    private TeamService teamService;
+
+    @Test
+    public void hire() {
+    }
+
+    @Test
+    public void canHire() {
+    }
+
+    @Test
+    public void userTeam() {
+    }
+
+    @Test
+    public void userFriend() {
+    }
+
+    @Test
+    public void userLeader() {
+    }
+
+    @Test
+    public void createShareImg() {
+        try {
+            teamService.recruitImg(890L);
+        } catch (IOException | FontFormatException | WxErrorException e) {
+            e.printStackTrace();
+        }
+    }
+}