Springboot+thymeleaf+layui登录注册demo

本博客介绍了一个基于SpringBoot框架结合Thymeleaf模板引擎、LayUI及JQuery前端框架的项目实践,重点讲解了项目配置、DAO层实现及控制器层的基本操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

新手小白上路,做一次博客记录下开发遇见的问题。

我们选用的框架是springboot,

模板选用是thymeleaf(spring boot默认不支持jsp,当然也可以通过配置来使用,但是官方推荐用thymeleaf模板,就选择了这个。),

前端框架使用了layui和jquery,

数据库选用的是mysql。

整体目录结构。

配置

spring.datasource.driver-class-name = com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/test1?useUnicode=true&characterEncoding=utf-8
spring.datasource.username=root
spring.datasource.password=
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource  
# \u521D\u59CB\u5316\u5927\u5C0F\uFF0C\u6700\u5C0F\uFF0C\u6700\u5927
spring.datasource.initialSize=5    
spring.datasource.minIdle=5    
spring.datasource.maxActive=20    
# \u914D\u7F6E\u83B7\u53D6\u8FDE\u63A5\u7B49\u5F85\u8D85\u65F6\u7684\u65F6\u95F4
spring.datasource.maxWait=60000
mybatis.mapper-locations=classpath*:mapper/*Mapper.xml  
mybatis.type-aliases-package=com.example.demo.entity 

server.port=8080
spring.thymeleaf.cache=false
spring.thymeleaf.prefix=classpath:/templates/
spring.thymeleaf.check-template-location=true
spring.thymeleaf.suffix=.html
spring.thymeleaf.encoding=UTF-8
spring.thymeleaf.servlet.content-type=text/html
spring.thymeleaf.mode=HTML5
spring.mvc.static-path-pattern=/static/**

以上是application配置。

重点是spring.mvc.static-path-pattern=/static/**这句不配置的话加载不到静态资源。

对,我们用到了通用mapper,这里有个要记录的点。

@MapperScan(basePackages = "com.example.demo.dao")
@SpringBootApplication
public class DemoApplication {
	@Autowired
	public static void main(String[] args) {
		SpringApplication.run(DemoApplication.class, args);
	}
}

在启动springboot的文件中要加上注解@MapperScan(basePackages = "com.example.demo.dao")以及对应的dao层的包。

还有一点是扫描dao层接口时,dao层接口不能直接继承mapper,这样会报错的。

baseDao:

public interface BaseMapper <T>extends
        tk.mybatis.mapper.common.BaseMapper<T>,
        SelectByExampleMapper<T>,
        DeleteByExampleMapper<T>,
        SelectCountByExampleMapper<T>,
        UpdateByExampleSelectiveMapper<T>,
        UpdateByExampleMapper<T> {
}

然后你要使用的UserDao进行继承,这样就可以通过扫描。

@Controller
@RequestMapping(value = "/user")
public class DemoController {
    @Autowired
    private UserService userService;
    private static final Logger LOGGER = LoggerFactory.getLogger(DemoController.class);
    @RequestMapping(value = "/hello")
    public String firstController(){
        return "login";
    }
    @RequestMapping(value = "/login")
    public String login(String account, String password, HttpServletRequest request){
        if(account != null && password != null){
           User user =  userService.getUser(account,password);
           request.setAttribute("result",new ResultModle("200","success!",user));
            return "user/user";
        }
        request.setAttribute("result",new ResultModle("404","fail!"));
        return "login";
    }
    @RequestMapping(value = "/returnReg")
    public String returnReg(){
        return "reg";
    }
    @RequestMapping(value = "/checkAccount.action")
    @ResponseBody
    public ResultModle checkAccount(String account){
        System.out.println(account+"sdfhjkasdhjkfdshjkfhjkasfhjkdsadhjkfhjk lsdfhjklsadhjklfkhjsdafweyuiorfgyudvbvh djkhgtfuic vbhnjkds");
        if(userService.checkAccount(account) == 0) {
            return new ResultModle("200", "SUCCESS");
    }
        return new ResultModle("404", "Fail");
    }
}

Cotroller层代码。这里没有什么需要注意的。

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" th:href="@{../static/layui/css/layui.css}"/>
    <style>
        .window{
            width: 400px;
            position: absolute;
            margin-left: -200px;
            margin-top: -80px;
            top: 50%;
            left: 50%;
            display: block;
            z-index: 2000;
            background: #fff;
            padding: 20 0;
        }
    </style>
</head>
<body style="background: #f1f1f1;">
<div class="window">
    <form  class="layui-form" method="post" action="/user/login">
        <div class="layui-form-item" style="margin-right: 100px;margin-top: 20px;">
            <label class="layui-form-label">用户名:</label>
            <div class="layui-input-block">
                <input type="text" name="account" required  lay-verify="required" placeholder="请输入账号" autocomplete="off" class="layui-input">
            </div>
        </div>
        <div class="layui-form-item" >
            <label class="layui-form-label">密    码:</label>
            <div class="layui-input-inline">
                <input type="password" name="password" required lay-verify="required" placeholder="请输入密码" autocomplete="off" class="layui-input">
            </div>
        </div>
        <div class="layui-form-item">
            <input type="checkbox" name="" title="写作" lay-skin="primary" checked>
            <div style="margin-left: 50px;margin-bottom: 10px;" class="layui-unselect layui-form-checkbox" lay-skin="primary"><span>保持登录7天</span><i class="layui-icon"></i></div>
            <div style="text-align: center;">
                <input type="submit" class="layui-btn"  value="登      录"/>
                <a href="/user/returnReg" class="layui-btn">注      册</a>
            </div>
        </div>
    </form>
</div>
</body>
</html>

登录页面代码,这里还没有全部写好。

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" th:href="@{../static/layui/css/layui.css}"/>
    <script type="text/javascript" src="/static/jquery-3.3.1.min.js"></script>
    <script type="text/javascript">
        $(document).ready(function(){
            $("#account").blur(function(){
                $.ajax({
                    url:'/user/checkAccount.action',
                    type:'post',
                    data:{
                        account:$("#account").val()
                    },
                    success:function (data) {
                        if(data.code == 200){
                            alert("账号可以使用");
                            $("#account").css("background-color","#00FF00");
                        }else if(data.code == 404){
                            alert("账号已被注册");
                            $("#account").css("background-color","#FF0000");
                        }
                    }
                })
            });
        });
    </script>
    <style>
        .window{
            width: 400px;
            position: absolute;
            margin-left: -200px;
            margin-top: -80px;
            top: 50%;
            left: 50%;
            display: block;
            z-index: 2000;
            background: #fff;
            padding: 20 0;
        }
    </style>
</head>
<body style="background: #f1f1f1;">
<div class="window">
    <form  class="layui-form" method="post" action="/user/login">
        <div class="layui-form-item" style="margin-right: 100px;margin-top: 20px;">
            <label class="layui-form-label">用户名:</label>
            <div class="layui-input-block">
                <input type="text" name="account" required  lay-verify="required" placeholder="请输入账号" autocomplete="off" class="layui-input" id="account">
            </div>
        </div>
        <div class="layui-form-item" >
            <label class="layui-form-label">密    码:</label>
            <div class="layui-input-inline">
                <input type="password" name="password" required lay-verify="required" placeholder="请输入密码" autocomplete="off" class="layui-input" id="password">
            </div>
        </div>
        <div class="layui-form-item" >
            <label class="layui-form-label">再   次   输   入   密   码:</label>
            <div class="layui-input-inline">
                <input type="password" name="password" required lay-verify="required" placeholder="请输入密码" autocomplete="off" class="layui-input" id="spassword">
            </div>
        </div>
        <div class="layui-form-item">
            <input type="checkbox" name="" title="写作" lay-skin="primary" checked>
            <div style="margin-left: 50px;margin-bottom: 10px;" class="layui-unselect layui-form-checkbox" lay-skin="primary"><span>保持登录7天</span><i class="layui-icon"></i></div>
            <div style="text-align: center;">
                <input type="submit" class="layui-btn"  value="注      测"/>
            </div>
        </div>
    </form>


</div>

</body>
</html>

注册代码。这里有些需要注意的,再写这一块时,我发现两个问题:

1.写的js代码不放到头标签中不能使用,加载不出来。

2.写ajax时,url指定时直接写url:/user/**时模板会找到templates目录下,不能直接找到接口。要在接口后的路径以及url的路径后加上.action才行。

那位大佬看到了帮我解释一下为什么?不胜感激。

以下是基于Spring Boot、FullCalendar和Layui的增删改查完整案例。 1. 创建Spring Boot项目 首先,我们需要创建一个Spring Boot项目。你可以使用Spring Initializr,也可以手动创建项目。 2. 添加依赖 在pom.xml文件中添加以下依赖: ``` <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <dependency> <groupId>org.webjars</groupId> <artifactId>jquery</artifactId> <version>3.6.0</version> </dependency> <dependency> <groupId>org.webjars</groupId> <artifactId>fullcalendar</artifactId> <version>3.10.2</version> </dependency> <dependency> <groupId>org.webjars</groupId> <artifactId>layui</artifactId> <version>2.5.7</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> </dependencies> ``` 3. 创建实体类 创建一个实体类Event,用于表示日历事件: ``` @Entity @Table(name = "event") public class Event { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String title; private Date start; private Date end; private String color; private String description; // getter and setter } ``` 4. 创建Repository 创建一个Repository类EventRepository,用于与数据库进行交互: ``` @Repository public interface EventRepository extends JpaRepository<Event, Long> { } ``` 5. 创建Controller 创建一个Controller类EventController,用于处理HTTP请求: ``` @Controller public class EventController { @Autowired private EventRepository eventRepository; @GetMapping("/") public String index() { return "index"; } @GetMapping("/events") @ResponseBody public List<Event> getEvents() { return eventRepository.findAll(); } @PostMapping("/events") @ResponseBody public Event addEvent(@RequestBody Event event) { return eventRepository.save(event); } @PutMapping("/events/{id}") @ResponseBody public Event updateEvent(@PathVariable Long id, @RequestBody Event event) { event.setId(id); return eventRepository.save(event); } @DeleteMapping("/events/{id}") @ResponseBody public void deleteEvent(@PathVariable Long id) { eventRepository.deleteById(id); } } ``` 6. 创建Thymeleaf模板 创建一个Thymeleaf模板index.html,用于显示日历和表单: ``` <!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>FullCalendar + Layui Demo</title> <link href="/webjars/fullcalendar/3.10.2/fullcalendar.min.css" rel="stylesheet"/> <link href="/webjars/layui/2.5.7/css/layui.css" rel="stylesheet"/> <script src="/webjars/jquery/3.6.0/jquery.min.js"></script> <script src="/webjars/fullcalendar/3.10.2/fullcalendar.min.js"></script> <script src="/webjars/layui/2.5.7/layui.all.js"></script> <script th:inline="javascript"> $(document).ready(function () { var calendar = $('#calendar').fullCalendar({ height: 600, editable: true, eventLimit: true, events: { url: '/events', error: function () { alert('there was an error while fetching events!'); } }, eventDrop: function (event, delta, revertFunc) { updateEvent(event); }, eventResize: function (event, delta, revertFunc) { updateEvent(event); }, eventClick: function (event, jsEvent, view) { layer.open({ type: 1, area: ['500px', '400px'], title: '编辑事件', content: $('#eventForm'), btn: ['保存', '取消'], yes: function (index, layero) { var title = $('#title').val(); var start = $('#start').val(); var end = $('#end').val(); var color = $('#color').val(); var description = $('#description').val(); var eventData; if (title) { eventData = { title: title, start: start, end: end, color: color, description: description }; updateEvent(eventData, event.id); calendar.fullCalendar('renderEvent', eventData, true); } else { alert('请填写标题'); return false; } layer.close(index); } }); $('#title').val(event.title); $('#start').val(moment(event.start).format('YYYY-MM-DD HH:mm:ss')); $('#end').val(moment(event.end).format('YYYY-MM-DD HH:mm:ss')); $('#color').val(event.color); $('#description').val(event.description); } }); $('#addEvent').on('click', function () { layer.open({ type: 1, area: ['500px', '400px'], title: '添加事件', content: $('#eventForm'), btn: ['保存', '取消'], yes: function (index, layero) { var title = $('#title').val(); var start = $('#start').val(); var end = $('#end').val(); var color = $('#color').val(); var description = $('#description').val(); var eventData; if (title) { eventData = { title: title, start: start, end: end, color: color, description: description }; $.ajax({ url: '/events', type: 'POST', contentType: 'application/json', data: JSON.stringify(eventData), success: function (event) { eventData.id = event.id; calendar.fullCalendar('renderEvent', eventData, true); } }); } else { alert('请填写标题'); return false; } layer.close(index); } }); }); function updateEvent(eventData, eventId) { if (eventId) { $.ajax({ url: '/events/' + eventId, type: 'PUT', contentType: 'application/json', data: JSON.stringify(eventData), success: function () { calendar.fullCalendar('refetchEvents'); } }); } else { $.ajax({ url: '/events', type: 'POST', contentType: 'application/json', data: JSON.stringify(eventData), success: function (event) { eventData.id = event.id; calendar.fullCalendar('renderEvent', eventData, true); } }); } } }); </script> </head> <body> <div id="calendar"></div> <div id="eventForm" style="display: none;"> <div class="layui-form-item"> <label class="layui-form-label">标题</label> <div class="layui-input-inline"> <input type="text" id="title" name="title" lay-verify="required" placeholder="请输入标题" autocomplete="off" class="layui-input"/> </div> </div> <div class="layui-form-item"> <label class="layui-form-label">开始时间</label> <div class="layui-input-inline"> <input type="text" id="start" name="start" lay-verify="required" placeholder="请选择开始时间" autocomplete="off" class="layui-input"/> </div> </div> <div class="layui-form-item"> <label class="layui-form-label">结束时间</label> <div class="layui-input-inline"> <input type="text" id="end" name="end" lay-verify="required" placeholder="请选择结束时间" autocomplete="off" class="layui-input"/> </div> </div> <div class="layui-form-item"> <label class="layui-form-label">颜色</label> <div class="layui-input-inline"> <input type="color" id="color" name="color" value="#3788d8" class="layui-input"/> </div> </div> <div class="layui-form-item layui-form-text"> <label class="layui-form-label">备注</label> <div class="layui-input-block"> <textarea id="description" name="description" placeholder="请输入备注" class="layui-textarea"></textarea> </div> </div> </div> <div class="layui-btn-group"> <button class="layui-btn" id="addEvent">添加事件</button> </div> </body> </html> ``` 7. 运行项目 运行项目,访问http://localhost:8080,即可看到一个包含日历和表单的页面。 现在,你可以添加、编辑和删除日历事件了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值