添加了swagger接口、重置密码、修改了usercontroller

Change-Id: Ib651fa9b0fe0b220eb8cb88dde2b63d6bf54895e
diff --git a/src/main/resources/static/home.html b/src/main/resources/static/home.html
index 5cac114..507e3ad 100644
--- a/src/main/resources/static/home.html
+++ b/src/main/resources/static/home.html
@@ -9,22 +9,20 @@
 <div id="userInfo"></div>
 <script>
     (async () => {
-        const token = localStorage.getItem('token'); // 从 localStorage 获取 token
-        if (!token) return window.location.href = 'login.html'; // 如果 token 不存在,重定向到登录页面
-
-        const res = await fetch('/api/me', {
-            headers: { 'token': token } // 使用 token 请求用户信息
-        });
-
-        const json = await res.json(); // 解析响应数据
-        if (json.code !== 0) {
-            return window.location.href = 'login.html'; // 如果获取用户信息失败,重定向到登录页面
+        const token = localStorage.getItem('token');
+        if (!token) {
+            return window.location.href = 'login.html';
         }
-
-        // 输出当前用户和 token
-        document.getElementById('userInfo')
-            .innerText = '当前用户:' + json.data.username + ',Token:' + json.data; // 显示用户名和 token
+        const res = await fetch('/api/me', {
+            headers: { 'token': token }
+        });
+        const json = await res.json();
+        if (json.code !== 0) {
+            return window.location.href = 'login.html';
+        }
+        document.getElementById('userInfo').innerText =
+            `当前用户:${json.data.username},Token:${json.data.token}`;
     })();
 </script>
 </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/src/main/resources/static/login.html b/src/main/resources/static/login.html
index 993941d..f7d02c7 100644
--- a/src/main/resources/static/login.html
+++ b/src/main/resources/static/login.html
@@ -8,31 +8,38 @@
 <body>
 <h2>用户登录</h2>
 <form id="loginForm">
-    <label>身份证号:</label>
-    <input type="number" name="identificationNumber" required>
-    <label>密码:</label>
-    <input type="password" name="password" required>
+    <div>
+        <label>邮箱:</label>
+        <input type="email" name="email" required>
+    </div>
+    <div>
+        <label>密码:</label>
+        <input type="password" name="password" required>
+    </div>
     <button type="submit">登录</button>
 </form>
++  <p><a href="reset.html">忘记密码?</a></p>
+
 <script>
-    document.getElementById('loginForm')
-        .addEventListener('submit', async e => {
-            e.preventDefault();
-            const form = new URLSearchParams(new FormData(e.target));
-            const res = await fetch('/login', {
-                method: 'POST',
-                body: form
-            });
-            const json = await res.json();
-            if (res.ok && json.code === 0) {
-                // 保存 token
-                localStorage.setItem('token', json.data);
-                // 跳转到受保护的页面
-                window.location.href = 'home.html';
-            } else {
-                alert(json.msg);
-            }
+    document.getElementById('loginForm').addEventListener('submit', async e => {
+        e.preventDefault();
+        const data = {
+            email:    e.target.email.value,
+            password: e.target.password.value
+        };
+        const res = await fetch('/login', {
+            method: 'POST',
+            headers: { 'Content-Type': 'application/json' },
+            body: JSON.stringify(data)
         });
+        const json = await res.json();
+        if (res.ok && json.code === 0) {
+            localStorage.setItem('token', json.data);
+            window.location.href = 'home.html';
+        } else {
+            alert(json.msg || json.error);
+        }
+    });
 </script>
 </body>
 </html>
diff --git a/src/main/resources/static/register.html b/src/main/resources/static/register.html
index 549c790..72fc1b8 100644
--- a/src/main/resources/static/register.html
+++ b/src/main/resources/static/register.html
@@ -1,4 +1,3 @@
-<!-- src/main/resources/static/register.html -->
 <!DOCTYPE html>
 <html lang="zh-CN">
 <head>
@@ -8,44 +7,65 @@
 <body>
 <h2>用户注册</h2>
 <form id="regForm">
-    <label>用户名:</label>
-    <input type="text" name="username" required>
-    <label>邮箱:</label>
-    <input type="email" name="email" required>
-    <button type="button" id="sendCode">发送验证码</button>
-    <label>邮箱验证码:</label>
-    <input type="text" name="verificationCode" required>
-    <label>密码:</label>
-    <input type="password" name="password" required>
-    <label>身份证号(8 位数字):</label>
-    <input type="number" name="identificationNumber" required>
+    <div>
+        <label>用户名:</label>
+        <input type="text" name="username" required>
+    </div>
+    <div>
+        <label>邮箱:</label>
+        <input type="email" name="email" required>
+        <button type="button" id="sendCode">发送验证码</button>
+    </div>
+    <div>
+        <label>邮箱验证码:</label>
+        <input type="text" name="verificationCode" required>
+    </div>
+    <div>
+        <label>密码:</label>
+        <input type="password" name="password" required>
+    </div>
+    <div>
+        <label>身份证号(8 位):</label>
+        <input type="text" name="identificationNumber" required pattern="\d{8}" maxlength="8">
+    </div>
     <button type="submit">注册</button>
 </form>
+
 <script>
-    document.getElementById('sendCode')
-        .addEventListener('click', async () => {
-            const form = new URLSearchParams();
-            form.set('email', document.querySelector('[name=email]').value);
-            const res = await fetch('/sendVerification', {
-                method: 'POST',
-                body: form
-            });
-            alert((await res.json()).msg);
+    // 发送注册验证码
+    document.getElementById('sendCode').addEventListener('click', async () => {
+        const email = document.querySelector('[name=email]').value;
+        if (!email) { alert('请先输入邮箱'); return; }
+        const res = await fetch('/sendVerification', {
+            method: 'POST',
+            headers: { 'Content-Type': 'application/json' },
+            body: JSON.stringify({ email })
         });
-    document.getElementById('regForm')
-        .addEventListener('submit', async e => {
-            e.preventDefault();
-            const form = new URLSearchParams(new FormData(e.target));
-            const res = await fetch('/register', {
-                method: 'POST',
-                body: form
-            });
-            const json = await res.json();
-            alert(json.msg);
-            if (res.ok && json.code===0) {
-                window.location.href='login.html';
-            }
+        const json = await res.json();
+        alert(json.msg || json.error);
+    });
+
+    // 提交注册
+    document.getElementById('regForm').addEventListener('submit', async e => {
+        e.preventDefault();
+        const data = {
+            username:             e.target.username.value,
+            email:                e.target.email.value,
+            verificationCode:     e.target.verificationCode.value,
+            password:             e.target.password.value,
+            identificationNumber: e.target.identificationNumber.value
+        };
+        const res = await fetch('/register', {
+            method: 'POST',
+            headers: { 'Content-Type': 'application/json' },
+            body: JSON.stringify(data)
         });
+        const json = await res.json();
+        alert(json.msg || json.error);
+        if (res.ok && json.code === 0) {
+            window.location.href = 'login.html';
+        }
+    });
 </script>
 </body>
 </html>
diff --git a/src/main/resources/static/reset.html b/src/main/resources/static/reset.html
new file mode 100644
index 0000000..7a87ccf
--- /dev/null
+++ b/src/main/resources/static/reset.html
@@ -0,0 +1,61 @@
+<!DOCTYPE html>
+<html lang="zh-CN">
+<head>
+    <meta charset="UTF-8">
+    <title>重置密码</title>
+</head>
+<body>
+<h2>重置密码</h2>
+<form id="resetForm">
+    <div>
+        <label>邮箱:</label>
+        <input type="email" name="email" required>
+        <button type="button" id="sendResetCode">获取重置验证码</button>
+    </div>
+    <div>
+        <label>验证码:</label>
+        <input type="text" name="code" required>
+    </div>
+    <div>
+        <label>新密码:</label>
+        <input type="password" name="newPassword" required>
+    </div>
+    <button type="submit">重置密码</button>
+</form>
+
+<script>
+    // 发送重置验证码
+    document.getElementById('sendResetCode').addEventListener('click', async () => {
+        const email = document.querySelector('[name=email]').value;
+        if (!email) { alert('请先输入邮箱'); return; }
+        const res = await fetch('/sendResetCode', {
+            method: 'POST',
+            headers: { 'Content-Type': 'application/json' },
+            body: JSON.stringify({ email })
+        });
+        const json = await res.json();
+        alert(json.msg || json.error);
+    });
+
+    // 提交重置请求
+    document.getElementById('resetForm').addEventListener('submit', async e => {
+        e.preventDefault();
+        const data = {
+            email:       e.target.email.value,
+            code:        e.target.code.value,
+            newPassword: e.target.newPassword.value
+        };
+        const res = await fetch('/resetPassword', {
+            method: 'POST',
+            headers: { 'Content-Type': 'application/json' },
+            body: JSON.stringify(data)
+        });
+        const json = await res.json();
+        alert(json.msg || json.error);
+        if (res.ok && json.code === 0) {
+            window.location.href = 'login.html';
+        }
+    });
+</script>
+</body>
+</html>