基于SSM的共享客栈管理系统的设计与实现

news2024/12/23 11:29:16

末尾获取源码
开发语言:Java
Java开发工具:JDK1.8
后端框架:SSM
前端:采用JSP技术开发
数据库:MySQL5.7和Navicat管理工具结合
服务器:Tomcat8.5
开发软件:IDEA / Eclipse
是否Maven项目:是


目录

一、项目简介

二、数据库设计

数据库概念设计

数据库物理设计 

房屋出租信息表

房东信息表 

房屋类型信息表 

房屋信息表 

合同信息表 

新闻资讯信息表 

管理员信息表 

用户信息表 

三、系统项目截图

房东管理

用户管理

合同管理

房屋评论管理

房屋管理

房屋出租管理

房屋管理

合同管理

客栈信息

新闻资讯

房屋信息

租房信息

四、核心代码

4.1登录相关

4.2文件上传

4.3封装


一、项目简介

互联网发展至今,无论是其理论还是技术都已经成熟,而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播,搭配信息管理工具可以很好地为人们提供服务。所以各行业,尤其是规模较大的企业和学校等都开始借助互联网和软件工具管理信息,传播信息,共享信息等等,以此可以增强自身实力,提高在同行业当中的竞争能力,并从各种激烈的竞争中获取发展的机会。针对房屋出租信息管理混乱,出错率高,信息安全性差,劳动强度大,费时费力等问题,经过分析和考虑,在目前的情况下,可以引进一款共享客栈管理系统这样的现代化管理工具,这个工具就是解决上述问题的最好的解决方案。它不仅可以实时完成信息处理,还缩短房屋出租信息管理流程,使其系统化和规范化。同时还可以减少工作量,节约房屋出租信息管理需要的人力和资金。所以共享客栈管理系统是信息管理环节中不可缺少的工具,它对管理者来说非常重要。


二、数据库设计

开发一个系统也需要提前设计数据库。这里的数据库是相关数据的集合,存储在一起的这些数据也是按照一定的组织方式进行的。目前,数据库能够服务于多种应用程序,则是源于它存储方式最佳,具备数据冗余率低的优势。虽然数据库为程序提供信息存储服务,但它与程序之间也可以保持较高的独立性。总而言之,数据库经历了很长一段时间的发展,从最初的不为人知,到现在的人尽皆知,其相关技术也越发成熟,同时也拥有着坚实的理论基础。

数据库概念设计

这部分内容需要借助数据库关系图来完成,也需要使用专门绘制数据库关系图的工具,比如Visio工具就可以设计E-R图(数据库关系图)。设计数据库,也需要按照设计的流程进行,首先还是要根据需求完成实体的确定,分析实体具有的特征,还有对实体间的关联关系进行确定。最后才是使用E-R模型的表示方法,绘制本系统的E-R图。不管是使用亿图软件,还是Visio工具,对于E-R模型的表示符号都一样,通常矩形代表实体,实体间存在的关系用菱形符号表示,实体的属性也就是实体的特征用符号椭圆表示。最后使用直线将矩形,菱形和椭圆等符号连接起来。接下来就开始对本系统的E-R图进行绘制。

(1)下图是合同实体和其具备的属性。

(2)下图是房东实体和其具备的属性。

 (3)下图是房屋实体和其具备的属性。

 (4)下图是用户实体和其具备的属性。

 

 (5)下图为上述各实体间相互之间的关系。

 

数据库物理设计 

本数据库是关系型数据库,因此对二维表的结构设计也比较关键。毕竟二维表格模型就是关系型数据库中的关系模型。而一些常用的关系模型中的概念也需要了解,才可以对关系模型进行设计。下面就简单介绍关系,元组,属性,域,关键字等常用概念的含义。

关系:关系就是数据库中的一张数据表,每张数据表都有命名,也就是每个关系也有名字,那就是数据表名;

元组:元组就是数据表中的一行记录;

属性:属性就是数据表中的字段,也就是数据表中的一列;

域:域就是对数据表中属性的取值进行限定;

关键字:关键字就是数据表中的主键;

在了解了表结构设计的常用概念后,接下来就需要使用前面绘制的E-R模型完成表结构的设计工作,并在数据库中创建数据表,并为各个数据表进行命名。以下就对设计的结果通过表格形式进行展示。

房屋出租信息表

字段

类型

默认

注释

id (主键)

int(11)

主键

fw_types

tinyint(255)

NULL

房屋名称  

fd_types

tinyint(255)

NULL

房东姓名  

yh_types

tinyint(255)

NULL

用户姓名   

create_time

timestamp

NULL

租房时间

finish_time

timestamp

NULL

结束租房时间

房东信息表 

字段

类型

默认

注释

id (主键)

int(11)

id

name

varchar(255)

NULL

姓名  

account

varchar(255)

NULL

账号

password

varchar(255)

NULL

密码

img_photo

varchar(255)

NULL

头像

role

varchar(255)

NULL

身份

房屋类型信息表 

字段

类型

默认

注释

id (主键)

int(11)

主键

fwname

varchar(255)

NULL

房屋类型  

房屋信息表 

字段

类型

默认

注释

id (主键)

int(11)

主键

fwname

varchar(255)

NULL

房屋名称  

fwlx_types

tinyint(4)

NULL

房屋类型  

money

decimal(10,0)

NULL

一个月的价格

img_photo

varchar(255)

NULL

房屋图片

address

varchar(255)

NULL

地址

fwstate_types

tinyint(255)

NULL

房屋状态  

fd_types

tinyint(255)

NULL

所属房东

phone

varchar(255)

NULL

房东联系电话

notice_content

varchar(255)

NULL

具体信息

合同信息表 

字段

类型

默认

注释

id (主键)

int(11)

主键

htname

varchar(255)

NULL

合同名称

prove_file

varchar(255)

NULL

附件信息

fd_types

tinyint(255)

NULL

甲方名称  

yh_types

tinyint(255)

NULL

乙方名称  

create_time

datetime

NULL

签约时间

新闻资讯信息表 

字段

类型

默认

注释

id (主键)

bigint(20)

主键

addtime

timestamp

CURRENT_TIMESTAMP

创建时间

title

varchar(200)

标题

img_photo

varchar(200)

图片

notice_content

longtext

内容

管理员信息表 

字段

类型

默认

注释

id (主键)

int(20)

主键

username

varchar(100)

用户名

password

varchar(100)

密码

role

varchar(100)

管理员

角色

addtime

timestamp

CURRENT_TIMESTAMP

新增时间

用户信息表 

字段

类型

默认

注释

id (主键)

int(11)

id

name

varchar(255)

NULL

姓名  

account

varchar(255)

NULL

账号

password

varchar(255)

NULL

密码

img_photo

varchar(255)

NULL

头像

role

varchar(255)

NULL

身份



三、系统项目截图

房东管理

管理员进入指定功能操作区之后可以管理房东。其页面见下图。管理员可以增删改查房东资料。

用户管理

管理员进入指定功能操作区之后可以管理用户。其页面见下图。管理员增删改查用户资料。

 

合同管理

管理员进入指定功能操作区之后可以管理合同。其页面见下图。管理员在本页面可以增删改查合同信息,可以实现合同文件下载功能。

 

房屋评论管理

管理员进入指定功能操作区之后可以管理房屋评论信息。其页面见下图。房屋评论信息是用户发布的信息,管理员查看评论内容,可以回复用户评论。

 

房屋管理

管理员进入指定功能操作区之后可以管理房屋信息。其页面见下图。管理员增删改查房屋信息,查看房屋状态,房屋所属房东以及房东的联系电话。

 

房屋出租管理

房东进入指定功能操作区之后可以管理房屋出租信息。其页面见下图。房东对已经出租的房屋进行租房取消或者续租操作。

 

房屋管理

房东进入指定功能操作区之后可以管理房屋。其页面见下图。房东管理房屋信息,包括房屋信息登记,修改,查询等操作。

 

合同管理

房东进入指定功能操作区之后可以管理合同。其页面见下图。房东登记合同信息时,需要上传合同文件,房东在本页面内对已有的合同信息进行维护。

 

客栈信息

用户进入指定功能操作区之后可以查看客栈信息。其页面见下图。用户查看房屋介绍,可以选择立即租房,也能评价本页面显示的房屋。

 

新闻资讯

用户进入指定功能操作区之后可以查看新闻资讯。其页面见下图。用户查看各种新闻的标题以及详细内容。

 

房屋信息

用户进入个人后台在房屋信息页面也能进行租房。其页面见下图。用户点击租房按钮设置租房日期即可成功租房。

 

租房信息

用户进入个人后台在租房信息页面可以取消租房。其页面见下图。用户查询租房信息,可以取消租房。

 


四、核心代码

4.1登录相关


package com.controller;


import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
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.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import com.annotation.IgnoreAuth;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.entity.TokenEntity;
import com.entity.UserEntity;
import com.service.TokenService;
import com.service.UserService;
import com.utils.CommonUtil;
import com.utils.MD5Util;
import com.utils.MPUtil;
import com.utils.PageUtils;
import com.utils.R;
import com.utils.ValidatorUtils;

/**
 * 登录相关
 */
@RequestMapping("users")
@RestController
public class UserController{
	
	@Autowired
	private UserService userService;
	
	@Autowired
	private TokenService tokenService;

	/**
	 * 登录
	 */
	@IgnoreAuth
	@PostMapping(value = "/login")
	public R login(String username, String password, String captcha, HttpServletRequest request) {
		UserEntity user = userService.selectOne(new EntityWrapper<UserEntity>().eq("username", username));
		if(user==null || !user.getPassword().equals(password)) {
			return R.error("账号或密码不正确");
		}
		String token = tokenService.generateToken(user.getId(),username, "users", user.getRole());
		return R.ok().put("token", token);
	}
	
	/**
	 * 注册
	 */
	@IgnoreAuth
	@PostMapping(value = "/register")
	public R register(@RequestBody UserEntity user){
//    	ValidatorUtils.validateEntity(user);
    	if(userService.selectOne(new EntityWrapper<UserEntity>().eq("username", user.getUsername())) !=null) {
    		return R.error("用户已存在");
    	}
        userService.insert(user);
        return R.ok();
    }

	/**
	 * 退出
	 */
	@GetMapping(value = "logout")
	public R logout(HttpServletRequest request) {
		request.getSession().invalidate();
		return R.ok("退出成功");
	}
	
	/**
     * 密码重置
     */
    @IgnoreAuth
	@RequestMapping(value = "/resetPass")
    public R resetPass(String username, HttpServletRequest request){
    	UserEntity user = userService.selectOne(new EntityWrapper<UserEntity>().eq("username", username));
    	if(user==null) {
    		return R.error("账号不存在");
    	}
    	user.setPassword("123456");
        userService.update(user,null);
        return R.ok("密码已重置为:123456");
    }
	
	/**
     * 列表
     */
    @RequestMapping("/page")
    public R page(@RequestParam Map<String, Object> params,UserEntity user){
        EntityWrapper<UserEntity> ew = new EntityWrapper<UserEntity>();
    	PageUtils page = userService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.allLike(ew, user), params), params));
        return R.ok().put("data", page);
    }

	/**
     * 列表
     */
    @RequestMapping("/list")
    public R list( UserEntity user){
       	EntityWrapper<UserEntity> ew = new EntityWrapper<UserEntity>();
      	ew.allEq(MPUtil.allEQMapPre( user, "user")); 
        return R.ok().put("data", userService.selectListView(ew));
    }

    /**
     * 信息
     */
    @RequestMapping("/info/{id}")
    public R info(@PathVariable("id") String id){
        UserEntity user = userService.selectById(id);
        return R.ok().put("data", user);
    }
    
    /**
     * 获取用户的session用户信息
     */
    @RequestMapping("/session")
    public R getCurrUser(HttpServletRequest request){
    	Long id = (Long)request.getSession().getAttribute("userId");
        UserEntity user = userService.selectById(id);
        return R.ok().put("data", user);
    }

    /**
     * 保存
     */
    @PostMapping("/save")
    public R save(@RequestBody UserEntity user){
//    	ValidatorUtils.validateEntity(user);
    	if(userService.selectOne(new EntityWrapper<UserEntity>().eq("username", user.getUsername())) !=null) {
    		return R.error("用户已存在");
    	}
        userService.insert(user);
        return R.ok();
    }

    /**
     * 修改
     */
    @RequestMapping("/update")
    public R update(@RequestBody UserEntity user){
//        ValidatorUtils.validateEntity(user);
        userService.updateById(user);//全部更新
        return R.ok();
    }

    /**
     * 删除
     */
    @RequestMapping("/delete")
    public R delete(@RequestBody Long[] ids){
        userService.deleteBatchIds(Arrays.asList(ids));
        return R.ok();
    }
}

4.2文件上传

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")
	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);
		FileUtils.copyFile(dest, new File("C:\\Users\\Desktop\\jiadian\\springbootl7own\\src\\main\\resources\\static\\upload"+"/"+fileName));
		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()){
				/*if(!fileService.canRead(file, SessionManager.getSessionUser())){
					getResponse().sendError(403);
				}*/
				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);
	}
	
}

4.3封装

package com.utils;

import java.util.HashMap;
import java.util.Map;

/**
 * 返回数据
 */
public class R extends HashMap<String, Object> {
	private static final long serialVersionUID = 1L;
	
	public R() {
		put("code", 0);
	}
	
	public static R error() {
		return error(500, "未知异常,请联系管理员");
	}
	
	public static R error(String msg) {
		return error(500, msg);
	}
	
	public static R error(int code, String msg) {
		R r = new R();
		r.put("code", code);
		r.put("msg", msg);
		return r;
	}

	public static R ok(String msg) {
		R r = new R();
		r.put("msg", msg);
		return r;
	}
	
	public static R ok(Map<String, Object> map) {
		R r = new R();
		r.putAll(map);
		return r;
	}
	
	public static R ok() {
		return new R();
	}

	public R put(String key, Object value) {
		super.put(key, value);
		return this;
	}
}

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

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

相关文章

50etf期权的隐含波动率是什么意思?最通俗易懂的解释!

上证50ETF期权波动率是指衡量上证50ETF期权价格变动程度的指标&#xff0c;接触过期权的人应该都知道50etf期权的隐含波动率这个词。这是一个神秘的概念&#xff0c;初学者不容易理解&#xff0c;下文介绍50etf期权的隐含波动率是什么意思&#xff1f;隐波到底是什么&#xff1…

一分钟学会自制产品图册

​想自己制作精美的产品图册吗&#xff1f; 只需要一分钟&#xff01; 首先&#xff0c;你需要一款简单的制作工具&#xff0c;比如&#xff1a;FLBOOK在线制作电子杂志平台 1.点击开始创作选择套用模板制作 2.点击立即使用进入编辑页面 3.进入编辑页面后制作产品册时可以添加…

如何在 Vue.js 和 Nuxt.js 之间做出选择?

开篇 今天看了一位国外大佬的文章&#xff0c;主要是他对在项目中如何选择 Vue.js 或 Nuxt.js 的看法&#xff0c;欢迎大家在评论区发表看法&#xff0c;以下内容是他关于这个问题看法的整理&#xff0c;由于翻译水平有限&#xff0c;欢迎大家指正。 国外大佬的看法 Vue.js在开…

5.5 【MySQL】Page Header(页面头部)

在页中定义了一个叫Page Header的部分&#xff0c;它是页结构的第二部分&#xff0c;这个部分占用固定的56个字节&#xff0c;专门存储各种状态信息&#xff0c;具体如下&#xff1a; 名称 占用空间大小 描述 PAGE_N_DIR_SLOTS 2 字节 在页目录中的槽数量 PAGE_HEAP_TOP …

MySQL数据库——存储引擎(2)-存储引擎特点(InnoDB、MyISAM、Memory)、存储引擎选择

目录 存储引擎特点 InnoDB 介绍 特点 文件 逻辑存储结构 MyISAM 介绍 特点 文件 Memory 介绍 特点 文件 区别及特点 存储引擎选择 存储引擎特点 上面我们介绍了什么是存储引擎&#xff0c;以及如何在建表时如何指定存储引擎&#xff0c;接下来我们就来介绍比较…

【脑机接口】基于电子皮肤的先进可穿戴健康管理技术

第一作者&#xff1a;Vibhas Chugh 通讯单位&#xff1a;佛罗里达理工大学&#xff0c;印度摩哈利纳米科学与技术研究所. DOI: 10.1016/j.crbiot.2023.100129 背景介绍 人类的皮肤是与外界环境隔离的天然屏障&#xff0c;它具有感知各种感觉、温度变化和触摸压力的能力。皮…

python3在虚拟环境实用vscode调试错误输出ModuleNotFoundError: No module named ‘django‘解决方法

Exception has occurred: ImportError Couldnt import Django. Are you sure its installed and available on your PYTHONPATH environment variable? Did you forget to activate a virtual environment?File "/data/mountain-backend/src/manage.py", line 8, i…

科普|含铊废水的来源及处理工艺介绍

铊(Tl)是一种银白色的金属&#xff0c;由于具有良好的延展性和导电性&#xff0c;被广泛用于电子、军工、航天、化工、冶金等众多领域。但在自然环境中含量很低&#xff0c;常在铅、铁、锌、铜等金属硫化矿中伴生&#xff0c;还以有机物结合形式存在于煤田和石油中。 铊的对于人…

数字化转型背景下企业知识管理能力提升路径

近年来&#xff0c;科技不断进步&#xff0c;颠覆性技术&#xff08;例如 5G、云计算、物联网、大数据分析和人工智能等&#xff09;正在重新定义企业如何管理项目和运营效率。知识管理体系亦需要随着科技的进步而改变&#xff0c;以适应新的数字时代环境&#xff0c;并且高效知…

【算法题】1462. 课程表 IV

题目&#xff1a; 你总共需要上 numCourses 门课&#xff0c;课程编号依次为 0 到 numCourses-1 。你会得到一个数组 prerequisite &#xff0c;其中 prerequisites[i] [ai, bi] 表示如果你想选 bi 课程&#xff0c;你 必须 先选 ai 课程。 有的课会有直接的先修课程&#x…

Python从零到一构建项目

随着互联网的发展&#xff0c;网络上的信息量急剧增长&#xff0c;而获取、整理和分析这些信息对于很多人来说是一项艰巨的任务。而Python作为一种功能强大的编程语言&#xff0c;它的爬虫能力使得我们能够自动化地从网页中获取数据&#xff0c;大大提高了效率。本文将分享如何…

tkinter树形图组件

文章目录 初步回调函数绑定滚动条 初步 Treeview是ttk中的树形表组件&#xff0c;功能十分强大&#xff0c;非常适用于系统路径的表达。为了知道属性图到底是什么&#xff0c;下面先做个最简单的树形图 其代码如下 import tkinter as tk from tkinter import ttkdct {"…

datagridview设置随窗口改变大小

1&#xff0c;只需设置Anchor属性 2&#xff0c;捕捉Enter键 设置AcceptButton属性即可 这样的话&#xff0c;按下Enter键&#xff0c;直接到按钮btnApply

香橙派使用外设驱动库wiringOP 配合定时器来驱动舵机

舵机认识和硬件接线 关于舵机也是使用过很多次了&#xff0c;详见&#xff1a; 使用PWM波控制开发SG90-CSDN博客 同时再次回顾香橙派的物理引脚对应&#xff1a; 所以舵机的VCC接 2&#xff0c;GND接 6&#xff0c;PWM接 7&#xff08;此处写的是物理引脚编号&#xff09; Li…

9月11日作业

思维导图 代码 #include <iostream> #include<string.h>using namespace std;class myString { private:char *str; //记录c风格的字符串int size; //记录字符串的实际长度 public://无参构造myString():size(10){str new char[size]; …

JAVAWEB,tomcat,MVC

注意,这里有三大语言来实现动态网页技术 如果用户访问的是静态内容,比如固定html页面,web服务器就够了 其中,中间件帮忙处理很多东西,复杂的东西他来帮忙完成 正常来说,搭建web服务需要web服务器,web容器两个东西,但是tomcat相当于集成了这两个,不过有些项目里不会把tomcat当做…

借助ChatGPT使用Pandas实现Excel数据汇总

一、问题的提出 现在有如下一个Excel表&#xff1a; 上述Excel表中8万多条数据&#xff0c;记录的都是三年以来花菜类的销量&#xff0c;现在要求按月汇总实现统计每个月花菜类的销量总和&#xff0c;如果使用Python的话要给出代码。 二、问题的解决 1.首先可以用透视表的方…

BGA封装检测

1.BGA封装检测 1.1 应用示例目的与思路 (1) 从输入图像中裁剪出包含BGA区域的图像&#xff1b; (2) 对BGA区域进行特征筛选&#xff0c;筛选出尺寸和形状均不正常的球形焊点&#xff1b; (3) 对尺寸和形状不正常的球形焊点分别用圆和交叉线标记出来。 1.2 应用示例相关算子…

【算法挨揍日记】day04——15. 三数之和、18. 四数之和

15. 三数之和 15. 三数之和https://leetcode.cn/problems/3sum/ 题目描述&#xff1a; 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请你返回所…

零基础报考湖北省叉车N1特种设备作业Z难不难?

零基础报考湖北省叉车N1特种设备作业Z难不难&#xff1f; 零基础报考叉车指的是没有从事叉车行业&#xff0c;没有实际操作经验的这类人员报考湖北特种设备作业人员N1(叉车)难度。叙后尘告诉你其实蛮简单。跟你梳理一下报考相关事项。 湖北叉车报考-在哪里报名 正常来说自己报…