当前位置: 首页 > news >正文

SpringBoot+Vue实现酒店客房管理系统

文末获取源码 

开发语言:Java

框架:springboot

JDK版本:JDK1.8

服务器:tomcat7

数据库:mysql 5.7/8.0

数据库工具:Navicat11

开发软件:eclipse/myeclipse/idea

Maven包:Maven3.3.9

浏览器:谷歌浏览器

一、前言介绍 

随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了酒店客房管理系统的开发全过程。通过分析酒店客房管理系统管理的不足,创建了一个计算机管理酒店客房管理系统的方案。文章介绍了酒店客房管理系统的系统分析部分,包括可行性分析等,系统设计部分主要介绍了系统功能设计和数据库设计。

本酒店客房管理系统有管理员,用户,会员,清洁人员。管理员功能有个人中心,用户管理,会员管理,清洁人员管理,客房信息管理,用户预约管理,会员预约管理,用户取消管理,会员取消管理,用户入住管理,会员入住管理,用户退房管理,会员退房管理,清扫房间管理,留言板管理,系统管理等。因而具有一定的实用性。 

本站是一个B/S模式系统,后台采用 Spring Boot框架,前台采用VUE框架,MYSQL数据库设计开发,充分保证系统的稳定性。系统具有界面清晰、操作简单,功能齐全的特点,使得酒店客房管理系统管理工作系统化、规范化。本系统的使用使管理人员从繁重的工作中解脱出来,实现无纸化办公,能够有效的提高酒店客房管理系统管理效率。 

二、系统结构

本系统是基于B/S 架构的网站系统,设计的功能结构图如下图所示: 

三、系统详细实现

3.1用户信息管理

酒店客房管理系统的系统管理员可以管理用户信息,可以对用户信息信息添加修改删除以及查询操作,具体界面的展示如图所示

3.2会员信息管理

系统管理员可以查看对会员信息信息进行添加,修改,删除以及查询操作。具体界面如图所示。 

3.3客房信息管理 

管理员可以对客房信息信息进行修改,删除以及查询操作。界面如下图所示: 

3.4收藏客房管理

用户登录后可以对客房信息进行收藏,预定。界面如下图所示: 

3.5用户入住管理 

管理员可以对用户入住信息进行管理,可以添加,修改,删除以及清扫。界面如下图所示: 

3.6客房清扫管理 

清洁人员登录可以对用户入住的客房进行清扫。界面如下图所示: 

四、部分核心代码  

/*** 上传文件映射表*/
@RestController
@RequestMapping("file")
@SuppressWarnings({"unchecked","rawtypes"})
public class FileController{@Autowiredprivate 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);/*** 如果使用idea或者eclipse重启项目,发现之前上传的图片或者文件丢失,将下面一行代码注释打开* 请将以下的"D:\\springbootq33sd\\src\\main\\resources\\static\\upload"替换成你本地项目的upload路径,* 并且项目路径不能存在中文、空格等特殊字符*/
//		FileUtils.copyFile(dest, new File("D:\\springbootq33sd\\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);}}
RestController
@RequestMapping("/kechengchengji")
public class KechengchengjiController {@Autowiredprivate KechengchengjiService kechengchengjiService;/*** 后端列表*/@RequestMapping("/page")public R page(@RequestParam Map<String, Object> params,KechengchengjiEntity kechengchengji,HttpServletRequest request){String tableName = request.getSession().getAttribute("tableName").toString();if(tableName.equals("jiaoshi")) {kechengchengji.setJiaoshizhanghao((String)request.getSession().getAttribute("username"));}if(tableName.equals("xuesheng")) {kechengchengji.setXuehao((String)request.getSession().getAttribute("username"));}EntityWrapper<KechengchengjiEntity> ew = new EntityWrapper<KechengchengjiEntity>();PageUtils page = kechengchengjiService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, kechengchengji), params), params));return R.ok().put("data", page);}/*** 前端列表*/@IgnoreAuth@RequestMapping("/list")public R list(@RequestParam Map<String, Object> params,KechengchengjiEntity kechengchengji, HttpServletRequest request){EntityWrapper<KechengchengjiEntity> ew = new EntityWrapper<KechengchengjiEntity>();PageUtils page = kechengchengjiService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, kechengchengji), params), params));return R.ok().put("data", page);}/*** 列表*/@RequestMapping("/lists")public R list( KechengchengjiEntity kechengchengji){EntityWrapper<KechengchengjiEntity> ew = new EntityWrapper<KechengchengjiEntity>();ew.allEq(MPUtil.allEQMapPre( kechengchengji, "kechengchengji")); return R.ok().put("data", kechengchengjiService.selectListView(ew));}/*** 查询*/@RequestMapping("/query")public R query(KechengchengjiEntity kechengchengji){EntityWrapper< KechengchengjiEntity> ew = new EntityWrapper< KechengchengjiEntity>();ew.allEq(MPUtil.allEQMapPre( kechengchengji, "kechengchengji")); KechengchengjiView kechengchengjiView =  kechengchengjiService.selectView(ew);return R.ok("查询课程成绩成功").put("data", kechengchengjiView);}/*** 后端详情*/@RequestMapping("/info/{id}")public R info(@PathVariable("id") Long id){KechengchengjiEntity kechengchengji = kechengchengjiService.selectById(id);return R.ok().put("data", kechengchengji);}/*** 前端详情*/@IgnoreAuth@RequestMapping("/detail/{id}")public R detail(@PathVariable("id") Long id){KechengchengjiEntity kechengchengji = kechengchengjiService.selectById(id);return R.ok().put("data", kechengchengji);}/*** 后端保存*/@RequestMapping("/save")public R save(@RequestBody KechengchengjiEntity kechengchengji, HttpServletRequest request){kechengchengji.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());//ValidatorUtils.validateEntity(kechengchengji);kechengchengjiService.insert(kechengchengji);return R.ok();}/*** 前端保存*/@RequestMapping("/add")public R add(@RequestBody KechengchengjiEntity kechengchengji, HttpServletRequest request){kechengchengji.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());//ValidatorUtils.validateEntity(kechengchengji);kechengchengjiService.insert(kechengchengji);return R.ok();}/*** 修改*/@RequestMapping("/update")public R update(@RequestBody KechengchengjiEntity kechengchengji, HttpServletRequest request){//ValidatorUtils.validateEntity(kechengchengji);kechengchengjiService.updateById(kechengchengji);//全部更新return R.ok();}/*** 删除*/@RequestMapping("/delete")public R delete(@RequestBody Long[] ids){kechengchengjiService.deleteBatchIds(Arrays.asList(ids));return R.ok();}/*** 提醒接口*/@RequestMapping("/remind/{columnName}/{type}")public R remindCount(@PathVariable("columnName") String columnName, HttpServletRequest request, @PathVariable("type") String type,@RequestParam Map<String, Object> map) {map.put("column", columnName);map.put("type", type);if(type.equals("2")) {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");Calendar c = Calendar.getInstance();Date remindStartDate = null;Date remindEndDate = null;if(map.get("remindstart")!=null) {Integer remindStart = Integer.parseInt(map.get("remindstart").toString());c.setTime(new Date()); c.add(Calendar.DAY_OF_MONTH,remindStart);remindStartDate = c.getTime();map.put("remindstart", sdf.format(remindStartDate));}if(map.get("remindend")!=null) {Integer remindEnd = Integer.parseInt(map.get("remindend").toString());c.setTime(new Date());c.add(Calendar.DAY_OF_MONTH,remindEnd);remindEndDate = c.getTime();map.put("remindend", sdf.format(remindEndDate));}}Wrapper<KechengchengjiEntity> wrapper = new EntityWrapper<KechengchengjiEntity>();if(map.get("remindstart")!=null) {wrapper.ge(columnName, map.get("remindstart"));}if(map.get("remindend")!=null) {wrapper.le(columnName, map.get("remindend"));}String tableName = request.getSession().getAttribute("tableName").toString();if(tableName.equals("jiaoshi")) {wrapper.eq("jiaoshizhanghao", (String)request.getSession().getAttribute("username"));}if(tableName.equals("xuesheng")) {wrapper.eq("xuehao", (String)request.getSession().getAttribute("username"));}int count = kechengchengjiService.selectCount(wrapper);return R.ok().put("count", count);}}

相关文章:

SpringBoot+Vue实现酒店客房管理系统

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7/8.0 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.3.9 浏…...

自适应多因素认证:构建不可破解的企业安全防线|身份云研究院

打开本文意味着你理解信息安全的重要性&#xff0c;并且希望获取行业最佳实践来保护你所在组织的信息安全。本文将带你了解多因素认证&#xff08;MFA&#xff1a;Multi-Factor-Authentication&#xff09;对于企业信息安全的重要性以及实施方法。 多因素认证&#xff08;MFA&…...

阶段二8_集合ArrayList_学生管理系统_详细步骤

一.学生管理系统案例 1.需求&#xff1a; 针对目前我们的所学内容&#xff0c;完成一个综合案例&#xff1a;学生管理系统&#xff01; 该系统主要功能如下&#xff1a; 1.添加学生&#xff1a;通过键盘录入学生信息&#xff0c;添加到集合中 2.删除学生&#xff1a;通过键盘录…...

一篇解决Linux 中的负载高低和 CPU 开销并不完全对应

负载是查看 Linux 服务器运行状态时很常用的一个性能指标。在观察线上服务器运行状况的时候&#xff0c;我们也是经常把负载找出来看一看。在线上请求压力过大的时候&#xff0c;经常是也伴随着负载的飙高。 但是负载的原理你真的理解了吗&#xff1f;我来列举几个问题&#x…...

关于IDM下载器,提示:一个假冒的序列号被用来注册……idea项目文件路径报红

关于IDM下载器&#xff0c;提示&#xff1a;一个假冒的序列号被用来注册……到C:\Windows\System32\drivers\etc 修改目录下面的hosts文件&#xff08;如果没有修改的权限就右键属性hosts文件修改user的权限为完全控制&#xff09;&#xff0c;在hosts里面增加以下内容&#xf…...

JVM - 高效并发

目录 Java内存模型和内存间的交互操作 Java内存模型 内存间的交互操作 内存间交互操作的规则 volatile特性 多线程中的可见性 volatile 指令重排原理和规则 指令重排 指令重排的基本规则 多线程中的有序性 线程安全处理 锁优化 锁优化之自旋锁与自适应自旋 锁优…...

中小学智慧校园电子班牌系统源码 Saas云平台模式

智慧电子班牌区别于传统电子班牌&#xff0c;智慧校园电子班牌系统更加注重老师和学生的沟通交流和及时数据交互。学校为每个教室配置一台智能电子班牌&#xff0c;一般安装于教室门口&#xff0c;用来实时显示学校通知、班级通知&#xff0c;可设置集中分布式管理&#xff0c;…...

记录一次服务器被攻击的经历

突然收到阿里云发过来的异常登陆的信息&#xff1a; 于是&#xff0c;急忙打开电脑查看对应的ECS服务器的记录&#xff1a; 发现服务器的cpu占用率异常飙升&#xff0c;所以可以大概断定服务器已经被非法入侵了。 通过自己的账号登陆后&#xff0c;发现sshd服务有异常的链接存…...

Python解题 - CSDN周赛第29期 - 争抢糖豆

本期问哥是志在必得&#xff0c;这本算法书我已经觊觎许久&#xff0c;而之前两次因为种种原因未能如愿。因此&#xff0c;问哥这几天花了不少时间&#xff0c;把所有之前在每日一练做过的题目重新梳理了一遍。苦心人&#xff0c;天不负&#xff0c;感谢官方大大&#xff01; 第…...

C代码中访问链接脚本中的符号

一、目的在之前的《GNU LD脚本命令语言&#xff08;一&#xff09;》、《GNU LD脚本命令语言&#xff08;二&#xff09;》我们介绍了GNU链接脚本的知识点&#xff0c;基本上对链接脚本中的SECTION、REGION、以及加载地址与执行地址的关系等内容有了一定的了解。本篇主要讲解链…...

MySQL 8:MySQL索引

索引就是通过一定的算法建立数据模型&#xff0c;用于快速查找某一列中具有特定值的行。如果没有索引&#xff0c;MySQL 必须从第一条记录开始读取整个表&#xff0c;直到找到相关的表。表越大&#xff0c;查询数据所花费的时间就越多。如果表中查询的列有索引&#xff0c;MySQ…...

JVM详解

一&#xff0c;JVM 1&#xff0c;JVM区域划分 类装载器&#xff0c;运行时数据区&#xff0c;字节码执行引擎 2&#xff0c;JVM内存模型&#xff08;运行时数据区&#xff09; 由本地方法栈&#xff0c;虚拟机栈&#xff0c;堆&#xff0c;方法区&#xff0c;和程序计数器组成。…...

MySQL数据库调优————索引数据结构

B-TREE B-TREE数据结构 B-TREE特性 根节点的子结点个数2 < X < m&#xff0c;m是树的阶 假设m 3&#xff0c;则根节点可有2-3个孩子 中间节点的子节点个数m/2 < y < m 假设m 3&#xff0c;中间节点至少有2个孩子&#xff0c;最多3个孩子 每个中间节点包含n个关…...

visual studio 改变界面语言

在使用visual studio 2019 时&#xff0c;开始是英文界面&#xff0c;后面变成了中文界面。但是看视频教学时有的是英文界面&#xff0c;我就想回到英文界面&#xff0c;所以有切换界面语言的需要。其实操作很简单&#xff1a;工具-> 选项 打开界面在界面里选择环境&#xf…...

2023.2.16每日一题——1250. 检查「好数组」

每日一题题目描述解题核心解法一&#xff1a;数论题目描述 题目链接&#xff1a;1250. 检查「好数组」 给你一个正整数数组 nums&#xff0c;你需要从中任选一些子集&#xff0c;然后将子集中每一个数乘以一个 任意整数&#xff0c;并求出他们的和。 假如该和结果为 1&#x…...

亿级高并发电商项目-- 实战篇 --万达商城项目 八(安装FastDFS、安装Nginx、文件服务模块、文件上传功能、商品功能与秒杀商品等功能)

专栏&#xff1a;高并发---分布式项目 &#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是小童&#xff0c;Java开发工程师&#xff0c;CSDN博客博主&#xff0c;Java领域新星创作者 &#x1f4d5;系列专栏&#xff1a;前端、Java、Java中间件大全、微信小程序、微信支…...

Viper捐款7000万韩元,合计人民币是多少钱?

Viper捐款7000万韩元&#xff0c;合计人民币是多少钱&#xff1f; #2023LCK春季赛##英雄联盟# #Viper捐款7000万韩元# Viper向大田东区捐款 7000 万&#xff0c;成为大田荣誉协会 105 号会员。Viper选手从 2019 年开始一直向大田东区捐款&#xff0c;但是他不希望这件事被公开…...

前端vue实现系统拦截跳转外链并进入跳转询问界面

跳转询问界面如下图所示&#xff1a; 给自己挖坑的实现方式&#xff0c;最终解决方案请看最底下 思路&#xff1a;正常情况下我们有2种方式跳转外链 第一种非a标签&#xff0c;我们手动添加事件进行跳转 <div class"dingdan public-padding p-item" click&quo…...

【Linux】Shell(Bash)单引号、双引号、不加引号和反引号用法和区别详解

简要总结 不加引号&#xff1a;不会将含有空格的字符串视为一个整体输出, 如果内容中有变量等&#xff0c;会先把变量解析出结果&#xff0c;然后在输出最终内容来&#xff0c;如果字符串中带有空格等特殊字符&#xff0c;则不能完整的输出&#xff0c;需要改加双引号&#xff…...

本人使用的idea插件

文章目录&#x1f68f; 本人使用的idea插件&#x1f6ac; pojo to Json&#x1f6ac; GsonFormatPlus&#x1f6ac; EasyYapi&#x1f6ac; Chinese (Simplified) Language Pack / 中文语言包&#x1f6ac; MyBatis Log Free&#x1f6ac; MyBatisPlusX&#x1f6ac; Statistic…...

站在行业C位,谷医堂打开健康管理服务新思路

对于农村及贫困地区老百姓来说&#xff0c;由于交通因素和家庭经济条件制约&#xff0c;看病难致身体调理情况一直不太乐观&#xff0c;这也导致心理压力很大。然而&#xff0c;随着近年中医药产业崛起与快速发展&#xff0c;这种局面很快就会得到改观&#xff0c;以湖南谷医堂…...

ABO溶血症概率

[简介]ABO溶血是由于母亲和胎儿ABO血型不合引起的新生儿溶血&#xff0c;概率不是很大&#xff0c;一般出现在准妈妈是O血&#xff0c;准爸爸是非O血&#xff0c;这次容易发生血型不合&#xff0c;但新生儿ABO溶血概率不高&#xff0c;大多数症状相对较轻。ABO溶血的概率是什么…...

【算法数据结构体系篇class03】:数组、链表、栈、队列、递归时间复杂度、哈希表、有序表问题

一、反转链表package class03;import java.util.ArrayList; import java.util.List;/*** 链表反转*/ public class ReverseLinkedList {public static class Node {public int value;public Node next;public Node(int data) {value data;}}public static class DoubleNode {p…...

【新2023】华为OD机试 - 最多提取子串数目(Python)

最多提取子串数目 题目 给定由 [a-z] 26 个英文小写字母组成的字符串 A 和 B,其中 A 中可能存在重复字母,B 中不会存在重复字母 现从字符串 A 中按规则挑选一些字母,可以组成字符串 B。 挑选规则如下: 1) 同一个位置的字母只能被挑选一次 2) 被挑选字母的相对先后顺序不…...

嵌入式C语言设计模式 --- 代理模式

1 - 什么是代理模式? 代理模式(Proxy Pattern),是指当客户端无法访问某个对象或者访问某个对象存在困难的时候,可以通过一个代理对象来进行间接访问。 举一个生活中的例子,比如,我们在买火车票或者飞机票的时候,有时候不会直接在12306或者航空公司官网上面购买,而是…...

前端性能优化的整理笔记

&#x1f6b4; 前言大厂面试题分享 面试题库后端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★地址&#xff1a;前端面试题库&#x1f3c4;利用碎片化的时间&#xff0c;系统的整理&#xff0c;性能优化的知识点。&#x1f3af; 前端性能优化&#xf…...

springboot+mybatis连接数据库实现增删改查功能

springbootmybatis连接数据库实现增删改查功能创建表创建项目实体类DAO接口写sql的XML文件Service层Controller启动类结果目录结构参考博客创建表 create table user(id int ,name varchar(30),pwd varchar(40) )insert into user values(2,hxf,789101),(3,hlm,789102),(4,hzh…...

疑似45亿地址信息泄露事件跟进后续

开放隐私计算 收录于合集#数据安全13个开放隐私计算开放隐私计算OpenMPC是国内第一个且影响力最大的隐私计算开放社区。社区秉承开放共享的精神&#xff0c;专注于隐私计算行业的研究与布道。社区致力于隐私计算技术的传播&#xff0c;愿成为中国 “隐私计算最后一公里的服务区…...

Hadoop集群配置

一、系统文件配置集群部署规划NameNode和SecondaryNameNode不要安装在同一台服务器ResourceManager也很消耗内存&#xff0c;不要和NameNode、SecondaryNameNode放在同一台机器上。这里装了四台机器&#xff0c;ant151,ant152,ant153,ant154。ant151ant152ant153ant154NameNode…...

【C语言】程序环境和预处理|预处理详解|定义宏(下)

主页&#xff1a;114514的代码大冒 qq:2188956112&#xff08;欢迎小伙伴呀hi✿(。◕ᴗ◕。)✿ &#xff09; Gitee&#xff1a;庄嘉豪 (zhuang-jiahaoxxx) - Gitee.com 文章目录 目录 文章目录 前言 2.5带副作用的宏参数 2.6宏和函数的对比 3#undef ​编辑 4 命令行定义…...

微网站的图标怎么做/seo优化推广教程

一、介绍Oracle的同义词(synonyms)从字面上理解就是别名的意思&#xff0c;和视图的功能类似&#xff0c;就是一种映射关系。它可以节省大量的数据库空间&#xff0c;对不同用户的操作同一张表没有多少差别;它扩展了数据库的使用范围&#xff0c;能够在不同的数据库用户之间实现…...

网站建设公司 网络服务/最新app推广项目平台

2019年要看的书&#xff0c;看完做记录转载于:https://www.cnblogs.com/knuzy/p/10325517.html...

做静态网站软件/百度知道首页官网

远程医疗是什么远程医疗是指通过计算机技术、通信技术与多媒体技术&#xff0c;同医疗技术相结合&#xff0c;旨在提高诊断与医疗水平、降低医疗开支、满足广大人民群众保健需求的一项全新的医疗服务。目前&#xff0c;远程医疗技术已经从最初的电视监护、电话远程诊断发展到利…...

怎么盗取网站/培训机构招生方案

目录一 开启线程的两种方式#方式一from threading import Threadimport timedef sayhi(name):time.sleep(2)print(%s say hello %name)if name main:tThread(targetsayhi,args(egon,))t.start()print(主线程)方式二from threading import Threadimport timeclass Sayhi(Thread…...

用自己的名字做网站域名/南昌关键词优化软件

记录今天遇到的一个小问题&#xff1a; AtomicInteger atomicInteger new AtomicInteger();System.out.println(atomicInteger.getAndIncrement()); 大家可以先猜想一下这个输出的是几&#xff0c;我之前一直以为是1&#xff0c;但是今天发现好像并不是。它是0。 public fina…...

免费网站建站一级大陆/app推广方式

VMware公司CEO Pat Gelsinger昨天表示&#xff0c;该公司即将公布其完整的云原生应用堆栈&#xff0c;但根据我们今天得到的消息&#xff0c;其中被描述为“微虚拟机管理程序”的Photon Machine也许并不那么袖珍。 VMware公司的云原生应用程序运行于Photon OS之上——这是一款轻…...