6、登录功能后端开发

6、登录功能后端开发

https://xiaoxueblog.com/ai/%E7%99%BB%E5%BD%95%E5%8A%9F%E8%83%BD%E5%90%8E%E7%AB%AF%E5%BC%80%E5%8F%91.html

1、新建用户表SQL脚本

-- CREATE DATABASE aicloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;-- 创建用户表
drop table if exists t_user;
CREATE TABLE `t_user`
(id          bigint      not null comment '主键 ID',`username`  VARCHAR(50) NOT NULL DEFAULT '' COMMENT '用户名',`password`  VARCHAR(200) NOT NULL DEFAULT '' COMMENT '密码',`photo`     VARCHAR(20)          DEFAULT NULL COMMENT '头像',`phone`     VARCHAR(20)          DEFAULT NULL COMMENT '手机',`status`    INT         NOT NULL DEFAULT '1' COMMENT '状态 1、启用 2、禁用',`use_count` INT         NOT NULL DEFAULT '0' COMMENT '每天可以使用大模型的次数',create_id   bigint               DEFAULT null comment '创建人ID',create_by   varchar(30)          DEFAULT null comment '创建人',create_time datetime             DEFAULT null comment '创建时间',update_by   varchar(30)          DEFAULT null comment '修改人',update_time datetime             DEFAULT null comment '修改时间',deleted     smallint             default 0 not null comment '删除 0、否 1、是',PRIMARY KEY (`id`)
) ENGINE = INNODBDEFAULT CHARSET = utf8mb4 COMMENT ='用户表';INSERT INTO t_user (id, username, password, photo, phone, status, use_count, create_id, create_by, create_time, update_by, update_time, deleted) VALUES (1, 'admin', '123456', null, null, 1, 0, null, null, null, null, null, 0);
--INSERT INTO t_user (id, username, password, photo, phone, status, use_count, create_id, create_by, create_time, update_by, update_time, deleted) VALUES (1, 'admin', '$2a$10$UceAABzbebzO5929OXo6auLgqaCOlfbQc6q.G4YqoVcerWPsGuIZa', null, null, 1, 0, null, null, null, null, null, 0);

2、BaseEntity

package com.xx.entities;import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Getter;
import lombok.Setter;import java.util.Date;/*** @Author: xueqimiao* @Date: 2024/11/13 15:55*/
@Setter
@Getter
public class BaseEntity {/*** 创建人ID*/@TableField(fill = FieldFill.INSERT)protected Long createId;/*** 创建人*/@TableField(fill = FieldFill.INSERT)protected String createBy;/*** 创建时间*/@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")@TableField(fill = FieldFill.INSERT)protected Date createTime;/*** 修改人*/@TableField(fill = FieldFill.UPDATE)protected String updateBy;/*** 修改时间*/@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")@TableField(fill = FieldFill.UPDATE)protected Date updateTime;/*** 删除 0、否 1、是*/@JsonIgnore@TableLogic(value = "0", delval = "1")private Integer deleted;
}

3、User

package com.xx.entities;import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;import java.io.Serializable;/*** 用户表** @TableName t_user*/
@TableName(value = "t_user")
@Data
public class User extends BaseEntity implements Serializable {@TableId@Schema(description = "")private Long id;@Schema(description = "用户名")private String username;@Schema(description = "密码")private String password;@Schema(description = "头像")private String photo;@Schema(description = "手机")private String phone;@Schema(description = "状态 1、启用 2、禁用")private Integer status;@Schema(description = "每天可以使用大模型的次数")private Integer useCount;
}
package com.xx.dto;import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;import java.io.Serializable;/*** @Author: xueqimiao* @Date: 2025/3/5 14:34*/
@Data
public class LoginDTO implements Serializable {@Schema(description = "用户名")private String username;@Schema(description = "密码")private String password;
}
package com.xx.vo;import com.baomidou.mybatisplus.annotation.TableId;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;import java.io.Serializable;/*** @Author: xueqimiao* @Date: 2025/3/5 14:38*/
@Data
public class LoginVO implements Serializable {@TableId@Schema(description = "")private Long id;@Schema(description = "用户名")private String username;@Schema(description = "密码")private String password;@Schema(description = "头像")private String photo;@Schema(description = "手机")private String phone;@Schema(description = "状态 1、启用 2、禁用")private Integer status;@Schema(description = "每天可以使用大模型的次数")private Integer useCount;
}

4、UserMapper

package com.xx.mapper;import com.xx.entities.User;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;/*** @author* @description 针对表【t_user(用户表)】的数据库操作Mapper* @createDate 2024-10-05 16:13:06* @Entity com.entities.User*/
public interface UserMapper extends BaseMapper<User> {}

5、UserService

package com.xx.service;import com.xx.dto.LoginDTO;
import com.xx.entities.User;
import com.baomidou.mybatisplus.extension.service.IService;
import com.xx.vo.LoginVO;/*** @author* @description 针对表【t_user(用户表)】的数据库操作Service* @createDate 2024-10-05 16:13:06*/
public interface UserService extends IService<User> {/*** 登录* @param loginDTO* @return*/LoginVO login(LoginDTO loginDTO);
}
package com.xx.service.impl;import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.xx.dto.LoginDTO;
import com.xx.exception.BusinessException;
import com.xx.service.UserService;
import com.xx.entities.User;
import com.xx.mapper.UserMapper;
import com.xx.utils.ValidationUtil;
import com.xx.utils.ValueUtil;
import com.xx.vo.LoginVO;
import org.springframework.stereotype.Service;/*** @author* @description 针对表【t_user(用户表)】的数据库操作Service实现* @createDate 2024-10-05 16:13:06*/
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User>implements UserService {@Overridepublic LoginVO login(LoginDTO loginDTO) {if(ValidationUtil.isEmpty(loginDTO)){throw new BusinessException("请求参数不能为空");}if(ValidationUtil.isEmpty(loginDTO.getUsername()) || ValidationUtil.isEmpty((loginDTO.getPassword()))){throw new BusinessException("用户名或者密码不能为空");}LambdaQueryWrapper<User> queryWrapper = Wrappers.lambdaQuery();queryWrapper.eq(User::getUsername,loginDTO.getUsername());User user = getOne(queryWrapper);if(ValidationUtil.isEmpty(user)){// 这里不要直接报出用户名不存在throw new BusinessException("用户名或者密码错误");}if(!user.getPassword().equals(loginDTO.getPassword())){throw new BusinessException("用户名或者密码错误");}return ValueUtil.copyFieldValue(user,LoginVO.class);}
}

6、UserController

package com.xx.controller;import com.xx.common.Result;
import com.xx.dto.LoginDTO;
import com.xx.service.UserService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;/*** @auther xx* @create 2024-10-03 19:48*/
@RestController
@RequestMapping("/user")
@Tag(name = "用户管理")
public class UserController {@Resourceprivate UserService userService;@Operation(summary = "用户登录")@PostMapping(value = "/login")public Result login(@RequestBody LoginDTO loginDTO) {return Result.ok(userService.login(loginDTO));}
}

7、MybatisPlusConfig

package com.xx.config;import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Configuration;@Configuration
@MapperScan(value = {"com.xx.mapper"})
public class MybatisPlusConfig {}

8、全局异常

package com.xx.config;import com.xx.common.Result;
import com.xx.exception.BusinessException;
import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestControllerAdvice;/*** @Author: xueqimiao* @Date: 2025/3/5 14:48*/
@Slf4j
@RestControllerAdvice
public class GlobalExcHandler {@ExceptionHandler(BusinessException.class)@ResponseStatus(HttpStatus.OK)@ResponseBodypublic Result<String> businessException(BusinessException e, HttpServletRequest request) {log.error("系统异常", e);return Result.error(e.getMessage());}}

9、application.yml

server:port: 8001spring:application:name: xx-ai-cloudai:openai:api-key:   # OpenAI API 密钥base-url: https://gitaigc.com  # OpenAI 基础 URLchat:options:model: gpt-3.5-turboimage:options:model: gpt-4-dalle
#      base-url: https://api.openai.com  # OpenAI 基础 URL# 以下是可选的配置,已经被注释掉# spring.ai.openai.base-url: https://api.openai.com# spring.ai.openai.api-key:# 生成文本(text-to-text)模型配置# spring.ai.openai.chat.options.model: gpt-3.5-turbo# spring.ai.openai.chat.options.temperature: 0.4# 生成图像(text-to-image)模型配置
#      spring.ai.openai.image.options.model: gpt-4-dalle
#      spring.ai.openai.image.options.model: gpt-3.5-turbo# ========================Redis 配置=====================
---
spring:data:redis:host: 127.0.0.1  # Redis 主机password: 123456  # Redis 密码port: 6379  # Redis 端口timeout: 1s  # Redis 连接超时# ========================SQL 初始化配置===================
---
spring:sql:init:mode: always  # 总是初始化数据库schema-locations: classpath:db/init.sql  # 初始化SQL文件位置# ========================数据库配置(Druid + MySQL 8)=======================
---
spring:datasource:type: com.alibaba.druid.pool.DruidDataSource  # 数据源类型driver-class-name: com.mysql.cj.jdbc.Driver  # MySQL JDBC 驱动类名url: jdbc:mysql://127.0.0.1:3306/aicloud?characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true  # 数据库连接 URLusername: root  # 数据库用户名password: mac_root  # 数据库密码druid:test-while-idle: false  # 配置 Druid 数据源的空闲连接检测# ========================MyBatis-Plus 配置===================
mybatis-plus:configuration:map-underscore-to-camel-case: true  # 将数据库表字段的下划线转为驼峰命名法mapper-locations: classpath:mapper/*.xml  # MyBatis 映射器文件的位置type-aliases-package: com.xx.entities  # MyBatis 类型别名包路径# ========================日志配置=======================
logging:level:com.xx: info  # 设置特定包的日志级别# ========================JSON 日期格式配置===================
---
spring:jackson:date-format: yyyy-MM-dd HH:mm:ss  # JSON 日期格式time-zone: GMT+8  # 设置时区为 GMT+8

10、登录页面

<!DOCTYPE html>
<html>
<head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Demo</title><!-- 请勿在项目正式环境中引用该 layui.css 地址 --><link href="/layui/css/layui.css" rel="stylesheet">
</head>
<body>
<style>.demo-login-container{width: 320px; margin: 21px auto 0;}.demo-login-other .layui-icon{position: relative; display: inline-block; margin: 0 2px; top: 2px; font-size: 26px;}
</style>
<form class="layui-form"><div class="demo-login-container"><div class="layui-form-item"><div class="layui-input-wrap"><div class="layui-input-prefix"><i class="layui-icon layui-icon-username"></i></div><input type="text" name="username" value="" lay-verify="required" placeholder="用户名" lay-reqtext="请填写用户名" autocomplete="off" class="layui-input" lay-affix="clear"></div></div><div class="layui-form-item"><div class="layui-input-wrap"><div class="layui-input-prefix"><i class="layui-icon layui-icon-password"></i></div><input type="password" name="password" value="" lay-verify="required" placeholder="密   码" lay-reqtext="请填写密码" autocomplete="off" class="layui-input" lay-affix="eye"></div></div><div class="layui-form-item"><div class="layui-row"><div class="layui-col-xs7"><div class="layui-input-wrap"><div class="layui-input-prefix"><i class="layui-icon layui-icon-vercode"></i></div><input type="text" name="captcha" value="" lay-verify="required" placeholder="验证码" lay-reqtext="请填写验证码" autocomplete="off" class="layui-input" lay-affix="clear"></div></div><div class="layui-col-xs5"><div style="margin-left: 10px;"><img src="https://www.oschina.net/action/user/captcha" onclick="this.src='https://www.oschina.net/action/user/captcha?t='+ new Date().getTime();"></div></div></div></div><div class="layui-form-item"><input type="checkbox" name="remember" lay-skin="primary" title="记住密码"><a href="#forget" style="float: right; margin-top: 7px;">忘记密码?</a></div><div class="layui-form-item"><button class="layui-btn layui-btn-fluid" lay-submit lay-filter="demo-login">登录</button></div><div class="layui-form-item demo-login-other"><label>社交账号登录</label><span style="padding: 0 21px 0 6px;"><a href="javascript:;"><i class="layui-icon layui-icon-login-qq" style="color: #3492ed;"></i></a><a href="javascript:;"><i class="layui-icon layui-icon-login-wechat" style="color: #4daf29;"></i></a><a href="javascript:;"><i class="layui-icon layui-icon-login-weibo" style="color: #cf1900;"></i></a></span><a href="#reg">注册帐号</a></div></div>
</form><!-- 请勿在项目正式环境中引用该 layui.js 地址 -->
<script src="/layui/layui.js"></script>
<script>layui.use(function(){var form = layui.form;var layer = layui.layer;var jQuery = layui.$;// 提交事件form.on('submit(demo-login)', function (data) {var field = data.field; // 获取表单字段值// 此处可执行 Ajax 等操作jQuery.ajax({url: '/user/login',type: 'POST',contentType: 'application/json',data: JSON.stringify(field),success: function (result) {if (result.code == 200) {layer.msg("登录成功: "+result.result.username);} else {layer.msg("登录失败: "+result.code+"\t"+result.message);}}});return false; // 阻止默认 form 跳转});});
</script></body>
</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/80972.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

随机矩阵放大的方式 生成相位数据集,用于相位展开

import os import numpy as np import matplotlib.pyplot as plt from scipy.ndimage import zoom import gc from tqdm import tqdm from zernike import RZerndef wrap_phase(phase):"""将相位包裹到[-π, π]区间"""return np.angle(np.exp(1…

Java面试全记录:Spring Cloud+Kafka+Redis实战解析

Java面试全记录&#xff1a;Spring CloudKafkaRedis实战解析 人物设定 姓名&#xff1a;张伟&#xff08;随机生成唯一姓名&#xff09; 年龄&#xff1a;28岁 学历&#xff1a;硕士 工作年限&#xff1a;5年 工作内容&#xff1a; 基于Spring Cloud搭建微服务架构使用Kafka…

Java Socket编程完全指南:从基础到实战应用

Socket编程是构建网络应用的基石&#xff0c;Java通过java.net包提供了强大的Socket API。本文将深入解析Java Socket类的核心用法&#xff0c;涵盖TCP/UDP协议实现、多线程通信及性能优化技巧&#xff0c;助您快速掌握网络编程精髓。 一、Socket编程核心概念 1.1 网络通信模型…

vue实现导出echarts图片和table表格

安装依赖 "xlsx": "^0.18.5","xlsx-style": "^0.8.13""file-saver": "^2.0.5",工具类 toolUtil const autoHeight () > {let winHeight 0if (window.innerHeight) {winHeight window.innerHeight} else if…

AI预测3D新模型百十个定位预测+胆码预测+去和尾2025年5月15日第78弹

从今天开始&#xff0c;咱们还是暂时基于旧的模型进行预测&#xff0c;好了&#xff0c;废话不多说&#xff0c;按照老办法&#xff0c;重点8-9码定位&#xff0c;配合三胆下1或下2&#xff0c;杀1-2个和尾&#xff0c;再杀6-8个和值&#xff0c;可以做到100-300注左右。 (1)定…

兰亭妙微B端UI设计:融合多元风格,点亮品牌魅力

在B端产品市场&#xff0c;独特的品牌形象是企业脱颖而出的关键。兰亭妙微专注于B端UI设计&#xff0c;通过融合多元风格&#xff0c;为企业点亮品牌魅力&#xff0c;助力品牌价值提升。 兰亭妙微主创团队源自清华&#xff0c;历经多年沉淀&#xff0c;积累了丰富的设计经验。…

MMTEA-DTS--用于多目标多任务优化的基于分解的迁移选择

MMTEA-DTS–用于多目标多任务优化的基于分解的迁移选择 title&#xff1a; Multiobjective Multitasking Optimization With Decomposition-Based Transfer Selection author&#xff1a; Qiuzhen Lin, Zhongjian Wu, Lijia Ma, Maoguo Gong , Jianqiang Li, and Carlos A. C…

Python机器学习笔记(二十三 模型评估与改进-网格搜索)

上一次学习了评估一个模型的泛化能力,现在继续学习通过调参来提升模型的泛化性能。scikit-learn中许多算法的参数设置,在尝试调参之前,重要的是要理解参数的含义。找到一个模型的重要参数(提供最佳泛化性能的参数)的取值是一项棘手的任务,但对于几乎所有模型和数据集来说…

集成DHTMLX 预订排期调度组件实践指南:如何实现后端数据格式转换

在企业级应用中&#xff0c;预订系统&#xff08;Booking System&#xff09;作为典型的调度类应用&#xff0c;广泛用于酒店、会议室、设备预约、医疗排班等业务场景。而DHTMLX Scheduler作为一款功能强大且高度可定制的 JavaScript 日程安排控件&#xff0c;已成为众多开发者…

35页AI应用PPT《DeepSeek如何赋能职场应用》DeepSeek本地化部署与应用案例合集

这份名为《DeepSeek如何赋能职场应用》的PPT文档详细介绍了DeepSeek这一人工智能工具在职场中的多样化应用场景和操作技巧。内容涵盖了从基础模型到深度思考模型的不同功能&#xff0c;以及如何通过提示语技巧实现高效的人机协作。文档还展示了DeepSeek在制作可视化图表、PPT、…

Axure疑难杂症:母版菜单设置打开链接后菜单选中效果

亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢! Axure产品经理精品视频课已登录CSDN可点击学习https://edu.csdn.net/course/detail/40420 课程主题:菜单打开链接后子菜单选中效果 主要内容:母版设计、选中效果 应用场景:页面赋值 案例展示: 案例视频:

1.1 认识编程与C++

认识编程与C教程 目标 理解程序、指令、数据的概念。了解C在现实中的应用场景。学会搭建编程环境&#xff0c;迈出第一步。 一、编程是什么&#xff1f;——给计算机写“魔法指令” 1. 基本概念 程序&#xff1a;一系列指令的集合&#xff0c;像一本“魔法食谱”。 &#x…

centos7部署mysql5.7

1.下载mysql的官方yum源 wget http://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm2.安装yum源 yum -y install mysql57-community-release-el7-11.noarch.rpm3.安装秘钥文件 rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-20224.安装mysql5.7…

javascript —— ! 和 !! 的区别与作用

javascript —— ! 和 !! 的区别与作用 在 JavaScript 里&#xff0c;! 和 !! 是两种不同的逻辑运算符&#xff0c;它们的功能和使用场景有明显区别。 1、 !&#xff08;逻辑非运算符&#xff09; 它的主要作用是 对操作数进行布尔值取反。具体来说&#xff0c;就是 先把操作…

基于互联网和LabVIEW的多通道数据采集系统仿真设计

标题:基于互联网和LabVIEW的多通道数据采集系统仿真设计 内容:1.摘要 在当今科技飞速发展的背景下&#xff0c;多通道数据采集在众多领域有着广泛需求。本研究的目的是设计一个基于互联网和LabVIEW的多通道数据采集系统仿真方案。采用互联网技术实现数据的远程传输与共享&…

前后端设置跨域并从后端允许发送cookie

在java后端创建config文件 package com.zf.demo.config;import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.CorsRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigur…

【Java ee】关于抓包软件Fiddler Classic的安装与使用

Web Debugging Proxy Tool | Fiddler Classic 安装网站↑ 下载好安装包之后&#xff0c;双击一路next就可以了 一、抓包软件 电脑上安装了抓包软件之后&#xff0c;抓包软件就可以监听你的网卡上通过的数据。 本来是你的客户端通过网卡&#xff0c;把数据发给目标服务器&a…

【Java ee初阶】http(1)

HTTP 全称为“超文本传输协议”&#xff0c;由名字可知&#xff0c;这是一个基于文本格式的协议&#xff0c;而TCP&#xff0c;UDP&#xff0c;以太网&#xff0c;IP...都是基于二进制格式的协议。 如何区别该协议是基于哪种格式的协议&#xff1f; 形如这种协议格式&#xf…

登录接口中图片验证码Tesseract-OCR识别Java脚本

项目上移植了研发部的产品&#xff0c;文档不全&#xff0c;项目上验证码功能无法关闭&#xff0c;又要做接口/性能测试&#xff0c;开发不配合&#xff08;作为测试多么无奈&#xff09;&#xff0c;此方法识别命中率不高&#xff0c;仅作借鉴。 版本JDK11 import io.restass…

JS手写代码篇---手写 Object.create

JS手写代码篇 在做手写题的时候&#xff0c;我们要思考两个问题 这个代码的作用是什么能够实现的效果是什么样子 1. 手写 Object.create 思路&#xff1a;创造一个对象&#xff0c;类似于Object.create()方法>将obj作为原型 // 手写 Object.create function create (ob…