前端页面提交

Change-Id: I096c8538ded26791a94a46d8f27b0307dbfb8300
diff --git a/front/src/UserProfile.js b/front/src/UserProfile.js
new file mode 100644
index 0000000..0269723
--- /dev/null
+++ b/front/src/UserProfile.js
@@ -0,0 +1,203 @@
+import React, { useState } from "react";

+import AccountCircleIcon from "@mui/icons-material/AccountCircle";

+import { useNavigate } from "react-router-dom";

+import "./App.css";

+

+export default function UserProfile() {

+  const navigate = useNavigate();

+  const [userInfo, setUserInfo] = useState({

+    username: "示例用户",

+    email: "user@example.com",

+    company: "",

+    school: "",

+    birthday: "",

+  });

+  const [tempUserInfo, setTempUserInfo] = useState({ ...userInfo });

+

+  const handleInputChange = (field, value) => {

+    setTempUserInfo({ ...tempUserInfo, [field]: value });

+  };

+

+  const handleSave = () => {

+    setUserInfo({ ...tempUserInfo });

+    alert("信息已保存!");

+  };

+

+  const handleAvatarClick = () => {

+    const avatarUrl = prompt("请输入头像的URL:");

+    if (avatarUrl) {

+      setTempUserInfo({ ...tempUserInfo, avatar: avatarUrl });

+    }

+  };

+

+  return (

+    <div className="container" style={{ minHeight: '100vh', background: 'linear-gradient(135deg, #f0f4ff 0%, #e0e7ff 100%)', display: 'grid', gridTemplateColumns: '1fr 2fr', gridTemplateRows: 'auto 1fr', gap: '20px', padding: '40px' }}>

+      {/* 左侧:用户资料 */}

+      <div style={{ gridColumn: '1 / 2', gridRow: '1 / 3', display: 'flex', flexDirection: 'column', alignItems: 'center', background: '#fff', borderRadius: 18, boxShadow: '0 4px 24px #e0e7ff', padding: '20px' }}>

+        <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center', marginBottom: 16 }}>

+          <div onClick={handleAvatarClick} style={{ cursor: 'pointer', position: 'relative' }}>

+            <AccountCircleIcon style={{ fontSize: 90, color: '#1a237e', marginBottom: 12 }} />

+            {tempUserInfo.avatar && (

+              <img

+                src={tempUserInfo.avatar}

+                alt="用户头像"

+                style={{

+                  position: 'absolute',

+                  top: 0,

+                  left: 0,

+                  width: 90,

+                  height: 90,

+                  borderRadius: '50%',

+                  objectFit: 'cover',

+                }}

+              />

+            )}

+          </div>

+          <h2 style={{ color: '#1a237e', marginBottom: 0, fontSize: 24 }}>用户个人资料</h2>

+        </div>

+        <div className="card" style={{ padding: 28, width: '100%', background: '#fff', borderRadius: 18, boxShadow: '0 4px 24px #e0e7ff', flex: 1 }}>

+          <div style={{ marginBottom: 18, display: 'flex', alignItems: 'center' }}>

+            <b style={{ width: 72, textAlign: 'left', marginRight: 0, fontSize: 16 }}>用户名:</b>

+            <input

+              type="text"

+              value={tempUserInfo.username}

+              onChange={(e) => handleInputChange("username", e.target.value)}

+              style={{ flex: 1, padding: '6px 10px', borderRadius: 7, border: '1px solid #b2b2b2', minWidth: 0, fontSize: 15 }}

+            />

+          </div>

+          <div style={{ marginBottom: 18, display: 'flex', alignItems: 'center' }}>

+            <b style={{ width: 72, textAlign: 'left', marginRight: 0, fontSize: 16 }}>邮箱:</b>

+            <input

+              type="email"

+              value={tempUserInfo.email}

+              onChange={(e) => handleInputChange("email", e.target.value)}

+              style={{ flex: 1, padding: '6px 10px', borderRadius: 7, border: '1px solid #b2b2b2', minWidth: 0, fontSize: 15 }}

+            />

+          </div>

+          <div style={{ marginBottom: 18, display: 'flex', alignItems: 'center' }}>

+            <b style={{ width: 72, textAlign: 'left', marginRight: 0, fontSize: 16 }}>公司:</b>

+            <input

+              type="text"

+              value={tempUserInfo.company}

+              onChange={(e) => handleInputChange("company", e.target.value)}

+              style={{ flex: 1, padding: '6px 10px', borderRadius: 7, border: '1px solid #b2b2b2', minWidth: 0, fontSize: 15 }}

+            />

+          </div>

+          <div style={{ marginBottom: 18, display: 'flex', alignItems: 'center' }}>

+            <b style={{ width: 72, textAlign: 'left', marginRight: 0, fontSize: 16 }}>学校:</b>

+            <input

+              type="text"

+              value={tempUserInfo.school}

+              onChange={(e) => handleInputChange("school", e.target.value)}

+              style={{ flex: 1, padding: '6px 10px', borderRadius: 7, border: '1px solid #b2b2b2', minWidth: 0, fontSize: 15 }}

+            />

+          </div>

+          <div style={{ marginBottom: 18, display: 'flex', alignItems: 'center' }}>

+            <b style={{ width: 72, textAlign: 'left', marginRight: 0, fontSize: 16 }}>生日:</b>

+            <input

+              type="date"

+              value={tempUserInfo.birthday}

+              onChange={(e) => handleInputChange("birthday", e.target.value)}

+              style={{ flex: 1, padding: '6px 10px', borderRadius: 7, border: '1px solid #b2b2b2', minWidth: 0, fontSize: 15 }}

+            />

+          </div>

+          <div style={{ marginBottom: 18, display: 'flex', alignItems: 'center' }}>

+            <b style={{ width: 72, textAlign: 'left', marginRight: 0, fontSize: 16 }}>密码:</b>

+            <input

+              type="password"

+              value={tempUserInfo.password || ""}

+              onChange={(e) => handleInputChange("password", e.target.value)}

+              style={{ flex: 1, padding: '6px 10px', borderRadius: 7, border: '1px solid #b2b2b2', minWidth: 0, fontSize: 15 }}

+            />

+          </div>

+          <div style={{ marginBottom: 18, display: 'flex', alignItems: 'center' }}>

+            <b style={{ width: 72, textAlign: 'left', marginRight: 0, fontSize: 16 }}>性别:</b>

+            <div style={{ position: 'relative', flex: 1 }}>

+              <button

+                onClick={() => setTempUserInfo({ ...tempUserInfo, showGenderOptions: !tempUserInfo.showGenderOptions })}

+                style={{

+                  width: '100%',

+                  padding: '6px 10px',

+                  borderRadius: 7,

+                  border: '1px solid #b2b2b2',

+                  textAlign: 'left',

+                  backgroundColor: '#fff',

+                  fontSize: 15,

+                  cursor: 'pointer',

+                }}

+              >

+                {tempUserInfo.gender || "性别"}

+              </button>

+              {tempUserInfo.showGenderOptions && (

+                <ul

+                  style={{

+                    position: 'absolute',

+                    top: '100%',

+                    left: 0,

+                    right: 0,

+                    backgroundColor: '#fff',

+                    border: '1px solid #b2b2b2',

+                    borderRadius: 7,

+                    listStyle: 'none',

+                    margin: 0,

+                    padding: 0,

+                    zIndex: 10,

+                  }}

+                >

+                  {["男", "女", "跨性别男", "跨性别女", "无性别"].map((option) => (

+                    <li

+                      key={option}

+                      onClick={() => {

+                        setTempUserInfo({ ...tempUserInfo, gender: option, showGenderOptions: false });

+                      }}

+                      style={{

+                        padding: '6px 10px',

+                        cursor: 'pointer',

+                        borderBottom: '1px solid #e0e0e0',

+                        backgroundColor: option === tempUserInfo.gender ? '#f0f0f0' : '#fff',

+                      }}

+                    >

+                      {option}

+                    </li>

+                  ))}

+                </ul>

+              )}

+            </div>

+          </div>

+          <button

+            onClick={handleSave}

+            style={{

+              marginTop: 20,

+              padding: '10px 20px',

+              backgroundColor: '#1a237e',

+              color: '#fff',

+              border: 'none',

+              borderRadius: 7,

+              cursor: 'pointer',

+              fontSize: 16,

+              alignSelf: 'center', // Center the button horizontally

+            }}

+            onMouseOver={(e) => (e.target.style.backgroundColor = '#0d1b5e')}

+            onMouseOut={(e) => (e.target.style.backgroundColor = '#1a237e')}

+          >

+            保存

+          </button>

+        </div>

+      </div>

+      {/* 上传种子列表 */}

+      <div style={{ gridColumn: '2 / 3', gridRow: '1 / 2', background: '#fff', borderRadius: 18, boxShadow: '0 4px 24px #e0e7ff', padding: '20px' }}>

+        <h3 style={{ color: '#1a237e', fontSize: 22, marginBottom: 18 }}>个人上传种子列表</h3>

+        <div style={{ border: '1px dashed #b2b2b2', borderRadius: 12, height: '100%', display: 'flex', alignItems: 'center', justifyContent: 'center', color: '#b2b2b2', fontSize: 18 }}>

+          (此处显示上传种子列表)

+        </div>

+      </div>

+      {/* 活跃度模块 */}

+      <div style={{ gridColumn: '2 / 3', gridRow: '2 / 3', background: '#fff', borderRadius: 18, boxShadow: '0 4px 24px #e0e7ff', padding: '20px' }}>

+        <h3 style={{ color: '#1a237e', fontSize: 22, marginBottom: 18 }}>活跃度</h3>

+        <div style={{ border: '1px dashed #b2b2b2', borderRadius: 12, height: '100%', display: 'flex', alignItems: 'center', justifyContent: 'center', color: '#b2b2b2', fontSize: 18 }}>

+          (此处显示活跃度信息)

+        </div>

+      </div>

+    </div>

+  );

+}
\ No newline at end of file