xiongzhu 5 năm trước cách đây
mục cha
commit
6d0081cb08

+ 2 - 2
src/main/java/com/izouma/dangjian/config/Constants.java

@@ -11,7 +11,7 @@ public interface Constants {
 
     String DEFAULT_AVATAR = "https://zhumj.oss-cn-hangzhou.aliyuncs.com/image/user.jpg";
 
-    String SMS_SIGN_NAME = "走马信息";
+    String SMS_SIGN_NAME = "去租MR眼镜";
 
-    String SMS_TEMPLATE_CODE_GENERIC = "SMS_175485688";
+    String SMS_TEMPLATE_CODE_GENERIC = "SMS_204140573";
 }

+ 1 - 0
src/main/java/com/izouma/dangjian/security/WebSecurityConfig.java

@@ -84,6 +84,7 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
                 .antMatchers("/sysConfig/get/*").permitAll()
                 .antMatchers("/visitStat/**").permitAll()
                 .antMatchers("/user/registerPhone").permitAll()
+                .antMatchers("/user/resetPassword").permitAll()
                 // all other requests need to be authenticated
                 .anyRequest().authenticated().and()
                 // make sure we use stateless session; session won't be used to

+ 14 - 0
src/main/java/com/izouma/dangjian/service/UserService.java

@@ -219,4 +219,18 @@ public class UserService {
                         criteriaBuilder.lessThanOrEqualTo(root.get("createdAt"), end)
                 ));
     }
+
+    public User resetPassword(String phone, String code, String password) {
+        try {
+            smsService.verify(phone, code);
+        } catch (Exception e) {
+            throw new BusinessException("验证码错误");
+        }
+        User user = userRepo.findByPhoneAndDelFalse(phone);
+        if (user == null) {
+            throw new BusinessException("手机未注册");
+        }
+        user.setPassword(new BCryptPasswordEncoder().encode(password));
+        return userRepo.save(user);
+    }
 }

+ 13 - 12
src/main/java/com/izouma/dangjian/service/sms/AliSmsService.java

@@ -25,10 +25,9 @@ import java.time.ZoneOffset;
 @Service
 @Slf4j
 public class AliSmsService implements SmsService {
-    @Value("${aliyun.access-key-id}")
-    private String        accessKeyId;
-    @Value("${aliyun.access-key-secret}")
-    private String        accessKeySecret;
+    private final String accessKeyId     = "LTAI4G8CAiSoufL1sc6G2Mcd";
+    private final String accessKeySecret = "k1ylbJ9FNMgJ5RJCIwAdaDPJyXPCNf";
+
     @Autowired
     private SmsRecordRepo smsRecordRepo;
 
@@ -36,7 +35,8 @@ public class AliSmsService implements SmsService {
     public String sendVerify(String phone) {
         smsRecordRepo.findLastByPhoneAndExpiresAtAfterAndExpiredFalse(phone, LocalDateTime.now()).ifPresent(record -> {
             if (record.getCreatedAt().plusMinutes(1L).isAfter(LocalDateTime.now())) {
-                long sec = record.getCreatedAt().plusMinutes(1L).toInstant(ZoneOffset.UTC).getEpochSecond() - LocalDateTime.now().toInstant(ZoneOffset.UTC).getEpochSecond() + 1;
+                long sec = record.getCreatedAt().plusMinutes(1L).toInstant(ZoneOffset.UTC)
+                        .getEpochSecond() - LocalDateTime.now().toInstant(ZoneOffset.UTC).getEpochSecond() + 1;
                 throw new BusinessException("请" + sec + "秒后再试");
             }
         });
@@ -67,12 +67,12 @@ public class AliSmsService implements SmsService {
             smsRecordRepo.expire(phone);
             String sessionId = RandomStringUtils.randomAlphabetic(10);
             smsRecordRepo.save(SmsRecord.builder()
-                                        .sessionId(sessionId)
-                                        .phone(phone)
-                                        .code(code)
-                                        .expiresAt(LocalDateTime.now().plusMinutes(5))
-                                        .expired(false)
-                                        .build());
+                    .sessionId(sessionId)
+                    .phone(phone)
+                    .code(code)
+                    .expiresAt(LocalDateTime.now().plusMinutes(5))
+                    .expired(false)
+                    .build());
             return sessionId;
         } catch (ClientException | JSONException e) {
             e.printStackTrace();
@@ -82,7 +82,8 @@ public class AliSmsService implements SmsService {
 
     @Override
     public void verify(String phone, String code) throws SmsVerifyException {
-        SmsRecord smsRecord = smsRecordRepo.findLastByPhoneAndExpiresAtAfterAndExpiredFalse(phone, LocalDateTime.now()).orElseThrow(new SmsVerifyException("验证码错误"));
+        SmsRecord smsRecord = smsRecordRepo.findLastByPhoneAndExpiresAtAfterAndExpiredFalse(phone, LocalDateTime.now())
+                .orElseThrow(new SmsVerifyException("验证码错误"));
         if (!smsRecord.getCode().equalsIgnoreCase(code)) {
             throw new BusinessException("验证码错误");
         }

+ 5 - 0
src/main/java/com/izouma/dangjian/web/UserController.java

@@ -148,4 +148,9 @@ public class UserController extends BaseController {
     public long countUser(@RequestParam LocalDate start, @RequestParam LocalDate end) {
         return userService.countUser(start.atStartOfDay(), end.atTime(23, 59, 59));
     }
+
+    @PostMapping("/resetPassword")
+    public User resetPassword(@RequestParam String phone, @RequestParam String code, @RequestParam String password) {
+        return userService.resetPassword(phone, code, password);
+    }
 }

+ 5 - 0
src/main/mobile/src/router/index.js

@@ -32,6 +32,11 @@ const routes = [
         name: 'register',
         component: () => import(/* webpackChunkName: "register" */ '../views/register.vue')
     },
+    {
+        path: '/user/forgot',
+        name: 'forgot',
+        component: () => import(/* webpackChunkName: "forgot" */ '../views/forgot.vue')
+    },
     {
         path: '/index/article',
         name: 'article',

+ 1 - 1
src/main/mobile/src/views/login.vue

@@ -10,7 +10,7 @@
             </van-cell-group>
             <div class="opt">
                 <router-link :to="{ name: 'register' }" class="register">还没有账户?点击快速注册</router-link>
-                <div class="forget">忘记密码?</div>
+                <router-link :to="{ name: 'forgot' }" class="forget">忘记密码?</router-link>
             </div>
             <div class="btns">
                 <van-button :color="$theme.prim" type="primary" block @click="login">登录</van-button>

+ 20 - 1
src/main/vue/src/views/UserEdit.vue

@@ -17,7 +17,7 @@
                     :model="formData"
                     :rules="rules"
                     ref="form"
-                    label-width="80px"
+                    label-width="120px"
                     label-position="right"
                     style="max-width: 500px;"
                 >
@@ -57,6 +57,25 @@
                             </el-option>
                         </el-select>
                     </el-form-item>
+                    <el-form-item prop="realName" label="姓名">
+                        <el-input v-model="formData.realName"></el-input>
+                    </el-form-item>
+                    <el-form-item prop="sex" label="性别">
+                        <el-radio v-model="formData.sex" :label="'男'">男</el-radio>
+                        <el-radio v-model="formData.sex" :label="'女'">女</el-radio>
+                    </el-form-item>
+                    <el-form-item prop="email" label="邮箱">
+                        <el-input v-model="formData.email"></el-input>
+                    </el-form-item>
+                    <el-form-item prop="receiver" label="收件人姓名">
+                        <el-input v-model="formData.receiver"></el-input>
+                    </el-form-item>
+                    <el-form-item prop="receiverPhone" label="收件人电话">
+                        <el-input v-model="formData.receiverPhone"></el-input>
+                    </el-form-item>
+                    <el-form-item prop="address" label="收件地址">
+                        <el-input v-model="formData.address"></el-input>
+                    </el-form-item>
                     <el-form-item>
                         <el-button @click="onSave" :loading="saving" type="primary">保存</el-button>
                         <el-button @click="del" :disabled="saving" type="danger" v-if="formData.id && formData.id !== 1"

+ 5 - 3
src/main/vue/src/views/UserList.vue

@@ -25,9 +25,11 @@
         >
             <el-table-column v-if="multipleMode" align="center" type="selection" width="50"> </el-table-column>
             <el-table-column prop="id" label="ID" width="100"> </el-table-column>
-            <el-table-column prop="username" label="用户名" min-width="300"> </el-table-column>
-            <el-table-column prop="nickname" label="昵称" min-width="300"> </el-table-column>
-            <el-table-column label="头像" min-width="300">
+            <el-table-column prop="username" label="用户名" min-width="200"> </el-table-column>
+            <el-table-column prop="nickname" label="昵称" min-width="200"> </el-table-column>
+            <el-table-column prop="phone" label="手机" min-width="200"> </el-table-column>
+            <el-table-column prop="invitor" label="推广链接所属用户ID" width="200"> </el-table-column>
+            <el-table-column label="头像" width="200">
                 <template slot-scope="{ row }">
                     <el-image
                         style="width: 30px; height: 30px;"