ディレクトリ
ユーザー登録
現代のビジネスプラットフォームとして、最も重要なのは何ですか?もちろんユーザーは、ユーザーの大半は、グループは、当社の持続的な発展の基礎でサポートし顾客是上帝
、今日では、神は、特にユーザーの古いプラットフォームの多くは、アウト早めることを切望している...しかし、すべての加入者の基盤であり、真剣に取られていなかったが、 、その後、我々は今、私たちの神の作成を開始します!
##データベースの作成
データベースの一部は、私が話にここにいないよ、と私たちは、あなたが直接行くことができ、必要なポータルクロールスクリプトexpensive-shop.sql
。
## 生成UserMapper
リファレンスのセクション:ポータル
##書き込みビジネスロジック
まずは、ユーザーを登録するにはシステム何のアクションを行うには、私たちすべての必要性を分析してみましょうか?
- 検証
- 入力文字列(我々は二つの角度によって処理チェックする必要があります)
有効なフロントエンド
フロントエンドの検証は、チェックの一部、不正な要求のほとんどを傍受することができ、チェックのこの部分を行うには、当社のサーバー側の圧力を減少させることです。
有効なバックエンド
バックエンドの検証は...データ要求に起因する当社のサーバーAPIのエラーへのフロントエンドの直接アクセス、またはフロントエンドバイパスにプログラムのパートナーは小さなバグを持っているために可能性が深刻な原因になっている可能性の種類、関係なく、いくつかの悪徳ジュニアパートナーを防ぐためです結果。
メール&モバイル無効
このステップは通過しますので、私は、電子メール/ SMSサーバーを追求していなかったので、小さなパートナーは、研究カザフスタンを所有することができます。
- 入力文字列(我々は二つの角度によって処理チェックする必要があります)
- コントロール
ユーザーを作成
確認後、あなたは、ユーザーのアクションを作成することができます。
我々が経過するまでのコーディング、実際には、我々は最も基本的な階層化アーキテクチャを使用し、以来続いて、我々はビジネスを達成することができますMybatis Generator
基本的なツールを生成するためにpojo
、mapper
簡単な操作のために私たちはただ、書き込みに必要service
とcontroller
私たちを完了するために、層開発作業。
##書き込みユーザサービス
mscx-shop-service
作成com.liferunner.service.IUserService
インターフェースは、二つの方法が含まれfindUserByUserName
、そしてcreateUser
以下のように:
public interface IUserService {
/**
* 根据用户名查询用户是否存在
*
* @param username
* @return
*/
Users findUserByUserName(String username);
/**
* 创建用户
*
* @param userRequestDTO 用户请求dto
* @return 当前用户
*/
Users createUser(UserRequestDTO userRequestDTO) throws Exception;
}
次のように次に、私たちは、このインタフェースの特定のカテゴリを実装する必要があります。
@Service
@Slf4j
public class UserServiceImpl implements IUserService {
private final String FACE_IMG = "https://avatars1.githubusercontent.com/u/4083152?s=88&v=4";
// 构造器注入
private final UsersMapper usersMapper;
private final Sid sid;
@Autowired
public UserServiceImpl(UsersMapper usersMapper, Sid sid) {
this.usersMapper = usersMapper;
this.sid = sid;
}
@Override
public Users findUserByUserName(String username) {
// 构建查询条件
Example example = new Example(Users.class);
val condition = example.createCriteria()
.andEqualTo("username", username);
return this.usersMapper.selectOneByExample(example);
}
@Transactional(propagation = Propagation.REQUIRED)
@Override
public Users createUser(UserRequestDTO userRequestDTO) throws Exception {
log.info("======begin create user : {}=======", userRequestDTO);
val user = Users.builder()
.id(sid.next()) //生成分布式id
.username(userRequestDTO.getUsername())
.password(MD5GeneratorTools.getMD5Str(userRequestDTO.getPassword()))
.birthday(DateUtils.parseDate("1970-01-01", "yyyy-MM-dd"))
.nickname(userRequestDTO.getUsername())
.face(this.FACE_IMG)
.sex(SexEnum.secret.type)
.createdTime(new Date())
.updatedTime(new Date())
.build();
this.usersMapper.insertSelective(user);
log.info("======end create user : {}=======", userRequestDTO);
return user;
}
}
説明する必要があるいくつかの場所があります。
UserServiceImpl#findUserByUserName説明
tk.mybatis.mapper.entity.Example
クエリ条件が複数ある場合、クエリパラメータMyBatisの実施例を用いて構築、することができるexample.createCriteria().addxxx
一枚ずつ加えました。
UserServiceImpl#のcreateUser説明
@Transactional(propagation = Propagation.REQUIRED)
、オープントランザクションは、トランザクション伝播レベルを選択REQUIRED
トランザクションは、存在している必要があり、発信者のトランザクションが存在しない場合、発信者自身が、このメソッドは意志、アクティブなトランザクションがある場合は、この方法は、新しい自分の事をオープンします表し、 (総死亡して)それに加えます。org.n3r.idworker.Sid
これは、オープンソースの分散IDジェネレータコンポーネント、あるポータル私は特別な文書番号ジェネレータを書きます、後で機会が与えられ、。MD5GeneratorTools
MD5は、あなたがソースコードをダウンロードすることができ、データの暗号化ツールのために使用されています。あなたはまた、直接使用することができますjava.security.MessageDigest
達成するために直接暗号化を、簡単に言えば、パスワードはライン上のプレーンテキストで保存することができません。SexEnum
これが私たちのエンコード仕様の列挙ジェンダー表現の一種で、できるだけ要件が表示されないMagic number
(...つまり、1,2,300)、開発コミュニティは、マジックナンバーことが多いといわれています- ここでの印刷ジャーナルあなたはこのような気づかなかった理由を、1が尋ねるかもしれません:
private final static Logger logger = LoggerFactory.getLogger(UserServiceImpl.class);
、それは我々が最初であるため、我々が導入したあるlombok
学生はを参照することができます覚えていない依存ポータルを。ここで依存性、それは我々が唯一のアノテーションを使用する必要があり、ロギング・コンポーネントの多くを受け継いlombok.extern.slf4j.Slf4j
使用し、ログを開くためにlog.info..
それを。 UserRequestDTO
幽霊とは何ですか?我々の開発の過程では、おそらく、パラメータを渡す必要が大量になることですし、我々は、使用している場合xxx#(String aa,Integer bb,Boolean cc...)
作るの私たちの数は非常に迷惑な、しかし美しく見ていない、この時間は、私たちが助け私たちに新しいオブジェクトを作成することを選択することができますそれは私たちですので、転送データは、UserRequestDTO
いわゆるターゲット、DTO
あるData Transfer Object
名前が示すとおり、それは転送データに使用される頭字語は、使用するオブジェクト。
##ライトユーザー・コントローラ
また中にmscx-shop-api
、作成しcom.liferunner.api.controller.UserController
、ユーザーが作成し実装します。
@RestController
@RequestMapping(name = "/users")
@Slf4j
@Api(tags="用户管理")
public class UserController {
@Autowired
private IUserService userService;
@ApiOperation("校验是否重名")
@GetMapping("/validateUsername")
public JsonResponse validateUsername(@RequestParam String username) {
// 判断用户名是否非法
if (StringUtils.isBlank(username))
return JsonResponse.errorMsg("用户名不能为空!");
if (null != userService.findUserByUserName(username))
return JsonResponse.errorMsg("用户名已存在!");
// 用户名可用
return JsonResponse.ok();
}
@ApiOperation("创建用户")
@PostMapping("/create")
public JsonResponse createUser(@RequestBody UserRequestDTO userRequestDTO) {
try {
if (StringUtils.isBlank(userRequestDTO.getUsername()))
return JsonResponse.errorMsg("用户名不能为空");
if (null != this.userService.findUserByUserName(userRequestDTO.getUsername())) {
return JsonResponse.errorMsg("用户名已存在!");
}
if (StringUtils.isBlank(userRequestDTO.getPassword()) ||
StringUtils.isBlank(userRequestDTO.getConfimPassword()) ||
userRequestDTO.getPassword().length() < 8) {
return JsonResponse.errorMsg("密码为空或长度小于8位");
}
if (!userRequestDTO.getPassword().equals(userRequestDTO.getConfimPassword()))
return JsonResponse.errorMsg("两次密码不一致!");
val user = this.userService.createUser(userRequestDTO);
if (null != user)
return JsonResponse.ok(user);
} catch (Exception e) {
log.error("创建用户失败,{}", userRequestDTO);
}
return JsonResponse.errorMsg("创建用户失败");
}
}
UserControllerで#validateUsername(ユーザー名)说明
JsonResponse
オブジェクトは、データオブジェクトをカプセル化された均一なフォーマットを容易にするために、クライアントに返されます。
@Data
@NoArgsConstructor
@AllArgsConstructor
public class JsonResponse {
// 定义jackson对象
private static final ObjectMapper MAPPER = new ObjectMapper();
// 响应业务状态
private Integer status;
// 响应消息
private String message;
// 响应中的数据
private Object data;
public static JsonResponse build(Integer status, String msg, Object data) {
return new JsonResponse(status, msg, data);
}
public static JsonResponse ok(Object data) {
return new JsonResponse(data);
}
public static JsonResponse ok() {
return new JsonResponse(null);
}
public static JsonResponse errorMsg(String msg) {
return new JsonResponse(500, msg, null);
}
public static JsonResponse errorMap(Object data) {
return new JsonResponse(501, "error", data);
}
public static JsonResponse errorTokenMsg(String msg) {
return new JsonResponse(502, msg, null);
}
public static JsonResponse errorException(String msg) {
return new JsonResponse(555, msg, null);
}
public static JsonResponse errorUserQQ(String msg) {
return new JsonResponse(556, msg, null);
}
public JsonResponse(Object data) {
this.status = 200;
this.message = "OK";
this.data = data;
}
public Boolean isOK() {
return this.status == 200;
}
}
UserControllerで#のcreateUser(UserRequestDTO)说明
- 上記第一の行う検証の必要性の多様性を述べています
- 成功、リターン
JsonResponse
- 注意深い学生は、いくつかのノートがある上に見ているかもしれ
@Api(tags="用户管理")
、@ApiOperation("创建用户")
これが闊歩のコメントであり、我々はより多く見つけるために次のセクションで説明します、そしてどのように生成しますoff-line docs
。
テストAPI
私たちは、それぞれの変更が可能な限り、完了した後mvn clean install
の時間を我々はプロジェクトの異なるに属しているので、あなたが再インストールしない場合でも、時折問題は、人生に疑問を唱えてもよいです。
...
[INFO] expensive-shop ..................................... SUCCESS [ 1.220 s]
[INFO] mscx-shop-common ................................... SUCCESS [ 9.440 s]
[INFO] mscx-shop-pojo ..................................... SUCCESS [ 2.020 s]
[INFO] mscx-shop-mapper ................................... SUCCESS [ 1.564 s]
[INFO] mscx-shop-service .................................. SUCCESS [ 1.366 s]
[INFO] mscx-shop-api ...................................... SUCCESS [ 4.614 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 20.739 s
[INFO] Finished at: 2019-11-06T14:53:55+08:00
[INFO] ------------------------------------------------------------------------
あなたは上記の操作の結果を見ると、あなたが私たちのアプリケーションのテストを開始することができますオンラインの友人〜
UserControllerで#validateUsername(ユーザー名)测试
APIをテストするための多くの方法がありますが、例えばcurl localhost:8080/validateUsername
、人気のあるこのような超にPostman
プラグインし、みんなの最初の章では、言った前に[OK]を、私はここで完全にRestful Toolkit(可以实现和postman一样的简单效果,同时还能帮助我们生成一部分测试信息)
我々はアプリケーションを起動すると、以下の絵、
私たちは、プラグインのオンライン・ヘルプには、私たちは、このような私たちがクリックなど、いくつかの試験方法を、生成することを見ることができvalidateUsername
、それは現在の方法は以下の通りです含ま生成し、username
パラメータのGET
方法はdemoData
、デフォルトのプラグイン生成されたテストデータにあります。それは自由に変更することができます。
クリックして送信する:
あなたは、要求が成功した、とJSONデータ形式に私たちのカスタムを返す見ることができます。
UserControllerで#のcreateUser(UserRequestDTO)测试
そして、私たちは次のことを要求するために、ユーザー登録インタフェースをテストし続けて:
あなたは私たちが選択したときに、見ることができるcreate
時間法を、プラグインは自動的には、私たちは要求タイプを設定するのに役立ちPOST
、およびRequestBody
デフォルト値も作成するために私たちを助け、私はデフォルトに変更username
とpassword
値confimPassword
のを私は、私たちの検証ロジックによると、それが返されるべきであること、デフォルト値を変更しなかったreturn JsonResponse.errorMsg("两次密码不一致!");
、このラインに送信]をクリックします:
修正confimPassword
へを12345678
クリックし送信を:
あなたが見ることができ、ユーザーの成功を作成し、私たちの現在の顧客が要求を作成するユーザーを返します。終わり。私たちが繰り返しクリックを作成し続けるので、何が起こるのだろうか?送信を続行:
あなたが見ることができ、ユーザーの皆様にもその効果的な検証の繰り返しとなっています。
セクションの下のお知らせ
我々が生成方法を、次のセクションでは、私たちには、外部ネットワークが存在しない場合は自動的に次のフロントエンドへの文書だけでなく、事態を発生させるために闊歩するAPIインタフェースを使用する方法を学習します、またはあなたは、サードパーティのプラットフォームとのドッキングを必要なときに离线文档
第三者に。
GOGOGO!