计算机毕业设计 基于java旅游攻略平台的设计与实现 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

news2024/10/20 2:20:57

🍊作者:计算机编程-吉哥
🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。
🍊心愿:点赞 👍 收藏 ⭐评论 📝
🍅 文末获取源码联系

👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~
Java毕业设计项目~热门选题推荐《1000套》

Python毕业设计精品项目《1000套》

微信小程序毕业设计精品项目《1000套》

大数据/机器学习毕业设计精品项目《1000套》

【看项目演示视频,文末扫一下】

【看项目演示视频,文末扫一下】

目录

1.技术选型

2.开发工具

2.1 Java

2.2 SpringBoot

2.3 MyBatisPlus

2.4 Vue

2.5 ElementUI

2.6 MySQL

2.7 Maven

3.功能

3.1【角色】

3.2【前端功能模块】

3.3【后端功能模块】

4.项目演示截图

4.1 前台

4.2 后台

5.核心代码

5.1拦截器

5.2分页工具类

5.3文件上传下载

5.4前端请求

6.LW文档大纲参考


背景意义介绍: 

基于Java的旅游攻略平台是一个为旅游爱好者提供全面、丰富旅游信息服务的在线系统。随着人们生活水平的提高和旅游活动的日益频繁,对于旅游信息的需求也日益增长。该平台通过集中展示旅游资讯、攻略分享等内容,旨在帮助用户更好地规划旅行,提高旅行体验。

该系统的主要功能包括用户登录注册、旅游资讯浏览、旅游攻略分享等。用户可以在个人中心管理自己的旅行收藏和行程规划。后端管理模块为管理员提供了用户管理、旅游攻略管理、景点类型管理和旅游资讯管理等功能,确保了平台内容的及时更新和信息的准确性。

旅游攻略平台的实现,不仅为用户提供了一个获取旅游信息的便捷渠道,也为旅游行业的从业者提供了一个展示服务和吸引客户的平台。此外,系统的数据分析功能还可以帮助旅游企业和管理部门洞察市场趋势,优化旅游资源配置,提升旅游服务的质量和效率。总之,该平台对于推动旅游业的信息化、促进旅游服务的个性化和提高旅游体验具有重要的战略意义。

1.技术选型

  • 框架:springboot、mybatisplus、vue、elementui、html、css、js、mysql、jdk1.8
  • 工具:idea、Navicat

2.开发工具

2.1 Java

Java是一种广泛使用的高级编程语言,以其跨平台兼容性、面向对象的特性和丰富的库支持而闻名。它在系统开发中被广泛应用,特别是在需要高度可移植性和网络功能的场景中。Java的虚拟机(JVM)允许程序在多种操作系统上运行,无需修改代码。它的强类型系统和自动垃圾回收机制减少了内存泄漏和程序崩溃的风险。此外,Java提供了强大的网络编程支持,使得开发分布式系统和网络应用变得容易。它还拥有大量的开源库和框架,如Spring和Hibernate,这些库和框架进一步简化了复杂问题的解决,如数据库操作和企业级应用开发。因此,Java在构建可扩展、安全且高效的系统中扮演了关键角色。

2.2 SpringBoot

Spring Boot是一个轻量级的Java框架,旨在简化Spring应用的创建和部署。它通过自动配置和“约定优于配置”的原则,极大地减少了开发者在配置上的负担。Spring Boot内置了Tomcat、Jetty等Web服务器,使得应用无需部署WAR文件即可快速启动。此外,它还提供了丰富的Starters,帮助开发者轻松集成数据库、消息队列、安全框架等。Spring Boot的Actuator模块为应用提供了监控和管理功能,增强了系统的可维护性。通过这些特性,Spring Boot使得开发微服务架构和云原生应用变得更加高效和简单。

2.3 MyBatisPlus

MyBatis-Plus是一个对MyBatis框架的增强工具,它通过简化数据库操作和减少模板代码,极大地提升了开发效率。它提供了自动生成的CRUD接口,使得开发者无需编写繁琐的SQL语句,同时支持Lambda表达式和条件构造器,让查询条件构建变得简洁明了。内置的分页插件简化了分页操作,而灵活的主键策略和代码生成器进一步加速了开发流程。MyBatis-Plus的无侵入性和对现有工程的兼容性,使其成为提升数据库操作效率和简化开发流程的有力工具。

2.4 Vue

Vue.js是一个渐进式JavaScript框架,专注于构建用户界面。它易于上手,同时提供了强大的功能来帮助开发者构建复杂的单页应用。Vue的核心特点包括响应式数据绑定、组件系统和虚拟DOM。响应式数据绑定让数据更新变得简单直观,开发者只需关注数据本身,视图会自动更新。组件系统允许开发者将界面分割成可复用的组件,每个组件管理自己的状态和逻辑,使得代码更加模块化和可维护。虚拟DOM提高了性能,因为它减少了直接操作DOM的次数,通过计算最小更新量来实现高效的DOM更新。Vue还提供了丰富的生态系统,包括Vuex状态管理和Vue Router路由管理,使得构建大型应用变得更加简单。此外,Vue的轻量级特性使其成为快速开发中小型项目的优选。在系统开发中,Vue通过这些特点,提供了快速开发、高可维护性和良好的用户体验,特别适合于需要快速迭代和动态内容更新的应用场景。

2.5 ElementUI

Element UI是一个专为Vue.js设计的开源前端组件库,由饿了么前端团队开发。它以“简洁、实用、高效”为核心设计理念,遵循Material Design等国际通行的设计规范,提供了一套直观易用且符合人类直觉交互习惯的UI组件。Element UI的组件库丰富,包括表格、表单、对话框、菜单、按钮等,这些组件都基于响应式设计,自动适应不同设备的屏幕大小,提供一致的用户体验。

使用Element UI可以大大提高开发效率,它提供了一套全面的预置组件,涵盖了几乎所有的基础和复杂UI需求。例如,它的表单验证、下拉选择器、日期选择器等功能模块均经过精心设计,兼顾了功能性和美观性,提升了用户体验。此外,Element UI的组件封装简单,开发人员可以轻松地在Vue.js应用程序中使用,同时支持高度可定制性,在保持默认外观的前提下,可以通过CSS、主题等来自定义组件样式,支持按需加载。

Element UI还提供了完善的文档和示例代码,方便开发者学习和使用,同时拥有一个活跃的社区,为开发者提供了丰富的资源和支持。它的设计和实现考虑了开发者的实际需求,使得在构建现代Web应用程序时,Element UI成为一个受欢迎的选择。

2.6 MySQL

MySQL是一个流行的关系型数据库管理系统,广泛用于各种应用场景。它以其高性能、可靠性和易用性而闻名。MySQL支持SQL语言,允许开发者通过标准的查询语句来操作数据。它提供了强大的数据类型,包括整数、浮点数、字符串和日期时间等,以满足不同数据存储需求。

MySQL的索引机制优化了查询性能,通过B+树等数据结构,加快了数据检索速度。它的事务处理能力保证了数据的一致性和完整性,支持ACID(原子性、一致性、隔离性、持久性)属性,适合需要高可靠性的业务场景。

此外,MySQL的复制功能支持数据的分布式存储,提高了数据的可用性和容错性。其灵活的存储引擎,如InnoDB和MyISAM,提供了不同的性能和功能特点,以适应不同的应用需求。MySQL还提供了丰富的管理工具和监控功能,方便数据库的维护和优化。

在系统开发中,MySQL通过其高性能、可靠性、易用性和灵活性,为数据存储和管理提供了强大的支持。它的社区版免费且开源,降低了开发和维护成本,使其成为许多项目的首选数据库解决方案。

2.7 Maven

Maven是一个强大的项目管理和构建自动化工具,它通过提供一个标准化的项目管理方法,简化了Java项目的构建过程。Maven的核心优势在于其依赖管理能力,它允许开发者在项目的`pom.xml`文件中声明依赖,然后自动从远程仓库中获取所需的库,从而避免了手动下载和配置依赖的繁琐工作。

Maven还强制执行了一致的项目结构,这不仅促进了团队成员之间的协作,还简化了代码的整合和重用。它定义了一系列构建生命周期和阶段,使得开发者可以按照预定义的顺序执行各种任务,如编译、测试、打包和部署。

此外,Maven支持构建配置文件,允许开发者为不同环境定义不同的构建配置,这对于在多个环境中部署应用程序(如开发、测试和生产环境)非常有用。Maven的可扩展性也是其一大特点,开发者可以创建Maven插件来添加额外的目标或定制现有目标,以满足特定需求。

在系统应用中,Maven通过自动化构建流程、管理项目依赖、提供一致的项目结构、支持自动化测试、允许构建配置文件和高度可扩展性,极大地提高了开发效率和项目的可维护性。这些特性使得Maven成为Java项目开发中不可或缺的工具之一。

3.功能

3.1【角色】

管理员、用户

3.2【前端功能模块】

  • 登录
  • 注册
  • 首页
  • 旅游资讯
  • 旅游攻略
  • 个人中心
     

3.3【后端功能模块】

  • 登录
  • 首页
  • 后台管理
  • 用户管理
  • 旅游攻略管理
  • 景点类型管理
  • 旅游资讯管理

4.项目演示截图

4.1 前台

4.2 后台

5.核心代码

5.1拦截器

package com.interceptor;
 
import com.alibaba.fastjson.JSONObject;
import com.annotation.IgnoreAuth;
import com.entity.TokenEntity;
import com.service.TokenService;
import com.utils.R;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
 
/**
 * 权限(Token)验证
 */
@Component
public class AuthorizationInterceptor implements HandlerInterceptor {
 
    public static final String LOGIN_TOKEN_KEY = "Token";
 
    @Autowired
    private TokenService tokenService;
    
	@Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
 
		//支持跨域请求
        response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Credentials", "true");
        response.setHeader("Access-Control-Allow-Headers", "x-requested-with,request-source,Token, Origin,imgType, Content-Type, cache-control,postman-token,Cookie, Accept,authorization");
        response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
	// 跨域时会首先发送一个OPTIONS请求,这里我们给OPTIONS请求直接返回正常状态
	if (request.getMethod().equals(RequestMethod.OPTIONS.name())) {
        	response.setStatus(HttpStatus.OK.value());
            return false;
        }
        
        IgnoreAuth annotation;
        if (handler instanceof HandlerMethod) {
            annotation = ((HandlerMethod) handler).getMethodAnnotation(IgnoreAuth.class);
        } else {
            return true;
        }
 
        //从header中获取token
        String token = request.getHeader(LOGIN_TOKEN_KEY);
        
        /**
         * 不需要验证权限的方法直接放过
         */
        if(annotation!=null) {
        	return true;
        }
        
        TokenEntity tokenEntity = null;
        if(StringUtils.isNotBlank(token)) {
        	tokenEntity = tokenService.getTokenEntity(token);
        }
        
        if(tokenEntity != null) {
        	request.getSession().setAttribute("userId", tokenEntity.getUserid());
        	request.getSession().setAttribute("role", tokenEntity.getRole());
        	request.getSession().setAttribute("tableName", tokenEntity.getTablename());
        	request.getSession().setAttribute("username", tokenEntity.getUsername());
        	return true;
        }
        
		PrintWriter writer = null;
		response.setCharacterEncoding("UTF-8");
		response.setContentType("application/json; charset=utf-8");
		try {
		    writer = response.getWriter();
		    writer.print(JSONObject.toJSONString(R.error(401, "请先登录")));
		} finally {
		    if(writer != null){
		        writer.close();
		    }
		}
		return false;
    }
}

5.2分页工具类

 
package com.utils;
 
import java.io.Serializable;
import java.util.List;
import java.util.Map;
 
import com.baomidou.mybatisplus.plugins.Page;
 
/**
 * 分页工具类
 */
public class PageUtils implements Serializable {
	private static final long serialVersionUID = 1L;
	//总记录数
	private long total;
	//每页记录数
	private int pageSize;
	//总页数
	private long totalPage;
	//当前页数
	private int currPage;
	//列表数据
	private List<?> list;
	
	/**
	 * 分页
	 * @param list        列表数据
	 * @param totalCount  总记录数
	 * @param pageSize    每页记录数
	 * @param currPage    当前页数
	 */
	public PageUtils(List<?> list, int totalCount, int pageSize, int currPage) {
		this.list = list;
		this.total = totalCount;
		this.pageSize = pageSize;
		this.currPage = currPage;
		this.totalPage = (int)Math.ceil((double)totalCount/pageSize);
	}
 
	/**
	 * 分页
	 */
	public PageUtils(Page<?> page) {
		this.list = page.getRecords();
		this.total = page.getTotal();
		this.pageSize = page.getSize();
		this.currPage = page.getCurrent();
		this.totalPage = page.getPages();
	}
	
	/*
	 * 空数据的分页
	 */
	public PageUtils(Map<String, Object> params) {
 		Page page =new Query(params).getPage();
		new PageUtils(page);
	}
 
	 
	public int getPageSize() {
		return pageSize;
	}
 
	public void setPageSize(int pageSize) {
		this.pageSize = pageSize;
	}
 
	public int getCurrPage() {
		return currPage;
	}
 
	public void setCurrPage(int currPage) {
		this.currPage = currPage;
	}
 
	public List<?> getList() {
		return list;
	}
 
	public void setList(List<?> list) {
		this.list = list;
	}
 
	public long getTotalPage() {
		return totalPage;
	}
 
	public void setTotalPage(long totalPage) {
		this.totalPage = totalPage;
	}
 
	public long getTotal() {
		return total;
	}
 
	public void setTotal(long total) {
		this.total = total;
	}
	
}

5.3文件上传下载

package com.controller;
 
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.UUID;
 
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.util.ResourceUtils;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
 
import com.annotation.IgnoreAuth;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.entity.ConfigEntity;
import com.entity.EIException;
import com.service.ConfigService;
import com.utils.R;
 
/**
 * 上传文件映射表
 */
@RestController
@RequestMapping("file")
@SuppressWarnings({"unchecked","rawtypes"})
public class FileController{
	@Autowired
    private ConfigService configService;
	/**
	 * 上传文件
	 */
	@RequestMapping("/upload")
    @IgnoreAuth
	public R upload(@RequestParam("file") MultipartFile file,String type) throws Exception {
		if (file.isEmpty()) {
			throw new EIException("上传文件不能为空");
		}
		String fileExt = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".")+1);
		File path = new File(ResourceUtils.getURL("classpath:static").getPath());
		if(!path.exists()) {
		    path = new File("");
		}
		File upload = new File(path.getAbsolutePath(),"/upload/");
		if(!upload.exists()) {
		    upload.mkdirs();
		}
		String fileName = new Date().getTime()+"."+fileExt;
		File dest = new File(upload.getAbsolutePath()+"/"+fileName);
		file.transferTo(dest);
		if(StringUtils.isNotBlank(type) && type.equals("1")) {
			ConfigEntity configEntity = configService.selectOne(new EntityWrapper<ConfigEntity>().eq("name", "faceFile"));
			if(configEntity==null) {
				configEntity = new ConfigEntity();
				configEntity.setName("faceFile");
				configEntity.setValue(fileName);
			} else {
				configEntity.setValue(fileName);
			}
			configService.insertOrUpdate(configEntity);
		}
		return R.ok().put("file", fileName);
	}
	
	/**
	 * 下载文件
	 */
	@IgnoreAuth
	@RequestMapping("/download")
	public ResponseEntity<byte[]> download(@RequestParam String fileName) {
		try {
			File path = new File(ResourceUtils.getURL("classpath:static").getPath());
			if(!path.exists()) {
			    path = new File("");
			}
			File upload = new File(path.getAbsolutePath(),"/upload/");
			if(!upload.exists()) {
			    upload.mkdirs();
			}
			File file = new File(upload.getAbsolutePath()+"/"+fileName);
			if(file.exists()){
 
				HttpHeaders headers = new HttpHeaders();
			    headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);    
			    headers.setContentDispositionFormData("attachment", fileName);    
			    return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),headers, HttpStatus.CREATED);
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		return new ResponseEntity<byte[]>(HttpStatus.INTERNAL_SERVER_ERROR);
	}
	
}

5.4前端请求

import axios from 'axios'
import router from '@/router/router-static'
import storage from '@/utils/storage'
 
const http = axios.create({
    timeout: 1000 * 86400,
    withCredentials: true,
    baseURL: '/furniture',
    headers: {
        'Content-Type': 'application/json; charset=utf-8'
    }
})
// 请求拦截
http.interceptors.request.use(config => {
    config.headers['Token'] = storage.get('Token') // 请求头带上token
    return config
}, error => {
    return Promise.reject(error)
})
// 响应拦截
http.interceptors.response.use(response => {
    if (response.data && response.data.code === 401) { // 401, token失效
        router.push({ name: 'login' })
    }
    return response
}, error => {
    return Promise.reject(error)
})
export default http

6.LW文档大纲参考

 具体LW如何写法,可以咨询博主,耐心分享!

你可能还有感兴趣的项目👇🏻👇🏻👇🏻

更多项目推荐:计算机毕业设计项目

Python毕业设计精品项目《1000套》

微信小程序毕业设计精品项目《1000套》

大数据/机器学习毕业设计精品项目《1000套》

如果大家有任何疑虑,请在下方咨询或评论

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

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

相关文章

【命令操作】Linux中多种关机和重启的命令介绍 _ 统信 _ 麒麟 _ 方德

往期好文&#xff1a;【系统配置】信创系统配置文件保护与防篡改 | 统信 | 麒麟 | 方德 Hello&#xff0c;大家好啊&#xff01;今天给大家带来一篇关于在Linux系统中多种关机和重启命令介绍的文章。Linux作为一个广泛应用的开源操作系统&#xff0c;提供了多种关机和重启的方式…

jupyter notebook 笔记

nbclassic 经典版 新版的 jupyter notebook 太丑了。 最难受的是字体太小了。 我还是喜欢老版本的 jupyter notebook. 安装经典版: pip install nbclassic 启动经典版: jupyter server 或是 jupyter nbclassic 参考来源: https://github.com/jupyter/nbclassic jupyter note…

计算机网络——传输层服务

传输层会给段加上目标ip和目标端口号 应用层去识别报文的开始和结束

C++ —— 关于多态

目录 1. 多态的概念 2.多态的定义及实现 3. 虚函数 3.1 虚函数的重写/覆盖 3.2 关于多态的面试难题 3.3 虚函数重写的⼀些问题 3.4 override 和 final关键字 3.5 重载/重写/隐藏的对比 3.6 纯虚函数和抽象类 4.多态的原理 4.1虚函数表指针 4.2 多态是如何实现的 4…

go压缩的使用

基础&#xff1a;使用go创建一个zip func base(path string) {// 创建 zip 文件zipFile, err : os.Create("test.zip")if err ! nil {panic(err)}defer zipFile.Close()// 创建一个新的 *Writer 对象zipWriter : zip.NewWriter(zipFile)defer zipWriter.Close()// 创…

如何使用DockerSpy检测你的Docker镜像是否安全

关于DockerSpy DockerSpy是一款针对Docker镜像的敏感信息检测与安全审计工具&#xff0c;该工具可以帮助广大研究人员在Docker Hub上检测和搜索自己镜像的安全问题&#xff0c;并识别潜在的泄漏内容&#xff0c;例如身份验证密钥等敏感信息。 功能介绍 1、安全审计&#xff1a…

linux一二三章那些是重点呢

第一章 静态库动态库的区别 什么是库 库文件是计算机上的一类文件&#xff0c;可以简单的把库文件看成一种代码仓库&#xff0c;它提供给使用者一些可以直接 拿来用的变量、函数或类。 如何制作 静态动态库 静态库&#xff1a; GCC 进行链接时&#xff0c;会把静态库中代码打…

2013 lost connection to MySQL server during query

1.问题 使用navicat连接doris&#xff0c;会有这个错误。 2.解决 换低版本的navicat比如navicat11。

linux运行openfoam并行会报错:attempt to run parallel on 1 processor

linux运行openfoam并行会报错&#xff1a;attempt to run parallel on 1 processor 步骤&#xff1a; 1.先在终端输入which mpirun,查看当前并行路径&#xff1b; 2.输入gedit ~/.bashrc&#xff0c;文本方式打开bashrc文件&#xff1b; 3.修改为export PATH/usr/bin:$PATH&am…

支持阅后即焚的笔记Enclosed

什么是 Enclosed &#xff1f; Enclosed 是一个简约的网络应用程序&#xff0c;旨在发送私人和安全的笔记。所有笔记均经过端到端加密&#xff0c;确保服务器和存储对内容一无所知。用户可以设置密码、定义有效期 (TTL)&#xff0c;并选择在阅读后让笔记自毁。 软件特点&#x…

第一年改考408的学校有炸过的吗?怎么应对突然改考408?

C哥专业提供——计软考研院校选择分析专业课备考指南规划 专业课改考 408 后&#xff0c;分数线不一定会暴涨&#xff0c;其变化受到多种因素影响&#xff1a; 可能导致分数线不暴涨甚至下降的因素&#xff1a; 考试难度增加&#xff1a;408 统考涵盖数据结构、计算机组成原理…

P2-1与P2-2.【C语言基本数据类型、运算符和表达式】第一节与第二节

讲解视频&#xff1a; P2-1.【基本数据类型、运算符和表达式】第一节 P2-2.【基本数据类型、运算符和表达式】第二节 必备知识与理论 1&#xff0e;数据类型概述 所谓数据类型&#xff0c;是按被定义变量的性质&#xff0c;表示形式&#xff0c;占据存储空间的多少&#xff0…

【分布式事务-04】分布式事务seata的XA模式

redis系列整体栏目 内容链接地址【一】分布式事务之2pc两阶段提交https://zhenghuisheng.blog.csdn.net/article/details/142406325【二】分布式事务seata的安装下载与环境搭建https://zhenghuisheng.blog.csdn.net/article/details/142893117【三】分布式事务seata的AT模式htt…

k8s ETCD数据备份与恢复

在 Kubernetes 集群中&#xff0c;etcd 是一个分布式键值存储&#xff0c;它保存着整个集群的状态&#xff0c;包括节点、Pod、ConfigMap、Secrets 等关键信息。因此&#xff0c;定期对 etcd 进行备份是非常重要的&#xff0c;特别是在集群发生故障或需要恢复数据的情况下。本文…

Axure科技感元件:打造可视化大屏设计的得力助手

Axure&#xff0c;作为一款专业的原型设计工具&#xff0c;凭借其强大的设计功能、丰富的组件库和灵活的交互能力&#xff0c;成为了许多设计师打造科技感设计的首选工具。其中&#xff0c;Axure科技感元件更是以其独特的魅力和实用性&#xff0c;在数据可视化大屏、登录界面、…

HarmonyOS开发(State模型)

一、State模型概述 FA&#xff08;Feature Ability&#xff09;模型&#xff1a;从API 7开始支持的模型&#xff0c;已经不再主推。 Stage模型&#xff1a;从API 9开始新增的模型&#xff0c;是目前主推且会长期演进的模型。在该模型中&#xff0c;由于提供了AbilityStage、Wi…

Leetcode—1114. 按序打印【简单】(多线程)

2024每日刷题&#xff08;179&#xff09; Leetcode—1114. 按序打印 C实现代码 class Foo { public:Foo() {firstMutex.lock();secondMutex.lock();}void first(function<void()> printFirst) {// printFirst() outputs "first". Do not change or remove t…

jupyter notebook远程连接服务器

jupyter notebook远程连接服务器 文章目录 jupyter notebook远程连接服务器jupyter是什么配置步骤安装jupyter生成jupyter配置文件编辑jupyter配置文件设置密码ssh隧道 启动顺序jupyter添加kernel下载ipykernel包添加kernel 测试遇到的问题 jupyter是什么 Jupyter Notebook是一…

fastStone Capture截图神器,你想要的功能它都有!

前言 大家好&#xff0c;我是小徐啊。从今天开始&#xff0c;小徐将介绍很多Java开发领域相关的软件工具资源&#xff0c;欢迎大家关注。今天&#xff0c;介绍一款非常小巧&#xff0c;但功能十分强大的图片软件&#xff0c;fastStone Capture。这款工具&#xff0c;主要是图片…

101、QT摄像头录制视频问题

视频和音频录制类QMediaRecorder QMediaRecorder 通过摄像头和音频输入设备进行录像。 注意: 使用Qt多媒体模块的摄像头相关类无法在Windows平台上进行视频录制&#xff0c;只能进行静态图片抓取但是在Linux平台上可以实现静态图片抓取和视频录制。 Qt多媒体模块的功能实现是依…