├── .DS_Store ├── README.md └── ShangzengBlog ├── .DS_Store ├── arctales ├── .DS_Store ├── GoBackChangchun.md ├── GrafanaLFI.md ├── HfishCodeAudit.md ├── JsonpLearn.md ├── SpringDat.md ├── TheBeginningOfEverything.md ├── WinhexDataRecovery.md ├── about.html └── friends.html ├── conf └── app.conf ├── controllers ├── .DS_Store ├── articleshow.go ├── dnslog.go └── feed.go ├── go.mod ├── go.sum ├── main.go ├── routers └── router.go ├── static ├── .DS_Store ├── css │ ├── .DS_Store │ ├── font-awesome.min.css │ ├── md02.css │ └── style.css ├── fonts │ └── .DS_Store ├── img │ ├── .DS_Store │ ├── 10.png │ ├── 11.png │ ├── 12.png │ ├── 13.png │ ├── 14.png │ ├── 15.png │ ├── 16.png │ ├── 17.png │ ├── 2.png │ ├── 3.png │ ├── 4.png │ ├── 5.png │ ├── 6.png │ ├── 7.png │ ├── 9.png │ ├── GoBackChangchun_1.png │ ├── GoBackChangchun_2.png │ ├── GoBackChangchun_3.jpeg │ ├── GoBackChangchun_4.jpg │ ├── IMG_5018.PNG │ ├── WechatIMG2464.png │ ├── WechatIMG2465.png │ ├── WechatIMG2466.png │ ├── WechatIMG2467.png │ ├── WechatIMG2468.png │ ├── WechatIMG2648.png │ ├── WechatIMG2649.png │ ├── WechatIMG2650.png │ ├── beijing.jpg │ └── image.png └── js │ ├── .DS_Store │ ├── axios.min.js │ └── vue.js ├── test.go ├── view └── views ├── .DS_Store ├── 404.html ├── article.html ├── category.html ├── dnslog.html ├── foot.html ├── head.html ├── index.html └── page.html /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shangzeng/GolangTools/68e02ea6ad9a407f44efeeb3aee4ed77584ddadf/.DS_Store -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # GolangTools 2 | 3 | go语言学习与日常实践使用 4 | 5 | 6 | # 目录结构 7 | 8 | * `ShangzengBlog` : 基于beego编写的markdown格式的blog , 支持 DNSlog , RSS 等功能 9 | 10 | 11 | 12 | 13 | # Data 14 | 15 | 打算定期整理下 16 | 17 | - [x] 20220607 重新整理,删除过期 -------------------------------------------------------------------------------- /ShangzengBlog/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shangzeng/GolangTools/68e02ea6ad9a407f44efeeb3aee4ed77584ddadf/ShangzengBlog/.DS_Store -------------------------------------------------------------------------------- /ShangzengBlog/arctales/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shangzeng/GolangTools/68e02ea6ad9a407f44efeeb3aee4ed77584ddadf/ShangzengBlog/arctales/.DS_Store -------------------------------------------------------------------------------- /ShangzengBlog/arctales/GoBackChangchun.md: -------------------------------------------------------------------------------- 1 | Time: 20220419:other: 在之前,我一直会思考一个问题:那就是从北京回到长春是否会适应 ? 2 | 说实话,确实是有点不适应的,很多之前讨厌的东西到头来发现自...: 2022年返回长春的总结 3 | -------- 4 | 5 | # 时间线 6 | 7 | 在之前,我一直会思考一个问题:从北京回到长春是否会适应 ? 8 | 9 | 说实话,确实是有点不适应的,很多之前讨厌的东西到头来发现自己还是很依赖的:便利的交通,丰富的活动,一些合理化的流程管理balabala......好在这些落差我心里还是有点预期的,毕竟不想背那种几百万的房贷嘛,这些都是过客,一线城市建设的再好,和我有什么关系呢? 10 | 11 | 但是确实也有一些是始料未及的,比如说找工作,在一个经济不发达、人情社会情节比较重的城市找一份网络安全这种技术性较强的工作,属实是不好找:甲方岗位基本全是外包或者第三方合同,说裁员就裁员,可以说毫无保障了 ;乙方也是,工资直接给超级打折--我知道工资肯定会打折,但是没想到会打折这么多,不过这不重要,最重要的是没那么多的工作量,没错,是没啥活--我虽然不愿意卷,但是也不愿意天天无所事事的坐办公室摸鱼啊,终究还是想搞点东西的 。 12 | 13 | 再就是社会不适应吧,虽然我是个东北人,但是真的一点不会这些所谓的“人情往来” ,大概属于领导夹菜我转桌,领导敬酒我不喝的那种人 ,不想学人情世故。 14 | 15 | ![](/static/img/GoBackChangchun_1.png) 16 | 17 | 18 | 接下来就是说好处了. 19 | 20 | 首先就是社交变多了,本来我就是属于“比较宅”的性格,在北京那就更是除了工作基本不会出屋子;而回来后,就可以和朋友们线下面基了。基本每周末都会排满:剧本杀,密室逃脱,各种逛商场,漫展,公园,脱口秀等等等等,总之有了点生活的样子吧。 21 | 22 | 再就是时间明显变得"充裕"起来了: 回老家的路程只要三个小时,基本周末就能回去一趟;之前买了微单也买了课程 ,学习学习摄影 ; 买了性能超高的台式,3060ti搞起来(但是也不玩吃灰)。总之,个人娱乐变丰富了。 23 | 24 | ![](/static/img/GoBackChangchun_2.png) 25 | 26 | 再就是敢真正研究一下“长久”的事情了,也有勇气看看房子,车子,并且觉得自己能买得起了。 27 | 28 | 女朋友就随缘吧,已经是放弃的状态了我 == 29 | 30 | 31 | # 疫情 32 | 33 | 2022年3月份,长春开始了新一轮疫情,被迫开始了居家隔离的生活。 34 | 35 | 之前总会想居家隔离有多么多么爽,但是要是呆着一个多月,那就有点无聊了,更重要的是整个人会颓废起来。整个人就是在颓废->振作->颓废这个循环中不断地重复。 36 | 37 | 好在租的小区很是靠谱,因此在物资方面倒不会匮乏,只不过买到什么就只能随缘了,物价也时高时低,全看供应商与物流靠谱不靠谱。 38 | 39 | 在隔离期间成功学会了做饭(各种炒菜、炖菜等等),虽然样子可能不好看,但是是真的好吃 !! 40 | 41 | ![](/static/img/GoBackChangchun_3.jpeg) 42 | 43 | 44 | # 关于未来 45 | 46 | 总而言之,对于回来这个决定总体来说,目前还是不后悔的(以后那就不知道了),来之后的生活也确实是有些怠惰了,很多东西不想搞,得振作起来。 47 | 48 | 在搭建第一篇博客时候,立下了几个**flag** : 49 | 50 | 1. 第一个是拍摄一组照片,发布出来,照片拍摄了,但是并不满意,打算回炉重造下吧 ; 51 | 2. 第二个是博客完成完成`浏览量` ,`标签搜索` , `DNSlog` ,`相邻文章`, `RSS`等功能 , 这个已经都**圆满完成**了,后续可能会增加一些更有意思的功能 ; 52 | 3. 第三个是要健身,目标瘦20斤 , 算是完成了一半吧 ,目前已经瘦了十斤 。 53 | 54 | 还算是有所完成吧,也有所不足。对于今年说实话也没什么比较突出的期望,还是希望吧日常这些事情做好就行了,多把心思放在生活上面一些,多积累一些东西,学习学习Java,多写几篇文章赚赚零花,考点证书,最好能出去旅游,陪伴父母出去走走等等。 55 | 56 | 多看看书,不要活的太焦虑,条条大路通罗马,但是并不是到了罗马就会幸福。 57 | 58 | ![](/static/img/GoBackChangchun_4.jpg) 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | -------------------------------------------------------------------------------- /ShangzengBlog/arctales/GrafanaLFI.md: -------------------------------------------------------------------------------- 1 | Time: 20211222:golang: 第一次在没有获取到漏洞细节,反推出漏洞存在点,感觉还是很有成就感的...:Grafana 任意文件读取漏洞 CVE-2021-43798 2 | -------- 3 | 4 | 5 | # 背景 6 | 7 | 8 | payload如下: 9 | 10 | ```golang 11 | public/plugins/grafana-clock-panel/../../../../../../etc/passwd 12 | ``` 13 | 14 | ![](/static/img/WechatIMG2464.png) 15 | 16 | 17 | 18 | # 下载/安装 19 | 20 | 进入 **pkg/api/api.go**文件夹,寻找路由,跟进 **getPluginAssets** ,换 **Goland** 方便跟进函数,函数**getPluginAssets** 在 **plugins.go** 中,这里**filepath.Join** 直接获取了插件的名字**plugin.PluginDir**和路径**requestedFile**进行了拼接(但是在之前有判断插件是否存在,因此得是存在的插件),然后直接使用 **os.Open** 打开了插件,这时候导致了问题的存在: 21 | 22 | 23 | * **filepath.Join** 用于拼接URL路径 filepath.Join("a","a"). => "a/a" 24 | * **filepath.Clean** 清理路径中的多余字符 , 也就是这里出现了问题,导致 **../** 进行了拼接 25 | 26 | ![](/static/img/WechatIMG2465.png) 27 | 28 | ## 关于 filepath.Clean 29 | 30 | 在过滤时候, **/../../../**可以进行处理 31 | 32 | ![](/static/img/WechatIMG2466.png) 33 | 34 | 但是 **../../../** 并不会被处理 35 | 36 | ![](/static/img/WechatIMG2467.png) 37 | 38 | 使用 `os.Open` 打开文件,使用ServeContent 39 | 40 | 41 | * 关于**ServeContent** https://pkg.go.dev/net/http#ServeContent 42 | 43 | ![](/static/img/WechatIMG2468.png) 44 | 45 | 46 | ## 查看修复方式 47 | 48 | 在最新版本已经修复了,修复方式就是在数组前加上 **/** 49 | 50 | ```golang 51 | // https://github.com/grafana/grafana/blob/main/pkg/api/plugins.go 52 | requestedFile := filepath.Clean(filepath.Join("/", web.Params(c.Req)["*"])) 53 | rel, err := filepath.Rel("/", requestedFile) 54 | ``` 55 | 56 | # 其他 TIPS 57 | 58 | 可以通过在前面加上//../,让nginx不处理后的锚点 59 | 60 | 61 | ```golang 62 | /public/plugins/alertlist/#/../..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f/etc/hosts 63 | ``` 64 | -------------------------------------------------------------------------------- /ShangzengBlog/arctales/HfishCodeAudit.md: -------------------------------------------------------------------------------- 1 | Time: 20210921:golang: 首发 「 SecIN」 这里做个记录:...:HFish初版审计学习 2 | -------- 3 | 4 | 5 | # 背景 6 | 7 | 8 | * 首发 https://sec-in.com/article/949 9 | 10 | 在之前学习golang的靶场之后,下来开始尝试一些真实环境的代码审计工作,于是我找到了HFsih并下载了最初的版本。 11 | 12 | 到这里可能有师傅问了:为什么不直接梭哈最新版本?当然是因为最初版本比较简单并且适合新人(并不是担心高版本找不到问题会很尴尬),哈哈 13 | 14 | 话不多说,我们开干 15 | 16 | # 下载/安装 17 | 18 | Hfish是使用golang编写的一款开源蜜罐,其中下载地址如下: https://github.com/hacklcx/HFish/releases?after=0.4 19 | 20 | 在安装golang环境后,我们还需要安装gin框架: 21 | 22 | ```goalng 23 | go get -u github.com/gin-gonic/gin 24 | ``` 25 | 设置go mode 26 | 27 | ```golang 28 | go env -w GOBIN=$HOME/bin 29 | go env -w GO111MODULE=on 30 | go env -w GOPROXY=https://goproxy.cn,direct 31 | ``` 32 | 33 | 接下来进入目录就可以运行了 34 | 35 | ```goalng 36 | go run main.go run 37 | ``` 38 | 39 | 40 | # 代码审计/学习 41 | 42 | 首先看入口 **main.go** 中 **setting.Run()** 为运行入口,进入进入**HFish/utils/setting/setting.go**, 我们可以看到使用**conf.Get("xxx", "xxx")**的方式进行读取**config.ini**中的配置文件,以此判断蜜罐是否启动,如果开启使用**Start()**进行运行 43 | 44 | ```golang 45 | // 启动 Redis 钓鱼 46 | redisStatus := conf.Get("redis", "status") 47 | 48 | // 判断 Redis 钓鱼 是否开启 49 | if redisStatus == "1" { 50 | redisAddr := conf.Get("redis", "addr") 51 | go redis.Start(redisAddr) 52 | ``` 53 | 54 | 这里后面再来看蜜罐,先来看看管理端是是怎么设置的,读取**config.txt** 中设置的管理员地址,并在 **http.Server**中进行设置: 55 | 56 | ```golang 57 | // 启动 admin 管理后台 58 | adminbAddr := conf.Get("admin", "addr") 59 | serverAdmin := &http.Server{ 60 | Addr: adminbAddr, 61 | Handler: RunAdmin(), 62 | ReadTimeout: 5 * time.Second, 63 | WriteTimeout: 10 * time.Second, 64 | } 65 | serverAdmin.ListenAndServe() 66 | } 67 | ``` 68 | 看`RunAdmin() `中设置的路由,这里使用的gin框架,生成日志并写入静态资源 69 | 70 | ```goalng 71 | func RunAdmin() http.Handler { 72 | gin.DisableConsoleColor() 73 | f, _ := os.Create("./logs/hfish.log") 74 | gin.DefaultWriter = io.MultiWriter(f) 75 | // 引入gin 76 | r := gin.Default() 77 | 78 | r.Use(gin.Recovery()) 79 | // 引入html资源 80 | r.LoadHTMLGlob("admin/*") 81 | 82 | // 引入静态资源 83 | r.Static("/static", "./static") 84 | 85 | // 加载路由 86 | view.LoadUrl(r) 87 | 88 | return r 89 | } 90 | ``` 91 | 92 | 跟进**view.LoadUrl(r)**,查看加载的路由功能 ,进入**HFish/view/url.go**,访问**http://127.0.0.1/login**黑白结合进行查看,首先是登陆页面:直接夹在静态资源: 93 | 94 | 95 | ```goalng 96 | 97 | func Html(c *gin.Context) { 98 | data := getSetting() //订阅通知等 99 | c.HTML(http.StatusOK, "setting.html", gin.H{ 100 | "dataList": data, 101 | }) 102 | } 103 | ``` 104 | 105 | 尝试登陆,这里是直接post提交 loginName和 loginPwd 为账号密码,我们在HFish/view/login/view.go中查看登陆逻辑 — 获取用户的登陆账号和密码,与config.ini重的账号密码进行比对,如果一直就在cookie中写入登陆的用户名: 106 | 107 | ```golang 108 | func Login(c *gin.Context) { 109 | loginName := c.PostForm("loginName") 110 | loginPwd := c.PostForm("loginPwd") 111 | 112 | account := conf.Get("admin", "account") 113 | password := conf.Get("admin", "password") 114 | 115 | if loginName == account { 116 | if loginPwd == password { 117 | c.SetCookie("is_login", loginName, 60*60*24, "/", "*", false, true) 118 | c.JSON(http.StatusOK, error.ErrSuccessNull()) 119 | return 120 | } 121 | } 122 | 123 | c.JSON(http.StatusOK, error.ErrLoginFail()) 124 | } 125 | 126 | ``` 127 | 128 | ## 无验证码-容易爆破 129 | 130 | 其实这也不算是什么问题,但是这玩意万一有用呢?抱着这种想法,我写了脚本,结果居然大约爆破出来二十多个公网的蜜罐管理员账号密码,脚本如下: 131 | 132 | * https://github.com/shangzeng/GolangTools/tree/master/12.HFishPassScan 133 | 134 | ## 绕过密码登陆管理员 135 | 136 | 继续查看学习管理员的路由设置,发现在登出操作中,就是清除cookie中的is_login 的用户名,从而达到目的 137 | 138 | 139 | ```golang 140 | func Logout(c *gin.Context) { 141 | c.SetCookie("is_login", "", -1, "/", "*", false, true) 142 | c.Redirect(http.StatusFound, "/login") 143 | } 144 | ``` 145 | 而FHish怎么判断用户是否登陆的呢,这里使用login.Jump函数进行判断,HFish/view/login/view.go 的jump函数进行查看,这里出现了问题: 只是判断了cookie中的用户名为管理员用户名,就判断用户是已经登陆的状态,进入了管理员界面,根本没有用到密码: 146 | 147 | 148 | ```golang 149 | func Jump(c *gin.Context) { 150 | account := conf.Get("admin", "account") 151 | loginCookie, _ := c.Cookie("is_login") 152 | if account != loginCookie { 153 | c.Redirect(http.StatusFound, "/login") 154 | c.Abort() 155 | return 156 | } else { 157 | c.Next() 158 | } 159 | } 160 | ``` 161 | 那么问题来了:如果我们知道管理员账号(一般都是admin),那么我们只要修改cookie中的内容,就可以进行登陆了。测试一下:当不存在的时候,登陆mail界面会跳转到登陆页面 162 | 163 | ![](https://sec-in.com/img/sin/M00/00/62/wKg0C2BLDgOAPP-IAAAlTBWatwM856.png) 164 | 165 | 但是is_login=admin时,就可以通过login.Jump函数验证,访问管理员界面 166 | 167 | ![](https://sec-in.com/img/sin/M00/00/62/wKg0C2BLDhKAOrcNAAAvdIxCAL0420.png) 168 | 169 | 170 | 也就是说:只要我们知道了管理员账号名,我们可以越过密码进行登录(划重点)。 171 | 172 | 173 | ## 前台存储XSS 174 | 175 | 继续查看,仪表盘功能和上钩列表功能主要是展示,没有什么输入操作,接下来查看邮件群发功能:接收邮件,并且在send.SendMail 中使用golang的gomail(https://gopkg.in/gomail.v2)进行发送邮件,使用的是sqlite数据库,但是这里只是用来一个查询并不可控。 176 | 177 | ![](https://sec-in.com/img/sin/M00/00/62/wKg0C2BLDkeABFNwAABLxhvHZZQ713.png) 178 | 179 | 接着查看配置功能,其中view.go中的GetSettingInfo 接收了ID参数用于查询邮件配置,但是这里使用占位符,不存在注入问题, 180 | 181 | ```golang 182 | /*发送邮件*/ 183 | func SendEmailToUsers(c *gin.Context) { 184 | emails := c.PostForm("emails") 185 | title := c.PostForm("title") 186 | from := c.PostForm("from") 187 | content := c.PostForm("content") 188 | 189 | eArr := strings.Split(emails, ",") 190 | sql := `select status,info from hfish_setting where type = "mail"` 191 | isAlertStatus := dbUtil.Query(sql) 192 | info := isAlertStatus[0]["info"] 193 | config := strings.Split(info.(string), "&&") 194 | 195 | if from != "" { 196 | config[2] = from 197 | } 198 | 199 | send.SendMail(eArr, title, content, config) 200 | c.JSON(http.StatusOK, error.ErrSuccessNull()) 201 | } 202 | ``` 203 | 204 | 接下来就是看API接口,主要的目的就是上报we蜜罐的信息,默认开启(这个重要),我们可以看到上报的信息直接写入了sqlite数据库中,虽然用占位符不存在注入问题了,但是是是否会存在XSS呢? 205 | 206 | 207 | ```golang 208 | // 获取钓鱼信息 209 | func GetFishInfo(c *gin.Context) { 210 | id, _ := c.GetQuery("id") 211 | sql := `select info from hfish_info where id=?;` 212 | result := dbUtil.Query(sql, id) 213 | c.JSON(http.StatusOK, error.ErrSuccess(result)) 214 | } 215 | ``` 216 | 217 | 我们看看蜜罐是怎么上传数据的 HFish/web/github/static/github.js 文件,sec_key直接写在js里面的可控: 218 | 219 | 220 | ```golang 221 | function report() { 222 | var login_field = $("#login_field").val(); 223 | var password = $("#password").val(); 224 | 225 | $.ajax({ 226 | type: "POST", 227 | url: "http://localhost:9001/api/v1/post/report", 228 | dataType: "json", 229 | data: { 230 | "name": "Github钓鱼", 231 | "info": login_field + "&&" + password, 232 | "sec_key": "9cbf8a4dcb8e30682b927f352d6559a0" 233 | }, 234 | success: function (e) { 235 | if (e.code == "200") { 236 | window.location.href = "https://github.com"; 237 | } else { 238 | console.log(e.msg) 239 | } 240 | }, 241 | error: function (e) { 242 | console.log("fail") 243 | } 244 | }); 245 | } 246 | ``` 247 | 248 | 查看fish. GetFishList而管理员界面也是直接读取数据,没有编码,很有可能存在XSS,使用钓鱼接口发送XSS测试 249 | 250 | ![](https://sec-in.com/img/sin/M00/00/62/wKg0C2BLDwuAPuGsAABNvVZvIIw979.png) 251 | 252 | 查看管理员界面,触发XSS http://127.0.0.1/fish 253 | 254 | ![](https://sec-in.com/img/sin/M00/00/62/wKg0C2BLDxuAddAtAAATlEEZEhk725.png) 255 | 256 | 257 | # 最后 258 | 259 | 到这里代码就大致分析完毕了,还是有一些收获的哈哈(虽然是没人说的Nday)接下如果有时间可以继续学习蜜罐的编写或者查看下一个版本的HFih进行学习。最后感谢观看哈~ 260 | 261 | -------------------------------------------------------------------------------- /ShangzengBlog/arctales/JsonpLearn.md: -------------------------------------------------------------------------------- 1 | Time: 20220208:other: 首发于微信公众号「Yakit」,关于一个简单漏洞的发现到自动脚本化...:JSONP漏洞发现到漏洞挖掘 2 | -------- 3 | 4 | # 什么是JSONP劫持漏洞 5 | 6 | **同源策略**(同协议、同域名、同端口)导致的不同域名的网站无法传输数据,但是在某些时刻我们有需要进行跨域传输数据。 7 | 这时候**jsonp**身为跨域的方法中的一个就孕育而生了,由于html标签中的` 41 | 42 | ``` 43 | 44 | 45 | # 自动化漏洞扫描JSONP漏洞 46 | 47 | 48 | * 被动扫描,类似X-ray 49 | * 主动扫描,爬虫爬取链接识别 50 | * 可以在疑似存在jsonp的地方加上`callback` 看看是否存在回调 51 | 52 | **思路** 53 | 54 | * 利用 https://github.com/JonCooperWorks/judas 这种网络钓鱼的插件的方式来进行筛选 55 | * xray使用的是 google martian 这个库,去康康 56 | * 搜索 golang proxy http 进行学习 57 | * 被动扫描案例 https://github.com/Buzz2d0/taser 58 | * 但是最好可以结合BP来搞,就像是xray代理那样 59 | 60 | 61 | **主动扫描** 62 | 63 | 使用[RAD](https://github.com/chaitin/rad)爬虫手机网址,使用[check_jsonp_based_on_ast](https://github.com/jweny/check_jsonp_based_on_ast)进行漏洞检测,这里使用携程的的一个jsonp进行验证 64 | 65 | ``` 66 | https://accounts.ctrip.com/ssoproxy/ssoGetUserInfo?jsonp=jQuery2398423949823 67 | ``` 68 | 脚本已经上传GitHub: https://github.com/shangzeng/GolangTools 69 | 70 | ![](/static/img/WechatIMG2649.png) 71 | 72 | **被动扫描** 73 | 74 | 简而言之,还是需要先了解`代理`相关的的资料,再根据代理相关的数据进行修改。流量转发到我们设定的端口,然后在端口进行循环监听,筛选数据,在匹配到合适的数据就进行输出: 75 | 76 | ```golang 77 | package main 78 | 79 | import ( 80 | "fmt" 81 | "bufio" 82 | "log" 83 | "net" 84 | "net/http" 85 | "io/ioutil" 86 | ) 87 | var client = http.Client{} 88 | func main() { 89 | listener, err := net.Listen("tcp", "127.0.0.1:7777") // 监听端口 90 | if err != nil { 91 | log.Fatal(err) 92 | } 93 | for { 94 | conn, err := listener.Accept() 95 | if err != nil { 96 | log.Fatal(err) 97 | } 98 | go handleConn(conn) 99 | } 100 | } 101 | 102 | func handleConn(conn net.Conn) { 103 | req, err := http.ReadRequest(bufio.NewReader(conn)) // 读取代理中的请求 104 | if err != nil { 105 | log.Println(err) 106 | return 107 | } 108 | req.RequestURI = "" 109 | resp, err := client.Do(req) // 发送请求获取响应 110 | if err != nil { 111 | log.Println(err) 112 | return 113 | } 114 | body, _ := ioutil.ReadAll(resp.Body) 115 | fmt.Println(string(body)) // 输出测试 116 | _ = resp.Write(conn) // 将响应返还给客户端 117 | _ = conn.Close() 118 | } 119 | ``` 120 | 121 | 下面是http版本的被动扫描,https 的不会证书相关 122 | 123 | 124 | ```goalng 125 | 126 | package main 127 | 128 | import ( 129 | "fmt" 130 | "bufio" 131 | "log" 132 | "net" 133 | "net/http" 134 | _"io/ioutil" 135 | "github.com/robertkrimen/otto/ast" 136 | "github.com/robertkrimen/otto/parser" 137 | _"encoding/json" 138 | "io/ioutil" 139 | "net/url" 140 | "regexp" 141 | _"os" 142 | ) 143 | var client = http.Client{} 144 | func main() { 145 | listener, err := net.Listen("tcp", "127.0.0.1:7777") // 监听端口 146 | if err != nil { 147 | log.Fatal(err) 148 | } 149 | for { 150 | conn, err := listener.Accept() 151 | if err != nil { 152 | log.Fatal(err) 153 | } 154 | go handleConn(conn) 155 | } 156 | } 157 | 158 | func handleConn(conn net.Conn) { 159 | // 读取代理中的请求 160 | req, err := http.ReadRequest(bufio.NewReader(conn)) 161 | if err != nil { 162 | log.Println(err) 163 | return 164 | } 165 | req.RequestURI = "" 166 | // 发送请求获取响应 167 | resp, err := client.Do(req) 168 | if err != nil { 169 | log.Println(err) 170 | return 171 | } 172 | // 输出测试 173 | //body, _ := ioutil.ReadAll(resp.Body) 174 | //fmt.Println(req.URL.String()) 175 | // 检测 176 | result, _ := CheckSenseJsonp(req.URL.String()) 177 | if result { 178 | fmt.Println("存在jsonp",req.URL.String()) 179 | } 180 | _ = resp.Write(conn) // 将响应返还给客户端 181 | _ = conn.Close() 182 | } 183 | //基于AST的JSONP劫持漏洞检测 184 | //1.解析js路径,检查query所有key是否满足正则 (?m)(?i)(callback)|(jsonp)|(^cb$)|(function) 185 | //2.referer配置为同域,请求js获取响应 186 | //3.js响应生成AST,如果满足 187 | // a) Callee.Name == callback函数名 188 | // b) 递归遍历AST 获取所有的字段和对应的value 189 | // c) 字段为敏感字段(满足正则(?m)(?i)(uid)|(userid)|(user_id)|(nin)|(name)|(username)|(nick)),且value不为空 190 | //4.替换Referer后再请求一次,重新验证步骤3 191 | // 192 | //调用方式 193 | //入参:js路径 194 | //返回:是否存在漏洞,err 195 | //result, err := CheckSenseJsonp("http://127.0.0.1/jsonp_env/getUser.php?id=1&jsoncallback=callbackFunction") 196 | func CheckSenseJsonp(jsUrl string)(bool, error){ 197 | // 准备referer 198 | queryMap, domainString, err := UrlParser(jsUrl) 199 | if err != nil{ 200 | return false, err 201 | } 202 | // 检查jsonp关键字 203 | isCallback, callbackFuncName, err := CheckJSIsCallback(queryMap) 204 | if isCallback{ 205 | // referer: host 请求 206 | normalRespContent, err := GetJsResponse(jsUrl, domainString) 207 | if err != nil{ 208 | return false, err 209 | } 210 | // 检查JS语句 211 | isJsonpNormal , err := CheckJsRespAst(normalRespContent, callbackFuncName) 212 | if err != nil{ 213 | return false, err 214 | } 215 | // 如果包含敏感字段 将 referer 置空 再请求一次 216 | if isJsonpNormal{ 217 | noRefererContent, err := GetJsResponse(jsUrl, "") 218 | if err != nil{ 219 | return false, err 220 | } 221 | isJsonp , err := CheckJsRespAst(noRefererContent, callbackFuncName) 222 | if err != nil{ 223 | return false, err 224 | } 225 | return isJsonp, nil 226 | } 227 | } 228 | return false, nil 229 | } 230 | func UrlParser(jsUrl string)(url.Values, string, error){ 231 | urlParser, err := url.Parse(jsUrl) 232 | if err != nil{ 233 | return nil, "", err 234 | } 235 | // 拼接原始referer 236 | domainString := urlParser.Scheme + "://" + urlParser.Host 237 | return urlParser.Query(), domainString, nil 238 | } 239 | func CheckJSIsCallback(queryMap url.Values) (bool,string, error){ 240 | var re = regexp.MustCompile(`(?m)(?i)(callback)|(jsonp)|(^cb$)|(function)`) 241 | for k, v :=range queryMap { 242 | regResult := re.FindAllString(k, -1) 243 | if len(regResult) > 0 && len(v)>0 { 244 | return true, v[0], nil 245 | } 246 | } 247 | return false, "",nil 248 | } 249 | func CheckIsSensitiveKey(key string) (bool,error) { 250 | var re = regexp.MustCompile(`(?m)(?i)(uid)|(userid)|(user_id)|(nin)|(name)|(username)|(nick)`) 251 | regResult := re.FindAllString(key, -1) 252 | if len(regResult) > 0 { 253 | return true, nil 254 | } 255 | return false, nil 256 | } 257 | func GetJsResponse(jsUrl string, referer string) (string, error) { 258 | req, err := http.NewRequest("GET", jsUrl, nil) 259 | if err != nil { 260 | return "", nil 261 | } 262 | req.Header.Set("Referer", referer) 263 | resp, err := http.DefaultClient.Do(req) 264 | if err != nil { 265 | return "", err 266 | } 267 | defer resp.Body.Close() 268 | body, err := ioutil.ReadAll(resp.Body) 269 | if err != nil { 270 | return "", err 271 | } 272 | if resp.StatusCode == 200 { 273 | return string(body), nil 274 | } 275 | return "", nil 276 | } 277 | func CheckJsRespAst(content string, funcName string) (bool,error){ 278 | // 解析js语句,生成 *ast.Program 或 ErrorList 279 | program, err := parser.ParseFile(nil, "", content, 0) 280 | if err != nil{ 281 | return false, err 282 | } 283 | if len(program.Body) > 0 { 284 | statement := program.Body[0] 285 | expression := statement.(*ast.ExpressionStatement).Expression 286 | expName := expression.(*ast.CallExpression).Callee.(*ast.Identifier).Name 287 | // 表达式中函数名与query函数名不一致 直接返回false 288 | if funcName != expName{ 289 | return false, err 290 | } 291 | argList := expression.(*ast.CallExpression).ArgumentList 292 | for _, arg := range argList{ 293 | result := DealAstExpression(arg) 294 | if result != true{ 295 | continue 296 | } 297 | return result, nil 298 | } 299 | } 300 | //ast树为空 直接返回 301 | return false, nil 302 | } 303 | func DealAstExpression(expression ast.Expression)bool{ 304 | objectLiteral, isObjectLiteral := expression.(*ast.ObjectLiteral) 305 | if isObjectLiteral{ 306 | values := objectLiteral.Value 307 | for _, value := range values{ 308 | result := DealAstProperty(value) 309 | if result != true{ 310 | continue 311 | } 312 | return result 313 | } 314 | } 315 | return false 316 | } 317 | func DealAstProperty(value ast.Property)bool{ 318 | secondLevelValue := value.Value 319 | // 表达式中是数组/对象的 递归 320 | objectLiteral, isObjectLiteral := secondLevelValue.(*ast.ObjectLiteral) 321 | arrayLiteral, isArrayLiteral := secondLevelValue.(*ast.ArrayLiteral) 322 | stringLiteral, isStringLiteral := secondLevelValue.(*ast.StringLiteral) 323 | numberLiteral, isNumberLiteral := secondLevelValue.(*ast.NumberLiteral) 324 | if isObjectLiteral { 325 | thirdLevelValue := objectLiteral.Value 326 | for _, v := range thirdLevelValue { 327 | DealAstProperty(v) 328 | } 329 | } else if isArrayLiteral { 330 | thirdLevelValue := arrayLiteral.Value 331 | for _, v := range thirdLevelValue { 332 | DealAstExpression(v) 333 | } 334 | } else if isStringLiteral{ 335 | // 表达式中value为字符串/数字的 才会检测key value 336 | thirdLevelValue := stringLiteral.Value 337 | isSensitiveKey, _ := CheckIsSensitiveKey(value.Key) 338 | if isSensitiveKey && thirdLevelValue != ""{ 339 | return true 340 | } 341 | } else if isNumberLiteral { 342 | thirdLevelValue := numberLiteral.Value 343 | isSensitiveKey, _ := CheckIsSensitiveKey(value.Key) 344 | if isSensitiveKey && thirdLevelValue != 0{ 345 | return true 346 | } 347 | } 348 | return false 349 | } 350 | ``` 351 | 352 | # 使用Yak被动扫描jsonp漏洞 353 | 354 | 通过上面我们可以知道,jsonp的搜索与发现是个比较容易流程化的操作,而且相对于主动扫描,被动发现也更加适合,因此我们这里可以写一个被动扫描插件,来代替手工操作,而且解决了HTTPS的问题 355 | 356 | 其中Yak的开发文档如下: 357 | 358 | ```html 359 | https://www.yaklang.io/docs 360 | ``` 361 | 打开Yakit,选择【插件仓库】,选择【+新插件】,这里的插件有三种模式: 362 | 363 | * 以 Webhook 为通信媒介的原生 Yak 模块,通过核心引擎启动新的 yak 执行进程来控制执行过程; 364 | * 以 MITM 劫持过程为基础 Hook 点的 Yak 模块, 365 | * 以 Yaml 为媒介封装 Nuclei PoC 的模块,本质上也是执行一段 Yak 代码,原理与(1)相同 366 | 367 | 我们使用**MITM**模块,这里我们需要了解的几个函数已经存在注释了,讲的很清楚。 **jsonp** 主要出现在请求参数里面,因此使用`mirrorNewWebsitePathParams` 模块,其他的不用注释掉就好 368 | 369 | ``` 370 | # mitm plugin template 371 | yakit_output(MITM_PARAMS) 372 | __test__ = func() { 373 | results, err := yakit.GenerateYakitMITMHooksParams("GET", "https://example.com") 374 | if err != nil { 375 | return 376 | } 377 | isHttps, url, reqRaw, rspRaw, body = results 378 | mirrorNewWebsitePathParams(results...) 379 | } 380 | # mirrorNewWebsitePathParams 每新出现一个网站路径且带有一些参数,参数通过常见位置和参数名去重,去重的第一个 HTTPFlow 在这里被调用 381 | mirrorNewWebsitePathParams = func(isHttps /*bool*/, url /*string*/, req /*[]byte*/, rsp /*[]byte*/, body /*[]byte*/) { 382 | } 383 | ``` 384 | 385 | 在被动接收流量后,我们首先应当删选出包含**jsonp**的请求,这里使用关键字匹配的方式进行搜索: 386 | 387 | ```go 388 | # 请求存在关键词检测为jsonp数据 389 | availableJSONPParamNames = [ 390 | "jsonp","jsoncb","jsonpcb","cb","json","jsonpcall","jsoncall","jQuery","callback","back", 391 | ] 392 | ``` 393 | 394 | 在字符串的比对中,时使用 **[str](https://www.yaklang.io/docs/buildinlibs/lib_str)** 工具库进行,这里注意大小写问题 395 | 396 | 397 | ```go 398 | str.StringSliceContains(availableJSONPParamNames, str.ToLower(paramName)) 399 | ``` 400 | 401 | 在**Yak**中,提供了 **[fuzz](https://www.yaklang.io/docs/buildinlibs/lib_fuzz)** 工具库来进行请求的发送与接收,例如官方提供的POC如下: 402 | 403 | ```golang 404 | # fuzz.HTTPRequest 可以直接 接收 req 数据 进行发送,并允许一定的错误 405 | fReq, err := fuzz.HTTPRequest(` 406 | POST /index.php?s=captcha HTTP/1.1 407 | Host: localhost:8080 408 | User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0) 409 | Connection: close 410 | Content-Type: application/x-www-form-urlencoded 411 | Content-Length: 72 412 | 413 | _method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=id 414 | `) 415 | # Yak 的报错处理类似于golang 416 | if err != nil { 417 | die(err) 418 | } 419 | # 发送请求,接收返回数据 420 | reqs, err := fReq.Exec() 421 | if err != nil { 422 | die(err) 423 | } 424 | 425 | for rsp = range reqs { 426 | if rsp.Error != nil { 427 | log.error(rsp.Error) 428 | continue 429 | } 430 | if re.Match(`((uid\=\d*)|(gid\=\d*)|(groups=\d*))`, rsp.ResponseRaw) { 431 | println("found thinkphp vuls...") 432 | break 433 | } 434 | } 435 | ``` 436 | 437 | 在获取jsonp的URL后,我们还要判断返回的数据中是否存在敏感信息,这里使用正则表达式**[re](https://www.yaklang.io/docs/buildinlibs/lib_re)**进行匹配 438 | 439 | ```go 440 | re.Match(`(nick)|(pass)|(name)|(data)`,rsp.ResponseRaw) 441 | ``` 442 | 443 | 最后的逻辑思维如下: 444 | 1. 首先从流量中筛选出可能存在jsonp的流量 445 | 2. 发送请求包,看返回值是否存在敏感信息 446 | 3. 去掉referer,cookie等信息,看是否还会返回敏感信息【还没写完】 447 | 448 | 449 | 不得不说**Yak**的插件做到了简单快速,在不到半天的情况下,就从 **0基础** 到可以的写出一个脚本来,最后效果如下: 450 | 451 | ![](/static/img/WechatIMG2650.png) 452 | 453 | -------------------------------------------------------------------------------- /ShangzengBlog/arctales/SpringDat.md: -------------------------------------------------------------------------------- 1 | Time: 20220531:other:日常记录...:[日常笔记] SpringBootActuator未授权与钓鱼邮件 2 | -------- 3 | 4 | 5 | 6 | 7 | 8 | ## 背景 9 | 10 | 鸽了好久了,想写点啥但是也没啥指得写的最近,只好谢谢日常记录水水文字吧 == 11 | 12 | 修图摄影也鸽了很久,这么长时间就修了几张图,待久了啥也不想干了属于是。 13 | 14 | ![](/static/img/IMG_5018.PNG) 15 | 16 | 17 | 18 | ## 关于 Spring Boot Actuator 19 | `Actuator` 是 `Spring Boot` 提供的服务监控和管理中间件。当 `Spring Boot `应用程序运行时,它会自动将多个端点注册到路由进程中。而由于对这些端点的错误配置,就有可能导致一些系统信息泄露、XXE、甚至是 RCE 等安全问题。`Actuator`提供了13个接口: 20 | 21 | ```bash 22 | GET /actuator 显示能够所有打开的接口 23 | GET /auditevents 显示应用暴露的审计事件 (比如认证进入、订单失败) 24 | GET /beans 描述应用程序上下文里全部的 Bean,以及它们的关系 25 | GET /conditions 就是 1.0 的 /autoconfig ,提供一份自动配置生效的条件情况,记录哪些自动配置条件通过了,哪些没通过 26 | GET /configprops 描述配置属性(包含默认值)如何注入Bean 27 | GET /env 获取全部环境属性 28 | GET /env/{name} 根据名称获取特定的环境属性值 29 | GET /flyway 提供一份 Flyway 数据库迁移信息 30 | GET /liquidbase 显示Liquibase 数据库迁移的纤细信息 31 | GET /health 报告应用程序的健康指标,这些值由 HealthIndicator 的实现类提供 32 | GET /heapdump dump 一份应用的 JVM 堆信息 33 | GET /httptrace 显示HTTP足迹,最近100个HTTP request/repsponse 34 | GET /info 获取应用程序的定制信息,这些信息由info打头的属性提供 35 | GET /logfile 返回log file中的内容(如果 logging.file 或者 logging.path 被设置) 36 | GET /loggers 显示和修改配置的loggers 37 | GET /metrics 报告各种应用程序度量信息,比如内存用量和HTTP请求计数 38 | GET /metrics/{name} 报告指定名称的应用程序度量值 39 | GET /scheduledtasks 展示应用中的定时任务信息 40 | GET /sessions 如果我们使用了 Spring Session 展示应用中的 HTTP sessions 信息 41 | POST /shutdown 关闭应用程序,要求endpoints.shutdown.enabled设置为true 42 | GET /mappings 描述全部的 URI路径,以及它们和控制器(包含Actuator端点)的映射关系 43 | GET /threaddump 获取线程活动的快照 44 | ``` 45 | 46 | 47 | `Spring Boot` 也主要分成 `1.X` 和 `2.X` 两个版本, 上文是`1.x`版本。 在 `2.X` 的 `Actuator` 也有所不同: 48 | 49 | 50 | 51 | ```bash 52 | # 只默认开放这两个端口 53 | /actuator // 显示能够所有打开的接口 54 | /actuator/health // 主要用于 查看系统的运行状态 55 | /actuator/info 56 | # 其他的需要手动开启 57 | management.endpoints.web.exposure.include=* // 全部打开 58 | management.endpoints.web.exposure.exclude=beans,trace //打开部分 59 | management.endpoints.web.base-path=/manage // Actuator 默认所有的监控点路径都在/actuator/* 当然如果有需要这个路径也支持定制,设置完重启后,再次访问地址就会变成/manage/* 60 | ``` 61 | 62 | 所有的接口都是可以关闭的(默认开启), 在`application.properties` 文件中进行设置 63 | ```bash 64 | management.endpoint.shutdown.enabled=true 65 | ``` 66 | 67 | ### heapdump 信息泄漏 68 | 69 | 在`/heapdump` 接口会泄漏内存信息,我们可以通过分析内存在获取敏感信息 , 这里我使用的是`MAC` 中的`MAT` 工具来进行分析 70 | 71 | 72 | * 选择`File` , `Open Heap Dump` , 打开后点击左上角的`OQL`图标,搜索敏感信息命令如下, 点击感叹号图标执行: 73 | ```bash 74 | select * from java.util.LinkedHashMap$Entry x WHERE (toString(x.key).contains("password")) 75 | ``` 76 | 77 | 也可以使用[heapdump_tool](https://github.com/wyzxxz/heapdump_tool), [JDumpSpider-1.0-SNAPSHOT-full](https://github.com/whwlsfb/JDumpSpider)等工具 记性分析,但是会有遗漏(数据库信息,堆栈中的用户信息,加密解密秘钥信息),比如下面这条 78 | 79 | ```bash 80 | jdbc:mysql://rds.prod.na.v2.naiot.com:3306/api_test?useUnicode=true&characterEncoding=UTF-8§{user=api_test, password=Midea1234%} 81 | ``` 82 | 83 | ### access 阿里云数据泄漏 84 | 85 | 主要还是搜索关键词 `application.aliyun.accesskey` , `application.aliyun.accesssecret` 等等 ,然后使用工具测试。 86 | 87 | 88 | ## 钓鱼流程指南 89 | 90 | BOSS要求做一下简单的钓鱼攻击,并提出流程。目标环境有以下特点: 91 | 92 | 1. 内外网系统隔离,有策略管理 93 | 2. 存在邮件安全网关和邮件沙箱 94 | 3. 邮箱、OA 等系统全部存在内网,VPN等使用PIN码进行验证 95 | 96 | 这样一来,获取权限就比较困难,目标降级为获取敏感信息。采取的方式就很简单了:钓鱼邮件+手机二维码进行钓鱼。 97 | 98 | 99 | ### 使用smtp2go进行钓鱼邮件分发 100 | 101 | 这里主要是用于发件人信息伪造,经过测试发现其实伪造发件人是个很鸡肋的行为: 能点击邮件的憨憨也基本不会在乎发件人,在乎发件人的也不会点击邮件,麻。 102 | 103 | 在使用自己注册[smtp2go](https://www.smtp2go.com/)的邮箱后,建立密码,需要手机号码(支持中国手机号),登陆,增加自己的域名 , 选择 `Settings` , `STMPUsers` , `ADD STMP Users` 104 | 105 | ### 使用gophish进行搭建 106 | 107 | * 官方文档: https://docs.getgophish.com/user-guide/template-reference 108 | * 下载地址: https://github.com/gophish/gophish 109 | 110 | Gopdish 是一个功能强大的开源网络钓鱼框架,可以有一个强大的api,任何操作都能可以通过api来进行,他可以自动化的进行钓鱼,并且能够统计钓鱼的结果,例如邮件钓鱼的送达率,点开率,触发率,成功率等等,然后汇总成一个报表,让安全人员能够清晰明了的了解到本次钓鱼测试结果。默认账号admin密码在运行终端生成,安装命令如下: 111 | 112 | ```bash 113 | // 使用ubuntu 系统 114 | wget https://github.com/gophish/gophish/releases/download/v0.11.0/gophish-v0.11.0-linux-64bit.zip 115 | apt install unzip 116 | unzip gophish-v0.11.0-linux-64bit.zip -d gophish 117 | cd gophish 118 | 119 | ``` 120 | 121 | 在启动之前需要在`config.json`中将管理端口的`127.0.0.1:3333`修改为`0.0.0.0:333`,这样可以在外网进行访问(钓鱼端口和协议也是在这里设置)。账号密码在命令行中随机生成。如果不需要https服务也可以在`config.json`关闭。 122 | ```bash 123 | chmod 777 gophish 124 | vi config.json // 修改配置文件 125 | tmux // 新建窗口 126 | ./gophish 127 | ``` 128 | 129 | 130 | ### 使用gophish进行邮件伪造发送 131 | 132 | 在`gophish`的流程如下: 133 | 134 | ```bash 135 | 136 | 设置邮件发送服务器 -> 设置钓鱼网站页面 -> 设置邮件模版 -> 添加钓鱼用户组 -> 实施攻击 137 | 138 | ``` 139 | 140 | * 登陆后,在`Sending Profiles` 设置发送邮件的邮箱设置,找qq或者网易邮箱都可以进行设置 141 | * 在 `Landing Pages`配置钓鱼网站模版,这里可以使用`import Site` 爬虫爬取模版,但是有一些不准确。下面的选项为抓取密码。注意,在加载钓鱼模版 的时候,有一个加载连接的选项需要勾选,否则使用`gophish`很难接收到数据。再就是需要在页面中存在连接,`gophish`会替换成自己的网址,没有的话就无法返回数据。 最后有一个跳转选项,也可以让中招者在输入敏感数据后跳转到真正的页面上去(总之就是能全勾选就全勾上) 142 | 在钓鱼邮件建立这里还需要注意一点: 接收的账号密码格式也是需要一定程度的修改,否则就抓不到获取的密码,最好还是from表单进行提交的数据,比如最常见的格式如下: 143 | ```html 144 |
145 | 146 | 147 | 148 |
149 | ``` 150 | 上述的请求格式是可以进行转换的,但是后续抓包可以大致看到数据是经过POST传入的, 总之, 要是自动的没生效,那就手动修改传参就行了 : 151 | ```http 152 | POST /?rid=HmS249p HTTP/1.1 153 | 154 | Host: XX.XX.XX.XX 155 | User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:100.0) Gecko/20100101 Firefox/100.0 156 | Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8 157 | Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2 158 | Accept-Encoding: gzip, deflate 159 | Content-Type: application/x-www-form-urlencoded 160 | Content-Length: 42 161 | Origin: http://XX.XX.XX.XX 162 | Connection: close 163 | Referer: http://XX.XX.XX.XX/?rid=HmS249p 164 | Cookie: __aegis_uid=1652952007292-7968 165 | Upgrade-Insecure-Requests: 1 166 | 167 | username=testaaa&password=qqqqqq&bianhao=1 168 | ``` 169 | 170 | * 在 `Email Templates`配置钓鱼网站模版,这里可以使用`import Email` 加载 `eml` 格式的邮件信息,这里需要注意邮件编码格式问题,可以先发送几个实验。这里需要勾选`Add Tracking Image` 这个选项后就可以根据图像知道这封邮件有没有被打开了(内外网隔离无效)。这里要注意 ,当我们想要使用钓鱼功能的时候,就需要在邮件模板的HTML中假如如下的内容来获取钓鱼网址 171 | ```bash 172 | {{.URL}} 173 | ``` 174 | 175 | * `campaigns` 新建一个钓鱼攻击活动,需要输入上文编写的邮件模版名字,钓鱼页面,钓鱼网址,发送日期,配置文件,使用的组。这里需要注意:还是需要在`longing page` 页面进行设置,否则无法正常发送页面的, (重点)URL: 176 | URL 是用来替换选定钓鱼邮件模板中超链接的值 ,这里的URL需要填写当前运行gophish脚本主机的ip。因为启动gophish后,gophish默认监听了3333和80端口,其中3333端口是后台管理系统,而80端口就是用来部署钓鱼页面的。 177 | 当URL填写了http://主机IP/,并成功创建了当前的钓鱼事件后。gophish会在主机的80端口部署当前钓鱼事件所选定的钓鱼页面,并在发送的钓鱼邮件里,将其中所有的超链接都替换成部署在80端口的钓鱼页面的url。所以,这里的URL填写我本地当前运行gophish主机的IP对应的url,即`http://192.168.141.1` , 再就是倒是第三行的 `Send Emails By ` 这里可以进行 时间延后发送,这样发送的邮件就是邮件数量除以这段时间的发送,避免了被封的危险。最后的结果在展示面板进行观看。 178 | 179 | 180 | ### 使用EwoMail搭建邮件服务器 181 | 182 | 要是想整点真实的,可以考虑自己购买域名+国外服务搭建邮箱(国内的服务器不行,25端口不给开)进行测试 , 这是我的搭建环境: 183 | 184 | * 购买服务器需要开启25端口(阿里腾讯等云服务器厂商一般都不给开) 185 | * 需要纯净centos7/8服务器 186 | * centos7/8服务器需要关闭默认防火墙 187 | 188 | **命令如下**: 189 | 190 | ```bash 191 | systemctl status firewalld // 查看防火墙设置 192 | systemctl stop firewalld // 关闭防火墙 193 | systemctl disable firewalld // 关闭防火墙 194 | #mail.symail.club 换成 mail.你的域名 195 | hostnamectl set-hostname mail.polarnightsec.com 196 | #修改hosts 197 | vi /etc/hosts 198 | #把symail.club 全换成你的域名,在下加入这一行, esc+:wq 进行保存 199 | 127.0.0.1 mail.polarnightsec.com polarnightsec.com smtp.polarnightsec.com imap.polarnightsec.com 200 | # 安装git 201 | yum -y install git 202 | # git下载EwoMail 203 | git clone https://github.com/gyxuehu/EwoMail.git 204 | cd EwoMail/install 205 | #下面的symail.club请换成你注册的域名 206 | #要是外网服务器 ,设置en参数解析 207 | #sh ./start.sh polarnightsec.com en 208 | sh ./start.sh polarnightsec.com 209 | ``` 210 | **域名解析** 211 | 212 | 参考`EwoMail`官方配置解析方式: `v=spf1 ip4:45.32.212.223 -all` 213 | 214 | **搭建进入** 215 | 216 | 默认账号`admin`密码`ewomail123` 217 | 218 | ```bash 219 | 管理端:http://45.32.212.223:8010/Center/Index/login 220 | 邮件端:http://45.32.212.223:8000/ 221 | ``` 222 | 223 | 224 | 225 | -------------------------------------------------------------------------------- /ShangzengBlog/arctales/TheBeginningOfEverything.md: -------------------------------------------------------------------------------- 1 | Time: 20211217:other:记录下这一切的开始...:开始:我的第一篇博客 2 | -------- 3 | 4 | 5 | # 背景 6 | 7 | 离开北京后,能明显感觉到节奏慢了很多很多,也有了一些时间来干自己想干的事情,就比如现在 - 好好弄下我的博客。 8 | 9 | 之前主要是为了简历好看而建立的,不过现在也不需要通过这些东西来展现自己的能力了,反而可以实现博客真正的功能来 - 用它来记录生活。 10 | 11 | 12 | # 技术环节 13 | 14 | 之前的博客是静态部署在**GitHub**上面的,效果很好但是问题也很明显:有时候需要科学上网才能访问。 15 | 16 | 于是有了现在的计划:自己写个小轮子,并搞个好点的VPS 17 | 18 | 目前使用 **beego** 框架 , 照着几个 **GitHub** 的博客抄抄删删, 就有了现在的博客。 不能说完美无缺,只能说勉强能用,以后慢慢改吧 。 19 | 20 | 21 | 22 | # 未来要做的 23 | 24 | * 拍摄一组照片,发布出来 25 | * 完成 **浏览量** , **标签搜索** , **DNSlog** ,**相邻文章**, **RSS**等功能 26 | * 要健身,目标瘦20斤 27 | 28 | 最后附上一张离京时拍摄的照片,也希望疫情能早日过去吧 : 29 | 30 | ![beijing](../static/img/beijing.jpg) -------------------------------------------------------------------------------- /ShangzengBlog/arctales/WinhexDataRecovery.md: -------------------------------------------------------------------------------- 1 | Time: 20200913:other:大学打取证比赛学的技能,属于炒冷饭了。这里就是记录下...:winhex之从数据恢复到删盘跑路 2 | -------- 3 | 4 | 5 | # 背景 6 | 7 | 首发于公众号**酒仙桥六号部队**: https://mp.weixin.qq.com/s/Fw9zbUMt0qp5JMEpyfzxRg 8 | 9 | 10 | # 什么是WINHEX 11 | 12 | WINHEX 是一款用于查看和编辑底层十六进制数据的软件,我们可以利用这个软件修改文件格式数据,从而达到数据恢复的效果。 13 | 当然,WINHEX也不仅仅用于数据恢复,也可以用于磁盘恢复,RAID重组,镜像转换,CTF 隐写杂项等等。WINHEX 支持中文,在设置栏中进行修改. 14 | 15 | * 下载网址: https://www.x-ways.net/winhex/index-m.html 16 | 17 | WINHEX 基本界面如下,我们数据恢复用到的功能很少因此只介绍一部分。 18 | 19 | ![winhex](../static/img/2.png) 20 | 21 | 在安装和了解WINHEX的基本结构后,我们就可以愉快的进行数(删)据(盘)恢(跑)复(路)了。 22 | 23 | 24 | 25 | 26 | # winhex自动数据恢复 27 | 28 | 如同字面意思一样,自动恢复就是利用HINHEX 自动在存储数据的扇区中搜索文件类型(根据文件头进行判断),并自动进行查找数据进行恢复。自动回复不需要我们掌握技术原理,操作方式如下: 29 | 30 | 首先打开你错删文件存储的磁盘,我这里删除的是C盘的文件,因此需要打开的C盘: 31 | 32 | ![winhex](../static/img/3.png) 33 | 34 | 然后选择工具 -> 磁盘工具 -> 按文件类型进行恢复 35 | 这里要注意恢复的文件最好是在一个新的磁盘中,以免造成文件覆盖。 36 | 37 | ![winhex](../static/img/4.png) 38 | 39 | 选中我们要恢复的数据类型(可以多选),选中输出目录,点击确定: 40 | 41 | ![winhex](../static/img/5.png) 42 | 43 | 恢复速度和磁盘大小有关,耐心等待数据恢复就好: 44 | 45 | ![winhex](../static/img/6.png) 46 | 47 | 虽然恢复出来了,但是问题还是有很多的: 按照文件类型恢复的数据量多而复杂(因为是无差别寻找),在其中查找我们想要的数据也要花费不少时间;按照文件类型恢复的数据名会丢失(因为在文件系统中,数据内容和数据名不是存放在一个地方)。 48 | 因此,如果我们想完整的恢复特定的文件,还是需要进行手动操作恢复的。而在进行手动恢复之前,我们需要了解以下基础知识。 49 | 50 | ## 什么是文件系统 51 | 52 | 就像电脑对应的操作系统一样,我们日常使用的移动介质中,也存在相应的文件系统,每种文件系统有自己的存储方式(大同小异),而比较常见的文件系统如下: 53 | 54 | 1. FAT32/64 常见于U盘,内存卡等文件系统 55 | 2. NTFS WIN的文件系统 56 | 3. APFS MAC的文件系统 57 | 由于文章篇幅原因,这里我们只讲解最常见的HTFS文件系统,也就是使用WINHEX基于WINDOWS的数据恢复。既然我们知道数据是存储在NTFS系统中,那么我们就要了解下NTFS文件系统的存储规则。 58 | 59 | 60 | ## NTFS 文件存储规则 61 | 62 | 在使用WINHEX查看NTFS文件系统的时候,我们能看见一些以$开头的文件,这些文件就是NTFS操作系统的元文件,元文件用于管理存储介质中的内容: 63 | 64 | ![winhex](../static/img/7.png) 65 | 66 | 其中每个元文件的功能如下: 67 | 68 | 1. $MFT 又叫主文件表,用于存储数据名和文件区间的索引(简单理解就是这里存放着文件名信息在内的文件属性信息,是我们数据恢复重点关注的对象)。 69 | 2. MFTMIRR就是 MFT的备份文件(但是只备份一部分) 70 | 3. $BOOT 引导文件,记录了用于引导的数据 71 | 4. DBR备份文件,其中DBR 源文件在0号扇区 72 | 73 | ## $MFT 元文件结构 74 | 75 | 上文我们知道文件属性存储在MFT,那么接下来我们需要了解部分数据属性具体在MFT 中的存储状况:在WINHEX中表现如下: 76 | 77 | ![winhex](../static/img/9.png) 78 | 79 | 其中文件名是存储在30属性中的,而文件内容是存储在80属性中,然而80属性的容量一般无法存储文件所有的数据,因此,这里涉及到了一个“簇流运行”的概念。 80 | 81 | ## 什么是簇流运行 82 | 83 | “簇流”是指存放数据的一块区域,而“簇流运行”就是指记录“簇流”文件具体在那个位置的数据(这里涉及了80属性的一个“常驻属性”和“非常驻属性”的概念)。 84 | 简单说,“簇流运行”就是指文件存储位置的一段字节。而“簇流运行”中存储数据有自己的一套规则。举个例子,某“簇流运行”结构如下: 85 | 86 | ![winhex](../static/img/10.png) 87 | 88 | 89 | ## 删除文件后NTFS的变化 90 | 91 | 在我们彻底删除一个文件后,在NTFS中到底是有什么变化呢? 92 | 93 | 在彻底删除一个文件后,只是在$MFT 中的10属性发生变化了,表示这个文件可以被写入数据(这也是为什么我们不建议对要数据恢复的磁盘进行写入操作的原因,害怕会覆盖掉我们要进行数据恢复的文件)。但是数据和数据属性仍然存在。也就是数据恢复的基础。 94 | 95 | 了解NTFS文件的存储规律后,接下来数据恢复的思路就很明显了:我们使用WINHEX定位到MFT或者MFTMIRR文件,再从MFT/MFTMIRR文件中找到要恢复的文件属性和数据存储扇区,导出扇区中的数据进行数据恢复了。 96 | 97 | 可能听起来有点懵逼,所以我们接下来手动尝试一遍。 98 | 99 | # 使用winhex手工数据恢复 100 | 101 | 首先,shift+delect彻底删除一张图片作为数据恢复的对象: 102 | 103 | ![winhex](../static/img/11.png) 104 | 105 | 使用winhex 打开被删除文件的磁盘,定位到$MFT 项目,使用winhex搜索文件名:WechatIMG648.jpeg 转换为十六进制: 106 | 107 | 点击任务栏中的查找十六进制数值,搜索十六进制的文件名,选择向下搜索,点击确定。 108 | 109 | 110 | ![winhex](../static/img/12.png) 111 | 112 | 找到文件80属性,找到簇流运行的文件 113 | 114 | ![winhex](../static/img/13.png) 115 | 116 | 117 | 5DECCA(这里读取扇区是需要倒着顺序的)转换成十进制为6155466,使用winhex跳转 118 | 119 | ![winhex](../static/img/14.png) 120 | 121 | 这里我们看到JFIF文件头就能判断是文件开头了,而文件大小是09,转换成十进制也是09,这里我们首先右键,选择标记为文件起始块: 122 | 123 | 124 | ![winhex](../static/img/15.png) 125 | 126 | 跳转到文件结尾(6155466+9),扇区,右键选择结尾。右键选择编辑,置入新文件,保存。 127 | 128 | ![winhex](../static/img/16.png) 129 | 130 | 接下来就能看见我们数据恢复出来的文件了~ 131 | 132 | ![winhex](../static/img/17.png) 133 | 134 | 135 | 136 | 137 | 138 | -------------------------------------------------------------------------------- /ShangzengBlog/arctales/about.html: -------------------------------------------------------------------------------- 1 | # 关于我 2 | 3 | 网络安全/CTF/SRC/视频制作/吉他 4 | 5 | 以上内容全不精通 ,互联网安全从业者,由于不想「 卷 」了而北漂归来,现在基本上啥都学一点。 6 | 7 | 8 | # 会记录些什么 9 | 10 | * 放一些网络安全的学习笔记 11 | * 拍摄的「 风景 」或者「 人物 」照片 12 | * 实验一些功能,作为我的公开日记 13 | 14 | 15 | # 假如或许想要联系我 16 | 17 | 蓝队老哥们不要溯源我了,我已经金盆洗手了属于是 :) 18 | 19 | * email (并不常用): shang_zeng@foxmail.com 20 | * 微信 (说明来源): shangzeng_club 21 | 22 | # I Hacked 23 | 24 | 25 | 26 | | BiliBili | 百度 | 腾讯 | 马蜂窝 | 网易 | 法大大 | 360 | 微博 | 奇安信 | 贝贝 | 格力 | 27 | | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | 28 | | ![BiliBili](https://www.bilibili.com/favicon.ico?v=1 =100x100) | ![BiliBili](https://www.baidu.com/favicon.ico?v=1 =100x100) | ![BiliBili](https://security.tencent.com/static/v2.0/images/favicon.ico) | ![BiliBili](https://security.mafengwo.cn/favicon.ico) | ![BiliBili](https://aq.163.com/favicon.ico) | ![BiliBili](https://sec.fadada.com/icon.ico) | ![BiliBi点点滴滴li](https://security.360.cn/static/img/base/logo-icon.png) | ![BiliBili](https://weibo.com/favicon.ico) | ![BiliBili](https://www.butian.net/favicon.ico) | ![BiliBili](https://b0.beicdn.com/img/favicon.ico) | 29 | 30 | # 版权说明 31 | 32 | 本博客所有文章除特别声明外,均采用「 [知识共享署名4.0](https://creativecommons.org/licenses/by/4.0/) 」创作共享协议。通俗地讲,只要在使用时署名,那么使用者可以对本站所有原创内容进行转载、节选、混编、二次创作,允许商业性使用。如有其他侵权请联系删除。 -------------------------------------------------------------------------------- /ShangzengBlog/arctales/friends.html: -------------------------------------------------------------------------------- 1 | # 朋友们 2 | 3 | * [7i4n2h3n9](http://blog.tianzheng.cool/) 》》 二进制方向的鸽子精 4 | * [shawroot ](https://www.shawroot.cc/) 》》 做CTF的妹子 5 | * [purplet ](http://purplet.top/) 》》 憨憨的红队带佬 6 | 7 | 8 | # 值得一看的链接 9 | 10 | * 鸽子精编写爬虫中 》》进度0.2% 11 | * [Security Blog ](https://github.com/shangzeng/SecurityBlog) 》》在写出来之前可以看看这个~ 12 | 13 | # 版权说明 14 | 15 | 本博客所有文章除特别声明外,均采用「 [知识共享署名4.0](https://creativecommons.org/licenses/by/4.0/) 」创作共享协议。通俗地讲,只要在使用时署名,那么使用者可以对本站所有原创内容进行转载、节选、混编、二次创作,允许商业性使用。如有其他侵权请联系删除。 -------------------------------------------------------------------------------- /ShangzengBlog/conf/app.conf: -------------------------------------------------------------------------------- 1 | appname = ShangzengBlog 2 | httpport = 80 3 | runmode = dev 4 | DNSlogToke = jljcxy@stu 5 | CeyeToken = 597a2b94b1816bf0638574399daa24dd 6 | Views = 1001 7 | 8 | 9 | -------------------------------------------------------------------------------- /ShangzengBlog/controllers/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shangzeng/GolangTools/68e02ea6ad9a407f44efeeb3aee4ed77584ddadf/ShangzengBlog/controllers/.DS_Store -------------------------------------------------------------------------------- /ShangzengBlog/controllers/articleshow.go: -------------------------------------------------------------------------------- 1 | package controllers 2 | 3 | import ( 4 | "bufio" 5 | "github.com/astaxie/beego" 6 | "github.com/russross/blackfriday" 7 | "io/ioutil" 8 | "os" 9 | "sort" 10 | "strconv" 11 | "strings" 12 | "fmt" 13 | ) 14 | 15 | 16 | 17 | type MainController struct { 18 | beego.Controller 19 | } 20 | 21 | // 自我介绍页面 AboutMe 22 | func (c *MainController) AboutMe() { 23 | AddViews() 24 | fileread, _ := ioutil.ReadFile("arctales/about.html") 25 | unsafe := blackfriday.MarkdownCommon(fileread) 26 | c.Data["Content"] = string(unsafe) 27 | c.Data["Number"] = lognumber() 28 | c.TplName = "page.html" 29 | } 30 | 31 | // 友链 Friends 32 | func (c *MainController) Friends() { 33 | AddViews() 34 | fileread, _ := ioutil.ReadFile("arctales/friends.html") 35 | unsafe := blackfriday.MarkdownCommon(fileread) 36 | c.Data["Content"] = string(unsafe) 37 | c.Data["Number"] = lognumber() 38 | c.TplName = "page.html" 39 | } 40 | 41 | // 写类型,用于存储文章名 文章时间 文章标签 42 | type ArctlsInfo struct { 43 | Name string // 文件名字 44 | ArcName string // 文章标题 45 | Time string // 文章编写时间 46 | Tag string // 文章标签 47 | Information string // 文章介绍信息 48 | } 49 | 50 | // 获取信息 51 | // 在这里最好还要根据时间把文章进行排名 52 | func GetArctlsInfo() []ArctlsInfo { 53 | var ArctlsInfos []ArctlsInfo 54 | for _, filename := range findarctlename() { 55 | fileread, _ := ioutil.ReadFile("arctales/"+filename+".md") 56 | title := strings.Split(string(fileread), "--------")[0] 57 | titleline := strings.Split(title, ":") 58 | ArctlsInfos= append(ArctlsInfos,ArctlsInfo{Name:filename,Time:titleline[1],Tag:titleline[2],Information:titleline[3],ArcName:titleline[4]}) 59 | fmt.Println(ArctlsInfos) 60 | } 61 | // 文章按照时间顺序进行排序 62 | sort.SliceStable(ArctlsInfos, func(i, j int) bool { 63 | return ArctlsInfos[i].Time > ArctlsInfos[j].Time 64 | }) 65 | return ArctlsInfos 66 | } 67 | 68 | //尝试显示首页的展示 69 | func (c *MainController) Index() { 70 | var ( 71 | page int // 页面设置 72 | //number int // 浏览量设置 73 | ) 74 | // GetInt 是beego中的函数,在默认无的情况下为 1 , 这里主要用于限制页面刷领 75 | if page, _ = c.GetInt("page"); page < 1 { 76 | page = 1 77 | } 78 | 79 | AddViews() 80 | c.Data["CurrentPage"] = page 81 | c.Data["Len"] = len(GetArctlsInfo()) 82 | c.Data["Title"] = "Shangzeng's blog" 83 | c.Data["Number"] = lognumber() 84 | c.Data["Data"] = GetArctlsInfo() 85 | c.TplName = "index.html" 86 | } 87 | 88 | 89 | 90 | 91 | 92 | // 拆解成为两种: 一个函数记录浏览量并写入 配置文件 一个函数读取 93 | // 查看日志浏览量 94 | func lognumber() int { 95 | file, _ := os.Open("view") 96 | fileScanner := bufio.NewScanner(file) 97 | var lines []string 98 | for fileScanner.Scan() { 99 | lines = append(lines, fileScanner.Text()) 100 | } 101 | intVar, _ := strconv.Atoi(lines[0]) 102 | //保存浏览量并输出 103 | return intVar 104 | } 105 | // 增加日志量 106 | func AddViews() { 107 | add := lognumber() + 1 108 | tracefile(strconv.Itoa(add)) 109 | } 110 | func tracefile(str_content string) { 111 | fd,_:=os.OpenFile("view",os.O_WRONLY|os.O_TRUNC|os.O_APPEND,0644) 112 | fd_content:=str_content 113 | buf:=[]byte(fd_content) 114 | fd.Write(buf) 115 | fd.Close() 116 | } 117 | 118 | // 遍历获取 arctales 文件夹中以 md 结尾的文件名 ,准备输出到首页上 119 | func findarctlename() (files []string){ 120 | file, err := ioutil.ReadDir("arctales") 121 | if err != nil { 122 | beego.Info(err) 123 | } 124 | for _, file := range file { 125 | //判断是否是md 文件 126 | if strings.Index(file.Name(), ".md") > -1 { 127 | //fmt.Println(strings.Trim(file.Name(),".md")) 128 | files = append(files,strings.Trim(file.Name(),".md")) 129 | } 130 | } 131 | return files 132 | } 133 | 134 | // 寻找文件是否正确 135 | func findarctleconnect(name string) (bool) { 136 | file, err := ioutil.ReadDir("arctales") 137 | if err != nil { 138 | beego.Info(err) 139 | } 140 | for _, file := range file { 141 | if file.Name() == name { 142 | return true 143 | } 144 | } 145 | return false 146 | } 147 | 148 | // 并返回 md 内容 149 | func readarctleconnect(name string) (file string) { 150 | fileread, _ := ioutil.ReadFile("arctales/"+name) 151 | title := strings.Split(string(fileread), "--------")[1] 152 | unsafe := blackfriday.MarkdownCommon([]byte(title)) 153 | // 内容处理下 , "---" 之前的不要了 154 | //fmt.Println(string(unsafe)) 155 | return string(unsafe) 156 | } 157 | 158 | // 实现动态解析分析 ArticleInfo 159 | func (c *MainController) ArticleInfo() { 160 | AddViews() 161 | slug := c.Ctx.Input.Param(":slug")+".md" 162 | // 根据 slug 读取 相关的 md 文件代码, 如果不存在返回 404 163 | // 先判断文件是是否存在 164 | if findarctleconnect(slug) { 165 | c.Data["Content"] = readarctleconnect(slug) 166 | c.Data["Title"] = check(slug).ArcName 167 | c.Data["Time"] = check(slug).Time 168 | c.Data["Tag"] = check(slug).Tag 169 | c.Data["Information"] = check(slug).Information 170 | c.Data["Number"] = lognumber() 171 | c.TplName = "article.html" 172 | return 173 | } 174 | c.TplName = "404.html" 175 | } 176 | 177 | // 循环判断GetArctlsInfo() 中内容返回合适的 178 | func check(filename string ) ArctlsInfo { 179 | for _, name := range GetArctlsInfo() { 180 | if name.Name+".md" == filename { 181 | return name 182 | } 183 | } 184 | return ArctlsInfo{} 185 | } 186 | 187 | // 文章分类展示 Categories 188 | func (c *MainController) Categories() { 189 | AddViews() 190 | tag := c.Ctx.Input.Param(":link") 191 | // 搜索包含关键词的所有文章 192 | //frintln(checkTag(tag)) 193 | c.Data["Tag"] = tag 194 | c.Data["Data"] = checkTag(tag) 195 | c.Data["Number"] = lognumber() 196 | c.TplName = "category.html" 197 | } 198 | 199 | // 循环判断GetArctlsInfo() 中内容返回合适的 tag 200 | func checkTag(tag string ) []ArctlsInfo { 201 | var TagArctlsInfo []ArctlsInfo 202 | for _, name := range GetArctlsInfo() { 203 | if name.Tag == tag { 204 | //return name 205 | TagArctlsInfo = append(TagArctlsInfo ,name) 206 | } 207 | } 208 | return TagArctlsInfo 209 | } 210 | 211 | -------------------------------------------------------------------------------- /ShangzengBlog/controllers/dnslog.go: -------------------------------------------------------------------------------- 1 | package controllers 2 | 3 | import ( 4 | "encoding/json" 5 | "fmt" 6 | "github.com/astaxie/beego" 7 | "io/ioutil" 8 | "math/rand" 9 | "net/http" 10 | "strconv" 11 | "time" 12 | ) 13 | 14 | type DNSController struct { 15 | beego.Controller 16 | } 17 | 18 | type Autogenerated struct { 19 | Meta struct { 20 | Code int `json:"code"` 21 | Message string `json:"message"` 22 | } `json:"meta"` 23 | Data []struct { 24 | ID string `json:"id"` 25 | Name string `json:"name"` 26 | RemoteAddr string `json:"remote_addr"` 27 | CreatedAt string `json:"created_at"` 28 | } `json:"data"` 29 | } 30 | 31 | 32 | func (c *DNSController) Index() { 33 | if c.GetString("token") == beego.AppConfig.String("DNSlogToke") { 34 | domain ,_ := c.GetInt("domainname") 35 | strdomain := strconv.Itoa(domain) 36 | if strdomain != "0" { 37 | c.Data["Domainname"] = strdomain 38 | // 解析返回请求 39 | var ReqJson Autogenerated 40 | errs := json.Unmarshal(GetCeyeData(strdomain), &ReqJson) 41 | if errs != nil { 42 | fmt.Println(errs) 43 | } 44 | c.Data["DomainInfo"] = ReqJson.Data 45 | c.Data["Token"] = c.GetString("token") 46 | c.TplName = "dnslog.html" 47 | return 48 | } else { 49 | // 这里是获取域名信息 输出一个随机的三级域名 50 | c.Data["Domainname"] = CreateCaptcha() 51 | c.Data["Token"] = c.GetString("token") 52 | c.TplName = "dnslog.html" 53 | return 54 | } 55 | } else { 56 | c.Ctx.Redirect(302, "/") 57 | } 58 | } 59 | 60 | // 刷新记录获取 61 | func GetCeyeData(filter string) []byte { 62 | //http://api.ceye.io/v1/records\?token\=597a2b94b1816bf0638574399daa24d3\&type\=dns\&filter\=jljcxy 63 | CeyeToken := beego.AppConfig.String("CeyeToken") 64 | RequesrUrl := "http://api.ceye.io/v1/records?token="+CeyeToken+"&type=dns&filter="+filter 65 | resp, err := http.Get(RequesrUrl) 66 | if err != nil { 67 | fmt.Println("HTTP GET ",err) 68 | } 69 | defer resp.Body.Close() 70 | body, _ := ioutil.ReadAll(resp.Body) 71 | //fmt.Println(string(body)) 72 | return body 73 | } 74 | 75 | // 生成六位随机数字 76 | func CreateCaptcha() string { 77 | return fmt.Sprintf("%06v", rand.New(rand.NewSource(time.Now().UnixNano())).Int31n(1000000)) 78 | } 79 | -------------------------------------------------------------------------------- /ShangzengBlog/controllers/feed.go: -------------------------------------------------------------------------------- 1 | package controllers 2 | 3 | import ( 4 | "github.com/astaxie/beego" 5 | "github.com/gorilla/feeds" 6 | "time" 7 | ) 8 | 9 | type FeedController struct { 10 | beego.Controller 11 | } 12 | 13 | 14 | func (c *FeedController) Index() { 15 | now := time.Now() 16 | feed := &feeds.Feed{ 17 | Title: "shangzeng blog", 18 | Link: &feeds.Link{Href: "http://shangzeng.club"}, 19 | Description: "discussion about security, photos", 20 | Author: &feeds.Author{Name: "shangzeng", Email: "shang_zeng@foxmail.com"}, 21 | Created: now, 22 | } 23 | lennum := len(GetArctlsInfo()) 24 | for i:=0;ili{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-signing:before,.fa-sign-language:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.fa-handshake-o:before{content:"\f2b5"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-o:before{content:"\f2b7"}.fa-linode:before{content:"\f2b8"}.fa-address-book:before{content:"\f2b9"}.fa-address-book-o:before{content:"\f2ba"}.fa-vcard:before,.fa-address-card:before{content:"\f2bb"}.fa-vcard-o:before,.fa-address-card-o:before{content:"\f2bc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-circle-o:before{content:"\f2be"}.fa-user-o:before{content:"\f2c0"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\f2c3"}.fa-quora:before{content:"\f2c4"}.fa-free-code-camp:before{content:"\f2c5"}.fa-telegram:before{content:"\f2c6"}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-shower:before{content:"\f2cc"}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:"\f2cd"}.fa-podcast:before{content:"\f2ce"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-times-rectangle:before,.fa-window-close:before{content:"\f2d3"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\f2d4"}.fa-bandcamp:before{content:"\f2d5"}.fa-grav:before{content:"\f2d6"}.fa-etsy:before{content:"\f2d7"}.fa-imdb:before{content:"\f2d8"}.fa-ravelry:before{content:"\f2d9"}.fa-eercast:before{content:"\f2da"}.fa-microchip:before{content:"\f2db"}.fa-snowflake-o:before{content:"\f2dc"}.fa-superpowers:before{content:"\f2dd"}.fa-wpexplorer:before{content:"\f2de"}.fa-meetup:before{content:"\f2e0"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto} -------------------------------------------------------------------------------- /ShangzengBlog/static/css/md02.css: -------------------------------------------------------------------------------- 1 | html{font-size:62.5%;-webkit-text-size-adjust:none;} 2 | body,h1,h2,h3,h4,h5,h6,hr,p,dl,dt,dd,ul,ol,li,form,fieldset,input,label,table,td,th{margin:0;padding:0;font-weight:normal;} 3 | body,input,textarea,button,td{-webkit-text-size-adjust:none;} 4 | table{text-align: center;margin:0 auto;} 5 | a{text-decoration:none;} 6 | em,i,s{font-style:normal;} 7 | table{border-collapse:collapse;} 8 | td{empty-cells:show;} 9 | button{border:0;} 10 | i,cite{font-style:normal;} 11 | input[type="text"],input[type="number"],input[type="password"],input[type="button"]{-webkit-appearance:none;} 12 | input::-webkit-input-placeholder {color:#b6b6b6;} 13 | :-moz-placeholder {color:#b6b6b6;} 14 | ::-moz-placeholder {color:#b6b6b6;} 15 | a,img,button,input,textarea{-webkit-tap-highlight-color:rgba(255,255,255,0);} 16 | input,textare{-webkit-appearance:none;border-radius:0;} 17 | .fix{clear:both;float:none;height:1px;width:100%;line-height:1px;} 18 | body{width:98%;margin:10px auto;} 19 | 20 | @font-face { 21 | font-family: fontawesome-mini; 22 | src: url(data:font/woff;charset=utf-8;base64,d09GRgABAAAAAAzUABAAAAAAFNgAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABGRlRNAAABbAAAABwAAAAcZMzaOEdERUYAAAGIAAAAHQAAACAAOQAET1MvMgAAAagAAAA+AAAAYHqhde9jbWFwAAAB6AAAAFIAAAFa4azkLWN2dCAAAAI8AAAAKAAAACgFgwioZnBnbQAAAmQAAAGxAAACZVO0L6dnYXNwAAAEGAAAAAgAAAAIAAAAEGdseWYAAAQgAAAFDgAACMz7eroHaGVhZAAACTAAAAAwAAAANgWEOEloaGVhAAAJYAAAAB0AAAAkDGEGa2htdHgAAAmAAAAAEwAAADBEgAAQbG9jYQAACZQAAAAaAAAAGgsICJBtYXhwAAAJsAAAACAAAAAgASgBD25hbWUAAAnQAAACZwAABOD4no+3cG9zdAAADDgAAABsAAAAmF+yXM9wcmVwAAAMpAAAAC4AAAAusPIrFAAAAAEAAAAAyYlvMQAAAADLVHQgAAAAAM/u9uZ4nGNgZGBg4ANiCQYQYGJgBEJuIGYB8xgABMMAPgAAAHicY2Bm42OcwMDKwMLSw2LMwMDQBqGZihmiwHycoKCyqJjB4YPDh4NsDP+BfNb3DIuAFCOSEgUGRgAKDgt4AAB4nGNgYGBmgGAZBkYGEAgB8hjBfBYGCyDNxcDBwMTA9MHhQ9SHrA8H//9nYACyQyFs/sP86/kX8HtB9UIBIxsDXICRCUgwMaACRoZhDwA3fxKSAAAAAAHyAHABJQB/AIEAdAFGAOsBIwC/ALgAxACGAGYAugBNACcA/wCIeJxdUbtOW0EQ3Q0PA4HE2CA52hSzmZDGe6EFCcTVjWJkO4XlCGk3cpGLcQEfQIFEDdqvGaChpEibBiEXSHxCPiESM2uIojQ7O7NzzpkzS8qRqnfpa89T5ySQwt0GzTb9Tki1swD3pOvrjYy0gwdabGb0ynX7/gsGm9GUO2oA5T1vKQ8ZTTuBWrSn/tH8Cob7/B/zOxi0NNP01DoJ6SEE5ptxS4PvGc26yw/6gtXhYjAwpJim4i4/plL+tzTnasuwtZHRvIMzEfnJNEBTa20Emv7UIdXzcRRLkMumsTaYmLL+JBPBhcl0VVO1zPjawV2ys+hggyrNgQfYw1Z5DB4ODyYU0rckyiwNEfZiq8QIEZMcCjnl3Mn+pED5SBLGvElKO+OGtQbGkdfAoDZPs/88m01tbx3C+FkcwXe/GUs6+MiG2hgRYjtiKYAJREJGVfmGGs+9LAbkUvvPQJSA5fGPf50ItO7YRDyXtXUOMVYIen7b3PLLirtWuc6LQndvqmqo0inN+17OvscDnh4Lw0FjwZvP+/5Kgfo8LK40aA4EQ3o3ev+iteqIq7wXPrIn07+xWgAAAAABAAH//wAPeJyFlctvG1UUh+/12DPN1B7P3JnYjj2Ox4/MuDHxJH5N3UdaEUQLqBIkfQQioJWQ6AMEQkIqsPGCPwA1otuWSmTBhjtps2ADWbJg3EpIXbGouqSbCraJw7kzNo2dRN1cnXN1ZvT7zuuiMEI7ncizyA0URofRBJpCdbQuIFShYY+GZRrxMDVtih5TwQPHtXDFFSIKoWIbuREBjLH27Ny4MsbVx+uOJThavebgVrNRLAiYx06rXsvhxLgWx9xpfHdrs/ekc2Pl2cpPCVEITQpwbj8VQhfXSq2m+Wxqaq2D73Kne5e3NjHqQNj3CRYlJlgUl/jRNP+2Gs2pNYRQiOnmUaQDqm30KqKiTTWPWjboxnTWpvgxjXo0KrtZXAHt7hwIz0YVcj88JnKlJKi3NPAwLyDwZudSmJSMMJFDYaOkaol6XtESx3Gt1VTytdZJ3DCLeaVhVnCBH1fycHTxFXwPX+l2e3d6H/TufGGmMTLTnbSJUdo00zuBswMO/nl3YLeL/wnu9/limCuD3vC54h5NBVz6Li414AI8Vx3iiosKcQXUbrvhFFiYb++HN4DaF4XzFW0fIN4XDWJ3a3XQoq9V8WiyRmdsatV9xUcHims1JloH0YUa090G3Tro3mC6c01f+YwCPquINr1PTaCP6rVTOOmf0GE2dBc7zWIhji3/5MchSuBHgDbU99RMWt3YUNMZMJmx92YP6NsHx/5/M1yvInpnkIOM3Z8fA3JQ2lW1RFC1KaBPDFXNAHYYvGy73aYZZZ3HifbeuiVZCpwA3oQBs0wGPYJbJfg60xrKEbKiNtTe1adwrpBRwlAuQ3q3VRaX0QmQ9a49BTSCuF1MLfQ6+tinOubRBZuWPNoMevGMT+V41KitO1is3D/tpMcq1JHZqDHGs8DoYGDkxJgKjHROeTCmhZvzPm9pod+ltKm4PN7Dyvvldlpsg8D+4AUJZ3F/JBstZz7cbFRxsaAGV6yX/dkcycWf8eS3QlQea+YLjdm3yrOnrhFpUyKVvFE4lpv4bO3Svx/6F/4xmiDu/RT5iI++lko18mY1oX+5UGKR6kmVjM/Zb76yfHtxy+h/SyQ0lLdpdKy/lWB6szatetQJ8nZ80A2Qt6ift6gJeavU3BO4gtxs/KCtNPVibCtYCWY3SIlSBPKXZALXiIR9oZeJ1AuMyxLpHIy/yO7vSiSE+kZvk0ihJ30HgHfzZtEMmvV58x6dtqns0XTAW7Vdm4HJ04OCp/crOO7rd9SGxQAE/mVA9xRN+kVSMRFF6S9JFGUtthkjBA5tFCWc2l4V43Ex9GmUP3SI37Jjmir9KqlaDJ4S4JB3vuM/jzyH1+8MuoZ+QGzfnvPoJb96cZlWjMcKLfgDwB7E634JTY+asjsPzS5CiVnEWY+KsrsIN5rn3mAPjqmQBxGjcGKB9f9ZxY3mYC2L85CJ2FXIxKKyHk+dg0FHbuEc7D5NzWUX32WxFcWNGRAbvwSx0RmIXVDuYySafluQBmzA/ssqJAMLnli+WIC90Gw4lm85wcp0qjArEDPJJV/sSx4P9ungTpgMw5gVC1XO4uULq0s3v1rqLi0vX/z65vlH50f8T/RHmSPTk5xxWBWOluMT6WiOy+tdvWxlV/XQb3o3c6Ssr+r6I708GsX9/nzp1tKFh0s3v7m4vAy/Hnb/KMOvc1wump6Il48K6mGDy02X9Yd65pa+nQIjk76lWxCkG8NBCP0HQS9IpAAAeJxjYGRgYGBhcCrq214Qz2/zlUGenQEEzr/77oug/zewFbB+AHI5GJhAogBwKQ0qeJxjYGRgYH3/P46BgZ0BBNgKGBgZUAEPAE/7At0AAAB4nGNngAB2IGYjhBsYBAAIYADVAAAAAAAAAAAAAFwAyAEeAaACCgKmAx4DggRmAAAAAQAAAAwAagAEAAAAAAACAAEAAgAWAAABAAChAAAAAHiclZI7bxQxFIWPd/JkUYQChEhIyAVKgdBMskm1QkKrRETpQiLRUczueB/K7HhlOxttg8LvoKPgP9DxFxANDR0tHRWi4NjrPIBEgh1p/dm+vufcawNYFWsQmP6e4jSyQB2fI9cwj++RE9wTjyPP4LYoI89iWbyLPIe6+Bh5Hs9rryMv4GbtW+RF3EhuRa7jbrIbeQkPkjdUETOLnL0Kip4FVvAhco1RXyMnSPEz8gzWxE7kWTwUp5HnsCLeR57HW/El8gJWa58iL+JO7UfkOh4l9yMv4UnyEtvQGGECgwF66MNBooF1bGCL1ELB/TYU+ZBRlvsKQ44Se6jQ4a7hef+fh72Crv25kp+8lNWGmeKoOI5jJLb1aGIGvb6TjfWNLdkqdFvJw4l1amjlXtXRZqRN7lSRylZZyhBqpVFWmTEXgWfUrpi/hZOQXdOd4rKuXOtEWT3k5IArPRzTUU5tHKjecZkTpnVbNOnt6jzN8240GD4xtikvZW56043rPMg/dS+dlOceXoR+WPbJ55Dsekq1lJpnypsMUsYOdCW30o103Ytu/lvh+5RWFLfBjm9/N8hJntPhvx92rnoE/kyHdGasGy754kw36vsVf/lFeBi+0COu+cfgQr42G3CRpeLoZ53gmfe3X6rcKt5oVxnptHR9JS8ehVUd5wvvahN2uqxOOpMXapibI5k7Zwbt4xBSaTfoKBufhAnO/uqNcfK8OTs0OQ6l7JIqFjDhYj5WcjevCnI/1DDiI8j4ndWb/5YzDZWh79yomWXeXj7Nnw70/2TIeFPTrlSh89k1ObOSRVZWZfgF0r/zJQB4nG2JUQuCQBCEd07TTg36fb2IyBaLd3vWaUh/vmSJnvpgmG8YcmS8X3Shf3R7QA4OBUocUKHGER5NNbOOEvwc1txnuWkTRb/aPjimJ5vXabI+3VfOiyS15UWvyezM2xiGOPyuMohOH8O8JiO4Af+FsAGNAEuwCFBYsQEBjlmxRgYrWCGwEFlLsBRSWCGwgFkdsAYrXFhZsBQrAAA=) format('woff'); 23 | } 24 | 25 | 26 | .markdown-body { 27 | padding: 15px; 28 | border: 1px solid #ddd; 29 | border-radius: 5px; 30 | font-family: sans-serif; 31 | -ms-text-size-adjust: 100%; 32 | -webkit-text-size-adjust: 100%; 33 | color: #333333; 34 | overflow: hidden; 35 | font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, freesans, sans-serif; 36 | font-size: 16px; 37 | line-height: 1.8; 38 | word-wrap: break-word; 39 | } 40 | 41 | .markdown-body a { 42 | background: transparent; 43 | } 44 | 45 | .markdown-body a:active, 46 | .markdown-body a:hover { 47 | outline: 0; 48 | } 49 | 50 | .markdown-body b, 51 | .markdown-body strong { 52 | font-weight: bold; 53 | } 54 | 55 | .markdown-body mark { 56 | background: #ff0; 57 | color: #000; 58 | font-style: italic; 59 | font-weight: bold; 60 | } 61 | 62 | .markdown-body sub, 63 | .markdown-body sup { 64 | font-size: 75%; 65 | line-height: 0; 66 | position: relative; 67 | vertical-align: baseline; 68 | } 69 | .markdown-body sup { 70 | top: -0.5em; 71 | } 72 | .markdown-body sub { 73 | bottom: -0.25em; 74 | } 75 | 76 | .markdown-body h1 { 77 | font-size: 2em; 78 | margin: 0.67em 0; 79 | } 80 | 81 | .markdown-body img { 82 | border: 0; 83 | } 84 | 85 | .markdown-body hr { 86 | -moz-box-sizing: content-box; 87 | box-sizing: content-box; 88 | height: 0; 89 | } 90 | 91 | .markdown-body pre { 92 | overflow: auto; 93 | } 94 | 95 | .markdown-body code, 96 | .markdown-body kbd, 97 | .markdown-body pre, 98 | .markdown-body samp { 99 | font-family: monospace, monospace; 100 | font-size: 1em; 101 | } 102 | 103 | .markdown-body input { 104 | color: inherit; 105 | font: inherit; 106 | margin: 0; 107 | } 108 | 109 | .markdown-body html input[disabled] { 110 | cursor: default; 111 | } 112 | 113 | .markdown-body input { 114 | line-height: normal; 115 | } 116 | 117 | .markdown-body input[type="checkbox"] { 118 | box-sizing: border-box; 119 | padding: 0; 120 | } 121 | 122 | .markdown-body table { 123 | border-collapse: collapse; 124 | border-spacing: 0; 125 | } 126 | 127 | .markdown-body td, 128 | .markdown-body th { 129 | padding: 0; 130 | } 131 | 132 | .markdown-body .codehilitetable { 133 | border: 0; 134 | border-spacing: 0; 135 | } 136 | 137 | .markdown-body .codehilitetable tr { 138 | border: 0; 139 | } 140 | 141 | .markdown-body .codehilitetable pre, 142 | .markdown-body .codehilitetable div.codehilite { 143 | margin: 0; 144 | } 145 | 146 | .markdown-body .linenos, 147 | .markdown-body .code, 148 | .markdown-body .codehilitetable td { 149 | border: 0; 150 | padding: 0; 151 | } 152 | 153 | .markdown-body td:not(.linenos) .linenodiv { 154 | padding: 0 !important; 155 | } 156 | 157 | .markdown-body .code { 158 | width: 100%; 159 | } 160 | 161 | .markdown-body .linenos div pre, 162 | .markdown-body .linenodiv pre, 163 | .markdown-body .linenodiv { 164 | border: 0; 165 | -webkit-border-radius: 0; 166 | -moz-border-radius: 0; 167 | border-radius: 0; 168 | -webkit-border-top-left-radius: 3px; 169 | -webkit-border-bottom-left-radius: 3px; 170 | -moz-border-radius-topleft: 3px; 171 | -moz-border-radius-bottomleft: 3px; 172 | border-top-left-radius: 3px; 173 | border-bottom-left-radius: 3px; 174 | } 175 | 176 | .markdown-body .code div pre, 177 | .markdown-body .code div { 178 | border: 0; 179 | -webkit-border-radius: 0; 180 | -moz-border-radius: 0; 181 | border-radius: 0; 182 | -webkit-border-top-right-radius: 3px; 183 | -webkit-border-bottom-right-radius: 3px; 184 | -moz-border-radius-topright: 3px; 185 | -moz-border-radius-bottomright: 3px; 186 | border-top-right-radius: 3px; 187 | border-bottom-right-radius: 3px; 188 | } 189 | 190 | .markdown-body * { 191 | -moz-box-sizing: border-box; 192 | box-sizing: border-box; 193 | } 194 | 195 | .markdown-body input { 196 | font: 13px Helvetica, arial, freesans, clean, sans-serif, "Segoe UI Emoji", "Segoe UI Symbol"; 197 | line-height: 1.4; 198 | } 199 | 200 | .markdown-body a { 201 | color: #4183c4; 202 | text-decoration: none; 203 | } 204 | 205 | .markdown-body a:hover, 206 | .markdown-body a:focus, 207 | .markdown-body a:active { 208 | text-decoration: underline; 209 | } 210 | 211 | .markdown-body hr { 212 | height: 0; 213 | margin: 15px 0; 214 | overflow: hidden; 215 | background: transparent; 216 | border: 0; 217 | border-bottom: 1px solid #ddd; 218 | } 219 | 220 | .markdown-body hr:before, 221 | .markdown-body hr:after { 222 | display: table; 223 | content: " "; 224 | } 225 | 226 | .markdown-body hr:after { 227 | clear: both; 228 | } 229 | 230 | .markdown-body h1, 231 | .markdown-body h2, 232 | .markdown-body h3, 233 | .markdown-body h4, 234 | .markdown-body h5, 235 | .markdown-body h6 { 236 | margin-top: 15px; 237 | margin-bottom: 15px; 238 | line-height: 1.1; 239 | } 240 | 241 | .markdown-body h1 { 242 | font-size: 30px; 243 | } 244 | 245 | .markdown-body h2 { 246 | font-size: 21px; 247 | } 248 | 249 | .markdown-body h3 { 250 | font-size: 16px; 251 | } 252 | 253 | .markdown-body h4 { 254 | font-size: 14px; 255 | } 256 | 257 | .markdown-body h5 { 258 | font-size: 12px; 259 | } 260 | 261 | .markdown-body h6 { 262 | font-size: 11px; 263 | } 264 | 265 | .markdown-body blockquote { 266 | margin: 0; 267 | } 268 | 269 | .markdown-body ul, 270 | .markdown-body ol { 271 | padding: 0; 272 | margin-top: 0; 273 | margin-bottom: 0; 274 | } 275 | 276 | .markdown-body ol ol, 277 | .markdown-body ul ol { 278 | list-style-type: lower-roman; 279 | } 280 | 281 | .markdown-body ul ul ol, 282 | .markdown-body ul ol ol, 283 | .markdown-body ol ul ol, 284 | .markdown-body ol ol ol { 285 | list-style-type: lower-alpha; 286 | } 287 | 288 | .markdown-body dd { 289 | margin-left: 0; 290 | } 291 | 292 | .markdown-body code, 293 | .markdown-body pre, 294 | .markdown-body samp { 295 | font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; 296 | font-size: 12px; 297 | } 298 | 299 | .markdown-body pre { 300 | margin-top: 0; 301 | margin-bottom: 0; 302 | } 303 | 304 | .markdown-body kbd { 305 | background-color: #e7e7e7; 306 | background-image: -moz-linear-gradient(#fefefe, #e7e7e7); 307 | background-image: -webkit-linear-gradient(#fefefe, #e7e7e7); 308 | background-image: linear-gradient(#fefefe, #e7e7e7); 309 | background-repeat: repeat-x; 310 | border-radius: 2px; 311 | border: 1px solid #cfcfcf; 312 | color: #000; 313 | padding: 3px 5px; 314 | line-height: 10px; 315 | font: 11px Consolas, "Liberation Mono", Menlo, Courier, monospace; 316 | display: inline-block; 317 | } 318 | 319 | .markdown-body>*:first-child { 320 | margin-top: 0 !important; 321 | } 322 | 323 | .markdown-body>*:last-child { 324 | margin-bottom: 0 !important; 325 | } 326 | 327 | .markdown-body .headeranchor-link { 328 | position: absolute; 329 | top: 0; 330 | bottom: 0; 331 | left: 0; 332 | display: block; 333 | padding-right: 6px; 334 | padding-left: 30px; 335 | margin-left: -30px; 336 | } 337 | 338 | .markdown-body .headeranchor-link:focus { 339 | outline: none; 340 | } 341 | 342 | .markdown-body h1, 343 | .markdown-body h2, 344 | .markdown-body h3, 345 | .markdown-body h4, 346 | .markdown-body h5, 347 | .markdown-body h6 { 348 | position: relative; 349 | margin-top: 1em; 350 | margin-bottom: 16px; 351 | font-weight: bold; 352 | line-height: 1.4; 353 | } 354 | 355 | .markdown-body h1 .headeranchor, 356 | .markdown-body h2 .headeranchor, 357 | .markdown-body h3 .headeranchor, 358 | .markdown-body h4 .headeranchor, 359 | .markdown-body h5 .headeranchor, 360 | .markdown-body h6 .headeranchor { 361 | display: none; 362 | color: #000; 363 | vertical-align: middle; 364 | } 365 | 366 | .markdown-body h1:hover .headeranchor-link, 367 | .markdown-body h2:hover .headeranchor-link, 368 | .markdown-body h3:hover .headeranchor-link, 369 | .markdown-body h4:hover .headeranchor-link, 370 | .markdown-body h5:hover .headeranchor-link, 371 | .markdown-body h6:hover .headeranchor-link { 372 | height: 1em; 373 | padding-left: 8px; 374 | margin-left: -30px; 375 | line-height: 1; 376 | text-decoration: none; 377 | } 378 | 379 | .markdown-body h1:hover .headeranchor-link .headeranchor, 380 | .markdown-body h2:hover .headeranchor-link .headeranchor, 381 | .markdown-body h3:hover .headeranchor-link .headeranchor, 382 | .markdown-body h4:hover .headeranchor-link .headeranchor, 383 | .markdown-body h5:hover .headeranchor-link .headeranchor, 384 | .markdown-body h6:hover .headeranchor-link .headeranchor { 385 | display: inline-block; 386 | } 387 | 388 | .markdown-body h1 { 389 | padding-bottom: 0.3em; 390 | font-size: 2.25em; 391 | line-height: 1.2; 392 | border-bottom: 1px solid #eee; 393 | } 394 | 395 | .markdown-body h2 { 396 | padding-bottom: 0.3em; 397 | font-size: 1.75em; 398 | line-height: 1.225; 399 | border-bottom: 1px solid #eee; 400 | } 401 | 402 | .markdown-body h3 { 403 | font-size: 1.5em; 404 | line-height: 1.43; 405 | } 406 | 407 | .markdown-body h4 { 408 | font-size: 1.25em; 409 | } 410 | 411 | .markdown-body h5 { 412 | font-size: 1em; 413 | } 414 | 415 | .markdown-body h6 { 416 | font-size: 1em; 417 | color: #777; 418 | } 419 | 420 | .markdown-body p, 421 | .markdown-body blockquote, 422 | .markdown-body ul, 423 | .markdown-body ol, 424 | .markdown-body dl, 425 | .markdown-body table, 426 | .markdown-body pre, 427 | .markdown-body .admonition { 428 | margin-top: 0; 429 | margin-bottom: 16px; 430 | } 431 | 432 | .markdown-body hr { 433 | height: 4px; 434 | padding: 0; 435 | margin: 16px 0; 436 | background-color: #e7e7e7; 437 | border: 0 none; 438 | } 439 | 440 | .markdown-body ul, 441 | .markdown-body ol { 442 | padding-left: 2em; 443 | } 444 | 445 | .markdown-body ul ul, 446 | .markdown-body ul ol, 447 | .markdown-body ol ol, 448 | .markdown-body ol ul { 449 | margin-top: 0; 450 | margin-bottom: 0; 451 | } 452 | 453 | .markdown-body li>p { 454 | margin-top: 16px; 455 | } 456 | 457 | .markdown-body dl { 458 | padding: 0; 459 | } 460 | 461 | .markdown-body dl dt { 462 | padding: 0; 463 | margin-top: 16px; 464 | font-size: 1em; 465 | font-style: italic; 466 | font-weight: bold; 467 | } 468 | 469 | .markdown-body dl dd { 470 | padding: 0 16px; 471 | margin-bottom: 16px; 472 | } 473 | 474 | .markdown-body blockquote { 475 | padding: 0 15px; 476 | color: #777; 477 | border-left: 4px solid #ddd; 478 | } 479 | 480 | .markdown-body blockquote>:first-child { 481 | margin-top: 0; 482 | } 483 | 484 | .markdown-body blockquote>:last-child { 485 | margin-bottom: 0; 486 | } 487 | 488 | .markdown-body table { 489 | display: block; 490 | width: 100%; 491 | overflow: auto; 492 | word-break: normal; 493 | word-break: keep-all; 494 | } 495 | 496 | .markdown-body table th { 497 | font-weight: bold; 498 | } 499 | 500 | .markdown-body table th, 501 | .markdown-body table td { 502 | padding: 6px 13px; 503 | border: 1px solid #ddd; 504 | } 505 | 506 | .markdown-body table tr { 507 | background-color: #fff; 508 | border-top: 1px solid #ccc; 509 | } 510 | 511 | .markdown-body table tr:nth-child(2n) { 512 | background-color: #f8f8f8; 513 | } 514 | 515 | .markdown-body img { 516 | max-width: 100%; 517 | -moz-box-sizing: border-box; 518 | box-sizing: border-box; 519 | height:auto;width:auto\9; 520 | overflow: hidden; 521 | } 522 | 523 | .markdown-body code, 524 | .markdown-body samp { 525 | padding: 0; 526 | padding-top: 0.2em; 527 | padding-bottom: 0.2em; 528 | margin: 0; 529 | font-size: 85%; 530 | background-color: rgba(0,0,0,0.04); 531 | border-radius: 3px; 532 | } 533 | 534 | .markdown-body code:before, 535 | .markdown-body code:after { 536 | letter-spacing: -0.2em; 537 | content: "\00a0"; 538 | } 539 | 540 | .markdown-body pre>code { 541 | padding: 0; 542 | margin: 0; 543 | font-size: 100%; 544 | word-break: normal; 545 | white-space: pre; 546 | background: transparent; 547 | border: 0; 548 | } 549 | 550 | .markdown-body .codehilite { 551 | margin-bottom: 16px; 552 | } 553 | 554 | .markdown-body .codehilite pre, 555 | .markdown-body pre { 556 | padding: 16px; 557 | overflow: auto; 558 | font-size: 85%; 559 | line-height: 1.45; 560 | background-color: #f7f7f7; 561 | border-radius: 3px; 562 | } 563 | 564 | .markdown-body .codehilite pre { 565 | margin-bottom: 0; 566 | word-break: normal; 567 | } 568 | 569 | .markdown-body pre { 570 | word-wrap: normal; 571 | } 572 | 573 | .markdown-body pre code { 574 | display: inline; 575 | max-width: initial; 576 | padding: 0; 577 | margin: 0; 578 | overflow: initial; 579 | line-height: inherit; 580 | word-wrap: normal; 581 | background-color: transparent; 582 | border: 0; 583 | } 584 | 585 | .markdown-body pre code:before, 586 | .markdown-body pre code:after { 587 | content: normal; 588 | } 589 | 590 | /* Admonition */ 591 | .markdown-body .admonition { 592 | -webkit-border-radius: 3px; 593 | -moz-border-radius: 3px; 594 | position: relative; 595 | border-radius: 3px; 596 | border: 1px solid #e0e0e0; 597 | border-left: 6px solid #333; 598 | padding: 10px 10px 10px 30px; 599 | } 600 | 601 | .markdown-body .admonition table { 602 | color: #333; 603 | } 604 | 605 | .markdown-body .admonition p { 606 | padding: 0; 607 | } 608 | 609 | .markdown-body .admonition-title { 610 | font-weight: bold; 611 | margin: 0; 612 | } 613 | 614 | .markdown-body .admonition>.admonition-title { 615 | color: #333; 616 | } 617 | 618 | .markdown-body .attention>.admonition-title { 619 | color: #a6d796; 620 | } 621 | 622 | .markdown-body .caution>.admonition-title { 623 | color: #d7a796; 624 | } 625 | 626 | .markdown-body .hint>.admonition-title { 627 | color: #96c6d7; 628 | } 629 | 630 | .markdown-body .danger>.admonition-title { 631 | color: #c25f77; 632 | } 633 | 634 | .markdown-body .question>.admonition-title { 635 | color: #96a6d7; 636 | } 637 | 638 | .markdown-body .note>.admonition-title { 639 | color: #d7c896; 640 | } 641 | 642 | .markdown-body .admonition:before, 643 | .markdown-body .attention:before, 644 | .markdown-body .caution:before, 645 | .markdown-body .hint:before, 646 | .markdown-body .danger:before, 647 | .markdown-body .question:before, 648 | .markdown-body .note:before { 649 | font: normal normal 16px fontawesome-mini; 650 | -moz-osx-font-smoothing: grayscale; 651 | -webkit-user-select: none; 652 | -moz-user-select: none; 653 | -ms-user-select: none; 654 | user-select: none; 655 | line-height: 1.5; 656 | color: #333; 657 | position: absolute; 658 | left: 0; 659 | top: 0; 660 | padding-top: 10px; 661 | padding-left: 10px; 662 | } 663 | 664 | .markdown-body .admonition:before { 665 | content: "\f056\00a0"; 666 | color: 333; 667 | } 668 | 669 | .markdown-body .attention:before { 670 | content: "\f058\00a0"; 671 | color: #a6d796; 672 | } 673 | 674 | .markdown-body .caution:before { 675 | content: "\f06a\00a0"; 676 | color: #d7a796; 677 | } 678 | 679 | .markdown-body .hint:before { 680 | content: "\f05a\00a0"; 681 | color: #96c6d7; 682 | } 683 | 684 | .markdown-body .danger:before { 685 | content: "\f057\00a0"; 686 | color: #c25f77; 687 | } 688 | 689 | .markdown-body .question:before { 690 | content: "\f059\00a0"; 691 | color: #96a6d7; 692 | } 693 | 694 | .markdown-body .note:before { 695 | content: "\f040\00a0"; 696 | color: #d7c896; 697 | } 698 | 699 | .markdown-body .admonition::after { 700 | content: normal; 701 | } 702 | 703 | .markdown-body .attention { 704 | border-left: 6px solid #a6d796; 705 | } 706 | 707 | .markdown-body .caution { 708 | border-left: 6px solid #d7a796; 709 | } 710 | 711 | .markdown-body .hint { 712 | border-left: 6px solid #96c6d7; 713 | } 714 | 715 | .markdown-body .danger { 716 | border-left: 6px solid #c25f77; 717 | } 718 | 719 | .markdown-body .question { 720 | border-left: 6px solid #96a6d7; 721 | } 722 | 723 | .markdown-body .note { 724 | border-left: 6px solid #d7c896; 725 | } 726 | 727 | .markdown-body .admonition>*:first-child { 728 | margin-top: 0 !important; 729 | } 730 | 731 | .markdown-body .admonition>*:last-child { 732 | margin-bottom: 0 !important; 733 | } 734 | 735 | /* progress bar*/ 736 | .markdown-body .progress { 737 | display: block; 738 | width: 300px; 739 | margin: 10px 0; 740 | height: 24px; 741 | -webkit-border-radius: 3px; 742 | -moz-border-radius: 3px; 743 | border-radius: 3px; 744 | background-color: #ededed; 745 | position: relative; 746 | box-shadow: inset -1px 1px 3px rgba(0, 0, 0, .1); 747 | } 748 | 749 | .markdown-body .progress-label { 750 | position: absolute; 751 | text-align: center; 752 | font-weight: bold; 753 | width: 100%; margin: 0; 754 | line-height: 24px; 755 | color: #333; 756 | text-shadow: 1px 1px 0 #fefefe, -1px -1px 0 #fefefe, -1px 1px 0 #fefefe, 1px -1px 0 #fefefe, 0 1px 0 #fefefe, 0 -1px 0 #fefefe, 1px 0 0 #fefefe, -1px 0 0 #fefefe, 1px 1px 2px #000; 757 | -webkit-font-smoothing: antialiased !important; 758 | white-space: nowrap; 759 | overflow: hidden; 760 | } 761 | 762 | .markdown-body .progress-bar { 763 | height: 24px; 764 | float: left; 765 | -webkit-border-radius: 3px; 766 | -moz-border-radius: 3px; 767 | border-radius: 3px; 768 | background-color: #96c6d7; 769 | box-shadow: inset 0 1px 0 rgba(255, 255, 255, .5), inset 0 -1px 0 rgba(0, 0, 0, .1); 770 | background-size: 30px 30px; 771 | background-image: -webkit-linear-gradient( 772 | 135deg, rgba(255, 255, 255, .4) 27%, 773 | transparent 27%, 774 | transparent 52%, rgba(255, 255, 255, .4) 52%, 775 | rgba(255, 255, 255, .4) 77%, 776 | transparent 77%, transparent 777 | ); 778 | background-image: -moz-linear-gradient( 779 | 135deg, 780 | rgba(255, 255, 255, .4) 27%, transparent 27%, 781 | transparent 52%, rgba(255, 255, 255, .4) 52%, 782 | rgba(255, 255, 255, .4) 77%, transparent 77%, 783 | transparent 784 | ); 785 | background-image: -ms-linear-gradient( 786 | 135deg, 787 | rgba(255, 255, 255, .4) 27%, transparent 27%, 788 | transparent 52%, rgba(255, 255, 255, .4) 52%, 789 | rgba(255, 255, 255, .4) 77%, transparent 77%, 790 | transparent 791 | ); 792 | background-image: -o-linear-gradient( 793 | 135deg, 794 | rgba(255, 255, 255, .4) 27%, transparent 27%, 795 | transparent 52%, rgba(255, 255, 255, .4) 52%, 796 | rgba(255, 255, 255, .4) 77%, transparent 77%, 797 | transparent 798 | ); 799 | background-image: linear-gradient( 800 | 135deg, 801 | rgba(255, 255, 255, .4) 27%, transparent 27%, 802 | transparent 52%, rgba(255, 255, 255, .4) 52%, 803 | rgba(255, 255, 255, .4) 77%, transparent 77%, 804 | transparent 805 | ); 806 | } 807 | 808 | .markdown-body .progress-100plus .progress-bar { 809 | background-color: #a6d796; 810 | } 811 | 812 | .markdown-body .progress-80plus .progress-bar { 813 | background-color: #c6d796; 814 | } 815 | 816 | .markdown-body .progress-60plus .progress-bar { 817 | background-color: #d7c896; 818 | } 819 | 820 | .markdown-body .progress-40plus .progress-bar { 821 | background-color: #d7a796; 822 | } 823 | 824 | .markdown-body .progress-20plus .progress-bar { 825 | background-color: #d796a6; 826 | } 827 | 828 | .markdown-body .progress-0plus .progress-bar { 829 | background-color: #c25f77; 830 | } 831 | 832 | .markdown-body .candystripe-animate .progress-bar{ 833 | -webkit-animation: animate-stripes 3s linear infinite; 834 | -moz-animation: animate-stripes 3s linear infinite; 835 | animation: animate-stripes 3s linear infinite; 836 | } 837 | 838 | @-webkit-keyframes animate-stripes { 839 | 0% { 840 | background-position: 0 0; 841 | } 842 | 843 | 100% { 844 | background-position: 60px 0; 845 | } 846 | } 847 | 848 | @-moz-keyframes animate-stripes { 849 | 0% { 850 | background-position: 0 0; 851 | } 852 | 853 | 100% { 854 | background-position: 60px 0; 855 | } 856 | } 857 | 858 | @keyframes animate-stripes { 859 | 0% { 860 | background-position: 0 0; 861 | } 862 | 863 | 100% { 864 | background-position: 60px 0; 865 | } 866 | } 867 | 868 | .markdown-body .gloss .progress-bar { 869 | box-shadow: 870 | inset 0 4px 12px rgba(255, 255, 255, .7), 871 | inset 0 -12px 0 rgba(0, 0, 0, .05); 872 | } 873 | 874 | /* Multimarkdown Critic Blocks */ 875 | .markdown-body .critic_mark { 876 | background: #ff0; 877 | } 878 | 879 | .markdown-body .critic_delete { 880 | color: #c82829; 881 | text-decoration: line-through; 882 | } 883 | 884 | .markdown-body .critic_insert { 885 | color: #718c00 ; 886 | text-decoration: underline; 887 | } 888 | 889 | .markdown-body .critic_comment { 890 | color: #8e908c; 891 | font-style: italic; 892 | } 893 | 894 | .markdown-body .headeranchor { 895 | font: normal normal 16px octicons-anchor; 896 | line-height: 1; 897 | display: inline-block; 898 | text-decoration: none; 899 | -webkit-font-smoothing: antialiased; 900 | -moz-osx-font-smoothing: grayscale; 901 | -webkit-user-select: none; 902 | -moz-user-select: none; 903 | -ms-user-select: none; 904 | user-select: none; 905 | } 906 | 907 | .headeranchor:before { 908 | content: '\f05c'; 909 | } 910 | 911 | .markdown-body .task-list-item { 912 | list-style-type: none; 913 | } 914 | 915 | .markdown-body .task-list-item+.task-list-item { 916 | margin-top: 3px; 917 | } 918 | 919 | .markdown-body .task-list-item input { 920 | margin: 0 4px 0.25em -20px; 921 | vertical-align: middle; 922 | } 923 | 924 | /* Media */ 925 | @media only screen and (min-width: 480px) { 926 | .markdown-body { 927 | font-size:14px; 928 | } 929 | } 930 | 931 | @media only screen and (min-width: 768px) { 932 | .markdown-body { 933 | font-size:16px; 934 | } 935 | } 936 | 937 | @media print { 938 | .markdown-body * { 939 | background: transparent !important; 940 | color: black !important; 941 | filter:none !important; 942 | -ms-filter: none !important; 943 | } 944 | 945 | .markdown-body { 946 | font-size:12pt; 947 | max-width:100%; 948 | outline:none; 949 | border: 0; 950 | } 951 | 952 | .markdown-body a, 953 | .markdown-body a:visited { 954 | text-decoration: underline; 955 | } 956 | 957 | .markdown-body .headeranchor-link { 958 | display: none; 959 | } 960 | 961 | .markdown-body a[href]:after { 962 | content: " (" attr(href) ")"; 963 | } 964 | 965 | .markdown-body abbr[title]:after { 966 | content: " (" attr(title) ")"; 967 | } 968 | 969 | .markdown-body .ir a:after, 970 | .markdown-body a[href^="javascript:"]:after, 971 | .markdown-body a[href^="#"]:after { 972 | content: ""; 973 | } 974 | 975 | .markdown-body pre { 976 | white-space: pre; 977 | white-space: pre-wrap; 978 | word-wrap: break-word; 979 | } 980 | 981 | .markdown-body pre, 982 | .markdown-body blockquote { 983 | border: 1px solid #999; 984 | padding-right: 1em; 985 | page-break-inside: avoid; 986 | } 987 | 988 | .markdown-body .progress, 989 | .markdown-body .progress-bar { 990 | -moz-box-shadow: none; 991 | -webkit-box-shadow: none; 992 | box-shadow: none; 993 | } 994 | 995 | .markdown-body .progress { 996 | border: 1px solid #ddd; 997 | } 998 | 999 | .markdown-body .progress-bar { 1000 | height: 22px; 1001 | border-right: 1px solid #ddd; 1002 | } 1003 | 1004 | .markdown-body tr, 1005 | .markdown-body img { 1006 | page-break-inside: avoid; 1007 | } 1008 | 1009 | .markdown-body img { 1010 | max-width: 100% !important; 1011 | } 1012 | 1013 | .markdown-body p, 1014 | .markdown-body h2, 1015 | .markdown-body h3 { 1016 | orphans: 3; 1017 | widows: 3; 1018 | } 1019 | 1020 | .markdown-body h2, 1021 | .markdown-body h3 { 1022 | page-break-after: avoid; 1023 | } 1024 | } 1025 | 1026 | -------------------------------------------------------------------------------- /ShangzengBlog/static/css/style.css: -------------------------------------------------------------------------------- 1 | @charset "UTF-8"; 2 | 3 | * { 4 | -webkit-box-sizing: border-box; 5 | -moz-box-sizing: border-box; 6 | box-sizing: border-box; 7 | margin: 0; 8 | padding: 0; 9 | border: 0; 10 | -webkit-font-smoothing: antialiased; 11 | -moz-osx-font-smoothing: grayscale; 12 | } 13 | 14 | *,:after,:before { 15 | -webkit-box-sizing: border-box; 16 | -moz-box-sizing: border-box; 17 | box-sizing: border-box; 18 | } 19 | 20 | html { 21 | overflow-x: hidden; 22 | -ms-text-size-adjust: 100%; 23 | -webkit-text-size-adjust: 100%; 24 | } 25 | 26 | ::-moz-selection { 27 | color: #414141; 28 | background-color: #1565c0; 29 | } 30 | 31 | ::selection { 32 | color: #fff; 33 | background-color: #1565c0; 34 | } 35 | 36 | body { 37 | font-family: 'Lato', "PingFang SC", "Microsoft YaHei", sans-serif; 38 | font-size: 14px; 39 | line-height: 1.8; 40 | margin: 0 auto; 41 | color: #313131; 42 | background-color: #fafafa; 43 | text-rendering: geometricPrecision; 44 | -webkit-font-smoothing: antialiased; 45 | -moz-osx-font-smoothing: grayscale; 46 | } 47 | 48 | body>*:first-child { 49 | margin-top: 0!important; 50 | } 51 | 52 | body>*:last-child { 53 | margin-bottom: 0!important; 54 | } 55 | 56 | p,blockquote,ul,ol,dl,table,pre { 57 | margin: 20px 0; 58 | vertical-align: baseline; 59 | } 60 | 61 | h1,h2,h3,h4,h5,h6 { 62 | font-weight: normal; 63 | -webkit-font-smoothing: antialiased; 64 | } 65 | 66 | h1 tt,h1 code,h2 tt,h2 code,h3 tt,h3 code,h4 tt,h4 code,h5 tt,h5 code,h6 tt,h6 code { 67 | font-size: inherit; 68 | } 69 | 70 | h1 { 71 | font-size: 1.4em; 72 | color: #222; 73 | } 74 | 75 | h2 { 76 | font-size: 1.3em; 77 | color: #333; 78 | } 79 | 80 | h3 { 81 | font-size: 1.2em; 82 | color: #444; 83 | } 84 | 85 | h4 { 86 | font-size: 1.1em; 87 | color: #555; 88 | } 89 | 90 | h5 { 91 | font-size: 1.0em; 92 | color: #555; 93 | } 94 | 95 | h6 { 96 | font-size: 1.0em; 97 | color: #555; 98 | } 99 | 100 | body>h2:first-child,body>h1:first-child,body>h1:first-child+h2,body>h3:first-child,body>h4:first-child,body>h5:first-child,body>h6:first-child { 101 | margin-top: 0; 102 | padding-top: 0; 103 | } 104 | 105 | a:first-child h1,a:first-child h2,a:first-child h3,a:first-child h4,a:first-child h5,a:first-child h6 { 106 | margin-top: 0; 107 | padding-top: 0; 108 | } 109 | 110 | a { 111 | text-decoration: none; 112 | color: #313131; 113 | outline: 0; 114 | cursor: pointer; 115 | } 116 | 117 | a:active,a:focus,a:hover { 118 | color: #1565c0; 119 | outline: 0; 120 | border-bottom: 1px solid #1565c0; 121 | } 122 | 123 | 124 | ul,ol { 125 | padding-left: 30px; 126 | } 127 | 128 | ul li>:first-child,ol li>:first-child,ul li ul:first-of-type,ol li ol:first-of-type,ul li ol:first-of-type,ol li ul:first-of-type { 129 | margin-top: 0; 130 | } 131 | 132 | li { 133 | word-wrap: break-word; 134 | } 135 | 136 | li p { 137 | margin: 0; 138 | } 139 | 140 | ul ul,ul ol,ol ol,ol ul { 141 | margin-bottom: 0; 142 | } 143 | 144 | pre { 145 | position: relative; 146 | margin: 20px 0; 147 | } 148 | 149 | code { 150 | font-family: Menlo,Bitstream Vera Sans Mono,DejaVu Sans Mono,Monaco,Consolas,monospace; 151 | font-size: 13px; 152 | margin: 0 3px; 153 | padding: 2px 6px; 154 | border-radius: 3px; 155 | background-color: #F7F7CB; 156 | } 157 | 158 | pre code { 159 | font-size: 13px; 160 | display: block; 161 | overflow: auto; 162 | padding: 1.3em; 163 | border: 0; 164 | } 165 | 166 | blockquote { 167 | padding: 0 10px 0 20px; 168 | border-left: 4px solid #ddd; 169 | } 170 | 171 | blockquote>:first-child { 172 | margin-top: 0; 173 | } 174 | 175 | blockquote>:last-child { 176 | margin-bottom: 0; 177 | } 178 | 179 | hr { 180 | clear: both; 181 | overflow: hidden; 182 | height: 0; 183 | margin: 15px 0; 184 | padding: 0; 185 | border: 0; 186 | border-bottom: 2px solid #ddd; 187 | background: transparent; 188 | } 189 | 190 | table { 191 | font-size: 13px; 192 | display: block; 193 | overflow: auto; 194 | width: 100%; 195 | border-spacing: 0; 196 | border-collapse: collapse; 197 | word-wrap: normal; 198 | word-break: normal; 199 | } 200 | 201 | table th { 202 | font-weight: bold; 203 | } 204 | 205 | table th,table td { 206 | padding: 6px 13px; 207 | white-space: nowrap; 208 | border: 1px solid #ddd; 209 | } 210 | 211 | table tr { 212 | border-top: 1px solid #ccc; 213 | background-color: #fff; 214 | } 215 | 216 | table thead tr { 217 | background-color: #f7f7f7; 218 | } 219 | 220 | button,input,select,textarea { 221 | font-family: -apple-system,SF UI Text,Arial,PingFang SC,Hiragino Sans GB,Microsoft YaHei,WenQuanYi Micro Hei,sans-serif; 222 | font-size: 13px; 223 | line-height: 1.6; 224 | resize: none; 225 | } 226 | 227 | input:required:invalid,input:focus:invalid,textarea:required:invalid,textarea:focus:invalid { 228 | box-shadow: none; 229 | } 230 | 231 | input::-webkit-input-placeholder,textarea::-webkit-input-placeholder { 232 | color: #5f5f5f; 233 | } 234 | 235 | input:-moz-placeholder,textarea:-moz-placeholder { 236 | color: #5f5f5f; 237 | } 238 | 239 | input::-moz-placeholder,textarea::-moz-placeholder { 240 | color: #5f5f5f; 241 | } 242 | 243 | input:-ms-input-placeholder,textarea:-ms-input-placeholder { 244 | color: #5f5f5f; 245 | } 246 | 247 | .clearfix:after,.clearfix:before { 248 | display: table; 249 | content: ''; 250 | } 251 | 252 | .clearfix:after { 253 | clear: both; 254 | } 255 | 256 | .clearfix { 257 | zoom: 1; 258 | } 259 | 260 | .left { 261 | float: left; 262 | } 263 | 264 | .right { 265 | float: right; 266 | } 267 | 268 | .browsehappy { 269 | position: fixed; 270 | z-index: 999; 271 | top: 0; 272 | bottom: 0; 273 | width: 100%; 274 | height: 40px; 275 | padding: 10px; 276 | text-align: center; 277 | color: #8a1f11; 278 | background: #fbe3e4; 279 | } 280 | 281 | .browsehappy a { 282 | font-weight: 700; 283 | text-decoration: underline; 284 | color: #8a1f11 285 | } 286 | 287 | .bg-white { 288 | background-color: #fff!important; 289 | } 290 | 291 | .bg-grey { 292 | background-color: #f7f7f7!important; 293 | } 294 | 295 | .bg-deepgrey { 296 | background-color: rgba(0,0,0,.5)!important; 297 | } 298 | 299 | .bg-blue { 300 | background-color: #1565c0!important; 301 | } 302 | 303 | .bg-purple { 304 | background-color: #bc99c4!important; 305 | } 306 | 307 | .bg-green { 308 | background-color: #46c47c!important; 309 | } 310 | 311 | .bg-yellow { 312 | background-color: #f9bb3c!important; 313 | } 314 | 315 | .bg-red { 316 | background-color: #e8583d!important; 317 | } 318 | 319 | .bg-orange { 320 | background-color: #f68e5f!important; 321 | } 322 | 323 | .icon-search { 324 | position: relative; 325 | z-index: 1; 326 | display: inline-block; 327 | width: 13px; 328 | height: 13px; 329 | margin: 2px 0 0 3px; 330 | -webkit-transform: rotate(-45deg); 331 | -ms-transform: rotate(-45deg); 332 | transform: rotate(-45deg); 333 | color: #313131; 334 | border: solid 2px currentColor; 335 | border-radius: 50%; 336 | } 337 | 338 | .icon-search:before { 339 | position: absolute; 340 | top: 11px; 341 | left: 3px; 342 | width: 2px; 343 | height: 4px; 344 | content: ''; 345 | background-color: currentColor; 346 | } 347 | 348 | .icon-menu { 349 | position: relative; 350 | display: inline-block; 351 | width: 20px; 352 | height: 12px; 353 | -webkit-transition: all .4s ease-in-out; 354 | transition: all .4s ease-in-out; 355 | -webkit-transition-timing-function: cubic-bezier(.61,.04,.17,1.32); 356 | transition-timing-function: cubic-bezier(.61,.04,.17,1.32); 357 | } 358 | 359 | .icon-menu .middle { 360 | position: absolute; 361 | top: 50%; 362 | left: -.25em; 363 | display: inline-block; 364 | width: 20px; 365 | height: 2px; 366 | margin-top: -1px; 367 | -webkit-transition: all .4s ease-in-out; 368 | transition: all .4s ease-in-out; 369 | background: #313131; 370 | } 371 | 372 | .icon-menu:after,.icon-menu:before { 373 | position: absolute; 374 | left: -.25em; 375 | width: 20px; 376 | height: 2px; 377 | content: ''; 378 | -webkit-transition: all .4s ease-in-out; 379 | transition: all .4s ease-in-out; 380 | -webkit-transform-origin: 50% 50% 0; 381 | -ms-transform-origin: 50% 50% 0; 382 | transform-origin: 50% 50% 0; 383 | background: #313131; 384 | } 385 | 386 | .icon-menu:after { 387 | bottom: 0; 388 | } 389 | 390 | .icon-menu:before { 391 | top: 0; 392 | } 393 | 394 | .bg-ico-book { 395 | background-position: 0 0!important; 396 | } 397 | 398 | .bg-ico-game { 399 | background-position: 0 -40px!important; 400 | } 401 | 402 | .bg-ico-note { 403 | background-position: 0 -80px!important; 404 | } 405 | 406 | .bg-ico-chat { 407 | background-position: 0 -120px!important; 408 | } 409 | 410 | .bg-ico-code { 411 | background-position: 0 -160px!important; 412 | } 413 | 414 | .bg-ico-image { 415 | background-position: 0 -200px!important; 416 | } 417 | 418 | .bg-ico-web { 419 | background-position: 0 -240px!important; 420 | } 421 | 422 | .bg-ico-link { 423 | background-position: 0 -280px!important; 424 | } 425 | 426 | .bg-ico-design { 427 | background-position: 0 -320px!important; 428 | } 429 | 430 | .bg-ico-lock { 431 | background-position: 0 -360px!important; 432 | } 433 | 434 | .headband { 435 | height: 3px; 436 | background: #222; 437 | } 438 | 439 | .header { 440 | line-height: 78px; 441 | /*position: fixed;*/ 442 | top: 0; 443 | z-index: 10; 444 | display: block; 445 | width: 100%; 446 | height: 80px; 447 | padding: 0; 448 | text-align: right; 449 | /*-webkit-box-shadow: 0 1px 5px rgba(0,0,0,.1);*/ 450 | /*-moz-box-shadow: 0 1px 5px rgba(0,0,0,.1);*/ 451 | /*box-shadow: 0 1px 5px rgba(0,0,0,.1);*/ 452 | } 453 | 454 | .navbar-container { 455 | position: relative; 456 | width: 1040px; 457 | max-width: 100%; 458 | height: 80px; 459 | margin: 0 auto; 460 | font-weight: bold; 461 | } 462 | 463 | .navbar-logo { 464 | font-size: 22px; 465 | line-height: 22px; 466 | position: absolute; 467 | top: 50%; 468 | left: 0; 469 | display: block; 470 | width: auto; 471 | max-width: 50%; 472 | height: 22px; 473 | margin-top: -10px; 474 | margin-left: 25px; 475 | text-decoration: none; 476 | } 477 | 478 | .navbar-logo img { 479 | width: auto; 480 | height: 22px; 481 | outline: 0; 482 | } 483 | 484 | .navbar-menu { 485 | z-index: 10; 486 | display: inline-block; 487 | width: auto; 488 | padding-right: 5px; 489 | } 490 | 491 | .navbar-menu a { 492 | font-size: 14px; 493 | padding: 0 15px; 494 | } 495 | 496 | .navbar-mobile-menu { 497 | line-height: 80px; 498 | z-index: 1; 499 | display: none; 500 | width: 28px; 501 | padding: 0 45px 0 10px; 502 | cursor: pointer; 503 | } 504 | 505 | .navbar-mobile-menu:active,.navbar-mobile-menu:hover { 506 | cursor: pointer; 507 | } 508 | 509 | .navbar-mobile-menu:active:before,.navbar-mobile-menu:hover:before { 510 | -webkit-animation: pointer-ball .3s ease 1; 511 | animation: pointer-ball .3s ease 1; 512 | -webkit-animation-timing-function: cubic-bezier(.61,.04,.17,1.32); 513 | animation-timing-function: cubic-bezier(.61,.04,.17,1.32); 514 | } 515 | 516 | .navbar-mobile-menu:active .icon-menu,.navbar-mobile-menu:hover .icon-menu { 517 | -webkit-transform: rotateZ(360deg); 518 | -ms-transform: rotateZ(360deg); 519 | transform: rotateZ(360deg); 520 | } 521 | 522 | .navbar-mobile-menu:active .icon-menu.cross .middle,.navbar-mobile-menu:active .icon-menu.cross:after,.navbar-mobile-menu:active .icon-menu.cross:before,.navbar-mobile-menu:hover .icon-menu.cross .middle,.navbar-mobile-menu:hover .icon-menu.cross:after,.navbar-mobile-menu:hover .icon-menu.cross:before { 523 | background: #1565c0; 524 | } 525 | 526 | .navbar-mobile-menu:active .icon-menu.cross .middle,.navbar-mobile-menu:hover .icon-menu.cross .middle { 527 | opacity: 0; 528 | } 529 | 530 | .navbar-mobile-menu:active .icon-menu.cross:after,.navbar-mobile-menu:hover .icon-menu.cross:after { 531 | bottom: 5px; 532 | -webkit-transform: rotate(135deg); 533 | -ms-transform: rotate(135deg); 534 | transform: rotate(135deg); 535 | } 536 | 537 | .navbar-mobile-menu:active .icon-menu.cross:before,.navbar-mobile-menu:hover .icon-menu.cross:before { 538 | top: 5px; 539 | -webkit-transform: rotate(45deg); 540 | -ms-transform: rotate(45deg); 541 | transform: rotate(45deg); 542 | -webkit-box-shadow: 0 0 0 white; 543 | box-shadow: 0 0 0 white; 544 | } 545 | 546 | .navbar-mobile-menu li { 547 | position: relative; 548 | display: inline; 549 | margin: 0; 550 | text-decoration: none; 551 | } 552 | 553 | .navbar-mobile-menu ul { 554 | position: absolute; 555 | z-index: 1; 556 | top: 100%; 557 | overflow: hidden; 558 | clip: rect(1px,1px,1px,1px); 559 | margin: 0 0 0 -95px; 560 | padding: 0; 561 | -webkit-transition: -webkit-transform 300ms; 562 | transition: -webkit-transform 300ms; 563 | transition: transform 300ms; 564 | -webkit-transform: translate(120px,0); 565 | -ms-transform: translate(120px,0); 566 | transform: translate(120px,0); 567 | text-indent: 0; 568 | } 569 | 570 | .navbar-mobile-menu:hover>ul,.navbar-mobile-menu:active>ul,.navbar-mobile-menu:focus>ul { 571 | overflow: inherit; 572 | clip: inherit; 573 | -webkit-transition: -webkit-transform 300ms; 574 | transition: -webkit-transform 300ms; 575 | transition: transform 300ms; 576 | -webkit-transform: translateX(0px) translateY(0px) translateZ(0px); 577 | transform: translateX(0px) translateY(0px) translateZ(0px); 578 | } 579 | 580 | .navbar-mobile-menu ul li a { 581 | font-size: 15px; 582 | line-height: 2.2; 583 | display: block; 584 | width: 140px; 585 | margin: 0; 586 | padding: 8px 25px; 587 | background-color: #eee; 588 | } 589 | 590 | .navbar-search { 591 | line-height: 80px; 592 | display: inline-block; 593 | width: 20px; 594 | padding: 0 40px 0 0; 595 | cursor: pointer; 596 | } 597 | 598 | .navbar-search:hover>form,.navbar-search:active>form,.navbar-search:focus>form { 599 | overflow: inherit; 600 | clip: inherit; 601 | -webkit-transition: opacity 500ms ease-in-out; 602 | transition: opacity 500ms ease-in-out; 603 | opacity: 1; 604 | } 605 | 606 | .navbar-search:hover>.icon-search,.navbar-search:active>.icon-search,.navbar-search:focus>.icon-search { 607 | color: #1565c0; 608 | } 609 | 610 | .navbar-search form { 611 | line-height: 30px; 612 | position: absolute; 613 | top: 50%; 614 | right: 0; 615 | display: block; 616 | overflow: hidden; 617 | clip: rect(1px,1px,1px,1px); 618 | width: auto; 619 | max-width: 60%; 620 | height: 30px; 621 | margin-top: -15px; 622 | padding-right: 10px; 623 | opacity: 0; 624 | } 625 | 626 | .navbar-search form .search-box { 627 | line-height: 30px; 628 | position: relative; 629 | top: -1px; 630 | display: inline-block; 631 | width: 400px; 632 | max-width: 100%; 633 | height: 30px; 634 | padding: 0; 635 | border: 0; 636 | border-radius: 3px; 637 | } 638 | 639 | .navbar-search form .search-box input { 640 | font-size: 14px; 641 | line-height: 30px; 642 | position: absolute; 643 | top: 0; 644 | left: 0; 645 | width: 100%; 646 | height: 30px; 647 | padding: 0 40px 0 18px; 648 | color: #313131; 649 | border: 1px solid #1565c0; 650 | border-radius: 20px; 651 | outline: 0; 652 | background-color: #fff; 653 | -webkit-appearance: none; 654 | } 655 | 656 | .main-content { 657 | position: relative; 658 | max-width: 940px; 659 | margin: 0 auto; 660 | -webkit-animation: fade-in .5s; 661 | animation: fade-in; 662 | animation-duration: .5s; 663 | padding: 40px 20px 0; 664 | } 665 | 666 | .post-lists { 667 | position: relative; 668 | display: block; 669 | overflow: hidden; 670 | } 671 | 672 | .post-lists-body { 673 | display: block; 674 | } 675 | 676 | .post-list-item { 677 | float: left; 678 | width: 33.3333%; 679 | height: auto; 680 | padding: 15px; 681 | align-items: center; 682 | } 683 | 684 | .post-list-item-container { 685 | position: relative; 686 | overflow: hidden; 687 | width: 100%; 688 | padding: 0; 689 | border-radius: 3px; 690 | background-color: #fff; 691 | -webkit-box-shadow: 0 1px 4px rgba(0,0,0,.04); 692 | box-shadow: 0 1px 4px rgba(0,0,0,.04); 693 | } 694 | 695 | .post-list-item-container:hover { 696 | -webkit-box-shadow: 2px 2px 4px rgba(0,0,0,.1); 697 | box-shadow: 2px 2px 4px rgba(0,0,0,.1); 698 | } 699 | 700 | .post-list-item-container .item-thumb { 701 | position: relative; 702 | display: inherit; 703 | min-height: 250px; 704 | -webkit-transition: -webkit-transform 500ms ease,filter 500ms ease; 705 | -moz-transition: -moz-transform 500ms ease,filter 500ms ease; 706 | transition: transform 500ms ease,filter 500ms ease; 707 | background-position: 50% 50%; 708 | background-size: cover 709 | } 710 | 711 | .post-list-item-container .item-desc { 712 | position: absolute; 713 | top: 0; 714 | overflow: hidden; 715 | width: 100%; 716 | height: 100%; 717 | padding: 40px 28px 718 | } 719 | 720 | .post-list-item-container .item-desc p { 721 | font-size: 14px; 722 | margin: 0; 723 | padding: 0; 724 | word-break: break-all; 725 | opacity: 0; 726 | color: #fff 727 | } 728 | 729 | .post-list-item-container:hover .item-thumb { 730 | -webkit-transform: scale(1.1); 731 | -moz-transform: scale(1.1); 732 | transform: scale(1.1); 733 | -webkit-filter: blur(3px); 734 | -moz-filter: blur(3px); 735 | filter: blur(3px) 736 | } 737 | 738 | .post-list-item-container:hover .item-desc { 739 | background-color: rgba(0,0,0,.5) 740 | } 741 | 742 | .post-list-item-container:hover .item-desc p { 743 | -webkit-animation: fade-in .5s; 744 | animation: fade-in; 745 | animation-duration: .5s; 746 | opacity: 1 747 | } 748 | 749 | .post-list-item-container .item-slant { 750 | position: absolute; 751 | z-index: 0; 752 | right: 0; 753 | bottom: 50px; 754 | left: 0; 755 | width: 110%; 756 | min-height: 100px; 757 | -webkit-transform: rotate(7deg) translate(-10px,0); 758 | -ms-transform: rotate(7deg) translate(-10px,0); 759 | transform: rotate(7deg) translate(-10px,0); 760 | background-color: #fff 761 | } 762 | 763 | .post-list-item-container .item-slant.reverse-slant { 764 | -webkit-transform: rotate(-10deg) translate(10px,-10px); 765 | -ms-transform: rotate(-10deg) translate(10px,-10px); 766 | transform: rotate(-10deg) translate(10px,-10px); 767 | opacity: .7; 768 | background-color: #f68e5f; 769 | -webkit-box-shadow: none; 770 | box-shadow: none 771 | } 772 | 773 | .post-list-item-container .item-label { 774 | position: relative; 775 | height: 130px; 776 | padding: 25px 20px 40px; 777 | background-color: #fff 778 | } 779 | 780 | .post-list-item-container .item-label .item-title a { 781 | font-size: 17px; 782 | line-height: 17px; 783 | word-break: break-all; 784 | color: #313131; 785 | } 786 | 787 | .post-list-item-container .item-label .item-meta { 788 | position: absolute; 789 | right: 0; 790 | bottom: 0; 791 | width: 100%; 792 | padding: 0 15px 15px; 793 | text-align: right; 794 | } 795 | 796 | .post-list-item-container .item-label .item-meta .item-meta-cat a { 797 | font-size: 13px; 798 | position: relative; 799 | float: right; 800 | margin-right: 10px; 801 | padding: 10px 0; 802 | text-align: right; 803 | text-transform: none; 804 | color: #5f5f5f; 805 | } 806 | 807 | .post-list-item-container .item-label .item-meta .item-meta-date { 808 | font-size: 12px; 809 | position: relative; 810 | float: left; 811 | padding-top: 9px; 812 | padding-left: 9px; 813 | text-align: right; 814 | text-transform: none; 815 | color: #f1f1f1; 816 | } 817 | 818 | .post-list-item-container .item-label .item-meta .item-meta-ico { 819 | display: inline-block; 820 | width: 42px; 821 | height: 42px; 822 | border: 1px solid #eaeaea; 823 | border-radius: 50%; 824 | } 825 | 826 | .post-list-item-container .item-label { 827 | padding: 10px 20px 40px; 828 | } 829 | 830 | .item-meta time, 831 | .post-data time { 832 | border-bottom: 1px dashed #999; 833 | cursor: help; 834 | } 835 | 836 | .item-category { 837 | border-bottom: 1px dashed #999; 838 | } 839 | 840 | .item-category:hover { 841 | border-bottom: 1px dashed #999; 842 | color: #222; 843 | font-weight: bold; 844 | } 845 | 846 | .onelist-page { 847 | max-width: 100%; 848 | margin: 0; 849 | padding: 30px 0 0; 850 | } 851 | 852 | .post-onelist-item { 853 | display: inline-block; 854 | width: 100%; 855 | margin: 0; 856 | } 857 | 858 | .post-onelist-item:nth-child(n) { 859 | background: #f7f7f7; 860 | } 861 | 862 | .post-onelist-item:nth-child(2n) { 863 | background: #fff; 864 | } 865 | 866 | .post-onelist-item-container { 867 | position: relative; 868 | max-width: 900px; 869 | margin: 0 auto; 870 | padding: 70px 20px 65px; 871 | } 872 | 873 | .post-onelist-item-container .onelist-item-thumb { 874 | position: relative; 875 | display: block; 876 | min-height: 260px; 877 | -webkit-transition: -webkit-transform 500ms ease,filter 500ms ease; 878 | -moz-transition: -moz-transform 500ms ease,filter 500ms ease; 879 | transition: transform 500ms ease,filter 500ms ease; 880 | border-radius: 5px; 881 | background-position: 50% 50%; 882 | background-size: cover; 883 | -webkit-box-shadow: 0 1px 4px rgba(0,0,0,.04); 884 | box-shadow: 0 1px 4px rgba(0,0,0,.04); 885 | } 886 | 887 | .post-onelist-item-container .onelist-item-thumb:hover { 888 | -webkit-box-shadow: 2px 3px 4px rgba(0,0,0,.1); 889 | box-shadow: 2px 3px 4px rgba(0,0,0,.1); 890 | } 891 | 892 | .post-onelist-item-container .item-title { 893 | display: block; 894 | margin: 30px 0 10px; 895 | text-align: center; 896 | } 897 | 898 | .post-onelist-item-container .item-title a { 899 | font-size: 21px; 900 | line-height: 1.5; 901 | color: #222; 902 | position: relative; 903 | display: inline-block; 904 | border-bottom: none; 905 | } 906 | 907 | .item-title .post-item-title:hover::before { 908 | visibility: visible; 909 | transform: scaleX(1); 910 | } 911 | 912 | .item-title .post-item-title::before { 913 | content: ""; 914 | position: absolute; 915 | width: 100%; 916 | height: 2px; 917 | bottom: 0; 918 | background-color: #000; 919 | visibility: hidden; 920 | transform: scaleX(0); 921 | transition-duration: 0.2s; 922 | transition-timing-function: ease-in-out; 923 | transition-delay: 0s; 924 | } 925 | 926 | .post-onelist-item-container .item-content { 927 | padding: 0 30px 10px; 928 | text-align: center; 929 | word-break: break-all; 930 | } 931 | 932 | .post-onelist-item-container .item-meta,.post-onelist-item-container .item-readmore { 933 | font-size: 12px; 934 | text-align: center; 935 | color: #5f5f5f; 936 | } 937 | 938 | .post-onelist-item-container .item-meta a { 939 | color: #5f5f5f; 940 | } 941 | 942 | .post-onelist-item-container .item-readmore a { 943 | padding: 8px 20px; 944 | color: #1565c0; 945 | border: 1px solid #1565c0; 946 | border-radius: 20px; 947 | } 948 | 949 | .post-onelist-item-container .item-readmore a:hover { 950 | color: #222; 951 | border: 1px solid #222; 952 | -webkit-transition: all .5s ease; 953 | transition: all .5s ease; 954 | } 955 | 956 | .post-onelist-item-container .item-meta-hr { 957 | display: block; 958 | width: 55px; 959 | height: 2px; 960 | margin: 0 auto; 961 | margin-top: 20px; 962 | content: ''; 963 | } 964 | 965 | .post-content { 966 | padding-top: 50px; 967 | } 968 | 969 | .post-content p { 970 | font-size: 14px; 971 | word-wrap: break-word; 972 | word-break: break-word; 973 | } 974 | 975 | .post-content h1,.post-content h2,.post-content h3,.post-content h4,.post-content h5,.post-content h6 { 976 | position: relative; 977 | margin: 20px 0; 978 | } 979 | 980 | .post-content h1::before,.post-content h2::before,.post-content h3::before,.post-content h4::before,.post-content h5::before,.post-content h6::before { 981 | position: absolute; 982 | top: 0; 983 | left: -15px; 984 | content: '#'; 985 | color: #1565c0; 986 | } 987 | 988 | .post-content pre { 989 | overflow-x: auto; 990 | margin: 20px 0; 991 | border-radius: 4px; 992 | background: #f7f7f7; 993 | text-shadow: none; 994 | } 995 | 996 | .post-content pre code { 997 | line-height: 20px; 998 | margin: 0; 999 | padding: 1.3em; 1000 | color: #ccc; 1001 | background-color: #2d2d2d; 1002 | } 1003 | 1004 | .post-content p a { 1005 | color: #313131; 1006 | border-bottom: 1px solid #ccc; 1007 | } 1008 | 1009 | .post-content p a:hover { 1010 | color: #1565c0; 1011 | border-bottom: 1px solid #1565c0; 1012 | } 1013 | 1014 | .post-content img { 1015 | position: relative; 1016 | display: block; 1017 | overflow: hidden; 1018 | max-width: 100%; 1019 | height: auto; 1020 | margin: 0 auto; 1021 | } 1022 | 1023 | .post-content input.text { 1024 | display: inline-block; 1025 | padding: 5px 10px; 1026 | color: #5f5f5f; 1027 | border: 1px solid #5f5f5f; 1028 | border-radius: 3px; 1029 | outline: 0; 1030 | background-color: #fff; 1031 | } 1032 | 1033 | .post-content input.submit { 1034 | display: inline-block; 1035 | padding: 5px 15px; 1036 | color: #fff; 1037 | border: 1px solid #5f5f5f; 1038 | border-radius: 3px; 1039 | outline: 0; 1040 | background-color: #5f5f5f; 1041 | } 1042 | 1043 | .post-content .flinks { 1044 | padding: 0; 1045 | } 1046 | 1047 | .post-content .flinks li { 1048 | display: inline-block; 1049 | overflow: hidden; 1050 | width: 32%; 1051 | white-space: nowrap; 1052 | text-overflow: ellipsis; 1053 | } 1054 | 1055 | .post-title { 1056 | font-size: 21px; 1057 | padding-bottom: 10px; 1058 | } 1059 | 1060 | .post-data,.post-data a { 1061 | font-size: 12px; 1062 | color: #5f5f5f; 1063 | } 1064 | 1065 | .post-meta-divider { 1066 | margin: 0 0.5em; 1067 | } 1068 | 1069 | .post-tags { 1070 | margin: 0; 1071 | padding: 5px 0 15px; 1072 | border-bottom: 1px solid #e0e0e0; 1073 | } 1074 | 1075 | .post-tags a { 1076 | font-size: 13px; 1077 | font-weight: 600; 1078 | display: inline-block; 1079 | margin: 4px 8px 0 0; 1080 | padding: 0 15px; 1081 | -webkit-transition-duration: 400ms; 1082 | transition-duration: 400ms; 1083 | text-decoration: none!important; 1084 | letter-spacing: 0; 1085 | } 1086 | 1087 | .post-tags a:nth-child(1n) { 1088 | color: #fff; 1089 | border: 1px solid #1565c0; 1090 | border-radius: 15px; 1091 | background: #1565c0; 1092 | } 1093 | 1094 | .post-tags a:nth-child(2n) { 1095 | color: #fff; 1096 | border: 1px solid #ff9800; 1097 | border-radius: 15px; 1098 | background: #ff9800; 1099 | } 1100 | 1101 | .post-tags a:nth-child(3n) { 1102 | color: #fff; 1103 | border: 1px solid #46c47c; 1104 | border-radius: 15px; 1105 | background: #46c47c; 1106 | } 1107 | 1108 | .post-tags a:nth-child(4n) { 1109 | color: #fff; 1110 | border: 1px solid #f9bb3c; 1111 | border-radius: 15px; 1112 | background: #f9bb3c; 1113 | } 1114 | 1115 | .post-tags a:nth-child(5n) { 1116 | color: #fff; 1117 | border: 1px solid #bc99c4; 1118 | border-radius: 15px; 1119 | background: #bc99c4; 1120 | } 1121 | 1122 | .post-tags a:nth-child(6n) { 1123 | color: #fff; 1124 | border: 1px solid #e8583d; 1125 | border-radius: 15px; 1126 | background: #e8583d; 1127 | } 1128 | 1129 | .post-tags a::before { 1130 | content: '# '; 1131 | } 1132 | 1133 | .post-content .post-tags a:hover { 1134 | color: #5f5f5f; 1135 | border: 1px solid #f7f7f7; 1136 | outline-style: none; 1137 | background: #f7f7f7; 1138 | } 1139 | 1140 | .archive-page { 1141 | padding: 120px 20px 40px; 1142 | } 1143 | 1144 | .archive-page .categorys-title { 1145 | font-size: 14px; 1146 | position: relative; 1147 | margin: 10px auto; 1148 | padding: 0 30px; 1149 | color: #5f5f5f; 1150 | } 1151 | 1152 | .archive-page .categorys-title a { 1153 | color: #5f5f5f; 1154 | } 1155 | 1156 | .archive-page .categorys-title::before { 1157 | position: absolute; 1158 | top: 0; 1159 | left: -15px; 1160 | padding: 0 30px; 1161 | content: '#'; 1162 | color: #1565c0; 1163 | } 1164 | 1165 | .archive-page .post-list-item-container { 1166 | border: 1px solid rgba(184,197,214,.2); 1167 | border-radius: 3px; 1168 | background: #fff; 1169 | -webkit-box-shadow: 0 1px 4px rgba(0,0,0,.04); 1170 | box-shadow: 0 1px 4px rgba(0,0,0,.04); 1171 | } 1172 | 1173 | .archive-page .post-list-item-container .item-label { 1174 | height: 95px; 1175 | background: #fff; 1176 | } 1177 | 1178 | .archive-page .post-list-item-container .item-label .item-title a { 1179 | font-size: 14px; 1180 | display: block; 1181 | overflow: hidden; 1182 | white-space: nowrap; 1183 | text-overflow: ellipsis; 1184 | color: #313131; 1185 | } 1186 | 1187 | .archive-page .post-list-item-container .item-label .item-meta .item-meta-date { 1188 | padding-bottom: 5px; 1189 | padding-left: 5px; 1190 | color: #5f5f5f; 1191 | } 1192 | 1193 | .common-page { 1194 | padding: 120px 20px 0; 1195 | } 1196 | 1197 | .common-page .common-title { 1198 | font-size: 14px; 1199 | position: relative; 1200 | margin: 10px auto; 1201 | padding: 0 30px; 1202 | color: #5f5f5f; 1203 | } 1204 | 1205 | .common-page .common-title::before { 1206 | position: absolute; 1207 | top: 0; 1208 | left: -15px; 1209 | padding: 0 30px; 1210 | content: '#'; 1211 | color: #1565c0; 1212 | } 1213 | 1214 | .common-page .post-list-item { 1215 | width: 49.9999%; 1216 | } 1217 | 1218 | .common-page .post-list-item-container .item-label { 1219 | background-color: #fff; 1220 | } 1221 | 1222 | .common-page .post-list-item-container .item-label .item-title a { 1223 | font-size: 14px; 1224 | color: #313131; 1225 | } 1226 | 1227 | .common-page .post-list-item-container .item-label .item-meta .item-meta-date { 1228 | padding-bottom: 5px; 1229 | padding-left: 5px; 1230 | color: #5f5f5f; 1231 | } 1232 | 1233 | .common-page .post-list-item:hover,.archive-page .post-list-item:hover,.related-post-lists .post-list-item:hover { 1234 | -webkit-transition-duration: .3s; 1235 | transition-duration: .3s; 1236 | -webkit-transform: scale(1.03); 1237 | transform: scale(1.03); 1238 | } 1239 | 1240 | .post-list-item-container .item-label.bg-blue .item-title a { 1241 | color: #fff; 1242 | } 1243 | 1244 | .post-list-item-container .item-label.bg-purple .item-title a { 1245 | color: #fff; 1246 | } 1247 | 1248 | .post-list-item-container .item-label.bg-green .item-title a { 1249 | color: #fff; 1250 | } 1251 | 1252 | .post-list-item-container .item-label.bg-yellow .item-title a { 1253 | color: #fff; 1254 | } 1255 | 1256 | .post-list-item-container .item-label.bg-red .item-title a { 1257 | color: #fff; 1258 | } 1259 | 1260 | .post-list-item-container .item-label.bg-orange .item-title a { 1261 | color: #fff; 1262 | } 1263 | 1264 | .post-list-item-container .item-label.bg-blue .item-meta .item-meta-date { 1265 | color: #fff; 1266 | } 1267 | 1268 | .post-list-item-container .item-label.bg-purple .item-meta .item-meta-date { 1269 | color: #fff; 1270 | } 1271 | 1272 | .post-list-item-container .item-label.bg-green .item-meta .item-meta-date { 1273 | color: #fff; 1274 | } 1275 | 1276 | .post-list-item-container .item-label.bg-yellow .item-meta .item-meta-date { 1277 | color: #fff; 1278 | } 1279 | 1280 | .post-list-item-container .item-label.bg-red .item-meta .item-meta-date { 1281 | color: #fff; 1282 | } 1283 | 1284 | .post-list-item-container .item-label.bg-orange .item-meta .item-meta-date { 1285 | color: #fff; 1286 | } 1287 | 1288 | .post-header { 1289 | text-align: center; 1290 | } 1291 | 1292 | .post-data-excerpt { 1293 | color: #999; 1294 | padding-top: 10px; 1295 | } 1296 | 1297 | .post-header-thumb { 1298 | width: 100%; 1299 | height: 300px; 1300 | background-position: center; 1301 | background-size: cover; 1302 | margin-top: 80px; 1303 | position: relative; 1304 | -webkit-box-shadow: 0 1px 5px rgba(0,0,0,.1); 1305 | -moz-box-shadow: 0 1px 5px rgba(0,0,0,.1); 1306 | box-shadow: 0 1px 5px rgba(0,0,0,.1); 1307 | } 1308 | 1309 | /* ps css */ 1310 | .post-copyright { 1311 | margin: 0 0 0; 1312 | padding: 0.5em 1em; 1313 | border-left: 3px solid #ff1700; 1314 | background-color: #f9f9f9; 1315 | list-style: none; 1316 | } 1317 | 1318 | .post-copyright ul { 1319 | display: block; 1320 | margin-block-start: 1em; 1321 | margin-block-end: 1em; 1322 | margin-inline-start: 0px; 1323 | margin-inline-end: 0px; 1324 | padding-inline-start: 40px; 1325 | } 1326 | 1327 | .post-copyright a { 1328 | overflow-wrap: break-word; 1329 | word-wrap: break-word; 1330 | background-color: transparent; 1331 | color: #555; 1332 | text-decoration: none; 1333 | outline: none; 1334 | border-bottom: 1px solid #999; 1335 | cursor: pointer; 1336 | } 1337 | 1338 | .post-copyright a:hover { 1339 | color: #222; 1340 | border-bottom-color: #222; 1341 | } 1342 | 1343 | .post-footer { 1344 | display: block; 1345 | } 1346 | 1347 | .post-footer .post-tags { 1348 | margin-top: 40px; 1349 | text-align: center; 1350 | } 1351 | 1352 | .post-footer .post-tags a { 1353 | display: inline-block; 1354 | margin-right: 10px; 1355 | font-size: 13px; 1356 | } 1357 | 1358 | .post-nav { 1359 | display: table; 1360 | width: 100%; 1361 | /*border-top: 1px solid #eee;*/ 1362 | } 1363 | 1364 | .post-nav .post-nav-item { 1365 | display: table-cell; 1366 | padding: 10px 0 0 0; 1367 | width: 45%; 1368 | vertical-align: top; 1369 | } 1370 | 1371 | .post-nav-next a { 1372 | padding-left: 5px; 1373 | } 1374 | 1375 | .post-nav-divider { 1376 | display: table-cell; 1377 | width: 10%; 1378 | } 1379 | 1380 | .post-nav-item a { 1381 | position: relative; 1382 | display: block; 1383 | line-height: 25px; 1384 | font-size: 14px; 1385 | color: #555; 1386 | border-bottom: none; 1387 | } 1388 | 1389 | .post-nav-prev { 1390 | text-align: right; 1391 | } 1392 | 1393 | .post-nav-prev .fa { 1394 | margin-left: 5px; 1395 | } 1396 | 1397 | .post-nav-item .fa { 1398 | font-size: 12px; 1399 | margin-right: 5px; 1400 | } 1401 | 1402 | .lists-navigator { 1403 | margin: 25px 0 30px; 1404 | } 1405 | 1406 | .onelist-page .lists-navigator { 1407 | margin: 35px 0 35px; 1408 | } 1409 | 1410 | .lists-navigator ol { 1411 | margin: 0; 1412 | padding: 0 10px; 1413 | list-style: none; 1414 | text-align: center; 1415 | } 1416 | 1417 | .lists-navigator ol li { 1418 | display: inline-block; 1419 | color: #5f5f5f; 1420 | } 1421 | 1422 | .lists-navigator ol li a { 1423 | font-size: 14px; 1424 | padding: 0 20px; 1425 | color: #5f5f5f; 1426 | } 1427 | 1428 | .lists-navigator ol li.current a { 1429 | color: #1565c0; 1430 | } 1431 | 1432 | .footer { 1433 | position: relative; 1434 | z-index: 1; 1435 | margin-top: 0; 1436 | padding-bottom: 50px; 1437 | /*background-color: #fff;*/ 1438 | } 1439 | 1440 | .footer-meta { 1441 | padding: 50px 0 0; 1442 | list-style: none; 1443 | } 1444 | 1445 | .footer-meta .footer-container { 1446 | width: 100%; 1447 | max-width: 960px; 1448 | margin: 0 auto; 1449 | padding: 0 80px; 1450 | text-align: center; 1451 | } 1452 | 1453 | @media(max-width:1000px) { 1454 | .directory-content { 1455 | display: none; 1456 | } 1457 | 1458 | .post-header-thumb { 1459 | height: 280px; 1460 | } 1461 | } 1462 | 1463 | @media(max-width:880px) { 1464 | .index-page { 1465 | padding: 90px 0 0; 1466 | } 1467 | 1468 | .archive-page { 1469 | padding: 90px 0 20px; 1470 | } 1471 | 1472 | .common-page { 1473 | padding: 90px 0 0; 1474 | } 1475 | 1476 | .post-onelist-item-container { 1477 | padding: 50px 20px 55px; 1478 | } 1479 | 1480 | .post-list-item { 1481 | width: 50%; 1482 | padding: 10px; 1483 | } 1484 | 1485 | .post-list-item:nth-child(odd) { 1486 | padding-left: 20px; 1487 | } 1488 | 1489 | .post-list-item:nth-child(even) { 1490 | padding-right: 20px; 1491 | } 1492 | 1493 | .lists-navigator { 1494 | margin: 25px 0 30px; 1495 | } 1496 | 1497 | .onelist-page .lists-navigator { 1498 | margin: 35px 0 35px; 1499 | } 1500 | 1501 | .lists-navigator ol { 1502 | margin: 0; 1503 | padding: 0 10px; 1504 | list-style: none; 1505 | text-align: center; 1506 | } 1507 | 1508 | .lists-navigator ol li { 1509 | display: inline-block; 1510 | color: #5f5f5f; 1511 | } 1512 | 1513 | .lists-navigator ol li a { 1514 | font-size: 14px; 1515 | padding: 0 20px; 1516 | color: #5f5f5f; 1517 | } 1518 | 1519 | .lists-navigator ol li.current a { 1520 | color: #1565c0; 1521 | } 1522 | 1523 | .post-header-thumb { 1524 | height: 250px; 1525 | } 1526 | 1527 | .footer-meta .footer-container { 1528 | padding: 0; 1529 | } 1530 | 1531 | .main-content { 1532 | margin: 0 auto; 1533 | } 1534 | 1535 | .footer-meta .meta-item { 1536 | padding: 0 20px; 1537 | } 1538 | } 1539 | 1540 | @media(max-width:700px) { 1541 | .comment-form .input-control { 1542 | max-width: 100%; 1543 | } 1544 | 1545 | .post-header-thumb { 1546 | height: 220px; 1547 | } 1548 | 1549 | .post-page { 1550 | padding: 30px 25px 0; 1551 | } 1552 | 1553 | .page-page { 1554 | padding: 100px 25px 0; 1555 | } 1556 | 1557 | .related-post-lists { 1558 | padding-top: 15px; 1559 | } 1560 | 1561 | .post-onelist-item-container { 1562 | padding: 20px 20px 25px; 1563 | } 1564 | 1565 | .post-onelist-item-container .onelist-item-thumb { 1566 | min-height: 240px; 1567 | } 1568 | } 1569 | 1570 | @media(max-width:650px) { 1571 | .navbar-menu { 1572 | display: none 1573 | } 1574 | 1575 | .navbar-search { 1576 | padding: 0 35px 0 0 1577 | } 1578 | 1579 | .navbar-search form { 1580 | width: 180px; 1581 | margin-right: 55px 1582 | } 1583 | 1584 | .navbar-mobile-menu { 1585 | display: inline-block 1586 | } 1587 | 1588 | .red-gradient { 1589 | display: none 1590 | } 1591 | 1592 | .meta-posts { 1593 | display: none 1594 | } 1595 | 1596 | .meta-comments { 1597 | display: none 1598 | } 1599 | 1600 | .post-page { 1601 | padding: 100px 25px 0 1602 | } 1603 | 1604 | .common-page .post-list-item { 1605 | width: 100%; 1606 | padding: 10px 20px 1607 | } 1608 | 1609 | .footer-social { 1610 | display: none 1611 | } 1612 | 1613 | .footer-meta .footer-container { 1614 | height: 70px; 1615 | padding: 0 15px 1616 | } 1617 | 1618 | .post-header-thumb { 1619 | display: none 1620 | } 1621 | } 1622 | 1623 | @media(max-width:580px) { 1624 | .navbar-search form { 1625 | width: 150px 1626 | } 1627 | 1628 | .index-page { 1629 | padding: 80px 0 0 1630 | } 1631 | 1632 | .archive-page { 1633 | padding: 80px 0 20px 1634 | } 1635 | 1636 | .common-page { 1637 | padding: 80px 0 0 1638 | } 1639 | 1640 | .post-list-item { 1641 | width: 100%; 1642 | padding: 10px 20px 1643 | } 1644 | 1645 | .post-list-item:first-child { 1646 | padding-top: 20px 1647 | } 1648 | 1649 | .archive-page .post-list-item:first-child { 1650 | padding-top: 0 1651 | } 1652 | 1653 | .archive-page .post-list-item:last-child { 1654 | padding-bottom: 0 1655 | } 1656 | 1657 | .common-page .post-list-item:first-child { 1658 | padding-top: 0 1659 | } 1660 | 1661 | .related-post-lists { 1662 | padding-top: 5px 1663 | } 1664 | 1665 | .main-content { 1666 | margin: 0 auto 1667 | } 1668 | 1669 | .post-onelist-item-container { 1670 | padding: 20px 20px 25px 1671 | } 1672 | 1673 | .post-onelist-item-container .item-content { 1674 | display: none 1675 | } 1676 | 1677 | .post-onelist-item-container .item-readmore { 1678 | display: none 1679 | } 1680 | 1681 | .post-onelist-item-container .onelist-item-thumb { 1682 | min-height: 180px 1683 | } 1684 | } 1685 | 1686 | @media(max-width:410px) { 1687 | .meta-copyright-info .info-logo { 1688 | display: none 1689 | } 1690 | } 1691 | 1692 | @-webkit-keyframes slideDown { 1693 | 0% { 1694 | -webkit-transform: translateY(-80px) 1695 | } 1696 | 1697 | 100% { 1698 | -webkit-transform: translateY(0) 1699 | } 1700 | } 1701 | 1702 | @keyframes slideDown { 1703 | 0% { 1704 | -webkit-transform: translateY(-98px); 1705 | transform: translateY(-80px) 1706 | } 1707 | 1708 | 100% { 1709 | -webkit-transform: translateY(0); 1710 | transform: translateY(0) 1711 | } 1712 | } 1713 | 1714 | @-webkit-keyframes slideUp { 1715 | 0% { 1716 | -webkit-transform: translateY(0) 1717 | } 1718 | 1719 | 100% { 1720 | -webkit-transform: translateY(-80px) 1721 | } 1722 | } 1723 | 1724 | @keyframes slideUp { 1725 | 0% { 1726 | -webkit-transform: translateY(0); 1727 | transform: translateY(0) 1728 | } 1729 | 1730 | 100% { 1731 | -webkit-transform: translateY(-80px); 1732 | transform: translateY(-80px) 1733 | } 1734 | } 1735 | 1736 | @keyframes fade-in { 1737 | 0% { 1738 | transform: translateY(20px); 1739 | opacity: 0 1740 | } 1741 | 1742 | 100% { 1743 | transform: translateY(0px); 1744 | opacity: 1 1745 | } 1746 | } 1747 | 1748 | @-webkit-keyframes fade-in { 1749 | 0% { 1750 | -webkit-transform: translateY(20px); 1751 | opacity: 0 1752 | } 1753 | 1754 | 100% { 1755 | -webkit-transform: translateY(0px); 1756 | opacity: 1 1757 | } 1758 | } 1759 | 1760 | .hljs { 1761 | display: block; 1762 | overflow-x: auto; 1763 | padding: 0.5em; 1764 | background: #fff; 1765 | color: black 1766 | } 1767 | 1768 | .hljs-comment,.hljs-quote { 1769 | color: #006a00 1770 | } 1771 | 1772 | .hljs-keyword,.hljs-selector-tag,.hljs-literal { 1773 | color: #aa0d91 1774 | } 1775 | 1776 | .hljs-name { 1777 | color: #008 1778 | } 1779 | 1780 | .hljs-variable,.hljs-template-variable { 1781 | color: #660 1782 | } 1783 | 1784 | .hljs-string { 1785 | color: #c41a16 1786 | } 1787 | 1788 | .hljs-regexp,.hljs-link { 1789 | color: #080 1790 | } 1791 | 1792 | .hljs-title,.hljs-tag,.hljs-symbol,.hljs-bullet,.hljs-number,.hljs-meta { 1793 | color: #6cc 1794 | } 1795 | 1796 | .hljs-section,.hljs-class .hljs-title,.hljs-type,.hljs-attr,.hljs-built_in,.hljs-builtin-name,.hljs-params { 1797 | color: #5c2699 1798 | } 1799 | 1800 | .hljs-attribute,.hljs-subst { 1801 | color: #000 1802 | } 1803 | 1804 | .hljs-formula { 1805 | background-color: #eee; 1806 | font-style: italic 1807 | } 1808 | 1809 | .hljs-addition { 1810 | background-color: #baeeba 1811 | } 1812 | 1813 | .hljs-deletion { 1814 | background-color: #ffc8bd 1815 | } 1816 | 1817 | .hljs-selector-id,.hljs-selector-class { 1818 | color: #9b703f 1819 | } 1820 | 1821 | .hljs-doctag,.hljs-strong { 1822 | font-weight: bold 1823 | } 1824 | 1825 | .hljs-emphasis { 1826 | font-style: italic 1827 | } -------------------------------------------------------------------------------- /ShangzengBlog/static/fonts/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shangzeng/GolangTools/68e02ea6ad9a407f44efeeb3aee4ed77584ddadf/ShangzengBlog/static/fonts/.DS_Store -------------------------------------------------------------------------------- /ShangzengBlog/static/img/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shangzeng/GolangTools/68e02ea6ad9a407f44efeeb3aee4ed77584ddadf/ShangzengBlog/static/img/.DS_Store -------------------------------------------------------------------------------- /ShangzengBlog/static/img/10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shangzeng/GolangTools/68e02ea6ad9a407f44efeeb3aee4ed77584ddadf/ShangzengBlog/static/img/10.png -------------------------------------------------------------------------------- /ShangzengBlog/static/img/11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shangzeng/GolangTools/68e02ea6ad9a407f44efeeb3aee4ed77584ddadf/ShangzengBlog/static/img/11.png -------------------------------------------------------------------------------- /ShangzengBlog/static/img/12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shangzeng/GolangTools/68e02ea6ad9a407f44efeeb3aee4ed77584ddadf/ShangzengBlog/static/img/12.png -------------------------------------------------------------------------------- /ShangzengBlog/static/img/13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shangzeng/GolangTools/68e02ea6ad9a407f44efeeb3aee4ed77584ddadf/ShangzengBlog/static/img/13.png -------------------------------------------------------------------------------- /ShangzengBlog/static/img/14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shangzeng/GolangTools/68e02ea6ad9a407f44efeeb3aee4ed77584ddadf/ShangzengBlog/static/img/14.png -------------------------------------------------------------------------------- /ShangzengBlog/static/img/15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shangzeng/GolangTools/68e02ea6ad9a407f44efeeb3aee4ed77584ddadf/ShangzengBlog/static/img/15.png -------------------------------------------------------------------------------- /ShangzengBlog/static/img/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shangzeng/GolangTools/68e02ea6ad9a407f44efeeb3aee4ed77584ddadf/ShangzengBlog/static/img/16.png -------------------------------------------------------------------------------- /ShangzengBlog/static/img/17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shangzeng/GolangTools/68e02ea6ad9a407f44efeeb3aee4ed77584ddadf/ShangzengBlog/static/img/17.png -------------------------------------------------------------------------------- /ShangzengBlog/static/img/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shangzeng/GolangTools/68e02ea6ad9a407f44efeeb3aee4ed77584ddadf/ShangzengBlog/static/img/2.png -------------------------------------------------------------------------------- /ShangzengBlog/static/img/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shangzeng/GolangTools/68e02ea6ad9a407f44efeeb3aee4ed77584ddadf/ShangzengBlog/static/img/3.png -------------------------------------------------------------------------------- /ShangzengBlog/static/img/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shangzeng/GolangTools/68e02ea6ad9a407f44efeeb3aee4ed77584ddadf/ShangzengBlog/static/img/4.png -------------------------------------------------------------------------------- /ShangzengBlog/static/img/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shangzeng/GolangTools/68e02ea6ad9a407f44efeeb3aee4ed77584ddadf/ShangzengBlog/static/img/5.png -------------------------------------------------------------------------------- /ShangzengBlog/static/img/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shangzeng/GolangTools/68e02ea6ad9a407f44efeeb3aee4ed77584ddadf/ShangzengBlog/static/img/6.png -------------------------------------------------------------------------------- /ShangzengBlog/static/img/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shangzeng/GolangTools/68e02ea6ad9a407f44efeeb3aee4ed77584ddadf/ShangzengBlog/static/img/7.png -------------------------------------------------------------------------------- /ShangzengBlog/static/img/9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shangzeng/GolangTools/68e02ea6ad9a407f44efeeb3aee4ed77584ddadf/ShangzengBlog/static/img/9.png -------------------------------------------------------------------------------- /ShangzengBlog/static/img/GoBackChangchun_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shangzeng/GolangTools/68e02ea6ad9a407f44efeeb3aee4ed77584ddadf/ShangzengBlog/static/img/GoBackChangchun_1.png -------------------------------------------------------------------------------- /ShangzengBlog/static/img/GoBackChangchun_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shangzeng/GolangTools/68e02ea6ad9a407f44efeeb3aee4ed77584ddadf/ShangzengBlog/static/img/GoBackChangchun_2.png -------------------------------------------------------------------------------- /ShangzengBlog/static/img/GoBackChangchun_3.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shangzeng/GolangTools/68e02ea6ad9a407f44efeeb3aee4ed77584ddadf/ShangzengBlog/static/img/GoBackChangchun_3.jpeg -------------------------------------------------------------------------------- /ShangzengBlog/static/img/GoBackChangchun_4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shangzeng/GolangTools/68e02ea6ad9a407f44efeeb3aee4ed77584ddadf/ShangzengBlog/static/img/GoBackChangchun_4.jpg -------------------------------------------------------------------------------- /ShangzengBlog/static/img/IMG_5018.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shangzeng/GolangTools/68e02ea6ad9a407f44efeeb3aee4ed77584ddadf/ShangzengBlog/static/img/IMG_5018.PNG -------------------------------------------------------------------------------- /ShangzengBlog/static/img/WechatIMG2464.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shangzeng/GolangTools/68e02ea6ad9a407f44efeeb3aee4ed77584ddadf/ShangzengBlog/static/img/WechatIMG2464.png -------------------------------------------------------------------------------- /ShangzengBlog/static/img/WechatIMG2465.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shangzeng/GolangTools/68e02ea6ad9a407f44efeeb3aee4ed77584ddadf/ShangzengBlog/static/img/WechatIMG2465.png -------------------------------------------------------------------------------- /ShangzengBlog/static/img/WechatIMG2466.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shangzeng/GolangTools/68e02ea6ad9a407f44efeeb3aee4ed77584ddadf/ShangzengBlog/static/img/WechatIMG2466.png -------------------------------------------------------------------------------- /ShangzengBlog/static/img/WechatIMG2467.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shangzeng/GolangTools/68e02ea6ad9a407f44efeeb3aee4ed77584ddadf/ShangzengBlog/static/img/WechatIMG2467.png -------------------------------------------------------------------------------- /ShangzengBlog/static/img/WechatIMG2468.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shangzeng/GolangTools/68e02ea6ad9a407f44efeeb3aee4ed77584ddadf/ShangzengBlog/static/img/WechatIMG2468.png -------------------------------------------------------------------------------- /ShangzengBlog/static/img/WechatIMG2648.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shangzeng/GolangTools/68e02ea6ad9a407f44efeeb3aee4ed77584ddadf/ShangzengBlog/static/img/WechatIMG2648.png -------------------------------------------------------------------------------- /ShangzengBlog/static/img/WechatIMG2649.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shangzeng/GolangTools/68e02ea6ad9a407f44efeeb3aee4ed77584ddadf/ShangzengBlog/static/img/WechatIMG2649.png -------------------------------------------------------------------------------- /ShangzengBlog/static/img/WechatIMG2650.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shangzeng/GolangTools/68e02ea6ad9a407f44efeeb3aee4ed77584ddadf/ShangzengBlog/static/img/WechatIMG2650.png -------------------------------------------------------------------------------- /ShangzengBlog/static/img/beijing.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shangzeng/GolangTools/68e02ea6ad9a407f44efeeb3aee4ed77584ddadf/ShangzengBlog/static/img/beijing.jpg -------------------------------------------------------------------------------- /ShangzengBlog/static/img/image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shangzeng/GolangTools/68e02ea6ad9a407f44efeeb3aee4ed77584ddadf/ShangzengBlog/static/img/image.png -------------------------------------------------------------------------------- /ShangzengBlog/static/js/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shangzeng/GolangTools/68e02ea6ad9a407f44efeeb3aee4ed77584ddadf/ShangzengBlog/static/js/.DS_Store -------------------------------------------------------------------------------- /ShangzengBlog/static/js/axios.min.js: -------------------------------------------------------------------------------- 1 | /* axios v0.20.0 | (c) 2020 by Matt Zabriskie */ 2 | !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.axios=t():e.axios=t()}(this,function(){return function(e){function t(r){if(n[r])return n[r].exports;var o=n[r]={exports:{},id:r,loaded:!1};return e[r].call(o.exports,o,o.exports,t),o.loaded=!0,o.exports}var n={};return t.m=e,t.c=n,t.p="",t(0)}([function(e,t,n){e.exports=n(1)},function(e,t,n){"use strict";function r(e){var t=new s(e),n=i(s.prototype.request,t);return o.extend(n,s.prototype,t),o.extend(n,t),n}var o=n(2),i=n(3),s=n(4),a=n(22),u=n(10),c=r(u);c.Axios=s,c.create=function(e){return r(a(c.defaults,e))},c.Cancel=n(23),c.CancelToken=n(24),c.isCancel=n(9),c.all=function(e){return Promise.all(e)},c.spread=n(25),e.exports=c,e.exports.default=c},function(e,t,n){"use strict";function r(e){return"[object Array]"===R.call(e)}function o(e){return"undefined"==typeof e}function i(e){return null!==e&&!o(e)&&null!==e.constructor&&!o(e.constructor)&&"function"==typeof e.constructor.isBuffer&&e.constructor.isBuffer(e)}function s(e){return"[object ArrayBuffer]"===R.call(e)}function a(e){return"undefined"!=typeof FormData&&e instanceof FormData}function u(e){var t;return t="undefined"!=typeof ArrayBuffer&&ArrayBuffer.isView?ArrayBuffer.isView(e):e&&e.buffer&&e.buffer instanceof ArrayBuffer}function c(e){return"string"==typeof e}function f(e){return"number"==typeof e}function p(e){return null!==e&&"object"==typeof e}function d(e){if("[object Object]"!==R.call(e))return!1;var t=Object.getPrototypeOf(e);return null===t||t===Object.prototype}function l(e){return"[object Date]"===R.call(e)}function h(e){return"[object File]"===R.call(e)}function m(e){return"[object Blob]"===R.call(e)}function y(e){return"[object Function]"===R.call(e)}function g(e){return p(e)&&y(e.pipe)}function v(e){return"undefined"!=typeof URLSearchParams&&e instanceof URLSearchParams}function x(e){return e.replace(/^\s*/,"").replace(/\s*$/,"")}function w(){return("undefined"==typeof navigator||"ReactNative"!==navigator.product&&"NativeScript"!==navigator.product&&"NS"!==navigator.product)&&("undefined"!=typeof window&&"undefined"!=typeof document)}function b(e,t){if(null!==e&&"undefined"!=typeof e)if("object"!=typeof e&&(e=[e]),r(e))for(var n=0,o=e.length;n=200&&e<300}};u.headers={common:{Accept:"application/json, text/plain, */*"}},i.forEach(["delete","get","head"],function(e){u.headers[e]={}}),i.forEach(["post","put","patch"],function(e){u.headers[e]=i.merge(a)}),e.exports=u},function(e,t,n){"use strict";var r=n(2);e.exports=function(e,t){r.forEach(e,function(n,r){r!==t&&r.toUpperCase()===t.toUpperCase()&&(e[t]=n,delete e[r])})}},function(e,t,n){"use strict";var r=n(2),o=n(13),i=n(16),s=n(5),a=n(17),u=n(20),c=n(21),f=n(14);e.exports=function(e){return new Promise(function(t,n){var p=e.data,d=e.headers;r.isFormData(p)&&delete d["Content-Type"],(r.isBlob(p)||r.isFile(p))&&p.type&&delete d["Content-Type"];var l=new XMLHttpRequest;if(e.auth){var h=e.auth.username||"",m=unescape(encodeURIComponent(e.auth.password))||"";d.Authorization="Basic "+btoa(h+":"+m)}var y=a(e.baseURL,e.url);if(l.open(e.method.toUpperCase(),s(y,e.params,e.paramsSerializer),!0),l.timeout=e.timeout,l.onreadystatechange=function(){if(l&&4===l.readyState&&(0!==l.status||l.responseURL&&0===l.responseURL.indexOf("file:"))){var r="getAllResponseHeaders"in l?u(l.getAllResponseHeaders()):null,i=e.responseType&&"text"!==e.responseType?l.response:l.responseText,s={data:i,status:l.status,statusText:l.statusText,headers:r,config:e,request:l};o(t,n,s),l=null}},l.onabort=function(){l&&(n(f("Request aborted",e,"ECONNABORTED",l)),l=null)},l.onerror=function(){n(f("Network Error",e,null,l)),l=null},l.ontimeout=function(){var t="timeout of "+e.timeout+"ms exceeded";e.timeoutErrorMessage&&(t=e.timeoutErrorMessage),n(f(t,e,"ECONNABORTED",l)),l=null},r.isStandardBrowserEnv()){var g=(e.withCredentials||c(y))&&e.xsrfCookieName?i.read(e.xsrfCookieName):void 0;g&&(d[e.xsrfHeaderName]=g)}if("setRequestHeader"in l&&r.forEach(d,function(e,t){"undefined"==typeof p&&"content-type"===t.toLowerCase()?delete d[t]:l.setRequestHeader(t,e)}),r.isUndefined(e.withCredentials)||(l.withCredentials=!!e.withCredentials),e.responseType)try{l.responseType=e.responseType}catch(t){if("json"!==e.responseType)throw t}"function"==typeof e.onDownloadProgress&&l.addEventListener("progress",e.onDownloadProgress),"function"==typeof e.onUploadProgress&&l.upload&&l.upload.addEventListener("progress",e.onUploadProgress),e.cancelToken&&e.cancelToken.promise.then(function(e){l&&(l.abort(),n(e),l=null)}),p||(p=null),l.send(p)})}},function(e,t,n){"use strict";var r=n(14);e.exports=function(e,t,n){var o=n.config.validateStatus;n.status&&o&&!o(n.status)?t(r("Request failed with status code "+n.status,n.config,null,n.request,n)):e(n)}},function(e,t,n){"use strict";var r=n(15);e.exports=function(e,t,n,o,i){var s=new Error(e);return r(s,t,n,o,i)}},function(e,t){"use strict";e.exports=function(e,t,n,r,o){return e.config=t,n&&(e.code=n),e.request=r,e.response=o,e.isAxiosError=!0,e.toJSON=function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:this.config,code:this.code}},e}},function(e,t,n){"use strict";var r=n(2);e.exports=r.isStandardBrowserEnv()?function(){return{write:function(e,t,n,o,i,s){var a=[];a.push(e+"="+encodeURIComponent(t)),r.isNumber(n)&&a.push("expires="+new Date(n).toGMTString()),r.isString(o)&&a.push("path="+o),r.isString(i)&&a.push("domain="+i),s===!0&&a.push("secure"),document.cookie=a.join("; ")},read:function(e){var t=document.cookie.match(new RegExp("(^|;\\s*)("+e+")=([^;]*)"));return t?decodeURIComponent(t[3]):null},remove:function(e){this.write(e,"",Date.now()-864e5)}}}():function(){return{write:function(){},read:function(){return null},remove:function(){}}}()},function(e,t,n){"use strict";var r=n(18),o=n(19);e.exports=function(e,t){return e&&!r(t)?o(e,t):t}},function(e,t){"use strict";e.exports=function(e){return/^([a-z][a-z\d\+\-\.]*:)?\/\//i.test(e)}},function(e,t){"use strict";e.exports=function(e,t){return t?e.replace(/\/+$/,"")+"/"+t.replace(/^\/+/,""):e}},function(e,t,n){"use strict";var r=n(2),o=["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"];e.exports=function(e){var t,n,i,s={};return e?(r.forEach(e.split("\n"),function(e){if(i=e.indexOf(":"),t=r.trim(e.substr(0,i)).toLowerCase(),n=r.trim(e.substr(i+1)),t){if(s[t]&&o.indexOf(t)>=0)return;"set-cookie"===t?s[t]=(s[t]?s[t]:[]).concat([n]):s[t]=s[t]?s[t]+", "+n:n}}),s):s}},function(e,t,n){"use strict";var r=n(2);e.exports=r.isStandardBrowserEnv()?function(){function e(e){var t=e;return n&&(o.setAttribute("href",t),t=o.href),o.setAttribute("href",t),{href:o.href,protocol:o.protocol?o.protocol.replace(/:$/,""):"",host:o.host,search:o.search?o.search.replace(/^\?/,""):"",hash:o.hash?o.hash.replace(/^#/,""):"",hostname:o.hostname,port:o.port,pathname:"/"===o.pathname.charAt(0)?o.pathname:"/"+o.pathname}}var t,n=/(msie|trident)/i.test(navigator.userAgent),o=document.createElement("a");return t=e(window.location.href),function(n){var o=r.isString(n)?e(n):n;return o.protocol===t.protocol&&o.host===t.host}}():function(){return function(){return!0}}()},function(e,t,n){"use strict";var r=n(2);e.exports=function(e,t){function n(e,t){return r.isPlainObject(e)&&r.isPlainObject(t)?r.merge(e,t):r.isPlainObject(t)?r.merge({},t):r.isArray(t)?t.slice():t}function o(o){r.isUndefined(t[o])?r.isUndefined(e[o])||(i[o]=n(void 0,e[o])):i[o]=n(e[o],t[o])}t=t||{};var i={},s=["url","method","data"],a=["headers","auth","proxy","params"],u=["baseURL","transformRequest","transformResponse","paramsSerializer","timeout","timeoutMessage","withCredentials","adapter","responseType","xsrfCookieName","xsrfHeaderName","onUploadProgress","onDownloadProgress","decompress","maxContentLength","maxBodyLength","maxRedirects","transport","httpAgent","httpsAgent","cancelToken","socketPath","responseEncoding"],c=["validateStatus"];r.forEach(s,function(e){r.isUndefined(t[e])||(i[e]=n(void 0,t[e]))}),r.forEach(a,o),r.forEach(u,function(o){r.isUndefined(t[o])?r.isUndefined(e[o])||(i[o]=n(void 0,e[o])):i[o]=n(void 0,t[o])}),r.forEach(c,function(r){r in t?i[r]=n(e[r],t[r]):r in e&&(i[r]=n(void 0,e[r]))});var f=s.concat(a).concat(u).concat(c),p=Object.keys(e).concat(Object.keys(t)).filter(function(e){return f.indexOf(e)===-1});return r.forEach(p,o),i}},function(e,t){"use strict";function n(e){this.message=e}n.prototype.toString=function(){return"Cancel"+(this.message?": "+this.message:"")},n.prototype.__CANCEL__=!0,e.exports=n},function(e,t,n){"use strict";function r(e){if("function"!=typeof e)throw new TypeError("executor must be a function.");var t;this.promise=new Promise(function(e){t=e});var n=this;e(function(e){n.reason||(n.reason=new o(e),t(n.reason))})}var o=n(23);r.prototype.throwIfRequested=function(){if(this.reason)throw this.reason},r.source=function(){var e,t=new r(function(t){e=t});return{token:t,cancel:e}},e.exports=r},function(e,t){"use strict";e.exports=function(e){return function(t){return e.apply(null,t)}}}])}); 3 | //# sourceMappingURL=axios.min.map -------------------------------------------------------------------------------- /ShangzengBlog/test.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "log" 6 | "time" 7 | "github.com/gorilla/feeds" 8 | ) 9 | 10 | func main() { 11 | now := time.Now() 12 | feed := &feeds.Feed{ 13 | Title: "jmoiron.net blog", 14 | Link: &feeds.Link{Href: "http://jmoiron.net/blog"}, 15 | Description: "discussion about tech, footie, photos", 16 | Author: &feeds.Author{Name: "Jason Moiron", Email: "jmoiron@jmoiron.net"}, 17 | Created: now, 18 | } 19 | 20 | feed.Items = []*feeds.Item{ 21 | &feeds.Item{ 22 | Title: "Limiting Concurrency in Go", 23 | Link: &feeds.Link{Href: "http://jmoiron.net/blog/limiting-concurrency-in-go/"}, 24 | Description: "A discussion on controlled parallelism in golang", 25 | Author: &feeds.Author{Name: "Jason Moiron", Email: "jmoiron@jmoiron.net"}, 26 | Created: now, 27 | }, 28 | &feeds.Item{ 29 | Title: "Logic-less Template Redux", 30 | Link: &feeds.Link{Href: "http://jmoiron.net/blog/logicless-template-redux/"}, 31 | Description: "More thoughts on logicless templates", 32 | Created: now, 33 | }, 34 | &feeds.Item{ 35 | Title: "Idiomatic Code Reuse in Go", 36 | Link: &feeds.Link{Href: "http://jmoiron.net/blog/idiomatic-code-reuse-in-go/"}, 37 | Description: "How to use interfaces effectively", 38 | Created: now, 39 | }, 40 | } 41 | 42 | atom, err := feed.ToAtom() 43 | if err != nil { 44 | log.Fatal(err) 45 | } 46 | 47 | rss, err := feed.ToRss() 48 | if err != nil { 49 | log.Fatal(err) 50 | } 51 | 52 | json, err := feed.ToJSON() 53 | if err != nil { 54 | log.Fatal(err) 55 | } 56 | 57 | fmt.Println(atom, "\n", rss, "\n", json) 58 | } -------------------------------------------------------------------------------- /ShangzengBlog/view: -------------------------------------------------------------------------------- 1 | 1157 -------------------------------------------------------------------------------- /ShangzengBlog/views/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shangzeng/GolangTools/68e02ea6ad9a407f44efeeb3aee4ed77584ddadf/ShangzengBlog/views/.DS_Store -------------------------------------------------------------------------------- /ShangzengBlog/views/404.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 404 6 | 7 | 8 | 没有这个页面呢,
9 | 别实验了憨憨 :) 10 | 11 | -------------------------------------------------------------------------------- /ShangzengBlog/views/article.html: -------------------------------------------------------------------------------- 1 | {{ template "head.html" . }} 2 |
3 |
4 |
5 |

6 | {{.Title}} 7 |

8 | 9 |
10 | 11 | 发表于 12 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | {{.Tag}} 22 | 23 | 24 | 25 | 26 | 27 | 28 | comment... 29 | 30 |
31 | 32 |
33 | {{.Information}} 34 |
35 |
36 |
37 | 38 | {{ str2html .Content }} 39 | 40 |
41 |
    42 |
  • 43 | 本文作者: shangzeng 44 |
  • 45 | 49 |
  • 50 | 版权声明: 51 | 本博客所有文章除特别声明外,均采用「 知识共享署名4.0 」创作共享协议,转载请注明作者及原网址。 52 |
  • 53 |
54 |
55 |
56 | 83 |
84 |
85 | {{ template "foot.html" . }} -------------------------------------------------------------------------------- /ShangzengBlog/views/category.html: -------------------------------------------------------------------------------- 1 | {{template "head.html" .}} 2 |
3 |
4 |
5 | 6 |
7 | 分类: 8 | {{.Tag}} 9 |
10 | 11 |
12 |
13 | 14 | {{range $index, $elem := .Data}} 15 |
16 |
17 |
18 | 23 |
24 |
25 | {{$elem.Time}} 26 |
27 |
28 |
29 |
30 |
31 | {{end}} 32 | 33 |
34 | 35 |
36 |
37 |
38 |
39 | 55 |
56 |
57 |
58 | {{ template "foot.html" . }} -------------------------------------------------------------------------------- /ShangzengBlog/views/dnslog.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | DNSLog 6 | 7 | 8 | 9 | 10 | 11 | 12 | 16 |
17 | 18 | 19 |

20 |
 {{.Domainname}}.ft0fe6.ceye.io
21 |
22 |
23 | 25 | 26 | 27 | 28 | 29 | 30 | {{range $index, $elem := .DomainInfo}} 31 | 32 | 33 | 34 | 35 | 36 | {{end}} 37 |
DNS返回域名IP 地址创建时间
{{$elem.Name}}{{$elem.RemoteAddr}}{{$elem.CreatedAt}}
38 |
39 |
40 | 41 |
42 |
43 |
44 |
45 |
46 |
47 | 52 | 62 | -------------------------------------------------------------------------------- /ShangzengBlog/views/foot.html: -------------------------------------------------------------------------------- 1 | 9 | 10 | -------------------------------------------------------------------------------- /ShangzengBlog/views/head.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | {{.Title}} 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | Shangzeng's blog 28 | 29 | 30 | 31 | 32 |
33 |
34 | 60 |
61 | -------------------------------------------------------------------------------- /ShangzengBlog/views/index.html: -------------------------------------------------------------------------------- 1 | {{ template "head.html" . }} 2 |
3 |
4 |
5 | 6 | {{range $index, $elem := .Data}} 7 |
8 |
9 | 10 | 11 |
12 | 17 | 18 |
19 | 20 | 发表于 21 | 24 | 25 | 26 | 27 | 28 | 29 | {{$elem.Tag}} 30 | 31 | 32 | 33 | 34 | 35 | comment... 36 | 37 |
38 | 39 |
40 | 41 |
42 |

{{$elem.Information}}

43 |
44 | 45 | 46 |
47 |
48 |
49 | {{end}} 50 | 51 |
52 |
53 | 54 |
55 | 69 |
70 |
71 | 72 | {{ template "foot.html" . }} -------------------------------------------------------------------------------- /ShangzengBlog/views/page.html: -------------------------------------------------------------------------------- 1 | {{ template "head.html" . }} 2 |
3 |
4 |
5 | 6 | 7 | 8 |

9 |
10 | {{str2html .Content}} 11 |
12 |
13 |
14 | {{ template "foot.html" . }} --------------------------------------------------------------------------------