【旅游网】前后端分离——用户管理

news2025/1/19 11:13:02

1、先创建数据库,建立用户表
在这里插入图片描述

2、创建后端项目,这里使用Springboot,创建好controler、mapping、pojo、service四个文件,在实体里创建User类
在这里插入图片描述

package com.example.pjtest.Pojo;

public class User {
    public int id_u;
    public String pwd_u;
    public String name_u;
    public String sex_u;
    public String tel_u;

    public void setSex_u(String sex_u) {
        this.sex_u = sex_u;
    }

    public void setTel_u(String tel_u) {
        this.tel_u = tel_u;
    }

    public String getSex_u() {
        return sex_u;
    }

    public String getTel_u() {
        return tel_u;
    }

    public String getName_u() {
        return name_u;
    }

    public void setName_u(String name_u) {
        this.name_u = name_u;
    }

    public int getId_u() {
        return id_u;
    }

    public String getPwd_u() {
        return pwd_u;
    }

    public void setId_u(int id_u) {
        this.id_u = id_u;
    }

    public void setPwd_u(String pwd_u) {
        this.pwd_u = pwd_u;
    }

    @Override
    public String toString() {
        return "User{" +
                "id_u=" + id_u +
                ", pwd_u='" + pwd_u + '\'' +
                ", name_u='" + name_u + '\'' +
                ", sex_u='" + sex_u + '\'' +
                ", tel_u='" + tel_u + '\'' +
                '}';
    }
}

3、在mapping层写入对用户操作的方法和对数据库操作的语句,用注释写就不用分成两个文件,如:

在最上方写上@Mapper注解(目的就是为了不再写mapper映射文件),在方法里面直接用注解对应用户操作。

package com.example.pjtest.Mapping;

import com.example.pjtest.Pojo.User;
import org.apache.ibatis.annotations.*;

import java.util.List;

@Mapper
public interface UserMapping {
    @Select("select * from users")
//    显示全部用户
    public List<User> selectUser();
    //    用户名查找用户
    @Select("select * from users where name_u=#{name_u}")
    List<User> selectUserbyNamed(String name_u);
//修改用户
    @Update("update users SET name_u=#{name_u},sex_u=#{sex_u},tel_u=#{tel_u} where id_u=#{id_u}")
    int alterUser(int id_u,String name_u,String sex_u,String tel_u);
//增加用户
@Insert("insert into users (name_u,pwd_u) values (#{name_u},#{pwd_u})")
public void addUser(String name_u,String pwd_u);
//按用户名和密码查找用户
    @Select("select name_u from users where name_u=#{name_u} and pwd_u =#{pwd_u}" )
//    String selectUserbyName(String name_u);
    User getlog(@Param("name_u")String name_u, @Param("pwd_u")String pwd_u);
//    用户名查找用户
@Select("select name_u from users where name_u=#{name_u}")
    User selectUserbyName(String name_u);
//按用户名查找用户密码
    @Select("select pwd_u from users  where name_u=#{name_u};")
    User selectPwdbyName(String name_u);
//按id删除用户
    @Delete("delete from users where id_u=#{id_u}")
    int delUser(int id_u);
}

4、在controller层写出对用户操作的方法

在最上方写@Restcontroller(作用等同于@Controller + @ResponseBody。)
在一个类上添加@Controller注解,表明了这个类是一个控制器类。这里省略对Controller注解的说明了。
@ResponseBody表示方法的返回值直接以指定的格式写入Http response body中,而不是解析为跳转路径。
@Autowired可以标注在属性上、方法上和构造器上,来完成自动装配,(当标注的属性是接口时,其实注入的是这个接口的实现类)
@RequestMapping注解是一个用来处理请求地址映射的注解,可用于映射一个请求或一个方法,可以用在类或方法上。(在实际的开发当中,一个控制器中不一定只有一个方法,而这些方法都是用来处理请求的,通过 RequestMapping 注解来处理这些映射请求,也就是通过它来指定控制器可以处理哪些URL请求)

package com.example.pjtest.Controller;

import com.example.pjtest.Mapping.UserMapping;
import com.example.pjtest.Pojo.User;
import com.example.pjtest.Service.UserService;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.io.IOException;
import java.util.List;

@RestController
public class UserController {
    @Autowired
    private UserService userService;

    @RequestMapping("/user")
   public String UserTest(){
        return "vox akuma";
    }

    @RequestMapping("selectUser")
    public List<User> selectUser(){
        List<User> users=userService.selectUser();
//        System.out.println(users);
        return users;
    }

//    用户注册
    @RequestMapping("addUser")
    public int addUser(String name_u,String pwd_u){
//        System.out.println(name_u+pwd_u);
        userService.addUser(name_u,pwd_u);
        return 1;
    }

//    用户登录
    @RequestMapping("/logUser")
//    @CrossOrigin
    public int logUser(String name_u,String pwd_u,HttpServletResponse response){
        response.addHeader(  "Access-Control-Allow-Origin","*");//允许所有来源访同
        response.addHeader(  "Access-Control-Allow-Method","POST,GET");//允许访问的方式
        int a= userService.logUser(name_u,pwd_u);
//       if(a==1){
           logs(HttpServletRequest request, HttpServletResponse response);
//           return "/index";
//       }
//       else{
//           return "no";
//       }
//       open(a,response);
        return a;
    }
//@RequestMapping("ifopen")
//    public int open(int a,HttpServletResponse response){
//    response.addHeader(  "Access-Control-Allow-Origin","*");//允许所有来源访同
//    response.addHeader(  "Access-Control-Allow-Method","POST,GET");//允许访问的方式
//        if(a==1){
//            return 1;
//        }else
//            return 0;
//}
//    public void logUser(String name_u,String pwd_u){
//        int a= userService.logUser(name_u,pwd_u);
        if(a==1){
//           logs(HttpServletRequest request, HttpServletResponse response);
            return "/index";
        }
        else{
            return "no";
        }
//        open(a);
//    }
判断打卡页面
//    @RequestMapping("ifopen")
//    public int open(int a){
//                if(a==1){
           logs(HttpServletRequest request, HttpServletResponse response);
//            return 1;
//        }
//        else{
//            return 0;
//        }
//    }
//    public void logs(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//        request.getRequestDispatcher("http://127.0.0.1:8020/UI/index.html").forward(request,response);
//    }


}

5、在service层建立service接口,和service接口的实现类

@Service注解用于类上,标记当前类是一个service类,加上该注解会将当前类自动注入到spring容器中

package com.example.pjtest.Service;

import com.example.pjtest.Mapping.UserMapping;
import com.example.pjtest.Pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

public interface UserService {
    List<User> selectUser();

    void addUser(String name_u, String pwd_u);

  //  String logUser(String name_u, String pwd_u);

    // boolean logUser(String name_u, String pwd_u);

    int logUser(String name_u, String pwd_u);

    int delUser(int id_u);

    int alterUser(int id_u, String name_u, String sex_u, String tel_u);

    List<User> seleUserbyName(String name_u);

//    List<User> seleUserbyNamed(String name_u);


    @Service
    class userServicelmpi implements UserService{
        @Autowired
     private UserMapping usermapping;
     @Override
     public List<User> selectUser() {
         List<User> users=usermapping.selectUser();
         return users;
     }

//     用户名查询用户

        @Override
        public List<User> seleUserbyName(String name_u) {
            List<User> user=usermapping.selectUserbyNamed(name_u);
             return user;

     }

//        @Override
//        public List<User> seleUserbyNamed(String name_u) {
//            return usermapping.selectUserbyNamed(name_u);
//        }


//     用户修改

        @Override
        public int alterUser(int id_u, String name_u, String sex_u, String tel_u) {
            return usermapping.alterUser(id_u,name_u,sex_u,tel_u);
        }


//     用户登录

        @Override
        public int logUser(String name_u, String pwd_u) {
        User un= usermapping.selectUserbyName(name_u);
        User up= usermapping.selectPwdbyName(name_u);
            //System.out.println(un.name_u+up.pwd_u);
           String uname=un.name_u;
            String upwd=up.pwd_u;
//            System.out.println(uname+"vvv"+upwd);
            if(uname.equals(name_u)&&upwd.equals(pwd_u)){
                System.out.println("yes");
                return 1;
            }else
            {
                System.out.println("no");
                return 0;
            }
        }

//     用户注册
        @Override
        public void addUser(String name_u, String pwd_u) {
            usermapping.addUser(name_u,pwd_u);
        }
//       用户删除
        @Override
        public int delUser(int id_u) {
          return   usermapping.delUser(id_u);
        }
    }
}

以上就是后端代码部分
接下来是前端的代码
1、创建用户登录页面,实现用户登录和注册的功能
html代码:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>登录页面</title>
		<link href="css/login.css"  rel="stylesheet" type="text/css"  />
	<script type="text/javascript" src="js/login.js" ></script>
	<script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js">
    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/1.9.1/jquery.min.js"></script>    
<script>
	    $(function () {
        // 请将jQuery代码书写在这里 ...
        
//      alert('Hello,ailiaili!');
    });
	
</script>
	</head>
	<body>
		<div class="A">
		<div class="Bbox">
		<div class="login_box">
			<div class="context">
				<div class="box1">
				<h1>扫描二维码登录</h1>
				<div class="twod">
					<img src="img/二维码.png"/>
				</div>
				<p>请使用张家界旅游网客户端</p>
			</div>
			<div class="boxs"></div>
			<div class="box2">
				<h1><a id="pwds" onclick="logpwd()">密码登录</a> |<a id="msgs" onclick="logmsg()">短信登录</a> </h1>
				<form target="logf" class="log_form" action=" " method="post" id="loginform_pwd">
					<div class="input_sty">
						<label for="username">账号</label>
					<input name="name_u" id="user_id" class="input_context" type="text" placeholder="请输入账号"  />
					</div>
						<hr />
					<div class="input_sty">
						<label for="userpwd">密码</label>
					<input id="user_pwd" name='pwd_u' class="input_context2" type="password" placeholder="请输入密码"  />
					</div><a href="index.html">忘记密码</a>
					<input class="btn" id="submit2" type="" value="登录"  onmouseover="over2()"  onmouseout="out2()" onclick="op()"/>
					<input class="btn" id="submit1" value="注册" onclick="regs()" onmouseover="over1()"  onmouseout="out1()"/>
				</form>

				<form class="log_form" action="http://127.0.0.1:8088/logUser" method="post" id="loginform_msg">
					<div class="input_sty">
						<label for="username">手机号</label>
					<input name="name_u" id="user_id" class="input_context" type="text" placeholder="请输入手机号"  />
					</div>
						<hr />
					<div class="input_sty">
						<label for="userpwd">验证码</label>
					<input id="user_pwd" name='pwd_u' class="input_context2" type="password" placeholder="请输入验证码"  />
					</div>
					<div id="msg_but" type="button" onclick="msgis()">点击发送验证码</div>
					<input class="btn" id="submit3" type="submit" value="登录" onmouseover="over2()"  onmouseout="out2()"/>
					<input class="btn" id="submit4"  value="注册" onclick="regs()" onmouseover="over1()"  onmouseout="out1()"/>
				</form>

				<div class="other">
					<p>其他方式登录</p>
				<div class="other_context"><img src="img/微博图标2-2.jpg" />
				<a class="a_sty" href="">微博登录</a>
				</div>
				<div class="other_context">
					<img  src="img/微信图标2-2.jpg"/>
					<a class="a_sty" href="">微信登录</a></div>
				<div class="other_context">
					<img src="img/qq图标2-2.jpg" />
					<a class="a_sty" href="">QQ登录</a></div>
				</div>
				<div class="ps">
					<p>未注册过<span>张家界旅游网</span>的手机号,我们将主动帮您注册账号</p>
					<p>登录或完成注册即代表您同意<span>用户协定和隐私政策</span></p>
				</div>
			</div>

			</div>
			
		</div>
		<!--<div class="photo" >
				<img src="img/画板 1.png"  id="img1" />
				<img src="img/画板 2.png" id="img2"/>
			</div>
		<!--<div class="photo" id="img2">
				<img src="img/画板 1.png" id="img1" />
				<img src="img/画板 2.png" />
			</div>-->
			</div>
				<!--<iframe src="" frameborder="0" name="logf"></iframe>-->
			
			<div id="regform" class="reg">
				<form class="res_form" action="http://127.0.0.1:8088/addUser" method="post" id="regform_msg">
					<div class="input_sty">
						<label for="username">账号</label>
					<input name="name_u" id="user_id" class="input_context" type="text" placeholder="请输入手机号"  />
					</div>
						<hr />
					<div class="input_sty">
						<label for="userpwd">密码</label>
					<input id="user_pwd" name='pwd_u' class="input_context2" type="password" placeholder="请输入密码"  />
						<input class="btn" id="submit1" type="submit"  value="确定"/>
						<input class="btn" id="submit1" type="button" onclick="regx()" value="取消"/>
						
						<!--<button type="button" >X</button>-->
						
				</form>
			</div>
	
	</div>
			<!--<button onclick="test()">sadfsadfgds</button>-->
	</body>
</html>

这里的代码就不详细显示了,最主要的是,先看用户登录功能,在html中引入jquery(jQuery 是一个高效、精简并且功能丰富的 JavaScript 工具库。)我是用了 form>表单,输入用户的账号和密码,用<input 当登录按钮,设置点击事件log(),在js文件中,当该事件点击后,在函数log()中,获取表单中,用户的账号和密码,用fetch()或者$.ajax()进行前后端交互,

fetch(‘url’,{
method:‘’,
mode:‘’
}).then(
).catch()

$.ajax({
url:
type:
dataType:
success:function(data){}
error:function(data){}
})

function log(){
		var id=document.getElementById("user_id").value;
		var pwd=document.getElementById("user_pwd").value;
		if(pwd==""||id==""){
		alert("用户或密码不能为空,请重新输入");
	}
$.ajax({
		url: "http://localhost:8088/logUser?name_u="+id+"&pwd_u="+pwd,
		type: "get",
		dataType: "json",
		success: function(data){
			console.log(data);
			if(data==1){
				alert("登录成功");
location.assign('http://127.0.0.1:8020/web_1/index.html');
}
		},
		error:function(data){
			alert("登录失败");
			location.reload();
		}
})
//window.open("index.html");
}

用户注册功能:
在前端html文件中,用<form 表单输入用户账号和密码,在input>标签里分别是账号、密码,其中<form 表单的属性action中,写出对应后端的地址,在input>标签的属性 name,一定要和后端用户实体类的属性名字一致。

<div id="regform" class="reg">
				<form class="res_form" action="http://127.0.0.1:8088/addUser" method="post" id="regform_msg">
					<div class="input_sty">
						<label for="username">账号</label>
					<input name="name_u" id="user_id" class="input_context" type="text" placeholder="请输入手机号"  />
					</div>
						<hr />
					<div class="input_sty">
						<label for="userpwd">密码</label>
					<input id="user_pwd" name='pwd_u' class="input_context2" type="password" placeholder="请输入密码"  />
						<input class="btn" id="submit1" type="submit"  value="确定"/>
						<input class="btn" id="submit1" type="button" onclick="regx()" value="取消"/>
						
						<!--<button type="button" >X</button>-->
						
				</form>
			</div>

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

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

相关文章

SpringBoot 之 Tomcat 与 Undertow 容器性能对比

一、前言&#x1f525; 环境说明&#xff1a;Windows10 Idea2021.3.2 Jdk1.8 SpringBoot 2.3.1.RELEASE 在上一篇《SpringBoot 之配置 Undertow 容器》一文中写道&#xff1a;“Undertow 的性能和内存使用方面都要优于 Tomcat 容器”, 这一期&#xff0c;我就要给大家来求证…

受不了了,被00后卷的想辞职了

在程序员职场上&#xff0c;什么样的人最让人反感呢? 是技术不好的人吗?并不是。技术不好的同事&#xff0c;我们可以帮他。 是技术太强的人吗?也不是。技术很强的同事&#xff0c;可遇不可求&#xff0c;向他学习还来不及呢。 真正让人反感的&#xff0c;是技术平平&…

御剑WEB指纹识别系统教程,图文教程(超详细)

「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 御剑WEB指纹识别 一、基本使用二、内置字典三、自定义字典四、扫描原理 御剑WEB指纹识别系…

php html转pdf wkhtmltopdf

系统CentOS7.6 1.安装 wkhtmltopdf yum install wkhtmltopdf 看别的大佬的教程这步就已经可以正常生成&#xff0c;但我这边运行脚本的时候返回了 "wkhtmltopdf: cannot connect to X server" 2.安装 Xvfb yum install Xvfb 3.运行脚本 xvfb-run --server-ar…

20220912深圳市梧桐山桃花源看植物

20220912深圳市梧桐山桃花源看植物 2023/5/27 13:27 大自然生态探索之旅第3期 明天去梧桐山看植物。有空不&#xff1f; 交通方式&#xff1a; 黄贝岭地铁站C出口坐M445到终点&#xff01; 02木荷 https://baijiahao.baidu.com/s?id1676100940201729045&wfrspider&fo…

人生苦短,我用Python。

人生苦短&#xff0c;我用Python。欢迎大家一起分享&#xff0c;你是如何入门Python的~ 方向一&#xff1a;你是如何学习/自学 Python 的&#xff1f; 偶然的机会接触到python&#xff0c;于是开始利用空闲时间学起了python。自学过2年python&#xff0c;有一些学习心得和避坑…

分布式事务的21种武器 - 6

在分布式系统中&#xff0c;事务的处理分布在不同组件、服务中&#xff0c;因此分布式事务的ACID保障面临着一些特殊难点。本系列文章介绍了21种分布式事务设计模式&#xff0c;并分析其实现原理和优缺点&#xff0c;在面对具体分布式事务问题时&#xff0c;可以选择合适的模式…

Linux——进程轮换

目录 一.进程切换 1.定义&#xff1a; 2.硬件上下文&#xff1a; 总结&#xff1a; 一.进程切换 1.定义&#xff1a; 进程切换(process switch),作为抢占式多任务的一个重要功能&#xff0c;其实质就是OS内核挂起正在运行的进程A,然后将先前被挂起的另一个进程B恢复运行。 2.硬…

天书奇谈3D服务端搭建架设教程Centos

天书奇谈3D服务端搭建架设教程Centos 大家好&#xff0c;我是艾西&#xff0c;今天给大家分享一款回合制MMORPG手游的搭建教程。也算是G 内回合制手游的第一梯队吧&#xff0c;回合制手游总会有那么一帮热爱的玩家我们话不多说直接进入正题开始操作&#xff1a; 架设准备&…

00后们劝你们不要去外包,3年外包,废了....

先说一下自己的情况&#xff0c;专科生&#xff0c;19年通过校招进入杭州某个外包软件公司&#xff0c;干了接近3年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了3年的功…

UNIX网络编程卷一 学习笔记 第十六章 非阻塞式IO

套接字的默认状态是阻塞的&#xff0c;当发出一个不能立即完成的套接字调用时&#xff0c;进程将被投入睡眠&#xff0c;等待相应操作完成。可能阻塞的套接字调用有以下四类&#xff1a; 1.输入操作&#xff1a;包括read、readv、recv、recvfrom、recvmsg函数。如果进程对一个阻…

公司study three

ctrlwind&#xff1a;新建桌面 ctrlwin 箭头 切换桌面 WIN CTRL F4 删除桌面 mybatis-plusstreamlambda lambda遍历 存值 if (bpmBoEntityList ! null && !bpmBoEntityList.isEmpty()) {bpmBoEntityList.forEach(x -> {BpmBoEntityDTO dto new BpmBoEntityDT…

一.《HIT2台服韩服》背包遍历和物品品质潜规则

首先找背包遍历 1.通过物品数量我们入手找 2.首先CE搜索当前药品数量 3.然后消耗一瓶血药 4.CE继续搜索10,你会发现还剩下1423个结果 5.经过我们几次的筛选,最终找到几个结果 6.拿到地址后,我们用XDBG附加游戏后查看这个地址 7.随后我们在这个地址上下写入断点,通过消耗血药,就…

English Learning - L3 作业打卡 Lesson3 Day19 2023.5.23 周二

English Learning - L3 作业打卡 Lesson3 Day19 2023.5.23 周二 引言&#x1f349;句1: She also told us “you have to break some eggs to make an omelet”.成分划分弱读连读爆破语调 &#x1f349;句2: This means you have to do what is necessary to move forward.成分…

English Learning - L3 作业打卡 Lesson3 Day20 2023.5.24 周三

English Learning - L3 作业打卡 Lesson3 Day20 2023.5.24 周三 引言&#x1f349;句1: She would always give us nutritious food.成分划分连读语调 &#x1f349;句2: She liked serving us meat and potatoes for dinner.成分划分弱读连读爆破语调 # &#x1f349;句3: Mea…

ACL 2019 - AMR Parsing as Sequence-to-Graph Transduction

AMR Parsing as Sequence-to-Graph Transduction 论文&#xff1a;https://arxiv.org/pdf/1905.08704.pdf 代码&#xff1a;https://github.com/sheng-z/stog 期刊/会议&#xff1a;ACL 2019 摘要 我们提出了一个基于注意力的模型&#xff0c;将AMR解析视为序列到图的转导。…

Doris---索引

前缀索引 doris中&#xff0c;对于前缀索引有如下约束&#xff1a; 他的索引键最大长度是36个字节 当他遇到了varchar数据类型的时候&#xff0c;即使没有超过36个字节&#xff0c;也会自动截断 示例1:以下表中我们定义了: user_id,age,message作为表的key &#xff1b; C…

【C++】“最强查找“哈希表的底层实现

哈希表的查找的时间复杂度是O&#xff08;1&#xff09;~ 文章目录 前言一、哈希冲突和哈希函数二、哈希表底层实现 1.开放地址法2.链地址法总结 前言 哈希概念&#xff1a; 顺序结构以及平衡树 中&#xff0c;元素关键码与其存储位置之间没有对应的关系&#xff0c;因此在 查…

100道护网面试题大全(附答案)

最近日入1000的护网行动已经开始摇人了&#xff0c; 不少大学生在后台私信我如何参加护网、面试问些什么、有没有护网内推 作为一个负责任的博主&#xff0c;收到大家反馈的我&#xff0c;连夜发动钞能力&#xff0c;收集整理了一套护网蓝初面试文档 1. 什么是DDoS攻击&#x…

深度学习编译器

1.为什么需要深度学习编译器 深度学习编译器主要为解决不同框架下训练的模型部署到指定的某些设备上时所遇到的一系列复杂的问题&#xff0c;即将各种深度学习训练框架的模型部署到各种硬件所面临的问题&#xff1b; 首先深度学习领域&#xff0c;从训练框架看&#xff0c;当前…