位置: IT常识 - 正文

JavaWeb 项目 --- 表白墙 和 在线相册(javaweb项目开发流程)

编辑:rootadmin
JavaWeb 项目 --- 表白墙 和 在线相册 文章目录一. 案例: 表白墙 (使用模板引擎)1. 首先创建 maven 项目2. 创建好模板文件3. 使用数据库存储数据.创建一个类用于数据库连接4. 使用 监视器 来初始化 Thymeleaf5. 编写 Servlet 代码① 重写 doGet 方法② 重写 doPost 方法③ 实现 load 方法④ 实现 save 方法6. 注意事项7. 部署之后 运行截图二. 案例: 在线相册 (使用模板引擎)1. 首先创建 maven 项目2. 创建好模板文件3. 这是通过访问文件夹里的图片的4. 使用 监视器 来初始化 Thymeleaf5. 编写加载页面的 Servlet代码创建一个类,重写 doGet 方法实现 loadImage 方法6. 编写提交图片的 Servlet 代码① 创建一个类,重写 doPost 方法7. 注意事项8. 部署之后 运行截图一. 案例: 表白墙 (使用模板引擎)1. 首先创建 maven 项目

推荐整理分享JavaWeb 项目 --- 表白墙 和 在线相册(javaweb项目开发流程),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:javaweb项目名称,javaweb项目怎么发给别人,javaweb项目的配置文件是,javaweb项目源码,javaweb项目,javaweb项目开发总结,javaweb项目源码,javaweb项目开发流程,内容如对您有帮助,希望把文章链接给更多的朋友!

引入需要的依赖,创建必要的目录

2. 创建好模板文件

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>表白墙</title></head><body> <form action="confession" method="post"> <div class="parent"> <div id="wall">表白墙</div> <div id="remind">输入后点击提交,会将信息显示在表格中</div> <div class="one"><span class="two">谁:</span><input type="text" class="text" name="from"></div> <div class="one"><span class="two">对谁:</span><input type="text" class="text" name="to"></div> <div class="one"><span class="two">说什么:</span><input type="text" class="text" name="message"></div> <div class="one"><input type="submit" value="提 交" class="press"></div> <div class="elem" th:each="message : ${messages}"> <span th:text="${message.from}">wz</span>对<span th:text="${message.to}">zw</span>说: <span th:text="${message.message}">wzz</span> </div> </div> </form> <style> /* 去除浏览器默认样式 */ * { margin: 0; padding: 0; } /* 设置总宽度 */ .parent { width: 400px; margin: 0 auto; } /* 设置表白墙样式 */ #wall { font-size: 30px; font-weight: 700; text-align: center; margin: 5px; } /* 设置提示信息样式 */ #remind{ font-size:13px; text-align: center; color:gray; margin: 5px; } /* 设置弹性布局 */ .one { display: flex; justify-content: center; align-items: center; height: 40px; } /* 设置文字内容 */ .two { width: 100px; line-height: 40px; } /* 设置输入框 */ .one .text{ width: 200px; height: 20px; padding-left: 3px; } /* 提交按钮的设置 */ .one .press{ width: 304px; height: 40px; color:white; background-color: orange; border-radius: 5px; border: none; } /* 设置鼠标点击的时候改变颜色 */ .one .press:active{ background-color: red; } /* 提交之后内容的设置 */ .elem { text-align: center; margin: 15px; } </style></body></html>3. 使用数据库存储数据.创建一个类用于数据库连接

ConnectionDB 类

import com.mysql.cj.jdbc.MysqlDataSource;import javax.sql.DataSource;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;public class ConnectionDB { private static final String URL = "jdbc:mysql://127.0.0.1:3306/confessionWall2?characterEncoding=utf-8&useSSL=true&serverTimezone=UTC"; private static final String USERNAME = "root"; private static final String PASSWORD = "0000"; private static volatile DataSource dataSource = null; public static DataSource getDataSource() { if(dataSource == null){ synchronized (ConnectionDB.class){ if(dataSource == null) { dataSource = new MysqlDataSource(); ((MysqlDataSource) dataSource).setURL(URL); ((MysqlDataSource) dataSource).setUser(USERNAME); ((MysqlDataSource) dataSource).setPassword(PASSWORD); } } } return dataSource; } public static Connection getConnection() throws SQLException { return getDataSource().getConnection(); } public static void close(Connection connection, PreparedStatement statement, ResultSet resultSet){ if(resultSet != null){ try { resultSet.close(); } catch (SQLException e) { e.printStackTrace(); } } if(statement != null){ try { statement.close(); } catch (SQLException e) { e.printStackTrace(); } } if(connection != null){ try { connection.close(); } catch (SQLException e) { e.printStackTrace(); } } }}4. 使用 监视器 来初始化 Thymeleaf

ThymeleafConfig 类 注意加上注解

import org.thymeleaf.TemplateEngine;import org.thymeleaf.templateresolver.ServletContextTemplateResolver;import javax.servlet.ServletContext;import javax.servlet.ServletContextEvent;import javax.servlet.ServletContextListener;import javax.servlet.annotation.WebListener;@WebListenerpublic class ThymeleafConfig implements ServletContextListener { @Override public void contextInitialized(ServletContextEvent servletContextEvent) { System.out.println("ServletContext 初始化完毕!"); ServletContext context = servletContextEvent.getServletContext(); TemplateEngine engine = new TemplateEngine(); ServletContextTemplateResolver resolver = new ServletContextTemplateResolver(context); resolver.setPrefix("/WEB-INF/template/"); resolver.setSuffix(".html"); resolver.setCharacterEncoding("utf-8"); engine.setTemplateResolver(resolver); context.setAttribute("engine",engine); } @Override public void contextDestroyed(ServletContextEvent servletContextEvent) { }}5. 编写 Servlet 代码

首先创建一个 Confession 类

class Confession{ public String from; public String to; public String message;}① 重写 doGet 方法 @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType("text/html;charset=utf-8"); List<Confession> list = load(); TemplateEngine engine = (TemplateEngine) getServletContext().getAttribute("engine"); WebContext webContext = new WebContext(req,resp,getServletContext()); webContext.setVariable("messages",list); engine.process("confessionwall",webContext, resp.getWriter()); }② 重写 doPost 方法 resp.setContentType("text/html;charset=utf-8"); Confession confession = new Confession(); confession.from = req.getParameter("from"); confession.to = req.getParameter("to"); confession.message = req.getParameter("message"); save(confession); resp.sendRedirect("confession");③ 实现 load 方法 private List<Confession> load() { List<Confession> list = new ArrayList<>(); Connection connection = null; PreparedStatement statement = null; ResultSet resultSet = null; try { connection = ConnectionDB.getConnection(); String sql = "select * from confession"; statement = connection.prepareStatement(sql); resultSet = statement.executeQuery(); while(resultSet.next()){ Confession confession = new Confession(); confession.from =resultSet.getString("from"); confession.to = resultSet.getString("to"); confession.message = resultSet.getString("message"); list.add(confession); } } catch (SQLException throwables) { throwables.printStackTrace(); } finally { ConnectionDB.close(connection,statement,resultSet); } return list; }④ 实现 save 方法 private void save(Confession confession) { Connection connection = null; PreparedStatement statement = null; try{ connection = ConnectionDB.getConnection(); String sql = "insert into confession values (?,?,?)"; statement = connection.prepareStatement(sql); statement.setString(1,confession.from); statement.setString(2, confession.to); statement.setString(3,confession.message); int ret = statement.executeUpdate(); if(ret == 1){ System.out.println("插入成功"); }else{ System.out.println("插入失败"); } } catch (SQLException throwables) { throwables.printStackTrace(); } finally { ConnectionDB.close(connection,statement,null); } }6. 注意事项

注意模板引擎

注意 乱码的情况,要添加utf-8

用数据库的方法存数据,要先创建好数据库

create database confessionWall2;use confessionWall2;create table confession( `from` varchar(1024), `to` varchar(1024), `message` varchar(1024));还有一些必要的注解也要加上. 7. 部署之后 运行截图JavaWeb 项目 --- 表白墙 和 在线相册(javaweb项目开发流程)

浏览器输入对应的URL 在数据库为空的时候界面如下 在输入几个数据之后 如下 此时的数据库中表的内容 重新部署再进入URL发现数据还是存在.

二. 案例: 在线相册 (使用模板引擎)1. 首先创建 maven 项目

引入必要的依赖,已经必要的目录

2. 创建好模板文件

image.html

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>相册</title> <link rel="stylesheet" href="./style.css"></head><body> <div class="nav"> <form action="upload" method="POST" enctype="multipart/form-data" > <input type="file" name="myImage"> <input type="submit" value="上传图片"> </form> </div> <div class="parent"> <!-- 第一组图片 --> <figure class="sample" th:each="image : ${images}"> <img th:src="${image.url}" alt="sample1" /> <figcaption> <div> <h2 th:text="${image.name}">Deconovo</h2> </div> </figcaption> <a th:href="${image.url}"></a> </figure> </div></body></html>

style.css

/* 引入文字样式库 */@import url(https://fonts.googleapis.com/css?family=Raleway:400,700);*{ margin: 0 auto; padding: 0 auto; box-sizing: border-box;}html,body{ width: 100%; height: calc(100% - 50px); background-color: #212121;}.parent{ display: flex; justify-content: center; align-items: center; flex-flow: wrap; margin: 0; height: 100%;}.nav{ background-color: rgba(255,255,255,0.3); height: 50px; width: 100%; display: flex; justify-content: left; align-items: center;}/* sample 部分的整体样式 */.sample { font-family: 'Raleway', Arial, sans-serif; position: relative; overflow: hidden; margin: 10px; min-width: 230px; max-width: 315px; width: 100%; color: #ffffff; text-align: center; font-size: 16px; background-color: #000000;}.sample *,.sample *:before,.sample *:after { -webkit-box-sizing: border-box; box-sizing: border-box; /* 当过了 0.55s 过渡效果 */ -webkit-transition: all 0.55s ease; transition: all 0.55s ease;}/* 图片部分的样式 */.sample img { max-width: 100%; backface-visibility: hidden; vertical-align: top;}/* figcaption 用作文档中插图的图像,带有一个标题 */.sample figcaption { position: absolute; bottom: 25px; right: 25px; padding: 5px 10px 10px;}/* 绘制线条 */.sample figcaption:before,.sample figcaption:after { height: 2px; width: 400px; position: absolute; content: ''; background-color: #ffffff;}/* 上面一条线 */.sample figcaption:before { top: 0; left: 0; -webkit-transform: translateX(100%); transform: translateX(100%);}/* 下面一条线 */.sample figcaption:after { bottom: 0; right: 0; -webkit-transform: translateX(-100%); transform: translateX(-100%);}/* 绘制线条 */.sample figcaption div:before,.sample figcaption div:after { width: 2px; height: 300px; position: absolute; content: ''; background-color: #ffffff;}/* 左面一条线 */.sample figcaption div:before { top: 0; left: 0; -webkit-transform: translateY(100%); transform: translateY(100%);}/* 右面一条线 */.sample figcaption div:after { bottom: 0; right: 0; -webkit-transform: translateY(-100%); transform: translateY(-100%);}/* 文字部分 */.sample h2,.sample h4 { margin: 0; text-transform: uppercase;}.sample h2 { font-weight: 400;}.sample h4 { display: block; font-weight: 700; background-color: #ffffff; padding: 5px 10px; color: #000000;}.sample a { position: absolute; top: 0; bottom: 0; left: 0; right: 0;}/* 当鼠标放到图片时的效果, .hover 仅演示需要,可自行取消 */.sample:hover img,.sample.hover img { zoom: 1; filter: alpha(opacity=50); -webkit-opacity: 0.5; opacity: 0.5;}.sample:hover figcaption:before,.sample.hover figcaption:before,.sample:hover figcaption:after,.sample.hover figcaption:after,.sample:hover figcaption div:before,.sample.hover figcaption div:before,.sample:hover figcaption div:after,.sample.hover figcaption div:after { -webkit-transform: translate(0, 0); transform: translate(0, 0);}.sample:hover figcaption:before,.sample.hover figcaption:before,.sample:hover figcaption:after,.sample.hover figcaption:after { /* 过渡延时 0.15s */ -webkit-transition-delay: 0.15s; transition-delay: 0.15s;}/* 背景仅演示作用 */3. 这是通过访问文件夹里的图片的

在webapp下创建一个文件夹 image,里面存放图片. 通过 getServletContext().getRealPath("/image") 来获取绝对路径

4. 使用 监视器 来初始化 Thymeleaf

这里的代码不变

import org.thymeleaf.TemplateEngine;import org.thymeleaf.templateresolver.ServletContextTemplateResolver;import javax.servlet.ServletContext;import javax.servlet.ServletContextEvent;import javax.servlet.ServletContextListener;import javax.servlet.annotation.WebListener;@WebListenerpublic class ThymeleafConfig implements ServletContextListener { @Override public void contextInitialized(ServletContextEvent servletContextEvent) { System.out.println("ServletContext 初始化完毕"); ServletContext context = servletContextEvent.getServletContext(); TemplateEngine engine = new TemplateEngine(); ServletContextTemplateResolver resolver = new ServletContextTemplateResolver(context); resolver.setPrefix("/WEB-INF/template/"); resolver.setSuffix(".html"); resolver.setCharacterEncoding("utf-8"); engine.setTemplateResolver(resolver); context.setAttribute("engine",engine); } @Override public void contextDestroyed(ServletContextEvent servletContextEvent) { }}5. 编写加载页面的 Servlet代码

创建一个 Image 类

class Image { public String name; public String url;}创建一个类,重写 doGet 方法@WebServlet("/Image")public class OnlineImageServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType("text/html;charset=utf-8"); // 1. 扫描指定路径 /webapp/image 路径 List<Image> images = loadImage(); // 2. 构造到模板页面 TemplateEngine engine = (TemplateEngine) getServletContext().getAttribute("engine"); WebContext webContext = new WebContext(req,resp,getServletContext()); webContext.setVariable("images",images); String html = engine.process("image",webContext); resp.getWriter().write(html); }}实现 loadImage 方法

注意使用 getRealPath 方法 以及注意使用 file.listFiles()方法

private List<Image> loadImage() { List<Image> images = new ArrayList<>(); // 首先得到 /webapp/image 的绝对路径 ServletContext context = this.getServletContext(); // 这里是将 webapp下的目录转换成一个绝对路径 String path = context.getRealPath("/image"); // 根据路径 看里面有哪些图片. File file = new File(path); File[] files = file.listFiles(); for(File f:files){ Image image = new Image(); image.name = f.getName(); image.url = "image/"+f.getName(); images.add(image); } return images; }6. 编写提交图片的 Servlet 代码① 创建一个类,重写 doPost 方法

注意一定要加上注解@MultipartConfig

import javax.servlet.ServletException;import javax.servlet.annotation.MultipartConfig;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.Part;import java.io.IOException;// 这个注解在上传文件的功能中是必要的@MultipartConfig@WebServlet("/upload")public class UploadServlet extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String path = getServletContext().getRealPath("/image"); Part part = req.getPart("myImage"); part.write(path + "/" + part.getSubmittedFileName()); resp.sendRedirect("Image"); }}7. 注意事项

主要是得到文件夹,找到路径的步骤复杂点.重点掌握这几种方法的使用

前后端约定好的名称要对应.

传文件需要加上注解,否则会报500的错误.@MultipartConfig

8. 部署之后 运行截图

文件中已经存了两个图片,一运行就可以看到这些图片 点击图片还能放大 上传图片,上传两个图片

本文链接地址:https://www.jiuchutong.com/zhishi/298396.html 转载请保留说明!

上一篇:模型训练步骤(模型训练的过程是什么过程)

下一篇:【Go Web开发】Web初识、RESTful架构和RESTful API详解、Gin框架的安装和简单使用(go开发web项目)

  • 苏康码怎么黄码变绿码(苏康码怎么黄码转绿码)

    苏康码怎么黄码变绿码(苏康码怎么黄码转绿码)

  • airpods左耳连接不上(airpods左耳连接上没声音)

    airpods左耳连接不上(airpods左耳连接上没声音)

  • xsmax换屏幕影响面容吗(xsmax换屏幕影响原彩吗)

    xsmax换屏幕影响面容吗(xsmax换屏幕影响原彩吗)

  • 计算机指令中规定该指令执行功能的部分称为(计算机指令中规定执行操作功能的是)

    计算机指令中规定该指令执行功能的部分称为(计算机指令中规定执行操作功能的是)

  • 苹果x看视频发热正常吗?(苹果x看视频发热卡顿)

    苹果x看视频发热正常吗?(苹果x看视频发热卡顿)

  • 笔记本有麦克风吗(笔记本有麦克风功能吗)

    笔记本有麦克风吗(笔记本有麦克风功能吗)

  • airpods pro充电时灯会一直亮吗(airpods pro充电时一直响)

    airpods pro充电时灯会一直亮吗(airpods pro充电时一直响)

  • 操作过于频繁,请稍后再试(操作过于频繁不能自助解冻)

    操作过于频繁,请稍后再试(操作过于频繁不能自助解冻)

  • 文件没保存怎么恢复(文件没保存怎么找回来wps)

    文件没保存怎么恢复(文件没保存怎么找回来wps)

  • ipad3没法用微信(ipad3不能用微信)

    ipad3没法用微信(ipad3不能用微信)

  • qq视频可以录屏吗(qq视频可以录屏吗手机)

    qq视频可以录屏吗(qq视频可以录屏吗手机)

  • vivo怎么叫出小v(vivo怎么叫出小v来)

    vivo怎么叫出小v(vivo怎么叫出小v来)

  • 苹果11有没有主题可以设置(苹果11有主屏幕吗)

    苹果11有没有主题可以设置(苹果11有主屏幕吗)

  • 主板电池没电了会出现什么情况(主板电池没电了怎么换)

    主板电池没电了会出现什么情况(主板电池没电了怎么换)

  • ipad怎么取消浮动键盘(iPad怎么取消浮窗)

    ipad怎么取消浮动键盘(iPad怎么取消浮窗)

  • 毒的订单记录怎么删除(毒订单信息)

    毒的订单记录怎么删除(毒订单信息)

  • word的缺省扩展名(word2010缺省扩展名)

    word的缺省扩展名(word2010缺省扩展名)

  • word怎么去掉兼容模式(word怎么消除兼容模式)

    word怎么去掉兼容模式(word怎么消除兼容模式)

  • iPhone11pro怎么打开个人热点(iphone11pro怎么打开悬浮球)

    iPhone11pro怎么打开个人热点(iphone11pro怎么打开悬浮球)

  • 拼多多免拼卡在哪获得(拼多多免拼卡在哪里查看)

    拼多多免拼卡在哪获得(拼多多免拼卡在哪里查看)

  • iphone11支持多少w快充(iPhone11支持多少瓦无线充电)

    iphone11支持多少w快充(iPhone11支持多少瓦无线充电)

  • 探探超级喜欢什么用(探探超级喜欢什么意思)

    探探超级喜欢什么用(探探超级喜欢什么意思)

  • 美团浏览历史怎么查询(美团浏览历史记录在哪里)

    美团浏览历史怎么查询(美团浏览历史记录在哪里)

  • excel 两列对比(excel两列对比相同的 则输出另一列)

    excel 两列对比(excel两列对比相同的 则输出另一列)

  • 华为p30有没有nfc功能(华为畅享60 nfc)

    华为p30有没有nfc功能(华为畅享60 nfc)

  • 如何在ppt中加入文件链接(如何在ppt中加入自定义按钮)

    如何在ppt中加入文件链接(如何在ppt中加入自定义按钮)

  • 查找朋友位置不可用(查找朋友位置不可用 通知怎么设置)

    查找朋友位置不可用(查找朋友位置不可用 通知怎么设置)

  • 苹果耳机转接头不支持(苹果耳机转接头设置)

    苹果耳机转接头不支持(苹果耳机转接头设置)

  • 无线充电什么意思(无线充电是什么意思啊)

    无线充电什么意思(无线充电是什么意思啊)

  • 微软官方教你如何绕过Win11 TPM和CPU检查(微软官方教你如何验机)

    微软官方教你如何绕过Win11 TPM和CPU检查(微软官方教你如何验机)

  • 笔记本电脑的触摸板如何禁用呢?(笔记本电脑的触摸板怎么用右键)

    笔记本电脑的触摸板如何禁用呢?(笔记本电脑的触摸板怎么用右键)

  • Win11 Build 22449.1000 预览版发布(附更新修复已知问题汇总)

    Win11 Build 22449.1000 预览版发布(附更新修复已知问题汇总)

  • 所得税费用影响企业利润总额吗
  • 视同销售收入是纳税调整项目吗?
  • 房产税相关问题
  • 材料费发票税点
  • 土地使用税是新增税吗
  • 融资租入的固定资产需要计提折旧吗
  • 信息技术服务费入什么科目
  • 服务不动产扣除项目怎么填
  • 食品类发票明细有哪些面包方便面
  • 用友T3怎么结转上年数据
  • 什么是非关联方交易
  • 停车费可以抵扣个人所得税吗
  • 合同租金总收入怎么填
  • 销售材料应确认的损益是什么意思
  • 企业所得税可以税前扣除的税有哪些
  • 销售退回的货物应当由什么部门清点
  • 当月未收到进项票怎么处理
  • 工程完成投资入什么科目核算与怎么写其会计分录?
  • 非增值税应税项目有哪些2023
  • 2021年营业额多少需要交税
  • 金税盘和税控盘哪个好
  • 速达财务软件使用说明
  • 撤回投资属于什么会计科目
  • 供应商赠送
  • 工资可以一次性计提全年的吗
  • 信息服务费发票范围
  • 工资可以做企业成本吗?
  • 离职后绩效奖金应该按照整月发吗
  • 小企业会计准则成本核算方法选什么
  • printnow.exe - printnow是什么进程 有什么作用
  • 棚户区改造贷款管理办法
  • 房地产开发企业建造的商品房,在出售前
  • 企业租赁汽车交什么税
  • win11如何调整鼠标中键
  • 工程质保金账务处理办法
  • 工业企业出售边角余料交的增值税税率是多少
  • 土地投资入股是否缴纳土地增值税12366
  • 语音模块作用
  • PHP:mime_content_type()的用法_fileinfo函数
  • vue-mapvgl
  • 预算会计的核算对象是什么
  • mysql 扩展
  • 餐饮服务税率是服务类税率还是货物类
  • 财务会计的主要目标和工作内容包括
  • 权益法和成本法的适用范围
  • 未确认融资费用含税吗
  • 社会组织志愿者参观泉州华侨历史博物馆
  • 将外购商品作为非货币
  • 公司内部核算调研报告
  • 零售行业折扣销售方案
  • 快递做账用什么软件
  • 费用报销单和费用核销单一样吗
  • 建筑业纳税人简易征收偷逃增值税
  • 一般纳税人的发票抵扣有效期多久
  • 备查账依据什么登记
  • 出纳的现金日记账表格怎么做
  • 研发费用怎样进成本科目
  • sql server 操作
  • mysql5.5怎么用
  • linux make命令怎么用
  • usb3.0接口可以插优盘吗
  • window10打开rar文件
  • xp系统怎么打开开机启动项
  • c盘里面放什么
  • 双系统怎么转移文件
  • 在Linux系统中安装Anaconda
  • windows10地图用不了
  • Cocos2dx CCSprite CCSpriteFrame CCTexture2D CCAnimation学习总结
  • 编程javascript
  • Node.js中的construct
  • css hacks
  • jquery validation
  • unity引擎工具
  • jquery设置定时器
  • 安卓程序切换
  • javascript !
  • 服务协议属于哪类合同
  • 税收科研工作思路
  • 怎么看扣税明细
  • 江苏税务缴费小程序
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设