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

asp网站变慢大连做网站孙晓龙

asp网站变慢,大连做网站孙晓龙,网络服务提供者的侵权责任,做淘客网站备案文章目录 前言一、Unity对Json数据的操作方法一、JsonUtility方法二、Newtonsoft 二、持久化的数据路径三、数据加密/解密加密方法解密方法 四、条件编译指令限制仅在编辑器模式下进行加密/解密四、数据持久化管理器1、存档工具类2、一个存档数据3、存档系统数据类4、数据存档存… 文章目录 前言一、Unity对Json数据的操作方法一、JsonUtility方法二、Newtonsoft 二、持久化的数据路径三、数据加密/解密加密方法解密方法 四、条件编译指令限制仅在编辑器模式下进行加密/解密四、数据持久化管理器1、存档工具类2、一个存档数据3、存档系统数据类4、数据存档存储持久化管理器5、测试调用 完结 前言 游戏存档不言而喻是游戏设计中的重要元素可以提高游戏的可玩性为玩家提供更多的自由和控制权。 我们主要是实现对存档的创建获取保存加载删除缓存加密支持多存档。存档有两类一类是用户型存档存储着某个游戏用户具体的信息如血量武器游戏进度一类是设置型存档与任何用户存档都无关是通用的存储信息比如屏幕分辨率、音量设置等。 存档文件支持很多数据类似这里我选择Json可读性较强易修改。 一、Unity对Json数据的操作 方法一、JsonUtility 它是Unty引擎中提供的一个用于序列化和反序列化JSON数据的工具类该类提供了三个方法。 第一个函数ToJson可以将可序列化的对象转换为JSON字符串 第二个可选参数表示是否花费更多的性能将字符转换为更适合阅读的方式 //通过JS0N表示形式创建对象 string json JsonUtility.ToJson(object obj, bool prettyPrint);第二个函数FromJson可以将字符转换为对象 Playerlnfo是一个泛型参数用于指定要将JSoN字符串转换为的对象类型 //生成对象的公共字段的JS0N表示形式 PlayerInfo playerInfo JsonUtility.FromJsonPlayerInfo(string json);第三个函数则可以传入新的数据覆盖到已有对象中而不是创建新的对象在频繁读取数据时可以节省开销 //通过读取对象的JS0N表示形式覆盖其数据 JsonUtility.FromJsonOverwrite(string json, object objectTooverwrite);方法二、Newtonsoft 前面使用JsonUtility进行json转化遇到字典等无法序列化的数据是存不进去的这里推荐使用Newtonsoft类库进行转化可以很好解决这个问题。 安装插件支持 转换用户数据为JSON字符串 string jsonData JsonConvert.SerializeObject(playerInfo);将JSON字符串转换为unity对象数据 PlayerInfo playerInfo JsonConvert.DeserializeObjectPlayerInfo(jsonData);二、持久化的数据路径 Application.persistentDataPath是一个持久化的数据路径在不同的操作系统上unity会为我们分配不同的持久化数据路径这样可以确保应用程序在不同平台上都能正确保存和访问 //设置存档文件路径 savePath Path.Combine(Application.persistentDataPath, saveData.json);不同平台存储的路径不一样我们可以打印savePath查看自己的存储路径 比如我的就是 三、数据加密/解密 这里实现一个简单的加密和解密方法使用了字符的异或XOR操作。 // 定义密钥字符 public static char[] keyChars { a, b, c, d, e };// 加密方法 public static string Encrypt(string data) {char[] dataChars data.ToCharArray();for (int i 0; i dataChars.Length; i){char dataChar dataChars[i];char keyChar keyChars[i % keyChars.Length];// 重点 通过亦或得到新的字符char newChar (char)(dataChar ^ keyChar);dataChars[i] newChar;}return new string(dataChars); }// 解密方法 public static string Decrypt(string data) {return Encrypt(data); }加密方法 Encrypt 方法接收一个字符串 data 作为输入。将输入字符串转换为字符数组 dataChars。使用一个 for 循环遍历每个字符 dataChar 是当前字符。keyChar 是从密钥字符数组中获取的字符使用 i % keyChars.Length 确保循环使用密钥字符即如果数据长度超过密钥长度会重复使用密钥。newChar 是通过 dataChar 和 keyChar 的异或操作得到的新字符。异或操作的特点是相同的字符异或结果为0而不同的字符异或结果为1因此可以用这个特性进行简单的加密。 最后将加密后的字符数组重新转换为字符串并返回。 解密方法 Decrypt 方法实际上调用了 Encrypt 方法。由于异或操作的特性调用两次相同的异或操作可以恢复原始数据。因此加密和解密过程是相同的。 四、条件编译指令限制仅在编辑器模式下进行加密/解密 为了保证数据的可读性我们可能不希望在编辑器模式下数据还被加密了这样会影响我们测试 我们可以使用#if UNITY_EDITOR 条件编译指令用于在 Unity 中编写代码时进行特定的编译和执行控制。这段代码只会在 Unity 编辑器中编译和执行而不会在构建后的游戏中包含。这意味着你可以在编辑器环境中添加一些特定的功能比如自定义工具、调试信息等而这些功能在最终发布的版本中不会出现。 示例用法 #if !UNITY_EDITOR// 放置加密/解密操作这段代码不会在 Unity 编辑器中编译和执行#endif四、数据持久化管理器 1、存档工具类 /// summary /// 存档工具类 /// /summary public static class IOTool {// 定义密钥字符public static char[] keyChars { x, y, f, r, a, m, e };/// summary/// 保存Json数据/// /summary/// param namesaveObject保存的对象/param/// param namepath路径/parampublic static void SaveJson(object saveObject, string path){// string jsonData JsonUtility.ToJson(saveObject);string jsonData JsonConvert.SerializeObject(saveObject); #if !UNITY_EDITORjsonData Encrypt(jsonData);//加密 #endifFile.WriteAllText(path, jsonData);}/// summary/// 读取Json为指定的类型对象/// /summarypublic static T LoadJsonT(string path) where T : class{if (!File.Exists(path)){return null;}string jsonData File.ReadAllText(path); #if !UNITY_EDITORjsonData Decrypt(jsonData);//解密 #endif// return JsonUtility.FromJsonT(jsonData);return JsonConvert.DeserializeObjectT(jsonData);}/// summary/// 加密方法/// /summarypublic static string Encrypt(string data){char[] dataChars data.ToCharArray();for (int i 0; i dataChars.Length; i){char dataChar dataChars[i];char keyChar keyChars[i % keyChars.Length];// 重点 通过亦或得到新的字符char newChar (char)(dataChar ^ keyChar);dataChars[i] newChar;}return new string(dataChars);}/// summary/// 解密方法/// /summarypublic static string Decrypt(string data){return Encrypt(data);} }2、一个存档数据 /// summary /// 一个存档数据 /// /summary [Serializable] public class SaveItem {// 存档IDpublic int saveID;// 私有字段最后保存时间private DateTime lastSaveTime;// 公共属性获取最后保存时间public DateTime LastSaveTime{get{// 如果 lastSaveTime 是默认值则尝试将字符串解析为 DateTimeif (lastSaveTime default(DateTime)){DateTime.TryParse(lastSaveTimeString, out lastSaveTime);}return lastSaveTime; // 返回最后保存时间}}// 用于持久化的字符串Json不支持 DateTime 类型[SerializeField] private string lastSaveTimeString;// 构造函数初始化存档ID和最后保存时间public SaveItem(int saveID, DateTime lastSaveTime){this.saveID saveID; // 设置存档IDthis.lastSaveTime lastSaveTime; // 设置最后保存时间lastSaveTimeString lastSaveTime.ToString(); // 将 DateTime 转换为字符串}// 更新最后保存时间public void UpdateTime(DateTime lastSaveTime){this.lastSaveTime lastSaveTime; // 更新最后保存时间lastSaveTimeString lastSaveTime.ToString(); // 将新的 DateTime 转换为字符串} }3、存档系统数据类 /// summary /// 存档系统数据类 /// /summary [Serializable] public class SaveSystemData {// 当前的存档IDpublic int currID 0;// 所有存档的列表public ListSaveItem saveItemList new ListSaveItem(); }4、数据存档存储持久化管理器 /// summary /// 数据存档存储持久化管理器 /// /summary public class SaveManager : SingletonSaveManager {private SaveSystemData saveSystemData;//存档系统数据// 存档的保存private const string saveDirName saveData;// 设置的保存1.全局数据的保存分辨率、按键设置 2.存档的设置保存。// 常规情况下存档系统自行维护private const string settingDirName setting;// 存档文件夹路径private string saveDirPath Application.persistentDataPath / saveDirName;private string settingDirPath Application.persistentDataPath / settingDirName;// 存档中对象的缓存字典 // 存档ID,文件名称实际的对象private Dictionaryint, Dictionarystring, object cacheDic new Dictionaryint, Dictionarystring, object();#region 初始化public SaveManager(){Debug.Log(存储管理器初始化成功);Init();}public void Init(){//检查路径并创建目录CheckAndCreateDir();// 初始化SaveSystemDataInitSaveSystemData();// 清除存档缓存CleanCache();}#endregion#region 保存、获取全局设置存档/// summary/// 加载设置全局生效不关乎任何一个存档/// /summarypublic T LoadSettingT(string fileName) where T : class{return LoadFileT(settingDirPath / fileName);}/// summary/// 加载设置全局生效不关乎任何一个存档/// /summarypublic T LoadSettingT() where T : class{return LoadSettingT(typeof(T).Name);}/// summary/// 保存设置全局生效不关乎任何一个存档/// /summarypublic void SaveSetting(object saveObject, string fileName){SaveFile(saveObject, settingDirPath / fileName);}/// summary/// 保存设置全局生效不关乎任何一个存档/// /summarypublic void SaveSetting(object saveObject){SaveSetting(saveObject, saveObject.GetType().Name);}/// summary/// 删除所有设置存档/// /summarypublic void DeleteAllSetting(){if (Directory.Exists(settingDirPath)){// 直接删除目录Directory.Delete(settingDirPath, true);}CheckAndCreateDir();}#endregion#region 创建、获取、删除某一项用户存档/// summary/// 获取SaveItem/// /summarypublic SaveItem GetSaveItem(int id){for (int i 0; i saveSystemData.saveItemList.Count; i){if (saveSystemData.saveItemList[i].saveID id){return saveSystemData.saveItemList[i];}}return null;}/// summary/// 获取SaveItem/// /summarypublic SaveItem GetSaveItem(SaveItem saveItem){GetSaveItem(saveItem.saveID);return null;}/// summary/// 添加一个存档/// /summary/// returns/returnspublic SaveItem CreateSaveItem(){SaveItem saveItem new SaveItem(saveSystemData.currID, DateTime.Now);saveSystemData.saveItemList.Add(saveItem);saveSystemData.currID 1;// 更新SaveSystemData 写入磁盘UpdateSaveSystemData();return saveItem;}/// summary/// 删除存档/// /summary/// param namesaveID存档的ID/parampublic void DeleteSaveItem(int saveID){string itemDir GetSavePath(saveID, false);// 如果路径存在 且 有效if (itemDir ! null){// 把这个存档下的文件递归删除Directory.Delete(itemDir, true);}saveSystemData.saveItemList.Remove(GetSaveItem(saveID));// 移除缓存RemoveCache(saveID);// 更新SaveSystemData 写入磁盘UpdateSaveSystemData();}/// summary/// 删除存档/// /summarypublic void DeleteSaveItem(SaveItem saveItem){DeleteSaveItem(saveItem.saveID);}#endregion#region 保存、获取、删除用户存档中某一对象/// summary/// 保存对象至某个存档中/// /summary/// param namesaveObject要保存的对象/param/// param namesaveFileName保存的文件名称/param/// param namesaveID存档的ID/parampublic void SaveObject(object saveObject, string saveFileName, int saveID 0){// 存档所在的文件夹路径string dirPath GetSavePath(saveID, true);// 具体的对象要保存的路径string savePath dirPath / saveFileName;// 具体的保存SaveFile(saveObject, savePath);// 更新存档时间GetSaveItem(saveID).UpdateTime(DateTime.Now);// 更新SaveSystemData 写入磁盘UpdateSaveSystemData();// 更新缓存SetCache(saveID, saveFileName, saveObject);}/// summary/// 保存对象至某个存档中/// /summary/// param namesaveObject要保存的对象/param/// param namesaveFileName保存的文件名称/parampublic void SaveObject(object saveObject, string saveFileName, SaveItem saveItem){SaveObject(saveObject, saveFileName, saveItem.saveID);}/// summary/// 保存对象至某个存档中/// /summary/// param namesaveObject要保存的对象/param/// param namesaveID存档的ID/parampublic void SaveObject(object saveObject, int saveID 0){SaveObject(saveObject, saveObject.GetType().Name, saveID);}/// summary/// 保存对象至某个存档中/// /summary/// param namesaveObject要保存的对象/param/// param namesaveID存档的ID/parampublic void SaveObject(object saveObject, SaveItem saveItem){SaveObject(saveObject, saveObject.GetType().Name, saveItem);}/// summary/// 从某个具体的存档中加载某个对象/// /summary/// typeparam nameT要返回的实际类型/typeparam/// param namesaveFileName文件名称/param/// param nameid存档ID/parampublic T LoadObjectT(string saveFileName, int saveID 0) where T : class{T obj GetCacheT(saveID, saveFileName);if (obj null){// 存档所在的文件夹路径string dirPath GetSavePath(saveID);if (dirPath null) return null;// 具体的对象要保存的路径string savePath dirPath / saveFileName;obj LoadFileT(savePath);SetCache(saveID, saveFileName, obj);}return obj;}/// summary/// 从某个具体的存档中加载某个对象/// /summary/// typeparam nameT要返回的实际类型/typeparam/// param namesaveFileName文件名称/parampublic T LoadObjectT(string saveFileName, SaveItem saveItem) where T : class{return LoadObjectT(saveFileName, saveItem.saveID);}/// summary/// 从某个具体的存档中加载某个对象/// /summary/// typeparam nameT要返回的实际类型/typeparam/// param nameid存档ID/parampublic T LoadObjectT(int saveID 0) where T : class{return LoadObjectT(typeof(T).Name, saveID);}/// summary/// 从某个具体的存档中加载某个对象/// /summary/// typeparam nameT要返回的实际类型/typeparam/// param namesaveItem存档项/parampublic T LoadObjectT(SaveItem saveItem) where T : class{return LoadObjectT(typeof(T).Name, saveItem.saveID);}/// summary/// 删除某个存档中的某个对象/// /summary/// param namesaveID存档的ID/parampublic void DeleteObjectT(string saveFileName, int saveID) where T : class{//清空缓存中对象if (GetCacheT(saveID, saveFileName) ! null){RemoveCache(saveID, saveFileName);}// 存档对象所在的文件路径string dirPath GetSavePath(saveID);string savePath dirPath / saveFileName;//删除对应的文件File.Delete(savePath);}/// summary/// 删除某个存档中的某个对象/// /summary/// param namesaveID存档的ID/parampublic void DeleteObjectT(string saveFileName, SaveItem saveItem) where T : class{DeleteObjectT(saveFileName, saveItem.saveID);}/// summary/// 删除某个存档中的某个对象/// /summary/// param namesaveID存档的ID/parampublic void DeleteObjectT(int saveID) where T : class{DeleteObjectT(typeof(T).Name, saveID);}/// summary/// 删除某个存档中的某个对象/// /summary/// param namesaveID存档的ID/parampublic void DeleteObjectT(SaveItem saveItem) where T : class{DeleteObjectT(typeof(T).Name, saveItem.saveID);}#endregion#region 获取、删除所有用户存档/// summary/// 获取所有存档/// 最新的在最后面/// /summary/// returns/returnspublic ListSaveItem GetAllSaveItem(){return saveSystemData.saveItemList;}/// summary/// 获取所有存档/// 创建最新的在最前面/// /summary/// returns/returnspublic ListSaveItem GetAllSaveItemByCreatTime(){ListSaveItem saveItems new ListSaveItem(saveSystemData.saveItemList.Count);for (int i 0; i saveSystemData.saveItemList.Count; i){saveItems.Add(saveSystemData.saveItemList[saveSystemData.saveItemList.Count - (i 1)]);}return saveItems;}/// summary/// 获取所有存档/// 最新更新的在最上面/// /summary/// returns/returnspublic ListSaveItem GetAllSaveItemByUpdateTime(){ListSaveItem saveItems new ListSaveItem(saveSystemData.saveItemList.Count);for (int i 0; i saveSystemData.saveItemList.Count; i){saveItems.Add(saveSystemData.saveItemList[i]);}OrderByUpdateTimeComparer orderBy new OrderByUpdateTimeComparer();saveItems.Sort(orderBy);return saveItems;}private class OrderByUpdateTimeComparer : IComparerSaveItem{public int Compare(SaveItem x, SaveItem y){if (x.LastSaveTime y.LastSaveTime){return -1;}else{return 1;}}}/// summary/// 获取所有存档/// 万能解决方案/// /summarypublic ListSaveItem GetAllSaveItemT(FuncSaveItem, T orderFunc, bool isDescending false){if (isDescending){return saveSystemData.saveItemList.OrderByDescending(orderFunc).ToList();}else{return saveSystemData.saveItemList.OrderBy(orderFunc).ToList();}}/// summary/// 删除所有用户存档信息/// /summarypublic void DeleteAllSaveItem(){if (Directory.Exists(saveDirPath)){ // 直接删除目录Directory.Delete(saveDirPath, true);}CheckAndCreateDir();InitSaveSystemData();}/// summary/// 删除所有存档信息/// /summarypublic void DeleteAll(){CleanCache();DeleteAllSaveItem();DeleteAllSetting();}#endregion#region 更新、获取、删除用户存档缓存/// summary/// 设置缓存/// /summary/// param namesaveID存档ID/param/// param namefileName文件名称/param/// param namesaveObject要缓存的对象/paramprivate void SetCache(int saveID, string fileName, object saveObject){// 缓存字典中是否有这个SaveIDif (cacheDic.ContainsKey(saveID)){// 这个存档中有没有这个文件if (cacheDic[saveID].ContainsKey(fileName)){cacheDic[saveID][fileName] saveObject;}else{cacheDic[saveID].Add(fileName, saveObject);}}else{cacheDic.Add(saveID, new Dictionarystring, object() { { fileName, saveObject } });}}/// summary/// 获取缓存/// /summary/// param namesaveID存档ID/param/// param namesaveObject要缓存的对象/paramprivate T GetCacheT(int saveID, string fileName) where T : class{// 缓存字典中是否有这个SaveIDif (cacheDic.ContainsKey(saveID)){// 这个存档中有没有这个文件if (cacheDic[saveID].ContainsKey(fileName)){return cacheDic[saveID][fileName] as T;}else{return null;}}else{return null;}}/// summary/// 移除缓存/// /summaryprivate void RemoveCache(int saveID){cacheDic.Remove(saveID);}/// summary/// 移除缓存中的某一个对象/// /summaryprivate void RemoveCache(int saveID, string fileName){cacheDic[saveID].Remove(fileName);}/// summary/// 清除存档缓存/// /summarypublic void CleanCache(){cacheDic.Clear();}#endregion#region 内部工具函数/// summary/// 获取存档系统数据/// /summary/// returns/returnsprivate void InitSaveSystemData(){saveSystemData LoadFileSaveSystemData(saveDirPath /SaveSystemData);if (saveSystemData null){saveSystemData new SaveSystemData();UpdateSaveSystemData();}}/// summary/// 更新存档系统数据/// /summaryprivate void UpdateSaveSystemData(){SaveFile(saveSystemData, saveDirPath /SaveSystemData);}/// summary/// 检查路径并创建目录/// /summaryprivate void CheckAndCreateDir(){// 确保路径的存在if (Directory.Exists(saveDirPath) false){Directory.CreateDirectory(saveDirPath);}if (Directory.Exists(settingDirPath) false){Directory.CreateDirectory(settingDirPath);}}/// summary/// 获取某个存档的路径/// /summary/// param namesaveID存档ID/param/// param namecreateDir如果不存在这个路径是否需要创建/param/// returns/returnsprivate string GetSavePath(int saveID, bool createDir true){// 验证是否有某个存档if (GetSaveItem(saveID) null) Debug.LogWarning(saveID 存档不存在);string saveDir saveDirPath / saveID;// 确定文件夹是否存在if (Directory.Exists(saveDir) false){if (createDir){Directory.CreateDirectory(saveDir);}else{return null;}}return saveDir;}/// summary/// 保存文件/// /summary/// param namesaveObject保存的对象/param/// param namepath保存的路径/paramprivate void SaveFile(object saveObject, string path){IOTool.SaveJson(saveObject, path);}/// summary/// 加载文件/// /summary/// typeparam nameT加载后要转为的类型/typeparam/// param namepath加载路径/paramprivate T LoadFileT(string path) where T : class{return IOTool.LoadJsonT(path);}#endregion }5、测试调用 // GameSetting类中存储着游戏名称作为全局数据 [Serializable] public class GameSetting {public string gameName; }[Serializable] public class GameSetting2 {public string gameName; }public class SaveTest : MonoBehaviour {GameSetting gameSetting;GameSetting2 gameSetting2;SaveItem saveItem;Dictionarystring, string info new Dictionarystring,string();private void Awake() {//添加测试数据gameSetting new GameSetting();gameSetting.gameName 测试;gameSetting2 new GameSetting2();gameSetting2.gameName 测试2; }private void OnGUI(){GUIStyle buttonStyle new GUIStyle(GUI.skin.button); buttonStyle.fontSize 25; // 设置字体大小int width 400;int height 150;//设置型存档 if (GUI.Button(new Rect(0, 0, width, height), 保存设置数据1, buttonStyle)){SaveManager.Instance.SaveSetting(gameSetting);}if (GUI.Button(new Rect(0, height, width, height), 追加设置数据2, buttonStyle)){SaveManager.Instance.SaveSetting(gameSetting2);}if (GUI.Button(new Rect(0, height*2, width, height), 加载设置数据1, buttonStyle)){string gameName SaveManager.Instance.LoadSettingGameSetting().gameName;Debug.Log(gameName: gameName);}if (GUI.Button(new Rect(0, height*3, width, height), 删除设置存档, buttonStyle)){SaveManager.Instance.DeleteAllSetting();}//用户存档if (GUI.Button(new Rect(width, 0, width, height), 添加一个存档, buttonStyle)){saveItem SaveManager.Instance.CreateSaveItem();}if (GUI.Button(new Rect(width, height, width, height), 保存用户存档数据1, buttonStyle)){info[name] 小明;info[age] 15;info[heright] 180;SaveManager.Instance.SaveObject(info, saveItem);}if (GUI.Button(new Rect(width, height*2, width, height), 追加数据2, buttonStyle)){SaveManager.Instance.SaveObject(gameSetting, saveItem);}if (GUI.Button(new Rect(width, height*3, width, height), 打印用户存档数据1, buttonStyle)){Dictionarystring, string info SaveManager.Instance.LoadObjectDictionarystring, string(saveItem);Debug.Log(姓名 info[name] 年龄 info[age] 身高 info[heright]);}if (GUI.Button(new Rect(width, height*4, width, height), 获取所有用户存档, buttonStyle)){SaveManager.Instance.GetAllSaveItem();//最新的在最后面SaveManager.Instance.GetAllSaveItemByCreatTime();//最近创建的在最前面SaveManager.Instance.GetAllSaveItem();//最近更新的在最前面}//删除用户存档if (GUI.Button(new Rect(width*2, 0, width, height), 删除用户存档数据1, buttonStyle)){SaveManager.Instance.DeleteObjectDictionarystring, string(saveItem);}if (GUI.Button(new Rect(width*2, height, width, height), 删除所有用户存档, buttonStyle)){SaveManager.Instance.DeleteAllSaveItem();}if (GUI.Button(new Rect(width*2, height*2, width, height), 删除某一个用户存档, buttonStyle)){SaveManager.Instance.DeleteSaveItem(saveItem);}//删除所有存档 用户设置if (GUI.Button(new Rect(width*3, 0, width, height), 删除所有存档, buttonStyle)){SaveManager.Instance.DeleteAll();}} }运行效果 SaveData和setting分别存储用户存档和设置型存档。 用户存档下根据saveID分成若干文件夹用于存储具体的对象。 完结 赠人玫瑰手有余香如果文章内容对你有所帮助请不要吝啬你的点赞评论和关注你的每一次支持都是我不断创作的最大动力。当然如果你发现了文章中存在错误或者有更好的解决方法也欢迎评论私信告诉我哦 好了我是向宇https://xiangyu.blog.csdn.net 一位在小公司默默奋斗的开发者闲暇之余边学习边记录分享站在巨人的肩膀上通过学习前辈们的经验总是会给我很多帮助和启发如果你遇到任何问题也欢迎你评论私信或者加群找我 虽然有些问题我也不一定会但是我会查阅各方资料争取给出最好的建议希望可以帮助更多想学编程的人共勉~
文章转载自:
http://www.morning.zbtfz.cn.gov.cn.zbtfz.cn
http://www.morning.srndk.cn.gov.cn.srndk.cn
http://www.morning.smfbw.cn.gov.cn.smfbw.cn
http://www.morning.piekr.com.gov.cn.piekr.com
http://www.morning.kmlmf.cn.gov.cn.kmlmf.cn
http://www.morning.ghxzd.cn.gov.cn.ghxzd.cn
http://www.morning.gpxbc.cn.gov.cn.gpxbc.cn
http://www.morning.rnnts.cn.gov.cn.rnnts.cn
http://www.morning.ypfw.cn.gov.cn.ypfw.cn
http://www.morning.czlzn.cn.gov.cn.czlzn.cn
http://www.morning.sjjtz.cn.gov.cn.sjjtz.cn
http://www.morning.kcypc.cn.gov.cn.kcypc.cn
http://www.morning.kaweilu.com.gov.cn.kaweilu.com
http://www.morning.tgtwy.cn.gov.cn.tgtwy.cn
http://www.morning.xkqjw.cn.gov.cn.xkqjw.cn
http://www.morning.qfdyt.cn.gov.cn.qfdyt.cn
http://www.morning.dfojgo.cn.gov.cn.dfojgo.cn
http://www.morning.ggmls.cn.gov.cn.ggmls.cn
http://www.morning.kpbgvaf.cn.gov.cn.kpbgvaf.cn
http://www.morning.trhrk.cn.gov.cn.trhrk.cn
http://www.morning.jydhl.cn.gov.cn.jydhl.cn
http://www.morning.rxlk.cn.gov.cn.rxlk.cn
http://www.morning.kpcky.cn.gov.cn.kpcky.cn
http://www.morning.sjmxh.cn.gov.cn.sjmxh.cn
http://www.morning.jtszm.cn.gov.cn.jtszm.cn
http://www.morning.hcwjls.com.gov.cn.hcwjls.com
http://www.morning.mhdwp.cn.gov.cn.mhdwp.cn
http://www.morning.rdfq.cn.gov.cn.rdfq.cn
http://www.morning.brwei.com.gov.cn.brwei.com
http://www.morning.tzzfy.cn.gov.cn.tzzfy.cn
http://www.morning.nydtt.cn.gov.cn.nydtt.cn
http://www.morning.kzbpx.cn.gov.cn.kzbpx.cn
http://www.morning.sffwz.cn.gov.cn.sffwz.cn
http://www.morning.qcslh.cn.gov.cn.qcslh.cn
http://www.morning.jkmjm.cn.gov.cn.jkmjm.cn
http://www.morning.dplmq.cn.gov.cn.dplmq.cn
http://www.morning.zkdbx.cn.gov.cn.zkdbx.cn
http://www.morning.ztcxx.com.gov.cn.ztcxx.com
http://www.morning.kwpnx.cn.gov.cn.kwpnx.cn
http://www.morning.cbtn.cn.gov.cn.cbtn.cn
http://www.morning.frllr.cn.gov.cn.frllr.cn
http://www.morning.shangwenchao4.cn.gov.cn.shangwenchao4.cn
http://www.morning.whothehellami.com.gov.cn.whothehellami.com
http://www.morning.gtwtk.cn.gov.cn.gtwtk.cn
http://www.morning.zwmjq.cn.gov.cn.zwmjq.cn
http://www.morning.ljygq.cn.gov.cn.ljygq.cn
http://www.morning.wnhgb.cn.gov.cn.wnhgb.cn
http://www.morning.rythy.cn.gov.cn.rythy.cn
http://www.morning.pxlsh.cn.gov.cn.pxlsh.cn
http://www.morning.bccls.cn.gov.cn.bccls.cn
http://www.morning.xnzmc.cn.gov.cn.xnzmc.cn
http://www.morning.ghslr.cn.gov.cn.ghslr.cn
http://www.morning.fbylq.cn.gov.cn.fbylq.cn
http://www.morning.qxkcx.cn.gov.cn.qxkcx.cn
http://www.morning.zlgbx.cn.gov.cn.zlgbx.cn
http://www.morning.wkgyz.cn.gov.cn.wkgyz.cn
http://www.morning.mzjbz.cn.gov.cn.mzjbz.cn
http://www.morning.ncqzb.cn.gov.cn.ncqzb.cn
http://www.morning.lfjmp.cn.gov.cn.lfjmp.cn
http://www.morning.rdnkx.cn.gov.cn.rdnkx.cn
http://www.morning.krjrb.cn.gov.cn.krjrb.cn
http://www.morning.bydpr.cn.gov.cn.bydpr.cn
http://www.morning.nzwp.cn.gov.cn.nzwp.cn
http://www.morning.skwwj.cn.gov.cn.skwwj.cn
http://www.morning.jnhhc.cn.gov.cn.jnhhc.cn
http://www.morning.pumali.com.gov.cn.pumali.com
http://www.morning.dglszn.com.gov.cn.dglszn.com
http://www.morning.mlpch.cn.gov.cn.mlpch.cn
http://www.morning.rmkyb.cn.gov.cn.rmkyb.cn
http://www.morning.mszwg.cn.gov.cn.mszwg.cn
http://www.morning.lysrt.cn.gov.cn.lysrt.cn
http://www.morning.fpbj.cn.gov.cn.fpbj.cn
http://www.morning.cmhkt.cn.gov.cn.cmhkt.cn
http://www.morning.zylrk.cn.gov.cn.zylrk.cn
http://www.morning.ztmkg.cn.gov.cn.ztmkg.cn
http://www.morning.pqktp.cn.gov.cn.pqktp.cn
http://www.morning.zpnfc.cn.gov.cn.zpnfc.cn
http://www.morning.xlclj.cn.gov.cn.xlclj.cn
http://www.morning.rwmft.cn.gov.cn.rwmft.cn
http://www.morning.nppml.cn.gov.cn.nppml.cn
http://www.tj-hxxt.cn/news/240546.html

相关文章:

  • 东莞企业推广网站制作莱芜杂谈
  • 企业网站开发常用的字体搭建自己微信网站
  • 建个企业网站需要多少钱suxing wordpress
  • 凡客的网站功能手机在线查看html源代码
  • 网站开发软件有哪些哈尔滨的网站设计
  • 网站建设售前域名seo查询
  • 大连营商建设局网站软件开发工程师面试自我介绍
  • ftp网站后台深圳数字展厅
  • 山东东方路桥建设总公司官方网站网站视频接口 怎么做
  • 佛山网站专家重庆市建设工程网官网
  • 企业品牌网站建设公司wordpress颜色代码
  • 汕头网站排名搭建一个app平台要多少钱
  • 金华网站开发公司桂林人论坛桂林板路
  • 南通有哪些网站淘客网站必须备案么
  • 做网站公司 蓝纤科技wordpress网页游戏模板
  • 外贸网站vps服务器做网站项目实例
  • 网站的建站标准邯郸网络教研平台
  • 可以访问任何网站的浏览器网站域名注销备案
  • 个人网站备案备注信息做设计素材网站有哪些
  • wordpress 菜单两列显示不出来博山网站seo
  • 网站建设销售工作内容seo怎么收费的
  • 丰台网站关键词优化张家界网站建设公司
  • 通过门户网站做单点登录SAP唐山网站建设公司
  • 接做图网站千牛网站上的店铺推广怎么做
  • 做博客网站要怎么配置的服做一个代驾app需要多少钱
  • 网站做302跳转的意义网站建设维护工作
  • 网站建设的营业执照seo网络推广技术
  • 保之友微网站怎么建网页加速器怎么用
  • wordpress系列怎么做网站维护优化
  • 聊天室网站模板建设一个手机网站首页