☰
Java毕业设计SSM游戏论坛平台源码:部署与答辩指南
2026/10/31 5:20:28 网站建设 项目流程

简介:一套面向Java毕业设计/课程设计的游戏论坛平台完整源码,基于SSM框架与MySQL数据库实现,覆盖前台互动浏览与后台统一维护两大场景。前台游客可浏览游戏快讯、周边商品与精彩分享,注册用户能加入购物车、提交订单、收藏和发帖;管理员承担用户、分类、快讯、商城、分享、留言板、论坛、系统及订单等管理职责,权限边界清晰,功能模块完整,适合具备Java Web基础、需要完整项目参考的在校生。包体共1158个文件,压缩包约28.85MB;Java源码与编译物构成服务端主体,前端页面负责界面展示,SQL脚本初始化数据库,XML与配置文件支撑MyBatis映射和环境设置,样式与图片资源提升界面效果,目录结构规整。目前已有57人学习下载。通过该包可获得可运行项目源码、MySQL建表脚本、说明文档及规范模块划分,能辅助快速部署运行,理解SSM整合流程,参考论坛、商城、订单、收藏等典型功能实现,对毕业设计答辩和课程实践有直接参考价值。

1. 游戏论坛平台源码:先看这份资源能不能落你的地

如果你在找一套能直接运行、能讲清楚前后端数据走向的 Java 毕业设计源码,这套 SSM 游戏论坛平台值得认真看一遍。它的技术栈不花哨——Spring + Spring MVC + MyBatis + MySQL 5.7 + Tomcat,但正好覆盖了答辩时最常被追问的框架原理:控制反转、MVC 分层、Mapper 映射和表关系设计。资源里带了说明文档、LW 论文文档和安装启动脚本,管理员端能管用户、游戏分类、快讯、周边商城、订单和留言板,前台用户能发帖、分享攻略、加购物车、下单,演示链路是完整的。适合正在选题的大四学生、要快速交付课程设计的在职学员,以及想复用 SSM 模板改业务模型的技术人员。下面我按“架构 → 部署 → 业务 → 避坑 → 答辩”这条线,把这份资源拆开揉碎。

2. SSM 三角架构与后台模块:为什么这套组合撑得起一个毕业设计

这个项目选 SSM 而不是 Spring Boot,不是说 Spring Boot 不好,而是课程设计要展示的恰恰是手写 XML 配置的能力。Spring Boot 把 DispatcherServlet、事务管理器、Mapper 扫描全部自动配置了,答辩时老师问“你的请求是怎么进到 Controller 的”,你反而讲不清楚。SSM 的每一步都能在配置文件里找到对应关系,这是它作为毕业设计载体的天然优势。

2.1 Spring IOC、Spring MVC 与 MyBatis 的分工边界

先理清三个框架在项目里各管哪一段。Spring 管对象生命周期,也就是控制反转和依赖注入:service 层对象由容器创建,谁需要谁就用 @Autowired 注入,不用自己 new。Spring MVC 管 HTTP 请求分发:前端发起 GET /forum/list,被 web.xml 里的 DispatcherServlet 拦截,HandlerMapping 找到对应的 Controller 方法,方法返回的字符串经 ViewResolver 解析成 JSP 页面或 JSON。MyBatis 管数据库访问:Mapper 接口配 XML 里的 statement,接口方法名对应 SQL id,查询结果通过 resultMap 映射成 Java 对象。

三层合起来的请求链路是这样的:浏览器请求 → DispatcherServlet → Controller → Service → Mapper 接口 → Mapper XML → MySQL,再逐层返回。答辩时把这个链路画在白板上,基本拿到一半分数。资源里的说明文档通常会把这条链路写成文字叙述,LW 里有架构图,你只需要理解后用自己的话复述一遍。

配置文件上,会看到四个关键文件:web.xml 配置 DispatcherServlet 和字符编码过滤器;spring-mvc.xml 配置组件扫描、注解驱动、视图解析器和静态资源映射;spring-mybatis.xml 配置数据源、事务管理器、SqlSessionFactory;mybatis-config.xml 配置下划线转驼峰、二级缓存等全局参数。理解这四个文件比读业务代码更重要,因为排错基本都回到这里。

提示:第一次看 SSM 项目,优先读 spring-mybatis.xml 里的数据源配置。数据库连不上、连接池报错、事务不生效,问题基本都集中在这个文件。

重点讲一下 mybatis-config.xml 里的 mapUnderscoreToCamelCase 参数。这个开关设为 true 后,会把表里的 user_id 自动映射成 Java 对象的 userId,不用手写几十个 resultMap。课程设计里经常有人忽略这个配置,导致查出来的对象全是空字段,然后一脸懵地加一堆 SQL 别名。资源里如果这个开关是开的,你在写 SQL 时能省很多事。

2.2 从 Controller 文件反推功能矩阵:论坛、商城、分享都压在哪些接口上

拆这个资源包时,我习惯先看 Controller 清单,因为控制器就是功能的索引。包里有 YonghuController、CommonController、ForumController、AddressController、JingcaifenxiangController,对应关系很直接:YonghuController 管用户注册、登录、个人信息修改;CommonController 管通用业务,比如图片上传、公共下拉数据、首页聚合查询;ForumController 管论坛的版块、发帖、回帖;AddressController 管用户收货地址的增删改查;JingcaifenxiangController 管精彩分享模块,也就是游戏攻略的发布与展示。

这五个控制器背后,藏着数据库里至少十张表。用户表管账号密码和角色标识,用角色字段区分管理员和普通用户;游戏分类表是课程设计最爱的树形结构演示点,一般是一级分类加二级分类;游戏快讯表存新闻标题、封面、正文和发布时间;周边商城表存商品名、售价、库存、封面和详情;精彩分享表存攻略标题、作者、内容、点赞量和审核状态;论坛表存帖子,回帖可能单独一张表;订单表和订单明细表是典型父子表;留言板表存用户反馈和回复;管理员表存后台登录账号;系统表存轮播图、公告这类站点配置。

这个功能矩阵和摘要里列出的权限模块一一对应。管理员端左侧菜单,就是这些表的后台 CRUD 页面;用户端看到首页、快讯、商城、分享、论坛、留言,只是换了个前台展示层。理解到这一层,你拿到资源后要改哪个模块,就能直接定位到对应的 Controller、Service、Mapper 和页面,不用从头扫代码。

照着这个资源的控制器命名习惯,论坛发帖这类核心操作的典型 Controller 写法是这样:

@Controller @RequestMapping("/forum") public class ForumController { @Autowired private ForumService forumService; // 发布新帖:接收表单参数,从 session 取当前用户 @RequestMapping(value = "/publish", method = RequestMethod.POST) public String publish(String title, String content, HttpSession session) { // 从 session 取出登录用户,没有则跳转登录页 Yonghu user = (Yonghu) session.getAttribute("user"); if (user == null) { return "redirect:/login"; } Tiezi tiezi = new Tiezi(); tiezi.setTitle(title); tiezi.setContent(content); tiezi.setUserId(user.getId()); tiezi.setCreateTime(new Date()); forumService.insertTiezi(tiezi); return "redirect:/forum/detail?id=" + tiezi.getId(); } }

这段代码的要点在三个地方:@Autowired 是 Spring 注入 service 的常用注解,不用手动 new 对象;HttpSession 从容器里取,保证 userId 来自登录态而不是页面传参,这是防止越权的关键;返回的 redirect 路径拼了帖子 id,回跳详情时数据能对上。答辩老师如果问“怎么防止普通用户直接调接口发帖”,你就指着 if (user == null) 这行讲。

3. 本地部署全流程:Maven、Tomcat、MySQL 5.7 的配置顺序

拿到 .zip 后最容易翻车的不是代码,而是环境。这个项目要求 JDK 1.8、Maven 3.3+、Tomcat 7+、MySQL 5.7+,四个版本环环相扣。JDK 1.8 对应编译级别,Maven 3.3 对应插件兼容,Tomcat 7 对应 Servlet 3.0 规范,MySQL 5.7 对应 .sql 文件的建表语法。任何一个版本跨代升级,都可能出现“代码没错但启动不了”的玄学问题,所以这套资源卡在毕业设计最常见的版本组合上是合理的。

3.1 环境版本匹配表:JDK 1.8 + MySQL 5.7 + Tomcat 7,差一点就翻车

组件版本要求说明
JDK1.8项目编译级别是 1.8,用新版会有 javac 兼容性风险
Maven3.3+对 1.8 兼容最好,3.9 偶尔会遇到插件下载问题
Tomcat7.0+Servlet 3.0 项目 7/8/9 可跑,10+ 因 javax 改 jakarta 会启动失败
MySQL5.7+驱动 5.1.x 连 MySQL 8 会报 SSL 错误,驱动 8.x 连 5.7 需配时区
Navicat11+只用来导入 SQL 和看数据,用 MySQL Workbench 也一样

部署顺序我一般走五步:装 JDK 配 JAVA_HOME,装 MySQL 5.7 设 root 密码,用 Navicat 新建数据库导入 .sql,改 jdbc.properties 里的账号密码,Maven 打包 war 丢进 Tomcat 的 webapps。顺序不能乱。先启动 Tomcat 再导数据库,Spring 容器初始化时连不上库,日志报的是 Cannot create PoolableConnectionFactory,新手很容易误判成 Tomcat 问题。

特别是 jdbc.properties 这个文件。项目里的默认账号密码大概率是 root/123456,你本机密码不一致就连不上。改完记得看文件编码,如果之前是 GBK 顺手改成 utf-8;密码里的特殊字符可能被转义,最稳的做法是密码里不要有 @ # $ 这类符号,省得每次连库都怀疑人生。

3.2 数据库导入与一键脚本:1-install.bat 和 2-run.bat 干了什么

资源里带了 1-install.bat 和 2-run.bat 两个 Windows 脚本。这类脚本在 SSM 项目里很常见:1-install.bat 负责初始化环境,检测 JDK/Maven 是否存在、执行 mvn clean install 打包、把 war 复制到 Tomcat 的 webapps;2-run.bat 负责启动 Tomcat,可能附带 start 命令自动打开浏览器。

执行顺序是固定先 1 后 2。先跑 2 的话,Tomcat 起来了但 webapps 下没有项目,访问自然是 404;1 没跑完就关窗口,Maven 构建中断,部分 jar 残留在本地仓库,下次构建会报 invalid LOC header,需要清掉 .m2/repository 对应目录。

我拿到任何 SSM 资源都习惯先不双击脚本,而是手工把命令走一遍,因为能看到每一步报错。打开命令行,进入项目根目录,依次执行:

# 1. 检查 Java 环境 java -version # 2. 检查 Maven 环境 mvn -v # 3. 清理并打包,跳过单元测试 mvn clean package -DskipTests # 4. 把 war 复制到 Tomcat 的 webapps 目录(按实际路径修改) cp target/gameforum.war /path/to/tomcat/webapps/

参数说明:-DskipTests 跳过测试,避免测试类报错阻塞打包;war 包名取决于 pom.xml 里 artifactId 和 finalName;如果项目是 jar 方式就反过来,需要把 Tomcat 配成外置容器或用内嵌启动,而这个资源走的是传统 war 路径,web.xml 在,复制 war 是主路线。

数据库导入用 Navicat 时,我习惯先建一个空库,字符集选 utf8mb4,排序规则 utf8mb4_general_ci,再右键“运行 SQL 文件”。如果库里已有同名表,先清空再导,否则报 table already exists。导入后核对表数量,大概十张表左右,和摘要描述对应上,说明数据文件完整。

注意:MySQL 库字符集选 utf8mb4,但如果 .sql 文件头写的 latin1,导入后中文会变问号。常规处理是导入前用文本编辑器批量替换 latin1 为 utf8mb4,或者导入后执行 ALTER TABLE ... CONVERT TO CHARACTER SET utf8mb4。

另外一个高频问题是 MySQL 驱动与 JDBC URL 匹配。如果本机装成了 MySQL 8.x,驱动还是老的 5.1.x,启动时会出现 SSL 连接报错,解决方法有两个:要么把驱动升级到 mysql-connector-java 8.0.x,然后在 URL 末尾加 useSSL=false&allowPublicKeyRetrieval=true;要么在 URL 里显式加 serverTimezone=Asia/Shanghai。这是近几年 MySQL 升级后最常见的部署坑,值得在脚本跑完前先确认一次。

3.3 启动阶段日志辨识:从 catalina.out 判断项目是否真正起来

项目启动成功不能只看浏览器,要看日志。经典 SSM 项目启动成功的标志有三个:日志出现 Starting ProtocolHandler 并绑定 8080;出现 Initializing Spring root WebApplicationContext 后没有异常堆栈;访问 http://localhost:8080/项目名/ 能返回首页 HTML。

最常见的半成功状态是 Tomcat 起了,项目部署失败。访问路径 404,日志有 Error configuring application listener 或 BeanCreationException。前者是 web.xml 里监听器类找不到,后者是 bean 初始化抛异常,大多来自数据源连不上。看日志要注意:Caused by 后面的才是根因,前面一屏警告基本都是干扰项,别被带偏。

4. 双端权限与业务链路拆解:从发帖到下单的完整数据流

这一章把业务翻一遍。整个平台分前台和后台,前台是用户看到的内容,后台是管理员管理的页面。权限控制不用 Spring Security,而是最原始的 session 拦截器:登录成功把用户对象放进 HttpSession,拦截器拦 /admin/ 开头的请求,session 没有管理员身份就重定向回登录页。这种写法在课程设计里很常见,实现简单,代码量小,也足够答辩演示。

4.1 用户与管理员双端功能矩阵:哪些按钮对应哪张表

把摘要里的功能列表拆成功能-表对照矩阵:

角色功能模块涉及表
管理员用户管理用户表
管理员游戏分类管理分类表
管理员游戏快讯管理快讯表
管理员周边商城管理商品表
管理员精彩分享管理分享表
管理员订单管理订单表、订单明细表
管理员留言板管理留言表
管理员论坛管理帖子表、回帖表
管理员系统管理配置表
用户注册登录用户表
用户精彩分享分享表
用户我的收藏收藏表
用户订单管理订单表、明细表、地址表
用户购物车购物车表

这个矩阵的价值在于:答辩时被问“这个功能的数据存在哪”,你能立刻说出表名和主外键关系。订单模块就是例子:订单表存头信息(订单号、总金额、状态、下单时间),订单明细表存商品 ID、数量、单价,这是课程设计最常考的父子表结构。地址表通过用户 ID 关联用户,一个用户多条地址,结算时默认取最新一条。

权限方面重点理解角色字段。用户表里通常有 role 字段,0 是普通用户,1 是管理员。也有项目把管理员单独放一张表,登录时先查用户表再查管理员表。两表分离会多一次数据库访问,但答辩时可以讲“用户和管理员分离存储”,逻辑上更清晰。

4.2 周边商城与订单流水:购物车、地址、库存扣减怎么串联

商城链路是这个项目的演示重头,因为它是唯一有完整行为的流程:用户加购物车 → 提交订单 → 选地址 → 模拟支付 → 管理员后台看到订单。围绕这条线讲事务,比讲任何框架概念都有说服力。

购物车有两种常见实现:session 级和数据库表级。这个项目我理解成数据库级,因为摘要明确列出购物车模块,且订单、地址都有对应表。加购物车流程:用户点加入购物车,前端把商品 ID 和数量 POST 到 /cart/add,Controller 从 session 取用户 ID,先查购物车表有没有该用户同款商品,有就加数量,没有就插一条新记录。这个先查后插是典型事务点。

结算下单的事务边界按顺序展开:第一步,从购物车查出勾选的商品明细;第二步,校验库存是否足够;第三步,生成订单头记录,状态设为待支付;第四步,写订单明细,逐条扣库存;第五步,清空购物车;第六步,跳转模拟支付页面。任何一步失败,整个订单都不落库,这就是 Spring 的 @Transactional 注解发挥作用的地方。答辩时可以讲:我把 @Transactional 加在 createOrder 方法上,方法内任何一个 SQL 异常都会触发 rollback,库存不会出现扣一半的情况。

细节上,订单表和明细表之间用 order_no 订单号关联,而不是订单主键。这个设计可以重点讲:订单号用时间戳加随机数生成,用户能看到,售后凭单号查询,主键只供系统内部联表,不暴露给用户。这类业务字段与主键分离的意识,在答辩里属于加分项。

4.3 论坛与精彩分享:发帖审核与信息发布的差异化处理

论坛和精彩分享是两个容易被忽略但很好演示的功能。区别在于:论坛帖子用户直接发直接显示,不需要管理员审核;精彩分享带攻略性质,要做状态字段,用户提交后是待审核,管理员后台通过后才在前台显示。这个差异是评审老师常问的业务规则,要能在源码里指出来。

实现上,论坛发帖走一次插入流程,设置发布时间和最后回复时间,列表按时间倒序;精彩分享表里多一个 status 字段,默认 0 表示待审核,后台改成 1 表示通过。用户在我的分享里能看到自己的待审核记录,管理员后台能看到所有待审核和已通过数据。

一条完整的路径是:用户提交精彩分享 → JingcaifenxiangController.add() → 插入分享表(status=0)→ 个人中心显示审核中 → 管理后台通过 → 前台首页精彩分享栏目显示。这套逻辑覆盖了状态机的入门概念,答辩时可以画一条状态流转线:待审核 → 通过 / 驳回。

4.4 论坛回复与留言板:两张容易被问到的从表

论坛回复和留言板是两张从表,结构简单但提问频率高。论坛回复表通常存帖子 ID、回复用户 ID、回复内容、回复时间,通过帖子 ID 联主表;用户回复时,接口除了插回复行,还要顺手更新帖子表的最后回复时间和回复数,这是防止频繁联表查询的常规做法。

留言板表类似对话,用户留言后,管理员在后台回复,也可以直接在原行更新回复字段。如果资源里留言板设计成一条记录存一次问答,展示时更简洁;如果设计成多轮对话,就要加父留言 ID 做自关联。两版都有人用,答辩时能讲清自己的选择即可。

5. 部署与演示避坑清单:数据库、路径、端口与权限的五个翻车现场

我在前面章节零散提了几个坑,这一章集中成清单。每一条都是实际运行中大概率遇到的,按“现象 — 原因 — 解决”的顺序写清楚,方便你在现场快速翻查。

5.1 现象一:Navicat 导入 SQL 报 1064 语法错误

现象:用 Navicat 右键运行 SQL 文件,执行到某一行报 1064 You have an error in your SQL syntax,但同一个文件在命令行 mysql -uroot -p < xxx.sql 能跑通。

原因:Navicat 图形化导入时,如果脚本头没有 SET FOREIGN_KEY_CHECKS = 0,外键约束会导致建表顺序出错;如果脚本里有 DELIMITER $$ 这类存储过程分隔符,Navicat 的客户端不识别,直接把 $$ 当成非法语法。更多时候是文件编码和连接编码不一致,中文注释被截断,导致半条 SQL 残留在缓冲区里报语法错。

解决:先用文本编辑器打开 .sql,确认头部有没有 USE database;,有的话改成目标库名或删掉。然后优先用命令行导入:mysql -uroot -p -D 游戏库名 --default-character-set=utf8mb4 < 游戏库.sql。如果必须用 Navicat,就在查询窗口逐段粘贴执行,这样报错能定位到具体建表语句。

5.2 现象二:Tomcat 启动闪退或端口被占用

现象:双击 startup.bat 窗口一闪而过,访问 localhost:8080 无响应;或日志报 Port 8080 required by Tomcat as already in use。

原因:一闪而过九成是 JAVA_HOME 没配好,startup.bat 找不到 java.exe 直接退出。端口占用则是本机已有程序占住 8080,常见是另一个 Tomcat、IDEA 内置服务器或系统服务。

解决:用命令行 tomcat/bin/startup.bat 方式启动,窗口不自动关,能看到完整报错。端口占用时执行 netstat -ano | findstr 8080 找出 PID,去任务管理器结束进程,或者改 Tomcat 的 server.xml 里 Connector port 为 8081。改端口后访问地址、IDE 配置、浏览器缓存三处都要跟着改。

提示:闪退且命令行也看不到信息时,去看 logs/catalina.out 最后十几行,Java 版本不匹配最常出现 UnsupportedClassVersionError,报错里会直接写出编译版本。

5.3 现象三:图片上传后刷新就丢,或页面 404

现象:后台添加快讯时上传封面图,提交后 img 标签的 src 地址打不开;刷新页面图片消失。

原因:SSM 项目最常见的上传实现是把文件写到磁盘绝对路径,比如 D:/upload/,但页面访问 URL 是 /upload/xxx.jpg,两者没有映射。Tomcat 默认只暴露 webapps 下静态资源,磁盘路径不在 web 上下文内,自然 404。刷新丢图则是数据库里存的路径和实际文件路径不一致,文件可能没落盘就返回了成功。

解决:两种修法。第一种在 spring-mvc.xml 配静态资源映射,把 /upload/** 映射到 file:D:/upload/;第二种把上传目录改到项目 webapp/upload/ 下,用 request.getSession().getServletContext().getRealPath("/upload") 取真实路径,重启 Tomcat 生效。我推荐第二种,部署到其他机器时目录跟着 war 走,不依赖本机盘符。

5.4 现象四:管理员刷新页面退出登录,session 反复失效

现象:管理员在后台操作正常,刷新页面突然跳回登录页;登录后访问个人中心,过一会又要求登录。

原因:登录状态依赖 HttpSession,session 靠 Cookie 里的 JSESSIONID 维持。web.xml 里如果没有配 session 超时,Tomcat 默认 30 分钟,演示时一旦聊天或卡顿超过时限就失效。另一个隐蔽原因是重定向用了相对路径,项目部署路径末尾没斜杠,刷新时路径解析错乱。

解决:在 web.xml 里加配置拉长超时,120 分钟足够一场答辩:

<session-config> <session-timeout>120</session-timeout> </session-config>

同时把登录成功后的跳转 URL 写成绝对路径,比如 redirect:/admin/index,不要用相对路径,避免 URL 拼接出错。

5.5 现象五:Maven 打包下载依赖超时,构建中断

现象:执行 mvn clean package 长时间停在 downloading,最后报 Connect timed out 或 Transfer failed,构建失败。

原因:网络访问 Maven 中央仓库不稳定,或者本地仓库里的 jar 损坏。SSM 项目依赖的 spring-webmvc、mybatis-spring、mysql-connector-java 体积大,下载极易超时。

解决:改 Maven 的 settings.xml,加入阿里云镜像:

<mirror> <id>aliyunmaven</id> <mirrorOf>central</mirrorOf> <url>https://maven.aliyun.com/repository/public</url> </mirror>

改完先 mvn clean 再重新打包。如果还报 invalid LOC header,说明本地 jar 已损坏,删除 .m2/repository 下对应目录让 Maven 重新拉取。

这 5 条坑的排查顺序也有讲究。我的习惯是:先看端口再开日志,先看数据库再改代码。几乎 80% 的 SSM 项目启动失败,最后都能归到数据源配置和 JDK 版本这两个根因上,所以排查时不要一上来就怀疑业务代码。把这条顺序记住,能省下大量试错时间。

6. 答辩演示前剪裁代码:把 SSM 项目调到能讲清楚的状态

最后给一个具体动作:演示前把项目裁剪成能讲清楚的最小系统。毕业设计答辩不是比功能多,而是比你对代码的控制力。我会做四件事。第一,把默认管理员账号密码改成自己的学号,并在说明文档里标注;清掉脏测试数据,只留三到五个演示账号。第二,在核心链路上加业务日志:订单创建、帖子发布、分享审核各输出一行 log4j 日志,让评审老师看到操作确实走到了 service 和数据库。

第三,准备几条删改 SQL。答辩现场最怕老师突然说“把这条数据删了看看”,你要能当着老师的面在 Navicat 里执行一条关联删除,并解释订单明细怎么处理。第四,把前台页面和后台标题里的项目名称改成你自己的题目,避免一眼看出是模板。

验证方法提前过一遍:注册一个新用户,走发帖 → 回帖 → 加购物车 → 下单 → 取消订单 → 发布分享 → 管理员审核完整流程;再用管理员账号走用户管理、分类管理、订单查看。每个步骤截图保存,万一现场网络或环境出问题,截图还能兜底。

我从一位评审老师那里学到的经验:答不出来不重要,重要的是你知道代码在哪里查。从那以后我每次接手 SSM 项目,第一件事不是跑通,而是先建立源码索引——哪个 Controller 处理登录,哪个 Mapper 扣库存,哪个配置文件管数据源,然后把这套索引写在一张纸上。答辩时哪怕被问住,也能顺着索引翻到对应代码。这套游戏论坛平台源码的核心价值也在于此:它把 Java 毕业设计最常考的模块收进了一个项目,你需要的只是把它变成自己的东西。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询