Skip to content
Snippets Groups Projects
Commit 0633e0d4 authored by Haoyu Sun's avatar Haoyu Sun
Browse files

Merge branch...

Merge branch '60-as-a-user-i-want-to-view-and-edit-my-personal-information-on-my-profile-page-so-that-i-can' into 'main'

Resolve "As a user, I want to view and edit my personal information on my profile page so  that I can manage and update my details"

Closes #60

See merge request !55
parents 4f85fb18 84213aa1
No related branches found
No related tags found
1 merge request!55Resolve "As a user, I want to view and edit my personal information on my profile page so that I can manage and update my details"
Showing
with 327 additions and 9 deletions
......@@ -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'
......
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) {
}
};
}
}
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);
}
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);
}
}
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
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
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); // 删除用户
}
}
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
......@@ -33,6 +33,8 @@ public class SecurityConfig {
"/rankings/**",
"/uploads", //images
"/uploads/**",
"/detail/users",
"/html/UserCenter.html",
};
......
......@@ -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
......@@ -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>
......
// 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>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment