🍊作者:计算机编程-吉哥
🍊简介:专业从事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【功能模块】

4.项目演示截图

4.1 前台

4.2 后台

5.核心代码

5.1拦截器

5.2分页工具类

5.3文件上传下载

5.4前端请求

6.LW文档参考


背景意义介绍: 

在当今社会,随着人们生活节奏的加快以及生活品质追求的提升,家政保洁服务需求呈现出快速增长的趋势。现代人工作繁忙,往往无暇顾及家庭清洁事务,而专业的家政保洁服务能够有效解决这一问题,为人们创造整洁、舒适的居住环境。然而,传统的家政保洁预约方式存在诸多弊端。一方面,用户通常需要通过电话沟通来预约服务,这种方式不仅效率低下,容易出现信息传递不准确的情况,而且在高峰期还可能面临占线、等待时间长等问题,给用户带来极大的不便。另一方面,对于家政服务提供商而言,难以对服务人员的工作安排、订单状态等进行有效管理和跟踪,导致服务质量难以保证,资源分配不合理,进而影响企业的运营效率和竞争力。

与此同时,信息技术的飞速发展,尤其是互联网技术的普及,为家政保洁行业带来了新的发展机遇。在此背景下,基于Spring Boot框架开发一套家政保洁预约系统具有重要的现实意义。Spring Boot以其快速开发、简化配置、易于集成等优势,成为众多企业级应用开发的首选框架。利用Spring Boot技术构建家政保洁预约系统,能够充分利用其强大的功能特性,为家政服务行业打造一个高效、便捷、智能的信息化平台。

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【功能模块】

管理员:系统首页、用户管理、个人中心、家政公司管理、保洁阿姨管理、服务类型管理、家政服务管理、服务记录管理、服务评价管理、系统管理

家政公司:系统首页、个人中心、保洁阿姨管理、家政服务管理、服务预约管理、服务记录管理、服务评价管理

保洁阿姨:系统首页、个人中心、服务分配管理、服务记录管理、服务评价管理

用户:系统首页、家政服务、公告资讯、个人中心、我的收藏


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";@Autowiredprivate TokenService tokenService;@Overridepublic 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中获取tokenString 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{@Autowiredprivate ConfigService configService;/*** 上传文件*/@RequestMapping("/upload")@IgnoreAuthpublic 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') // 请求头带上tokenreturn 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.pswp.cn/web/96045.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/96045.shtml
英文地址,请注明出处:http://en.pswp.cn/web/96045.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux系统】 4. 权限(一)

一. shell 命令及运行原理基本理解1&#xff09;广义理解的操作系统包括&#xff1a;操作系统内核、外壳程序&#xff08;shell命令行、图形化界面&#xff09;、必要的软件。2&#xff09;狭义的操作系统&#xff1a;操作系统内核。3&#xff09;在用户和内核之间有一个外壳程…

6.python——字符串

python中用’ 和" "创建字符串 python的子字符串截取用[]取字符串拼接可以直接用相加。 python三引号允许一个字符串跨多行&#xff0c;其中无需进行转义&#xff08;所见即所得&#xff09;。 当你需要一块HTML或者SQL时&#xff0c;这时用字符串组合&#xff0c;特…

足球数据API接口的技术特性与应用价值分析

一、接口概述现代足球数据接口是基于RESTful架构的数据服务&#xff0c;通过标准化方式提供赛事相关信息。这类接口通常采用JSON格式传输数据&#xff0c;支持跨平台调用&#xff0c;为开发者提供结构化的足球赛事数据。二、数据覆盖范围主流足球数据接口通常包含以下数据类型&…

<android>反编译魔改安卓系统应用并替换

我们知道安卓系统基于稳定性、维护便利、性能优化等原因并未对原生系统apk进行混淆加密处理&#xff0c;由此就方便了我们反编译替换原生应用。 首先我们设备需要是root后的&#xff0c;我是使用的是小米5&#xff0c;刷的24.3版本的面具。首先我们需要取系统apk&#xff0c;这…

【Qt】项目的创建 and 各个控件的使用

一、项目的创建&#x1f50d;然后点击新建项目。&#x1f4d6;注意&#xff1a;路径不要带有中文&#xff0c;不然运行不了代码。&#x1f4d6;qmake是一个构建工具&#xff0c;在 Qt 写的程序&#xff0c;设计的到一系列的 "元编程" 技术&#xff0c;什么是元编程技…

大模型架构演进全景:从Transformer到下一代智能系统的技术路径(MoE、Mamba/SSM、混合架构)

当前大模型发展正经历着一个关键的技术分水岭。虽然Transformer架构自2017年问世以来主导了整个AI领域&#xff0c;但我们正见证着多种创新架构的涌现&#xff0c;每种都在试图解决Transformer的固有局限。本指南将系统性地解析当前主流架构的技术原理、适用场景与发展趋势&…

画世界笔刷合集(2000 + 款):含宫崎骏森系、鸭风人像、国潮等多风格 + 视频导入教程

预览&#xff1a; https://blog.csdn.net/2501_93092597/article/details/151330089?spm1011.2415.3001.5331 想在画世界创作却缺适配笔刷&#xff1f;手动绘制森系元素、人像细节耗时久&#xff0c;导入笔刷总失败&#xff0c;找配套背景 / 配色还得跨平台搜索&#xff1f;这…

03-Redis 安装指南:从版本选择到多系统部署(Windows+macOS+Linux)

目录引言一、安装 Redis 前必须明确的核心问题二、Redis 版本选择&#xff1a;稳定版 vs 开发版&#xff0c;该怎么选&#xff1f;2.1 版本规则&#xff1a;看 “次版本号” 辨稳定性2.2 稳定版与开发版核心差异2.3 版本选择建议三、多系统安装教程&#xff1a;step-by-step 实…

普通MYSQL数据库是怎么做sum操作的

MySQL 的 SUM()操作实现是一个结合​​执行引擎优化、存储结构利用和分组算法​​的高效过程。以下是其核心实现机制和优化策略&#xff1a;​​1. 执行流程概览​​以查询为例&#xff1a;SELECT department, SUM(salary) FROM employees GROUP BY department;​​执行步骤​​…

Claude-Flow AI协同开发:基础入门之 AI编排

1.1 引言&#xff1a;超越“代码生成器”的革命 在AI辅助开发的浪潮中&#xff0c;我们已经习惯了代码补全、函数生成等“代码生成器”工具。它们极大地提升了我们的编码效率&#xff0c;但通常仅限于解决孤立、单一的问题。当面对一个完整的项目或一个复杂的功能模块时&#x…

Linux中下载安装部署Redis7.4.5——并设置用户名、密码及其授权的保姆级教程

一、环境准备 环境准备 序号 说明 1 使⽤RHEL9或Almalinux9.1及其更高版本系统 #查看系统信息 cat /etc/os-release 2 Linux中需要Redis源码编译所需的gcc依赖 #1-检查是否已

健康度——设备健康续航条

在故障诊断与健康管理&#xff08;PHM&#xff09;领域和寿命预测领域中&#xff0c;健康度&#xff08;Health Index, HI&#xff09;是一个至关重要的概念&#xff0c;它旨在量化设备或系统的当前健康状态&#xff0c;并为预测其剩余使用寿命&#xff08;Remaining Useful Li…

【Python - 类库 - BeautifulSoup】(02)使用“BeautifulSoup“按类名获取内容

使用BeautifulSoup按类名获取内容 在本文中&#xff0c;我们将介绍如何使用BeautifulSoup按类名获取内容的方法。BeautifulSoup是一个用于解析HTML和XML文档的Python库。它可以方便地遍历和搜索文档树&#xff0c;使得我们能够轻松地提取想要的信息。 安装BeautifulSoup 首先&a…

36.Java序列化与反序列化是什么

36.Java序列化与反序列化是什么 序列化就是把Java对象转换成字节流&#xff08;二进制&#xff09;。 把对象保存到本地文件或网络传输。因为Java对象在JVM的堆内存中&#xff0c;JVM堆不存在了&#xff0c;对象也就不在了。 反序列化就是把字节流转换为对象 从文件或者网络里获…

c#泛型公共类示例

在C#中&#xff0c;泛型类是一种可以操作多种数据类型的类。这使得你可以编写更灵活、可重用的代码。泛型类通过在类名后使用尖括号<>和类型参数来定义。类型参数可以是具体的类型&#xff0c;如int或string&#xff0c;也可以是其他泛型类型&#xff0c;甚至是其他泛型类…

深入理解算法效率——时间和空间复杂度详解

目录 一、引言&#xff1a;为什么我们需要分析算法效率&#xff1f; 二、算法效率的维度 2.1 时间复杂度&#xff08;Time Complexity&#xff09; 2.2 空间复杂度&#xff08;Space Complexity&#xff09; 三、深入理解算法时间复杂度 3.1 时间复杂度的基础概念 3.2 大…

排序---冒泡排序(Bubble Sort)

一、算法核心概念 冒泡排序是一种简单的交换排序算法&#xff0c;其核心思想是&#xff1a;通过重复遍历待排序数组&#xff0c;每次比较相邻的两个元素&#xff0c;若它们的顺序错误&#xff08;如升序排序中前一个元素大于后一个&#xff09;&#xff0c;则交换它们的位置。经…

MCP(模型上下文协议)入门教程

MCP&#xff08;模型上下文协议&#xff09;入门教程&#xff1a;连接AI与外部世界的万能插座 1 MCP是什么&#xff1f; 1.1 基本概念 MCP&#xff08;Model Context Protocol&#xff0c;模型上下文协议&#xff09;是一个开放协议&#xff0c;专门用于AI模型与外部数据源和…

GO开发遇到的报错问题合集

本文将记录平时在go开发中遇到的一些错误信息&#xff0c;踩过的坑&#xff0c;并分析原因及提供解决方法&#xff0c;持续更新中...1、grpc 接口请求报错&#xff1a;Error: 13 INTERNAL: Response message parsing error: invalid wire type 7 at offset 316原因&#xff1a;…

Node.js 做 Web 后端优势为什么这么大?

Node.js自诞生以来&#xff0c;一步步演变变为现代Web后端开发的基石之一。无论是初创公司快速构建原型&#xff0c;还是大型企业支撑高并发业务&#xff0c;好像它哪儿哪儿都在&#xff0c;甚至还有人觉得它威胁到了PHP的地位。 那为什么Node.js 做 Web 后端优势那么大&#x…