添加登錄和注冊功能

先寫前端再寫后端

前提:idea+vue3+mybatis+springBoot3前后端分離實現對一張表的增刪改查(完整代碼版)-CSDN博客

項目地址

1.添加一個Login.vue視圖

<template><div class="login_container"><div class="login_box"><div style="padding:20px;background-color: white;margin-left: 100px;border-radius: 20px;box-shadow:0 0  10px rgba(0,0,0.1)"><el-form ref="formRef" :rules="data.rules" :model="data.form" style="width:400px"  autocomplete="off" ><div style="margin-bottom:30px;font-size:20px;color:#0742b1;font-weight:bolder;text-align: center">歡迎登錄后臺管理系統</div><el-form-item style="margin-top: 20px;" prop="username" autocomplete="off"><el-input size="large"   v-model="data.form.username" placeholder="請輸入賬號" prefix-icon="User" ></el-input></el-form-item><el-form-item  prop="password"><el-input show-password="show-password" autocomplete="off" size="large" v-model="data.form.password" placeholder="請輸入密碼" prefix-icon="Lock"></el-input></el-form-item><div><el-button size="large" style="width: 48%" type="primary" @click="login()">登 錄</el-button><el-button size="large" style="width: 48%" type="info">取 消</el-button></div><div style="text-align: right;margin-top: 20px;">還沒有賬號?請<a style="color: #0742b1;text-decoration: none;" href="/register">注冊</a></div></el-form></div></div></div>
</template>
<script setup>
import { reactive,ref} from "vue";
import request from "@/utils/request.js";
import {ElMessage} from "element-plus";const res = ref()
const data = reactive({form:{username:'',password:''},rules:{username:[{required:true,message:'請輸入賬號',trigger:'blur'}],password:[{required:true,message:'請輸入密碼',trigger:'blur'}]}
})
const formRef = ref()
const login = () => {formRef.value.validate((valid) => {if (valid) {request.post('/employee/login', data.form).then(res => {if (res.code === '200') {localStorage.setItem("zwy-user",JSON.stringify(res.data))//把json對象轉換為字符串ElMessage.success('登錄成功');location.href = '/manager/home'} else {ElMessage.error(res.msg); // 顯示業務錯誤消息}}).catch(error => {if (error.response) {// 處理 HTTP 錯誤狀態碼(如 400)const { data } = error.response;if (data && data.msg) {ElMessage.error(data.msg); // 顯示后端返回的錯誤消息} else {ElMessage.error('請求失敗,請稍后重試');}} else {ElMessage.error('網絡請求失敗,請檢查網絡連接');}});}});
}</script>
<!--scoped表示當頁生效-->
<style scoped>
.login_container{height: 100vh;overflow:hidden;background-image: url("@/assets/login_bg.png");background-size:cover ;background-position: 0 -40px;
}
.login_box{width: 50%;height: 100%;display: flex;align-items: center;right: 0;position: absolute;
}
</style>

背景圖為下圖 位置background-image: url("@/assets/login_bg.png");

2.添加一個Register.vue視圖

<template><div class="Register_container"><div class="Register_box"><div style="padding:20px;background-color: white;margin-left: 100px;border-radius: 20px;box-shadow:0 0  10px rgba(0,0,0.1)"><el-form ref="formRef" :rules="data.rules" :model="data.form" style="width:400px" ><div style="margin-bottom:30px;font-size:20px;color:#0742b1;font-weight:bolder;text-align: center">歡迎注冊后臺管理系統</div><el-form-item style="margin-top: 20px;" prop="username"><el-input size="large" autocomplete="off" v-model="data.form.username" placeholder="請輸入賬號" prefix-icon="User" ></el-input></el-form-item><el-form-item  prop="password"><el-input show-password="show-password" autocomplete="off" size="large" v-model="data.form.password" placeholder="請輸入密碼" prefix-icon="Lock"></el-input></el-form-item><el-form-item  prop="confirmPassword"><el-input show-password="show-password" autocomplete="off" size="large" v-model="data.form.confirmPassword" placeholder="請再次輸入密碼" prefix-icon="Lock"></el-input>{{data.form.confirmPassword}}</el-form-item><div><el-button size="large" style="width: 48%" type="primary" @click="register()">注 冊</el-button><el-button size="large" style="width: 48%" type="info">取 消</el-button></div><div style="text-align: right;margin-top: 20px;">已有賬號?請<a style="color: #0742b1;text-decoration: none;" href="/login">登錄</a></div></el-form></div></div></div>
</template>
<script setup>
import { reactive,ref} from "vue";
import request from "@/utils/request.js";
import {ElMessage} from "element-plus";const res = ref()const validatePass = (rule, value, callback) => {if (!value) {callback(new Error('請再次輸入密碼'))} else if (value !== data.form.password) {callback(new Error("兩次輸入密碼不一致!"))} else {callback()}
}
const data = reactive({form:{username:'',password:'',confirmPassword:''},rules:{username:[{required:true,message:'請輸入賬號',trigger:'blur'}],password:[{required:true,message:'請輸入密碼',trigger:'blur'}],confirmPassword:[{validator:validatePass,trigger:'blur'}]}
})
const formRef = ref()
const register = () => {formRef.value.validate((valid) => {if (valid) {request.post('/register', data.form).then(res => {if (res.code === '200') {ElMessage.success('注冊成功');location.href = '/login'} else {ElMessage.error(res.msg); // 顯示業務錯誤消息}}).catch(error => {if (error.response) {// 處理 HTTP 錯誤狀態碼(如 400)const { data } = error.response;if (data && data.msg) {ElMessage.error(data.msg); // 顯示后端返回的錯誤消息} else {ElMessage.error('請求失敗,請稍后重試');}} else {ElMessage.error('網絡請求失敗,請檢查網絡連接');}});}});
}</script>
<!--scoped表示當頁生效-->
<style scoped>
.Register_container{height: 100vh;overflow:hidden;background-image: url("@/assets/login_bg.png");background-size:cover ;background-position: 0 -40px;
}
.Register_box{width: 50%;height: 100%;display: flex;align-items: center;right: 0;position: absolute;
}
</style>

3.添加兩個視圖的路由

下面是index.js的完整代碼

import { createRouter, createWebHistory } from 'vue-router'const router = createRouter({history: createWebHistory(import.meta.env.BASE_URL),routes: [{path: '/',redirect: '/login',},{path: '/button',name: 'button',component: () => import('../views/Button.vue'),},{path:'/manager',name:'manager',component:()=>import('../views/Manager.vue'),children:[{path:'/manager/employeeDataOp',name:'employeeDataOp',meta:{title:'員工數據操作'},component:()=>import('../views/employeeDataOp.vue')},{path:'/manager/home',name:'home',meta:{title:'首頁'},component:()=>import('../views/home.vue')},{path:'/manager/adminDataOp',name:'adminDataOp',meta:{title:'管理員數據操作'},component:()=>import('../views/adminDataOp.vue')}]},{path:'/login',name:'login',meta:{title:'登錄界面'},component:()=>import('../views/Login.vue')},{path:'/form',name:'form',component:()=>import('../views/form.vue')},{path:'/register',name:'register',meta:{title:'注冊界面'},component:()=>import('../views/Register.vue')},{path:'/404',name:'404',meta:{title:'404'},component:()=>import('../views/404.vue')},{path:'/:pathMatch(.*)*',redirect:'/404',}],
})
router.beforeEach((to,from,next)=>{document.title=to.meta.title;next()
})export default router

4.后端添加兩個功能的API接口

EmployeeController.java文件

    @PostMapping("/login")public Result login(@RequestBody Employee employee){Employee findEmployee = employeeService.login(employee);return Result.success(findEmployee);}@PostMapping("/register")public Result register(@RequestBody Employee employee){Employee employee1 = employeeService.register(employee);return Result.success(employee1);}

5.為接口添加業務層方法

  public Employee login(Employee employee) {Employee findEmployee = employeeMapper.selectByUsername(employee.getUsername());if (findEmployee == null){throw new ServiceException(ErrorCode.EMPLOYEE_NOT_FOUND);}if (!findEmployee.getPassword().equals(employee.getPassword())){throw new ServiceException(ErrorCode.EMPLOYEE_LOGIN_ERROR);}return findEmployee;}public Employee register(Employee employee){Employee findEmployee = employeeMapper.selectByUsername(employee.getUsername());employee.setRole("EMP");employee.setName("默認名稱");employee.setGender("男");employee.setTitle("普通員工");employee.setBirthday(new Date());if (findEmployee != null){throw new ServiceException(ErrorCode.EMPLOYEE_REGISTER_ERROR_USERNAME);}int row =  employeeMapper.insert(employee);if(row!=1){throw new ServiceException(ErrorCode.EMPLOYEE_ADD_ERROR);}return employee;}

添加依賴

    <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.37</version></dependency>

對這里將原先的EmployeeServcieException.java改為ServcieException.java

然后ErrorCode加幾個常量下面是完整代碼

package com.cdp.zwy.zwy_manager_back_v1.common;/*** @description: 業務異常枚舉類* @author bug制作者* @date 2025/4/6 20:40* @version 1.0*/public enum ErrorCode {NOT_DATA("10000","沒有數據"),EMPLOYEE_NOT_FOUND("10001", "該員工不存在"),EMPLOYEE_ADD_ERROR("10002", "添加員工失敗"),EMPLOYEE_DELETE_ERROR("10003", "刪除員工失敗"),EMPLOYEE_MODIFY_ERROR("10004", "修改員工失敗"),EMPLOYEE_LOGIN_ERROR("10005", "登錄失敗"),EMPLOYEE_REGISTER_ERROR_USERNAME("10006","不能注冊,該用戶已經存在");private final String code;private final String msg;ErrorCode(String code, String msg) {this.code = code;this.msg = msg;}public String getCode() {return code;}public String getMsg() {return msg;}}

測試接口

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/76888.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/76888.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/76888.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Windows】系統安全移除移動存儲設備指南:告別「設備被占用」彈窗

Windows系統安全移除移動存儲設備指南&#xff1a;告別「設備被占用」彈窗 解決移動硬盤和U盤正在被占用無法彈出 一、問題背景 使用Windows系統時&#xff0c;經常遇到移動硬盤/U盤彈出失敗提示「設備正在使用中」&#xff0c;即使已關閉所有可見程序。本文將系統梳理已驗證…

Springboot下載文件, 文件名中文是亂碼, 空格變加號

默認把文件名放上去, 中文會亂碼, 文件名種有空格, 就會被截斷 public void download(HttpServletResponse response){// 文件名先進行url編碼, 避免亂碼問題// 把用%20進行替換fileName URLEncoder.encode(fileName, "UTF-8").replace("", "%20&qu…

MySQL 超詳細安裝教程與常見問題解決方案

一、MySQL 安裝教程 1. Windows 系統安裝&#xff08;以 MySQL 8.0 為例&#xff09; 步驟 1&#xff1a;下載 MySQL Installer 訪問 MySQL 官網下載頁面。 選擇 Windows (x86, 64-bit), MSI Installer&#xff08;推薦使用完整版 mysql-installer-web-community-8.0.xx.xx.…

【cuda學習日記】5.2.1 共享內存額外篇

共享內存(Shared Memory) 1.是一種低延遲、高帶寬的片上內存 2.由同一個Block內的所有線程共享 3.生命周期與Block相同 4.訪問速度比全局內存快約100倍 Block(線程塊) 1.GPU執行的基本單位&#xff0c;包含一組線程 2.多個Block組成Grid(網格) 3.Block內的線程可以通過共享內存…

[250411] Meta 發布 Llama 4 系列 AI 模型 | Rust 1.86 引入重大語言特性

目錄 Llama 4 家族登場&#xff1a;開啟原生多模態 AI 創新新紀元Rust 1.86.0 版本發布亮點主要新特性與改進其他重要信息 Llama 4 家族登場&#xff1a;開啟原生多模態 AI 創新新紀元 Meta AI 近日發布了其最新、最先進的 Llama 4 系列人工智能模型&#xff0c;標志著 AI 技術…

ArrayList 和 數組 的區別

定義與本質 數組&#xff1a;是 Java 語言內置的數據結構&#xff0c;是存儲相同類型元素的連續內存空間。它是一個基本的語言特性&#xff0c;在內存中是一塊連續的區域。ArrayList&#xff1a;是 Java 集合框架中的一個類&#xff0c;屬于動態數組。它是基于數組實現的&#…

??FireCrawl?爬蟲工具?, Craw4ai

?FireCrawl?是一款開源的AI爬蟲工具&#xff0c;專門用于Web數據提取&#xff0c;并將其轉換為Markdown格式或其他結構化數據。FireCrawl特別適合處理使用JavaScript動態生成的網站&#xff0c;能夠自動抓取網站及其所有可訪問的子頁面內容&#xff0c;并將其轉換為適合大語言…

通信原理-非線性調制

今天給大家帶來的是關于通信原理中非線性調制的內容,一起來看看吧&#xff01;&#xff01;&#xff01; 1.角度調制 2.FM與PM的區別 3.單音調制FM 4.窄帶調頻 5.寬帶調頻 5.1FM信號的頻譜 5.2FM信號的帶寬 5.3FM信號的功率分配 6.FM信號的產生與解調 6.1FM信號的產生 6.2FM…

文心一言開發指南03——千帆大模型平臺產品優勢

版權聲明 本文原創作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 千帆大模型平臺作為百度智能云推出的企業級大模型一站式平臺&#xff0c;具有顯著的產品優勢。千帆大模型平臺以其基礎強大、流程完善、運行穩定和安全可靠的產品優勢成為企…

mysql DQL

一.基本查詢 1.查詢多個字段 2.查看所有字段 3.設置別名 4.去除重復記錄 二.條件查詢 1.大于小于等于 2.查詢 身份證為空的 沒有所以沒有記錄 3.在15到20這個區間范圍內 4.or/in 或者 4.like 匹配 &#xff08;_匹配單個字符 %匹配多個字符&#xff09; 查詢員工信…

關于 軟件開發模型 的分類、核心特點及詳細對比分析,涵蓋傳統模型、迭代模型、敏捷模型等主流類型

以下是關于 軟件開發模型 的分類、核心特點及詳細對比分析&#xff0c;涵蓋傳統模型、迭代模型、敏捷模型等主流類型&#xff1a; 一、軟件開發模型分類及核心特點 1. 瀑布模型&#xff08;Waterfall Model&#xff09; 核心特點&#xff1a; 線性階段劃分&#xff1a;需求分…

2025年第十六屆藍橋杯省賽C++ A組真題

2025年第十六屆藍橋杯省賽C A組真題 1.說明2.題目A&#xff1a;尋找質數&#xff08;5分&#xff09;3.題目B&#xff1a;黑白棋&#xff08;5分&#xff09;4. 題目C&#xff1a;抽獎&#xff08;10分&#xff09;5. 題目D&#xff1a;紅黑樹&#xff08;10分&#xff09;6. 題…

JVM初探——走進類加載機制|三大特性 | 打破雙親委派SPI機制詳解

目錄 JVM是什么&#xff1f; 類加載機制 Class裝載到JVM的過程 裝載&#xff08;load&#xff09;——查找和導入class文件 鏈接&#xff08;link&#xff09;——驗證、準備、解析 驗證&#xff08;verify&#xff09;——保證加載類的正確性 準備&#xff08;Prepare&…

分布式微服務系統架構第106集:jt808,補充類加載器

加群聯系作者vx&#xff1a;xiaoda0423 倉庫地址&#xff1a;https://webvueblog.github.io/JavaPlusDoc/ https://1024bat.cn/ 類加載器 類與類加載器 判斷類是否“相等” 任意一個類&#xff0c;都由加載它的類加載器和這個類本身一同確立其在 Java 虛擬機中的唯一性&#xf…

利用 pyecharts 實現地圖的數據可視化——第七次人口普查數據的2d、3d展示(關鍵詞:2d 、3d 、map、 geo、漣漪點)

參考文檔&#xff1a;鏈接: link_pyecharts 官方文檔 1、map() 傳入省份全稱&#xff0c;date_pair 是列表套列表 [ [ ],[ ] … ] 2、geo() 傳入省份簡稱&#xff0c;date_pair 是列表套元組 [ ( ),( ) … ] 1、準備數據 population_data&#xff1a;簡稱經緯度 population_da…

Enovia許可釋放

隨著企業規模的擴大和業務的不斷增長&#xff0c;Enovia許可證的管理變得至關重要。在許多情況下&#xff0c;企業可能面臨許可證資源浪費或不足的問題。為了解決這一問題&#xff0c;Enovia提供了許可釋放功能&#xff0c;幫助企業更加靈活地管理和使用許可證資源。本文將介紹…

每日一道leetcode(回來了!!!)

236. 二叉樹的最近公共祖先 - 力扣&#xff08;LeetCode&#xff09; 題目 給定一個二叉樹, 找到該樹中兩個指定節點的最近公共祖先。 百度百科中最近公共祖先的定義為&#xff1a;“對于有根樹 T 的兩個節點 p、q&#xff0c;最近公共祖先表示為一個節點 x&#xff0c;滿足…

【Redis】布隆過濾器應對緩存穿透的go調用實現

布隆過濾器 https://pkg.go.dev/github.com/bits-and-blooms/bloom/v3 作用&#xff1a; 判斷一個元素是不是在集合中 工作原理&#xff1a; 一個位數組&#xff08;bit array&#xff09;&#xff0c;初始全為0。多個哈希函數&#xff0c;運算輸入&#xff0c;從而映射到位數…

【ROS2】行為樹 BehaviorTree(四):組合使用子樹

1、大樹調用子樹 如下圖,左邊為大樹主干: 1)如果門沒有關,直接通過; 2)如果門關閉了,執行開門動作,然后通過 右邊為子樹,主要任務是開門 1)嘗試直接開門; 2)嘗試開鎖開門,最多嘗試5次; 3)最后嘗試砸門! XML如何描述大樹主干調傭子樹:使用關鍵字 SubTree 來…