目录
开发环境
- IntelliJ IDEA 2024.3.5 (Ultimate Edition):后端SpringBoot
- WebStorm 2025.1:前端Vue
- JDK21
- Maven3.99
- MySQL5.7/8.0
- Node.js18.16.1
- TraeCN0.5.6:免费AI IDE,提高工作效率
- Navicat17
安装配置自行百度。
Github开源项目
- todo-list-fullstack:mlambert125/todo-list-fullstack: A Full Stack Postgres/SpringBoot/Vue template
入门一:跑起别人的开源项目
跑起前端Vue
- WebStorm打开todo-list-fullstack\client项目,执行npm install安装依赖;
- WebStorm添加npm运行配置,功能是执行npm run dev;
- 运行Vue
跑起后端SpringBoot
IDEA打开server/pom.xml导入工程
- 源项目数据库是postgresql,改为MySQL;
- pom.xml添加MySQL Driver依赖;
- application.properties添加MySQL配置
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/FinalProject?characterEncoding=utf8&useSSL=false spring.datasource.username=root spring.datasource.password=root spring.datasource.driver-class-name=com.mysql.jdbc.Driver
- pom.xml添加MySQL Driver依赖;
- MySQL建立库和表;
- 使用字节的Trae处理todo-list-fullstack\database\create-script.sql,删除所有注释;
drop table if exists users, user_roles; create table users ( username varchar(255) primary key, email varchar(255), password varchar(255) ); create table user_roles ( username varchar(255), role varchar(255), primary key (username, role) ); insert into users (username, password, email) values ('admin', '$2a$10$/2cfdNAuBaJOK/GeCG7r6.eU8a2jdqivs81fhpYdHBFk1L0dfZN3W', 'admin@example.com'); insert into user_roles (username, role) values ('admin', 'ADMIN'); drop table if exists todos; create table todos ( id serial primary key, title varchar(255), completed boolean default false ); insert into todos (title) values ('Wash dishes'); insert into todos (title) values ('Feed Loki'); insert into todos (title) values ('Feed Cat');
-
新建数据库finalproject,并执行create-script.sql建立表
- 使用字节的Trae处理todo-list-fullstack\database\create-script.sql,删除所有注释;
-
修改数据库用户admin登录密码为1234567890;
-
编辑server/Daos/JdbcUserDao.java,添加代码打断点后得到加密后的密码字符串;
public JdbcUserDao(DataSource dataSource, PasswordEncoder passwordEncoder) { template = new JdbcTemplate(dataSource); this.passwordEncoder = passwordEncoder; // admin 1234567890 var x = passwordEncoder.encode("1234567890"); // x = $2a$10$WbdzQ/8qfnx6MfQKgmkbceU/cQMshqarx1I42Y2619avW3yhdZWXC }
-
将生成的密码替换到数据库表user;
-
-
启动SpringBoot服务;
运行效果
入门二:将HTML模板转成Vue组件
下载一个免费的HTML模板
通过Trae将HTML转成Vue组件
- Vue项目新建文件夹src\template\login并将下载的HTML模板解压到src\template\login;
- 使用Trae将index.html转成Vue组件并改为Register.vue放入src\views;
<!DOCTYPE html> <html lang="en"><!-- Basic --> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <!-- Mobile Metas --> <meta name="viewport" content="width=device-width, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no"> <!-- Site Metas --> <title>Login and Register tabbed form</title> <meta name="keywords" content=""> <meta name="description" content=""> <meta name="author" content=""> <!-- Site Icons --> <link rel="shortcut icon" href="images/favicon.ico" type="image/x-icon"> <link rel="apple-touch-icon" href="images/apple-touch-icon.png"> <!-- Bootstrap CSS --> <link href="css/bootstrap.min.css" rel="stylesheet"> <!-- Site CSS --> <link rel="stylesheet" href="css/style.css"> <!-- Fontawesome CSS --> <link rel="stylesheet" href="css/all.min.css"> <!-- Responsive CSS --> <link rel="stylesheet" href="css/responsive.css"> <!-- Custom CSS --> <link rel="stylesheet" href="css/custom.css"> <!--[if lt IE 9]> <script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script> <script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script> <![endif]--> </head> <body> <div id="particles-js" class="main-form-box"> <div class="md-form"> <div class="container"> <div class="row"> <div class="col-md-6 offset-md-3"> <div class="panel panel-login"> <div class="logo-top"> <a href="#"><img src="images/logo.png" alt="" /></a> </div> <div class="panel-heading"> <div class="row"> <div class="col-lg-6 col-sm-6 col-xl-6"> <a href="#" class="active" id="login-form-link">Login</a> </div> <div class="col-lg-6 col-sm-6 col-xl-6"> <a href="#" id="register-form-link">Register</a> </div> <div class="or">OR</div> </div> </div> <div class="panel-body"> <div class="row"> <div class="col-lg-12"> <form id="login-form" action="#" method="post" role="form" style="display: block;"> <div class="form-group"> <label class="icon-lp"><i class="fas fa-user-tie"></i></label> <input type="text" name="username" id="username" tabindex="1" class="form-control" placeholder="Username" value="" required=""> </div> <div class="form-group"> <label class="icon-lp"><i class="fas fa-key"></i></label> <input type="password" name="password" id="password" tabindex="2" class="form-control" placeholder="Password" required=""> </div> <div class="che-box"> <label class="checkbox-in"> <input name="checkbox" type="checkbox" tabindex="3" id="remember"> <span></span> Remember Me </label> </div> <ul> <li> <button class="fb"><i class="fab fa-facebook-f"></i> Connect with Facebook</button> </li> <li> <button class="tw"><i class="fab fa-twitter"></i> Connect with Twitter</button> </li> </ul> <div class="form-group"> <div class="row"> <div class="col-sm-6 offset-sm-3"> <input type="submit" name="login-submit" id="login-submit" tabindex="4" class="form-control btn btn-login" value="Log In"> </div> </div> </div> <div class="form-group"> <div class="row"> <div class="col-lg-12"> <div class="text-center"> <a href="#" tabindex="5" class="forgot-password">Forgot Password?</a> </div> </div> </div> </div> </form> <form id="register-form" action="#" method="post" role="form" style="display: none;"> <div class="form-group"> <label class="icon-lp"><i class="fas fa-user-tie"></i></label> <input type="text" name="username" id="username" tabindex="1" class="form-control" placeholder="Username" value="" required=""> </div> <div class="form-group"> <label class="icon-lp"><i class="fas fa-envelope"></i></label> <input type="email" name="email" id="email" tabindex="1" class="form-control" placeholder="Email Address" value="" required=""> </div> <div class="form-group"> <label class="icon-lp"><i class="fas fa-key"></i></label> <input type="password" name="password" id="password" tabindex="2" class="form-control" placeholder="Password" required=""> </div> <div class="form-group"> <label class="icon-lp"><i class="fas fa-key"></i></label> <input type="password" name="confirm-password" id="confirm-password" tabindex="2" class="form-control" placeholder="Confirm Password" required=""> </div> <ul> <li> <button class="fb"><i class="fab fa-facebook-f"></i> Connect with Facebook</button> </li> <li> <button class="tw"><i class="fab fa-twitter"></i> Connect with Twitter</button> </li> </ul> <div class="che-box"> <label class="checkbox-in"> <input name="checkbox" type="checkbox"> <span></span>I agree to the <a href="#"> Terms and Conditions </a> and <a href="#">Privacy Policy </a> </label> </div> <div class="form-group"> <div class="row"> <div class="col-sm-6 offset-sm-3"> <input type="submit" name="register-submit" id="register-submit" tabindex="4" class="form-control btn btn-register" value="Register Now"> </div> </div> </div> </form> </div> </div> </div> </div> <p class="footer-company-name">All Rights Reserved. © 2018 <a href="#">Login Register</a> <a target="_blank" href="http://www.mobanwang.com/" title="网页模板">网页模板</a></p> </div> </div> </div> </div> </div> <script src="js/jquery.min.js"></script> <script src="js/bootstrap.min.js"></script> <script src="js/particles.min.js"></script> <script src="js/index.js"></script> <script type="text/javascript"> $(function() { $('#login-form-link').click(function(e) { $("#login-form").delay(100).fadeIn(100); $("#register-form").fadeOut(100); $('#register-form-link').removeClass('active'); $(this).addClass('active'); e.preventDefault(); }); $('#register-form-link').click(function(e) { $("#register-form").delay(100).fadeIn(100); $("#login-form").fadeOut(100); $('#login-form-link').removeClass('active'); $(this).addClass('active'); e.preventDefault(); }); }); $('.form-group input').focus(function () { $(this).parent().addClass('addcolor'); }).blur(function () { $(this).parent().removeClass('addcolor'); }); </script> </body> </html>
<script setup> import { ref } from 'vue' import serverApi from '../services/server-api'; const activeForm = ref('login') const toggleForm = (formName) => { activeForm.value = formName } const handleFocus = (e) => { e.target.parentElement.classList.add('addcolor') } const handleBlur = (e) => { e.target.parentElement.classList.remove('addcolor') } </script> <template> <div id="particles-js" class="main-form-box"> <div class="md-form"> <div class="container"> <div class="row"> <div class="col-md-6 offset-md-3"> <div class="panel panel-login"> <div class="logo-top"> <a href="#"><img src="/src/template/login/images/logo.png" alt="" /></a> </div> <div class="panel-heading"> <div class="row"> <div class="col-lg-6 col-sm-6 col-xl-6"> <a href="#" :class="{ active: activeForm === 'login' }" @click.prevent="toggleForm('login')"> Login </a> </div> <div class="col-lg-6 col-sm-6 col-xl-6"> <a href="#" :class="{ active: activeForm === 'register' }" @click.prevent="toggleForm('register')"> Register </a> </div> <div class="or">OR</div> </div> </div> <div class="panel-body"> <div class="row"> <div class="col-lg-12"> <form id="login-form" v-show="activeForm === 'login'"> <div class="form-group"> <label class="icon-lp"><i class="fas fa-user-tie"></i></label> <input type="text" name="username" @focus="handleFocus" @blur="handleBlur" class="form-control" placeholder="Username" required> </div> <div class="form-group"> <label class="icon-lp"><i class="fas fa-key"></i></label> <input type="password" name="password" @focus="handleFocus" @blur="handleBlur" class="form-control" placeholder="Password" required> </div> <div class="che-box"> <label class="checkbox-in"> <input name="checkbox" type="checkbox"> <span></span> Remember Me </label> </div> <ul> <li> <button class="fb"><i class="fab fa-facebook-f"></i> Connect with Facebook</button> </li> <li> <button class="tw"><i class="fab fa-twitter"></i> Connect with Twitter</button> </li> </ul> <div class="form-group"> <div class="row"> <div class="col-sm-6 offset-sm-3"> <input type="submit" class="form-control btn btn-login" value="Log In"> </div> </div> </div> <div class="form-group"> <div class="row"> <div class="col-lg-12"> <div class="text-center"> <a href="#" class="forgot-password">Forgot Password?</a> </div> </div> </div> </div> </form> <form id="register-form" v-show="activeForm === 'register'"> <div class="form-group"> <label class="icon-lp"><i class="fas fa-user-tie"></i></label> <input type="text" name="username" @focus="handleFocus" @blur="handleBlur" class="form-control" placeholder="Username" required> </div> <div class="form-group"> <label class="icon-lp"><i class="fas fa-envelope"></i></label> <input type="email" name="email" @focus="handleFocus" @blur="handleBlur" class="form-control" placeholder="Email Address" required> </div> <div class="form-group"> <label class="icon-lp"><i class="fas fa-key"></i></label> <input type="password" name="password" @focus="handleFocus" @blur="handleBlur" class="form-control" placeholder="Password" required> </div> <div class="form-group"> <label class="icon-lp"><i class="fas fa-key"></i></label> <input type="password" name="confirm-password" @focus="handleFocus" @blur="handleBlur" class="form-control" placeholder="Confirm Password" required> </div> <ul> <li> <button class="fb"><i class="fab fa-facebook-f"></i> Connect with Facebook</button> </li> <li> <button class="tw"><i class="fab fa-twitter"></i> Connect with Twitter</button> </li> </ul> <div class="che-box"> <label class="checkbox-in"> <input name="checkbox" type="checkbox"> <span></span>I agree to the <a href="#"> Terms and Conditions </a> and <a href="#">Privacy Policy </a> </label> </div> <div class="form-group"> <div class="row"> <div class="col-sm-6 offset-sm-3"> <input type="submit" class="form-control btn btn-register" value="Register Now"> </div> </div> </div> </form> </div> </div> </div> </div> <p class="footer-company-name">All Rights Reserved. © 2018 <a href="#">Login Register</a> <a target="_blank" href="http://www.mobanwang.com/" title="网页模板">网页模板</a></p> </div> </div> </div> </div> </div> </template> <style scoped> @import url('/src/template/login/css/bootstrap.min.css'); @import url('/src/template/login/css/style.css'); @import url('/src/template/login/css/all.min.css'); @import url('/src/template/login/css/responsive.css'); #login-form, #register-form { transition: opacity 0.1s ease; } </style>
将生成Vue组件增加为Vue的一个路由节点
- src/router/index.js;注意导入组件
import Register from "@/views/Register.vue";
- src/App.vue添加节点;