diff --git a/build.gradle b/build.gradle index c15e0a975f672d578dfc4f89b5a75547be481632..2d1c437e08d0ada1919e969a094306fa33877819 100644 --- a/build.gradle +++ b/build.gradle @@ -29,8 +29,10 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-jdbc' //from https://mariadb.com/kb/en/java-connector-using-gradle/ - implementation 'org.mariadb.jdbc:mariadb-java-client:3.5.1' + implementation 'org.mariadb.jdbc:mariadb-java-client:3.3.3' // implementation 'org.mariadb.jdbc:mariadb-java-client:2.1.2' + implementation 'org.springframework.boot:spring-boot-starter-data-jpa' + implementation 'org.mariadb.jdbc:mariadb-java-client' implementation 'org.springframework.boot:spring-boot-starter-validation' implementation 'org.springframework.boot:spring-boot-starter-security' diff --git a/src/main/java/uk/ac/cf/spring/demo/sports/Userdetail/AppConfig.java b/src/main/java/uk/ac/cf/spring/demo/sports/Userdetail/AppConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..b1ef1ec9364829798df507a92740b6aab6a75efa --- /dev/null +++ b/src/main/java/uk/ac/cf/spring/demo/sports/Userdetail/AppConfig.java @@ -0,0 +1,49 @@ +package uk.ac.cf.spring.demo.sports.Userdetail; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.util.List; + +@Configuration +public class AppConfig { + @Bean + public UserService userService(){ + return new UserService() { + @Override + public List<userdetails> getAllUsers() { + return null; + } + + @Override + public userdetails getUserById(Long id) { + return null; + } + + @Override + public userdetails getUserByEmail(String email) { + return null; + } + + @Override + public List<userdetails> getUsersByUsername(String username) { + return null; + } + + @Override + public void addUser(userdetails user) { + + } + + @Override + public void updateUser(userdetails user) { + + } + + @Override + public void deleteUser(Long id) { + + } + }; + } +} diff --git a/src/main/java/uk/ac/cf/spring/demo/sports/Userdetail/UserDao.java b/src/main/java/uk/ac/cf/spring/demo/sports/Userdetail/UserDao.java new file mode 100644 index 0000000000000000000000000000000000000000..2fb88b6c518ada53ec0889023500110d34af13e1 --- /dev/null +++ b/src/main/java/uk/ac/cf/spring/demo/sports/Userdetail/UserDao.java @@ -0,0 +1,22 @@ +package uk.ac.cf.spring.demo.sports.Userdetail; + +import java.util.List; + +// 定义 UserDao 接口 +public interface UserDao { + // 获取所有用户详情 + List<userdetails> getAllUsers(); + // 根据 ID 获取用户详情 + userdetails getUserById(Long id); + // 根据用户名获取用户详情 + userdetails getUserByUsername(String username); + // 添加用户 + void addUser(userdetails user); + // 更新用户信息 + void updateUser(userdetails user); + // 删除用户 + void deleteUser(Long id); +} + + + diff --git a/src/main/java/uk/ac/cf/spring/demo/sports/Userdetail/UserDaoImpl.java b/src/main/java/uk/ac/cf/spring/demo/sports/Userdetail/UserDaoImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..fa167df3f21ba44ea99a035c386e517432dd3fc1 --- /dev/null +++ b/src/main/java/uk/ac/cf/spring/demo/sports/Userdetail/UserDaoImpl.java @@ -0,0 +1,86 @@ +package uk.ac.cf.spring.demo.sports.Userdetail; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.stereotype.Repository; +import java.util.List; + + +@Repository +public class UserDaoImpl implements UserDao { + private final JdbcTemplate jdbc; + private RowMapper<userdetails> userdetailsMapper; + + + @Autowired + public UserDaoImpl(JdbcTemplate aJdbc) { + this.jdbc = aJdbc; + // 设置 RowMapper + setUserdetailsMapper(); + } + + // 设置 RowMapper,用于将 ResultSet 转换为 userdetails 对象 + private void setUserdetailsMapper() { + userdetailsMapper = (rs, i) -> new userdetails( + rs.getLong("id"), + rs.getString("email"), + rs.getString("password"), + rs.getString("username"), + rs.getString("role") + ); + } + + @Override + public List<userdetails> getAllUsers() { + // 查询所有用户 + String sql = "SELECT * FROM userdetails"; + List<userdetails>users=jdbc.query(sql,userdetailsMapper); + return users; + } + + @Override + public userdetails getUserById(Long id) { + // 根据 ID 查询用户 + String sql = "SELECT * FROM userdetails WHERE id = ?"; + return jdbc.queryForObject(sql, userdetailsMapper, id); + } + + @Override + public userdetails getUserByUsername(String username) { + return null; + } + + + @Override + public void addUser(userdetails user) { + // 插入新用户 + String sql = "INSERT INTO userdetails (email, username, password, role) VALUES (?, ?, ?, ?)"; + jdbc.update(sql, + user.getEmail(), + user.getPassword(), + user.getUsername(), + user.getRole() + ); + } + + @Override + public void updateUser(userdetails user) { + // 更新用户信息 + String sql = "UPDATE userdetails SET email = ?, username = ?, password = ?, role = ? WHERE id = ?"; + jdbc.update(sql, + user.getEmail(), + user.getPassword(), + user.getUsername(), + user.getRole(), + user.getId() + ); + } + + @Override + public void deleteUser(Long id) { + // 删除用户 + String sql = "DELETE FROM userdetails WHERE id = ?"; + jdbc.update(sql, id); + } +} diff --git a/src/main/java/uk/ac/cf/spring/demo/sports/Userdetail/UserDetailController.java b/src/main/java/uk/ac/cf/spring/demo/sports/Userdetail/UserDetailController.java new file mode 100644 index 0000000000000000000000000000000000000000..83f9f66aa2dc2b1dbac6aa6d08955f36b4c41a3b --- /dev/null +++ b/src/main/java/uk/ac/cf/spring/demo/sports/Userdetail/UserDetailController.java @@ -0,0 +1,52 @@ +package uk.ac.cf.spring.demo.sports.Userdetail; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.*; +import org.springframework.http.ResponseEntity; + +import java.util.List; + +@RequestMapping("/detail") +@RestController() +public class UserDetailController { + @Autowired + private UserService userService; + + // 使用 @Autowired 进行依赖注入(构造函数注入) + @Autowired + public UserDetailController(UserService userService) { + this.userService = userService; + } + + // 获取所有用户列表 + @GetMapping("/users") + public List<userdetails> getAllUsers() { + List<userdetails>users=userService.getAllUsers(); + return users; + } + + // 通过用户 ID 获取用户详情 + @GetMapping("/{id}") + public userdetails getUserById(@PathVariable Long id) { + return userService.getUserById(id); + } + + // 添加用户 + @PostMapping + public void addUser(@RequestBody userdetails user) { + userService.addUser(user); + } + + // 更新用户信息 + @PutMapping("/{id}") + public void updateUser(@PathVariable Long id, @RequestBody userdetails user) { + userService.updateUser(user); + } + + // 删除用户 + @DeleteMapping("/{id}") + public void deleteUser(@PathVariable Long id) { + userService.deleteUser(id); + } +} \ No newline at end of file diff --git a/src/main/java/uk/ac/cf/spring/demo/sports/Userdetail/UserService.java b/src/main/java/uk/ac/cf/spring/demo/sports/Userdetail/UserService.java new file mode 100644 index 0000000000000000000000000000000000000000..c26e09bf3e1876d30f6b73425f2808577ed8c03a --- /dev/null +++ b/src/main/java/uk/ac/cf/spring/demo/sports/Userdetail/UserService.java @@ -0,0 +1,26 @@ +package uk.ac.cf.spring.demo.sports.Userdetail; + + +import java.util.List; + +public interface UserService { + // 获取所有用户 + List<userdetails> getAllUsers(); + + // 通过 ID 获取用户 + userdetails getUserById(Long id); + + // 通过邮箱获取用户 + userdetails getUserByEmail(String email); + + List<userdetails> getUsersByUsername(String username); + + // 添加用户 + void addUser(userdetails user); + + void updateUser(userdetails user); + + void deleteUser(Long id); + + //void updateUser(Long id); +} \ No newline at end of file diff --git a/src/main/java/uk/ac/cf/spring/demo/sports/Userdetail/UserServiceImpl.java b/src/main/java/uk/ac/cf/spring/demo/sports/Userdetail/UserServiceImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..ed9870f50b5a2bcd8f37503412c58a5484481973 --- /dev/null +++ b/src/main/java/uk/ac/cf/spring/demo/sports/Userdetail/UserServiceImpl.java @@ -0,0 +1,55 @@ +package uk.ac.cf.spring.demo.sports.Userdetail; + +import org.springframework.stereotype.Service; +import org.springframework.beans.factory.annotation.Autowired; +import java.util.List; + +@Service +public class UserServiceImpl implements UserService { + + private final UserDao userDao; + + @Autowired + public UserServiceImpl(UserDao userDao) { + this.userDao = userDao; + } + + @Override + public List<userdetails> getAllUsers() { + //return userDao.getAllUsers(); + + List<userdetails> users = userDao.getAllUsers(); // 调用 DAO 层方法 + return users; + } + + @Override + public userdetails getUserById(Long id) { + return userDao.getUserById(id); // 根据 ID 获取用户 + } + + @Override + public userdetails getUserByEmail(String email) { + return null; + } + + + @Override + public List<userdetails> getUsersByUsername(String username) { + return userDao.getAllUsers(); + } + + @Override + public void addUser(userdetails user) { + userDao.addUser(user); // 添加新用户 + } + + @Override + public void updateUser(userdetails user) { + userDao.updateUser(user); // 更新用户信息 + } + + @Override + public void deleteUser(Long id) { + userDao.deleteUser(id); // 删除用户 + } +} diff --git a/src/main/java/uk/ac/cf/spring/demo/sports/Userdetail/userdetails.java b/src/main/java/uk/ac/cf/spring/demo/sports/Userdetail/userdetails.java new file mode 100644 index 0000000000000000000000000000000000000000..672bd2445f629352191251acc5e95f91b276f83c --- /dev/null +++ b/src/main/java/uk/ac/cf/spring/demo/sports/Userdetail/userdetails.java @@ -0,0 +1,21 @@ +package uk.ac.cf.spring.demo.sports.Userdetail; + + + import lombok.AllArgsConstructor; + import lombok.Data; + import lombok.NoArgsConstructor; + import jakarta.persistence.Entity; + import jakarta.persistence.Id; + + @Entity + @Data + @AllArgsConstructor + @NoArgsConstructor + public class userdetails { + @Id + private long id; + private String email; + private String password; + private String username; + private String role; + } \ No newline at end of file diff --git a/src/main/java/uk/ac/cf/spring/demo/sports/security/SecurityConfig.java b/src/main/java/uk/ac/cf/spring/demo/sports/security/SecurityConfig.java index e401b0ff6a5f35c377ab513f4f56e65afceddf82..78375adfecd8616f7f27307ecd807ecee584005b 100644 --- a/src/main/java/uk/ac/cf/spring/demo/sports/security/SecurityConfig.java +++ b/src/main/java/uk/ac/cf/spring/demo/sports/security/SecurityConfig.java @@ -33,6 +33,8 @@ public class SecurityConfig { "/rankings/**", "/uploads", //images "/uploads/**", + "/detail/users", + "/html/UserCenter.html", }; diff --git a/src/main/resources/data.sql b/src/main/resources/data.sql index bf9a6849befaab87faf8efb43582fe533f26be54..2af2bd63c795083477e3700dd97a07d22bd02ac3 100644 --- a/src/main/resources/data.sql +++ b/src/main/resources/data.sql @@ -38,3 +38,6 @@ INSERT INTO ranking (user_id,username,sport, wins) VALUES (3, 'xzc','TableTennis', 10), (2, 'xx','TableTennis', 4); + +INSERT INTO userdetails(id, email, password, username, role) VALUES + (1,'example@163.com','123','John','USER'); \ No newline at end of file diff --git a/src/main/resources/static/html/UserCenter.html b/src/main/resources/static/html/UserCenter.html index b920bc68c24302e6cc0cffc056afd9cedd3d9bb9..5a8e9f513d26ef1d8ef470608611f04627ab8b69 100644 --- a/src/main/resources/static/html/UserCenter.html +++ b/src/main/resources/static/html/UserCenter.html @@ -35,6 +35,7 @@ </tbody> </table> <div id="footer-container"></div> +<script src="/js/UserCenter.js"></script> <script src="/js/navBar.js"></script> <script src="/js/footer.js"></script> <script> diff --git a/src/main/resources/static/js/UserCenter.js b/src/main/resources/static/js/UserCenter.js index 5a1bef3a6200a405aa4b62f210ef7da6afedb037..b7d222778414e6f99df4ec586b1f25e1bd5a2fb3 100644 --- a/src/main/resources/static/js/UserCenter.js +++ b/src/main/resources/static/js/UserCenter.js @@ -1,15 +1,14 @@ // userTable.js -// 动态加载用户数据 -async function loadUsers(id) { +window.onload = function() { + loadUsers(); +}; +async function loadUsers() { try { - const response = await fetch('/api/users/${id}'); // 确保后端提供了此 API - if (!response.ok) { - throw new Error(`HTTP error! Status: ${response.status}`); - } - + const response = await fetch('/detail/users'); const users = await response.json(); + // 获取表格的 tbody 元素 const tbody = document.querySelector('tbody'); tbody.innerHTML = ''; // 清空旧的数据 @@ -19,8 +18,8 @@ async function loadUsers(id) { const row = document.createElement('tr'); row.innerHTML = ` <td>${user.id}</td> - <td>${user.username}</td> <td>${user.email}</td> + <td>${user.username}</td> <td> <a href="/users/edit/${user.id}">Edit</a> <a href="/users/delete/${user.id}">Delete</a>