Pārlūkot izejas kodu

:satisfied: first commit

nnkwrik 6 gadi atpakaļ
revīzija
0714028933
31 mainītis faili ar 816 papildinājumiem un 0 dzēšanām
  1. 15 0
      .gitignore
  2. 8 0
      dev/mysql/conf/my.cnf
  3. 4 0
      dev/mysql/docker.cnf
  4. 5 0
      dev/mysql/shart.sh
  5. BIN
      dev/ngrok/ngrok
  6. 74 0
      eureka/pom.xml
  7. 14 0
      eureka/src/main/java/io/github/nnkwrik/eureka/EurekaApplication.java
  8. 12 0
      eureka/src/main/resources/application.yml
  9. 16 0
      eureka/src/test/java/io/github/nnkwrik/eureka/EurekaApplicationTests.java
  10. 44 0
      mini-app/app.js
  11. 12 0
      mini-app/app.json
  12. 10 0
      mini-app/app.wxss
  13. 88 0
      mini-app/pages/index/index.js
  14. 1 0
      mini-app/pages/index/index.json
  15. 14 0
      mini-app/pages/index/index.wxml
  16. 21 0
      mini-app/pages/index/index.wxss
  17. 15 0
      mini-app/pages/logs/logs.js
  18. 3 0
      mini-app/pages/logs/logs.json
  19. 6 0
      mini-app/pages/logs/logs.wxml
  20. 8 0
      mini-app/pages/logs/logs.wxss
  21. 39 0
      mini-app/project.config.json
  22. 19 0
      mini-app/utils/util.js
  23. 92 0
      user-service/pom.xml
  24. 14 0
      user-service/src/main/java/io/github/nnkwrik/userservice/UserServiceApplication.java
  25. 122 0
      user-service/src/main/java/io/github/nnkwrik/userservice/config/WxMaConfiguration.java
  26. 39 0
      user-service/src/main/java/io/github/nnkwrik/userservice/config/WxMaProperties.java
  27. 47 0
      user-service/src/main/java/io/github/nnkwrik/userservice/controller/UserController.java
  28. 25 0
      user-service/src/main/java/io/github/nnkwrik/userservice/entity/User.java
  29. 11 0
      user-service/src/main/java/io/github/nnkwrik/userservice/service/UserService.java
  30. 22 0
      user-service/src/main/resources/application.yml
  31. 16 0
      user-service/src/test/java/io/github/nnkwrik/userservice/UserServiceApplicationTests.java

+ 15 - 0
.gitignore

@@ -0,0 +1,15 @@
+**/target/
+!.mvn/wrapper/maven-wrapper.jar
+
+
+
+### IntelliJ IDEA ###
+**/.idea
+**/*.iws
+**/*.iml
+**/*.ipr
+
+
+# other
+dev/mysql/data/*
+user-service/src/main/resources/application-secret.yml

+ 8 - 0
dev/mysql/conf/my.cnf

@@ -0,0 +1,8 @@
+[mysqld]
+character-set-server=utf8mb4
+
+[client]
+default-character-set=utf8mb4
+
+[mysql]
+default-character-set=utf8mb4

+ 4 - 0
dev/mysql/docker.cnf

@@ -0,0 +1,4 @@
+[mysqld]
+skip-host-cache
+skip-name-resolve
+

+ 5 - 0
dev/mysql/shart.sh

@@ -0,0 +1,5 @@
+#!/bin/bash
+cur_dir=`pwd`
+docker stop fangxianyu-mysql
+docker rm fangxianyu-mysql
+docker run -d --name fangxianyu-mysql -v ${cur_dir}/conf:/etc/mysql/conf.d -v ${cur_dir}/data:/var/lib/mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=1234  mysql:5.7

BIN
dev/ngrok/ngrok


+ 74 - 0
eureka/pom.xml

@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+
+	<groupId>io.github.nnkwrik</groupId>
+	<artifactId>eureka</artifactId>
+	<version>0.0.1-SNAPSHOT</version>
+	<packaging>jar</packaging>
+
+	<name>eureka</name>
+	<description>Demo project for Spring Boot</description>
+
+	<parent>
+		<groupId>org.springframework.boot</groupId>
+		<artifactId>spring-boot-starter-parent</artifactId>
+		<version>2.1.0.RELEASE</version>
+		<relativePath/> <!-- lookup parent from repository -->
+	</parent>
+
+	<properties>
+		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+		<java.version>1.8</java.version>
+		<spring-cloud.version>Greenwich.M1</spring-cloud.version>
+	</properties>
+
+	<dependencies>
+		<dependency>
+			<groupId>org.springframework.cloud</groupId>
+			<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
+		</dependency>
+
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter-test</artifactId>
+			<scope>test</scope>
+		</dependency>
+	</dependencies>
+
+	<dependencyManagement>
+		<dependencies>
+			<dependency>
+				<groupId>org.springframework.cloud</groupId>
+				<artifactId>spring-cloud-dependencies</artifactId>
+				<version>${spring-cloud.version}</version>
+				<type>pom</type>
+				<scope>import</scope>
+			</dependency>
+		</dependencies>
+	</dependencyManagement>
+
+	<build>
+		<plugins>
+			<plugin>
+				<groupId>org.springframework.boot</groupId>
+				<artifactId>spring-boot-maven-plugin</artifactId>
+			</plugin>
+		</plugins>
+	</build>
+
+	<repositories>
+		<repository>
+			<id>spring-milestones</id>
+			<name>Spring Milestones</name>
+			<url>https://repo.spring.io/milestone</url>
+			<snapshots>
+				<enabled>false</enabled>
+			</snapshots>
+		</repository>
+	</repositories>
+
+
+</project>

+ 14 - 0
eureka/src/main/java/io/github/nnkwrik/eureka/EurekaApplication.java

@@ -0,0 +1,14 @@
+package io.github.nnkwrik.eureka;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
+
+@SpringBootApplication
+@EnableEurekaServer
+public class EurekaApplication {
+
+	public static void main(String[] args) {
+		SpringApplication.run(EurekaApplication.class, args);
+	}
+}

+ 12 - 0
eureka/src/main/resources/application.yml

@@ -0,0 +1,12 @@
+eureka:
+  client:
+    service-url:
+      defaultZone: http://localhost:8801/eureka/
+    register-with-eureka: false
+  server:
+    enable-self-preservation: false
+spring:
+  application:
+    name: eureka
+server:
+  port: 8801

+ 16 - 0
eureka/src/test/java/io/github/nnkwrik/eureka/EurekaApplicationTests.java

@@ -0,0 +1,16 @@
+package io.github.nnkwrik.eureka;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest
+public class EurekaApplicationTests {
+
+	@Test
+	public void contextLoads() {
+	}
+
+}

+ 44 - 0
mini-app/app.js

@@ -0,0 +1,44 @@
+//app.js
+App({
+  onLaunch: function () {
+    // 展示本地存储能力
+    var logs = wx.getStorageSync('logs') || []
+    logs.unshift(Date.now())
+    wx.setStorageSync('logs', logs)
+
+    // 登录
+    wx.login({
+      success: res => {
+        // 发送 res.code 到后台换取 openId, sessionKey, unionId
+      }
+    })
+    // 获取用户信息
+    wx.getSetting({
+      success: res => {
+        if (res.authSetting['scope.userInfo']) {
+          // 已经授权,可以直接调用 getUserInfo 获取头像昵称,不会弹框
+          wx.getUserInfo({
+            success: res => {
+              // 可以将 res 发送给后台解码出 unionId
+              this.globalData.userInfo = res.userInfo
+
+              // 由于 getUserInfo 是网络请求,可能会在 Page.onLoad 之后才返回
+              // 所以此处加入 callback 以防止这种情况
+              if (this.userInfoReadyCallback) {
+                this.userInfoReadyCallback(res)
+              }
+            }
+          })
+        }
+      }
+    })
+  },
+  globalData: {
+    userInfo: null,
+    rawData: '',
+    signature: '',
+    encryptedData: '',
+    iv: '',
+    host: "http://e87c8984.ngrok.io"
+  }
+})

+ 12 - 0
mini-app/app.json

@@ -0,0 +1,12 @@
+{
+  "pages":[
+    "pages/index/index",
+    "pages/logs/logs"
+  ],
+  "window":{
+    "backgroundTextStyle":"light",
+    "navigationBarBackgroundColor": "#fff",
+    "navigationBarTitleText": "WeChat",
+    "navigationBarTextStyle":"black"
+  }
+}

+ 10 - 0
mini-app/app.wxss

@@ -0,0 +1,10 @@
+/**app.wxss**/
+.container {
+  height: 100%;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  justify-content: space-between;
+  padding: 200rpx 0;
+  box-sizing: border-box;
+} 

+ 88 - 0
mini-app/pages/index/index.js

@@ -0,0 +1,88 @@
+//index.js
+//获取应用实例
+const app = getApp()
+Page({
+  data: {
+    motto: 'Hello World',
+    userInfo: {},
+    hasUserInfo: false,
+    canIUse: wx.canIUse('button.open-type.getUserInfo')
+  },
+  //事件处理函数
+  bindViewTap: function() {
+    wx.navigateTo({
+      url: '../logs/logs'
+    })
+  },
+  // onLoad: function () {
+  //   if (app.globalData.userInfo) {
+  //     this.setData({
+  //       userInfo: app.globalData.userInfo,
+  //       hasUserInfo: true
+  //     })
+  //   } else if (this.data.canIUse){
+  //     // 由于 getUserInfo 是网络请求,可能会在 Page.onLoad 之后才返回
+  //     // 所以此处加入 callback 以防止这种情况
+  //     app.userInfoReadyCallback = res => {
+  //       this.setData({
+  //         userInfo: res.userInfo,
+  //         hasUserInfo: true
+  //       })
+  //     }
+  //   } else {
+  //     // 在没有 open-type=getUserInfo 版本的兼容处理
+  //     wx.getUserInfo({
+  //       success: res => {
+  //         app.globalData.userInfo = res.userInfo
+  //         this.setData({
+  //           userInfo: res.userInfo,
+  //           hasUserInfo: true
+  //         })
+  //       }
+  //     })
+  //   }
+  // },
+  bindGetUserInfo: function(e) {
+    console.log(e)
+    app.globalData.userInfo = e.detail.userInfo
+    this.setData({
+      userInfo: e.detail.userInfo,
+      hasUserInfo: true
+    })
+  },
+  login: function() {
+    // 获取userInfo
+    wx.getUserInfo({
+        success: res => {
+          app.globalData.userInfo = res.userInfo,
+            app.globalData.rawData = res.rawData,
+            app.globalData.signature = res.signature,
+            app.globalData.encryptedData = res.encryptedData,
+            app.globalData.iv = res.iv
+        }
+      }),
+      wx.login({
+        success(res) {
+          if (res.code) {
+
+            //发起网络请求
+            wx.request({
+              url: app.globalData.host + "/wx/user/login/" + res.code,
+              data: app.globalData.userInfo,
+              header: {
+                'content-type': 'application/json' // 默认值
+              },
+              dataType: "json",
+              method: "POST",
+              success(res) {
+                console.log(res.data)
+              }
+            })
+          } else {
+            console.log('登录失败!' + res.errMsg)
+          }
+        }
+      })
+  }
+
+})

+ 1 - 0
mini-app/pages/index/index.json

@@ -0,0 +1 @@
+{}

+ 14 - 0
mini-app/pages/index/index.wxml

@@ -0,0 +1,14 @@
+<!--index.wxml-->
+<view class="container">
+  <view class="userinfo">
+    <!-- <button wx:if="{{!hasUserInfo && canIUse}}" open-type="getUserInfo" bindgetuserinfo="bindGetUserInfo"> 点击登录 </button> -->
+    <button wx:if="{{!hasUserInfo && canIUse}}" bindtap='login'> 点击登录 </button>
+    <block wx:else>
+      <image bindtap="bindViewTap" class="userinfo-avatar" src="{{userInfo.avatarUrl}}" mode="cover"></image>
+      <text class="userinfo-nickname">{{userInfo.nickName}}</text>
+    </block>
+  </view>
+  <view class="usermotto">
+    <text class="user-motto">{{motto}}</text>
+  </view>
+</view>

+ 21 - 0
mini-app/pages/index/index.wxss

@@ -0,0 +1,21 @@
+/**index.wxss**/
+.userinfo {
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+}
+
+.userinfo-avatar {
+  width: 128rpx;
+  height: 128rpx;
+  margin: 20rpx;
+  border-radius: 50%;
+}
+
+.userinfo-nickname {
+  color: #aaa;
+}
+
+.usermotto {
+  margin-top: 200px;
+}

+ 15 - 0
mini-app/pages/logs/logs.js

@@ -0,0 +1,15 @@
+//logs.js
+const util = require('../../utils/util.js')
+
+Page({
+  data: {
+    logs: []
+  },
+  onLoad: function () {
+    this.setData({
+      logs: (wx.getStorageSync('logs') || []).map(log => {
+        return util.formatTime(new Date(log))
+      })
+    })
+  }
+})

+ 3 - 0
mini-app/pages/logs/logs.json

@@ -0,0 +1,3 @@
+{
+  "navigationBarTitleText": "查看启动日志"
+}

+ 6 - 0
mini-app/pages/logs/logs.wxml

@@ -0,0 +1,6 @@
+<!--logs.wxml-->
+<view class="container log-list">
+  <block wx:for="{{logs}}" wx:for-item="log">
+    <text class="log-item">{{index + 1}}. {{log}}</text>
+  </block>
+</view>

+ 8 - 0
mini-app/pages/logs/logs.wxss

@@ -0,0 +1,8 @@
+.log-list {
+  display: flex;
+  flex-direction: column;
+  padding: 40rpx;
+}
+.log-item {
+  margin: 10rpx;
+}

+ 39 - 0
mini-app/project.config.json

@@ -0,0 +1,39 @@
+{
+	"description": "项目配置文件",
+	"packOptions": {
+		"ignore": []
+	},
+	"setting": {
+		"urlCheck": false,
+		"es6": true,
+		"postcss": true,
+		"minified": true,
+		"newFeature": true
+	},
+	"compileType": "miniprogram",
+	"libVersion": "2.4.0",
+	"appid": "wxf15f5ea1eda226e9",
+	"projectname": "%2Fhome%2Fnnkwrik%2Fcode%2Fmy_java_project%2Ffangxianyu%2Fmini-app",
+	"debugOptions": {
+		"hidedInDevtools": []
+	},
+	"isGameTourist": false,
+	"condition": {
+		"search": {
+			"current": -1,
+			"list": []
+		},
+		"conversation": {
+			"current": -1,
+			"list": []
+		},
+		"game": {
+			"currentL": -1,
+			"list": []
+		},
+		"miniprogram": {
+			"current": -1,
+			"list": []
+		}
+	}
+}

+ 19 - 0
mini-app/utils/util.js

@@ -0,0 +1,19 @@
+const formatTime = date => {
+  const year = date.getFullYear()
+  const month = date.getMonth() + 1
+  const day = date.getDate()
+  const hour = date.getHours()
+  const minute = date.getMinutes()
+  const second = date.getSeconds()
+
+  return [year, month, day].map(formatNumber).join('/') + ' ' + [hour, minute, second].map(formatNumber).join(':')
+}
+
+const formatNumber = n => {
+  n = n.toString()
+  return n[1] ? n : '0' + n
+}
+
+module.exports = {
+  formatTime: formatTime
+}

+ 92 - 0
user-service/pom.xml

@@ -0,0 +1,92 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>io.github.nnkwrik</groupId>
+    <artifactId>user-service</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+    <packaging>jar</packaging>
+
+    <name>user-service</name>
+    <description>Demo project for Spring Boot</description>
+
+    <parent>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-starter-parent</artifactId>
+        <version>2.1.0.RELEASE</version>
+        <relativePath/> <!-- lookup parent from repository -->
+    </parent>
+
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+        <java.version>1.8</java.version>
+        <spring-cloud.version>Greenwich.M1</spring-cloud.version>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.github.binarywang</groupId>
+            <artifactId>weixin-java-miniapp</artifactId>
+            <version>3.2.0</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <scope>provided</scope>
+        </dependency>
+
+    </dependencies>
+
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>org.springframework.cloud</groupId>
+                <artifactId>spring-cloud-dependencies</artifactId>
+                <version>${spring-cloud.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+            </plugin>
+        </plugins>
+    </build>
+
+    <repositories>
+        <repository>
+            <id>spring-milestones</id>
+            <name>Spring Milestones</name>
+            <url>https://repo.spring.io/milestone</url>
+            <snapshots>
+                <enabled>false</enabled>
+            </snapshots>
+        </repository>
+    </repositories>
+
+
+</project>

+ 14 - 0
user-service/src/main/java/io/github/nnkwrik/userservice/UserServiceApplication.java

@@ -0,0 +1,14 @@
+package io.github.nnkwrik.userservice;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
+
+@SpringBootApplication
+@EnableDiscoveryClient
+public class UserServiceApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(UserServiceApplication.class, args);
+    }
+}

+ 122 - 0
user-service/src/main/java/io/github/nnkwrik/userservice/config/WxMaConfiguration.java

@@ -0,0 +1,122 @@
+package io.github.nnkwrik.userservice.config;
+
+import java.io.File;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import cn.binarywang.wx.miniapp.api.WxMaService;
+import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl;
+import cn.binarywang.wx.miniapp.bean.WxMaKefuMessage;
+import cn.binarywang.wx.miniapp.bean.WxMaTemplateData;
+import cn.binarywang.wx.miniapp.bean.WxMaTemplateMessage;
+import cn.binarywang.wx.miniapp.config.WxMaInMemoryConfig;
+import cn.binarywang.wx.miniapp.message.WxMaMessageHandler;
+import cn.binarywang.wx.miniapp.message.WxMaMessageRouter;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import me.chanjar.weixin.common.bean.result.WxMediaUploadResult;
+import me.chanjar.weixin.common.error.WxErrorException;
+
+/**
+ * @author <a href="https://github.com/binarywang">Binary Wang</a>
+ */
+@Configuration
+@EnableConfigurationProperties(WxMaProperties.class)
+public class WxMaConfiguration {
+//    private final WxMaMessageHandler templateMsgHandler = (wxMessage, context, service, sessionManager) ->
+//            service.getMsgService().sendTemplateMsg(WxMaTemplateMessage.builder()
+//                    .templateId("此处更换为自己的模板id")
+//                    .formId("自己替换可用的formid")
+//                    .data(Lists.newArrayList(
+//                            new WxMaTemplateData("keyword1", "339208499", "#173177")))
+//                    .toUser(wxMessage.getFromUser())
+//                    .build());
+//
+//    private final WxMaMessageHandler logHandler = (wxMessage, context, service, sessionManager) -> {
+//        System.out.println("收到消息:" + wxMessage.toString());
+//        service.getMsgService().sendKefuMsg(WxMaKefuMessage.newTextBuilder().content("收到信息为:" + wxMessage.toJson())
+//                .toUser(wxMessage.getFromUser()).build());
+//    };
+//
+//    private final WxMaMessageHandler textHandler = (wxMessage, context, service, sessionManager) ->
+//            service.getMsgService().sendKefuMsg(WxMaKefuMessage.newTextBuilder().content("回复文本消息")
+//                    .toUser(wxMessage.getFromUser()).build());
+//
+//    private final WxMaMessageHandler picHandler = (wxMessage, context, service, sessionManager) -> {
+//        try {
+//            WxMediaUploadResult uploadResult = service.getMediaService()
+//                    .uploadMedia("image", "png",
+//                            ClassLoader.getSystemResourceAsStream("tmp.png"));
+//            service.getMsgService().sendKefuMsg(
+//                    WxMaKefuMessage
+//                            .newImageBuilder()
+//                            .mediaId(uploadResult.getMediaId())
+//                            .toUser(wxMessage.getFromUser())
+//                            .build());
+//        } catch (WxErrorException e) {
+//            e.printStackTrace();
+//        }
+//    };
+//
+//    private final WxMaMessageHandler qrcodeHandler = (wxMessage, context, service, sessionManager) -> {
+//        try {
+//            final File file = service.getQrcodeService().createQrcode("123", 430);
+//            WxMediaUploadResult uploadResult = service.getMediaService().uploadMedia("image", file);
+//            service.getMsgService().sendKefuMsg(
+//                    WxMaKefuMessage
+//                            .newImageBuilder()
+//                            .mediaId(uploadResult.getMediaId())
+//                            .toUser(wxMessage.getFromUser())
+//                            .build());
+//        } catch (WxErrorException e) {
+//            e.printStackTrace();
+//        }
+//    };
+//    private static Map<String, WxMaMessageRouter> routers = Maps.newHashMap();
+//    public static Map<String, WxMaMessageRouter> getRouters() {
+//        return routers;
+//    }
+
+
+    private WxMaProperties properties;
+    private static WxMaService maServices;
+
+
+    @Autowired
+    public WxMaConfiguration(WxMaProperties properties) {
+        this.properties = properties;
+    }
+
+
+    public static WxMaService getMaServices() {
+        return maServices;
+    }
+
+    @Bean
+    public Object services() {
+        WxMaInMemoryConfig config = new WxMaInMemoryConfig();
+        BeanUtils.copyProperties(properties,config);
+        maServices = new WxMaServiceImpl();
+        maServices.setWxMaConfig(config);
+
+        return Boolean.TRUE;
+    }
+
+//    private WxMaMessageRouter newRouter(WxMaService service) {
+//        final WxMaMessageRouter router = new WxMaMessageRouter(service);
+//        router
+//                .rule().handler(logHandler).next()
+//                .rule().async(false).content("模板").handler(templateMsgHandler).end()
+//                .rule().async(false).content("文本").handler(textHandler).end()
+//                .rule().async(false).content("图片").handler(picHandler).end()
+//                .rule().async(false).content("二维码").handler(qrcodeHandler).end();
+//        return router;
+//    }
+
+}

+ 39 - 0
user-service/src/main/java/io/github/nnkwrik/userservice/config/WxMaProperties.java

@@ -0,0 +1,39 @@
+package io.github.nnkwrik.userservice.config;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+/**
+ * @author <a href="https://github.com/binarywang">Binary Wang</a>
+ */
+@Data
+@ConfigurationProperties(prefix = "wx.miniapp")
+public class WxMaProperties {
+
+    /**
+     * 设置微信小程序的appid
+     */
+    private String appid;
+
+    /**
+     * 设置微信小程序的Secret
+     */
+    private String secret;
+
+    /**
+     * 设置微信小程序消息服务器配置的token
+     */
+    private String token;
+
+    /**
+     * 设置微信小程序消息服务器配置的EncodingAESKey
+     */
+    private String aesKey;
+
+    /**
+     * 消息格式,XML或者JSON
+     */
+    private String msgDataFormat;
+
+
+}

+ 47 - 0
user-service/src/main/java/io/github/nnkwrik/userservice/controller/UserController.java

@@ -0,0 +1,47 @@
+package io.github.nnkwrik.userservice.controller;
+
+import cn.binarywang.wx.miniapp.api.WxMaService;
+import cn.binarywang.wx.miniapp.api.WxMaUserService;
+import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl;
+import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
+import cn.binarywang.wx.miniapp.bean.WxMaUserInfo;
+import io.github.nnkwrik.userservice.config.WxMaConfiguration;
+import io.github.nnkwrik.userservice.entity.User;
+import io.github.nnkwrik.userservice.service.UserService;
+import me.chanjar.weixin.common.error.WxErrorException;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * @author nnkwrik
+ * @date 18/11/10 21:51
+ */
+@RestController
+@RequestMapping("/wx/user")
+public class UserController {
+
+//    @Autowired
+//    private UserService userService;
+
+
+    @PostMapping("/login/{code}")
+    public String login(@PathVariable String code, @RequestBody User user) {
+
+        WxMaUserService wxUserService = WxMaConfiguration.getMaServices().getUserService();
+        try {
+            WxMaJscode2SessionResult sessionInfo = wxUserService.getSessionInfo(code);
+
+            String openid = sessionInfo.getOpenid();
+            user.setOpenId(openid);
+
+            System.out.println(user);
+            return "ok";
+        } catch (WxErrorException e) {
+            e.printStackTrace();
+            return e.toString();
+        }
+    }
+
+}

+ 25 - 0
user-service/src/main/java/io/github/nnkwrik/userservice/entity/User.java

@@ -0,0 +1,25 @@
+package io.github.nnkwrik.userservice.entity;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * @author nnkwrik
+ * @date 18/11/11 15:01
+ */
+@Data
+public class User {
+    private String id;
+    private String openId;
+    @NotNull
+    private String nickName;
+    @NotNull
+    private String avatarUrl;
+    @NotNull
+    private Integer gender;
+    private String language;
+    private String city;
+    private String province;
+    private String country;
+}

+ 11 - 0
user-service/src/main/java/io/github/nnkwrik/userservice/service/UserService.java

@@ -0,0 +1,11 @@
+package io.github.nnkwrik.userservice.service;
+
+import cn.binarywang.wx.miniapp.bean.WxMaUserInfo;
+
+/**
+ * @author nnkwrik
+ * @date 18/11/10 22:15
+ */
+public interface UserService {
+    void register(WxMaUserInfo userInfo);
+}

+ 22 - 0
user-service/src/main/resources/application.yml

@@ -0,0 +1,22 @@
+eureka:
+  client:
+    service-url:
+      defaultZone: http://localhost:8801/eureka/
+#  instance:
+#    hostname: clientName
+spring:
+  application:
+    name: User-service
+  profiles:
+    include: secret
+#出于安全原因application-secret.yml被纳入.gitignore中,
+#application-secret.yml包含以下信息。
+#wx:
+#  miniapp:
+#    appid: #微信小程序的appid
+#    secret: #微信小程序的Secret
+#    token: #微信小程序消息服务器配置的token
+#    aesKey: #微信小程序消息服务器配置的EncodingAESKey
+#    msgDataFormat: JSON
+server:
+  port: 8802

+ 16 - 0
user-service/src/test/java/io/github/nnkwrik/userservice/UserServiceApplicationTests.java

@@ -0,0 +1,16 @@
+package io.github.nnkwrik.userservice;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest
+public class UserServiceApplicationTests {
+
+    @Test
+    public void contextLoads() {
+    }
+
+}