😎
Re:ゼロから始めるSpring Boot #5 ブログサイト作成1
要件
- ユーザ
1.1 新規登録 ← 本記事の内容
1.2 ログイン
1.3 ユーザ情報取得
1.4ユーザ情報更新
1.5 アバター画像変更
1.6 パスワード変更 - 記事カテゴリ
2.1 記事のカテゴリ一覧取得
2.2 記事のカテゴリ追加
2.3 記事のカテゴリ更新
2.4 記事のカテゴリ詳細取得
2.5 記事のカテゴリ削除 - 記事管理
3.1 記事新規追加
3.2 記事更新
3.3 記事の詳細情報取得
3.4 記事の削除
3.5 記事一覧取得
アーキテクチャ
├───RezeroSbWebblogApplication.java
├───controller
│ UserController.java
├───model
│ Result.java
│ User.java
├───repository
│ UserMapper.java
├───service
│ │ UserService.java
│ │
│ └───impl
│ UserServiceImpl.java
└───utils
└───Md5Util.java
開発環境
- Java 17
- Maven 3.1.3
- 依存パッケージ(artifactId)
- spring-boot-starter-web
- mybatis-spring-boot-starter
- mysql-connector-j
- spring-boot-starter-test
- mybatis-spring-boot-starter-test
- lombok
実装
(1). Userエンティティ
lombokを利用しているため、@Data
アノテーションを利用することでgetter/setter
などを手動追加しなくてもよい。
@Data
public class User {
private Integer id;
private String username;
private String password;
private String nickname;
private String email;
private String userPic;
private LocalDateTime createTime;
private LocalDateTime updateTime;
}
@NoArgsConstructor
@AllArgsConstructor
@Data
public class Result<T> {
private Integer code;//処理結果 0-成功 1-失敗
private String message;//メッセージ
private T data;//レスポンスデータ
//レスポンス処理
public static <E> Result<E> success(E data) {
return new Result<>(0, "操作完了", data);
}
//快速返回操作成功响应结果
public static Result success() {
return new Result(0, "操作完了", null);
}
public static Result error(String message) {
return new Result(1, message, null);
}
}
(2). Service
public interface UserService {
User findByUserName(String username);
void register(String username, String password);
}
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Override
public User findByUserName(String username){
User u = userMapper.findByUserName(username);
return u;
}
@Override
public void register(String username, String password){
String md5String = Md5Util.getMD5String(password);
userMapper.add(username,md5String);
}
}
(3). Mapper
@Mapper
public interface UserMapper {
@Select("select * from user where username=#{username}")
User findByUserName(String username);
@Insert("insert into user(username,password,create_time,update_time)" +
" values(#{username},#{password},now(),now())")
void add(String username, String password);
}
(4). Controller
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@PostMapping("/register")
public Result register(String username, String password) {
User u = userService.findByUserName(username);
if (u == null){
userService.register(username,password);
return Result.success();
}else{
return Result.error("既に存在する。");
}
}
}
(5). その他(Utils)
パスワードを暗号化するために利用する。
こちらを参照。
(6). データベースの準備
create table user
(
id int unsigned auto_increment comment 'ID'
primary key,
username varchar(20) not null comment 'UserName',
password varchar(32) null comment 'PassWord',
nickname varchar(10) default '' null comment 'NickName',
email varchar(128) default '' null comment 'MailAddress',
user_pic varchar(128) default '' null comment 'Avator',
create_time datetime not null comment 'CreateDate',
update_time datetime not null comment 'ModifyDate',
constraint username
unique (username)
)
comment 'UserTable';
テスト
網羅してはいないが、コントローラーの動作確認を行う。
@SpringBootTest
@AutoConfigureMockMvc
class RezeroSbWebblogApplicationTests {
@Autowired
private MockMvc mockMvc;
@Autowired
private ObjectMapper objectMapper;
@Test
public void testRegister() throws Exception {
// テストデータ
String username = "testusertest";
String password = "testpasswordtes";
// リクエストを送信して結果を検証
String resultJson = mockMvc.perform(MockMvcRequestBuilders.post("/user/register")
.param("username", username)
.param("password", password))
.andExpect(MockMvcResultMatchers.status().isOk())
.andReturn()
.getResponse()
.getContentAsString(StandardCharsets.UTF_8); // UTF-8 エンコーディング指定
// Resultオブジェクトに変換
Result<?> result = objectMapper.readValue(resultJson, Result.class);
// 検証
Assertions.assertEquals(0, result.getCode()); // 成功コード
Assertions.assertEquals("操作完了", result.getMessage()); // メッセージ
Assertions.assertNull(result.getData()); // データが不要な場合はnull
}
}
Discussion