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

基于SSM的小儿肺炎知识管理系统设计与实现

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


目录

一、项目简介

二、系统功能

三、系统项目截图

个人中心

管理员管理

肺炎咨询管理

基础数据管理

肺炎知识管理

今日动态管理

通知管理

商品管理

用户管理

轮播图管理

四、核心代码

登录相关

文件上传

封装


一、项目简介

当下,正处于信息化的时代,许多行业顺应时代的变化,结合使用计算机技术向数字化、信息化建设迈进。传统的信息管理模式,采用人工登记的方式保存相关数据,这种以人力为主的管理模式已然落后。本人结合使用主流的程序开发技术,设计了一款基于SSM的小儿肺炎知识管理系统,可以较大地减少人力、财力的损耗,方便相关人员及时更新和保存信息。本系统主要使用B/S开发模式,在idea集成开发环境下,采用Java语言编码设计系统功能,MySQL数据库管理相关的系统数据信息,SSM框架设计和开发系统功能架构,最后通过使用Tomcat服务器,在浏览器中发布设计的系统,并且完成系统与数据库的交互工作。本文对系统的需求分析、可行性分析、技术支持、功能设计、数据库设计、功能测试等内容做了较为详细的介绍,并且在本文中也展示了系统主要的功能模块设计界面和操作界面,并对其做出了必要的解释说明,方便用户对系统进行操作和使用,以及后期的相关人员对系统进行更新和维护。通过设计基于SSM的小儿肺炎知识管理系统,可以极大地提高相关人员的工作效率,提升用户的使用体验。


二、系统功能

通过结合系统分析阶段的相关内容,对系统的整体功能设计进行规划。由此可知,本系统的使用者主要可以被分为管理员角色和用户角色两类。其中,管理员角色主要的功能需求有用户信息管理、肺炎知识管理、肺炎咨询管理等模块,用户角色主要的功能需求有系统登录、查询肺炎知识、查询肺炎咨询信息等模块。

 



三、系统项目截图

个人中心

通过设计的个人中心管理功能模块,管理用户可以对相关的个人信息进行管理,比如管理用户可以更新个人账号的密码信息,修改个人账号的用户名信息等

 

管理员管理

通过设计的管理员管理功能模块,管理用户可以对相关的管理员信息进行管理,比如管理用户可以查看管理员的用户名信息,更新管理员密码,删除已经注销的管理员用户信息记录等 

 

肺炎咨询管理

通过设计的肺炎咨询管理功能模块,管理用户可以对相关的肺炎咨询信息进行管理,比如管理用户可以查看详细的肺炎咨询信息,删除失效的肺炎咨询信息记录等

 

基础数据管理

通过设计的基础数据管理功能模块,管理用户可以对相关的知识类型、动态类型、通知类型、商品类型信息进行管理,比如管理用户可以查看详细的知识类型、动态类型、通知类型、商品类型信息,删除失效的知识类型、动态类型、通知类型、商品类型信息记录等

 

 

肺炎知识管理

通过设计的肺炎知识管理功能模块,管理用户可以对相关的肺炎知识信息进行管理,比如管理用户可以查看详细的肺炎知识信息,删除失效的肺炎知识信息记录等 

今日动态管理

通过设计的肺炎知识管理功能模块,管理用户可以对相关的今日动态、今日动态留言信息进行管理,比如管理用户可以查看详细的今日动态、今日动态留言信息,删除失效的今日动态、今日动态留言信息记录等 

 

通知管理

通过设计的通知管理功能模块,管理用户可以对相关的肺炎知识通知信息进行管理,比如管理用户可以查看详细的肺炎知识通知信息,删除失效的肺炎知识通知信息记录等 

 

商品管理

通过设计的商品管理功能模块,管理用户可以对相关的商品、商品评价、商品订单信息进行管理,比如管理用户可以查看详细的商品、商品评价、商品订单信息,删除失效的商品、商品评价、商品订单信息记录等

 

 

用户管理

通过设计的用户管理功能模块,管理用户可以对相关的用户信息进行管理,比如管理用户可以查看用户头像信息,更新用户手机号码,删除已经注销的用户信息记录等

 

轮播图管理

通过设计的轮播图管理功能模块,管理用户可以对相关的轮播图信息进行管理,比如管理用户可以查看轮播图名称信息,删除失效的轮播图信息记录等

 


四、核心代码

登录相关


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{@Autowiredprivate UserService userService;@Autowiredprivate 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();}
}

文件上传

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")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);}}

封装

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;}
}

相关文章:

基于SSM的小儿肺炎知识管理系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…...

HuffMan tree

定义 给定N个权值作为N个叶子结点&#xff0c;构造一棵二叉树&#xff0c;若该树的带权路径长度达到最小&#xff0c;称这样的二叉树为最优二叉树&#xff0c;也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树&#xff0c;权值较大的结点离根较近。 基础知识 路…...

各地加速“双碳”落地,数字能源供应商怎么选?

作者 | 曾响铃 文 | 响铃说 随着我国力争2030年前实现“碳达峰”、2060年前实现“碳中和”的“双碳”目标提出&#xff0c;为各地区、各行业的低碳转型和绿色可持续发展制定“倒计时”时间表&#xff0c;一场围绕“数字能源”、“智慧能源”、“新能源”等关键词的创新探索进…...

19.java绘图

A.Graphics类 Graphics类是java.awt包中的一个类&#xff0c;它用于在图形用户界面&#xff08;GUI&#xff09;或其他图形应用程序中进行绘制。该类通常与Component的paint方法一起使用&#xff0c;以在组件上进行绘制操作。 一些Graphics类的常见用法和方法&#xff1a; 在组…...

提升工作效率,尽在Microsoft Office LTSC 2021 for Mac!

在当今的办公环境中&#xff0c;高效率的工作是每个人都追求的目标。作为全球领先的办公软件套装&#xff0c;Microsoft Office LTSC 2021 for Mac将为您提供一站式的解决方案&#xff0c;帮助您轻松应对各种工作任务。 首先&#xff0c;Microsoft Office LTSC 2021 for Mac拥…...

day24_java的反射机制

反射 一、反射的概念 反射&#xff1a;加载类&#xff0c;反射出类的各个组成部分&#xff08;类的成员&#xff1a;构造方法&#xff0c;属性&#xff0c;方法&#xff09; java反射机制&#xff1a;在运行状态中&#xff0c;对于任何一个类都能够知道这个类的所有属性和方…...

VUE学习二、创建一个前端项目

1.创建一个vue项目 使用命令 vue ui启动vue脚手架 vue ui 等待项目创建好 可以来任务栏启动项目 参数那里可以设置启动端口等参数 启动成功 成功访问 2. 用webstorm 打开项目 脚手架页面可安装基本依赖 比如路由 使用ws打开项目 启动项目 npm run serve 3.修改启动…...

「红队笔记」靶机精讲:Prime1 - 信息收集和分析能力的试炼

「红队笔记」靶机精讲&#xff1a;Prime1 - 信息收集和分析能力的试炼 本文是作者在观看 B 站《红队笔记》后做的一些笔记及相关知识的补充。学渗透特别推荐大家去看。如有侵权&#xff0c;请联系作者&#xff0c;作者看到后会第一时间删除。 靶机精讲之Prime1&#xff0c;vu…...

JVM虚拟机系统性学习-对象的创建流程及对象的访问定位

对象的创建流程与内存分配 对象创建流程如下&#xff1a; Java 中新创建的对象如何分配空间呢&#xff1f; new 的对象先放 Eden 区&#xff08;如果是大对象&#xff0c;直接放入老年代&#xff09;当 Eden 区满了之后&#xff0c;程序还需要创建对象&#xff0c;则垃圾回收…...

perf与火焰图-性能分析工具

参考链接 perf性能分析工具使用分享 如何读懂火焰图&#xff1f;-阮一峰 perf基本用法-record,report-知乎 火焰图抓取 准备&#xff1a; centos安装perf工具 dnf install perf下载火焰图解析代码 git clone https://github.com/brendangregg/FlameGraph.git抓取指定进程…...

UniGui使用CSSUniTreeMenu滚动条

有些人反应UniTreeMenu当菜单项目比较多的时候会超出但是没有出滚动条&#xff0c;只需要添加如下CSS 老规矩&#xff0c;unitreemeu的layout的componentcls里添加bbtreemenu&#xff0c;然后在css里添加 .bbtreemenu .x-box-item{ overflow-y: auto; } 然后当内容超出后就会…...

Spring框架中的五种常用设计模式

1、单例模式 Spring 的 Bean 默认是单例模式&#xff0c;通过 Spring 容器管理 Bean 的⽣命周期&#xff0c;保证每个 Bean 只被 创建⼀次&#xff0c;并在整个应⽤程序中重用。 2.工厂模式 Spring 使⽤⼯⼚模式通过 BeanFactory 和 ApplicationContext 创建并管理 Bean 对象…...

华纳云:docker启动报错的原因和解决方法

Docker 启动报错可能由多种原因引起。以下是一些建议&#xff0c;可用于解决 Docker 启动问题&#xff1a; 查看 Docker 日志&#xff1a; 查看 Docker 的日志可以提供更多的详细信息&#xff0c;有助于定位问题。 sudo journalctl -xe | grep docker 或者查看 Docker 服务的详…...

代码规范及开发工具

代码规范及开发工具&#xff1a; 前端&#xff08;vscode、idea&#xff09;: JavaScript规范&#xff1a; 1. 谷歌开源项目风格指南&#xff1a;JavaScript 、TypeScript篇 https://zh-google-styleguide.readthedocs.io/en/latest/google-typescript-…...

证件照制作小程序源代码

17638103951(同v)...

自治调优!人大金仓解放DBA双手

数据库系统的性能是确保整个应用系统高效运转的关键因素&#xff0c;因此数据库性能调优工作至关重要。KingbaseES通过将人工调优过程内化为数据库内核&#xff0c;成功实现了自治调优。这种创新的调优方案为DBA提供了更高效且准确的性能调优途径&#xff0c;同时也显著降低了数…...

深度学习环境配置------windows系统(GPU)------Pytorch

深度学习环境配置------windows系统&#xff08;GPU&#xff09;------Pytorch 准备工作明确操作系统明确显卡系列 CUDA和Cudnn下载与安装1.下载2.安装 环境配置过程1.安装Anacoda2.配置环境1&#xff09;创建一个新的虚拟环境2&#xff09;pytorch相关库的安装 2.安装VScode1&…...

el-menu标题过长显示不全问题处理

项目基于vue-element-admin 问题 期望 处理方式 \src\layout\components\Sidebar\index.vue 文件后添加CSS <style scped> /* 侧栏导航菜单经典 文字超长溢出问题 CSS折行 */ .el-submenu__title {display: flex;align-items: center; } .el-submenu__title span {white-…...

微信游戏开发:连接社交与娱乐的创新之路

在移动互联网时代&#xff0c;微信已经成为了人们日常生活中不可或缺的社交工具。而微信游戏&#xff0c;作为在这一平台上崛起的新兴产业&#xff0c;不仅给用户提供了更多娱乐选择&#xff0c;也为开发者们创造了独特的机遇。本文将探讨微信游戏开发的关键步骤、技术要点以及…...

1688一件采购实现指南:含代码实现采购流程

一、引言 1688是中国最大的B2B电子商务平台之一&#xff0c;提供了丰富的商品信息和采购服务。一键采购是1688平台的一项便捷功能&#xff0c;可以帮助用户快速完成采购流程&#xff0c;提高采购效率。本文将详细介绍如何使用1688一键采购功能&#xff0c;并通过代码示例演示如…...

Midscene.js:3大技术突破解决跨平台UI自动化的核心痛点

Midscene.js&#xff1a;3大技术突破解决跨平台UI自动化的核心痛点 【免费下载链接】midscene AI-powered, vision-driven UI automation for every platform. 项目地址: https://gitcode.com/GitHub_Trending/mid/midscene 在当今多平台应用爆发的时代&#xff0c;你是…...

别再只盯着时序图了!FPGA驱动AD7606的8通道同步采样,这3个实战细节才是关键

FPGA驱动AD7606的8通道同步采样&#xff1a;工程师必备的3个实战优化技巧 在工业自动化、电力监测等高精度数据采集领域&#xff0c;AD7606凭借其8通道同步采样和16位分辨率成为热门选择。然而在实际项目中&#xff0c;许多工程师发现&#xff0c;按照数据手册搭建的系统往往达…...

二维码识读设备选购全攻略:从核心需求到实战测试

1. 项目概述&#xff1a;为什么选对二维码识读设备这么重要&#xff1f;你可能觉得&#xff0c;不就是扫个码吗&#xff1f;手机摄像头都能搞定&#xff0c;专门的设备能有多大区别&#xff1f;我刚开始接触这个领域时也是这么想的&#xff0c;直到自己踩过几次坑&#xff0c;才…...

MCUXpresso for VS Code集成J-Link脚本的三种工程化方法详解

1. 项目概述&#xff1a;为什么要在IDE里折腾脚本&#xff1f;如果你是一位使用NXP MCU的嵌入式开发者&#xff0c;大概率对MCUXpresso IDE和SEGGER J-Link调试器这对黄金搭档不陌生。在传统的MCUXpresso IDE&#xff08;基于Eclipse&#xff09;里&#xff0c;通过图形界面配置…...

手把手教你用CT107D板子复现蓝桥杯省赛题:光敏传感器触发与长按按键的实战编程

从零实现CT107D光敏传感与长按按键&#xff1a;蓝桥杯省赛级开发指南 硬件准备与环境搭建 打开CT107D开发板的包装盒时&#xff0c;那股新电路板特有的松香味总是让人兴奋。作为蓝桥杯官方指定平台&#xff0c;这块板子集成了我们需要的所有外设模块。先找到板子右下角的光敏…...

别只盯着SQL注入了!聊聊SRC挖掘中那些被忽视的‘低垂果实’:XSS与弱口令实战复盘

别只盯着SQL注入了&#xff01;聊聊SRC挖掘中那些被忽视的‘低垂果实’&#xff1a;XSS与弱口令实战复盘 在安全圈摸爬滚打几年后&#xff0c;我发现一个有趣的现象&#xff1a;80%的新手挖洞者会像发现新大陆一样扑向SQL注入&#xff0c;却对触手可得的XSS和弱口令视而不见。这…...

Video2X:你的AI视频画质修复专家,让老旧视频重获新生

Video2X&#xff1a;你的AI视频画质修复专家&#xff0c;让老旧视频重获新生 【免费下载链接】video2x A machine learning-based video super resolution and frame interpolation framework. Est. Hack the Valley II, 2018. 项目地址: https://gitcode.com/GitHub_Trendin…...

数字孪生是什么?它在数字化转型中的关键角色是什么?

数字孪生的定义与应用现状 数字孪生技术利用实时映射物理实体到虚拟空间&#xff0c;为各类行业提供了无缝的连接与监控。例如&#xff0c;在制造行业&#xff0c;数字孪生可以模拟生产线&#xff0c;帮助企业快速识别瓶颈&#xff0c;提高效率。在城市管理方面&#xff0c;城市…...

信步SV3b-19016EP嵌入式主板深度解析:从选型到实战应用

1. 项目概述&#xff1a;为什么是SV3b-19016EP&#xff1f;在嵌入式系统开发这个行当里&#xff0c;选型永远是项目成败的第一步。最近几年&#xff0c;随着边缘计算、工业自动化、智能零售这些场景的爆发&#xff0c;大家对嵌入式主板的性能、接口丰富度和可靠性要求越来越高。…...

3个必知技巧:快速掌握Meshroom三维重建核心

3个必知技巧&#xff1a;快速掌握Meshroom三维重建核心 【免费下载链接】Meshroom Node-based Visual Programming Toolbox 项目地址: https://gitcode.com/gh_mirrors/me/Meshroom Meshroom是一款基于节点化视觉编程的开源三维重建软件&#xff0c;它能将你的照片和视频…...