1. 简介
登录功能 是一个计算机系统或应用中的关键部分,它允许用户通过提供有效的身份凭证来验证其身份信息, 从而获得对系统 或应用的访问权限,登录通常是许多系统软件应用中的首页步骤。
输入凭证: 用户通过界面输入其登录凭证,通常是用户名和密码。有时候还可能包括其他的身份验证信息,如验证码等身份证验证: 系统使用输入的凭证与事先存储在其数据库中的用户信息进行比对,以验证用户的身份。这可以包括检查用户名和访问授权: 一旦用户的身份得到验证,系统会授予其相应的访问权限。这通常基于用户的角色和权限设置创建会话: 登录成功后,系统会为用户创建一个会话,该会话在用户与系统交互的过程中保持有效。这有助于在用户访问多个自定义错误页面 页面或执行多个操作时保持其身份状态
登录功能作用: 对于保护用户隐私和系统安全至关重要,因此它通常涉及多层安全措施。
- 包括
密码加密、防暴力破解措施、会话管理等。
2. 静态文件配置
在 resources项目目录,创建一个 static文件目录, 用于存放静态资源相关的文件。
- 主要包含
css、font、images、js等其他静态资源相关的文件。

静态资源处理
addResourceHandler: 静态资源处理 避免静态资源被拦截
java
package com.calvin.spring.boot.example.thymeleaf.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.util.ResourceUtils;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
/**
* Web MVC配置
*
* @author Calvin
* @date 2024/2/5
* @since v1.0.0
*/
@Configuration
public class MyWebMvcConfiguration extends WebMvcConfigurationSupport {
/**
* 添加-静态资源处理
*
* @param registry 注册表
*/
@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
// 静态资源处理 避免静态资源被拦截
registry.addResourceHandler("/static/**").addResourceLocations(ResourceUtils.CLASSPATH_URL_PREFIX + "/static/");
registry.addResourceHandler("/assets/**").addResourceLocations(ResourceUtils.CLASSPATH_URL_PREFIX + "/assets/");
registry.addResourceHandler("/devops/**").addResourceLocations(ResourceUtils.CLASSPATH_URL_PREFIX + "/devops/");
registry.addResourceHandler("/templates/**").addResourceLocations(ResourceUtils.CLASSPATH_URL_PREFIX + "/templates/");
super.addResourceHandlers(registry);
}
}3. 开发流程
修改配置文件
yaml
server:
port: 8080
# 错误页面跳转
error:
path: /error
# 数据源配置
spring:
# 服务名称
application:
name: AppExample03
# 配置 MYSQL 连接
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/spring-boot?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
username: root
password: cw123789L
# 热部署
devtools:
# 自动重启
restart:
enabled: true
# Thymeleaf 模板引擎配置
thymeleaf:
# 文件后后缀路径
prefix: classpath:/templates/
# 文件后缀添加 .html
suffix: .html
# 关闭缓存 (开发环境)正式环境需开启
cache: false
# MyBatis Plus 配置
mybatis-plus:
configuration:
# 控制台日志输出
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
# 映射的Mapper.xml 文件
mapper-locations: classpath*:/mapper/**/*.xml
# 日志配置
logging:
level:
# 项目输出为 WARN
root: warn
# mybatis 输出为 INFO
mybatis: INFO
# Spring WEB 输出为 Debug
org.springframework.web: debug
# Tomcat 输出为 TRACE
tomcat: trace
# 文件输出
file:
# 文件名
name: /Users/calvin/学习/01-后端开发/Java/03-框架知识/Spring Boot/spring-boot-2.x/spring-boot-example-03-logback/log/${spring.application.name}
# tomcat 分组
# group:
# tomcat: org.apache.catalina,org.apache.coyote,org.apache.tomcat
# 自定义日志配置文件
config: classpath:logback-spring.xml
# actuator 监视器配置
management:
# 配置端点的启用
endpoint:
health:
# 暴露详细信息。
show-details: always
# 使应用程序正常关闭。 (默认情况下禁用)
shutdown:
enabled: true
# 显示应用程序信息
info:
enabled: true
# 禁用所有其他端点
# endpoints:
# enabled-by-default: false
endpoints:
# web 访问
web:
# 暴露端点
exposure:
# 公共所有
include: "*" # * 在yaml 文件属于关键字,所以需要加引号
# 不包含的内置 env 和 beans
exclude: env,beans
# 跨域配置
cors:
# 允许GET、POST 请求
allowed-methods: GET,POST
# 跨域的域名
allowed-origins: http://localhost:8080后台管理-新建包结构

目录说明:
abstracts: 用于存放抽象相关的类。admin: 用于编写后台管理相关业务。api: 通用api用于接口编写,不同的业务需要可以实现该通用 api。config: 通用的配置类。handler: 通用的处理器。
通用登录接口
java
package com.calvin.spring.boot.example.thymeleaf.api;
import com.calvin.spring.boot.example.thymeleaf.api.pojo.dto.UserDTO;
/**
* 登录-API
*
* @author Calvin
* @date 2024/1/31
* @since v1.0.0
*/
public interface LoginApi {
/**
* 登录
*
* @param username 用户名
* @param password 密码
* @return {@link UserDTO} 通用的用户传输对象
*/
UserDTO login(String username, String password);
}实现-管理后台-登录业务接口
java
package com.calvin.spring.boot.example.thymeleaf.admin.service;
import com.calvin.spring.boot.example.thymeleaf.api.LoginApi;
/**
* 登录业务-接口
*
* @author Calvin
* @date 2024/1/31
* @since v1.0.0
*/
public interface SysUserLoginService extends LoginApi {
}java
package com.calvin.spring.boot.example.thymeleaf.admin.service.impl;
import com.calvin.spring.boot.example.thymeleaf.admin.service.SysUserLoginService;
import com.calvin.spring.boot.example.thymeleaf.admin.service.SysUserService;
import com.calvin.spring.boot.example.thymeleaf.api.pojo.dto.UserDTO;
import com.calvin.spring.boot.example.thymeleaf.handler.BusinessException;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
/**
* 登录业务-实现类
*
* @author Calvin
* @date 2024/1/31
* @since v1.0.0
*/
@Service
public class SysUserLoginServiceImpl implements SysUserLoginService {
@Resource
SysUserService sysUserService;
@Override
public UserDTO login(String username, String password) {
UserDTO userDTO = sysUserService.getOneByAccount(username);
if (userDTO == null) {
throw new BusinessException("用户账号或密码错误,请重新输入!");
}
return userDTO;
}
}实现-后台管理-登录界面
- 在
resource资源文件下中的,templates中创建一个admin目录,在该目录下创建login.html文件。
html
<!DOCTYPE html>
<html lang="en">
<!-- Mirrored from techzaa.getappui.com/velonic/layouts/auth-login.html by HTTrack Website Copier/3.x [XR&CO'2014], Fri, 25 Aug 2023 12:34:33 GMT -->
<head>
<meta charset="utf-8" />
<title>Spring Boot Thymeleaf Admin | 登录</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta content="Spring Boot Thymeleaf Admin" name="description" />
<meta content="Calvin" name="author" />
<!-- App favicon -->
<link rel="shortcut icon" th:href="@{/static/admin/images/favicon.ico}">
<!-- Theme Config Js -->
<script th:src="@{/static/admin/js/config.js}"></script>
<!-- App css -->
<link th:href="@{/static/admin/css/app.min.css}" rel="stylesheet" type="text/css" id="app-style" />
<!-- Icons css -->
<link th:href="@{/static/admin/css/icons.min.css}" rel="stylesheet" type="text/css" />
</head>
<body class="authentication-bg position-relative">
<div class="account-pages pt-2 pt-sm-5 pb-4 pb-sm-5 position-relative">
<div class="container">
<div class="row justify-content-center">
<div class="col-xxl-8 col-lg-10">
<div class="card overflow-hidden">
<div class="row g-0">
<div class="col-lg-6 d-none d-lg-block p-2">
<img th:src="@{/static/admin/images/auth-img.jpg}" alt="" class="img-fluid rounded h-100">
</div>
<div class="col-lg-6">
<div class="d-flex flex-column h-100">
<div class="auth-brand p-4">
<a href="index.html" class="logo-light">
<img th:src="@{/static/admin/images/logo.png}" alt="logo" height="22">
</a>
<a href="index.html" class="logo-dark">
<img th:src="@{/static/admin/images/logo-dark.png}" alt="dark logo" height="22">
</a>
</div>
<div class="p-4 my-auto">
<h4 class="fs-20">注册</h4>
<p class="text-muted mb-3">输入您的电子邮件地址和密码访问帐户。</p>
<!-- form -->
<form action="/admin/login" method="post"> // [!code focus]
<div class="mb-3">
<label for="emailaddress" class="form-label">账号</label>
<input class="form-control" type="text" id="emailaddress" name="account" required="" // [!code focus]
placeholder="输入你的邮箱地址"> // [!code focus]
</div>
<div class="mb-3">
<a href="auth-forgotpw.html" class="text-muted float-end"><small>忘记密码?</small></a>
<label for="password" class="form-label">密码</label>
<input class="form-control" type="password" required="" id="password" // [!code focus]
name="password" placeholder="输入你的密码"> // [!code focus]
</div>
<div class="mb-3">
<div class="form-check">
<input type="checkbox" class="form-check-input"
id="checkbox-signin">
<label class="form-check-label" for="checkbox-signin">记住我</label>
</div>
</div>
<div class="mb-0 text-start">
<button class="btn btn-soft-primary w-100" type="submit"><i
class="ri-login-circle-fill me-1"></i> <span class="fw-bold">登录</span> </button>
</div>
<div class="text-center mt-4">
<p class="text-muted fs-16">注册</p>
<div class="d-flex gap-2 justify-content-center mt-3">
<a href="javascript: void(0);" class="btn btn-soft-primary"><i
class="ri-facebook-circle-fill"></i></a>
<a href="javascript: void(0);" class="btn btn-soft-danger"><i
class="ri-google-fill"></i></a>
<a href="javascript: void(0);" class="btn btn-soft-info"><i
class="ri-twitter-fill"></i></a>
<a href="javascript: void(0);" class="btn btn-soft-dark"><i
class="ri-github-fill"></i></a>
</div>
</div>
</form>
<!-- end form-->
</div>
</div>
</div> <!-- end col -->
</div>
</div>
</div>
<!-- end row -->
</div>
<div class="row">
<div class="col-12 text-center">
<p class="text-dark-emphasis">没有账号? <a href="auth-register.html"
class="text-dark fw-bold ms-1 link-offset-3 text-decoration-underline"><b>注册</b></a>
</p>
</div> <!-- end col -->
</div>
<!-- end row -->
</div>
<!-- end container -->
</div>
<!-- end page -->
<footer class="footer footer-alt fw-medium">
<span class="text-dark">
<script>document.write(new Date().getFullYear())</script> © Velonic - Theme by Techzaa
</span>
</footer>
<!-- Vendor js -->
<script th:src="@{/static/admin/js/vendor.min.js}"></script>
<!-- App js -->
<script th:src="@{/static/admin/js/app.min.js}"></script>
</body>
<!-- Mirrored from techzaa.getappui.com/velonic/layouts/auth-login.html by HTTrack Website Copier/3.x [XR&CO'2014], Fri, 25 Aug 2023 12:34:33 GMT -->
</html>编写-后台管理-登录控制器
java
package com.calvin.spring.boot.example.thymeleaf.admin.controller;
import com.calvin.spring.boot.example.thymeleaf.admin.service.SysUserLoginService;
import com.calvin.spring.boot.example.thymeleaf.api.pojo.SysUserRequest;
import com.calvin.spring.boot.example.thymeleaf.api.pojo.dto.UserDTO;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.annotation.Resource;
import javax.servlet.http.HttpSession;
/**
* 管理员登录控制器
*
* @author Calvin
* @date 2024/2/5
* @since v1.0.0
*/
@Controller
@RequestMapping("/admin")
public class AdminLoginController {
@Resource
SysUserLoginService sysUserLoginService;
/**
* 跳转登录页面
*
* @param model 模型
* @return {@link String}
*/
@GetMapping("/login")
public String login(Model model){
return "/admin/login";
}
/**
* 登录业务
*
* @param model 模型
* @param request 请求参数
* @return {@link String}
*/
@PostMapping("/login")
public String login(Model model, SysUserRequest request, HttpSession session){
UserDTO user = sysUserLoginService.login(request.getAccount(), request.getPassword());
// 传统方式: session, 在一定时间内设别用户是谁
session.setAttribute("user", user);
// 重定向回【首页】
return "redirect:/admin/index";
}
}4. 自定义错误页面
在
resource资源文件下中的,templates中创建一个error目录,在该目录下创建500.html、404.html文件。404.html
html
<!DOCTYPE html>
<html lang="cn">
<!-- Mirrored from techzaa.getappui.com/velonic/layouts/error-404.html by HTTrack Website Copier/3.x [XR&CO'2014], Fri, 25 Aug 2023 12:34:31 GMT -->
<head>
<meta charset="utf-8" />
<title>Spring Boot Thymeleaf Admin | ERROR 404</title>
<meta name="" content="width=device-width, initial-scale=1.0" />
<meta content="Spring Boot Thymeleaf" name="description" />
<meta content="Calvin" name="author" />
<!-- App favicon -->
<link rel="shortcut icon" th:href="assets/images/favicon.ico" />
<!-- Theme Config Js -->
<script th:src="@{/static/admin/js/config.js}"></script>
<!-- App css -->
<link
th:href="@{/static/admin/css/app.min.css}"
rel="stylesheet"
type="text/css"
id="app-style"
/>
<!-- Icons css -->
<link th:href="@{/static/admin/css/icons.min.css}" rel="stylesheet" type="text/css" />
</head>
<body class="authentication-bg">
<div class="account-pages pt-2 pt-sm-5 pb-4 pb-sm-5 position-relative">
<div class="container">
<div class="row justify-content-center">
<div class="col-xxl-8 col-lg-10">
<div class="card overflow-hidden">
<div class="row g-0">
<div class="col-lg-6 d-none d-lg-block p-2">
<img
th:src="@{/static/admin/images/auth-img.jpg}"
alt=""
class="img-fluid rounded h-100"
/>
</div>
<div class="col-lg-6">
<div class="d-flex flex-column h-100">
<div class="auth-brand p-4">
<a href="index.html" class="logo-light">
<img th:src="@{/static/admin/images/logo.png}" alt="logo" height="22" />
</a>
<a href="index.html" class="logo-dark">
<img
th:src="@{/static/admin/images/logo-dark.png}"
alt="dark logo"
height="22"
/>
</a>
</div>
<div class="p-4 my-auto">
<div class="d-flex justify-content-center mb-5">
<img
th:src="@{/static/admin/images/svg/404.svg}"
alt=""
class="img-fluid"
/>
</div>
<div class="text-center">
<h1 class="mb-3">404</h1>
<h4 class="fs-20">Page not found</h4>
<p class="text-muted mb-3">
It's looking like you may have taken a wrong turn. Don't worry... it
happens to the best of us.
</p>
</div>
<a href="index.html" class="btn btn-soft-primary w-100">
<i class="ri-home-4-line me-1"></i>
Back to Home
</a>
</div>
</div>
</div>
<!-- end col -->
</div>
</div>
</div>
<!-- end row -->
</div>
</div>
<!-- end container -->
</div>
<!-- end page -->
<footer class="footer footer-alt fw-medium">
<span class="text-dark-emphasis">
<script>
document.write(new Date().getFullYear())
</script>
© Velonic - Theme by Techzaa
</span>
</footer>
<!-- Vendor js -->
<script th:src="@{/static/admin/js/vendor.min.js}"></script>
<!-- App js -->
<script th:src="@{/static/admin/js/app.min.js}"></script>
</body>
<!-- Mirrored from techzaa.getappui.com/velonic/layouts/error-404.html by HTTrack Website Copier/3.x [XR&CO'2014], Fri, 25 Aug 2023 12:34:32 GMT -->
</html>500.html
html
<!DOCTYPE html>
<html lang="en">
<!-- Mirrored from techzaa.getappui.com/velonic/layouts/error-500.html by HTTrack Website Copier/3.x [XR&CO'2014], Fri, 25 Aug 2023 12:34:32 GMT -->
<head>
<meta charset="utf-8" />
<title>Spring Boot Thymeleaf Admin | ERROR 500</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta content="Spring Boot Thymeleaf" name="description" />
<meta content="Calvin" name="author" />
<!-- App favicon -->
<link rel="shortcut icon" th:ref="@{/static/admin/images/favicon.ico}">
<!-- Theme Config Js -->
<script th:src="@{/static/admin/js/config.js}"></script>
<!-- App css -->
<link th:href="@{/static/admin/css/app.min.css}" rel="stylesheet" type="text/css" id="app-style" />
<!-- Icons css -->
<link th:href="@{/static/admin/css/icons.min.css}" rel="stylesheet" type="text/css" />
</head>
<body class="authentication-bg">
<div class="account-pages pt-2 pt-sm-5 pb-4 pb-sm-5 position-relative">
<div class="container">
<div class="row justify-content-center">
<div class="col-xxl-8 col-lg-10">
<div class="card overflow-hidden">
<div class="row g-0">
<div class="col-lg-6 d-none d-lg-block p-2">
<img th:src="@{/static/admin/images/auth-img.jpg}" alt="" class="img-fluid rounded h-100">
</div>
<div class="col-lg-6">
<div class="d-flex flex-column h-100">
<div class="auth-brand p-4">
<a href="index.html" class="logo-light">
<img th:src="@{/static/admin/images/logo.png}" alt="logo" height="22">
</a>
<a href="index.html" class="logo-dark">
<img th:src="@{/static/admin/images/logo-dark.png}" alt="dark logo" height="22">
</a>
</div>
<div class="p-4 my-auto">
<div class="d-flex justify-content-center mb-5">
<img th:src="@{/static/admin/images/svg/500.svg}" alt="" class="img-fluid">
</div>
<div class="text-center">
<h1 class="mb-3">500</h1>
<h4 class="fs-20">服务器内部错误</h4>
<p class="text-muted mb-3" th:text="${error}"> 为什么不尝试刷新页面呢? 或者你可以联系<a href="javascript: void(0);" class="text-primary"><b>Support</b></a></p> // [!code focus]
</div>
<a href="index.html" class="btn btn-soft-primary w-100"><i class="ri-home-4-line me-1"></i> Back to Home</a>
</div>
</div>
</div> <!-- end col -->
</div>
</div>
</div>
<!-- end row -->
</div>
</div>
<!-- end container -->
</div>
<!-- end page -->
<footer class="footer footer-alt fw-medium">
<span class="text-dark-emphasis">
<script>document.write(new Date().getFullYear())</script> © Velonic - Theme by Techzaa
</span>
</footer>
<!-- Vendor js -->
<script th:src="@{/static/admin/js/vendor.min.js}"></script>
<!-- App js -->
<script th:src="@{/static/admin/js/app.min.js}"></script>
</body>
<!-- Mirrored from techzaa.getappui.com/velonic/layouts/error-500.html by HTTrack Website Copier/3.x [XR&CO'2014], Fri, 25 Aug 2023 12:34:33 GMT -->
</html>5. 处理全局异常
java
package com.calvin.spring.boot.example.thymeleaf.handler;
/**
* 业务异常
*
* @author Calvin
* @date 2024/2/6
* @since v1.0.0
*/
public class BusinessException extends RuntimeException{
public BusinessException(String message) {
super(message);
}
public BusinessException(String message, Throwable cause) {
super(message, cause);
}
}java
package com.calvin.spring.boot.example.thymeleaf.handler;
/**
* 业务异常
*
* @author Calvin
* @date 2024/2/6
* @since v1.0.0
*/
public class BusinessException extends RuntimeException{
public BusinessException(String message) {
super(message);
}
public BusinessException(String message, Throwable cause) {
super(message, cause);
}
}6. 登录正常,跳转首页
html
<!DOCTYPE html>
<html lang="en">
<!-- Mirrored from techzaa.getappui.com/velonic/layouts/index.html by HTTrack Website Copier/3.x [XR&CO'2014], Fri, 25 Aug 2023 12:12:59 GMT -->
<head>
<meta charset="utf-8" />
<title>Dashboard | Velonic - Bootstrap 5 Admin & Dashboard Template</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta content="Spring Boot Thymeleaf " name="description" />
<meta content="Calvin" name="author" />
<!-- App favicon -->
<link rel="shortcut icon" th:href="@{/static/admin/images/favicon.ico}">
<!-- Daterangepicker css -->
<link rel="stylesheet" th:href="@{/static/admin/vendor/daterangepicker/daterangepicker.css}">
<!-- Vector Map css -->
<link rel="stylesheet" th:href="@{/static/admin/vendor/admin-resources/jquery.vectormap/jquery-jvectormap-1.2.2.css}">
<!-- Theme Config Js -->
<script src="@{/static/admin/js/config.js"></script>
<!-- App css -->
<link th:href="@{/static/admin/css/app.min.css}" rel="stylesheet" type="text/css" id="app-style" />
<!-- Icons css -->
<link th:href="@{/static/admin/css/icons.min.css}" rel="stylesheet" type="text/css" />
</head>
<body>
<!-- Begin page -->
<div class="wrapper">
<!-- ========== Topbar Start ========== -->
<div class="navbar-custom">
<div class="topbar container-fluid">
<div class="d-flex align-items-center gap-1">
<!-- Topbar Brand Logo -->
<div class="logo-topbar">
<!-- Logo light -->
<a href="index.html" class="logo-light">
<span class="logo-lg">
<img th:src="@{/static/admin/images/logo.png}" alt="logo">
</span>
<span class="logo-sm">
<img th:src="@{/static/admin/images/logo-sm.png}" alt="small logo">
</span>
</a>
<!-- Logo Dark -->
<a href="index.html" class="logo-dark">
<span class="logo-lg">
<img th:src="@{/static/admin/images/logo-dark.png}" alt="dark logo">
</span>
<span class="logo-sm">
<img th:src="@{/static/admin/images/logo-sm.png}" alt="small logo">
</span>
</a>
</div>
<!-- Sidebar Menu Toggle Button -->
<button class="button-toggle-menu">
<i class="ri-menu-line"></i>
</button>
<!-- Horizontal Menu Toggle Button -->
<button class="navbar-toggle" data-bs-toggle="collapse" data-bs-target="#topnav-menu-content">
<div class="lines">
<span></span>
<span></span>
<span></span>
</div>
</button>
<!-- Topbar Search Form -->
<div class="app-search d-none d-lg-block">
<form>
<div class="input-group">
<input type="search" class="form-control" placeholder="Search...">
<span class="ri-search-line search-icon text-muted"></span>
</div>
</form>
</div>
</div>
<ul class="topbar-menu d-flex align-items-center gap-3">
<li class="dropdown d-lg-none">
<a class="nav-link dropdown-toggle arrow-none" data-bs-toggle="dropdown" href="#" role="button"
aria-haspopup="false" aria-expanded="false">
<i class="ri-search-line fs-22"></i>
</a>
<div class="dropdown-menu dropdown-menu-animated dropdown-lg p-0">
<form class="p-3">
<input type="search" class="form-control" placeholder="Search ..."
aria-label="Recipient's username">
</form>
</div>
</li>
<li class="dropdown">
<a class="nav-link dropdown-toggle arrow-none" data-bs-toggle="dropdown" href="#" role="button"
aria-haspopup="false" aria-expanded="false">
<img th:src="@{/static/admin/images/flags/us.jpg}" alt="user-image" class="me-0 me-sm-1" height="12">
<span class="align-middle d-none d-lg-inline-block">English</span> <i
class="ri-arrow-down-s-line d-none d-sm-inline-block align-middle"></i>
</a>
<div class="dropdown-menu dropdown-menu-end dropdown-menu-animated">
<!-- item-->
<a href="javascript:void(0);" class="dropdown-item">
<img th:src="@{/static/admin/images/flags/germany.jpg}" alt="user-image" class="me-1" height="12"> <span
class="align-middle">German</span>
</a>
<!-- item-->
<a href="javascript:void(0);" class="dropdown-item">
<img th:src="@{/static/admin/images/flags/italy.jpg}" alt="user-image" class="me-1" height="12"> <span
class="align-middle">Italian</span>
</a>
<!-- item-->
<a href="javascript:void(0);" class="dropdown-item">
<img th:src="@{/static/admin/images/flags/spain.jpg}" alt="user-image" class="me-1" height="12"> <span
class="align-middle">Spanish</span>
</a>
<!-- item-->
<a href="javascript:void(0);" class="dropdown-item">
<img th:src="@{/static/admin/images/flags/russia.jpg}" alt="user-image" class="me-1" height="12"> <span
class="align-middle">Russian</span>
</a>
</div>
</li>
<li class="dropdown notification-list">
<a class="nav-link dropdown-toggle arrow-none" data-bs-toggle="dropdown" href="#" role="button"
aria-haspopup="false" aria-expanded="false">
<i class="ri-mail-line fs-22"></i>
<span class="noti-icon-badge badge text-bg-purple">4</span>
</a>
<div class="dropdown-menu dropdown-menu-end dropdown-menu-animated dropdown-lg py-0">
<div class="p-2 border-top-0 border-start-0 border-end-0 border-dashed border">
<div class="row align-items-center">
<div class="col">
<h6 class="m-0 fs-16 fw-semibold"> Messages</h6>
</div>
<div class="col-auto">
<a href="javascript: void(0);" class="text-dark text-decoration-underline">
<small>Clear All</small>
</a>
</div>
</div>
</div>
<div style="max-height: 300px;" data-simplebar>
<!-- item-->
<a href="javascript:void(0);"
class="dropdown-item p-0 notify-item read-noti card m-0 shadow-none">
<div class="card-body">
<div class="d-flex align-items-center">
<div class="flex-shrink-0">
<div class="notify-icon">
<img th:src="@{/static/admin/images/users/avatar-1.jpg}" class="img-fluid rounded-circle"
alt="" />
</div>
</div>
<div class="flex-grow-1 text-truncate ms-2">
<h5 class="noti-item-title fw-semibold fs-14">Cristina Pride <small
class="fw-normal text-muted float-end ms-1">1 day ago</small></h5>
<small class="noti-item-subtitle text-muted">Hi, How are you? What about our
next meeting</small>
</div>
</div>
</div>
</a>
<!-- item-->
<a href="javascript:void(0);"
class="dropdown-item p-0 notify-item read-noti card m-0 shadow-none">
<div class="card-body">
<div class="d-flex align-items-center">
<div class="flex-shrink-0">
<div class="notify-icon">
<img th:src="@{/static/admin/images/users/avatar-2.jpg}" class="img-fluid rounded-circle"
alt="" />
</div>
</div>
<div class="flex-grow-1 text-truncate ms-2">
<h5 class="noti-item-title fw-semibold fs-14">Sam Garret <small
class="fw-normal text-muted float-end ms-1">2 day ago</small></h5>
<small class="noti-item-subtitle text-muted">Yeah everything is fine</small>
</div>
</div>
</div>
</a>
<!-- item-->
<a href="javascript:void(0);"
class="dropdown-item p-0 notify-item read-noti card m-0 shadow-none">
<div class="card-body">
<div class="d-flex align-items-center">
<div class="flex-shrink-0">
<div class="notify-icon">
<img th:src="@{/static/admin/images/users/avatar-3.jpg}" class="img-fluid rounded-circle"
alt="" />
</div>
</div>
<div class="flex-grow-1 text-truncate ms-2">
<h5 class="noti-item-title fw-semibold fs-14">Karen Robinson <small
class="fw-normal text-muted float-end ms-1">2 day ago</small></h5>
<small class="noti-item-subtitle text-muted">Wow that's great</small>
</div>
</div>
</div>
</a>
<!-- item-->
<a href="javascript:void(0);"
class="dropdown-item p-0 notify-item read-noti card m-0 shadow-none">
<div class="card-body">
<div class="d-flex align-items-center">
<div class="flex-shrink-0">
<div class="notify-icon">
<img th:src="@{/static/admin/images/users/avatar-4.jpg}" class="img-fluid rounded-circle"
alt="" />
</div>
</div>
<div class="flex-grow-1 text-truncate ms-2">
<h5 class="noti-item-title fw-semibold fs-14">Sherry Marshall <small
class="fw-normal text-muted float-end ms-1">3 day ago</small></h5>
<small class="noti-item-subtitle text-muted">Hi, How are you? What about our
next meeting</small>
</div>
</div>
</div>
</a>
<!-- item-->
<a href="javascript:void(0);"
class="dropdown-item p-0 notify-item read-noti card m-0 shadow-none">
<div class="card-body">
<div class="d-flex align-items-center">
<div class="flex-shrink-0">
<div class="notify-icon">
<img th:src="@{/static/admin/images/users/avatar-5.jpg}" class="img-fluid rounded-circle"
alt="" />
</div>
</div>
<div class="flex-grow-1 text-truncate ms-2">
<h5 class="noti-item-title fw-semibold fs-14">Shawn Millard <small
class="fw-normal text-muted float-end ms-1">4 day ago</small></h5>
<small class="noti-item-subtitle text-muted">Yeah everything is fine</small>
</div>
</div>
</div>
</a>
</div>
<!-- All-->
<a href="javascript:void(0);"
class="dropdown-item text-center text-primary text-decoration-underline fw-bold notify-item border-top border-light py-2">
View All
</a>
</div>
</li>
<li class="dropdown notification-list">
<a class="nav-link dropdown-toggle arrow-none" data-bs-toggle="dropdown" href="#" role="button"
aria-haspopup="false" aria-expanded="false">
<i class="ri-notification-3-line fs-22"></i>
<span class="noti-icon-badge badge text-bg-pink">3</span>
</a>
<div class="dropdown-menu dropdown-menu-end dropdown-menu-animated dropdown-lg py-0">
<div class="p-2 border-top-0 border-start-0 border-end-0 border-dashed border">
<div class="row align-items-center">
<div class="col">
<h6 class="m-0 fs-16 fw-semibold"> Notification</h6>
</div>
<div class="col-auto">
<a href="javascript: void(0);" class="text-dark text-decoration-underline">
<small>Clear All</small>
</a>
</div>
</div>
</div>
<div style="max-height: 300px;" data-simplebar>
<!-- item-->
<a href="javascript:void(0);" class="dropdown-item notify-item">
<div class="notify-icon bg-primary-subtle">
<i class="mdi mdi-comment-account-outline text-primary"></i>
</div>
<p class="notify-details">Caleb Flakelar commented on Admin
<small class="noti-time">1 min ago</small>
</p>
</a>
<!-- item-->
<a href="javascript:void(0);" class="dropdown-item notify-item">
<div class="notify-icon bg-warning-subtle">
<i class="mdi mdi-account-plus text-warning"></i>
</div>
<p class="notify-details">New user registered.
<small class="noti-time">5 hours ago</small>
</p>
</a>
<!-- item-->
<a href="javascript:void(0);" class="dropdown-item notify-item">
<div class="notify-icon bg-danger-subtle">
<i class="mdi mdi-heart text-danger"></i>
</div>
<p class="notify-details">Carlos Crouch liked
<small class="noti-time">3 days ago</small>
</p>
</a>
<!-- item-->
<a href="javascript:void(0);" class="dropdown-item notify-item">
<div class="notify-icon bg-pink-subtle">
<i class="mdi mdi-comment-account-outline text-pink"></i>
</div>
<p class="notify-details">Caleb Flakelar commented on Admi
<small class="noti-time">4 days ago</small>
</p>
</a>
<!-- item-->
<a href="javascript:void(0);" class="dropdown-item notify-item">
<div class="notify-icon bg-purple-subtle">
<i class="mdi mdi-account-plus text-purple"></i>
</div>
<p class="notify-details">New user registered.
<small class="noti-time">7 days ago</small>
</p>
</a>
<!-- item-->
<a href="javascript:void(0);" class="dropdown-item notify-item">
<div class="notify-icon bg-success-subtle">
<i class="mdi mdi-heart text-success"></i>
</div>
<p class="notify-details">Carlos Crouch liked <b>Admin</b>.
<small class="noti-time">Carlos Crouch liked</small>
</p>
</a>
</div>
<!-- All-->
<a href="javascript:void(0);"
class="dropdown-item text-center text-primary text-decoration-underline fw-bold notify-item border-top border-light py-2">
View All
</a>
</div>
</li>
<li class="d-none d-sm-inline-block">
<a class="nav-link" data-bs-toggle="offcanvas" href="#theme-settings-offcanvas">
<i class="ri-settings-3-line fs-22"></i>
</a>
</li>
<li class="d-none d-sm-inline-block">
<div class="nav-link" id="light-dark-mode">
<i class="ri-moon-line fs-22"></i>
</div>
</li>
<li class="dropdown">
<a class="nav-link dropdown-toggle arrow-none nav-user" data-bs-toggle="dropdown" href="#" role="button"
aria-haspopup="false" aria-expanded="false">
<span class="account-user-avatar">
<img th:src="@{/static/admin/images/users/avatar-1.jpg}" alt="user-image" width="32" class="rounded-circle">
</span>
<span class="d-lg-block d-none">
<h5 class="my-0 fw-normal" th:text="${session.user.account}">Thomson // [!code focus]
<i class="ri-arrow-down-s-line d-none d-sm-inline-block align-middle"></i></h5> // [!code focus]
</span>
</a>
<div class="dropdown-menu dropdown-menu-end dropdown-menu-animated profile-dropdown">
<!-- item-->
<div class=opdown-header noti-title">
<h6 class="text-overflow m-0">欢迎 !</h6>
</div>
<!-- item-->
<a href="pages-profile.html" class="dropdown-item">
<i class="ri-account-circle-line fs-18 align-middle me-1"></i>
<span>我的账号</span>
</a>
<!-- item-->
<a href="pages-profile.html" class="dropdown-item">
<i class="ri-settings-4-line fs-18 align-middle me-1"></i>
<span>设置</span>
</a>
<!-- item-->
<a href="pages-faq.html" class="dropdown-item">
<i class="ri-customer-service-2-line fs-18 align-middle me-1"></i>
<span>支持</span>
</a>
<!-- item-->
<a href="auth-lock-screen.html" class="dropdown-item">
<i class="ri-lock-password-line fs-18 align-middle me-1"></i>
<span>锁定屏幕</span>
</a>
<!-- item-->
<a href="auth-logout-2.html" class="dropdown-item">
<i class="ri-logout-box-line fs-18 align-middle me-1"></i>
<span>退出</span>
</a>
</div>
</li>
</ul>
</div>
</div>
<!-- ========== Topbar End ========== -->
<!-- ========== Left Sidebar Start ========== -->
<div class="leftside-menu">
<!-- Brand Logo Light -->
<a href="index.html" class="logo logo-light">
<span class="logo-lg">
<img th:src="@{/static/admin/images/logo.png}" alt="logo">
</span>
<span class="logo-sm">
<img th:src="@{/static/admin/images/logo-sm.png}" alt="small logo">
</span>
</a>
<!-- Brand Logo Dark -->
<a href="index.html" class="logo logo-dark">
<span class="logo-lg">
<img th:src="@{/static/admin/images/logo-dark.png}" alt="dark logo">
</span>
<span class="logo-sm">
<img th:src="@{/static/admin/images/logo-sm.png}" alt="small logo">
</span>
</a>
<!-- Sidebar -left -->
<div class="h-100" id="leftside-menu-container" data-simplebar>
<!--- Sidemenu -->
<ul class="side-nav">
<li class="side-nav-title">功能菜单</li>
<li class="side-nav-item">
<a href="index.html" class="side-nav-link">
<i class="ri-dashboard-3-line"></i>
<span class="badge bg-success float-end">9+</span>
<span> 数据面板 </span>
</a>
</li>
<li class="side-nav-item">
<a data-bs-toggle="collapse" href="#sidebarPages" aria-expanded="false" aria-controls="sidebarPages" class="side-nav-link">
<i class="ri-pages-line"></i>
<span> 分页管理 </span>
<span class="menu-arrow"></span>
</a>
<div class="collapse" id="sidebarPages">
<ul class="side-nav-second-level">
<li>
<a href="pages-starter.html">Starter Page</a>
</li>
<li>
<a href="pages-contact-list.html">Contact List</a>
</li>
<li>
<a href="pages-profile.html">Profile</a>
</li>
<li>
<a href="pages-timeline.html">Timeline</a>
</li>
<li>
<a href="pages-invoice.html">Invoice</a>
</li>
<li>
<a href="pages-faq.html">FAQ</a>
</li>
<li>
<a href="pages-pricing.html">Pricing</a>
</li>
<li>
<a href="pages-maintenance.html">Maintenance</a>
</li>
<li>
<a href="error-404.html">Error 404</a>
</li>
<li>
<a href="error-404-alt.html">Error 404-alt</a>
</li>
<li>
<a href="error-500.html">Error 500</a>
</li>
</ul>
</div>
</li>
<li class="side-nav-item">
<a data-bs-toggle="collapse" href="#sidebarPagesAuth" aria-expanded="false" aria-controls="sidebarPagesAuth" class="side-nav-link">
<i class="ri-group-2-line"></i>
<span> 授权管理 </span>
<span class="menu-arrow"></span>
</a>
<div class="collapse" id="sidebarPagesAuth">
<ul class="side-nav-second-level">
<li>
<a href="auth-login.html">Login</a>
</li>
<li>
<a href="auth-register.html">Register</a>
</li>
<li>
<a href="auth-logout.html">Logout</a>
</li>
<li>
<a href="auth-forgotpw.html">Forgot Password</a>
</li>
<li>
<a href="auth-lock-screen.html">Lock Screen</a>
</li>
</ul>
</div>
</li>
<li class="side-nav-item">
<a data-bs-toggle="collapse" href="#sidebarLayouts" aria-expanded="false" aria-controls="sidebarLayouts" class="side-nav-link">
<i class="ri-layout-line"></i>
<span class="badge bg-warning float-end">New</span>
<span> 布局管理 </span>
</a>
<div class="collapse" id="sidebarLayouts">
<ul class="side-nav-second-level">
<li>
<a href="layouts-horizontal.html" target="_blank">Horizontal</a>
</li>
<li>
<a href="layouts-light-sidebar.html" target="_blank">Light Sidebar</a>
</li>
<li>
<a href="layouts-sm-sidebar.html" target="_blank">Small Sidebar</a>
</li>
<li>
<a href="layouts-collapsed-sidebar.html" target="_blank">Collapsed Sidebar</a>
</li>
<li>
<a href="layouts-unsticky-layout.html" target="_blank">Unsticky Layout</a>
</li>
<li>
<a href="layouts-boxed.html" target="_blank">Boxed Layout</a>
</li>
</ul>
</div>
</li>
<li class="side-nav-title">Components</li>
<li class="side-nav-item">
<a data-bs-toggle="collapse" href="#sidebarBaseUI" aria-expanded="false" aria-controls="sidebarBaseUI" class="side-nav-link">
<i class="ri-briefcase-line"></i>
<span> 基础 UI </span>
<span class="menu-arrow"></span>
</a>
<div class="collapse" id="sidebarBaseUI">
<ul class="side-nav-second-level">
<li>
<a href="ui-accordions.html">Accordions</a>
</li>
<li>
<a href="ui-alerts.html">Alerts</a>
</li>
<li>
<a href="ui-avatars.html">Avatars</a>
</li>
<li>
<a href="ui-buttons.html">Buttons</a>
</li>
<li>
<a href="ui-badges.html">Badges</a>
</li>
<li>
<a href="ui-breadcrumb.html">Breadcrumb</a>
</li>
<li>
<a href="ui-cards.html">Cards</a>
</li>
<li>
<a href="ui-carousel.html">Carousel</a>
</li>
<li>
<a href="ui-collapse.html">Collapse</a>
</li>
<li>
<a href="ui-dropdowns.html">Dropdowns</a>
</li>
<li>
<a href="ui-embed-video.html">Embed Video</a>
</li>
<li>
<a href="ui-grid.html">Grid</a>
</li>
<li>
<a href="ui-links.html">Links</a>
</li>
<li>
<a href="ui-list-group.html">List Group</a>
</li>
<li>
<a href="ui-modals.html">Modals</a>
</li>
<li>
<a href="ui-notifications.html">Notifications</a>
</li>
<li>
<a href="ui-offcanvas.html">Offcanvas</a>
</li>
<li>
<a href="ui-placeholders.html">Placeholders</a>
</li>
<li>
<a href="ui-pagination.html">Pagination</a>
</li>
<li>
<a href="ui-popovers.html">Popovers</a>
</li>
<li>
<a href="ui-progress.html">Progress</a>
</li>
<li>
<a href="ui-spinners.html">Spinners</a>
</li>
<li>
<a href="ui-tabs.html">Tabs</a>
</li>
<li>
<a href="ui-tooltips.html">Tooltips</a>
</li>
<li>
<a href="ui-typography.html">Typography</a>
</li>
<li>
<a href="ui-utilities.html">Utilities</a>
</li>
</ul>
</div>
</li>
<li class="side-nav-item">
<a data-bs-toggle="collapse" href="#sidebarExtendedUI" aria-expanded="false" aria-controls="sidebarExtendedUI" class="side-nav-link">
<i class="ri-compasses-2-line"></i>
<span> 扩展 UI </span>
<span class="menu-arrow"></span>
</a>
<div class="collapse" id="sidebarExtendedUI">
<ul class="side-nav-second-level">
<li>
<a href="extended-portlets.html">Portlets</a>
</li>
<li>
<a href="extended-scrollbar.html">Scrollbar</a>
</li>
<li>
<a href="extended-range-slider.html">Range Slider</a>
</li>
<li>
<a href="extended-scrollspy.html">Scrollspy</a>
</li>
</ul>
</div>
</li>
<li class="side-nav-item">
<a data-bs-toggle="collapse" href="#sidebarIcons" aria-expanded="false" aria-controls="sidebarIcons" class="side-nav-link">
<i class="ri-pencil-ruler-2-line"></i>
<span> Icons </span>
<span class="menu-arrow"></span>
</a>
<div class="collapse" id="sidebarIcons">
<ul class="side-nav-second-level">
<li>
<a href="icons-remixicons.html">Remix Icons</a>
</li>
<li>
<a href="icons-bootstrap.html">Bootstrap Icons</a>
</li>
<li>
<a href="icons-mdi.html">Material Design Icons</a>
</li>
</ul>
</div>
</li>
<li class="side-nav-item">
<a data-bs-toggle="collapse" href="#sidebarCharts" aria-expanded="false" aria-controls="sidebarCharts" class="side-nav-link">
<i class="ri-donut-chart-fill"></i>
<span> Charts 图 </span>
<span class="menu-arrow"></span>
</a>
<div class="collapse" id="sidebarCharts">
<ul class="side-nav-second-level">
<li>
<a href="charts-apex.html">Apex Charts</a>
</li>
<li>
<a href="charts-chartjs.html">Chartjs</a>
</li>
<li>
<a href="charts-sparklines.html">Sparkline Charts</a>
</li>
</ul>
</div>
</li>
<li class="side-nav-item">
<a data-bs-toggle="collapse" href="#sidebarForms" aria-expanded="false" aria-controls="sidebarForms" class="side-nav-link">
<i class="ri-survey-line"></i>
<span> 表单 </span>
<span class="menu-arrow"></span>
</a>
<div class="collapse" id="sidebarForms">
<ul class="side-nav-second-level">
<li>
<a href="form-elements.html">Basic Elements</a>
</li>
<li>
<a href="form-advanced.html">Form Advanced</a>
</li>
<li>
<a href="form-validation.html">Form Validation</a>
</li>
<li>
<a href="form-wizard.html">Form Wizard</a>
</li>
<li>
<a href="form-fileuploads.html">File Uploads</a>
</li>
<li>
<a href="form-editors.html">Form Editors</a>
</li>
<li>
<a href="form-image-crop.html">Image Crop</a>
</li>
<li>
<a href="form-x-editable.html">X Editable</a>
</li>
</ul>
</div>
</li>
<li class="side-nav-item">
<a data-bs-toggle="collapse" href="#sidebarTables" aria-expanded="false" aria-controls="sidebarTables" class="side-nav-link">
<i class="ri-table-line"></i>
<span> 表格 </span>
<span class="menu-arrow"></span>
</a>
<div class="collapse" id="sidebarTables">
<ul class="side-nav-second-level">
<li>
<a href="tables-basic.html">Basic Tables</a>
</li>
<li>
<a href="tables-datatable.html">Data Tables</a>
</li>
<li>
<a href="tables-editable.html">Editable Tables</a>
</li>
<li>
<a href="tables-responsive.html">Responsive Table</a>
</li>
</ul>
</div>
</li>
<li class="side-nav-item">
<a data-bs-toggle="collapse" href="#sidebarMaps" aria-expanded="false" aria-controls="sidebarMaps" class="side-nav-link">
<i class="ri-map-pin-line"></i>
<span> 地图 </span>
<span class="menu-arrow"></span>
</a>
<div class="collapse" id="sidebarMaps">
<ul class="side-nav-second-level">
<li>
<a href="maps-google.html">Google Maps</a>
</li>
<li>
<a href="maps-vector.html">Vector Maps</a>
</li>
</ul>
</div>
</li>
<li class="side-nav-item">
<a data-bs-toggle="collapse" href="#sidebarMultiLevel" aria-expanded="false" aria-controls="sidebarMultiLevel" class="side-nav-link">
<i class="ri-share-line"></i>
<span> 分层 </span>
<span class="menu-arrow"></span>
</a>
<div class="collapse" id="sidebarMultiLevel">
<ul class="side-nav-second-level">
<li>
<a href="javascript: void(0);">Level 1.1</a>
</li>
<li class="side-nav-item">
<a data-bs-toggle="collapse" href="#sidebarSecondLevel" aria-expanded="false" aria-controls="sidebarSecondLevel">
<span> Level 1.2 </span>
<span class="menu-arrow"></span>
</a>
<div class="collapse" id="sidebarSecondLevel">
<ul class="side-nav-third-level">
<li>
<a href="javascript: void(0);">Item 1</a>
</li>
<li>
<a href="javascript: void(0);">Item 2</a>
</li>
</ul>
</div>
</li>
<li class="side-nav-item">
<a data-bs-toggle="collapse" href="#sidebarThirdLevel" aria-expanded="false" aria-controls="sidebarThirdLevel">
<span> Level 1.3 </span>
<span class="menu-arrow"></span>
</a>
<div class="collapse" id="sidebarThirdLevel">
<ul class="side-nav-third-level">
<li>
<a href="javascript: void(0);">Item 1</a>
</li>
<li class="side-nav-item">
<a data-bs-toggle="collapse" href="#sidebarFourthLevel" aria-expanded="false" aria-controls="sidebarFourthLevel">
<span> Item 2 </span>
<span class="menu-arrow"></span>
</a>
<div class="collapse" id="sidebarFourthLevel">
<ul class="side-nav-forth-level">
<li>
<a href="javascript: void(0);">Item 2.1</a>
</li>
<li>
<a href="javascript: void(0);">Item 2.2</a>
</li>
</ul>
</div>
</li>
</ul>
</div>
</li>
</ul>
</div>
</li>
</ul>
<!--- End Sidemenu -->
<div class="clearfix"></div>
</div>
</div>
<!-- ========== Left Sidebar End ========== -->
<!-- ============================================================== -->
<!-- Start Page Content here -->
<!-- ============================================================== -->
<div class="content-page">
<div class="content">
<!-- Start Content-->
<div class="container-fluid">
<!-- start page title -->
<div class="row">
<div class="col-12">
<div class="page-title-box">
<div class="page-title-right">
<ol class="breadcrumb m-0">
<li class="breadcrumb-item"><a href="javascript: void(0);">Velonic</a></li>
<li class="breadcrumb-item"><a href="javascript: void(0);">Dashboards</a></li>
<li class="breadcrumb-item active">欢迎!</li>
</ol>
</div>
<h4 class="page-title">欢迎!</h4>
</div>
</div>
</div>
<!-- end page title -->
<div class="row">
<div class="col-xxl-3 col-sm-6">
<div class="card widget-flat text-bg-pink">
<div class="card-body">
<div class="float-end">
<i class="ri-eye-line widget-icon"></i>
</div>
<h6 class="text-uppercase mt-0" title="Customers">每日访问人数</h6>
<h2 class="my-2">8,652</h2>
<p class="mb-0">
<span class="badge bg-white bg-opacity-10 me-1">2.97%</span>
<span class="text-nowrap">上个月</span>
</p>
</div>
</div>
</div> <!-- end col-->
<div class="col-xxl-3 col-sm-6">
<div class="card widget-flat text-bg-purple">
<div class="card-body">
<div class="float-end">
<i class="ri-wallet-2-line widget-icon"></i>
</div>
<h6 class="text-uppercase mt-0" title="Customers">收入</h6>
<h2 class="my-2">$9,254.62</h2>
<p class="mb-0">
<span class="badge bg-white bg-opacity-10 me-1">18.25%</span>
<span class="text-nowrap">上个月</span>
</p>
</div>
</div>
</div> <!-- end col-->
<div class="col-xxl-3 col-sm-6">
<div class="card widget-flat text-bg-info">
<div class="card-body">
<div class="float-end">
<i class="ri-shopping-basket-line widget-icon"></i>
</div>
<h6 class="text-uppercase mt-0" title="Customers">Orders</h6>
<h2 class="my-2">753</h2>
<p class="mb-0">
<span class="badge bg-white bg-opacity-25 me-1">-5.75%</span>
<span class="text-nowrap">上个月</span>
</p>
</div>
</div>
</div> <!-- end col-->
<div class="col-xxl-3 col-sm-6">
<div class="card widget-flat text-bg-primary">
<div class="card-body">
<div class="float-end">
<i class="ri-group-2-line widget-icon"></i>
</div>
<h6 class="text-uppercase mt-0" title="Customers">用户</h6>
<h2 class="my-2">63,154</h2>
<p class="mb-0">
<span class="badge bg-white bg-opacity-10 me-1">8.21%</span>
<span class="text-nowrap">上个月</span>
</p>
</div>
</div>
</div> <!-- end col-->
</div>
<div class="row">
<div class="col-lg-8">
<div class="card">
<div class="card-body">
<div class="card-widgets">
<a href="javascript:;" data-bs-toggle="reload"><i class="ri-refresh-line"></i></a>
<a data-bs-toggle="collapse" href="#weeklysales-collapse" role="button" aria-expanded="false" aria-controls="weeklysales-collapse"><i class="ri-subtract-line"></i></a>
<a href="#" data-bs-toggle="remove"><i class="ri-close-line"></i></a>
</div>
<h5 class="header-title mb-0">每周销售额</h5>
<div id="weeklysales-collapse" class="collapse pt-3 show">
<div dir="ltr">
<div id="revenue-chart" class="apex-charts" data-colors="#3bc0c3,#1a2942,#d1d7d973"></div>
</div>
<div class="row text-center">
<div class="col">
<p class="text-muted mt-3">本周</p>
<h3 class=" mb-0">
<span>$506.54</span>
</h3>
</div>
<div class="col">
<p class="text-muted mt-3">上周</p>
<h3 class=" mb-0">
<span>$305.25 </span>
</h3>
</div>
<div class="col">
<p class="text-muted mt-3">讨论</p>
<h3 class=" mb-0">
<span>3.27%</span>
</h3>
</div>
<div class="col">
<p class="text-muted mt-3">客户</p>
<h3 class=" mb-0">
<span>3k</span>
</h3>
</div>
</div>
</div>
</div> <!-- end card-body-->
</div> <!-- end card-->
</div> <!-- end col-->
<div class="col-lg-4">
<div class="card">
<div class="card-body">
<div class="card-widgets">
<a href="javascript:;" data-bs-toggle="reload"><i class="ri-refresh-line"></i></a>
<a data-bs-toggle="collapse" href="#yearly-sales-collapse" role="button" aria-expanded="false" aria-controls="yearly-sales-collapse"><i class="ri-subtract-line"></i></a>
<a href="#" data-bs-toggle="remove"><i class="ri-close-line"></i></a>
</div>
<h5 class="header-title mb-0">年度报表</h5>
<div id="yearly-sales-collapse" class="collapse pt-3 show">
<div dir="ltr">
<div id="yearly-sales-chart" class="apex-charts" data-colors="#3bc0c3,#1a2942,#d1d7d973"></div>
</div>
<div class="row text-center">
<div class="col">
<p class="text-muted mt-3 mb-2">第一季度</p>
<h4 class="mb-0">$56.2k</h4>
</div>
<div class="col">
<p class="text-muted mt-3 mb-2">第二季度</p>
<h4 class="mb-0">$42.5k</h4>
</div>
<div class="col">
<p class="text-muted mt-3 mb-2">所有时间</p>
<h4 class="mb-0">$102.03k</h4>
</div>
</div>
</div>
</div> <!-- end card-body-->
</div> <!-- end card-->
<div class="card">
<div class="card-body">
<div class="d-flex align-items-center">
<div class="flex-grow-1 overflow-hidden">
<h4 class="fs-22 fw-semibold">69.25%</h4>
<p class="text-uppercase fw-medium text-muted text-truncate mb-0"> 美元份额</p>
</div>
<div class="flex-shrink-0">
<div id="us-share-chart" class="apex-charts" dir="ltr"></div>
</div>
</div>
</div><!-- end card body -->
</div> <!-- end card-->
</div> <!-- end col-->
</div>
<!-- end row -->
<div class="row">
<div class="col-xl-4">
<!-- Chat-->
<div class="card">
<div class="card-body p-0">
<div class="p-3">
<div class="card-widgets">
<a href="javascript:;" data-bs-toggle="reload"><i class="ri-refresh-line"></i></a>
<a data-bs-toggle="collapse" href="#yearly-sales-collapse" role="button" aria-expanded="false" aria-controls="yearly-sales-collapse"><i class="ri-subtract-line"></i></a>
<a href="#" data-bs-toggle="remove"><i class="ri-close-line"></i></a>
</div>
<h5 class="header-title mb-0">聊天</h5>
</div>
<div id="yearly-sales-collapse" class="collapse show">
<div class="chat-conversation mt-2">
<div class="card-body py-0 mb-3" data-simplebar style="height: 322px;">
<ul class="conversation-list">
<li class="clearfix">
<div class="chat-avatar">
<img th:src="@{/static/admin/images/users/avatar-5.jpg}" alt="male">
<i>10:00</i>
</div>
<div class="conversation-text">
<div class="ctext-wrap">
<i>日内瓦</i>
<p>
你好!
</p>
</div>
</div>
</li>
<li class="clearfix odd">
<div class="chat-avatar">
<img th:src="@{/static/admin/images/users/avatar-1.jpg}" alt="Female">
<i>10:01</i>
</div>
<div class="conversation-text">
<div class="ctext-wrap">
<i>Thomson</i>
<p>
嗨,你好吗?我们下次见面怎么样?
</p>
</div>
</div>
</li>
<li class="clearfix">
<div class="chat-avatar">
<img th:src="@{/static/admin/images/users/avatar-5.jpg}" alt="male">
<i>10:01</i>
</div>
<div class="conversation-text">
<div class="ctext-wrap">
<i>日内瓦</i>
<p>
是的,一切都很好
</p>
</div>
</div>
</li>
<li class="clearfix odd">
<div class="chat-avatar">
<img th:src="@{/static/admin/images/users/avatar-1.jpg}" alt="male">
<i>10:02</i>
</div>
<div class="conversation-text">
<div class="ctext-wrap">
<i>Thomson</i>
<p>
Wow that's great
</p>
</div>
</div>
</li>
</ul>
</div>
<div class="card-body pt-0">
<form class="needs-validation" novalidate name="chat-form" id="chat-form">
<div class="row align-items-start">
<div class="col">
<input type="text" class="form-control chat-input" placeholder="Enter your text" required>
<div class="invalid-feedback">
请输入你的留言
</div>
</div>
<div class="col-auto d-grid">
<button type="submit" class="btn btn-danger chat-send waves-effect waves-light">发送</button>
</div>
</div>
</form>
</div>
</div> <!-- end .chat-conversation-->
</div>
</div>
</div> <!-- end card-->
</div> <!-- end col-->
<div class="col-xl-8">
<!-- Todo-->
<div class="card">
<div class="card-body p-0">
<div class="p-3">
<div class="card-widgets">
<a href="javascript:;" data-bs-toggle="reload"><i class="ri-refresh-line"></i></a>
<a data-bs-toggle="collapse" href="#yearly-sales-collapse" role="button" aria-expanded="false" aria-controls="yearly-sales-collapse"><i class="ri-subtract-line"></i></a>
<a href="#" data-bs-toggle="remove"><i class="ri-close-line"></i></a>
</div>
<h5 class="header-title mb-0">项目</h5>
</div>
<div id="yearly-sales-collapse" class="collapse show">
<div class="table-responsive">
<table class="table table-nowrap table-hover mb-0">
<thead>
<tr>
<th>#</th>
<th>Project Name</th>
<th>Start Date</th>
<th>Due Date</th>
<th>Status</th>
<th>Assign</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>Velonic Admin v1</td>
<td>01/01/2015</td>
<td>26/04/2015</td>
<td><span class="badge bg-info-subtle text-info">Released</span></td>
<td>Techzaa Studio</td>
</tr>
<tr>
<td>2</td>
<td>Velonic Frontend v1</td>
<td>01/01/2015</td>
<td>26/04/2015</td>
<td><span class="badge bg-info-subtle text-info">Released</span></td>
<td>Techzaa Studio</td>
</tr>
<tr>
<td>3</td>
<td>Velonic Admin v1.1</td>
<td>01/05/2015</td>
<td>10/05/2015</td>
<td><span class="badge bg-pink-subtle text-pink">Pending</span></td>
<td>Techzaa Studio</td>
</tr>
<tr>
<td>4</td>
<td>Velonic Frontend v1.1</td>
<td>01/01/2015</td>
<td>31/05/2015</td>
<td><span class="badge bg-purple-subtle text-purple">Work in Progress</span></td>
<td>Techzaa Studio</td>
</tr>
<tr>
<td>5</td>
<td>Velonic Admin v1.3</td>
<td>01/01/2015</td>
<td>31/05/2015</td>
<td><span class="badge bg-warning-subtle text-warning">Coming soon</span></td>
<td>Techzaa Studio</td>
</tr>
<tr>
<td>6</td>
<td>Velonic Admin v1.3</td>
<td>01/01/2015</td>
<td>31/05/2015</td>
<td><span class="badge bg-primary-subtle text-primary">Coming soon</span></td>
<td>Techzaa Studio</td>
</tr>
<tr>
<td>7</td>
<td>Velonic Admin v1.3</td>
<td>01/01/2015</td>
<td>31/05/2015</td>
<td><span class="badge bg-danger-subtle text-danger">Cool</span></td>
<td>Techzaa Studio</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div> <!-- end card-->
</div> <!-- end col-->
</div>
<!-- end row -->
</div>
<!-- container -->
</div>
<!-- content -->
<!-- Footer Start -->
<footer class="footer">
<div class="container-fluid">
<div class="row">
<div class="col-12 text-center">
<script>document.write(new Date().getFullYear())</script> © Velonic - Theme by <b>Techzaa</b>
</div>
</div>
</div>
</footer>
<!-- end Footer -->
</div>
<!-- ============================================================== -->
<!-- End Page content -->
<!-- ============================================================== -->
</div>
<!-- END wrapper -->
<!-- Theme Settings -->
<div class="offcanvas offcanvas-end" tabindex="-1" id="theme-settings-offcanvas">
<div class="d-flex align-items-center bg-primary p-3 offcanvas-header">
<h5 class="text-white m-0">主题设置</h5>
<button type="button" class="btn-close btn-close-white ms-auto" data-bs-dismiss="offcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body p-0">
<div data-simplebar class="h-100">
<div class="p-3">
<h5 class="mb-3 fs-16 fw-bold">Color Scheme</h5>
<div class="row">
<div class="col-4">
<div class="form-check form-switch card-switch mb-1">
<input class="form-check-input" type="checkbox" name="data-bs-theme" id="layout-color-light" value="light">
<label class="form-check-label" for="layout-color-light">
<img th:src="@{/static/admin/images/layouts/light.png}" alt="" class="img-fluid">
</label>
</div>
<h5 class="font-14 text-center text-muted mt-2">Light</h5>
</div>
<div class="col-4">
<div class="form-check form-switch card-switch mb-1">
<input class="form-check-input" type="checkbox" name="data-bs-theme" id="layout-color-dark" value="dark">
<label class="form-check-label" for="layout-color-dark">
<img th:src="@{/static/admin/images/layouts/dark.png}" alt="" class="img-fluid">
</label>
</div>
<h5 class="font-14 text-center text-muted mt-2">黑色</h5>
</div>
</div>
<div id="layout-width">
<h5 class="my-3 fs-16 fw-bold">布局模式</h5>
<div class="row">
<div class="col-4">
<div class="form-check form-switch card-switch mb-1">
<input class="form-check-input" type="checkbox" name="data-layout-mode" id="layout-mode-fluid" value="fluid">
<label class="form-check-label" for="layout-mode-fluid">
<img th:src="@{/static/admin/images/layouts/light.png}" alt="" class="img-fluid">
</label>
</div>
<h5 class="font-14 text-center text-muted mt-2">Fluid</h5>
</div>
<div class="col-4">
<div id="layout-boxed">
<div class="form-check form-switch card-switch mb-1">
<input class="form-check-input" type="checkbox" name="data-layout-mode" id="layout-mode-boxed" value="boxed">
<label class="form-check-label" for="layout-mode-boxed">
<img th:src="@{/static/admin/images/layouts/boxed.png}" alt="" class="img-fluid">
</label>
</div>
<h5 class="font-14 text-center text-muted mt-2">Boxed</h5>
</div>
</div>
</div>
</div>
<h5 class="my-3 fs-16 fw-bold">Topbar 颜色</h5>
<div class="row">
<div class="col-4">
<div class="form-check form-switch card-switch mb-1">
<input class="form-check-input" type="checkbox" name="data-topbar-color" id="topbar-color-light" value="light">
<label class="form-check-label" for="topbar-color-light">
<img th:src="@{/static/admin/images/layouts/light.png}" alt="" class="img-fluid">
</label>
</div>
<h5 class="font-14 text-center text-muted mt-2">亮灯</h5>
</div>
<div class="col-4">
<div class="form-check form-switch card-switch mb-1">
<input class="form-check-input" type="checkbox" name="data-topbar-color" id="topbar-color-dark" value="dark">
<label class="form-check-label" for="topbar-color-dark">
<img th:src="@{/static/admin/images/layouts/topbar-dark.png}" alt="" class="img-fluid">
</label>
</div>
<h5 class="font-14 text-center text-muted mt-2">黑色</h5>
</div>
</div>
<div>
<h5 class="my-3 fs-16 fw-bold">菜单 颜色</h5>
<div class="row">
<div class="col-4">
<div class="form-check form-switch card-switch mb-1">
<input class="form-check-input" type="checkbox" name="data-menu-color" id="leftbar-color-light" value="light">
<label class="form-check-label" for="leftbar-color-light">
<img th:src="@{/static/admin/images/layouts/sidebar-light.png}" alt="" class="img-fluid">
</label>
</div>
<h5 class="font-14 text-center text-muted mt-2">亮灯</h5>
</div>
<div class="col-4">
<div class="form-check form-switch card-switch mb-1">
<input class="form-check-input" type="checkbox" name="data-menu-color" id="leftbar-color-dark" value="dark">
<label class="form-check-label" for="leftbar-color-dark">
<img th:src="@{/static/admin/images/layouts/light.png}" alt="" class="img-fluid">
</label>
</div>
<h5 class="font-14 text-center text-muted mt-2">黑色</h5>
</div>
</div>
</div>
<div id="sidebar-size">
<h5 class="my-3 fs-16 fw-bold">侧边栏 尺寸</h5>
<div class="row">
<div class="col-4">
<div class="form-check form-switch card-switch mb-1">
<input class="form-check-input" type="checkbox" name="data-sidenav-size" id="leftbar-size-default" value="default">
<label class="form-check-label" for="leftbar-size-default">
<img th:src="@{/static/admin/images/layouts/light.png}" alt="" class="img-fluid">
</label>
</div>
<h5 class="font-14 text-center text-muted mt-2">默认</h5>
</div>
<div class="col-4">
<div class="form-check form-switch card-switch mb-1">
<input class="form-check-input" type="checkbox" name="data-sidenav-size" id="leftbar-size-compact" value="compact">
<label class="form-check-label" for="leftbar-size-compact">
<img th:src="@{/static/admin/images/layouts/compact.png}" alt="" class="img-fluid">
</label>
</div>
<h5 class="font-14 text-center text-muted mt-2">Compact</h5>
</div>
<div class="col-4">
<div class="form-check form-switch card-switch mb-1">
<input class="form-check-input" type="checkbox" name="data-sidenav-size" id="leftbar-size-small" value="condensed">
<label class="form-check-label" for="leftbar-size-small">
<img th:src="@{/static/admin/images/layouts/sm.png}" alt="" class="img-fluid">
</label>
</div>
<h5 class="font-14 text-center text-muted mt-2">Condensed</h5>
</div>
<div class="col-4">
<div class="form-check form-switch card-switch mb-1">
<input class="form-check-input" type="checkbox" name="data-sidenav-size" id="leftbar-size-full" value="full">
<label class="form-check-label" for="leftbar-size-full">
<img th:src="@{/static/admin/images/layouts/full.png}" alt="" class="img-fluid">
</label>
</div>
<h5 class="font-14 text-center text-muted mt-2">全局</h5>
</div>
</div>
</div>
<div id="layout-position">
<h5 class="my-3 fs-16 fw-bold">布局位置</h5>
<div class="btn-group checkbox" role="group">
<input type="radio" class="btn-check" name="data-layout-position" id="layout-position-fixed" value="fixed">
<label class="btn btn-soft-primary w-sm" for="layout-position-fixed">Fixed</label>
<input type="radio" class="btn-check" name="data-layout-position" id="layout-position-scrollable" value="scrollable">
<label class="btn btn-soft-primary w-sm ms-0" for="layout-position-scrollable">Scrollable</label>
</div>
</div>
</div>
</div>
</div>
<div class="offcanvas-footer border-top p-3 text-center">
<div class="row">
<div class="col-6">
<button type="button" class="btn btn-light w-100" id="reset-layout">Reset</button>
</div>
<div class="col-6">
<a href="https://1.envato.market/velonic" target="_blank" role="button" class="btn btn-primary w-100">Buy Now</a>
</div>
</div>
</div>
</div>
<!-- Vendor js -->
<script th:src="@{/static/admin/js/vendor.min.js}"></script>
<!-- Daterangepicker js -->
<script th:src="@{/static/admin/vendor/daterangepicker/moment.min.js}"></script>
<script th:src="@{/static/admin/vendor/daterangepicker/daterangepicker.js}"></script>
<!-- Apex Charts js -->
<script th:src="@{/static/admin/vendor/apexcharts/apexcharts.min.js}"></script>
<!-- Vector Map js -->
<script th:src="@{/static/admin/vendor/admin-resources/jquery.vectormap/jquery-jvectormap-1.2.2.min.js}"></script>
<script th:src="@{/static/admin/vendor/admin-resources/jquery.vectormap/maps/jquery-jvectormap-world-mill-en.js}"></script>
<!-- Dashboard App js -->
<script th:src="@{/static/admin/js/pages/dashboard.js}"></script>
<!-- App js -->
<script th:src="@{/static/admin/js/app.min.js}"></script>
</body>
<!-- Mirrored from techzaa.getappui.com/velonic/layouts/index.html by HTTrack Website Copier/3.x [XR&CO'2014], Fri, 25 Aug 2023 12:14:58 GMT -->
</html>