私の連絡先情報
郵便メール:
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
これは vue3+springboot+mybatis+mysql のプロジェクト実装です。これは、フロントエンドとバックエンドの分離のログインおよび登録機能を実装するだけです。主なツールは、idea、navicat です。
目次
2. springboot+mysql+mybatisプロジェクトを作成し、データベースに接続します
プロジェクトを作成するには、私の記事のいずれかを参照してください。
IDEA を使用してカスタム vue3 プロジェクトを作成する_idea vue3-CSDN ブログ
作成後の初期ディレクトリ構造:
まず、元のディレクトリ構造を変更する必要があります
資産写真を投稿する
コンポーネント中間コンポーネント (通常は再利用可能)
ルーターすべてのメイン ページのファイル パスが設定されるルートです
店通常、トークンの保存など、vuex の状態管理に使用されます。
ビュー中央がメインページです
アプリ.vueこれは、Vue アプリケーションのルート コンポーネントです。
メイン.jsこれはアプリケーションのエントリ ファイルであり、通常、vue や vue router などの依存関係を導入するために使用されます。
ログインおよび登録機能を実装するために、変更されたディレクトリ構造は次のようになります。
ログイン登録ページと機能を実装するために、Components フォルダーの下に LoginAndRegister.vue を作成します。ここでは、ログインと登録用の .vue ファイルのみを作成します。このファイルには、ログイン ブロックと登録ブロックの要素が含まれるかどうかを決定するために v-if が使用されます。 . レンダリングが行われるため、表示に影響を与えます。
初期設定
v-if="loginShow"为true, v-if="registerShow"为false
ボタンをクリックして切り替えると、true と false が切り替わります。
登録が成功したら、ログインセクションに戻ります。
利便性とユーザーの習慣のため、ユーザー属性には ID、ユーザー名、パスワード、電話番号、性別が含まれますが、登録時に入力されるのはユーザー名とパスワードのみであり、パスワードは暗号化されずに単純に機能が実装されます。安全性が十分ではありませんので、より安全なログインと登録方法、ログイン後の個人情報の改善方法について改めて記事を更新します。
ログインと登録.vue:
- <template>
- <div class="container">
- <div class="login-box" v-if="loginShow">
- <!-- 菱形群-->
- <div class="decoration1 decoration"></div>
- <div class="decoration2 decoration"></div>
- <div class="decoration3 decoration"></div>
- <div class="decoration4 decoration"></div>
- <div class="decoration5 decoration"></div>
- <div class="decoration decoration4 decoration6"></div>
- <div class="decoration decoration7 decoration2"></div>
- <div class="decoration decoration8 decoration3"></div>
- <div class="login-title">
- <h1>Login</h1>
- </div>
- <div class="login-part">
- <input class="login-input" v-model="username" placeholder="Username" />
- <input class="login-input" type="password" v-model="password" placeholder="Password" />
- <button class="login-button" @click="login">Login</button>
- <div>
- 还未注册?点击<a class="change-link" @click="changeToRegister">这里</a>注册
- </div>
- </div>
- </div>
- <div class="login-box" v-if="registerShow">
- <!-- 菱形群-->
- <div class="decoration1 decoration"></div>
- <div class="decoration2 decoration"></div>
- <div class="decoration3 decoration"></div>
- <div class="decoration4 decoration"></div>
- <div class="decoration5 decoration"></div>
- <div class="decoration decoration4 decoration6"></div>
- <div class="decoration decoration7 decoration2"></div>
- <div class="decoration decoration8 decoration3"></div>
- <div class="login-title">
- <h1>Register</h1>
- </div>
- <div class="login-part">
- <input class="login-input" v-model="username" placeholder="Username" />
- <input class="login-input" type="password" v-model="password" placeholder="Password" />
- <button class="login-button" @click="register">Register</button>
- <span class="change-link" @click="changeToLogin">返回登录</span>
- </div>
- </div>
- <!-- <div class="decoration decoration1"></div>-->
- <!-- <div class="decoration decoration2"></div>-->
- <!-- <div class="decoration decoration3"></div>-->
- <!-- <div class="decoration decoration4"></div>-->
- </div>
- </template>
-
- <script>
- import { ref } from 'vue'
- import { useRouter } from 'vue-router' // 导入 useRouter
-
- import '../style/Login.css' // 导入css
- export default {
- name: 'LoginVue',
- setup () {
- const username = ref('')
- const password = ref('')
- const phone = ref('')
- const loginShow = ref(true)
- const registerShow = ref(false)
- const router = useRouter()
-
- const changeToRegister = async () => {
- loginShow.value = false
- registerShow.value = true
- }
-
- const changeToLogin = async () => {
- loginShow.value = true
- registerShow.value = false
- }
-
- const login = async () => {
- console.log('Login with:', username.value, password.value)
- try {
- const formData = new FormData()
- formData.append('username', username.value)
- formData.append('password', password.value)
- const response = await fetch('http://localhost:8081/api/user/login', {
- method: 'POST',
- body: formData
- })
- const data = await response.json()
- if (response.ok) {
- console.log('Link success', data)
- if (data.code === 200) {
- // 登录成功
- alert('登录成功!')
- await router.push('/home')
- } else {
- alert(data.msg)
- }
- } else {
- console.error('Link failed', data)
- }
- } catch (error) {
- console.error('Error login', error)
- }
- }
-
- const register = async () => {
- console.log('Register with:', username.value, password.value)
- try {
- const formData = new FormData()
- formData.append('username', username.value)
- formData.append('password', password.value)
- const response = await fetch('http://localhost:8081/api/user/register', {
- method: 'POST',
- body: formData
- })
- const data = await response.json()
- if (response.ok) {
- if (data.code === 200) {
- console.log('Register success', data)
- alert('注册成功!')
- await changeToLogin()
- } else {
- console.log('Register failed', data)
- alert(data.msg)
- }
- } else {
- console.error('Register failed', data)
- }
- } catch (error) {
- console.error('Error during register', error)
- }
- }
-
- return { username, password, phone, login, loginShow, registerShow, changeToRegister, register, changeToLogin }
- }
- }
- </script>
-
- <style>
-
- </style>
Home.vue は、ログインに成功した後にジャンプするメイン ページです。
ホーム.vue:
- <template>
- 首页<br><br>
- <button class="login-button" @click="signOut">退出登录</button>
- </template>
-
- <script>
- import { useRouter } from 'vue-router'
-
- export default {
- name: 'HomeVue',
- setup () {
- const router = useRouter()
- const signOut = async () => {
- await router.push('/')
- }
- return { signOut }
- }
- }
- </script>
-
- <style scoped>
-
- </style>
ページ ルーティング設定。パスが /、/login がログイン ページ、/home がホームページの場合、ログイン ページにリダイレクトされます。
index.js:
- import { createRouter, createWebHistory } from 'vue-router'
- import Login from '../components/LoginAndRegister.vue'
- import Home from '../views/Home.vue'
-
- const routes = [
- {
- path: '/',
- redirect: '/login'
- },
- {
- path: '/login',
- name: 'Login',
- component: Login
- },
- {
- path: '/home',
- name: 'Home',
- component: Home
- }
- ]
-
- const router = createRouter({
- history: createWebHistory(process.env.BASE_URL),
- routes
- })
-
- export default router
ログイン登録ページのCSSデザインです。
ログイン.css:
- *{
- margin: 0;
- padding: 0;
- }
- .container{
- height: 100vh;
- display: flex;
- justify-content: center;
- align-items: center;
- overflow: hidden;
- position: relative;
- }
- .login-box{
- background-color: white;
- padding: 40px 100px;
- border-radius: 8px;
- box-shadow: 0 0 5px 1px gainsboro;
- position: relative;
- }
- .login-part{
- display: flex;
- flex-direction: column;
- justify-content: center;
- margin-top: 20px;
- gap: 20px;
- }
- .login-input{
- width: 250px;
- height: 30px;
- border-radius: 8px;
- }
- .login-button{
- height: 40px;
- border-radius: 8px;
- background-color: #2c3e50;
- color: white;
- transition: 0.5s;
- }
- .login-button:hover{
- background-color: darkcyan;
- font-size: 15px;
- transition: 0.5s;
- }
- .login-button:active{
- background-color: darkslateblue;
- }
- .change-link{
- color: #00BFFF;
- text-decoration: underline;
- }
- .change-link:hover{
- color: cornflowerblue;
- }
-
- .decoration {
- position: absolute;
- width: 200px;
- height: 200px;
- background: linear-gradient(to left, #FDF5E6, #96CDCD );
- clip-path: polygon(50% 0%, 100% 50%, 50% 100%, 0% 50%);
- z-index: 1;
- }
- .decoration1 {
- top: 150px;
- left: -210px;
- }
- .decoration2 {
- top: 20px;
- right: -20px;
- width: 100px; /* 第二个菱形的大小 */
- height: 100px;
- background: linear-gradient(to right, #FFF5EE, #E6E6FA);
- }
- .decoration3 {
- top: 50px;
- right: -180px;
- width: 200px; /* 第三个菱形的大小 */
- height: 200px;
- background: linear-gradient(to right, #7FFFD4, cadetblue);
- }
- .decoration4 {
- top: 200px;
- right: -200px;
- width: 500px; /* 第三个菱形的大小 */
- height: 500px;
- z-index: -1;
- clip-path: polygon(50% 0%, 100% 50%, 50% 100%, 0% 50%);
- background: linear-gradient(to right, #FFFACD, #00BFFF);
- }
- .decoration5 {
- top: -100px;
- right: 200px;
- width: 400px; /* 第三个菱形的大小 */
- height: 400px;
- z-index: -1;
- clip-path: polygon(50% 0%, 100% 50%, 50% 100%, 0% 50%);
- background: linear-gradient(to right, #AFEEEE, #00BFFF);
- }
- .decoration6 {
- top: 10px;
- right: -680px;
- }
-
- .decoration7 {
- top: -170px;
- right: -500px;
- }
-
- .decoration8 {
- top: -140px;
- right: -655px;
- }
ひし形のブロックはランダムに配置されており、最初は次のようになります。
その後、さらにいくつかのひし形のブロックを追加し、その位置と色を変更しました。最終的な効果は次のとおりです。
springboot、mysql、mybatis を使用してバックエンド プロジェクトを構築し、データベースに接続するだけです。参照:
記事の補足:
エンティティ クラスを作成するたびに set メソッドと get メソッドを記述するのが面倒な場合は、pom.xml に次の依存関係を追加できます。
- <dependency>
- <groupId>org.projectlombok</groupId>
- <artifactId>lombok</artifactId>
- </dependency>
次に、エンティティ クラスで @Data アノテーションを使用して、set メソッドと get メソッドの記述を省略します。
プロセスはほぼ同じですが、今回作成したデータは異なります。主な理由は、ユーザー テーブルの属性とデータが変更されたことです (違いは大きくなく、スープは薬を変更しません)。
問題が発生しました: Maven は依存関係のダウンロードを続けますが、長時間応答がありません
ただし、今回は、新しいコンピューターを使用してバックエンド プロジェクトを作成しました。その結果、Maven が起動された後、さまざまな依存関係とプラグインがダウンロードされ続けました。 -ins、そして長い間応答がありませんでした:
解決:
キャッシュをクリアしてアイデアを再起動しましたが、効果はほとんどありませんでした。
後で、Maven がデフォルトで外部の中央ウェアハウスを使用し、アイデアで Maven プラグインを使用していたため、ダウンロード速度が非常に遅くなったことが原因である可能性があることがわかりました。
そこで、mavenをローカルにダウンロードしました。チュートリアルを参照してください。
Maven のダウンロードとインストールのチュートリアル (超詳細)_Maven のインストール - CSDN ブログ
チュートリアルに従ってダウンロードし、Mavenのインストールパス->conf->settings.xmlにあるイメージのURLを変更します。ただし、環境変数は設定せず、file->settings->で直接設定しました。 [ビルド、実行、デプロイ] -> [ビルド ツール] -> Maven で、Maven ホーム パスをローカル パスに変更します。
変更後、ダウンロード速度は確かに大幅に速くなりました。
最終的なバックエンド プロジェクトのディレクトリ構造は次のとおりです。
フロントエンドから渡されたユーザー名とパスワードを含む入力情報を取得し、データベース内のユーザー名とパスワードに基づいてクエリを実行します。ユーザーが見つかった場合は、そのユーザーが存在し、ユーザー名とパスワードが一致していることを意味します。ログインは成功しますが、それ以外の場合は失敗します。
フロントエンドから渡されたユーザー名とパスワードを含む入力情報を取得します。入力情報が空でないことを確認した後、まずユーザー名に従ってデータベースを検索します。見つかった場合は、そのユーザー名が登録されています。失敗し、失敗情報が返されます。登録が成功すると、ユーザーはレコードを登録してデータベースに挿入できます。ログイン ブロックは表示され、登録ブロックは非表示になります。
その中で、リソース -> マッパー -> UserMapper.xml:
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
- "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
-
- <mapper namespace="com.example.demo.mapper.UserMapper" >
- <resultMap id="result" type="com.example.demo.entity.User">
- <result property="id" column="id" />
- <result property="username" column="username" />
- <result property="password" column="password" />
- <result property="phone" column="phone" />
- <result property="gender" column="gender"/>
- </resultMap>
-
- <!-- 通过用户名和密码查找对应用户,用于登录-->
- <select id="findUserByNameAndPwd" resultMap="result" parameterType="User">
- select * from user
- where username = #{username}
- and password = #{password}
- </select>
-
-
- <!-- 通过用户名查找对应用户,用于注册检验用户名是否已存在-->
- <select id="findUserByName" resultMap="result" parameterType="User">
- select * from user
- where username = #{username}
- </select>
-
- <!-- 添加用户-->
- <insert id="addUser" parameterType="User">
- insert into user (username, password)
- values ( #{username}, #{password} )
- </insert>
-
- </mapper>
java->com.example.demo->mapper->UserMapper.java:
- package com.example.demo.mapper;
-
- import com.example.demo.entity.User;
- import org.apache.ibatis.annotations.Mapper;
-
- @Mapper
- public interface UserMapper {
- // 通过用户名和密码查找对应用户
- public User findUserByNameAndPwd(User user);
- // 通过用户名查找用户
- public User findUserByName(User user);
- // 添加用户
- public void addUser(User user);
- }
java->com.example.demo->service->UserService.java:
- package com.example.demo.service;
-
- import com.example.demo.entity.User;
-
- public interface UserService {
- // 通过用户名和密码查找对应id
- public User findUserByNameAndPwd(User user);
- // 通过用户名查找用户
- public User findUserByName(User user);
- // 添加用户
- public void addUser(User user);
- }
java->com.example.demo->service->UserServiceImpl.java:
- package com.example.demo.service;
-
- import com.example.demo.entity.User;
- import com.example.demo.mapper.UserMapper;
- import jakarta.annotation.Resource;
- import org.springframework.stereotype.Service;
-
- @Service
- public class UserServiceImpl implements UserService {
- @Resource
- private UserMapper userMapper;
-
- // 通过用户名和密码查找对应id
- @Resource
- public User findUserByNameAndPwd(User user){
- return userMapper.findUserByNameAndPwd(user);
- }
-
- // 通过用户名查找用户
- @Resource
- public User findUserByName(User user){
- return userMapper.findUserByName(user);
- }
-
- // 添加用户
- @Resource
- public void addUser(User user){
- userMapper.addUser(user);
- }
- }
java->com.example.demo->コントローラ->UserController.java:
- package com.example.demo.controller;
-
-
- import com.example.demo.entity.User;
- import com.example.demo.result.Result;
- import com.example.demo.service.UserService;
- import jakarta.annotation.Resource;
- import org.springframework.web.bind.annotation.*;
-
-
- @RestController
- @RequestMapping("/api/user")
- public class UserController {
- @Resource
- UserService userService;
-
- // 登录
- @CrossOrigin
- @PostMapping(value = "/login")
- public Result login(@ModelAttribute("user") User user){
- String username=user.getUsername();
- String password=user.getPassword();
- System.out.println("Login received username: " + username);
- System.out.println("Login received password: " + password);
- User userCheck = new User();
- userCheck.setUsername(username);
- userCheck.setPassword(password);
- System.out.println(userCheck.getUsername() + " " + userCheck.getPassword());
- try{
- User findUser = userService.findUserByNameAndPwd(userCheck);
- if(findUser != null){
- return Result.success(findUser);
- }else {
- return Result.failure(401,"用户名或密码错误");
- }
- }catch (Exception e){
- return Result.failure(500,"服务器异常");
- }
- }
-
- // 注册
- @CrossOrigin
- @PostMapping(value = "/register")
- public Result register(@ModelAttribute("user") User user){
- // String username = "222";
- // String password = "222";
- User userCheck = new User();
- userCheck.setUsername(user.getUsername());
- userCheck.setPassword(user.getPassword());
- if(userCheck.getUsername() == null || userCheck.getUsername().isEmpty() || userCheck.getPassword() == null || userCheck.getPassword().isEmpty()){
- System.out.println("用户名或密码不可为空");
- return Result.failure(201,"用户名和密码不可为空");
- }else {
- System.out.println("Register received username: " + userCheck.getUsername());
- System.out.println("Register received password: " + userCheck.getPassword());
- try{
- // 先在数据库中查找是否已有用户名相同的用户
- User findUser = userService.findUserByName(userCheck);
- if(findUser != null){
- // 用户名已存在
- return Result.failure(202,"用户名已存在!");
- }
- else {
- // 新用户,数据库添加记录
- userService.addUser(userCheck);
- return Result.success(userCheck);
- }
- }catch (Exception e) {
- return Result.failure(500, "服务器异常");
- // }
- }
- }
- }
- }
フロントエンドとバックエンドは別々に実行および開始されます。ここでは、application.properties でバックエンドのポートを 8081 に変更し、フロントエンドはデフォルトの 8080 です。そのため、フロントエンドとバックエンドのプロジェクトが正常に実行されたら、http:/ と入力します。ブラウザーで /localhost:8080 を確認し、開発者ツールのネットワークで確認し、バックエンドに正常に接続し、ログインしてテスト入力を登録するときに別のプロンプト情報とポップアップ プロンプトを正常に返します。
ログインに成功した後: