【毕设分享】springboot旅游系统55916
源码获取私信联系我即可~大家点赞、收藏、关注、评论啦精彩专栏推荐订阅在下方专栏 精彩专栏 推荐订阅java精品项目案例【2000套】Java精品项目案例【2000套】https://blog.csdn.net/2401_88653928/category_13187615.htmlPython精品项目案例【500套】uniapp/微信小程序/安卓app【1800套】✅文末获取源码✅感兴趣的可以先收藏起来还有大家在毕设选题项目以及论文编写等相关问题都可以找我咨询希望帮助更多的人❤️目录摘要Abstract1 绪论1.1 研究背景与意义1.2 国内外研究现状1.3 主要研究内容2 相关技术介绍2.1 Java语言2.2 Spring Boot框架2.3 Vue.js框架2.4 MySQL数据库2.5 前后端分离架构3 系统分析3.1 可行性分析3.1.1 技术可行性3.1.2 操作可行性3.1.3 经济可行性3.1.4 社会可行性3.2 功能需求分析3.2.1 用户功能3.2.2 管理员功能4 系统设计4.1 系统架构设计4.2 系统结构功能设计4.3 系统流程设计4.3.1 系统总体业务流程设计4.3.2 景点购票流程设计4.3.3 酒店预订流程设计4.3.4 出行计划提交流程设计4.3.5 订单支付流程设计4.4 数据库设计4.4.1 E-R图设计4.4.2 数据库表设计5 系统实现5.1 用户功能实现5.1.1 旅游景点列表功能实现5.1.2 酒店信息列表功能实现5.1.3 出行计划功能实现5.1.4 个人中心功能实现5.2 管理员功能实现5.2.1 首页功能实现5.2.2 旅游景点管理功能实现5.2.3 景点购票管理功能实现5.2.4 酒店信息管理功能实现5.2.5 酒店预订管理功能实现5.2.6 出行计划管理功能实现6 系统测试6.1 测试目的6.2 测试方法6.3 测试内容6.4 测试结论7 总结参考文献致谢功能需求分析用户功能用户能在贵州旅游平台内查看到各种旅游景点的相关资料信息平台提供景点查询功能用户依照自身需求筛选出想要了解的景点并查看对应的图文解说信息。若确定前往游玩则可在平台上直接进行景点门票订购挑选票种数量等后生成订单。酒店信息同样也可以自由阅览用户寻找到合适的酒店后可查看对应的房间信息并选择合适类型后即可进入到预定环节输入入住信息后提交即可生成酒店预定订单支付部分包含门票订购和酒店预定两种方式由平台调用其他接口进行支付处理。用户也可以自主创建自己的出行方案制定线路信息并上传给平台个人中心集中展示了历史订单及计划用户能查看到之前所订的景点门票记录或酒店预定情况也可看见自己上传过的出行方案记录用户角色用例图如下图3-1所示管理员功能管理员用于对贵州旅游业系统的后台的数据以及业务进行管理和维护。管理员登录后跳转到数据看板首页该模块中用图表的形式对景点购票总数、酒店预定数量以及不同类别的热度统计进行汇总展示。旅游景点信息模块用于管理员统一管理景点信息包括增加新的景点信息修改已有信息删除无用信息。景点购票管理是对用户的购票订单进行管理管理员可以根据需要进行订单列表查询、查看单个订单详情、修改订单情况或者删除错误订单。酒店信息管理模块与之相似是关于酒店的基础信息进行添加、删除、编辑、修改等操作。酒店预定管理模块是管理用户预定的酒店房间的单据管理员可以进行查询、查看详情、更改状态、删除信息的操作。出行计划管理模块可以使管理员浏览到用户所上传的各种出行方案并且检查它们是否有不合理的地方并加以改正或者删除不合适的计划。管理员角色用例图如图3-2所示。系统架构设计该系统以模块化的思想构建。前后端展现、后端业务逻辑处理及数据持久化各司其职有效的保障了程序结构层次分明易于维护。用户发出的请求通过浏览器发出前端vue.js负责页面的渲染及用户的操作反馈与spring boot后端应用之间通过axios异步请求实现http通信。后端接收到请求之后将对传入的参数进行解析交由相关的service层完成主要的业务逻辑运算包括事务控制数据验证以及业务逻辑的计算。最后由dao层使用mybatis连接mysql数据库完成持久化或是查询的工作这种分离式的组织结构使得模块之间的耦合性降低提高了系统的整体性能以及数据的一致性[17]。系统完成了旅游景区展示、在线门票预约、酒店信息检索预订、出行计划管理、后台统计数据等功能整体系统结构如下图4-1所示。系统结构功能设计系统面向普通游客及系统管理员两大主体角色分别为它们提供了不同的功能模块集。普通游客为系统的主要服务群体它的功能模块都是以获取旅游信息和提供旅游行程服务为主包含了旅游景点列表检索和购票、酒店信息检索和预订、建立并维护自身的旅行计划并可以在个人中心内对以往的订单和计划进行统一的查看。系统管理员主要负责后台业务管理和实时数据分析它的模块主要包括通过数据仪表盘进行综合的数据分析、增删改查管理旅游景点信息和酒店信息、对用户的景点购票订单和酒店预订订单进行审核处理、对用户的出行计划进行状态审核和管理等工作。系统功能结构图如下图4-2所示。系统流程设计系统总体业务流程设计系统整体流程由用户访问开始用户须先进行注册或者登陆才能激活下一流程。登陆成功的用户跳转至系统首页在首页有景点游览、宾馆预订、行程规划等功能入口供用户选择。用户点击景点游览则可以查看具体的信息进而产生买票动作。选择宾馆预订则会对房间进行查看以及预定等行为用户所拟定的旅游行程会流转到后台等待管理员审批。所有的订单均要经历付款的操作流程付款的结果改变订单的状态并保存。管理员登陆后台之后能够操作后台的所有数据信息实现信息管理、订单管理和行程审批的功能。系统各功能模块由业务数据贯穿衔接起来形成一个完整的旅行服务体系。系统整体的数据流程如图4-3所示。景点购票流程设计游客开始景点购票操作系统显示可供购票的景点列表。游客选中一个特定景点系统加载对应景点的信息页面包括价格、余量等相关信息。游客确定购票意愿填写购票张数并发起购票下单请求。系统对用户账号状况及景点票务进行库存校验。校验成功则建立待付款订单。游客跳转到支付页面进行支付方式选填并发起款项支付。系统接收到支付成功的回执后扣减景点的库存改变订单为支付成功状态同时建立电子票据。若是库存检验失败或者支付超期则此过程走向失败终止并给用户返回失败提示信息。景点购票流程如图4-4所示。酒店预订流程设计顾客在进入酒店预定模块根据查询条件选取适合酒店列表。顾客单击目标酒店查看其房型、价格及当前房态情况。顾客选择所需的房型和入住时间后发起预定申请。系统核实用户信息及房间预定数量核对无误后生成一条预定数据。顾客完成生成的预定订单项下的付款动作后即为成功预定系统对相应房间进行锁定操作。如果房间已经全部售完或者用户的认证失败则结束流程拒绝预定申请。酒店预定流程如下图4-5所示数据库DROP TABLE IF EXISTS ordinary_user; CREATE TABLE ordinary_user(ordinary_user_id int(11) NOT NULL AUTO_INCREMENT COMMENT 普通用户ID, user_name varchar(64) comment 用户姓名, user_gender varchar(64) comment 用户性别, users_mobile_phone varchar(64) comment 用户手机, examine_state varchar(16) DEFAULT 已通过 NOT NULL comment 审核状态, user_id int(11) DEFAULT 0 NOT NULL comment 用户ID, create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 创建时间, create_by int(11) DEFAULT 1 NOT NULL comment 创建用户ID, update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 更新时间, DROP TABLE IF EXISTS tourist_attractions; CREATE TABLE tourist_attractions(tourist_attractions_id int(11) NOT NULL AUTO_INCREMENT COMMENT 旅游景点ID, name_of_scenic_spot varchar(64) comment 景点名称, class_nameification_of_scenic_spots varchar(64) comment 景点分类, pictures_of_scenic_spots varchar(255) comment 景点图片, ticket_price double(8,2) DEFAULT 0 comment 门票价格, attraction_address varchar(64) comment 景点地址, opening_hours varchar(64) comment 开放时间, cultural_background longtext comment 文化背景, attraction_specificss longtext comment 景点详情, hits int(11) DEFAULT 0 NOT NULL comment 点击数, praise_len int(11) DEFAULT 0 NOT NULL comment 点赞数, collect_len int(11) DEFAULT 0 NOT NULL comment 收藏数, comment_len int(11) DEFAULT 0 NOT NULL comment 评论数, recommend int(11) DEFAULT 0 NOT NULL comment 智能推荐, location_address varchar(64) DEFAULT NULL comment 当前位置, location_lng varchar(64) DEFAULT NULL comment 当前位置经度, location_lat varchar(64) DEFAULT NULL comment 当前位置纬度, attraction_tickets_limit_times int(8) DEFAULT 0 NOT NULL comment 购票限制次数, create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 创建时间, create_by int(11) DEFAULT 1 NOT NULL comment 创建用户ID, update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 更新时间, DROP TABLE IF EXISTS attraction_tickets; CREATE TABLE attraction_tickets(attraction_tickets_id int(11) NOT NULL AUTO_INCREMENT COMMENT 景点购票ID, ordinary_user int(11) DEFAULT 0 comment 普通用户, user_name varchar(64) comment 用户姓名, name_of_scenic_spot varchar(64) comment 景点名称, class_nameification_of_scenic_spots varchar(64) comment 景点分类, ticket_price double(8,2) DEFAULT 0 comment 门票价格, number_of_tickets_purchased double(8,2) DEFAULT 0 comment 购票数量, ticket_purchase_amount double(8,2) DEFAULT 0 comment 购票金额, ticket_purchase_date date comment 购票日期, ticketing_remarks text comment 购票备注, pay_state varchar(16) DEFAULT 未支付 NOT NULL comment 支付状态, pay_type varchar(16) DEFAULT comment 支付类型: 微信、支付宝、网银, verification_code varchar(16) comment 核销码, verification_state varchar(16) comment 核销状态, verification_time varchar(32) comment 核销时间, create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 创建时间, create_by int(11) DEFAULT 1 NOT NULL comment 创建用户ID, update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 更新时间,代码PostMapping(/add) Transactional public MapString, Object add(HttpServletRequest request) throws IOException { service.insert(service.readBody(request.getReader())); return success(1); } Transactional public MapString, Object addMap(MapString,Object map){ service.insert(map); return success(1); } Transactional public MapString, Object addEntity(E entity){ service.insert(entity); return success(1); } PostMapping(/set) Transactional public MapString, Object set(HttpServletRequest request) throws IOException { service.update(service.readQuery(request), service.readConfig(request), service.readBody(request.getReader())); return success(1); } Transactional public MapString, Object setEntity(MapString,String queryMap,MapString,String configMap,E entity) throws IOException { service.updateEntity(queryMap,configMap,entity); return success(1); } RequestMapping(value /del) Transactional public MapString, Object del(HttpServletRequest request) { service.delete(service.readQuery(request), service.readConfig(request)); return success(1); } RequestMapping(/get_obj) public MapString, Object obj(HttpServletRequest request) { MapString, String config service.readConfig(request); if (request.getParameter(like) null || request.getParameter(like).trim().isEmpty()) { config.put(like, 0); } List resultList service.selectBaseList(service.select(service.readQuery(request), config)); if (resultList.size() 0) { JSONObject jsonObject new JSONObject(); jsonObject.put(obj,resultList.get(0)); return success(jsonObject); } else { return success(null); } } public MapString, Object getObjByMap(MapString,String queryMap) { List resultList service.selectBaseList(service.select(queryMap, new HashMap())); if (resultList.size() 0) { JSONObject jsonObject new JSONObject(); jsonObject.put(obj,resultList.get(0)); return success(jsonObject); } else { return success(null); } } RequestMapping(/get_list) public MapString, Object getList(HttpServletRequest request) { MapString, Object map service.selectToPage(service.readQuery(request), service.readConfig(request)); return success(map); } public MapString, Object getListByMap(MapString,String queryMap) { MapString, Object map service.selectToPage(queryMap, new HashMap()); return success(map); } RequestMapping(/list_group) public MapString, Object listGroup(HttpServletRequest request) { MapString,Object map service.selectToList(service.readQuery(request), service.readConfig(request)); MapString,Object result new HashMap(); result.put(result,map); return result; } RequestMapping(/bar_group) public MapString, Object barGroup(HttpServletRequest request) { MapString, Object map service.selectBarGroup(service.readQuery(request), service.readConfig(request)); return success(map); } RequestMapping(value {/count_group, /count}) public MapString, Object count(HttpServletRequest request) { Integer value service.selectSqlToInteger(service.groupCount(service.readQuery(request), service.readConfig(request))); return success(value); } RequestMapping(value {/sum_group, /sum}) public MapString, Object sum(HttpServletRequest request) { Integer value service.selectSqlToInteger(service.sum(service.readQuery(request), service.readConfig(request))); return success(value); } RequestMapping(value {/avg_group, /avg}) public MapString, Object avg(HttpServletRequest request) { Integer value service.selectSqlToInteger(service.avg(service.readQuery(request), service.readConfig(request))); return success(value); }用户功能实现旅游景点列表功能实现该模块为用户提供贵州省内旅游景点的集中展示与查询入口。用户进入界面后可浏览景点列表系统默认按热度排序。用户通过搜索框输入关键词系统调用后端接口返回匹配的景点信息。点击具体景点卡片后跳转至详情页面该页面呈现景点的图文介绍、门票价格与开放时间。用户决定游览后选择票种与数量点击购票按钮系统生成预订单。旅游景点列表界面如图5-1所示。图5-1 旅游景点列表界面酒店信息列表功能实现此模块整合的是系统合作伙伴酒店的相关信息以供用户浏览和预定。旅客依据旅行地、入住时间以及价格区间选择对应的酒店列表页面提供酒店的基本情况点击相应酒店可进入酒店详情页面浏览房间类型以及酒店设施、服务及评论等信息在确定理想住宿间房型之后进入预定步骤中填写住客信息提交订单完成预订操作之后进入到付款过程系统将指引用户进行购买。酒店信息列表页面如下图5-2所示图5-2 酒店信息列表界面出行计划功能实现此功能允许游客自定行程游客单击新建计划跳转到计划编辑界面。该页面包含地图、及景点信息游客把感兴趣的景点拖放到日程时间轴上构成每天的活动安排。对计划的内容还可以进行文字备注。游客规划好自己的行程之后提交计划给系统后台存储下来。游行安排页面如下图5-3所示。图5-3 出行计划界面个人中心功能实现个人中心是用户的个人信息统一展示页面汇集了历史订单和规划信息用户在这里查询以往的景点门票订购情况在这里点击订单还可以查看相关的历史信息并且可以进行付款。酒店预定记录也会出现在这里用户可以查看相关的预定情况。用户所有的出行规划都在这里以列表的形式展现出来方便用户浏览查询。个人中心页面如下图 图5-4 所示。图5-4 个人中心界面管理员功能实现首页功能实现管理员进行登录之后首先到达系统首页此主页是用数据面板的方式来展现主要的业务数量统计。图中通过图形动态展示景区订票总数量酒店订房总次数以及分类统计下的热门资源列表排名情况。数据统计都是从后台数据库中实时运算得出帮助管理者了解经营现状。首页界面如图5-5所示。图5-5 首页界面旅游景点管理功能实现管理员在此模块中对系统中存在的所有景区信息加以管理。页面中以列表的方式展示景区项目可按照名称或区域搜索。管理员添加新的景区录入名称、简介、照片、门票价格等等相关信息。对于已有的景区管理员浏览详情、更新信息或进行删减以保障信息准确无误及时有效。旅游景点管理界面如下图5-6所示。图5-6 旅游景点管理界面景点购票管理功能实现此模块负责统一对由用户发起的所有景点门票预订订单进行管理。在后台管理人员可以通过订单编号、用户信息、时间区间来查询指定的单个订单。订单列表页显示预订者、景点、张数、金额以及订单状态等信息。管理人员能对该订单详情进一步了解在此基础上可以依据实情更改其订单状态如对退款请求予以回应或者清除废单。景点门票预订管理页面如图5-7所示。图5-7 景点购票管理界面源码获取私信联系我即可~大家点赞、收藏、关注、评论啦精彩专栏推荐订阅在下方专栏

相关新闻

TM4C1299 I2C总线协议深度解析与嵌入式开发实战

TM4C1299 I2C总线协议深度解析与嵌入式开发实战

1. I2C总线协议深度解析:从理论到实践在嵌入式系统开发中,设备间的通信是构建复杂功能的基础。面对SPI、UART、CAN等多种总线协议,I2C(Inter-Integrated Circuit)以其极简的两线制(串行数据线SDA和串行时钟…

2026/7/22 10:51:44阅读更多 →
LightGlue:Transformer加速特征匹配的技术解析

LightGlue:Transformer加速特征匹配的技术解析

1. LightGlue:当特征匹配遇上Transformer加速去年在做一个无人机视觉定位项目时,我曾在SuperGlue和LoFTR之间反复纠结——前者精度高但速度慢如蜗牛,后者实时性好却在低纹理场景频频失效。直到在CVPR 2023的论文海洋里发现了LightGlue这个&qu…

2026/7/22 10:51:44阅读更多 →
深入解析TMS570 MCU安全架构:从内存ECC到ESM错误处理的实战指南

深入解析TMS570 MCU安全架构:从内存ECC到ESM错误处理的实战指南

1. 项目概述与核心价值在汽车电子、工业控制这些对可靠性要求极高的领域,选对一颗微控制器(MCU)往往决定了整个项目的成败。过去十几年里,我经手过不少项目,从简单的电机控制到复杂的域控制器,一个深刻的体…

2026/7/22 10:51:44阅读更多 →
ChatGPT地区限制机制与国内AI办公替代方案

ChatGPT地区限制机制与国内AI办公替代方案

1. ChatGPT地区限制的底层机制解析当我们在浏览器地址栏输入chat.openai.com时,系统会通过多重验证机制判断访问者是否来自受支持地区。这个验证过程远比普通用户想象的复杂,主要涉及以下技术层面:1.1 IP地址的地理围栏技术OpenAI采用了MaxMi…

2026/7/22 11:53:53阅读更多 →
低成本空间计算方案:模块化硬件组合与Apple Vision Pro对比

低成本空间计算方案:模块化硬件组合与Apple Vision Pro对比

当Apple Vision Pro以3499美元的价格刷新了消费级空间计算设备的天花板时,很多开发者和科技爱好者都在思考一个问题:有没有可能用更低的成本,获得相似甚至更好的体验?Berry Xia提出的组合方案,正是对这个问题的直接回应…

2026/7/22 11:53:53阅读更多 →
高效开发工具使用指南:从命令行到调试工具的稳定实践

高效开发工具使用指南:从命令行到调试工具的稳定实践

1. 先搞清楚“这些”到底指什么,以及为什么值得单独拿出来说 看到这个标题,很多人第一反应可能是“哪些工具?”,或者“是不是我常用的那几个?”。其实这类问题背后,反映的是一个很实际的场景: …

2026/7/22 11:53:53阅读更多 →
新手访问Github,无需下载

新手访问Github,无需下载

一、查IP https://tool.chinaz.com 站长工具网址 输入网址github.com 复制ip地址 hosts配置文件地址:C:\Windows\System32\drivers\etc\hosts 使用记事本打开(需要管理员权限),在最下方添加IP地址,并附带github网址…

2026/7/22 11:53:53阅读更多 →
从零开始学前端 | 第三十一章:useEffect 与数据请求

从零开始学前端 | 第三十一章:useEffect 与数据请求

本章定位 上一章,我们已经把 React 页面里非常核心的三条主线串起来了: 一组数据怎么渲染成一组界面元素。某块内容要不要显示,怎么根据条件决定。多个组件之间怎么围绕数据流协作。 也就是说,到现在为止,你已经不只是…

2026/7/22 11:53:53阅读更多 →
2026AI会议纪要怎么选?认准识别准整理快更省心的新方案

2026AI会议纪要怎么选?认准识别准整理快更省心的新方案

2026年选AI会议纪要工具,认准识别准、整理快、适配需求选就不会错,这篇主要说给咱们学生群体,平时咱们用到纪要工具,大多是整理课堂录音、论文调研访谈、线上学术会议内容,现在不少工具错漏多、整理流程繁琐&#xff0…

2026/7/22 11:51:53阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/22 0:53:59阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/22 0:53:59阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/22 0:53:59阅读更多 →
中小企业小程序开发公司怎么选:预算、上手和售后避坑指南

中小企业小程序开发公司怎么选:预算、上手和售后避坑指南

中小企业做小程序,最常见的矛盾是预算有限,但又不希望功能太单薄;没有技术团队,但又希望后续能自己运营;想快速上线,又担心隐性收费和售后失联。选型时如果只看“低价套餐”或“案例数量”,很容…

2026/7/22 0:01:17阅读更多 →
GEO优化如何沉淀长期内容资产?广拓时代谈AI搜索时代的内容ROI

GEO优化如何沉淀长期内容资产?广拓时代谈AI搜索时代的内容ROI

企业做营销,最怕钱花完了,资产没有留下。 效果广告能带来一段时间的曝光,但预算停止后,流量往往也随之停止。短视频内容可能在几天内冲高,也可能很快沉下去。AI搜索时代,企业需要重新思考一个问题&#xff…

2026/7/22 0:01:17阅读更多 →
Agent 终态判定:何时该停止思考、给出最终回复

Agent 终态判定:何时该停止思考、给出最终回复

Agent 终态判定:何时该停止思考、给出最终回复 一、你的 Agent 在"再想想"的循环里绕了 12 轮,用户已经关窗口了 Agent 与人最大的区别是:人知道什么时候该停下来给答案,Agent 会一直"想"下去。你给 Agent 接…

2026/7/22 0:01:17阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/21 22:53:50阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/21 18:53:30阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/21 18:53:30阅读更多 →