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

网站上传后台在哪北京企业免费建站

网站上传后台在哪,北京企业免费建站,网线制作步骤及方法,推广微信号前言 最近在做项目时遇到一个需求#xff0c;需要将升级的文件压缩成zip#xff0c;再进行传输#xff1b; 通过网络调研#xff0c;有许多方式可以实现#xff0c;例如QT私有模块的ZipReader、QZipWriter#xff1b;或者第三方库zlib或者libzip或者quazip等#xff1…前言 最近在做项目时遇到一个需求需要将升级的文件压缩成zip再进行传输 通过网络调研有许多方式可以实现例如QT私有模块的ZipReader、QZipWriter或者第三方库zlib或者libzip或者quazip等其中libzip和quazip都是依赖于zlib 然后这些都需要变成库然后再链接到QT项目中进行使用 由于项目的特殊性有可能需要在windowLinux和ARM三个平台上去运行如果都编译为库去使用的话那么需要编译三个平台甚是麻烦而且如果系统版本不一样可能还不能用 所以现阶段有两种方案其一是使用QT自带的压缩库其二是使用第三方库的源码 由此可知使用QT自带的私有库是最方便且网络上也有教程(文章最后也提供的操作代码) 但是使用QT自带的私有库有几个缺点第一是需要QT5.14以上的版本才可以使用且在QT6中已经移除了该模块而且需要安装QT时勾选安装QT源码才可以使用由此这种方式pass掉 本人在ARM平台安装QT是使用命令行在线安装的QT的版本无法控制也无法安装源码 只能使用第二种方式了遂在网络上寻找第三方库的源码如何将将源码潜入到QT项目中去 网络上教程百分之99.99都是叫你如何编译使用的剩下百分之0.01是需要vip和付费资源完全没有使用源码的方式 直到我遇到了一篇博客里面博主就是使用QuazipZlib源码用于异步压缩文件为zip格式且博主将代码开源正好符合我的需求再次非常感谢该博主链接如下 QtQuazipZlib源码工程实现带进度同步异步加解压文件_qt 压缩zip 进度-CSDN博客 但是该项目源码也使用到了QT的私有模块对于我这种在ARM平台下使用命令行安装的QT且版本没有达到5.14的我来说无疑是晴天霹雳 项目无法运行报错 没办法只能自己手动去修改这难不倒身为程序员的我 我将代码中的私有模块去掉将博主写的压缩解压缩代码也去掉自己动手写了一个操作类使用了Quazip的接口供外部使用同步 压缩/解压缩 完成后突然想起来还有加密压缩的需求这该怎么办呢 在网络上调研了一整天没啥博客能讲明白或者能使用quazip库直接给出代码的 直到我遇到了另一篇博客里面有分享了一些 加密压缩多个文件 和 解压含密码的压缩文件 的案例 通过参考这些案例我写出来自己的加密压缩和解密压缩文件和文件夹的操作函数经过测试可行 再次也非常感谢该博主的分享博文链接如下 Qt加密压缩与解压-CSDN博客 到了这一步项目需求的加密压缩和解密压缩基本就完成了 但转念一想平常事我们使用的解压缩软件时都是带有进度条的也就是说下解压缩时我们应该需要知道进度 于是乎再次修改代码增加了解压缩操作时将当前进度通过信号发射出去由调用方处理这个信号即可 因为我实现的解压缩功能是同步的所以调用方在处理解压缩时如果不希望卡屏就得使用线程去操作 由此写出了一个简易的解压缩zip软件运行效果如下 压缩成功后 解压缩和压缩文件是一样的这里就不放出演示了 对比一下压缩后的大小 效果还是很明显的 目录 前言 一、基础的解压缩 二、自定义实现解压缩 1.加密压缩 1).打开zip文件 2).获取需要压缩的文件夹内部的所有文件及子文件 3).创建一个QuaZipFile  4).遍历获取到的所有文件列表 5).创建新的ZIP文件条目信息 6).打开ZIP文件条目 7).读取写入 8).关闭文件 9).详细代码 2.解密解压缩 1).创建文件夹 2).打开zip文件 3).获取zip内的所有文件条目 4).遍历这个链表 5).处理文件夹 6).创建一个QuaZipFile  7).打开QuaZipFile 8).读取写入解压缩 9).关闭文件 10).详细代码 三、源码分享 1.下载后如何引入自己的项目工程中 1).拷贝quazip文件夹到自己的项目工程中 2).在自己的项目的.pro文件引入如下代码 3).包含头文件 2.QT自带压缩库操作分享 ZipReader、QZipWriter 1).导入私有模块 2).zipcompress.h 3).zipcompress.cpp 四、结束语 一、基础的解压缩 网络上介绍Quazip库使用的基本都是以下这些 JlCompress mJlCompress;// 压缩文件 mJlCompress.compressFiles(fileCompressed,files);// 解压文件夹 mJlCompress.extractDir(fileCompressed, dir);// 压缩文件夹 mJlCompress.compressDir(fileCompressed, dir, recursive);// 解压文件 mJlCompress.extractFiles(fileCompressed, files); 其实如果是基础用法上面这几句代码也够用了 但是如果涉及到加密压缩和进度方面就得自己去实现解压缩的过程了且这样也更加灵活一点 二、自定义实现解压缩 Quazip库还提供了QuaZip、QuaZipFile、QuaZipNewInfo、QuaZipFileInfo 等类供我们自己去处理 QuaZip 类用于打开一个.zip文件 QuaZipFile 类用于处理zip内部的文件即读取zip内部文件数据(解压)或者往zip内部写入文件(压缩)【在此可以进行加密和解密处理】 QuaZipNewInfo 类用于定义一个zip的文件信息在压缩时使用 QuaZipFileInfo 类用于处理一个zip内部的文件 当然还有以下这么多别家复制过来的 类说明JlCompress典型操作工具类QuaAdler32Adler32算法校验和QuaChecksum32校验和接口QuaCrc32CRC32校验和QuaGzipFileGZIP 文件操作QuaZIODevice压缩/解压 QIODeviceQuaZipZIP 文件QuaZipDirZIP文件内目录导航QuaZipFileZIP文件内的文件QuaZipFileInfoZIP压缩包内的文件信息QuaZipFilePrivateQuaZip的接口QuaZipNewInfo被创建的文件信息QuaZipPrivateQuaZIP内部类 下面是加密压缩和解密压缩的过程分析 1.加密压缩 这里处理的是压缩文件夹压缩文件与之类似 压缩后的文件结构与原来一致 1).打开zip文件 QuaZip newZip(fileCompressed); // 要生成的zip文件 if (!newZip.open(QuaZip::mdCreate)) { qDebug() Failed to create ZIP file: fileCompressed; return false; } 参数枚举介绍 enum Mode {mdNotOpen, /// ZIP文件未打开。这是初始模式。mdUnzip, /// ZIP文件已打开用于读取其内部的文件。mdCreate, /// ZIP文件已通过open()调用创建。mdAppend, /// ZIP文件以追加模式打开。这指的是ZIP/UNZIP包中的APPEND_STATUS_CREATEAFTER模式/// 意味着zip被追加到某个已存在的文件中该文件包含自解压代码。这显然不是您想要用来/// 向现有的ZIP归档添加文件的模式。mdAdd /// ZIP文件已打开用于向归档中添加文件。 }; 一般来说我们只需要用到 mdUnzip 用于解压缩 和 mdCreate 用于压缩即可 2).获取需要压缩的文件夹内部的所有文件及子文件 QStringList filePathList 获取所有文件(); 3).创建一个QuaZipFile  QuaZipFile zipFile(newZip); 使用QuaZip作为参数 4).遍历获取到的所有文件列表 在循环体内部处理压缩事项以下操作都是在循环体内部进行 5).创建新的ZIP文件条目信息 QuaZipNewInfo info(文件名, 文件路径文件名); 6).打开ZIP文件条目 if (!zipFile.open(QIODevice::WriteOnly, info, password.toUtf8().constData(), 0, 8)) { qDebug() Failed to open ZIP entry for writing: fileName; // 关闭ZIP newZip.close(); return false; } open参数介绍 bool open(OpenMode mode, // 打开模式指定是以什么方式打开文件例如只写、追加等const QuaZipNewInfo info, // 文件信息包括文件名、时间戳等const char *password nullptr, // 密码用于加密文件如果不需要加密则传递nullptrquint32 crc 0, // CRC校验码通常设置为0除非在原始模式下使用int method Z_DEFLATED, // 压缩方法Z_DEFLATED表示使用Deflate算法Z_BZIP2ED表示使用BZIP2算法0表示不压缩int level Z_DEFAULT_COMPRESSION, // 压缩级别对于Deflate算法可以是0-9之间的值Z_DEFAULT_COMPRESSION表示默认级别// 以下保持默认即可bool raw false, int windowBits -MAX_WBITS, int memLevel DEF_MEM_LEVEL,int strategy Z_DEFAULT_STRATEGY ); 需要注意的是 src参数通常设置为0,除非你知道使用其他值所带来的后果 method参数需要设置为8,即宏Z_DEFLATED这个是压缩算法注意quazip只支持这种算法所以必须设置为8; level参数是压缩等级可设置0-9之间的任何一个数字0表示无压缩最快9表示最大压缩但最慢一般设置为默认值即可 其实也就是说只需要设置前面三个参数即可 7).读取写入 使用QFile读取本地文件数据写入QuaZipFile中 QFile sourceFile(filePath); sourceFile.open(QIODevice::ReadOnly) zipFile.write(sourceFile.readAll()); // 注意处理大文件时这里会崩溃 注意上面写法在处理大文件时会有问题readAll()函数会将文件数据读如内存中如果文件太大会将堆内存给撑爆程序就闪退了 所以为了避免这样的问题在处理大文件时必须分块进行处理 QByteArray buffer; while(!sourceFile.atEnd()) { buffer sourceFile.read(4096); // 每次读取一页内存数据 zipFile.write(buffer); } 8).关闭文件 最后记得在循环尾部将文件关闭后再进行新一轮的文件读写操作 sourceFile.close(); zipFile.close(); 处理完毕后记得关闭 newZip.close(); 加密压缩文件部分与之类似这里就不展开讲解了 给出函数接口自己动手去实现一下吧 /*** brief 加密压缩多个文件* param fileCompressed 压缩包名* param files 要解压的文件列表* param password 密码* return*/bool compressFilesWithPassword(const QString fileCompressed,const QStringList files,const QString password);9).详细代码 进度部分就不详细讲解了都在代码函数中 /** * brief 加密压缩文件夹内的所有文件 * param fileCompressed 压缩包名-路径 * param dir 压缩路径 * param password 密码 * return */ bool zipCompress::compressDirsWithPassword(const QString fileCompressed, const QString dir, const QString password) {bool result false;if (fileCompressed.isEmpty() || dir.isEmpty()) {emit signalCompressDirinish(result);return result;}QuaZip newZip(fileCompressed); // 要生成的zip文件if (!newZip.open(QuaZip::mdCreate)) {qDebug() Failed to create ZIP file: fileCompressed;emit signalCompressDirinish(result);return result;}// 读取目录中的所有文件QStringList filePathList listFilesInDirectoryRecursively(dir);if (filePathList.isEmpty()) {qDebug() No files to compress in directory: dir;newZip.close();emit signalCompressDirinish(result);return result;}qreal pro 100.0 / filePathList.size();qreal progress 1.0;QuaZipFile zipFile(newZip);for (const QString filePath : filePathList) {// 构造相对于dir的文件名QString fileName QDir(dir).relativeFilePath(filePath);// 创建ZIP文件条目信息QuaZipNewInfo info(fileName, filePath);// 尝试打开ZIP文件条目进行写入if (!zipFile.open(QIODevice::WriteOnly, info, password.toUtf8().constData(), 0, 8)) {qDebug() Failed to open ZIP entry for writing: fileName;// 关闭ZIPnewZip.close();emit signalCompressDirinish(result);return result;}// 打开源文件进行读取QFile sourceFile(filePath);if (!sourceFile.open(QIODevice::ReadOnly)) {qDebug() Failed to open source file for reading: filePath;// 关闭ZIPnewZip.close();emit signalCompressDirinish(result);return result;}// 总进度emit signalCompressionProgress(progress, 1, filePath);// 大文件读取分块处理否则程序会闪退{qreal file_pro 100.0 / (sourceFile.size() / mBlockSize);qreal file_progress 0.0;// 将源文件的内容写入ZIP文件QByteArray buffer;while(!sourceFile.atEnd()) {buffer sourceFile.read(mBlockSize);zipFile.write(buffer);file_progress file_pro;emit signalFileProgress(file_progress, filePath);}emit signalFileProgress(100, filePath);}sourceFile.close();zipFile.close();progress pro;progress qBound(0.0, progress, 99.999);}result true;newZip.close();emit signalCompressionProgress(100, 1, );emit signalCompressDirinish(result);return result; }QStringList zipCompress::listFilesInDirectoryRecursively(const QString directoryPath) {QStringList list;QDirIterator it(directoryPath, QDir::Files, QDirIterator::Subdirectories);while (it.hasNext()) {QString filePath it.next();list.append(filePath);}return list; } 2.解密解压缩 这里处理的是解压缩一个zip文件 解压出来文件结构与压缩包内一致 1).创建文件夹 判断传进来的路径解压路径如果不存在则创建 2).打开zip文件 QuaZip zip(fileCompressed); if (!zip.open(QuaZip::mdUnzip)) { qDebug() Failed to open ZIP file: fileCompressed; return false; } 因为是解压缩所以参数使用mdUnzip 3).获取zip内的所有文件条目 QListQuaZipFileInfo fileInfoList zip.getFileInfoList(); 4).遍历这个链表 解压缩操作都在这个循环体内进行 5).处理文件夹 如果处理的当前文件在本机电脑中还没有路径则进行创建 且跳过是文件夹的操作 6).创建一个QuaZipFile  QuaZipFile zipFile(zip.getZipName(), 文件名); 7).打开QuaZipFile zipFile.open(QIODevice::ReadOnly, password.toUtf8().constData()); 参数二是密码 8).读取写入解压缩 注意为了防止大文件的问题读取写入是还是分块进行操作  QByteArray buffer; while(!zipFile.atEnd()) { buffer zipFile.read(4096); outFile.write(buffer); } 9).关闭文件 最后记得在循环尾部将文件关闭后再进行新一轮的文件读写操作 outFile.close(); zipFile.close(); 处理完毕后记得关闭 zip.close(); 10).详细代码 进度部分就不详细讲解了都在代码函数中 bool zipCompress::extractDirWithPassword(const QString fileCompressed, const QString dir, const QString password) {bool result false;if (fileCompressed.isEmpty() || dir.isEmpty()) {emit signalExtractDirFinish(result);return result;}// 使用QFileInfo获取文件名不带扩展名并构建目标目录路径QFileInfo fileInfo(fileCompressed);QString targetDirName fileInfo.completeBaseName();QString targetDirPath QDir(dir).absoluteFilePath(targetDirName);// 创建目标目录如果不存在QDir targetDir(targetDirPath);if (!targetDir.exists() !targetDir.mkpath(.)) {qDebug() Failed to create target directory: targetDirPath;emit signalExtractDirFinish(result);return result;}// 打开ZIP文件QuaZip zip(fileCompressed);if (!zip.open(QuaZip::mdUnzip)) {qDebug() Failed to open ZIP file: fileCompressed;emit signalExtractDirFinish(result);return result;}// 遍历ZIP文件中的所有条目QListQuaZipFileInfo fileInfoList zip.getFileInfoList();qreal pro 100.0 / fileInfoList.size();qreal progress 1.0;for (const QuaZipFileInfo fileInfoEntry : fileInfoList) {// 组合目标文件路径QString fileName fileInfoEntry.name;QString filePath targetDir.absoluteFilePath(fileName);// 如果是文件夹如果不存在则创建然后跳过文件夹的操作QFileInfo info(filePath);if (info.isDir()) {QDir().mkpath(filePath);continue;} else { // 如果是文件如果路径不存在创建该路径QString path info.path();QDir dpath(path);if (!dpath.exists()) {if (!dpath.mkpath(path)) {qDebug() Failed to create directory: path;emit signalExtractDirFinish(result);return result;}}}// 打开ZIP条目并解压文件QuaZipFile zipFile(zip.getZipName(), fileName);if (zipFile.open(QIODevice::ReadOnly, password.toUtf8().constData())) {QFile outFile(filePath);if (!outFile.open(QIODevice::WriteOnly)) {qDebug() Failed to open output file for writing: filePath;zipFile.close();zip.close();emit signalExtractDirFinish(result);return result;}emit signalCompressionProgress(progress, 2, filePath);// 大文件读取分块处理否则程序会闪退{qreal file_pro 100.0 / (zipFile.size() / mBlockSize);qreal file_progress 0.0;// 解压并写入文件QByteArray buffer;while(!zipFile.atEnd()) {buffer zipFile.read(mBlockSize);outFile.write(buffer);file_progress file_pro;emit signalFileProgress(file_progress, filePath);}emit signalFileProgress(100, filePath);}outFile.close();zipFile.close();} else {qDebug() Failed to open ZIP entry for reading: fileName;zip.close();emit signalExtractDirFinish(result);return result;}progress pro;progress qBound(0.0, progress, 99.999);}result true;// 关闭ZIP文件zip.close();emit signalCompressionProgress(100, 2, );emit signalExtractDirFinish(result);return result; } 三、源码分享 到此解压缩已经介绍完毕现在分享我参考写的解压缩程序 https://download.csdn.net/download/cpp_learner/90411497https://download.csdn.net/download/cpp_learner/90411497因为我这边编写的压缩和解压缩操作都是同步的所以建议操作时使用线程去处理否则会卡屏而且进度条也无法使用 在我给出的案例工程中就是使用了线程去解压缩等操作有兴趣可以学习一下 1.下载后如何引入自己的项目工程中 1).拷贝quazip文件夹到自己的项目工程中 2).在自己的项目的.pro文件引入如下代码 # 源码方式使用需要设置为静态库 DEFINES QUAZIP_STATIC include($$PWD/quazip/3rdparty/zlib.pri) include($$PWD/quazip/quazip.pri) include($$PWD/quazip/zipop/zipop.pri) 3).包含头文件 #include zipcompress.h 头文件包含后就可以直接使用了  compressionTool::zipCompress m_zipCompress; // 压缩文件夹 m_zipCompress.compressDirsWithPassword(mZipPath, mPath, mPassword); // 解压缩 m_zipCompress.extractDirWithPassword(fileName, fileinfo.path(), abc123); // 压缩文件 m_zipCompress.compressFilesWithPassword(mZipPath, mFiles, mPassword); 2.QT自带压缩库操作分享 ZipReader、QZipWriter 以下是我编写好的操作类直接新建文件拷贝代码到文件中即可使用 (注意一般来说需要QT5.14以上的版本才可以使用) 1).导入私有模块 在.pro文件中添加私有模块 QT gui-private 2).zipcompress.h #ifndef ZIPCOMPRESS_H #define ZIPCOMPRESS_H#include QObject #include QtGui/private/qzipreader_p.h #include QtGui/private/qzipwriter_p.hclass ZipCompress : public QObject {Q_OBJECT public:ZipCompress(QObject *parent nullptr);/*** brief 压缩文件* param fileNames 需要压缩的文件名* param saveName 压缩后的文件路径和名字*/bool zipCompressFile(const QStringList fileNames, const QString saveName);/*** brief 压缩文件夹* param dirName 需要压缩的文件夹名* param saveName 压缩后的文件路径和名字*/bool zipCompressDirector(const QString dirName, const QString saveName);/*** brief 解压缩* param zipFile 压缩包* param saveDir 解压路径* return*/bool zipUnCompressFile(const QString zipFile, const QString saveDir);private:/*** brief 递归压缩* param zipWriterHandle QZipWriter指针* param zipParentDirName 父路径相对路径* param srcDir 当前需要处理的文件夹路径绝对路径*/void zipCompressDirector(void *zipWriterHandle, const QString zipParentDirName, const QString srcDir);private:QZipReader *mZipReader;QZipWriter *mZipWriter; };#endif // ZIPCOMPRESS_H 3).zipcompress.cpp #include zipcompress.h#include QFileInfo #include QDir #include QDebugZipCompress::ZipCompress(QObject *parent): QObject(parent) { }bool ZipCompress::zipCompressFile(const QStringList fileNames, const QString saveName) {QZipWriter *zipWriter new QZipWriter(saveName);if (!zipWriter) {qDebug() 压缩失败;return false;}QFile file;QFileInfo fileInfo;foreach (const QString fileName, fileNames) {if (fileName.isEmpty() || fileName) {continue;}// 判断文件是否存在fileInfo.setFile(fileName);if (!fileInfo.exists()) {qDebug() fileName : 文件不存在;continue;}if (fileInfo.isFile()) {// 打开文件file.setFileName(fileName);if (!file.open(QIODevice::ReadOnly)) {qDebug() fileName : 文件打开失败;continue;}// 添加到压缩包中zipWriter-addFile(fileInfo.fileName(), file.readAll());file.close();} else if (fileInfo.isDir()) {// 添加到压缩包中zipWriter-addDirectory(fileName);}}zipWriter-close();if (zipWriter) {delete zipWriter;zipWriter nullptr;}return true; }bool ZipCompress::zipCompressDirector(const QString dirName, const QString saveName) {QFile file(saveName);if (!file.open(QFile::WriteOnly)) {qDebug() 压缩失败;return false;}std::shared_ptrQZipWriter zipWriter(new QZipWriter(file));if (!zipWriter) {qDebug() 压缩失败;return false;}zipCompressDirector(zipWriter.get(), , dirName);zipWriter-close();file.close();return true; }bool ZipCompress::zipUnCompressFile(const QString zipFile, const QString saveDir) {QFile file(zipFile);if (!file.open(QIODevice::ReadOnly)) {qDebug() zipFile : 文件打开失败;return false;}QDir dir(saveDir);if (!dir.exists()) {if (!dir.mkpath(saveDir)) { // 创建文件夹qDebug() saveDir : 文件夹路径不存在且创建失败;return false;}}std::shared_ptrQZipReader zipReader(new QZipReader(file));return zipReader-extractAll(saveDir); // 全部解压出来 }void ZipCompress::zipCompressDirector(void *zipWriterHandle, const QString zipParentDirName, const QString srcDir) {QZipWriter *zipWriter (QZipWriter *)zipWriterHandle;QDir directory(srcDir);QFileInfoList fileList directory.entryInfoList(QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot);for (const QFileInfo fileInfo : fileList) {QString relatePath fileInfo.fileName(); // 获取当前文件名 | 文件夹名if (!zipParentDirName.isEmpty()) {relatePath.prepend(zipParentDirName /); // 头部拼接上父路径相对路径}QString filePath fileInfo.absoluteFilePath(); // 获取当前文件的绝对路径if (fileInfo.isDir()) {// 添加文件夹zipWriter-addDirectory(relatePath);// 参数二文件夹相对路径 参数三文件夹绝对路径zipCompressDirector(zipWriter, relatePath, filePath);} else {QFile file(filePath);if (!file.open(QIODevice::ReadOnly)) {qDebug() filePath : 文件打开失败;continue;}zipWriter-addFile(relatePath, file.readAll());file.close();}} } 四、结束语 文章最后感谢各位能够坚持看完相信此篇文章也会对你有所帮助 当然我上面所给出的只是一些基础用法还有很多高级用法我也还没整明白 或者哪位大佬有更好的实现方式也欢迎评论区分享出来供大家一起探讨学习 完
http://www.dnsts.com.cn/news/78839.html

相关文章:

  • 长沙网站推广有哪些啊开一家网站建设公司好
  • 团购网站开发语言站内搜索工具
  • 广东建设人才网站反向代理wordpress
  • 专业网站建设最便宜网站建设企业模板丫
  • 一个新手如何做网站wordpress手册下载
  • 诸城网站价格做网站用什么技术好
  • 地方网站有何作用金华市开发区人才网
  • 高性能网站建设 pdf长沙网站优化公司
  • 阿里巴巴的网站二维码怎么做建设银行网站点不了
  • 网站建设团队定制可以做外链的音乐网站
  • 响应式网站跟自适应网站的区别游戏网站做代理
  • 建站点的步骤饰品网站模版
  • 天津 建设执业资格注册中心网站表白网站制作教程
  • 网站建设有哪种方式杭州网络公司哪家服务比较好
  • 做网站能致富吗婚恋网站
  • 石河子规划建设局网站计算机网站建设方向
  • 机关网站制度建设网站自己做服务器划算吗
  • 建德网站优化公司广西住房和城乡住建厅官网
  • 网站开发代做黑河企业网站建设公司
  • 企业公司网站模板下载企业seo网站推广公司
  • 去哪找网站建设公司简约的网页设计欣赏
  • html 网站新功能介绍网站flash音乐播放器
  • 四川淘宝网站建设方案wordpress仪表盘访问不了
  • 如何利用微信进行企业网站推广查收录网站
  • 个人做跨境电商网站有哪些商城的网站统计如何做
  • 建设网站需要准备什么员工微信管理系统
  • 关于网站建设的教材网站 产品图片 尺寸
  • 做网站为什么没收入河南零距离文化传播 网站建设
  • 中国设计网址导航网络seo招聘
  • 服务器做视频网站吗代理公司招标流程