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

微网站建站php 网站共享变量

微网站建站,php 网站共享变量,佛山竞价账户托管,犀牛云网站做的怎么样多级文件系统 1 设计目的 为了加深对文件系统内部功能和实现过程的理解#xff0c;设计一个模拟的多用户多级目录的文件系统#xff0c;并实现具体的文件物理结构、目录结构以及较为完善的文件操作命令集。 2 设计内容 2.1系统操作 操作命令风格#xff1a;本文件系统的…多级文件系统 1 设计目的 为了加深对文件系统内部功能和实现过程的理解设计一个模拟的多用户多级目录的文件系统并实现具体的文件物理结构、目录结构以及较为完善的文件操作命令集。 2 设计内容 2.1系统操作 操作命令风格本文件系统的操作命令风格将采用windows系统的文件操作命令风格操作命令区分大小写并能在用户错误地执行某些操作之后给出及时反馈提供良好的交互体验。 具体的操作本文件系统将实现以下功能操作 2.2文件物理结构 本文件系统的文件物理结构将采用顺序结构即将文件记录存储在一块连续的磁盘空间中。相应地磁盘空间的分配也采用连续分配的方式。 2.3文件目录结构 本文件系统的文件目录结构将采用树形目录结构。树形目录结构的优点是可以更方便有效地管理用户的文件特别是在多用户系统且用户的文件数量较多的情境中。树形目录结构也是目前最为流行的文件目录结构之一比较符合大多数人的使用习惯。 2.4磁盘空间管理 本文件系统的磁盘空间管理采用位示图来进行管理用户可以使用show命令来显示磁盘空间位示图以查看当前系统的磁盘空间使用情况。 2.5额外功能 本文件系统提供查看系统操作命令集的功能用户可以使用help命令来查看本系统已实现的功能优化用户的使用体验。 另外本文件系统还提供了将创建的文件保存到电脑本地的功能以便用户下次使用本系统时能查看自己所创建的文件。2.6编程语言和环境 本文件系统的编程语言采用Java语言运行环境为JDK 1.8版本及以上。 3 设计步骤 3.1需求分析 3.1.1功能需求 本文件系统的功能模块将细分为三个模块用户管理模块、文件管理模块、系统管理模块。各个模块的功能需求如表3.1~表3.3所示。 **表 3. SEQ 表 _ ARABIC \s 1 1 用户管理模块功能需求_ 名称详细描述用户注册用户使用register命令注册一个系统用户并要求输入用户名和密码用户登录用户使用login命令进行登录需要输入用户名和密码进行身份校验用户注销用户使用logout命令注销当前已登录的用户 表 3.2 文件管理模块功能需求 名称详细描述创建目录用户使用mkdir命令创建一个文件目录文件目录名不能和当前目录下的文件或文件目录重名并且不区分大小写列出文件用户使用dir命令列出当前目录下的所有文件的详细信息支持使用路径名切换目录用户使用cd命令切换到目标目录路径名使用windows系统的风格创建文件用户使用create命令创建一个文件文件名不能和当前目录下的文件或文件目录重名并且不区分大小写打开文件用户使用open命令打开一个文件支持使用路径名读取文件用户使用read命令读取一个已打开的文件可向后读取和向前读取写入文件用户使用write命令向一个已打开的文件写入记录关闭文件用户使用close命令关闭一个已打开的文件删除文件用户使用delete命令删除一个存在的文件或文件目录支持使用路径名重命名文件用户使用rename命令对一个文件或文件目录进行重命名新的名称不能和当前目录下的文件或文件目录重名并且不区分大小写 表 3.3 系统管理模块功能需求 名称详细描述显示帮助用户使用help命令查看当前系统支持的操作命令以及使用方法显示磁盘位示图用户使用show命令查看当前磁盘空间的位示图和其他信息退出系统用户使用exit命令退出文件系统系统在退出前会保存用户信息、文件信息和磁盘空间信息 3.1.2性能需求 本文件系统具有较高的响应比在文件信息不是特别多的时候能够做到0延迟响应。并且本文件系统运行所需的内存空间比较小保存文件的大小与文件信息的多少成正比。 3.1.3交互需求 用户与本文件系统的交互在控制台中进行并且可以方便地查看系统操作命令降低了用户的学习使用成本。 本文件系统具有良好的信息展示功能包括文件信息展示、文件内容展示、操作命令展示、位示图展示使用户可以及时地获取自己所需要的信息。 本文件系统具有友好的错误信息反馈。在用户想要执行一项不被允许的操作时如打开不存在的文件能够给予用户正确、简洁的引导式的错误反馈。 3.2概要设计 3.2.1设计思想 本文件系统在设计上采用模块化的思想将服务类型一致的功能划分到同一个模块使项目整体上比较清晰。并且每个模块都提供对外调用的接口这样就能让其他模块在需要的时候调用本模块的某些功能实现复用。 3.2.2模块设计 本文件系统分为用户管理模块、文件管理模块和系统管理模块三个大模块。其中各个模块细分如下 用户管理模块负责提供用户注册、用户登录、用户注销三个功能。文件管理模块文件管理模块还可分为文件模块、文件目录模块以及磁盘模块三个小模块。其中 文件模块负责提供创建文件、打开文件、读取文件、写入文件、关闭文件、删除文件以及重命名文件共七个功能。文件目录模块负责提供创建目录、切换目录、列出文件以及解析路径共四个功能。磁盘模块负责提供存储记录、释放磁盘空间、读取记录、保存磁盘数据以及加载磁盘数据共五个功能。系统管理模块系统管理模块有一个下属模块打印信息模块该模块负责提供显示文件列表、显示文件内容、显示帮助列表以及显示位示图共四个功能。 具体的系统模块图如图3.1所示。 图3.1 系统模块图 3.2.3抽象数据类型定义 系统用户信息实体类定义如下 public class User implements Serializable {/*** 用户名*/private String username;/*** 密码*/private String password; }文件控制块实体类定义如下 public class FileControlBlock implements Serializable {/*** 是否是目录文件*/private boolean isDirectory;/*** 文件名包括了拓展名*/private String fileName;/*** 拓展名*/private String suffix;/*** 起始盘块号*/private Integer startBlock;/*** 所占用的盘块数* 文件大小 一个盘块的大小 * 所占用的盘块数*/private Integer blockNum;/*** 文件属性保护码列表*/private ListProtectType protectTypeList;/*** 创建时间*/private LocalDateTime createTime;/*** 最后一次修改时间*/private LocalDateTime updateTime; }树形目录结构实体类定义如下 public class Directory implements Serializable {/*** 文件控制块*/private FileControlBlock fileControlBlock;/*** 在树形目录结构中的位置*/private Integer index;/*** 文件夹属性子目录项集合*/private ListDirectory childDirectory;/*** 父目录项的位置*/private Integer parentIndex;打开的文件信息实体类定义如下 public class ActiveFile {/*** 文件控制块*/private FileControlBlock fileControlBlock;/*** 文件记录*/private ListCharacter fileRecord;/*** 读指针*/private Integer readPtr;/*** 写指针*/private Integer writePtr; }虚拟磁盘空间实体类定义如下 public class Disk implements Serializable {/*** ListCharacter: 表示一个盘块* ListListCharacter: 表示所有盘块的集合即一个磁盘*/private ListListCharacter disk;/*** 表示存储在该磁盘上的系统用户集*/private MapString, User userMap;/*** 表示存储在该磁盘上的所有文件控制块*/private ListFileControlBlock fileControlBlockList;/*** 表示存储在该磁盘上的树形结构目录第0个元素为根目录*/private ListDirectory directoryStruct;/*** 表示存储在该磁盘上的磁盘位示图*/private Integer[][] bitmap; }3.2.4主程序的流程图 主程序的流程图如图3.2所示。 图3.2 主程序流程图 3.3详细设计 3.3.1系统算法IPO表 表3.4~表3.26展示了本文件系统的各个功能的具体实现算法IPO表介绍了各功能模块的编号、模块、日期、作者、被调用模块、输入输出、数据处理与相关数据。如下所示 表3.4用户注册IPO表 表3.5用户登录IPO表 表3.6用户注销IPO表 表3.7创建文件IPO表 表3.8打开文件IPO表 表3.9读取文件IPO表 表3.10写入文件IPO表 表3.11关闭文件IPO表 表3.12删除文件IPO表 表3.13重命名文件IPO表 表3.14创建目录IPO表 表3.15切换目录IPO表 表3.16列出文件IPO表 表3.17解析路径IPO表 表3.18存储记录IPO表 表3.19释放磁盘空间IPO表 表3.20读取记录IPO表 表3.21保存磁盘数据IPO表 表3.22加载磁盘数据IPO表 表3.23显示文件列表IPO表 表3.24显示文件内容IPO表 表3.25显示帮助列表IPO表 表3.26显示位示图IPO表 3.4调试分析 一开始在实现树形结构目录的时候我的文件目录项实体类是这样的 public class Directory implements Serializable {/*** 文件控制块*/private FileControlBlock fileControlBlock;/*** 文件夹属性子目录项集合*/private ListDirectory childDirectory;/*** 父目录项*/private Directory parentDirectory; }在一个目录项之中持有其父目录项的引用如果该目录项是目录文件的话还持有归属于它的子目录项的集合这样便可以实现一个树形结构的目录。而在磁盘中只要持有一个对根目录的引用就可以查找到所有的目录项这样是很方便的一种实现方案。 但是这样的实体类在程序实际运行起来的时候是有问题的。假设有这样的情形directoryA是一个表示目录文件的目录项directoryB是一个表示数据文件的目录项并且directoryB的父目录项是directoryA。这样的关系在程序中表现为directoryA的childDirectory属性中持有对directoryB的引用而directoryB的parentDirectory属性持有对directoryA的引用这样就造成了循环引用。 这样的循环引用问题在Java的序列化和反序列化的时候表现的尤为明显。因为本文件系统可以将系统运行过程中的磁盘数据保存到本地文件中也可以将本地文件中的磁盘数据加载到程序中前者是通过序列化实现的后者是通过反序列化实现的。但是由于循环引用的问题在进行序列化和反序列化的时候会报栈溢出的错误导致磁盘数据加载不了表现为找不到本该存在的目录项。 当时发现这个问题的时候我通过IDEA的debug功能一步一步地调试最终定位到问题的根源以及想出了解决方案。改进后的文件目录项实体类如下所示 public class Directory implements Serializable {/*** 文件控制块*/private FileControlBlock fileControlBlock;/*** 在树形目录结构中的位置*/private Integer index;/*** 文件夹属性子目录项集合*/private ListDirectory childDirectory;/*** 父目录项的位置*/private Integer parentIndex; }这样进行了修改之后在磁盘中要保存的是整个树形目录结构的所有目录项的列表如下所示 public class Disk implements Serializable {.../*** 表示存储在该磁盘上的树形结构目录第0个元素为根目录*/private ListDirectory directoryStruct;... }3.5系统测试 3.5.1 help命令测试 测试数据如下表 前提条件命令输入执行结果结果分析无help显示本系统的帮助列表help命令功能正常 实际测试结果如下图所示 3.5.2 exit命令测试 测试数据如下表 前提条件命令输入执行结果结果分析无exit退出本系统exit命令功能正常 实际测试结果如下图所示 3.5.3 register命令测试 测试数据如下表 前提条件命令输入执行结果结果分析无register注册用户失败用户名不能为空缺少[用户名]参数无register pw注册用户失败密码不能为空缺少[密码]参数[pw]这个用户没有被注册register pw 123注册用户成功register命令功能正常[pw]这个用户已被注册register pw 123注册用户失败该用户已存在[pw]是一个已存在的用户不能重复注册 实际测试结果如下图所示 3.5.4 login命令测试 测试数据如下表 前提条件命令输入执行结果结果分析无login用户登录失败该用户不存在缺少[用户名]参数系统会判定[用户名]为空字符无login pw用户登录失败密码错误缺少 [密码]参数系统会判定[密码]为空字符[pw]这个用户已被注册且密码不是456login pw 456用户登录失败密码错误[pw]这个用户的密码不正确[unknown]这个用户没有被注册login unknown 123用户登录失败该用户不存在[unknown]这个用户不存在没有注册过[pw]这个用户已被注册且密码是123login pw 123登录成功用户名和密码都正确登录成功 实际测试结果如下图所示 3.5.5 logout命令测试 测试数据如下表 前提条件命令输入执行结果结果分析已登录了某个用户logout注销成功logout命令功能正常当前没有登录用户logout用户注销失败当前没有登录用户logout命令功能正常 实际测试结果如下图所示 3.5.6 show命令测试 测试数据如下表 前提条件命令输入执行结果结果分析无show显示位示图信息show命令功能正常 实际测试结果如下图所示 注意以下命令能够正确执行前提都是要在已进行了登录的情况下如果没有进行登录系统会给出错误提示信息。所以下述命令的测试都是在已登录了的情况下进行的测试此前提条件不再赘述忘悉知。 3.5.7 mkdir命令测试 测试数据如下表 前提条件命令输入执行结果结果分析无mkdir创建目录失败文件名不能为空缺少[目录名]这个参数系统会判定目录名为空字符当前目录下不存在[os]这个子目录mkdir os创建成功使用[dir]命令可以查看到[os]这个目录的信息mkdir命令功能正常当前目录下存在[os]这个子目录mkdir os创建目录失败文件名重复同一个目录中的文件不能重名 实际测试结果如下图所示 3.5.8 dir命令测试 测试数据如下表 前提条件命令输入执行结果结果分析无dir列出当前目录下面所有文件的信息dir命令功能正常 实际测试结果如下图所示 3.5.9 cd命令测试 测试数据如下表 前提条件命令输入执行结果结果分析无cd仍在当前目录如果缺少[目录路径]参数则停留在当前目录下当前目录下存在[os]这个子目录cd os进入到os目录cd命令功能正常当前目录下不存在[os]这个子目录cd os切换目录失败找不到对应目录cd命令功能正常存在上一级目录cd …返回到上一级目录cd命令功能正常 实际测试结果如下图所示 3.5.10 create命令测试 测试数据如下表 前提条件命令输入执行结果结果分析无create创建文件失败文件名不能为空缺少[文件名]这个参数系统会判定文件名为空字符当前目录下不存在[a.txt]这个文件create a.txt创建文件成功使用[dir]命令可以查看到[a.txt]的信息create命令功能正常当前目录下存在[a.txt]这个文件create a.txt创建文件失败文件名重复同一个目录中的文件不能重名当前目录下存在[a.txt]这个文件create A.txt创建文件失败文件名重复本系统的文件名不区分大小写 实际测试结果如下图所示 3.5.11 open命令测试 测试数据如下表 前提条件命令输入执行结果结果分析无open打开文件失败文件名不能为空缺少[文件名]这个参数系统会判定文件名为空字符当前目录下不存在[b.jpg]这个文件open b.jpg打开文件失败文件不存在open命令功能正常当前目录下存在[a.txt]这个文件open a.txt打开文件成功显示出文件中的内容open命令功能正常 实际测试结果如下图所示 3.5.12 close命令测试 测试数据如下表 前提条件命令输入执行结果结果分析当前存在已打开的文件close关闭成功close命令功能正常当前不存在已打开的文件close关闭文件失败当前没有文件被打开close命令功能正常 实际测试结果如下图所示 3.5.13 write命令测试 测试数据如下表 前提条件命令输入执行结果结果分析当前不存在已打开的文件write然后输入文件内容以“###”结尾写入文件失败请先打开文件再进行写入write命令功能正常当前存在已打开的文件write然后输入文件内容以“###”结尾写入成功控制台会回显文件的所有内容包括刚刚写入的内容write命令功能正常 实际测试结果如下图所示 3.5.14 read命令测试 测试数据如下表 前提条件命令输入执行结果结果分析当前存在已打开的文件read显示空字符缺少[要读取的记录个数]参数系统会判定要读取的记录个数为0当前存在已打开的文件且当前读指针 5 文件长度read 5显示读取出来的5个字符read命令功能正常当前存在已打开的文件且当前读指针 - 4 0read -4显示读取出来的4个字符read命令支持向后读取 实际测试结果如下图所示 3.5.15 delete命令测试 测试数据如下表 前提条件命令输入执行结果结果分析无delete删除文件失败文件名不能为空缺少[文件名]参数系统会判定文件名为空字符当前目录下不存在[b.jpg]这个文件delete b.jpg删除文件失败找不到对应文件delete命令功能正常当前目录下存在[a.txt]这个文件delete a.txt删除成功使用[dir]命令查看a.txt文件不存在delete命令功能正常 实际测试结果如下图所示 3.5.16 rename命令测试 测试数据如下表 前提条件命令输入执行结果结果分析无rename重命名文件失败文件名不能为空缺少[文件名]参数系统会判定文件名为空字符无rename b.jpg重命名文件失败文件名不能为空缺少[新文件名]参数系统会判定新文件名为空字符当前目录下不存在[b.jpg]这个文件rename b.jpg c.mp3重命名文件失败文件不存在rename命令功能正常当前目录下存在[a.txt]这个文件rename a.txt c.mp3重命名成功使用[dir]命令可查看a.txt已变为c.mp3rename功能正常 实际测试结果如下图所示 3.6使用说明 3.6.1操作命令说明 本文件系统支持的所有操作命令已在“帮助列表”中列出。想要查看“帮助列表”时只要键入 help 命令即可如下所示 现在对本文件系统中的几种操作命令格式做说明 ①无参数命令例如help、show、exit、dir等都是无参数命令。在使用无参数命令时只需要键入对应的命令即可不需要输入额外的参数。如果输入的额外的参数系统会默认把它丢弃掉也并不影响使用。 ②单参数命令例如mkdir、create、open等都是单参数命令。使用单参数命令时输入对应的命令之后要输入一个或者至少一个空格然后输入正确的参数最后回车即可。在上述“帮助列表”中的“用法”中方括号框中表示的是要输入的参数。例如mkdir [目录名]该命令正确的用法是“mkdir test”表示创建一个名为“test”的新目录。 ③多参数命令例如register、login等都是要输入一个以上参数的命令。在使用多参数命令时参数和参数之间要使用一个空格进行分隔开。另外参数的个数要对应。例如在使用login [用户名] [密码],如果输入“login 123”系统会把“123”当成用户名来识别而该命令缺少了密码这个参数系统给出错误提示。 另外对本文件系统采用的文件路径格式做如下说明 ①目录名与目录名或文件名之前用路径分隔符“/”分隔开。例如“cd test/word”表示进入到当前目录下的test文件夹下的word文件夹中。 ②全部采用相对路径 ③“…”表示上一级目录。例如“cd …”表示回退到上一级目录。 3.6.2磁盘数据保存说明 本文件系统在启动的时候会加载“固定路径”下的“磁盘文件”中的磁盘数据在正常退出的时候会保存磁盘数据到“固定路径”下的“磁盘文件”中。 “固定路径”是指程序运行文件所在目录中的save文件夹。“磁盘文件”是指save文件夹中的一个名为disk.ser的文件本文件系统的所有磁盘数据都会保存进里面。如果本文件系统启动的时候找不到disk.ser文件或save文件夹系统会初始化磁盘相当于一个新激活的系统。 本文件系统在正常退出使用exit命令退出的之前会保存当前的磁盘数据到save文件夹中的disk.ser文件中。如果disk.ser文件不存在会新建一个disk.ser文件如果disk.ser文件存在则会进行覆盖写入操作。 3 经验与体会 我的经验和体会是 ①在编程实现多级文件系统之前要先确定好文件的逻辑结构、文件的物理结构、文件控制块信息、树形目录结构的表现形式、磁盘空间的表示显示、文件记录在磁盘中的表现形式、磁盘空间的分配方式、磁盘空间的管理形式等重要问题。只有思考了以上问题以及确定好具体的实现方案之后才能着手与正式的编程实现否则就在编程的同时遇到很多具有极强关联性的问题导致了编程后期可能要对系统进行重构。 ②在设计本文件系统的交互的时候要考虑到用户的使用感受应该使用户能以尽量简单的形式使用本系统操作命令的输入不要过于冗余而繁杂。在这个方面可以参考很多优秀的操作系统的实现方式比如Linux和Windows系统。 4 重要数据结构或疑难部分说明 4.1重要数据结构 大部分重要数据结构已经在之前的设计步骤中的需求分析的抽象数据类型定义小节中进行了说明这里便不再赘述。关于树形结构目录的实现则在实体类Directory中。 4.2疑难部分说明 除了树形目录结构的具体实现比较难之外该实现已在调试分析中进行说明另一个疑难部分就是在存储文件记录时为文件记录分配磁盘空间和修改位示图的具体实现。存储文件记录的具体实现为 public CommonResultFileControlBlock storeRecord(FileControlBlock fileControlBlock, ListCharacter record) {if (CollectionUtil.isEmpty(record)) {return CommonResult.operateSuccess(null);}// 修改位示图为重新分配盘块做准备changeBitmapStatus(fileControlBlock.getStartBlock(), fileControlBlock.getBlockNum(), true);// 计算存储该长度记录所需要的盘块数量Integer requiredNum Math.ceilDivide(record.size(), DiskConstant.BLOCK_SIZE);int count 0;int startBlockId DiskConstant.RECORD_START_BLOCK;for (int i 0; i DiskConstant.BITMAP_ROW_LENGTH; i) {for (int j 0; j DiskConstant.BITMAP_LINE_LENGTH; j) {// 如果该盘块空闲if (DiskConstant.BITMAP_FREE.compareTo(Memory.getInstance().getBitmap()[i][j]) 0) {if (count 0) {// 记下起始盘块号: 当前行 * 总列数 当前列startBlockId i * DiskConstant.BITMAP_LINE_LENGTH j;}count;if (count requiredNum) {// 如果有足够的连续盘区供存储则进行存储并改变位示图的相应状态storeToDisk(startBlockId, record);changeBitmapStatus(startBlockId, requiredNum, false);return CommonResult.operateSuccess(fileControlBlock.setStartBlock(startBlockId).setBlockNum(requiredNum));}} else {// 因为是连续分配如果该盘块不空闲则要重新计数count 0;}}}return CommonResult.operateFailWithMessage([分配盘块失败]: 磁盘空间不足); }在该方法中调用了两个关键的方法storeToDisk(startBlockId, record)和changeBitmapStatus(startBlockId, requiredNum, false)。 其中的storeToDisk(startBlockId, record)方法的作用是将文件记录存储在磁盘中。传入参数startBlockId表示起始盘块号传入参数record表示待存储的文件记录。其具体实现为 private void storeToDisk(Integer startBlockId, ListCharacter record) {int index 0;int blockId startBlockId;Disk disk DataCache.getInstance().getDisk();// 可以直接覆盖掉原来的磁盘中的记录for (Character ch : record) {if (index DiskConstant.BLOCK_SIZE) {// 如果一个盘块的空间被用完了则使用下一个盘块来进行存储blockId;index 0;}disk.getDisk().get(blockId).add(index, ch);index;}while (index DiskConstant.BLOCK_SIZE disk.getDisk().get(blockId).size() index) {// 擦除最后一个盘块中没有用到的空间disk.getDisk().get(blockId).set(index, null);index;} }其中的changeBitmapStatus(startBlockId, requiredNum, false)方法的作用是更改相应的位示图的状态仅适用于连续分配的方式。传入参数startBlockId表示起始盘块号传入参数blockNum表示要更改的盘块数量传入参数changeToFree表示要更改的状态true-表示空闲状态false-表示已分配状态。其具体实现为 private void changeBitmapStatus(Integer startBlockId, Integer blockNum, boolean changeToFree) {if (Objects.isNull(startBlockId) || startBlockId DiskConstant.RECORD_START_BLOCK ||startBlockId DiskConstant.BLOCK_NUM || blockNum 0) {return;}// 解析该盘块在位示图中的第几行int row startBlockId / DiskConstant.BITMAP_LINE_LENGTH;// 解析该盘块在位示图中的第几列int line startBlockId % DiskConstant.BITMAP_LINE_LENGTH;for (int i 0; i blockNum; i) {Memory.getInstance().getBitmap()[row][line] changeToFree ? DiskConstant.BITMAP_FREE : DiskConstant.BITMAP_BUSY;if (line DiskConstant.BITMAP_LINE_LENGTH - 1) {line 0;row;} else {line;}} }
http://www.hkea.cn/news/14316750/

相关文章:

  • 软件毕设代做网站青海中小企业网站建设
  • 做素材类的网站赚钱吗做购物网站 需要手续
  • 学计算机网站开发好吗多用户商城网站开发
  • 网站运营优化推广html入门到精通
  • 北京 网站 优化网络平台建设怎么做
  • 仿制网站软件哈尔滨免费自助建站模板
  • 做非洲外贸的网站wordpress主主页只显示标题
  • 网站建设后压缩代码怎样查网站谁做的
  • 国内哪个网站用wordpress北京中国建设部网站首页
  • 湖南建设厅网站二建注销喀什市建设局网站查证件
  • 加强和改进校园网站内容建设大学生网页设计作业成品下载
  • 什么查网站是否降权网店美工分为几个级别
  • 做网站根据内容生成pdf语文建设 官方网站
  • 河北网站seowordpress首页404伪静态
  • 做网站用什么样的电脑网站名字怎样做版权
  • 百度这个网站怎么做自己怎么做视频网站
  • 贸易公司网站建设要多少钱wordpress 首页错误
  • 济南富新网站建设用织梦做视频网站
  • 深圳网站建设推广公司网页制作需要下载什么软件
  • 哪些网站做任务好赚钱的金华网站建设哪里好
  • 集团门户网站建设费用科目小程序商城推广
  • 电子商务html网站模板做视频网站公司要怎么做
  • html5网站开发教学手机商城网站方案
  • 手机开发网站工具网站首页大小
  • 婚恋网站要钱吗外贸网络营销该如何做
  • 南通影楼网站建设做外贸网站注意什么
  • 淮北网站三合一建设西安中高风险地区查询
  • 图书馆网站建设的作用wordpress栏目置顶
  • 网站诊断方法制作app用什么软件好
  • 佛山最好的网站建设公司图书馆管理系统