新闻详情

新闻详情

首页 / 资讯中心 / 详情

SSM化妆品配方管理系统:从源码到部署全解析

发布时间:2026/9/30 10:31:25来源:尧图网络
SSM化妆品配方管理系统:从源码到部署全解析
简介这套资源是一份基于SSMSpringSpringMVCMyBatis框架开发的化妆品配方及工艺管理项目面向计算机相关专业的毕业设计、课程设计与工程实训场景。压缩包体积为22.62MB内部包含完整Java源码、数据库SQL脚本以及配套论文文档主要文件类型覆盖后端代码、数据库建表与初始化脚本、项目说明材料经严格测试可直接运行。已有47人学习浏览项目采用典型分层结构实现配方信息管理、工艺参数维护、用户登录与权限控制等核心业务模块适合希望掌握SSM整合开发、理解后台管理系统搭建流程的中初级学习者。不仅可以直接用于毕设交付也便于在此基础上扩展新功能深入体会企业级项目开发思路。1. 基于SSM的化妆品配方及工艺管理这套源码包到底能给你什么答辩季拿到一个“基于SSM的化妆品配方及工艺管理的包含全套源码 数据库sql 论文.zip”大多数人第一反应是双击解压然后就被一堆包名和配置文件淹没。这套包本质上是Spring、SpringMVC、MyBatis三件套搭出来的经典管理后台业务落在化妆品工厂最关心的两件事上配方怎么配、工艺怎么定。它不是什么高并发平台却足够让你把JavaWeb从请求到SQL的整条链路完整走一遍。它的价值点很直接源码告诉你代码怎么写SQL文件告诉你表怎么建论文帮你把答辩话术备好。适合三种人——正在做课程设计的学生、想用SSM练手但缺一个完整参考的开发者、以及简历上需要一个可讲业务的后端新人。能解决什么问题往小了说是增删改查往大了说是从数据库建模到Tomcat部署的全套实操经验。这篇笔记就按“拆结构、看数据库、部署跑通、排坑、加记忆点”的顺序把这个包吃透。2. 拆解配方与工艺管理为什么SSM仍是值得照抄的JavaWeb骨架2.1 SSM三件套各自管什么从一次配方查询看调用链Spring、SpringMVC、MyBatis分工很清晰。SpringMVC管前端请求怎么路由到Java方法Spring管Service层的对象创建和事务边界MyBatis管SQL和Java对象的映射。三者串起来的调用链是浏览器发起请求DispatcherServlet找到ControllerController调ServiceService调Mapper接口Mapper接口对应的XML里写SQL最后结果原路返回。以查询一个配方详情为例Controller层的典型写法如下Controller RequestMapping(/formula) public class FormulaController { Autowired private FormulaService formulaService; RequestMapping(/detail) public String detail(Integer id, Model model) { FormulaVO vo formulaService.getFormulaDetail(id); model.addAttribute(formula, vo); return formula/detail; } }这里Controller声明这是一个MVC控制器RequestMapping把/formula/detail这个URL映射到detail方法。Autowired是Spring的依赖注入让Service实例自动装配进来不需要自己new。返回的formula/detail是JSP视图名对应webapp目录下的formula/detail.jsp。Service层的getFormulaDetail方法要加事务注解Service public class FormulaServiceImpl implements FormulaService { Autowired private FormulaMapper formulaMapper; Autowired private FormulaDetailMapper detailMapper; Transactional Override public FormulaVO getFormulaDetail(Integer id) { FormulaVO vo new FormulaVO(); vo.setFormula(formulaMapper.selectByPrimaryKey(id)); vo.setDetails(detailMapper.selectByFormulaId(id)); return vo; } }Transactional告诉Spring这个方法里所有数据库操作要么全成功要么全回滚。这里之所以把主表和明细分成两次查询是SSM项目的典型风格而不是像企业里那样直接写大JOIN原因后面讲慢SQL时会说到。MyBatis这边只需要定义一个FormulaMapper接口SQL写在XML里MyBatis启动时会扫描XML并生成代理实现类。selectByPrimaryKey这个SQL如果你用的是逆向工程生成的代码它会按主键查如果是手写就得自己保证#{}里的参数名和接口方法参数对得上。2.2 源码包目录结构拿到zip后先看哪几个文件解压之后不要急着跑先按下面这张表确认结构完整。这套包常见的是Eclipse或IDEA导出的项目顶部有pom.xml说明是Maven工程没有pom.xml那多半是普通Web工程部署方式完全不同。路径作用检查要点src/main/javaJava源码按com.xxx分层看有没有controller/service/mapper三层的包src/main/resources配置文件目录找spring-mybatis.xml、db.propertiessrc/main/webapp前端页面和静态资源看WEB-INF下有没有jspsql/数据库脚本找init.sql或cosmetic.sqlpom.xmlMaven依赖清单确认SSM三个核心依赖存在其中src/main/resources是命门。SSM项目的核心配置一般包含三样spring-context.xml管Service和Mapper的Beanspring-mvc.xml只管Controller和视图解析器mybatis-config.xml管MyBatis别名和插件。如果是Spring Boot项目这些会被自动装配包掉但SSM项目所有配置都裸露在你面前任何一个路径写错都直接启动失败。配置里最容易出错的是Mapper接口和XML的扫描路径必须一致。spring-context里会有一行mybatis:scan base-packagecom.cosmetic.mapper/它的含义是把com.cosmetic.mapper包下所有接口都注册成MyBatis的Mapper。对应的Mapper XML文件如果放在com/cosmetic/mapper目录下还要在spring-context里配置mapperLocations告诉MyBatis去哪加载XML文件。常见的翻车现场是Java接口在com.cosmetic.mapperXML却放到resources/mapper下没指定路径结果启动时提示Invalid bound statement。2.3 MyBatis的resultMap与#{}配方查询XML里最容易踩的坑配方明细表里有一个add_order字段表示原料添加顺序这个字段名很容易跟SQL保留字order混淆。手写Mapper XML时如果SELECT语句直接写select add_order from formula_detailMySQL 5.7会给它加反引号兜底但MySQL 8.0某些模式下会报语法错误。正确的做法是给字段起别名或者用resultMap做显式映射。resultMap idFormulaDetailMap typecom.cosmetic.entity.FormulaDetail id propertyid columndetail_id/ result propertyformulaId columnformula_id/ result propertymaterialName columnmaterial_name/ result propertypercentage columnpercentage/ result propertyaddOrder columnadd_order/ /resultMap select idselectByFormulaId resultMapFormulaDetailMap select detail_id, formula_id, material_name, percentage, add_order from formula_detail where formula_id #{formulaId} /select#{}是MyBatis预编译参数占位符它会生成?占位由JDBC预处理这能挡住SQL注入。当年网上那些SQL注入万能密码原理就是拼字符串参数而#{}直接把这条路堵死。不要在XML里写${}做参数拼接它只适合动态排序字段这类场景但哪怕是这样字段名也得用白名单校验。这个细节在答辩时会被老师问到答得出来就是加分项。resultMap里的property对应Java实体类的属性名column对应数据库列名。如果实体类属性是addOrder而列名是add_order你不在resultMap里做映射MyBatis默认开启的驼峰转换可能能兜住但配置没开就会返回null页面显示空白。老项目里经常能看到有人在resultMap里写了一大串result就是为了避免这类查询结果对不上号的玄学问题。3. 数据库设计是这套项目的命门配方表、原料表与工艺参数表3.1 从SQL文件里读懂表关系打开SQL脚本先别执行按顺序看表和表之间的外键关系。配方管理系统的核心表一般就三张配方主表、配方明细表、工艺步骤表。原料信息通常单独一张表明细表通过外键引用它。CREATE TABLE formula ( formula_id int(11) NOT NULL AUTO_INCREMENT, formula_no varchar(32) NOT NULL COMMENT 配方编号, formula_name varchar(64) NOT NULL COMMENT 配方名称, version int(11) DEFAULT 1 COMMENT 版本号, status tinyint(4) DEFAULT 0 COMMENT 0草稿 1生效 2停用, create_time datetime DEFAULT CURRENT_TIMESTAMP, update_time datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (formula_id), UNIQUE KEY uk_no_version (formula_no,version) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT配方主表;formula_no和version联合唯一这是配方版本管理的核心约束。同一个配方编号可以存在多个版本但同一编号下的版本号不能重复。比如“保湿霜-01”有v1.0和v1.1两条记录SKU不变、细节调整版本号递增。这样历史配方可追溯改出问题还能回滚。CREATE TABLE formula_detail ( detail_id int(11) NOT NULL AUTO_INCREMENT, formula_id int(11) NOT NULL COMMENT 外键配方主表, material_id int(11) NOT NULL COMMENT 外键原料表, material_name varchar(64) DEFAULT NULL COMMENT 冗余原料名, percentage decimal(5,2) DEFAULT NULL COMMENT 百分比,合计需等于100, add_order int(11) DEFAULT 0 COMMENT 添加顺序, PRIMARY KEY (detail_id), KEY idx_formula_id (formula_id), CONSTRAINT fk_detail_formula FOREIGN KEY (formula_id) REFERENCES formula (formula_id) ON DELETE CASCADE ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT配方明细表;注意material_name在明细表里冗余了一份。原料表改名时明细表里的历史快照不受影响这就是空间换时间。加ON DELETE CASCADE后删配方主表时明细自动删除省一条手动删除的代码。工艺步骤表结构类似包含工序名、温度、时间、搅拌速度、检验指标外键指向formula_id。3.2 导入SQL并验证字符集与三张视图拿到SQL脚本后直接在命令行导入最省事。用Navicat或DBeaver导入也可以但要注意它们的字符集默认值可能跟你脚本不一致导完出现乱码再返工更麻烦。mysql -uroot -p --default-character-setutf8mb4 init.sql参数--default-character-setutf8mb4必须带上否则MySQL客户端会按系统默认字符集解释脚本中文注释和COMMENT全变问号。导入完成后用下面几条SQL做快速验证确认所有表和关键数据都在SHOW TABLES; SELECT COUNT(*) AS formula_cnt FROM formula; SELECT COUNT(*) AS detail_cnt FROM formula_detail; SELECT COUNT(*) AS process_cnt FROM process_step;这个包里的论文如果画了ER图一般就是主表和明细表的一对多关系。如果你拿到的SQL里formula_detail有外键但没有ON DELETE CASCADE别急着改表结构先看Java代码里删除配方时是不是手动先删明细再删主表两种方案只能选一种避免删完主表留下孤儿数据。3.3 慢SQL排查配方明细联查为什么卡SSM系统的性能瓶颈基本都在SQL上。配方详情页要同时展示主表、明细节、工艺步骤新手最容易写出来的就是下面这种三表大JOINSELECT f.formula_no, f.formula_name, d.material_name, d.percentage, s.step_name, s.temperature, s.duration_min FROM formula f LEFT JOIN formula_detail d ON f.formula_id d.formula_id LEFT JOIN process_step s ON f.formula_id s.formula_id WHERE f.formula_id 1;单条数据看不出问题但列表页一次要查20条配方每条再带上明细和工艺扫描行数会指数级上涨。先用EXPLAIN看执行计划重点看type列是不是ALL全表扫描key列是不是为NULLEXPLAIN SELECT f.formula_id FROM formula f LEFT JOIN formula_detail d ON f.formula_id d.formula_id WHERE f.formula_id 1;如果type是ALL给formula_detail.formula_id补一个普通索引就能从全表扫变成ref。索引这东西建得早不如建得对formula_id是外键字段MySQL不会自动给外键加索引这是老SSM项目里慢SQL的重灾区。索引加完之后再查一次EXPLAIN看到type从ALL变成ref这条SQL基本就算救回来了。4. 把源码从zip变成能跑的Web应用环境与部署实操4.1 JDK、Maven、Tomcat三个版本对不齐就是白干SSM项目对版本敏感度很高。JDK 8配Tomcat 8.5、Maven 3.6.x是最稳的组合JDK 11以上跑老项目常遇到IllegalAccessErrorTomcat 10把javax.servlet改成jakarta.servlet老SSM代码引用直接编译不过。先检查这三个基础工具的版本命令如下java -version mvn -version重点看java -version输出的第一行是不是1.8。如果是openjdk 17最省事的办法是再装一个JDK 8不要试图强行让老代码在新环境里跑。Maven这边看Apache Maven版本号3.6到3.8都能用3.9也问题不大。Tomcat版本看安装目录下的RELEASE-NOTES或者看启动脚本8.5.x最稳妥。版本确认后在项目根目录执行Maven打包命令mvn clean package -DskipTestsclean清除旧的target目录package把项目打成war包-DskipTests跳过单元测试。打出来的war包在target/下文件名一般是xxxx-1.0.war。第一次执行这条命令会下载大量依赖如果卡住不动检查Maven镜像源国内环境把settings.xml里的aliyun镜像配好五分钟能解决的事情不要折腾半小时。4.2 修改数据库连接配置db.properties里的四个参数SSM项目的数据库连接信息一般集中在db.properties文件里Spring通过PropertyPlaceholderConfigurer读取它来创建DataSource。四个参数一改到位项目基本能连上库jdbc.drivercom.mysql.cj.jdbc.Driver jdbc.urljdbc:mysql://localhost:3306/cosmetic_db?useUnicodetruecharacterEncodingutf8useSSLfalseserverTimezoneAsia/Shanghai jdbc.usernameroot jdbc.password123456com.mysql.cj.jdbc.Driver是MySQL 8.x的驱动类名老项目里写的com.mysql.jdbc.Driver在MySQL 8下会直接报ClassNotFoundException改一下就行。jdbc.url里的serverTimezoneAsia/Shanghai必须加不加MySQL 8会按服务器时区返回时间跟北京时间差八个钟头。useSSLfalse是让连接别走SSL握手本地开发能省一半连接时间。Spring容器里配连接池时下面几个参数决定连接池行为也是面试常问的参数推荐值说明initialSize5启动时初始化的连接数maxActive20连接池最大连接数maxWait60000拿不到连接时最长等待毫秒数minIdle5连接池最小空闲连接数initialSize给5就行给多了项目启动慢。maxActive给20是配本地开发如果后面要压测再看情况调大调大之前先看MySQL的max_connections够不够不然连接池还没满数据库先拒绝连接了。4.3 打包部署与日志定位本地开发推荐直接用Tomcat插件启动但为了复现“部署”这一步手动把war包丢进Tomcat更靠谱cp target/cosmetic.war /usr/local/tomcat/webapps/ /usr/local/tomcat/bin/startup.sh tail -f /usr/local/tomcat/logs/catalina.outcp命令把war包复制到Tomcat的webapps目录Tomcat启动时会自动解压。tail -f实时盯日志这是部署后第一个必要动作。如果启动失败catalina.out里会打印异常栈九成的错误都能在这里定位到。看到一个BeanCreationException在那晃说明Spring容器某个Bean初始化失败往上翻Cause基本是数据库连不上或Mapper XML没找到。启动成功后访问http://localhost:8080/cosmetic/正常会跳到登录页。如果页面CSS和JS全是裸的说明DispatcherServlet把静态资源请求也拦截了return类型写成页面跳转而不是ResponseBody静态资源在webapp/static下。这个问题常见解决方案是让SpringMVC放行静态资源改spring-mvc.xml加一行mvc:resources mapping/static/** location/static//放行后浏览器访问/static/css/style.css能正常加载页面样式就回来了。5. SSM配方与工艺管理避坑实录五条血泪经验5.1 启动报ClassNotFoundException缺lib下的jar现象Tomcat启动到一半抛java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener控制台直接红字退出。原因项目依赖的jar包没有打进WEB-INF/lib目录。如果你用Eclipse直接导出war右键项目选Export时没勾选Export source files依赖不会打包进去如果用Maven打包则多半是某个依赖的scope标成了provided导致Tomcat运行时找不到。解决Maven先看一眼pom.xml里Spring的scope是否被误标成provided。正确做法是重新执行mvn clean package然后打开生成的war包检查WEB-INF/lib里有没有spring-webmvc的jar。如果是Eclipse导出改用maven build替代导出向导。5.2 表单提交的中文变问号现象配方名称输入“保湿霜”提交后数据库里存的是“????”页面回显也变成一串问号。原因三层编码不一致。第一层是JSP页面charset没设成UTF-8第二层是SpringMVC的CharacterEncodingFilter没有配置或者forceEncoding没开第三层是数据库连接串里characterEncodingutf8参数缺失。解决先确认web.xml里有这段过滤器且encoding和forceEncoding都设成UTF-8filter filter-nameencoding/filter-name filter-classorg.springframework.web.filter.CharacterEncodingFilter/filter-class init-param param-nameencoding/param-name param-valueUTF-8/param-value /init-param init-param param-nameforceEncoding/param-name param-valuetrue/param-value /init-param /filter再确认db.properties的jdbc.url里带了characterEncodingutf8。JSP页面顶部加% page contentTypetext/html;charsetUTF-8 %。这三处改完中文基本就正常了。血泪经验这三处缺一处都是问号别只改一处就提交。5.3 配方删不掉外键约束把主表卡住了现象在管理后台删除一条配方记录服务端报Cannot delete or update a parent row: a foreign key constraint fails数据库层面主表记录纹丝不动。原因formula_detail表有外键指向formula主表且外键没有ON DELETE CASCADE删除主表记录时MySQL拒绝执行。这也说明SQL脚本给你的外键定义跟Java代码的删除逻辑不匹配。解决两条路选一条。要么把外键改成ON DELETE CASCADE改掉后删主表自动删明细代码逻辑简单要么Java代码里先调detailMapper.deleteByFormulaId(id)再调formulaMapper.deleteByPrimaryKey(id)。注意这个坑在答辩环节经常被当作追问点如果你说数据库级联删就得解释清楚为什么不担心误删这时候要答“版本轨迹也一起删掉符合配方回滚需求”。5.4 页面白屏500DispatcherServlet拦截了静态资源现象登录页能打开但样式全丢浏览器F12看到CSS文件返回500控制台报No mapping found for HTTP request with URI /static/css/style.css。原因SpringMVC的DispatcherServlet配置了/作为servlet映射把所有请求都交给Spring处理但spring-mvc.xml里没有配置静态资源放行Tomcat默认的DefaultServlet被绕过了。解决在spring-mvc.xml配置静态资源映射第4章给过那行mvc:resources。如果项目用了JSP也要配置mvc:view-controller path/ view-namelogin/把根路径映射到登录页否则访问http://localhost:8080/cosmetic/直接404。这一步是SSM新手最常见的翻车区确认完这行配置再看别的。5.5 连接MySQL 8失败认证插件不兼容现象启动时抛Access denied for user rootlocalhost但密码明明在Navicat能连上代码里就是连不上。原因MySQL 8默认认证插件是caching_sha2_password而老版本MySQL驱动或老代码用的连接方式只支持mysql_native_password。驱动版本低会连接失败高版本驱动连上也可能在握手阶段被拒绝。解决先升级驱动pom.xml里MySQL驱动版本提到8.0.33或更新一位确保用的是com.mysql.cj.jdbc.Driver。如果升级驱动后还不行就用一条SQL把root账户切回老认证插件ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY 123456; FLUSH PRIVILEGES;改完这条密码变成了123456记得同步改db.properties。生产环境不建议动认证插件本地开发用它解决兼容性最直接这是我在部署老SSM项目时踩得最深的一个坑。6. 从“能答辩”到“能写进简历”把SSM配方项目改出记忆点6.1 十分钟自测清单项目跑起来之后按这张表逐条过一遍每一关都要看到明确结果。过完这一趟你才算真正掌握了这套代码。自测项操作预期结果登录认证输入admin和正确密码跳转首页Session里有用户信息配方新增填编号、名称保存列表刷新新记录出现在第一行配方版本修改同编号配方再保存出现两条记录version递增明细校验加两条原料百分比合计100保存成功合计不为100时被拦截工艺维护给配方加两步工序详情页按添加顺序展示权限控制用普通账号访问管理页被拦截返回无权限提示如果普通账号能直接访问管理接口说明项目里某个拦截器没拦住这就是一个可以写进简历的改造点给SSM项目补一套基于Interceptor的权限校验。6.2 两个低成本改造方向第一个方向是优化查询。现在配方详情是两次数据库查询数据量大了之后可以改成一条SQL用JOIN查出来再在Service层组装VO。改完记得对比EXPLAIN的执行情况把这个对比数据放简历里比写“熟悉SSM”有力得多。第二个方向是给配方加一个状态机。现在的status字段只有0、1、2三个数字但代码里没有控制状态流转。可以自己写一个StateUtil类定义“草稿→生效→停用”的合法路径不合法操作直接抛异常。这个小改动老师一听就明白你在想什么它展示的不是编码量而是对业务边界的思考。6.3 最后一次部署前把这两件事做完第一件把db.properties里的密码从明文改掉至少改成读环境变量或外置配置。第二件在README里写清楚启动步骤——JDK版本、MySQL版本、导入SQL、修改db.properties、打包部署。写这份文档的时候你会重新审视每一步的必要性这也是对这套源码最好的理解方式。我当年拿到这种SSM项目包的时候第一反应也是赶紧跑通完事后来面试被问到“配方版本冲突怎么解决”才发现自己根本没想过这个问题。后来把版本联合约束、外键级联、状态流转串起来讲了一遍面试官的眼神明显亮了。这套包的真正价值不在代码本身而在你把它讲清楚的能力。希望这篇笔记里的拆解思路和踩坑记录能帮到你把项目跑起来再把它讲成你自己的故事。本文还有配套的精品资源点击获取
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

Redis主从复制原理与生产实战:从同步机制到故障排查 2026/9/30 10:59:19

Redis主从复制原理与生产实战:从同步机制到故障排查

从「Redis主从复制」这个词展开,我第一反应不是背诵那套面试八股,而是这些年踩过的坑:比如从节点数据延迟导致线上读到旧数据,比如没配好masterauth导致复制握手失败,再比如repl_backlog太小导致从节点断线重连后被迫全…

阅读更多 →
NFS、SMB、FTP、MinIO四大文件共享方案对比与选型指南 2026/9/30 10:59:12

NFS、SMB、FTP、MinIO四大文件共享方案对比与选型指南

做文件共享的人,十有八九都纠结过这个问题:NFS、SMB、FTP、MinIO到底该选哪个?我自己从最早在Linux服务器之间共享目录,到后来给公司搭NAS、做打印机扫描对接,再到用MinIO给应用做对象存储,这四个方案可以说…

阅读更多 →
硅基流动+DeepSeek本地部署实战:从能跑到敢上线 2026/9/30 10:59:12

硅基流动+DeepSeek本地部署实战:从能跑到敢上线

简介:本资源是一份面向AI开发者与技术实践者的DeepSeek性能优化指南,聚焦解决官方平台因高并发请求导致的‘服务繁忙’问题,以及本地部署对硬件配置要求过高的痛点。文档详细阐述了如何借助硅基流动平台实现DeepSeek模型的稳定、高效调用&…

阅读更多 →
openclaw+ollama本地部署实战:从安装配置到常见报错修复 2026/9/30 10:59:12

openclaw+ollama本地部署实战:从安装配置到常见报错修复

最近把 openclaw 和 ollama 这套组合全部搬到了本地,总算把以前离不开云端 API 的习惯改了。 openclaw 是一个典型的会话驱动型 AI 代理框架,负责管理多轮对话、工具调用和任务拆解; ollama 则专注在本地跑模型推理。两者前后端配合&…

阅读更多 →
DeepSeek大模型在市场监管领域的落地实践 2026/9/30 10:59:03

DeepSeek大模型在市场监管领域的落地实践

简介:本资源是一份聚焦人工智能大模型在政府监管场景落地实践的深度研究报告,面向市场监管系统工作人员、政务数字化建设者、AI技术应用研究者及政策合规从业者,旨在解决大模型如何赋能执法辅助、风险预警、信用治理等核心业务难题。文档为单…

阅读更多 →
tldr 翻译模板指南:common-descriptions.md 通用描述术语的多语言维护实践 2026/9/30 10:58:49

tldr 翻译模板指南:common-descriptions.md 通用描述术语的多语言维护实践

文档教程知识库 【免费下载链接】tldr Collaborative cheatsheets for console commands 📚. 项目地址: https://gitcode.com/GitHub_Trending/tl/tldr 点击查看 免费下载 本篇指南围绕 tldr 仓库的 common-descriptions.md 展开,它是面向 3…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉