3.ユーザー登録達成[Springbootは、モノマーウェブショップを展開します]

ユーザー登録

現代のビジネスプラットフォームとして、最も重要なのは何ですか?もちろんユーザーは、ユーザーの大半は、グループは、当社の持続的な発展の基礎でサポートし顾客是上帝、今日では、神は、特にユーザーの古いプラットフォームの多くは、アウト早めることを切望している...しかし、すべての加入者の基盤であり、真剣に取られていなかったが、 、その後、我々は今、私たちの神の作成を開始します!

##データベースの作成

データベースの一部は、私が話にここにいないよ、と私たちは、あなたが直接行くことができ、必要なポータルクロールスクリプトexpensive-shop.sql

## 生成UserMapper

リファレンスのセクション:ポータル

##書き込みビジネスロジック

まずは、ユーザーを登録するにはシステム何のアクションを行うには、私たちすべての必要性を分析してみましょうか?
ユーザー登録

  • 検証
    • 入力文字列(我々は二つの角度によって処理チェックする必要があります)
      • 有効なフロントエンド

        フロントエンドの検証は、チェックの一部、不正な要求のほとんどを傍受することができ、チェックのこの部分を行うには、当社のサーバー側の圧力を減少させることです。

      • 有効なバックエンド

        バックエンドの検証は...データ要求に起因する当社のサーバーAPIのエラーへのフロントエンドの直接アクセス、またはフロントエンドバイパスにプログラムのパートナーは小さなバグを持っているために可能性が深刻な原因になっている可能性の種類、関係なく、いくつかの悪徳ジュニアパートナーを防ぐためです結果。

    • メール&モバイル無効

      このステップは通過しますので、私は、電子メール/ SMSサーバーを追求していなかったので、小さなパートナーは、研究カザフスタンを所有することができます。

  • コントロール
    • ユーザーを作成

      確認後、あなたは、ユーザーのアクションを作成することができます。
      我々が経過するまでのコーディング、実際には、我々は最も基本的な階層化アーキテクチャを使用し、以来続いて、我々はビジネスを達成することができますMybatis Generator基本的なツールを生成するためにpojomapper簡単な操作のために私たちはただ、書き込みに必要servicecontroller私たちを完了するために、層開発作業。

##書き込みユーザサービス

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ジェネレータコンポーネント、あるポータル私は特別な文書番号ジェネレータを書きます、後で機会が与えられ、。
  • MD5GeneratorToolsMD5は、あなたがソースコードをダウンロードすることができ、データの暗号化ツールのために使用されています。あなたはまた、直接使用することができます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デフォルト値も作成するために私たちを助け、私はデフォルトに変更usernamepasswordconfimPasswordのを私は、私たちの検証ロジックによると、それが返されるべきであること、デフォルト値を変更しなかったreturn JsonResponse.errorMsg("两次密码不一致!");、このラインに送信]をクリックします:
結果
修正confimPasswordへを12345678クリックし送信を:
結果2
あなたが見ることができ、ユーザーの成功を作成し、私たちの現在の顧客が要求を作成するユーザーを返します。終わり。私たちが繰り返しクリックを作成し続けるので、何が起こるのだろうか?送信を続行:
result3
あなたが見ることができ、ユーザーの皆様にもその効果的な検証の繰り返しとなっています。

セクションの下のお知らせ


我々が生成方法を、次のセクションでは、私たちには、外部ネットワークが存在しない場合は自動的に次のフロントエンドへの文書だけでなく、事態を発生させるために闊歩するAPIインタフェースを使用する方法を学習します、またはあなたは、サードパーティのプラットフォームとのドッキングを必要なときに离线文档第三者に。
GOGOGO!

おすすめ

転載: www.cnblogs.com/zhangpan1244/p/11809826.html