SpringBoot + Vue 开发前后端分离的旅游管理系统,Spring都没弄明白凭什么拿高薪

  • id、name、picpath、hottime、hotticket、dimticket、placedes、provinceid(外键)

数据库名:travels

用户表 SQL:

CREATE TABLE t_user(

id INT(6) PRIMARY KEY AUTO_INCREMENT,

username VARCHAR(60),

password VARCHAR(60),

email VARCHAR(60)

);

省份表 SQL:

CREATE TABLE t_province(

id INT(6) PRIMARY KEY AUTO_INCREMENT,

name VARCHAR(60),

tags VARCHAR(80),

placecounts INT(4)

);

景点表 SQL:

CREATE TABLE t_place(

id INT(6) PRIMARY KEY AUTO_INCREMENT,

name VARCHAR(60),

picpath MEDIUMTEXT,

hottime TIMESTAMP,

hotticket DOUBLE(7,2),

dimticket DOUBLE(7,2),

placedes VARCHAR(300),

provinceid INT(6) REFERENCES t_province(id)

);

环境搭建

=======================================================================

利用 Spring Initializr 快速搭建 SpringBoot 项目。

引入依赖(pom.xml)


<?xml version="1.0" encoding="UTF-8"?>

<project xmlns=“http://maven.apache.org/POM/4.0.0” xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”

xsi:schemaLocation=“http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd”>

4.0.0

org.springframework.boot

spring-boot-starter-parent

2.3.1.RELEASE

com.yusael

mytravels

0.0.1-SNAPSHOT

mytravels

springboot + vue

<java.version>1.8</java.version>

org.springframework.boot

spring-boot-starter-web

org.mybatis.spring.boot

mybatis-spring-boot-starter

2.1.2

org.springframework.boot

spring-boot-devtools

runtime

true

mysql

mysql-connector-java

runtime

org.projectlombok

lombok

true

com.alibaba

druid

1.1.12

org.springframework.boot

spring-boot-starter-test

commons-fileupload

commons-fileupload

1.4

org.springframework.boot

spring-boot-starter-test

test

org.junit.vintage

junit-vintage-engine

org.springframework.boot

spring-boot-maven-plugin

配置文件(application.properties)


application.properties:

server.port=8989

spring.application.name=travels

spring.datasource.type=com.alibaba.druid.pool.DruidDataSource

spring.datasource.driver-class-name=com.mysql.jdbc.Driver

spring.datasource.url=jdbc:mysql://localhost:3306/travels?characterEncoding=UTF-8

spring.datasource.username=root

spring.datasource.password=1234

mybatis.mapper-locations=classpath:com/yusael/travels/mapper/*.xml

mybatis.type-aliases-package=com.yusael.travels.entity

logging.level.root=info

logging.level.com.yusael.travels.dao=debug

上传的图片存放的路径

upload.dir=D:/CodePro/IdeaPro/SpringBoot/travels/images

spring.resources.static-locations=file:${upload.dir}

href=“javascript:;” 含义

=========================================================================================

代码中经常遇到这种写法:

<a href=“javascript:;” @click=“deleteProvince(province.id)”>删除省份

其中的 href="javascript:;" 是什么意思呢?

  • javascript: 表示在触发默认动作时,执行一段 JavaScript 代码;

  • javascript:; 表示什么都不执行,这样点击时就没有任何反应,相当于去掉 a 标签的默认行为。

select - option 绑定 Vue 实例

============================================================================================

select 中 通过 v-model 绑定当前的选项,option 中使用 v-for 遍历显示所有选项。

所属省份:

删除时增加确认选项

============================================================================

if (confirm(“确定要删除景点吗?”)) {

// code…

}

在这里插入图片描述

Vue 获取地址栏跳转的参数

=================================================================================

对于这么一个 a 标签,我们要在另一个页面获取这个 url 的参数 id:

修改省份

可以通过 location.href 获取 url 再进行截取:

var id = location.href.substring(location.href.indexOf(“=”) + 1);

前后端分离项目—验证码功能

================================================================================

验证码工具类:

package com.yusael.travels.utils;

import java.awt.Color;

import java.awt.Font;

import java.awt.Graphics;

import java.awt.image.BufferedImage;

import java.io.IOException;

import java.io.OutputStream;

import java.util.Random;

import javax.imageio.ImageIO;

public class CreateImageCode {

// 图片的宽度。

private int width = 160;

// 图片的高度。

private int height = 40;

// 验证码字符个数

private int codeCount = 4;

// 验证码干扰线数

private int lineCount = 20;

// 验证码

private String code = null;

// 验证码图片Buffer

private BufferedImage buffImg = null;

Random random = new Random();

public CreateImageCode() {

creatImage();

}

public CreateImageCode(int width, int height) {

this.width = width;

this.height = height;

creatImage();

}

public CreateImageCode(int width, int height, int codeCount) {

this.width = width;

this.height = height;

this.codeCount = codeCount;

creatImage();

}

public CreateImageCode(int width, int height, int codeCount, int lineCount) {

this.width = width;

this.height = height;

this.codeCount = codeCount;

this.lineCount = lineCount;

creatImage();

}

// 生成图片

private void creatImage() {

int fontWidth = width / codeCount;// 字体的宽度

int fontHeight = height - 5;// 字体的高度

int codeY = height - 8;

// 图像buffer

buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

Graphics g = buffImg.getGraphics();

//Graphics2D g = buffImg.createGraphics();

// 设置背景色

g.setColor(getRandColor(200, 250));

g.fillRect(0, 0, width, height);

// 设置字体

//Font font1 = getFont(fontHeight);

Font font = new Font(“Fixedsys”, Font.BOLD, fontHeight);

g.setFont(font);

// 设置干扰线

for (int i = 0; i < lineCount; i++) {

int xs = random.nextInt(width);

int ys = random.nextInt(height);

int xe = xs + random.nextInt(width);

int ye = ys + random.nextInt(height);

g.setColor(getRandColor(1, 255));

g.drawLine(xs, ys, xe, ye);

}

// 添加噪点

float yawpRate = 0.01f;// 噪声率

int area = (int) (yawpRate * width * height);

for (int i = 0; i < area; i++) {

int x = random.nextInt(width);

int y = random.nextInt(height);

buffImg.setRGB(x, y, random.nextInt(255));

}

String str1 = randomStr(codeCount);// 得到随机字符

this.code = str1;

for (int i = 0; i < codeCount; i++) {

String strRand = str1.substring(i, i + 1);

g.setColor(getRandColor(1, 255));

// g.drawString(a,x,y);

// a为要画出来的东西,x和y表示要画的东西最左侧字符的基线位于此图形上下文坐标系的 (x, y) 位置处

g.drawString(strRand, i*fontWidth+3, codeY);

}

}

// 得到随机字符

private String randomStr(int n) {

String str1 = “ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890”;

String str2 = “”;

int len = str1.length() - 1;

double r;

for (int i = 0; i < n; i++) {

r = (Math.random()) * len;

str2 = str2 + str1.charAt((int) r);

}

return str2;

}

// 得到随机颜色

private Color getRandColor(int fc, int bc) {// 给定范围获得随机颜色

if (fc > 255)

fc = 255;

if (bc > 255)

bc = 255;

int r = fc + random.nextInt(bc - fc);

int g = fc + random.nextInt(bc - fc);

int b = fc + random.nextInt(bc - fc);

return new Color(r, g, b);

}

/**

  • 产生随机字体

*/

private Font getFont(int size) {

Random random = new Random();

Font font[] = new Font[5];

font[0] = new Font(“Ravie”, Font.PLAIN, size);

font[1] = new Font(“Antique Olive Compact”, Font.PLAIN, size);

font[2] = new Font(“Fixedsys”, Font.PLAIN, size);

font[3] = new Font(“Wide Latin”, Font.PLAIN, size);

font[4] = new Font(“Gill Sans Ultra Bold”, Font.PLAIN, size);

return font[random.nextInt(5)];

}

// 扭曲方法

private void shear(Graphics g, int w1, int h1, Color color) {

shearX(g, w1, h1, color);

shearY(g, w1, h1, color);

}

private void shearX(Graphics g, int w1, int h1, Color color) {

int period = random.nextInt(2);

boolean borderGap = true;

int frames = 1;

int phase = random.nextInt(2);

for (int i = 0; i < h1; i++) {

double d = (double) (period >> 1)

  • Math.sin((double) i / (double) period
  • (6.2831853071795862D * (double) phase)

/ (double) frames);

g.copyArea(0, i, w1, 1, (int) d, 0);

if (borderGap) {

g.setColor(color);

g.drawLine((int) d, i, 0, i);

g.drawLine((int) d + w1, i, w1, i);

}

}

}

private void shearY(Graphics g, int w1, int h1, Color color) {

int period = random.nextInt(40) + 10; // 50;

boolean borderGap = true;

int frames = 20;

int phase = 7;

for (int i = 0; i < w1; i++) {

double d = (double) (period >> 1)

  • Math.sin((double) i / (double) period
  • (6.2831853071795862D * (double) phase)

/ (double) frames);

g.copyArea(i, 0, 1, h1, 0, (int) d);

if (borderGap) {

g.setColor(color);

g.drawLine(i, (int) d, i, 0);

g.drawLine(i, (int) d + h1, i, h1);

}

}

}

public void write(OutputStream sos) throws IOException {

ImageIO.write(buffImg, “png”, sos);

sos.close();

}

public BufferedImage getBuffImg() {

return buffImg;

}

public String getCode() {

return code.toLowerCase();

}

//使用方法

/*public void getCode3(HttpServletRequest req, HttpServletResponse response,HttpSession session) throws IOException{

// 设置响应的类型格式为图片格式

response.setContentType(“image/jpeg”);

//禁止图像缓存。

response.setHeader(“Pragma”, “no-cache”);

response.setHeader(“Cache-Control”, “no-cache”);

response.setDateHeader(“Expires”, 0);

CreateImageCode vCode = new CreateImageCode(100,30,5,10);

session.setAttribute(“code”, vCode.getCode());

vCode.write(response.getOutputStream());

}*/

}

后台控制器:需要对生成的验证码图片进行 Base64 编码后传到前端页面,前端再解析展示图片。

@RestController

@RequestMapping(“/user”)

@CrossOrigin // 允许跨域(前后端分离)

@Slf4j // 日志对象

public class UserController {

/**

  • 生成验证码

  • @throws IOException

*/

@GetMapping(“/getImage”)

public Map<String, String> getImage(HttpServletRequest request) throws IOException {

Map<String, String> result = new HashMap<>();

CreateImageCode createImageCode = new CreateImageCode();

// 获取验证码

String securityCode = createImageCode.getCode();

// 验证码存入session

String key = new SimpleDateFormat(“yyyyMMddHHmmss”).format(new Date());

request.getServletContext().setAttribute(key, securityCode);

// 生成图片

BufferedImage image = createImageCode.getBuffImg();

//进行base64编码

ByteArrayOutputStream bos = new ByteArrayOutputStream();

ImageIO.write(image, “png”, bos);

String string = Base64Utils.encodeToString(bos.toByteArray());

result.put(“key”, key);

result.put(“image”, string);

return result;

}

}

前端页面:

<img :src=“src” id=“img-vcode” @click=“getImage” :key=“key”>

验证码:

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)
img

最后

基础知识是前端一面必问的,如果你在基础知识这一块翻车了,就算你框架玩的再6,webpack、git、node学习的再好也无济于事,因为对方就不会再给你展示的机会,千万不要因为基础错过了自己心怡的公司。前端的基础知识杂且多,并不是理解就ok了,有些是真的要去记。当然了我们是牛x的前端工程师,每天像背英语单词一样去背知识点就没必要了,只要平时工作中多注意总结,面试前端刷下题目就可以了。

CodeChina开源项目:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

[外链图片转存中…(img-b1fqR5Zk-1712185267478)]
[外链图片转存中…(img-m0D1TEPR-1712185267479)]
[外链图片转存中…(img-sdfuAUjQ-1712185267479)]
[外链图片转存中…(img-YXpf5Z17-1712185267480)]
[外链图片转存中…(img-LxgqhoNT-1712185267480)]
[外链图片转存中…(img-MlyHvwen-1712185267480)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)
[外链图片转存中…(img-Uh14nkMq-1712185267481)]

最后

基础知识是前端一面必问的,如果你在基础知识这一块翻车了,就算你框架玩的再6,webpack、git、node学习的再好也无济于事,因为对方就不会再给你展示的机会,千万不要因为基础错过了自己心怡的公司。前端的基础知识杂且多,并不是理解就ok了,有些是真的要去记。当然了我们是牛x的前端工程师,每天像背英语单词一样去背知识点就没必要了,只要平时工作中多注意总结,面试前端刷下题目就可以了。

CodeChina开源项目:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

  • 22
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
"ruoyi-基于springboot vue的前后分离权限管理系统.zip" 是一个基于SpringBootVue的前后分离的权限管理系统。以下是对该系统的详细说明: 这个系统是一个完全分离前后的架构,使用了现代化的前技术Vue.js和后框架SpringBoot。它的设计目标是实现一个可靠、安全、易用的权限管理系统系统的前部分使用Vue.js库进行开发,它充分利用了Vue.js的组件化和响应式特性,从而提供了一个良好的用户界面和交互体验。前页面可以动态地响应用户的操作,并与后进行数据交互。通过Vue-router插件,系统实现了页面的路由功能,使用户能够方便地在不同的页面之间进行切换和导航。此外,系统还使用了Element UI库,该库提供了丰富的组件和样式,可以大大提高开发效率。 系统的后部分使用了SpringBoot框架,它是一种快速开发Java应用程序的框架。SpringBoot具有自动配置、快速启动、约定大于配置等特点,可以让开发人员更专注于业务逻辑的实现。后部分负责处理前发送的请求,并进行权限验证、数据查询和操作等后逻辑。同时,系统还使用了MyBatis框架来操作数据库,它是一种简化了数据库访问的框架,能够有效地提高数据库操作的效率。 此外,系统还具有权限管理的功能。它能够根据不同的角色对用户进行权限控制,实现用户的分级管理和权限的授权。系统管理员可以在后台管理界面对用户进行管理,并配置他们的角色和权限。通过这种方式,可以保护系统的安全性,并限制用户对敏感数据的访问。 总之,ruoyi-基于springboot vue的前后分离权限管理系统.zip 是一个功能强大且易于使用的权限管理系统,它综合运用了SpringBootVue.js的优势,提供了一个完整的前后分离架构,可以满足不同应用场景下的权限管理需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值