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

天津做网站推广的公司南宁市建设工程质量安全协会网站

天津做网站推广的公司,南宁市建设工程质量安全协会网站,南京市互联网平台公司,检察院加强网站建设随着信息技术和网络技术的飞速发展#xff0c;人类已进入全新信息化时代#xff0c;传统管理技术已无法高效#xff0c;便捷地管理信息。为了迎合时代需求#xff0c;优化管理效率#xff0c;各种各样的管理系统应运而生#xff0c;各行各业相继进入信息管理时代#xf… 随着信息技术和网络技术的飞速发展人类已进入全新信息化时代传统管理技术已无法高效便捷地管理信息。为了迎合时代需求优化管理效率各种各样的管理系统应运而生各行各业相继进入信息管理时代广场舞团就是信息时代变革中的产物之一。 任何系统都要遵循系统设计的基本流程本系统也不例外同样需要经过市场调研需求分析概要设计详细设计编码测试这些步骤基于java语言设计并实现了广场舞团。该系统基于B/S即所谓浏览器/服务器模式应用java技术选择MySQL作为后台数据库。系统主要包括系统首页社团社团活动交流中心公告资讯个人中心后台管理等功能模块。 本文首先介绍了广场舞团管理的技术发展背景与发展现状然后遵循软件常规开发流程首先针对系统选取适用的语言和开发平台根据需求分析制定模块并设计数据库结构再根据系统总体功能模块的设计绘制系统的功能模块图流程图以及E-R图。然后设计框架并根据设计的框架编写代码以实现系统的各个功能模块。最后对初步完成的系统进行测试主要是功能测试、单元测试和性能测试。测试结果表明该系统能够实现所需的功能运行状况尚可并无明显缺点。 关键词广场舞团javaMySQL数据库 基于springboot广场舞团管理系统源码和论文368 基于springboot广场舞团管理系统源码和论文 Abstract With the rapid development of information technology and network technology, mankind has entered a new era of information technology, and traditional management technology has been unable to manage information efficiently and conveniently. In order to meet the needs of the times and optimize management efficiency, a variety of management systems came into being, and all walks of life have entered the era of information management, and square dance troupes are one of the products of the change in the information age. Any system must follow the basic process of system design, this system is no exception, the same need to go through market research, requirements analysis, outline design, detailed design, coding, testing these steps, based on the Java language design and the realization of square dance troupe. The system is based on B/S, the so-called browser/server model, which applies Java technology and selects MySQL as the background database. The system mainly includes functional modules such as system homepage, community, community activities, communication center, announcement information, personal center, background management and so on. This article first introduces the technical development background and development status of square dance troupe management, and then follows the conventional development process of the software, first selects the applicable language and development platform for the system, formulates the module and designs the database structure according to the requirements analysis, and then draws the functional module diagram, flow chart and E-R diagram of the system according to the design of the overall functional module of the system. Then, design the framework and write code based on the designed framework to implement the various functional modules of the system. Finally, the initially completed system is tested, mainly functional, unit, and performance tests. The test results show that the system can achieve the required functions, and the operating conditions are not obvious. Keywords: square dance troupe; java; MySQL database package com.controller;import java.io.*; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.text.SimpleDateFormat; import java.util.*;import javax.servlet.http.HttpServletRequest;import com.alibaba.fastjson.JSON; import com.utils.StringUtil; import org.apache.commons.lang3.StringUtils; import org.json.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; 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 com.annotation.IgnoreAuth; import com.baidu.aip.face.AipFace; import com.baidu.aip.face.MatchRequest; import com.baidu.aip.util.Base64Util; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.baomidou.mybatisplus.mapper.Wrapper; import com.entity.ConfigEntity; import com.service.CommonService; import com.service.ConfigService; import com.utils.BaiduUtil; import com.utils.FileUtil; import com.utils.R;/*** 通用接口*/ RestController public class CommonController {private static final Logger logger LoggerFactory.getLogger(CommonController.class);Autowiredprivate CommonService commonService;/*** Java代码实现MySQL数据库导出** param mysqlUrl MySQL安装路径* param hostIP MySQL数据库所在服务器地址IP* param userName 进入数据库所需要的用户名* param hostPort 数据库端口* param password 进入数据库所需要的密码* param savePath 数据库文件保存路径* param fileName 数据库导出文件文件名* param databaseName 要导出的数据库名* return 返回true表示导出成功否则返回false。*/IgnoreAuthRequestMapping(/beifen)public R beifen(String mysqlUrl, String hostIP, String userName, String hostPort, String password, String savePath, String fileName, String databaseName) {File saveFile new File(savePath);if (!saveFile.exists()) {// 如果目录不存在 saveFile.mkdirs();// 创建文件夹 }if (!savePath.endsWith(File.separator)) {savePath savePath File.separator;}PrintWriter printWriter null;BufferedReader bufferedReader null;try {Runtime runtime Runtime.getRuntime();String cmd mysqlUrl mysqldump -h hostIP -u userName -P hostPort -p password databaseName;runtime.exec(cmd);Process process runtime.exec(cmd);InputStreamReader inputStreamReader new InputStreamReader(process.getInputStream(), utf8);bufferedReader new BufferedReader(inputStreamReader);printWriter new PrintWriter(new OutputStreamWriter(new FileOutputStream(savePath fileName), utf8));String line;while ((line bufferedReader.readLine()) ! null) {printWriter.println(line);}printWriter.flush();} catch (Exception e) {e.printStackTrace();return R.error(备份数据出错);} finally {try {if (bufferedReader ! null) {bufferedReader.close();}if (printWriter ! null) {printWriter.close();}} catch (Exception e) {e.printStackTrace();}}return R.ok();}/*** Java实现MySQL数据库导入** param mysqlUrl MySQL安装路径* param hostIP MySQL数据库所在服务器地址IP* param userName 进入数据库所需要的用户名* param hostPort 数据库端口* param password 进入数据库所需要的密码* param savePath 数据库文件保存路径* param fileName 数据库导出文件文件名* param databaseName 要导出的数据库名*/IgnoreAuthRequestMapping(/huanyuan)public R huanyuan(String mysqlUrl, String hostIP, String userName, String hostPort, String password, String savePath, String fileName, String databaseName) {try {Runtime rt Runtime.getRuntime();Process child1 rt.exec(mysqlUrlmysql.exe -h hostIP -u userName -P hostPort -p password databaseName);OutputStream out child1.getOutputStream();//控制台的输入信息作为输出流String inStr;StringBuffer sb new StringBuffer();String outStr;BufferedReader br new BufferedReader(new InputStreamReader(new FileInputStream(savePath/fileName), utf-8));while ((inStr br.readLine()) ! null) {sb.append(inStr \r\n);}outStr sb.toString();OutputStreamWriter writer new OutputStreamWriter(out, utf8);writer.write(outStr); // 注这里如果用缓冲方式写入文件的话会导致中文乱码用flush()方法则可以避免writer.flush();out.close();br.close();writer.close();} catch (Exception e) {e.printStackTrace();return R.error(数据导入出错);}return R.ok();}/*** 饼状图求和* return*/RequestMapping(/pieSum)public R pieSum(RequestParam MapString,Object params) {logger.debug(饼状图求和:,,Controller:{},,params:{},this.getClass().getName(),params);ListMapString, Object result commonService.pieSum(params);return R.ok().put(data, result);}/*** 饼状图统计* return*/RequestMapping(/pieCount)public R pieCount(RequestParam MapString,Object params) {logger.debug(饼状图统计:,,Controller:{},,params:{},this.getClass().getName(),params);ListMapString, Object result commonService.pieCount(params);return R.ok().put(data, result);}/*** 柱状图求和单列* return*/RequestMapping(/barSumOne)public R barSumOne(RequestParam MapString,Object params) {logger.debug(柱状图求和单列:,,Controller:{},,params:{},this.getClass().getName(),params);ListMapString, Object result commonService.barSumOne(params);ListString xAxis new ArrayList();//报表x轴ListListString yAxis new ArrayList();//y轴ListString legend new ArrayList();//标题ListString yAxis0 new ArrayList();yAxis.add(yAxis0);legend.add();for(MapString, Object map :result){String oneValue String.valueOf(map.get(name));String value String.valueOf(map.get(value));xAxis.add(oneValue);yAxis0.add(value);}MapString, Object resultMap new HashMap();resultMap.put(xAxis,xAxis);resultMap.put(yAxis,yAxis);resultMap.put(legend,legend);return R.ok().put(data, resultMap);}/*** 柱状图统计单列* return*/RequestMapping(/barCountOne)public R barCountOne(RequestParam MapString,Object params) {logger.debug(柱状图统计单列:,,Controller:{},,params:{},this.getClass().getName(),params);ListMapString, Object result commonService.barCountOne(params);ListString xAxis new ArrayList();//报表x轴ListListString yAxis new ArrayList();//y轴ListString legend new ArrayList();//标题ListString yAxis0 new ArrayList();yAxis.add(yAxis0);legend.add();for(MapString, Object map :result){String oneValue String.valueOf(map.get(name));String value String.valueOf(map.get(value));xAxis.add(oneValue);yAxis0.add(value);}MapString, Object resultMap new HashMap();resultMap.put(xAxis,xAxis);resultMap.put(yAxis,yAxis);resultMap.put(legend,legend);return R.ok().put(data, resultMap);}/*** 柱状图统计双列* return*/RequestMapping(/barSumTwo)public R barSumTwo(RequestParam MapString,Object params) {logger.debug(柱状图统计双列:,,Controller:{},,params:{},this.getClass().getName(),params);ListMapString, Object result commonService.barSumTwo(params);ListString xAxis new ArrayList();//报表x轴ListListString yAxis new ArrayList();//y轴ListString legend new ArrayList();//标题MapString, HashMapString, String dataMap new LinkedHashMap();for(MapString, Object map :result){String name1Value String.valueOf(map.get(name1));String name2Value String.valueOf(map.get(name2));String value String.valueOf(map.get(value));if(!legend.contains(name2Value)){legend.add(name2Value);//添加完成后 就是最全的第二列的类型}if(dataMap.containsKey(name1Value)){dataMap.get(name1Value).put(name2Value,value);}else{HashMapString, String name1Data new HashMap();name1Data.put(name2Value,value);dataMap.put(name1Value,name1Data);}}for(int i 0; ilegend.size(); i){yAxis.add(new ArrayListString());}SetString keys dataMap.keySet();for(String key:keys){xAxis.add(key);HashMapString, String map dataMap.get(key);for(int i 0; ilegend.size(); i){ListString data yAxis.get(i);if(StringUtil.isNotEmpty(map.get(legend.get(i)))){data.add(map.get(legend.get(i)));}else{data.add(0);}}}System.out.println();MapString, Object resultMap new HashMap();resultMap.put(xAxis,xAxis);resultMap.put(yAxis,yAxis);resultMap.put(legend,legend);return R.ok().put(data, resultMap);}/*** 柱状图统计双列* return*/RequestMapping(/barCountTwo)public R barCountTwo(RequestParam MapString,Object params) {logger.debug(柱状图统计双列:,,Controller:{},,params:{},this.getClass().getName(),params);ListMapString, Object result commonService.barCountTwo(params);ListString xAxis new ArrayList();//报表x轴ListListString yAxis new ArrayList();//y轴ListString legend new ArrayList();//标题MapString, HashMapString, String dataMap new LinkedHashMap();for(MapString, Object map :result){String name1Value String.valueOf(map.get(name1));String name2Value String.valueOf(map.get(name2));String value String.valueOf(map.get(value));if(!legend.contains(name2Value)){legend.add(name2Value);//添加完成后 就是最全的第二列的类型}if(dataMap.containsKey(name1Value)){dataMap.get(name1Value).put(name2Value,value);}else{HashMapString, String name1Data new HashMap();name1Data.put(name2Value,value);dataMap.put(name1Value,name1Data);}}for(int i 0; ilegend.size(); i){yAxis.add(new ArrayListString());}SetString keys dataMap.keySet();for(String key:keys){xAxis.add(key);HashMapString, String map dataMap.get(key);for(int i 0; ilegend.size(); i){ListString data yAxis.get(i);if(StringUtil.isNotEmpty(map.get(legend.get(i)))){data.add(map.get(legend.get(i)));}else{data.add(0);}}}System.out.println();MapString, Object resultMap new HashMap();resultMap.put(xAxis,xAxis);resultMap.put(yAxis,yAxis);resultMap.put(legend,legend);return R.ok().put(data, resultMap);}/**tableName 查询表condition1 条件1condition1Value 条件1值average 计算平均评分取值有值 Number(res.data.value.toFixed(1))无值 if(res.data){}* */IgnoreAuthRequestMapping(/queryScore)public R queryScore(RequestParam MapString, Object params) {logger.debug(queryScore:,,Controller:{},,params:{},this.getClass().getName(),params);MapString, Object queryScore commonService.queryScore(params);return R.ok().put(data, queryScore);}/*** 查询字典表的分组统计总条数* tableName 表名* groupColumn 分组字段* return*/RequestMapping(/newSelectGroupCount)public R newSelectGroupCount(RequestParam MapString,Object params) {logger.debug(newSelectGroupCount:,,Controller:{},,params:{},this.getClass().getName(),params);ListMapString, Object result commonService.newSelectGroupCount(params);return R.ok().put(data, result);}/*** 查询字典表的分组求和* tableName 表名* groupColumn 分组字段* sumCloum 统计字段* return*/RequestMapping(/newSelectGroupSum)public R newSelectGroupSum(RequestParam MapString,Object params) {logger.debug(newSelectGroupSum:,,Controller:{},,params:{},this.getClass().getName(),params);ListMapString, Object result commonService.newSelectGroupSum(params);return R.ok().put(data, result);}/*** 柱状图求和 老的*/RequestMapping(/barSum)public R barSum(RequestParam MapString,Object params) {logger.debug(barSum方法:,,Controller:{},,params:{},this.getClass().getName(), com.alibaba.fastjson.JSONObject.toJSONString(params));Boolean isJoinTableFlag false;//是否有级联表相关String one ;//第一优先String two ;//第二优先//处理thisTable和joinTable 处理内容是把json字符串转为Map并把带有,的切割为数组//当前表MapString,Object thisTable JSON.parseObject(String.valueOf(params.get(thisTable)),Map.class);params.put(thisTable,thisTable);//级联表String joinTableString String.valueOf(params.get(joinTable));if(StringUtil.isNotEmpty(joinTableString)) {MapString, Object joinTable JSON.parseObject(joinTableString, Map.class);params.put(joinTable, joinTable);isJoinTableFlag true;}if(StringUtil.isNotEmpty(String.valueOf(thisTable.get(date)))){//当前表日期thisTable.put(date,String.valueOf(thisTable.get(date)).split(,));one thisDate0;}if(isJoinTableFlag){//级联表日期MapString, Object joinTable (MapString, Object) params.get(joinTable);if(StringUtil.isNotEmpty(String.valueOf(joinTable.get(date)))){joinTable.put(date,String.valueOf(joinTable.get(date)).split(,));if(StringUtil.isEmpty(one)){one joinDate0;}else{if(StringUtil.isEmpty(two)){two joinDate0;}}}}if(StringUtil.isNotEmpty(String.valueOf(thisTable.get(string)))){//当前表字符串thisTable.put(string,String.valueOf(thisTable.get(string)).split(,));if(StringUtil.isEmpty(one)){one thisString0;}else{if(StringUtil.isEmpty(two)){two thisString0;}}}if(isJoinTableFlag){//级联表字符串MapString, Object joinTable (MapString, Object) params.get(joinTable);if(StringUtil.isNotEmpty(String.valueOf(joinTable.get(string)))){joinTable.put(string,String.valueOf(joinTable.get(string)).split(,));if(StringUtil.isEmpty(one)){one joinString0;}else{if(StringUtil.isEmpty(two)){two joinString0;}}}}if(StringUtil.isNotEmpty(String.valueOf(thisTable.get(types)))){//当前表类型thisTable.put(types,String.valueOf(thisTable.get(types)).split(,));if(StringUtil.isEmpty(one)){one thisTypes0;}else{if(StringUtil.isEmpty(two)){two thisTypes0;}}}if(isJoinTableFlag){//级联表类型MapString, Object joinTable (MapString, Object) params.get(joinTable);if(StringUtil.isNotEmpty(String.valueOf(joinTable.get(types)))){joinTable.put(types,String.valueOf(joinTable.get(types)).split(,));if(StringUtil.isEmpty(one)){one joinTypes0;}else{if(StringUtil.isEmpty(two)){two joinTypes0;}}}}ListMapString, Object result commonService.barSum(params);ListString xAxis new ArrayList();//报表x轴ListListString yAxis new ArrayList();//y轴ListString legend new ArrayList();//标题if(StringUtil.isEmpty(two)){//不包含第二列ListString yAxis0 new ArrayList();yAxis.add(yAxis0);legend.add();for(MapString, Object map :result){String oneValue String.valueOf(map.get(one));String value String.valueOf(map.get(value));xAxis.add(oneValue);yAxis0.add(value);}}else{//包含第二列MapString, HashMapString, String dataMap new LinkedHashMap();if(StringUtil.isNotEmpty(two)){for(MapString, Object map :result){String oneValue String.valueOf(map.get(one));String twoValue String.valueOf(map.get(two));String value String.valueOf(map.get(value));if(!legend.contains(twoValue)){legend.add(twoValue);//添加完成后 就是最全的第二列的类型}if(dataMap.containsKey(oneValue)){dataMap.get(oneValue).put(twoValue,value);}else{HashMapString, String oneData new HashMap();oneData.put(twoValue,value);dataMap.put(oneValue,oneData);}}}for(int i 0; ilegend.size(); i){yAxis.add(new ArrayListString());}SetString keys dataMap.keySet();for(String key:keys){xAxis.add(key);HashMapString, String map dataMap.get(key);for(int i 0; ilegend.size(); i){ListString data yAxis.get(i);if(StringUtil.isNotEmpty(map.get(legend.get(i)))){data.add(map.get(legend.get(i)));}else{data.add(0);}}}System.out.println();}MapString, Object resultMap new HashMap();resultMap.put(xAxis,xAxis);resultMap.put(yAxis,yAxis);resultMap.put(legend,legend);return R.ok().put(data, resultMap);}/*** 柱状图统计 老的*/RequestMapping(/barCount)public R barCount(RequestParam MapString,Object params) {logger.debug(barCount方法:,,Controller:{},,params:{},this.getClass().getName(), com.alibaba.fastjson.JSONObject.toJSONString(params));Boolean isJoinTableFlag false;//是否有级联表相关String one ;//第一优先String two ;//第二优先//处理thisTable和joinTable 处理内容是把json字符串转为Map并把带有,的切割为数组//当前表MapString,Object thisTable JSON.parseObject(String.valueOf(params.get(thisTable)),Map.class);params.put(thisTable,thisTable);//级联表String joinTableString String.valueOf(params.get(joinTable));if(StringUtil.isNotEmpty(joinTableString)) {MapString, Object joinTable JSON.parseObject(joinTableString, Map.class);params.put(joinTable, joinTable);isJoinTableFlag true;}if(StringUtil.isNotEmpty(String.valueOf(thisTable.get(date)))){//当前表日期thisTable.put(date,String.valueOf(thisTable.get(date)).split(,));one thisDate0;}if(isJoinTableFlag){//级联表日期MapString, Object joinTable (MapString, Object) params.get(joinTable);if(StringUtil.isNotEmpty(String.valueOf(joinTable.get(date)))){joinTable.put(date,String.valueOf(joinTable.get(date)).split(,));if(StringUtil.isEmpty(one)){one joinDate0;}else{if(StringUtil.isEmpty(two)){two joinDate0;}}}}if(StringUtil.isNotEmpty(String.valueOf(thisTable.get(string)))){//当前表字符串thisTable.put(string,String.valueOf(thisTable.get(string)).split(,));if(StringUtil.isEmpty(one)){one thisString0;}else{if(StringUtil.isEmpty(two)){two thisString0;}}}if(isJoinTableFlag){//级联表字符串MapString, Object joinTable (MapString, Object) params.get(joinTable);if(StringUtil.isNotEmpty(String.valueOf(joinTable.get(string)))){joinTable.put(string,String.valueOf(joinTable.get(string)).split(,));if(StringUtil.isEmpty(one)){one joinString0;}else{if(StringUtil.isEmpty(two)){two joinString0;}}}}if(StringUtil.isNotEmpty(String.valueOf(thisTable.get(types)))){//当前表类型thisTable.put(types,String.valueOf(thisTable.get(types)).split(,));if(StringUtil.isEmpty(one)){one thisTypes0;}else{if(StringUtil.isEmpty(two)){two thisTypes0;}}}if(isJoinTableFlag){//级联表类型MapString, Object joinTable (MapString, Object) params.get(joinTable);if(StringUtil.isNotEmpty(String.valueOf(joinTable.get(types)))){joinTable.put(types,String.valueOf(joinTable.get(types)).split(,));if(StringUtil.isEmpty(one)){one joinTypes0;}else{if(StringUtil.isEmpty(two)){two joinTypes0;}}}}ListMapString, Object result commonService.barCount(params);ListString xAxis new ArrayList();//报表x轴ListListString yAxis new ArrayList();//y轴ListString legend new ArrayList();//标题if(StringUtil.isEmpty(two)){//不包含第二列ListString yAxis0 new ArrayList();yAxis.add(yAxis0);legend.add();for(MapString, Object map :result){String oneValue String.valueOf(map.get(one));String value String.valueOf(map.get(value));xAxis.add(oneValue);yAxis0.add(value);}}else{//包含第二列MapString, HashMapString, String dataMap new LinkedHashMap();if(StringUtil.isNotEmpty(two)){for(MapString, Object map :result){String oneValue String.valueOf(map.get(one));String twoValue String.valueOf(map.get(two));String value String.valueOf(map.get(value));if(!legend.contains(twoValue)){legend.add(twoValue);//添加完成后 就是最全的第二列的类型}if(dataMap.containsKey(oneValue)){dataMap.get(oneValue).put(twoValue,value);}else{HashMapString, String oneData new HashMap();oneData.put(twoValue,value);dataMap.put(oneValue,oneData);}}}for(int i 0; ilegend.size(); i){yAxis.add(new ArrayListString());}SetString keys dataMap.keySet();for(String key:keys){xAxis.add(key);HashMapString, String map dataMap.get(key);for(int i 0; ilegend.size(); i){ListString data yAxis.get(i);if(StringUtil.isNotEmpty(map.get(legend.get(i)))){data.add(map.get(legend.get(i)));}else{data.add(0);}}}System.out.println();}MapString, Object resultMap new HashMap();resultMap.put(xAxis,xAxis);resultMap.put(yAxis,yAxis);resultMap.put(legend,legend);return R.ok().put(data, resultMap);} }
http://www.pierceye.com/news/61750/

相关文章:

  • 单页网站对攻击的好处陕西seo经理
  • 温州市网站建设公司自动升级wordpress失败 —— 请再试一次.
  • 请简述网站建设的一般流程图wordpress 经典案例
  • 网站访问速度慢的原因购物网站留言反馈页面
  • 网站建设基本流程教学视频教程网站建设平台网站设计
  • 宠物论坛网站策划书学会网站建设三方协议
  • 上海闵行做网站的公司h5网站建设作用
  • wordpress站群系统上海网站推广公司排名
  • 免费注册自己的网站网站关键词优化代码
  • 萍乡建设网站大连新图闻网站设计
  • 国外 素材 网站dw做网站 怎么做背景图片
  • 晚上必看正能量网站短视频ps做网站对齐技巧
  • 网站认证怎么做哪个网站可以做ppt赚钱
  • 怎么开发微信网站王业富
  • 应该符合建设网站设备管理系统下载
  • 朝阳做网站公司网站检测
  • 专做美妆的网站河北省网站备案
  • 比较个性的网站江苏同邦建设有限公司网站
  • TOP域名是什么网站搜索引擎营销优缺点
  • 做外贸找客户最好用的网站做网站的公司北京有哪些
  • 游仙移动网站建设自助式网站
  • 网站制作合同网站安全设计
  • 网站建设嗟商文件青岛的建筑公司
  • 公司做网站价格怎么屏蔽ip段访问网站
  • 网络免费推广网站秒应小程序怎么创建
  • wordpress 嵌入字体优质的seo网站排名优化软件
  • 广西城乡与住房建设厅网站seo专业培训机构
  • php网站开发计划珠海医疗网站建设
  • 昆山市建设工程质量检测中心网站国家高新技术企业公示
  • 网站建设行业报告小程序源码提取