夏文涛 2 лет назад
Родитель
Сommit
1e9836492a

+ 50 - 30
.idea/workspace.xml

@@ -1,12 +1,17 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <project version="4">
+  <component name="AutoImportSettings">
+    <option name="autoReloadType" value="SELECTIVE" />
+  </component>
   <component name="ChangeListManager">
     <list default="true" id="36922be1-416a-4a25-9739-9814e01883a6" name="Default Changelist" comment="">
+<<<<<<< HEAD
       <change beforePath="$PROJECT_DIR$/src/main/java/com/template/api/SmartAttendanceControllerAPI.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/template/api/SmartAttendanceControllerAPI.java" afterDir="false" />
+=======
+      <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/src/main/java/com/template/controller/WxGzhController.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/template/controller/WxGzhController.java" afterDir="false" />
+>>>>>>> f1a7fb9e14eab5fe0e1476af8d8b5df12bba7442
     </list>
-    <ignored path="$PROJECT_DIR$/classes/" />
-    <ignored path="$PROJECT_DIR$/target/" />
-    <option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
     <option name="SHOW_DIALOG" value="false" />
     <option name="HIGHLIGHT_CONFLICTS" value="true" />
     <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
@@ -16,6 +21,7 @@
     <option name="testRunner" value="GRADLE" />
     <option name="delegatedBuild" value="true" />
   </component>
+<<<<<<< HEAD
   <component name="FileEditorManager">
     <leaf>
       <file pinned="false" current-in-tab="true">
@@ -38,6 +44,8 @@
       </file>
     </leaf>
   </component>
+=======
+>>>>>>> f1a7fb9e14eab5fe0e1476af8d8b5df12bba7442
   <component name="FindInProjectRecents">
     <findStrings>
       <find>getDate</find>
@@ -62,11 +70,15 @@
       </list>
     </option>
   </component>
+  <component name="MarkdownSettingsMigration">
+    <option name="stateVersion" value="1" />
+  </component>
   <component name="MavenImportPreferences">
     <option name="generalSettings">
       <MavenGeneralSettings>
-        <option name="mavenHome" value="D:/Software/Develop/Maven/apache-maven-3.3.9" />
-        <option name="userSettingsFile" value="D:\Software\Develop\Maven\apache-maven-3.3.9\conf\settings.xml" />
+        <option name="mavenHome" value="D:/soft/maven/apache-maven-3.8.6" />
+        <option name="useMavenConfig" value="true" />
+        <option name="userSettingsFile" value="D:\soft\maven\apache-maven-3.8.6\conf\settings.xml" />
       </MavenGeneralSettings>
     </option>
   </component>
@@ -94,6 +106,7 @@
     <option name="width" value="974" />
     <option name="height" value="1039" />
   </component>
+  <component name="ProjectId" id="2bUCcpLSt0RtgnSW1oHNqhKVmxW" />
   <component name="ProjectView">
     <navigator proportions="" version="1">
       <foldersAlwaysOnTop value="true" />
@@ -203,33 +216,20 @@
       </pane>
     </panes>
   </component>
-  <component name="PropertiesComponent">
-    <property name="RequestMappingsPanelOrder0" value="0" />
-    <property name="RequestMappingsPanelOrder1" value="1" />
-    <property name="RequestMappingsPanelWidth0" value="75" />
-    <property name="RequestMappingsPanelWidth1" value="75" />
-    <property name="WebServerToolWindowFactoryState" value="false" />
-    <property name="aspect.path.notification.shown" value="true" />
-    <property name="last_opened_file_path" value="$PROJECT_DIR$" />
-    <property name="nodejs_interpreter_path.stuck_in_default_project" value="undefined stuck path" />
-    <property name="nodejs_npm_path_reset_for_default_project" value="true" />
-    <property name="settings.editor.selected.configurable" value="MavenSettings" />
+  <component name="ProjectViewState">
+    <option name="showExcludedFiles" value="false" />
+    <option name="showLibraryContents" value="true" />
   </component>
+  <component name="PropertiesComponent"><![CDATA[{
+  "keyToString": {
+    "WebServerToolWindowFactoryState": "false",
+    "settings.editor.selected.configurable": "MavenSettings",
+    "spring.configuration.checksum": "64bf9ba214eb006c40cb35e0f61a7d20"
+  }
+}]]></component>
   <component name="RebelAgentSelection">
     <selection>jr</selection>
   </component>
-  <component name="RunDashboard">
-    <option name="ruleStates">
-      <list>
-        <RuleState>
-          <option name="name" value="ConfigurationTypeDashboardGroupingRule" />
-        </RuleState>
-        <RuleState>
-          <option name="name" value="StatusDashboardGroupingRule" />
-        </RuleState>
-      </list>
-    </option>
-  </component>
   <component name="RunManager">
     <configuration name="MybatisPlusApplication" type="SpringBootApplicationConfigurationType" factoryName="Spring Boot">
       <module name="mybatis_plus" />
@@ -239,6 +239,10 @@
       </method>
     </configuration>
   </component>
+  <component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" />
+  <component name="SshConsoleOptionsProvider">
+    <option name="myEncoding" value="UTF-8" />
+  </component>
   <component name="SvnConfiguration">
     <configuration />
   </component>
@@ -249,7 +253,13 @@
       <option name="number" value="Default" />
       <option name="presentableId" value="Default" />
       <updated>1706250884671</updated>
+<<<<<<< HEAD
       <workItem from="1706250887209" duration="8970000" />
+=======
+      <workItem from="1706250887209" duration="5674000" />
+      <workItem from="1706260354151" duration="17000" />
+      <workItem from="1706260659198" duration="67000" />
+>>>>>>> f1a7fb9e14eab5fe0e1476af8d8b5df12bba7442
     </task>
     <servers />
   </component>
@@ -300,7 +310,18 @@
     </layout>
   </component>
   <component name="TypeScriptGeneratedFilesManager">
-    <option name="version" value="1" />
+    <option name="version" value="3" />
+  </component>
+  <component name="Vcs.Log.Tabs.Properties">
+    <option name="TAB_STATES">
+      <map>
+        <entry key="MAIN">
+          <value>
+            <State />
+          </value>
+        </entry>
+      </map>
+    </option>
   </component>
   <component name="XDebuggerManager">
     <breakpoint-manager>
@@ -308,7 +329,6 @@
         <line-breakpoint enabled="true" type="java-line">
           <url>file://$PROJECT_DIR$/src/main/java/com/template/controller/SmartAttendanceController.java</url>
           <line>70</line>
-          <properties />
           <option name="timeStamp" value="1" />
         </line-breakpoint>
       </breakpoints>

+ 7 - 0
src/main/java/com/template/api/SmartCodeOpenIdControllerAPI.java

@@ -0,0 +1,7 @@
+package com.template.api;
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+@RequestMapping("/api/smart-code-open-id")
+public interface SmartCodeOpenIdControllerAPI {
+}

+ 26 - 0
src/main/java/com/template/api/WxGzhControllerAPI.java

@@ -0,0 +1,26 @@
+package com.template.api;
+
+import com.template.model.result.CommonResult;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+
+@RequestMapping("/api/wxGzh")
+public interface WxGzhControllerAPI {
+
+    @GetMapping(value = "getWxGzhOpenid")
+    @ApiOperation(value = "通过微信公众号的code获取openid", notes = "通过微信公众号的code获取openid", httpMethod = "GET")
+    CommonResult getWxGzhOpenid(@RequestParam String code) throws Exception;
+
+
+    @GetMapping(value = "/vertifyMessage")
+    @ApiOperation(value = "通过手机号绑定公众号openId", notes = "通过手机号绑定公众号openId", httpMethod = "GET")
+    CommonResult vertifyMessage(@RequestParam String phone,@RequestParam String code,@RequestParam String wxGzhCode);
+
+
+    @GetMapping(value = "/unbinding")
+    @ApiOperation(value = "通过手机号解绑", notes = "通过手机号解绑", httpMethod = "GET")
+    CommonResult unbinding(@RequestParam String phone);
+}

+ 21 - 0
src/main/java/com/template/controller/SmartCodeOpenIdController.java

@@ -0,0 +1,21 @@
+package com.template.controller;
+
+
+import com.template.api.SmartCodeOpenIdControllerAPI;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author ceshi
+ * @since 2024-01-26
+ */
+@RestController
+public class SmartCodeOpenIdController implements SmartCodeOpenIdControllerAPI {
+
+}
+

+ 149 - 0
src/main/java/com/template/controller/WxGzhController.java

@@ -0,0 +1,149 @@
+package com.template.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.google.gson.Gson;
+import com.google.gson.reflect.TypeToken;
+import com.template.annotation.PassToken;
+import com.template.api.WxGzhControllerAPI;
+import com.template.common.utils.*;
+import com.template.model.pojo.SmartCodeOpenId;
+import com.template.model.pojo.SmartUser;
+import com.template.model.pojo.SmsCode;
+import com.template.model.result.CommonResult;
+import com.template.model.weixin.HttpParame;
+import com.template.services.SmartCodeOpenIdService;
+import com.template.services.SmartUserService;
+import com.template.services.SmsCodeService;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.HttpClientBuilder;
+import org.apache.http.util.EntityUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+
+@RestController
+public class WxGzhController implements WxGzhControllerAPI {
+
+//    公众号的唯一标识
+    private static String appid="wxa46ef222053a1047";
+//    公众号的appsecret
+    private static String secret="16f74a1265c314fd79fdf90670173467";
+
+    @Autowired
+    SmartUserService smartUserService;
+
+    @Autowired
+    SmartCodeOpenIdService smartCodeOpenIdService;
+
+    @Autowired
+    SmsCodeService smsCodeService;
+
+    @Override
+    @PassToken
+    public CommonResult getWxGzhOpenid(String code) throws Exception {
+
+        String url="https://api.weixin.qq.com/sns/oauth2/access_token?appid="+appid+"&secret="+secret+"&code="+code+"&grant_type=authorization_code";
+        System.out.println("url = " + url);
+
+        String s = HttpsClient.httpsRequestReturnString(url, "GET", "");
+
+        JSONObject jsonObject = JSONObject.parseObject(s);
+
+        if (!jsonObject.containsKey("openid")) {
+            return CommonResult.fail("code有误");
+        }
+        String openid = jsonObject.getString("openid");
+
+//        判断openid是否已经存在
+        LambdaQueryWrapper<SmartUser> wrapper=new LambdaQueryWrapper<>();
+        wrapper.eq(SmartUser::getGzhOpenId,openid);
+        SmartUser smartUser = smartUserService.getOne(wrapper);
+        JSONObject jsonObject1 = new JSONObject();
+
+        if (ObjectUtils.isNotEmpty(smartUser)) {
+            jsonObject1.put("phone",smartUser.getPhone());
+            return CommonResult.ok(jsonObject1);
+        }
+        SmartCodeOpenId smartCodeOpenId = new SmartCodeOpenId();
+        smartCodeOpenId.setCode(code);
+        smartCodeOpenId.setOpenId(openid);
+
+        smartCodeOpenIdService.save(smartCodeOpenId);
+
+        System.out.println("openid = " + openid);
+
+        jsonObject1.put("phone","");
+        return CommonResult.ok(jsonObject1);
+    }
+
+    @Override
+    @PassToken
+    public CommonResult vertifyMessage(String phone, String code,String wxGzhCode) {
+        QueryWrapper<SmsCode> queryWrapper1 = new QueryWrapper<>();
+        queryWrapper1.eq("deleted", 0);
+        queryWrapper1.eq("is_verify", 0);
+        queryWrapper1.eq("phone_number", phone);
+        queryWrapper1.eq("code", code);
+        queryWrapper1.ge("expiration_time", new Date());
+        List<SmsCode> listc = smsCodeService.getSmsCodeByKey(queryWrapper1);
+        if (listc.isEmpty()) {
+            return CommonResult.ok("验证码已失效");
+        }
+
+        for (SmsCode smsCode : listc) {
+            smsCode.setIsVerify("1");
+            smsCodeService.updateSmsCode(smsCode);
+        }
+
+
+        QueryWrapper<SmartUser> queryWrapper2 = new QueryWrapper<>();
+        queryWrapper2.eq("deleted", 0);
+        queryWrapper2.eq("phone", phone);
+        SmartUser user = smartUserService.getOne(queryWrapper2);
+        if (ObjectUtils.isEmpty(user)) {
+            return CommonResult.fail("该用户不存在");
+        }
+
+        LambdaQueryWrapper<SmartCodeOpenId> wrapperCode=new LambdaQueryWrapper<>();
+        wrapperCode.eq(SmartCodeOpenId::getCode,wxGzhCode);
+        SmartCodeOpenId smartCodeOpenId = smartCodeOpenIdService.getOne(wrapperCode);
+
+        if (ObjectUtils.isNotEmpty(smartCodeOpenId)) {
+            user.setGzhOpenId(smartCodeOpenId.getOpenId());
+            smartUserService.updateSmartUser(user);
+        }
+
+        return CommonResult.ok();
+    }
+
+    @Override
+    @PassToken
+    public CommonResult unbinding(String phone) {
+        QueryWrapper<SmartUser> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("deleted", 0);
+        queryWrapper.eq("phone", phone);
+        SmartUser user = smartUserService.getOne(queryWrapper);
+        if (ObjectUtils.isEmpty(user)) {
+            return CommonResult.fail("该用户不存在");
+        }
+        user.setGzhOpenId("");
+
+        smartUserService.updateById(user);
+
+        return CommonResult.ok();
+    }
+
+
+}

+ 18 - 0
src/main/java/com/template/mapper/SmartCodeOpenIdMapper.java

@@ -0,0 +1,18 @@
+package com.template.mapper;
+
+import com.template.model.pojo.SmartCodeOpenId;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author ceshi
+ * @since 2024-01-26
+ */
+@Mapper
+public interface SmartCodeOpenIdMapper extends BaseMapper<SmartCodeOpenId> {
+
+}

+ 64 - 0
src/main/java/com/template/model/pojo/SmartCodeOpenId.java

@@ -0,0 +1,64 @@
+package com.template.model.pojo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotation.Version;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableField;
+import java.io.Serializable;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author ceshi
+ * @since 2024-01-26
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="SmartCodeOpenId对象", description="")
+public class SmartCodeOpenId implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty(value = "微信公众号的code")
+    private String code;
+
+    @ApiModelProperty(value = "微信公众号code所对应的openId")
+    private String openId;
+
+    @ApiModelProperty(value = "创建时间")
+    @TableField(fill = FieldFill.INSERT)
+    private Date createTime;
+
+    @ApiModelProperty(value = "更新时间")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Date updateTime;
+
+    @ApiModelProperty(value = "创建人员")
+    @TableField(fill = FieldFill.INSERT)
+    private String createUser;
+
+    @ApiModelProperty(value = "更新人员")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private String updateUser;
+
+    @ApiModelProperty(value = "逻辑删除 未删除:0;删除:1")
+    @TableField(fill = FieldFill.INSERT)
+    @TableLogic
+    private Integer deleted;
+
+
+}

+ 16 - 0
src/main/java/com/template/services/SmartCodeOpenIdService.java

@@ -0,0 +1,16 @@
+package com.template.services;
+
+import com.template.model.pojo.SmartCodeOpenId;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author ceshi
+ * @since 2024-01-26
+ */
+public interface SmartCodeOpenIdService extends IService<SmartCodeOpenId> {
+
+}

+ 20 - 0
src/main/java/com/template/services/impl/SmartCodeOpenIdServiceImpl.java

@@ -0,0 +1,20 @@
+package com.template.services.impl;
+
+import com.template.model.pojo.SmartCodeOpenId;
+import com.template.mapper.SmartCodeOpenIdMapper;
+import com.template.services.SmartCodeOpenIdService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author ceshi
+ * @since 2024-01-26
+ */
+@Service
+public class SmartCodeOpenIdServiceImpl extends ServiceImpl<SmartCodeOpenIdMapper, SmartCodeOpenId> implements SmartCodeOpenIdService {
+
+}