diff --git a/Dockerfile b/Dockerfile index e676ff7..a4d3583 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,13 +1,15 @@ FROM ubuntu:trusty MAINTAINER deepzz +RUN apt-get update +RUN apt-get install -y ca-certificates + ADD conf /eiblog/conf ADD static /eiblog/static ADD views /eiblog/views ADD eiblog /eiblog/eiblog -EXPOSE 80 -EXPOSE 443 +EXPOSE 9000 WORKDIR /eiblog ENTRYPOINT ["./eiblog"] \ No newline at end of file diff --git a/conf/app.yml b/conf/app.yml index c2103ef..6f5788b 100644 --- a/conf/app.yml +++ b/conf/app.yml @@ -1,7 +1,7 @@ # 静态文件版本 staticversion: 2 # 运行模式 dev or prod -runmode: dev +runmode: prod # 回收箱保留48小时 trash: -48 # 定时清理回收箱,%d小时 @@ -15,11 +15,11 @@ length: 200 # 截取预览标识 identifier: # favicon -favicon: //st.deepzz.com/static/img/favicon.png +favicon: //st.deepzz.com/static/img/favicon.ico # 起始ID,预留id不时之需, 不用管 startid: 11 # 静态文件地址, 后台js,css在用, cdn: //domain.com -static: //127.0.0.1:8080 +static: //deepzz.com # elasticsearch url searchurl: http://elasticsearch:9200 # 评论相关 @@ -33,13 +33,13 @@ modes: dev: # don't modify enablehttp: true - httpport: 8080 - domain: 127.0.0.1:8080 + httpport: 9000 + domain: deepzz.com prod: # you can fix certfile, keyfile, domain enablehttp: true - httpport: 80 - enablehttps: true + httpport: 9000 + enablehttps: false httpsport: 443 certfile: conf/certs/domain.pem keyfile: conf/certs/domain.key diff --git a/conf/nginx/eiblog.conf b/conf/nginx/domain/deepzz.conf similarity index 66% rename from conf/nginx/eiblog.conf rename to conf/nginx/domain/deepzz.conf index 26eb50f..8348407 100644 --- a/conf/nginx/eiblog.conf +++ b/conf/nginx/domain/deepzz.conf @@ -4,24 +4,25 @@ server { server_name www.deepzz.com deepzz.com; server_tokens off; - include /data/eiblog/nginx/ip.blacklist; + include /data/eiblog/conf/nginx/ip.blacklist; + # 现在一般证书是内置的。可以注释该项 # https://imququ.com/post/certificate-transparency.html#toc-2 # ssl_ct on; - # ssl_ct_static_scts /home/jerry/www/scts; + # ssl_ct_static_scts /data/eiblog/conf/scts; # 中间证书 + 站点证书 - ssl_certificate /data/eiblog/conf/certs/chained.pem; + ssl_certificate /data/eiblog/conf/ssl/domain.pem; # 创建 CSR 文件时用的密钥 - ssl_certificate_key /data/eiblog/conf/certs/domain.key; + ssl_certificate_key /data/eiblog/conf/ssl/domain.key; # openssl dhparam -out dhparams.pem 2048 # https://weakdh.org/sysadmin.html ssl_dhparam /data/eiblog/conf/ssl/dhparams.pem; # https://github.com/cloudflare/sslconfig/blob/master/conf - ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5; + ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5; # 如果启用了 RSA + ECDSA 双证书,Cipher Suite 可以参考以下配置: # ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+ECDSA+AES128:EECDH+aRSA+AES128:RSA+AES128:EECDH+ECDSA+AES256:EECDH+aRSA+AES256:RSA+AES256:EECDH+ECDSA+3DES:EECDH+aRSA+3DES:RSA+3DES:!MD5; @@ -37,19 +38,19 @@ server { # openssl rand 48 > session_ticket.key # 单机部署可以不指定 ssl_session_ticket_key - ssl_session_ticket_key /data/eiblog/conf/ssl/session_ticket.key; + # ssl_session_ticket_key /data/eiblog/conf/ssl/session_ticket.key; ssl_stapling on; ssl_stapling_verify on; # 根证书 + 中间证书 # https://imququ.com/post/why-can-not-turn-on-ocsp-stapling.html - # ssl_trusted_certificate /home/jerry/www/ssl/full_chained.pem; + # ssl_trusted_certificate /data/eiblog/conf/ssl/full_chained.pem; resolver 114.114.114.114 valid=300s; resolver_timeout 10s; - access_log /data/eiblog/log/nginx.log; + access_log /data/eiblog/logdata/nginx.log; if ($request_method !~ ^(GET|HEAD|POST|OPTIONS)$ ) { return 444; @@ -59,8 +60,9 @@ server { rewrite ^/(.*)$ https://deepzz.com/$1 permanent; } + # webmaster 站点验证相关 location ~* (robots\.txt|favicon\.ico|crossdomain\.xml|google4c90d18e696bdcf8\.html|BingSiteAuth\.xml)$ { - root /home/jerry/www/imququ.com/www/static; + root /data/eiblog/static; expires 1d; } @@ -80,7 +82,7 @@ server { } location ^~ /static/ { - root /home/jerry/www/imququ.com/www; + root /data/eiblog; add_header Access-Control-Allow-Origin *; expires max; } @@ -96,13 +98,14 @@ server { add_header X-Content-Type-Options nosniff; - proxy_set_header X-Via QingDao.Aliyun; + # proxy_set_header X-Via QingDao.Aliyun; proxy_set_header Connection ""; - proxy_set_header Host imququ.com; + proxy_set_header Host deepzz.com; proxy_set_header X-Real_IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-XSS-Protection 1; mode=block; - proxy_pass http://127.0.0.1:9095; + proxy_pass http://127.0.0.1:9000; } location / { @@ -111,8 +114,11 @@ server { add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"; add_header X-Frame-Options deny; add_header X-Content-Type-Options nosniff; - add_header Content-Security-Policy "default-src 'none'; script-src 'unsafe-inline' 'unsafe-eval' blob: https:; img-src data: https: http://ip.qgy18.com; style-src 'unsafe-inline' https:; child-src https:; connect-src 'self' https://translate.googleapis.com; frame-src https://disqus.com https://www.slideshare.net"; - add_header Public-Key-Pins 'pin-sha256="YLh1dUR9y6Kja30RrAn7JKnbQG/uEtLMkBgFF2Fuihg="; pin-sha256="aef6IF2UF6jNEwA2pNmP7kpgT6NFSdt7Tqf5HzaIGWI="; max-age=2592000; includeSubDomains'; + # 改deepzz相关的 + add_header Content-Security-Policy "default-src 'none'; script-src 'unsafe-inline' 'unsafe-eval' blob: https:; img-src data: https: https://st.deepzz.com; style-src 'unsafe-inline' https:; child-src https:; connect-src 'self' https://translate.googleapis.com; frame-src https://disqus.com https://www.slideshare.net"; + # 中间证书证书指纹 + # https://imququ.com/post/http-public-key-pinning.html + add_header Public-Key-Pins 'pin-sha256="JbQbUG5JMJUoI6brnx0x3vZF6jilxsapbXGVfjhN8Fg="; pin-sha256="YLh1dUR9y6Kja30RrAn7JKnbQG/uEtLMkBgFF2Fuihg="; max-age=2592000; includeSubDomains'; add_header Cache-Control no-cache; proxy_ignore_headers Set-Cookie; @@ -120,13 +126,13 @@ server { proxy_hide_header Vary; proxy_hide_header X-Powered-By; - proxy_set_header X-Via QingDao.Aliyun; + # proxy_set_header X-Via QingDao.Aliyun; proxy_set_header Connection ""; proxy_set_header Host deepzz.com; proxy_set_header X-Real_IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_pass http://127.0.0.1:9095; + proxy_pass http://127.0.0.1:9000; } } @@ -148,4 +154,29 @@ server { location / { rewrite ^/(.*)$ https://deepzz.com/$1 permanent; } +} + +# 原博客,内部做的转发 +server { + server_name blog.deepzz.com; + access_log /dev/null; + + location / { + rewrite ^/(.*)$ https://blog.deepzz.com/$1 permanent; + } +} + +server { + listen 443; + server_name blog.deepzz.com; + + add_header Strict-Transport-Security "max-age=31536000"; + add_header X-Frame-Options deny; + add_header X-Content-Type-Options nosniff; + add_header X-Xss-Protection "1; mode=block;"; + + + location / { + proxy_pass https://127.0.0.1:9010; + } } \ No newline at end of file diff --git a/conf/nginx/ip.blacklist b/conf/nginx/ip.blacklist new file mode 100644 index 0000000..e69de29 diff --git a/conf/nginx/nginx.conf b/conf/nginx/nginx.conf index 239e3c7..b6ffe6c 100644 --- a/conf/nginx/nginx.conf +++ b/conf/nginx/nginx.conf @@ -1,95 +1,131 @@ -user www-data; -worker_processes 4; -pid /run/nginx.pid; + +#user nobody; +worker_processes 1; + +#error_log logs/error.log; +#error_log logs/error.log notice; +#error_log logs/error.log info; + +#pid logs/nginx.pid; + events { - worker_connections 768; - # multi_accept on; + worker_connections 1024; } + http { + include mime.types; + default_type application/octet-stream; + charset UTF-8; + #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' + # '$status $body_bytes_sent "$http_referer" ' + # '"$http_user_agent" "$http_x_forwarded_for"'; - ## - # Basic Settings - ## + #access_log logs/access.log main; - sendfile on; - tcp_nopush on; - tcp_nodelay on; - keepalive_timeout 65; - types_hash_max_size 2048; - # server_tokens off; + sendfile on; + tcp_nopush on; + tcp_nodelay on; - # server_names_hash_bucket_size 64; - # server_name_in_redirect off; + #keepalive_timeout 0; + keepalive_timeout 65; - include /etc/nginx/mime.types; - default_type application/octet-stream; - - ## - # Logging Settings - ## + gzip on; + gzip_vary on; - access_log /var/log/nginx/access.log; - error_log /var/log/nginx/error.log; + gzip_comp_level 6; + gzip_buffers 16 8k; - ## - # Gzip Settings - ## + gzip_min_length 1000; + gzip_proxied any; + gzip_disable "msie6"; - gzip on; - gzip_disable "msie6"; + gzip_http_version 1.0; - gzip_min_length 1000; - gzip_vary on; - gzip_proxied any; - gzip_comp_level 6; - gzip_buffers 16 8k; - gzip_http_version 1.1; - gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript image/svg+xml; - ## - # nginx-naxsi config - ## - # Uncomment it if you installed nginx-naxsi - ## + gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript image/svg+xml; - #include /etc/nginx/naxsi_core.rules; + server { + listen 80; + server_name localhost; - ## - # nginx-passenger config - ## - # Uncomment it if you installed nginx-passenger - ## + #charset koi8-r; - #passenger_root /usr; - #passenger_ruby /usr/bin/ruby; + #access_log logs/host.access.log main; - ## - # Virtual Host Configs - ## + location / { + root html; + index index.html index.htm; + } - include /etc/nginx/conf.d/*.conf; - include /etc/nginx/sites-enabled/*; + #error_page 404 /404.html; + + # redirect server error pages to the static page /50x.html + # + error_page 500 502 503 504 /50x.html; + location = /50x.html { + root html; + } + + # proxy the PHP scripts to Apache listening on 127.0.0.1:80 + # + #location ~ \.php$ { + # proxy_pass http://127.0.0.1; + #} + + # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 + # + #location ~ \.php$ { + # root html; + # fastcgi_pass 127.0.0.1:9000; + # fastcgi_index index.php; + # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; + # include fastcgi_params; + #} + + # deny access to .htaccess files, if Apache's document root + # concurs with nginx's one + # + #location ~ /\.ht { + # deny all; + #} + } + + + # another virtual host using mix of IP-, name-, and port-based configuration + # + #server { + # listen 8000; + # listen somename:8080; + # server_name somename alias another.alias; + + # location / { + # root html; + # index index.html index.htm; + # } + #} + + + # HTTPS server + # + #server { + # listen 443 ssl; + # server_name localhost; + + # ssl_certificate cert.pem; + # ssl_certificate_key cert.key; + + # ssl_session_cache shared:SSL:1m; + # ssl_session_timeout 5m; + + # ssl_ciphers HIGH:!aNULL:!MD5; + # ssl_prefer_server_ciphers on; + + # location / { + # root html; + # index index.html index.htm; + # } + #} + + include /data/eiblog/conf/nginx/domain/*.conf; } - - -#mail { -# # See sample authentication script at: -# # http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript -# -# # auth_http localhost/auth.php; -# # pop3_capabilities "TOP" "USER"; -# # imap_capabilities "IMAP4rev1" "UIDPLUS"; -# -# server { -# listen localhost:110; -# protocol pop3; -# proxy on; -# } -# -# server { -# listen localhost:143; -# protocol imap; -# proxy on; -# } -#} \ No newline at end of file diff --git a/conf/scts/aviator.sct b/conf/scts/aviator.sct new file mode 100644 index 0000000..e357395 Binary files /dev/null and b/conf/scts/aviator.sct differ diff --git a/conf/scts/digicert.sct b/conf/scts/digicert.sct new file mode 100644 index 0000000..55a9d06 Binary files /dev/null and b/conf/scts/digicert.sct differ diff --git a/conf/ssl/dhparams.pem b/conf/ssl/dhparams.pem new file mode 100644 index 0000000..4022005 --- /dev/null +++ b/conf/ssl/dhparams.pem @@ -0,0 +1,8 @@ +-----BEGIN DH PARAMETERS----- +MIIBCAKCAQEAzkJoGFJJGMXQBVIq0DFom7qI3vD7Z8JMQnfCLpoi9AfqW6kGq/bR +FhK9fuRkO+GdzZasx1mSNRQeX8GdaQM4GUn0yel7fxlxNC59mxo++P8NvmxQ47l4 +K9QpIRuqxa5UKIG6g3N5pkLwGjcD9a79v4DJn4XA9cVjRYc4BnYmiArgaMFOmGPy +KmvU/VhFv8fnxSfn8uCmAGSuHmfbjx5TMfCqaeXzmmhyvpSl88JZfGlwOtXcOU0K +O2JhNRKtaicZlevC8gtpFDNYKnf4K9kiUVmq0JLvuzOxN05sQoPYFCvgMFIYf+ND +Jwtv7FWF2hQV3y1Xms7ja4776FcP9QlKuwIBAg== +-----END DH PARAMETERS----- diff --git a/conf/ssl/domain.key b/conf/ssl/domain.key new file mode 100644 index 0000000..957ea32 --- /dev/null +++ b/conf/ssl/domain.key @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEpAIBAAKCAQEAmUN+euOPxGgtCrNrRzbmtXXLpUEdFlYnVRmhoG60n3m1RUFq +a/wN9e95oViHKrXfUzU6cGnsmHZ0Vcls/WQZ7Z8nZ6J6ZrjRASa88I1pFyrKlC9F +FzZF/8Gfh0zkP7Pp4hNl+gMkLFIVueFNNPrQLldNva95aWomqtFJ80/3RghV2NL/ +DdT0XLmkvWT7NFIu5e1xwflzaA4d5Dr5Sxt2dehnhXSsK8yTB8DCsEgB73S5Eo9Y +lFk2udHpl/6h9MV8Tu+LA3D2KXj+IBTJwn9haEm3eXqEoAP+rH5UD3ycodc4Pe// +5tJaWCUZcgWdFDf89mYaIAsE6C9oMj/f4r2ygwIDAQABAoIBAAZZG9OGOm21rOvt +C4v7E6o/c0xoeoZy0hU9xwqIm1WhqmbwczJ+0as2nJCYxJx5xQLCySVf1cto2J+3 +BJsoOsSzW2P5AF3h2NJV4uyJxukNPi/OF2wDNPoHcI6fmjKjRpQ1HnuxBp4JVloJ +IXQI0Xeh6RfqvTonCev4WDpKPSE65b6ztStVAIm/uetfqLbHHXN5SyCojaWPKcOI +kEvfZZjhzuEeCq9nJ5aVpPCpVxqG+1/OnxHoxQ6/ABT6q01US/mQMOZ2nCHR/DYC +r26DU7zNrOtaFgerNlTnVeKgAy0KC0J727q1fpXbSbACayKiQsHlz5XBvsX5aKcv +CO/P7YkCgYEAxkNh+siSHvcMbi9Gx2A4+CVFk4YEd0q8Ublap2hXf8rJRSGML1bW +g3F0iG2nKKYOQpLXPVLAhxm0jtX+OPGyOai/QzILLwLAPx9ugeJOXAcklBPixdMi +SUNs7ycVHgQMg1wK/5Xhzeyh12lyF9Ks7/KYLEZ8bE6fMrMPVY/+pckCgYEAxeVf +TIHKdhMt1XSNkoUhogUZvGHOAbcbcgmN9SO5x/WiVvlk8jQuOOszU+4yJyaXp2rs +sekyjaA0GVte1V9YvKZ0tGZDKGPGdwuxgkf0Ev6l8UT2KLtRRn4tYGJ+/wMnDavM +LZPss4Za++8ygsB988W+OngO5lYdnMF4fHls6+sCgYBJKJ4kAxTgNjsxAWL1uQzs +jBxTZnWJa1t4MJRCB9+ZuUNxrgJjiYCYeioNGaE//55tdG/WIg4HDDYzKsWnT5B7 +dEg3TGUSEMrNwBRv+wj9LmmR9pCMfO8+55Fv4hUJwWa4piMs0qrC6NmDelZucf/8 +fqEmXVAWSyC1fZtf8EV/+QKBgQCIWnbDXFqH6McX4Gr7nceCv0jwR+ONwwCiHns1 +gRws7s6gZs5rJBEFHuoK1oCwASNVM5NLMoamls/O+Onq0vttYLPg6OU1GypQNDpm +rfU6cUMdboq9nfNuQto5IySlySJLhSf174qUV+qw1CtVdBRUttdPqhF6G7PjolrG +SVQHaQKBgQC63BTyKwxUEdWdU5oKkmBv9nKpJNeGrHQanFygYhnZcXURDiGPr/sY +X/oMukIKLu73PH/VsVq8EfvWRsyJrSovrqZTGIhqvL0JlvmqJ89vlpQSm/cwzrLA +kNYtXfswl67dSwHcrUQ7vvSJWBAoxHTBQEvcV6ffUQW3t2jgjZ71oA== +-----END RSA PRIVATE KEY----- diff --git a/conf/ssl/domain.pem b/conf/ssl/domain.pem new file mode 100644 index 0000000..52f7f87 --- /dev/null +++ b/conf/ssl/domain.pem @@ -0,0 +1,65 @@ +-----BEGIN CERTIFICATE----- +MIIFyDCCBLCgAwIBAgIQL+zOTGJbRDujAYL+Ju6BDDANBgkqhkiG9w0BAQsFADCB +lzELMAkGA1UEBhMCQ04xJTAjBgNVBAoTHFRydXN0QXNpYSBUZWNobm9sb2dpZXMs +IEluYy4xHzAdBgNVBAsTFlN5bWFudGVjIFRydXN0IE5ldHdvcmsxHTAbBgNVBAsT +FERvbWFpbiBWYWxpZGF0ZWQgU1NMMSEwHwYDVQQDExhUcnVzdEFzaWEgRFYgU1NM +IENBIC0gRzUwHhcNMTYwODMxMDAwMDAwWhcNMTcwODMxMjM1OTU5WjAXMRUwEwYD +VQQDDAwqLmRlZXB6ei5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB +AQCZQ35644/EaC0Ks2tHNua1dculQR0WVidVGaGgbrSfebVFQWpr/A3173mhWIcq +td9TNTpwaeyYdnRVyWz9ZBntnydnonpmuNEBJrzwjWkXKsqUL0UXNkX/wZ+HTOQ/ +s+niE2X6AyQsUhW54U00+tAuV029r3lpaiaq0UnzT/dGCFXY0v8N1PRcuaS9ZPs0 +Ui7l7XHB+XNoDh3kOvlLG3Z16GeFdKwrzJMHwMKwSAHvdLkSj1iUWTa50emX/qH0 +xXxO74sDcPYpeP4gFMnCf2FoSbd5eoSgA/6sflQPfJyh1zg97//m0lpYJRlyBZ0U +N/z2ZhogCwToL2gyP9/ivbKDAgMBAAGjggKNMIICiTAjBgNVHREEHDAaggwqLmRl +ZXB6ei5jb22CCmRlZXB6ei5jb20wCQYDVR0TBAIwADBhBgNVHSAEWjBYMFYGBmeB +DAECATBMMCMGCCsGAQUFBwIBFhdodHRwczovL2Quc3ltY2IuY29tL2NwczAlBggr +BgEFBQcCAjAZDBdodHRwczovL2Quc3ltY2IuY29tL3JwYTAfBgNVHSMEGDAWgBRt +WMd/GufhPy6mjJc1Qrv00zisPzAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYI +KwYBBQUHAwEGCCsGAQUFBwMCMIGbBggrBgEFBQcBAQSBjjCBizA8BggrBgEFBQcw +AYYwaHR0cDovL3RydXN0YXNpYTItb2NzcC5kaWdpdGFsY2VydHZhbGlkYXRpb24u +Y29tMEsGCCsGAQUFBzAChj9odHRwOi8vdHJ1c3Rhc2lhMi1haWEuZGlnaXRhbGNl +cnR2YWxpZGF0aW9uLmNvbS90cnVzdGFzaWFnNS5jcnQwggEEBgorBgEEAdZ5AgQC +BIH1BIHyAPAAdgDd6x0reg1PpiCLga2BaHB+Lo6dAdVciI09EcTNtuy+zAAAAVbf +IVw3AAAEAwBHMEUCIEAjEfQw6guzwAUvOg7odMLsEt+msEBdEL3nPBU3bdgdAiEA ++XbyaL/WjeB+K6ICRvH7caki4gBbxGHDrsCcrhIpEDAAdgCkuQmQtBhYFIe7E6LM +Z3AKPDWYBPkb37jjd80OyA3cEAAAAVbfIV3DAAAEAwBHMEUCIAkPqq/ZORARqlYn +8th65SLQM4f/10428QJSfVn6qn+sAiEAhotgQvwB5w2NtZlCpFHL8ESSJTjVu1YN +FVvemugJ788wDQYJKoZIhvcNAQELBQADggEBAD2cLVIL39x+wGKgYA68MmRPKweg +tiniflJU9EBssG3ry6apc014wvh/fGS02uQMkd+ZiyjwAExuNISqNlQ2NaEbVfKR +kgR8kka2fmaTlYASWkHWPAiLq28kFQro2mXBurZkb9WQWTgrCrYRX2y4UJ7fvrjw +q+VHgwmS/vtEoB7gGC1gM5oIiXdalJlqxc2OJ1NW7O3SpM/EoGYD+M6WPianeecY +w37BDCiWlbX/+6PcRk3v8D+2GTdhjn5KUJH+Tbqi5bNSkCoxF4eFY6yiS1MDFJnp +Yv+CHlHLNhqR7g59URv1+QCBgT7XHuBjNVtq2lX608W9X2mTQH0SRucqRUc= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFZTCCBE2gAwIBAgIQOhAOfxCeGsWcxf/2QNXkQjANBgkqhkiG9w0BAQsFADCB +yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL +ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp +U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW +ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5IC0gRzUwHhcNMTYwODExMDAwMDAwWhcNMjYwODEwMjM1OTU5WjCBlzEL +MAkGA1UEBhMCQ04xJTAjBgNVBAoTHFRydXN0QXNpYSBUZWNobm9sb2dpZXMsIElu +Yy4xHzAdBgNVBAsTFlN5bWFudGVjIFRydXN0IE5ldHdvcmsxHTAbBgNVBAsTFERv +bWFpbiBWYWxpZGF0ZWQgU1NMMSEwHwYDVQQDExhUcnVzdEFzaWEgRFYgU1NMIENB +IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC39aSJZG/97x3a +6Qmuc9+MubagegRAVUmFYHTYTs8IKB2pM7wXN7W8mekdZaEgUjDFxvRBK/DhTb7U +8ONLsKKdT86aOhzbz2noCTn9wPWnGwkg+/4YKg/dPQQdV9tMsSu0cwqInWHxSAkm +AI1hYFC9D7Sf7Hp/5cRcD+dK454YMRzNOGLQnCVI8JEqrz6o9SOvQNTqTcfqt6DC +0UlXG+MPD1eNPjlzf1Vwaab+VSTgySoC+Ikbq2VsdykeOiGXW/OIiASH7+2LcR05 +PmQ7GEOlM8yzoVojFpM8sHz+WxI05ZOPri5+vX3HhHHjWr5432G0dVmgohnZvlVZ +oy8XrlbpAgMBAAGjggF2MIIBcjASBgNVHRMBAf8ECDAGAQH/AgEAMC8GA1UdHwQo +MCYwJKAioCCGHmh0dHA6Ly9zLnN5bWNiLmNvbS9wY2EzLWc1LmNybDAOBgNVHQ8B +Af8EBAMCAQYwLgYIKwYBBQUHAQEEIjAgMB4GCCsGAQUFBzABhhJodHRwOi8vcy5z +eW1jZC5jb20wYQYDVR0gBFowWDBWBgZngQwBAgEwTDAjBggrBgEFBQcCARYXaHR0 +cHM6Ly9kLnN5bWNiLmNvbS9jcHMwJQYIKwYBBQUHAgIwGRoXaHR0cHM6Ly9kLnN5 +bWNiLmNvbS9ycGEwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMCkGA1Ud +EQQiMCCkHjAcMRowGAYDVQQDExFTeW1hbnRlY1BLSS0yLTYwMTAdBgNVHQ4EFgQU +bVjHfxrn4T8upoyXNUK79NM4rD8wHwYDVR0jBBgwFoAUf9Nlp8Ld7LvwMAnzQzn6 +Aq8zMTMwDQYJKoZIhvcNAQELBQADggEBABUphhBbeG7scE3EveIN0dOjXPgwgQi8 +I2ZAKYm6DawoGz1lEJVdvFmkyMbP973X80b7mKmn0nNbe1kjA4M0O0hHaMM1ZaEv +7e9vHEAoGyysMO6HzPWYMkyNxcCV7Nos2Uv4RvLDpQHh7P4Kt6fUU13ipcynrtQD +1lFUM0yoTzwwFsPu3Pk+94hL58ErqwqJQwxoHMgLIQeMVHeNKcWFy1bddSbIbCWU +Zs6cMxhrra062ZCpDCbxyEaFNGAtYQMqNz55Z/14XgSUONZ/cJTns6QKhpcgTOwB +fnNzRnk+aWreP7osKhXlz4zs+llP7goBDKFOMMtoEXx3YjJCKgpqmBU= +-----END CERTIFICATE----- + diff --git a/conf/ssl/session_ticket.key b/conf/ssl/session_ticket.key new file mode 100644 index 0000000..c80651d --- /dev/null +++ b/conf/ssl/session_ticket.key @@ -0,0 +1 @@ +`*d٘\H =3`)jIu8%k+7H \ No newline at end of file diff --git a/conf/tpl/feedTpl.xml b/conf/tpl/feedTpl.xml index 46a7568..3e9c410 100644 --- a/conf/tpl/feedTpl.xml +++ b/conf/tpl/feedTpl.xml @@ -3,7 +3,7 @@ {{.Title}} {{if .EnableHttps}}https://{{else}}http://{{end}}{{.Domain}} - + {{.SubTitle}} zh-CN {{.BuildDate}} diff --git a/static/opensearch.xml b/conf/tpl/opensearchTpl.xml similarity index 50% rename from static/opensearch.xml rename to conf/tpl/opensearchTpl.xml index c8b4d9d..0e97f5e 100644 --- a/static/opensearch.xml +++ b/conf/tpl/opensearchTpl.xml @@ -1,6 +1,6 @@ - + - Deepzz's Blog - 不抛弃,不放弃 - + {{.BTitle}} + {{.SubTitle}} + \ No newline at end of file diff --git a/db.go b/db.go index aab795c..6d1d1bd 100644 --- a/db.go +++ b/db.go @@ -11,7 +11,6 @@ import ( "time" "github.com/EiBlog/blackfriday" - "github.com/EiBlog/eiblog/helper" "github.com/EiBlog/eiblog/setting" "github.com/EiBlog/utils/logd" db "github.com/EiBlog/utils/mgo" @@ -95,7 +94,7 @@ func init() { // 启动定时器 go timer() // 获取评论数量 - // go CommentsCount() + go CommentsCount() } // 读取或初始化帐号信息 @@ -106,7 +105,7 @@ func loadAccount() (a *Account) { if err == mgo.ErrNotFound { a = &Account{ Username: setting.Conf.Account.Username, - Password: helper.EncryptPasswd(setting.Conf.Account.Username, setting.Conf.Account.Password), + Password: EncryptPasswd(setting.Conf.Account.Username, setting.Conf.Account.Password), Email: setting.Conf.Account.Email, PhoneN: setting.Conf.Account.PhoneNumber, Address: setting.Conf.Account.Address, @@ -173,7 +172,7 @@ func generateMarkdown() { buffer.WriteString(serie.Desc) buffer.WriteString("\n\n") for _, artc := range serie.Articles { - // * [标题一](/post/hello-world.html) (Man 02, 2006) + //eg. * [标题一](/post/hello-world.html) (Man 02, 2006) buffer.WriteString("* [" + artc.Title + "](/post/" + artc.Slug + ".html) (" + artc.CreateTime.Format("Jan 02, 2006") + ")\n") } buffer.WriteByte('\n') diff --git a/disqus.go b/disqus.go index 2dd7837..3c9f388 100644 --- a/disqus.go +++ b/disqus.go @@ -27,9 +27,9 @@ func CommentsCount() { return } baseUrl := setting.Conf.Disqus.URL + "?api_key=" + setting.Conf.Disqus.PublicKey + "&forum=" + setting.Conf.Disqus.ShortName + "&" - domain := "http:" + runmode.Domain + domain := "http://" + runmode.Domain if runmode.EnableHttps { - domain = "https:" + runmode.Domain + domain = "https://" + runmode.Domain } var count, index int for index < len(Ei.Articles) { diff --git a/docker-compose.yml b/docker-compose.yml index cbe0b83..2ff2010 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -4,7 +4,7 @@ services: image: mongo:3.2 container_name: eidb volumes: - - /data/eiblog/db:/data/db + - /data/eiblog/mgodb:/data/db restart: always elasticsearch: image: elasticsearch:2.4 @@ -26,11 +26,10 @@ services: volumes: - /data/eiblog/logdata:/eiblog/logdata - /data/eiblog/conf:/eiblog/conf + - /data/eiblog/static:/eiblog/static links: - elasticsearch - mongodb ports: - - "443:443" - - "80:80" - - "8080:8080" + - "9000:9000" restart: always \ No newline at end of file diff --git a/elasticsearch.go b/elasticsearch.go index 76e1fc0..ce6ac2e 100644 --- a/elasticsearch.go +++ b/elasticsearch.go @@ -145,7 +145,7 @@ func ElasticIndex(artc *Article) error { "content": artc.Content, "slug": artc.Slug, "tags": artc.Tags, - "create_time": artc.CreateTime.Format("2006-01-02"), + "create_time": artc.CreateTime, } b, _ := json.Marshal(mapping) return IndexOrUpdateDocument(INDEX, TYPE, artc.ID, b) diff --git a/front.go b/front.go index 7c16c24..b2257ec 100644 --- a/front.go +++ b/front.go @@ -79,7 +79,7 @@ func GetBase() gin.H { func HandleHomePage(c *gin.Context) { h := GetBase() h["Version"] = StaticVersion(c) - h["Title"] = Ei.BTitle + h["Title"] = Ei.BTitle + " | " + Ei.SubTitle h["Path"] = c.Request.URL.Path h["HomePage"] = true h["CurrentPage"] = "blog-home" @@ -198,25 +198,22 @@ func HandleSearchPage(c *gin.Context) { c.HTML(http.StatusOK, "homeLayout.html", h) } +func HandleBeacon(c *gin.Context) {} + func HandleFeed(c *gin.Context) { - http.ServeFile(c.Writer, c.Request, "conf/feed.xml") + http.ServeFile(c.Writer, c.Request, "static/feed.xml") } func HandleOpenSearch(c *gin.Context) { - c.Header("Content-Type", "application/xml; charset=utf-8") - c.Writer.WriteString("\n") - c.HTML(http.StatusOK, "opensearch.xml", gin.H{ - "BTitle": Ei.BTitle, - "SubTitle": Ei.SubTitle, - }) + http.ServeFile(c.Writer, c.Request, "static/opensearch.xml") } func HandleRobots(c *gin.Context) { - http.ServeFile(c.Writer, c.Request, "conf/robots.txt") + http.ServeFile(c.Writer, c.Request, "static/robots.txt") } func HandleSitemap(c *gin.Context) { - http.ServeFile(c.Writer, c.Request, "conf/sitemap.xml") + http.ServeFile(c.Writer, c.Request, "static/sitemap.xml") } func HandleComments(c *gin.Context) { diff --git a/main.go b/main.go index b7b5be7..65c7ca5 100644 --- a/main.go +++ b/main.go @@ -2,18 +2,14 @@ package main import ( - "net/http" - _ "net/http/pprof" - - "github.com/EiBlog/utils/logd" +// "net/http" +// _ "net/http/pprof" ) func main() { - // set log print level - logd.SetLevel(logd.Ldebug) // pprof - go func() { - http.ListenAndServe(":6060", nil) - }() + // go func() { + // http.ListenAndServe(":6060", nil) + // }() Run() } diff --git a/pingrpc.go b/pingrpc.go new file mode 100644 index 0000000..85f0393 --- /dev/null +++ b/pingrpc.go @@ -0,0 +1 @@ +package main \ No newline at end of file diff --git a/router.go b/router.go index 6a490ee..deb9059 100644 --- a/router.go +++ b/router.go @@ -19,6 +19,8 @@ var runmode = setting.Conf.Modes[setting.Conf.RunMode] func init() { if setting.Conf.RunMode == setting.PROD { gin.SetMode(gin.ReleaseMode) + // set log print level + logd.SetLevel(logd.Lerror) } router = gin.Default() store := sessions.NewCookieStore([]byte("eiblog321")) @@ -49,7 +51,9 @@ func init() { router.GET("/series.html", HandleSeriesPage) router.GET("/archives.html", HandleArchivesPage) router.GET("/search.html", HandleSearchPage) + router.GET("/beacon.html", HandleBeacon) router.GET("/data/comment", HandleComments) + router.GET("/rss.html", HandleFeed) router.GET("/feed", HandleFeed) router.GET("/opensearch.xml", HandleOpenSearch) router.GET("/sitemap.xml", HandleSitemap) diff --git a/setting/setting.go b/setting/setting.go index 8141f9b..777d509 100644 --- a/setting/setting.go +++ b/setting/setting.go @@ -81,7 +81,7 @@ func init() { data, err = ioutil.ReadFile(path.Join(dir, "blackip.yml")) checkError(err) err = yaml.Unmarshal(data, BlackIP) - chekError(err) + checkError(err) } func checkError(err error) { diff --git a/static/BingSiteAuth.xml b/static/BingSiteAuth.xml new file mode 100644 index 0000000..e69de29 diff --git a/static/blog.css b/static/blog.css deleted file mode 100644 index b3d9fde..0000000 --- a/static/blog.css +++ /dev/null @@ -1 +0,0 @@ -*{margin:0;padding:0}html,body{height:100%}body{background:#ddd;color:#666;font-size:14px;font-family:"-apple-system","Open Sans","HelveticaNeue-Light","Helvetica Neue Light","Helvetica Neue",Helvetica,Arial,sans-serif}::selection,::-moz-selection,::-webkit-selection{background-color:#2479CC;color:#eee}h1{font-size:2em}h3{font-size:1.3em}h4{font-size:1.1em}a{color:#2479CC;text-decoration:none}article{border-bottom:1px solid #ddd;border-top:1px solid #fff;padding:30px 0;position:relative}.container{max-width:1600px;min-height:100%;position:relative}.left-col{background-color:#007b8b;background-image:url(//st.deepzz.com/static/img/bg04.jpg);background-size:cover;height:100%;position:fixed;width:270px}.mid-col{background:#fff;left:0;margin-left:270px;min-height:100%;position:absolute;right:0}article .meta{color:#555;float:right;font-size:.9em;line-height:2;position:relative;text-align:right;width:auto}article .meta a{color:#999}article h1.title{color:#333;font-size:2em;font-weight:300;line-height:35px;margin-bottom:25px}article h1.title a{color:#333;transition:color .3s}.mid-col .mid-col-container{padding:0 70px 0 40px}article .meta .date,article .meta .comment,article .meta .tags{position:relative}article h1.title a:hover{color:#2479CC}#header{border-bottom:none;height:auto;line-height:30px;margin-left:50px;padding:30px 0;width:100%}#main-nav{margin-left:0}#main-nav,#sub-nav{float:none;margin-top:15px}#sub-nav{position:relative}#content{margin:0 auto;width:100%}#header a{color:#efefef;text-shadow:0 1px #666;transition:color .3s}#header h1{float:none;font-weight:300;font-size:30px}#main-nav ul li{display:block;margin-left:0;position:relative}#header .subtitle{color:#ccc}#sub-nav .social{margin-bottom:10px}#header a:hover{color:#ccc}#header .profilepic a{background-image:url(//st.deepzz.com/static/img/deepzz.jpg);background-size:160px 160px;border-radius:50%;display:block;height:160px;margin:15px 0 20px -10px;width:160px}#sub-nav .social a{background-size:20px 20px;background-position:center center;background-repeat:no-repeat;border-radius:50%;display:inline-block;height:28px;margin:0 6px 15px;opacity:.75;text-indent:-9999px;transition:opacity .3s;vertical-align:middle;width:28px}#sub-nav .social a:hover{opacity:1}#sub-nav .social a:first-of-type{margin-left:0}#sub-nav .social a:last-of-type{margin-right:0}#sub-nav .social a.twitter{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAABOklEQVR4Ae3QM4DXYQCH8W+2m7Jt15Ztc8u29myba1O2NbXlmrJ11nP8+31/GO+uz/psj7z6jzYsZBPL6KogylBM3tCDS/wDkrjNIOWgC4MorgC2MlgWLCXSesZzCWinAEoA0FAG9MOsE1VorFw0AiCd/orBF2Klc4HT3KaDctGQgF2RY+iETTzlFUAx/hDwlfmhxFjMrigS6wmXwGnG0kCiO2aTFI17xPrES8zmKhzt2MRo3uPdGIWjOgDxeNdOkbiCH/EUVyTq48cZxWIQ3g2TCTXZwT/c/ZAJpbnOOeJwN01mrMaLZ7JjO+5qywljeMRHErEZL3cM4Cdmy+SGFhzCZobMqM5E1rCM/TzB5gXdZEMZ+vMYu7cslDuqMZcrfCUkleccoL+8ozHjWcsujnGIDcyjF2VV8GUCCH5vOpRoTxYAAAAASUVORK5CYII=");background-color:#55cff8;border:1px solid #55CFF8}#sub-nav .social a.search{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAAB6klEQVR4Ac3RM4AdURSA4RPbto06tm3btm3b7GLbttOsjWdrPG9OdFejRZWv/a8vqDM2s46nNot7vSusA5KrQfYk13CvYt6IXvwtiIKBuuWYnJAXsia+hPcEqhBtrsVZ2bu96EFN3LufpUGPfwCivoDNVQG00I0wHfqVY4GtG93G3Ne9mY/CNLGgRYxFgjdYOkMG9tkSptbDoMY3JW2PpCKgYGuLqWy1QYk3/YsSx5UFVdxAJPxnQc7eEgl6HmjiXpAv9cTlliXnWvwnaCkMmhxDkTA0liX2PPnpH6AjujIStsGyFHzwL/hugQ5P/qCHXHSGLIl3/wXqLuhwFsQAecYpskSfJX8cDTri6iBh7C1LrnmpqZLOCeYgkVBTlpJqIcGdAU1iHDlnkkqkPyHB9wBVuB8J5zqVbG+FhIiGrqDg24gprP5CoIa/hancuxNKQCpDk8BdTOWcBuqYIpIXUwWpwBXHButSzw76OWZARX1sAOrYWpIdsyDIfq8D6gylqFc6E3kkJOp7I9DiGMeFoQL9JLkeVQVpTMF/bwLaTB08O9inQqgQzf6kb7pWmpqTr6yNPiQk7nNjyD6+NlJIiKKnGWQfVZO3IyG9h5z4VEFwkTP8gJz5UoWNQhQDTBvIqeS2zA77SPgv/AJ8KLqSzEcuZAAAAABJRU5ErkJggg==");background-color:#afb6ca;border:1px solid #afb6ca}#sub-nav .social a.rss{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAABd0lEQVR4Ae3UA+zXQRiA8Tfbtm3briHbtm03ZLuGbNsas227hvik27v7ffH33Gd+hvNJhCEbc5lCRyqTXMKCPnzlHRfYyhgqEUdCi3PYPrOeehIaHMTtLv0kpDiPt3s0lpCgFff5hLetxJeQICaZacBMbuL0mlISGpRgOU7NJXRIyyICdZDQohQ3sDUTP5RkNXPpRj5xYC22QuKNMxhcY3TgdWYKis9EFy8cxvaNMWJhBoqdwVxldZncotiKooq4MQov1UTxROsL8UI6qjDBNZNK1jajWos/anEBW3ox2KjtifhzbdptrSncM/PFUFCDta7WtkLcyEJj6ojBAjB+Ete1D5+IJoEYrj9ADlPugNFPDF5qKyc2qoF6RNS/rbKWS2KwWNtAsbEbW01TH2jJZkozLSvFxklsTV2voJ0pRbQcFRs9sCXRO2EwzZTUWm5KIPZi0ERbdm1rTImu5as40YFFTKd4QBvIcpazgFxamv0ty2ggf/33CwQ70ADWDdQbAAAAAElFTkSuQmCC");background-color:#ef7522;border:1px solid #ef7522}#sub-nav .social a.twitter:hover{border:1px solid #24c1f6}#sub-nav .social a.search:hover{border:1px solid #909ab6}#sub-nav .social a.rss:hover{border:1px solid #cf5d0f}article input.runcode,article button{-webkit-appearance:none;background:#12b0e6;border:none;border-radius:0;box-shadow:inset 0 -5px 20px rgba(0,0,0,.1);color:#fff;cursor:pointer;font-size:14px;line-height:1;margin-top:10px;padding:0.625em .5em}article button{margin-top:0}article input.runcode:hover,article input.runcode:focus,article input.runcode:active,article button:hover,article button:focus,article button:active{background:#f6ad08}article strong{font-weight:700}article em{font-style:italic}article blockquote{background-color:#f8f8f8;border-left:5px solid #2479CC;margin-top:10px;overflow:hidden;padding:15px 20px}article code{background-color:#f2f2f2;border-radius:5px;font-family:Consolas,Monaco,'Andale Mono',monospace;font-size:80%;margin:0 2px;padding:4px 5px;vertical-align:middle}article pre{background-color:#f8f8f8;border-left:5px solid #ccc;color:#5d6a6a;font-size:14px;line-height:1.6;overflow:hidden;padding:0.6em;position:relative;white-space:pre-wrap;word-break:break-all;word-wrap:break-word}article img{border:1px solid #ccc;display:block;margin:10px 0 5px;max-width:100%;padding:0}article table{border:0;border-collapse:collapse;border-spacing:0}article pre code{background-color:transparent;border-radius:0 0 0 0;border:0;display:block;font-size:100%;margin:0;padding:0;position:relative}article table th,article table td{border:0}article table th{border-bottom:2px solid #848484;padding:6px 20px;text-align:left}article table td{border-bottom:1px solid #d0d0d0;padding:6px 20px}article .copyright-info{font-size:14px}article .expire-tips{background-color:#ffffc0;border:1px solid #e2e2e2;border-left:5px solid #fff000;color:#333;font-size:15px;padding:5px 10px}article .post-info{font-size:14px}article .entry-content{color:#444;font-size:16px;font-family:Arial,'Hiragino Sans GB',冬青黑,'Microsoft YaHei',微软雅黑,SimSun,宋体,Helvetica,Tahoma,'Arial sans-serif';-webkit-font-smoothing:antialiased;line-height:1.8;word-wrap:break-word}article img.loaded{height:auto!important}article .entry-content p,article .entry-content blockquote,article .entry-content ul,article .entry-content ol,article .entry-content dl,article .entry-content table,article .entry-content iframe,article .entry-content h1,article .entry-content h2,article .entry-content h3,article .entry-content h4,article .entry-content h5,article .entry-content h6,article .entry-content p,article .entry-content pre{margin-top:16px}article pre b.name{color:#eee;font-family:"Consolas","Liberation Mono",Courier,monospace;font-size:60px;line-height:1;pointer-events:none;position:absolute;right:10px;top:10px}article .entry-content .date{color:#999;font-size:14px}article .entry-content a:hover{text-decoration:underline}article .entry-content ul ul,article .entry-content ul ol,article .entry-content ul dl,article .entry-content ol ul,article .entry-content ol ol,article .entry-content ol dl,article .entry-content dl ul,article .entry-content dl ol,article .entry-content dl dl,article .entry-content blockquote > p:first-of-type{margin-top:0}.page-navi{border-top:1px solid #fff;border-bottom:1px solid #ddd;line-height:20px;overflow:hidden;padding:20px 0;position:relative;width:100%}article.post-search{padding-bottom:0}article .entry-content ul,article .entry-content ol,article .entry-content dl{margin-left:25px}.page-navi .prev{float:left}.page-navi .next{float:right}.page-navi .center{margin:auto;text-align:center;width:80px}#comments{border-top:1px solid #fff;border-bottom:1px solid #ddd;min-height:350px;padding:20px 0}#switch_thread_mode{font-size:14px;font-weight:400;margin-left:8px}#disqus_thread,#simple_thread{line-height:1.6}#footer{border-top:1px solid #fff;font-size:.9em;line-height:1.8;padding:15px 70px 15px 40px;text-align:center;width:auto}#searchResult{min-height:350px}#toc-container,#toc{float:right}#toc{border:1px solid #e2e2e2;font-size:14px;margin:0 0 15px 20px;max-width:260px;min-width:120px;padding:6px}#search form{position:relative}#toc strong{border-bottom:1px solid #e2e2e2;display:block}#toc p{margin:0;padding:0 4px}#toc ul{margin:.5em .5em .5em 1.5em}#toc ul ul{margin-top:0;margin-bottom:0}#footer .beian{color:#666}#search .wrapper{margin-right:72px}#search .submit{-webkit-appearance:none;background-color:#e7e7e7;border:1px solid #bbb;border-left:0;border-radius:0;color:#222;display:block;font-size:16px;height:40px;outline:0;position:absolute;right:0;top:0;width:72px}#searchResult .info{border-bottom:1px solid #ddd;color:#676767;font-size:13px;padding:15px 0}#searchResult .no-result{background-color:#fff4c2;border:1px solid #fc3;font-size:13px;margin:15px 0;padding:5px}#searchResult .loading,#searchResult .hot-words{margin-top:20px}#searchResult .item{border-bottom:1px solid #ddd;padding:10px 0 20px}#comments h1.title{font-size:25px;font-weight:300;line-height:35px;margin-bottom:10px}#search .wrapper input{-webkit-appearance:none;border:1px solid #bbb;border-radius:0;box-sizing:border-box;display:block;font-size:16px;height:40px;outline:0;padding:4px 6px;width:100%}#searchResult .hot-words a{margin-right:20px}#searchResult .item:last-of-type{border-bottom:0}#searchResult .item .title{margin:5px 0}#searchResult .item .desc{font-size:14px;overflow:hidden}#searchResult .item .img{border:1px solid #ccc;float:left;height:81px;margin:4px 8px 0 0;width:108px}#searchResult .item .summary{-webkit-box-orient:vertical;display:block;display:-webkit-box;-webkit-line-clamp:4;line-height:22px;max-height:88px;text-overflow:ellipsis}#searchResult .item .title a{font-size:17px}#searchResult .item .img img{border:0;margin:0;width:100%}#searchResult .item .title b,#searchResult .item .desc b{color:#C00;font-weight:400}#searchResult .item .title .type{background-color:#eee;border-radius:3px;color:#888;display:inline-block;font-size:12px;margin-right:6px;padding:0 4px;position:relative;top:-1px}.hljs-comment,.diff .hljs-header,.hljs-doctype,.hljs-pi,.lisp .hljs-string,.hljs-javadoc{color:#999}.hljs-keyword,.hljs-winutils,.method,.hljs-addition,.css .hljs-tag,.hljs-request,.hljs-status,.nginx .hljs-title{color:#859900}.hljs-number,.hljs-command,.hljs-string,.hljs-tag .hljs-value,.hljs-rule .hljs-value,.hljs-phpdoc,.hljs-dartdoc,.tex .hljs-formula,.hljs-regexp,.hljs-hexcolor,.hljs-link_url{color:#2aa198}.hljs-title,.hljs-localvars,.hljs-chunk,.hljs-decorator,.hljs-built_in,.hljs-identifier,.vhdl .hljs-literal,.hljs-id,.css .hljs-function,.hljs-name{color:#268bd2}.hljs-attribute,.hljs-variable,.lisp .hljs-body,.smalltalk .hljs-number,.hljs-constant,.hljs-class .hljs-title,.hljs-parent,.hljs-type,.hljs-link_reference{color:#b58900}.hljs-preprocessor,.hljs-preprocessor .hljs-keyword,.hljs-pragma,.hljs-shebang,.hljs-symbol,.hljs-symbol .hljs-string,.diff .hljs-change,.hljs-special,.hljs-attr_selector,.hljs-subst,.hljs-cdata,.css .hljs-pseudo,.hljs-header{color:#cb4b16}.hljs-deletion,.hljs-important{color:#dc322f}.hljs-link_label{color:#6c71c4}.goog-te-gadget-simple{background-color:rgba(0,0,0,.6)!important;border:none!important;border-radius:0 6px 0 0}.goog-te-gadget img{opacity:.8}.tex .hljs-formula{background:#eee8d5}.goog-te-gadget-simple .goog-te-menu-value{color:#ccc!important}#google_translate_element{bottom:-1px;left:0;margin:0;position:fixed}@media screen and (max-width:1024px){article{padding-bottom:15px}.left-col{width:210px}.mid-col{margin-left:210px}.mid-col .mid-col-container{padding:0 20px}#header{margin-left:30px}#footer{padding:15px 20px}article h1.title,article .entry-content{margin-left:0}}@media screen and (max-width:640px){#header{margin-left:0;padding:20px 0;text-align:center}#main-nav{margin-top:10px}#main-nav ul li{display:inline;margin:0 10px;text-align:center}#header .profilepic a{background-image:url(//st.deepzz.com/static/img/deepzz_small.jpg);background-size:100% 100%;height:56px;left:12px;margin:0;position:absolute;top:12px;width:56px}#sub-nav .social,#sub-nav .social a{margin-bottom:0}article{padding:15px 0}.left-col{background-image:none;position:relative;width:100%}.mid-col{float:none;margin-left:0;width:100%}article .meta{margin-top:15px;position:static;width:auto}.mid-col .mid-col-container{padding:0 10px}.mid-col article .meta{float:none;overflow:hidden}article .meta .date,article .meta .comment,article .meta .tags{display:inline;margin-right:5px;padding-left:0}article .meta .date{margin-right:30px}#footer{padding:15px 10px}#toc{margin:0}#toc,#toc-container{float:none}#sub-nav .social a{opacity:1}}#simple_thread ol,#simple_thread ul{list-style:none;list-style-type:none}#simple_thread > .thread{color:#2a2e2e;font-family:"Helvetica Neue",arial,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}#simple_thread .avatar{float:left}#simple_thread .publisher-anchor-color a{color:#2479cc!important}#simple_thread .clearfix:after,#simple_thread .clearfix:before{clear:both;content:"";display:table;line-height:0}#simple_thread .active .publisher-nav-color::after{background-color:#2479cc!important}#simple_thread .avatar .user,#simple_thread .avatar img{border-radius:3px;display:block}#simple_thread .nav{border-bottom:2px solid #e7e9ee;margin:0 0 20px;position:relative}#simple_thread .tab-conversation{float:left}#simple_thread .btn{background:#778289;background:rgba(29,47,58,.6);border:none;border-radius:3px;color:#fff;display:inline-block;font-weight:500;line-height:1.1;padding:10px 16px;text-shadow:none;transition:background .2s}#simple_thread .post-content{margin-bottom:24px;position:relative;transition:all .2s ease-in-out}#simple_thread .post-body{overflow:hidden}#simple_thread .post-header{font-size:13px;line-height:1;margin-bottom:3px;padding-right:46px}#simple_thread .avatar img{height:48px;width:48px}#simple_thread .nav-tab > a{color:#7f919e;display:block;font-weight:700;line-height:1;margin:0;padding:0;position:relative;transition:all .2s ease-in-out}#simple_thread .tab-conversation > a{font-size:15px;margin-right:15px;padding:12px 0;text-transform:capitalize}#simple_thread .post-body spoiler{background:#7f919e;color:transparent;display:inline;padding:0 .5em}#simple_thread .post-header a{color:#7f919e;line-height:1}#simple_thread .avatar .user{background:#dbdfe4;padding:0;position:relative;z-index:100}#simple_thread .post .avatar{margin-right:12px}#simple_thread .btn:hover{background:#606d75;background:rgba(29,47,58,.7);color:#fff}#simple_thread .btn.active,#simple_thread .btn:active{background:#2e9fff;transition:none}#simple_thread .btn.busy{background:#ebeef2;color:#999;text-shadow:none}#simple_thread .post-content .indicator{border-radius:3px;height:48px;left:0;position:absolute;top:0;width:5px}#simple_thread .post-content.target{padding-left:12px}#simple_thread .post-header .author{color:#656c7a;font-weight:700}#simple_thread .post-header .time-ago{color:#7f919e;font-weight:500;font-size:12px}#simple_thread .tab-conversation.active > a{color:#2a2e2e!important}#simple_thread .post-body a[data-dsq-mention]{font-weight:700}#simple_thread .post-body spoiler:hover,#simple_thread .post-body spoiler:focus{background:#e7e9ee;color:inherit}#simple_thread .btn.busy:active,#simple_thread .btn.busy:hover{background:#ebeef2;cursor:not-allowed;text-shadow:none}#simple_thread .post-content.target > .avatar{left:12px}#simple_thread .post-content.target .indicator{background:#ffc62e}#simple_thread .tab-conversation.active > a:after{background:#2e9fff;bottom:-2px;content:" ";display:block;height:2px;left:0;position:absolute;right:0}#simple_thread .post-body a[data-dsq-mention]:before{content:'@'}#simple_thread .post-header .author,#simple_thread .post-body-inner p{font-family:"Helvetica Neue","PingFangSC-Regular",arial,sans-serif}#simple_thread .post-meta{display:inline-block}#simple_thread .load-more{margin:0 0 24px}#simple_thread .post-body-inner p{font-size:15px;line-height:21px;margin:0 0 15px;word-wrap:break-word}#simple_thread .post-meta .bullet{color:#c2c6cc;line-height:1.4;padding:0}#simple_thread .children .post{margin-left:60px}#simple_thread .load-more .btn{display:block;font-size:13px;font-weight:400;padding:11px 14px;text-align:center}#simple_thread.mobile .post-header{font-size:14px;line-height:18px;margin-bottom:4px;padding-right:0;position:relative;top:-4px}#simple_thread.mobile .post-body-inner{clear:left;overflow:visible;position:relative;top:-4px}#simple_thread.mobile .post-body{display:block;overflow:visible}#simple_thread .post-body-inner p:last-child{margin:0}#simple_thread.mobile .avatar img{height:30px;width:30px}#simple_thread .children .children .post{margin-left:48px}#simple_thread.mobile .post-header .post-byline{display:block;overflow:hidden;padding-right:15px;text-overflow:ellipsis;white-space:nowrap}#simple_thread.mobile .post-header .author{font-size:15px;line-height:18px}#simple_thread.mobile .post-meta .bullet,#simple_thread.mobile .tab-conversation.active > a > span{display:none}#simple_thread.mobile .post-list .post .post-content{margin:0;padding:0;margin-bottom:16px;transition:none}#simple_thread.mobile .post-list .post .children{border-left:2px solid #e7e9ee;padding-left:17px}#simple_thread .children .post .avatar .user img{width:36px}#simple_thread .children .post .avatar .user img,#simple_thread .children .post .indicator{height:36px}#simple_thread .children .children .children .children .post{margin-left:0}#simple_thread.mobile .post-list .post .post-content .indicator{height:30px}#simple_thread.mobile .post-list .post .children .post,#simple_thread.mobile .post-list .post .children .post .post-content .post-body{margin-left:0}#simple_thread.mobile .post-list .post .post-content .avatar img{height:30px;width:30px}#simple_thread.mobile .post-list .post .children li:only-child{margin-bottom:20px}#simple_thread .children .children .children .children .post .post-body{margin-left:48px}#simple_thread .children .children .children .children .post .indicator{left:0}#simple_thread.mobile .post-list .post .post-content.target .avatar{margin-left:8px}#simple_thread.mobile .post-list .post .children .children .children{border-left:none;padding-left:0} \ No newline at end of file diff --git a/static/crossdoamin.xml b/static/crossdoamin.xml new file mode 100644 index 0000000..527f133 --- /dev/null +++ b/static/crossdoamin.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/static/favicon.ico b/static/favicon.ico new file mode 100644 index 0000000..4719392 Binary files /dev/null and b/static/favicon.ico differ diff --git a/conf/robots.txt b/static/robots.txt similarity index 100% rename from conf/robots.txt rename to static/robots.txt diff --git a/views/admin/login.html b/views/admin/login.html index 77cd519..10ea841 100644 --- a/views/admin/login.html +++ b/views/admin/login.html @@ -5,7 +5,7 @@ - Login | {{.BTitle}} + 登录 | {{.BTitle}} diff --git a/views/admin/post.html b/views/admin/post.html index e8cbaa7..7fc514b 100644 --- a/views/admin/post.html +++ b/views/admin/post.html @@ -96,8 +96,8 @@ }); })(); - - + + - - - + + + - - + + {{if .Version}}{{end}}{{if .Version}}{{else}}{{end}}
{{if .HomePage}} {{template "home" .}} {{else if .ArticlePage}} {{template "article" .}}{{else if .SeriesPage}}{{template "series" .}}{{else if .ArchivesPage}}{{template "archives" .}} {{else if .BlogrollPage}}{{template "blogroll" .}}{{else if .AboutPage}}{{template "about" .}}{{else if .SearchPage}} {{template "search" .}}{{else if .NotFoundPage}}{{template "notfound"}} {{end}}
{{if .Version}}{{else}}{{end}} {{if .Version}}{{else}}{{end}}{{if .Version}}{{else}}{{end}} \ No newline at end of file +{{.Title}}{{if .Version}}{{end}}{{if .Version}}{{else}}{{end}}
{{if .HomePage}} {{template "home" .}} {{else if .ArticlePage}} {{template "article" .}}{{else if .SeriesPage}}{{template "series" .}}{{else if .ArchivesPage}}{{template "archives" .}} {{else if .BlogrollPage}}{{template "blogroll" .}}{{else if .AboutPage}}{{template "about" .}}{{else if .SearchPage}} {{template "search" .}}{{else if .NotFoundPage}}{{template "notfound"}} {{end}}
{{if .Version}}{{else}}{{end}}{{if .Version}}{{else}}{{end}}{{if .Version}}{{else}}{{end}}{{if .Version}}{{else}}{{end}} \ No newline at end of file diff --git a/views/st_ana_js.js b/views/st_ana_js.js index 658d6c9..86992b2 100644 --- a/views/st_ana_js.js +++ b/views/st_ana_js.js @@ -1,23 +1,8 @@ {{define "ana_js"}} -(function(i, s, o, g, r, a, m) { - i['GoogleAnalyticsObject'] = r; - i[r] = i[r] || function() { - (i[r].q = i[r].q || []).push(arguments) - }, i[r].l = 1 * new Date(); - a = s.createElement(o), - m = s.getElementsByTagName(o)[0]; - a.async = 1; - a.src = g; - m.parentNode.insertBefore(a, m) -})(window, document, 'script', 'https://o7msui8ho.qnssl.com/js/analytics.js', 'ga'); - -ga('create', 'UA-77251712-1', 'auto'); -ga('send', 'pageview'); ! function(e, n, o, t) { var a = e.screen, r = encodeURIComponent, - i = ["tid=UA-5422922-2", "dl=" + r(n.URL), "dt=" + r(n.title), "dr=" + r(n.referrer), "dp=" + r(t.pathname), "ul=" + (o.language || o.browserLanguage).toLowerCase(), "sd=" + a.colorDepth + "-bit", "sr=" + a.width + "x" + a.height, "_=" + +new Date], + i = ["tid=UA-77251712-1", "dl=" + r(n.URL), "dt=" + r(n.title), "dr=" + r(n.referrer), "dp=" + r(t.pathname), "ul=" + (o.language || o.browserLanguage).toLowerCase(), "sd=" + a.colorDepth + "-bit", "sr=" + a.width + "x" + a.height, "_=" + +new Date], c = "?" + i.join("&"); - e.__beacon_img = new Image, e.__beacon_img.src = "/beacon.html" + c -}(window, document, navigator, location); + e.__beacon_img = new Image, e.__beacon_img.src = "/beacon.html" + c }(window, document, navigator, location); {{end}} diff --git a/views/st_blog_css.css b/views/st_blog_css.css index 2451b3a..eea8495 100644 --- a/views/st_blog_css.css +++ b/views/st_blog_css.css @@ -1,3 +1,3 @@ {{define "blog_css"}} -*{margin:0;padding:0}html,body{height:100%}body{background:#ddd;color:#666;font-size:14px;font-family:"-apple-system","Open Sans","HelveticaNeue-Light","Helvetica Neue Light","Helvetica Neue",Helvetica,Arial,sans-serif}::selection,::-moz-selection,::-webkit-selection{background-color:#2479cc;color:#eee}h1{font-size:2em}h3{font-size:1.3em}h4{font-size:1.1em}a{color:#2479cc;text-decoration:none}article{border-bottom:1px solid #ddd;border-top:1px solid #fff;padding:30px 0;position:relative}.container{max-width:1600px;min-height:100%;position:relative}.left-col{background-color:#50514c;background-image:url(//st.deepzz.com/static/img/bg04.jpg);background-size:cover;height:100%;position:fixed;width:270px}.mid-col{background:#fff;left:0;margin-left:270px;min-height:100%;position:absolute;right:0}article .meta{color:#555;float:right;font-size:.9em;line-height:2;position:relative;text-align:right;width:auto}article .meta a{color:#999}article h1.title{color:#333;font-size:2em;font-weight:300;line-height:35px;margin-bottom:25px}article h1.title a{color:#333;transition:color .3s}.mid-col .mid-col-container{padding:0 70px 0 40px}article .meta .date,article .meta .comment,article .meta .tags{position:relative}article .meta .date-modified{display:none}article h1.title a:hover{color:#2479cc}#header{border-bottom:0;height:auto;line-height:30px;margin-left:50px;padding:30px 0;width:100%}#main-nav{margin-left:0}#main-nav,#sub-nav{float:none;margin-top:15px}#sub-nav{position:relative}#content{margin:0 auto;width:100%}#header a{color:#efefef;text-shadow:0 1px #666;transition:color .3s}#header h1{float:none;font-weight:300;font-size:30px}#main-nav ul li{display:block;margin-left:0;position:relative}#header .subtitle{color:#ccc}#sub-nav .social{margin-bottom:10px}#header a:hover{color:#ccc}#header .profilepic a{background-image:url(//st.deepzz.com/static/img/deepzz.jpg);background-size:160px 160px;border-radius:50%;display:block;height:160px;margin:15px 0 20px -10px;width:160px}#sub-nav .social a{background-size:20px 20px;background-position:center center;background-repeat:no-repeat;border-radius:50%;display:inline-block;height:28px;margin:0 6px 15px;opacity:.75;text-indent:-9999px;transition:opacity .3s;vertical-align:middle;width:28px}#sub-nav .social a:hover{opacity:1}#sub-nav .social a:first-of-type{margin-left:0}#sub-nav .social a:last-of-type{margin-right:0}#sub-nav .social a.twitter{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAABOklEQVR4Ae3QM4DXYQCH8W+2m7Jt15Ztc8u29myba1O2NbXlmrJ11nP8+31/GO+uz/psj7z6jzYsZBPL6KogylBM3tCDS/wDkrjNIOWgC4MorgC2MlgWLCXSesZzCWinAEoA0FAG9MOsE1VorFw0AiCd/orBF2Klc4HT3KaDctGQgF2RY+iETTzlFUAx/hDwlfmhxFjMrigS6wmXwGnG0kCiO2aTFI17xPrES8zmKhzt2MRo3uPdGIWjOgDxeNdOkbiCH/EUVyTq48cZxWIQ3g2TCTXZwT/c/ZAJpbnOOeJwN01mrMaLZ7JjO+5qywljeMRHErEZL3cM4Cdmy+SGFhzCZobMqM5E1rCM/TzB5gXdZEMZ+vMYu7cslDuqMZcrfCUkleccoL+8ozHjWcsujnGIDcyjF2VV8GUCCH5vOpRoTxYAAAAASUVORK5CYII=");background-color:#55cff8;border:1px solid #55cff8}#sub-nav .social a.search{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAAB6klEQVR4Ac3RM4AdURSA4RPbto06tm3btm3b7GLbttOsjWdrPG9OdFejRZWv/a8vqDM2s46nNot7vSusA5KrQfYk13CvYt6IXvwtiIKBuuWYnJAXsia+hPcEqhBtrsVZ2bu96EFN3LufpUGPfwCivoDNVQG00I0wHfqVY4GtG93G3Ne9mY/CNLGgRYxFgjdYOkMG9tkSptbDoMY3JW2PpCKgYGuLqWy1QYk3/YsSx5UFVdxAJPxnQc7eEgl6HmjiXpAv9cTlliXnWvwnaCkMmhxDkTA0liX2PPnpH6AjujIStsGyFHzwL/hugQ5P/qCHXHSGLIl3/wXqLuhwFsQAecYpskSfJX8cDTri6iBh7C1LrnmpqZLOCeYgkVBTlpJqIcGdAU1iHDlnkkqkPyHB9wBVuB8J5zqVbG+FhIiGrqDg24gprP5CoIa/hancuxNKQCpDk8BdTOWcBuqYIpIXUwWpwBXHButSzw76OWZARX1sAOrYWpIdsyDIfq8D6gylqFc6E3kkJOp7I9DiGMeFoQL9JLkeVQVpTMF/bwLaTB08O9inQqgQzf6kb7pWmpqTr6yNPiQk7nNjyD6+NlJIiKKnGWQfVZO3IyG9h5z4VEFwkTP8gJz5UoWNQhQDTBvIqeS2zA77SPgv/AJ8KLqSzEcuZAAAAABJRU5ErkJggg==");background-color:#afb6ca;border:1px solid #afb6ca}#sub-nav .social a.rss{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAABd0lEQVR4Ae3UA+zXQRiA8Tfbtm3briHbtm03ZLuGbNsas227hvik27v7ffH33Gd+hvNJhCEbc5lCRyqTXMKCPnzlHRfYyhgqEUdCi3PYPrOeehIaHMTtLv0kpDiPt3s0lpCgFff5hLetxJeQICaZacBMbuL0mlISGpRgOU7NJXRIyyICdZDQohQ3sDUTP5RkNXPpRj5xYC22QuKNMxhcY3TgdWYKis9EFy8cxvaNMWJhBoqdwVxldZncotiKooq4MQov1UTxROsL8UI6qjDBNZNK1jajWos/anEBW3ox2KjtifhzbdptrSncM/PFUFCDta7WtkLcyEJj6ojBAjB+Ete1D5+IJoEYrj9ADlPugNFPDF5qKyc2qoF6RNS/rbKWS2KwWNtAsbEbW01TH2jJZkozLSvFxklsTV2voJ0pRbQcFRs9sCXRO2EwzZTUWm5KIPZi0ERbdm1rTImu5as40YFFTKd4QBvIcpazgFxamv0ty2ggf/33CwQ70ADWDdQbAAAAAElFTkSuQmCC");background-color:#ef7522;border:1px solid #ef7522}#sub-nav .social a.twitter:hover{border:1px solid #24c1f6}#sub-nav .social a.search:hover{border:1px solid #909ab6}#sub-nav .social a.rss:hover{border:1px solid #cf5d0f}article input.runcode,article button{-webkit-appearance:none;background:#12b0e6;border:0;border-radius:0;box-shadow:inset 0 -5px 20px rgba(0,0,0,.1);color:#fff;cursor:pointer;font-size:14px;line-height:1;margin-top:10px;padding:.625em .5em}article button{margin-top:0}article input.runcode:hover,article input.runcode:focus,article input.runcode:active,article button:hover,article button:focus,article button:active{background:#f6ad08}article strong{font-weight:700}article em{font-style:italic}article blockquote{background-color:#f8f8f8;border-left:5px solid #2479cc;margin-top:10px;overflow:hidden;padding:15px 20px}article code{background-color:#f2f2f2;border-radius:5px;font-family:Consolas,Monaco,'Andale Mono',monospace;font-size:80%;margin:0 2px;padding:4px 5px;vertical-align:middle}article pre{background-color:#f8f8f8;border-left:5px solid #ccc;color:#5d6a6a;font-size:14px;line-height:1.6;overflow:hidden;padding:.6em;position:relative;white-space:pre-wrap;word-break:break-word;word-wrap:break-word}article img{border:1px solid #ccc;display:block;margin:10px 0 5px;max-width:100%;padding:0}article table{border:0;border-collapse:collapse;border-spacing:0}article pre code{background-color:transparent;border-radius:0;border:0;display:block;font-size:100%;margin:0;padding:0;position:relative}article table th,article table td{border:0}article table th{border-bottom:2px solid #848484;padding:6px 20px;text-align:left}article table td{border-bottom:1px solid #d0d0d0;padding:6px 20px}article .copyright-info{font-size:14px}article .expire-tips{background-color:#ffffc0;border:1px solid #e2e2e2;border-left:5px solid #fff000;color:#333;font-size:15px;padding:5px 10px}article .post-info{font-size:14px}article .entry-content{color:#444;font-size:16px;font-family:Arial,'Hiragino Sans GB',冬青黑,'Microsoft YaHei',微软雅黑,SimSun,宋体,Helvetica,Tahoma,'Arial sans-serif';-webkit-font-smoothing:antialiased;line-height:1.8;word-wrap:break-word}article img.loaded{height:auto!important}article .entry-content p,article .entry-content blockquote,article .entry-content ul,article .entry-content ol,article .entry-content dl,article .entry-content table,article .entry-content iframe,article .entry-content h1,article .entry-content h2,article .entry-content h3,article .entry-content h4,article .entry-content h5,article .entry-content h6,article .entry-content p,article .entry-content pre{margin-top:15px}article pre b.name{color:#eee;font-family:"Consolas","Liberation Mono",Courier,monospace;font-size:60px;line-height:1;pointer-events:none;position:absolute;right:10px;top:10px}article .entry-content .date{color:#999;font-size:14px}article .entry-content a:hover{text-decoration:underline}article .entry-content ul ul,article .entry-content ul ol,article .entry-content ul dl,article .entry-content ol ul,article .entry-content ol ol,article .entry-content ol dl,article .entry-content dl ul,article .entry-content dl ol,article .entry-content dl dl,article .entry-content blockquote>p:first-of-type{margin-top:0}.page-navi{border-top:1px solid #fff;border-bottom:1px solid #ddd;line-height:20px;overflow:hidden;padding:20px 0;position:relative;width:100%}article.post-search{padding-bottom:0}article .entry-content ul,article .entry-content ol,article .entry-content dl{margin-left:25px}.page-navi .prev{float:left}.page-navi .next{float:right}.page-navi .center{margin:auto;text-align:center;width:80px}#comments{border-top:1px solid #fff;border-bottom:1px solid #ddd;min-height:350px;padding:20px 0}#switch_thread_mode{font-size:14px;font-weight:400;margin-left:8px}#disqus_thread,#simple_thread{line-height:1.6}#footer{border-top:1px solid #fff;font-size:.9em;line-height:2.2;padding:15px 70px 15px 40px;text-align:center;width:auto}#searchResult{min-height:350px}#toc-container,#toc{float:right}#toc{border:1px solid #e2e2e2;font-size:14px;margin:0 0 15px 20px;max-width:260px;min-width:120px;padding:6px}#search form{position:relative}#toc strong{border-bottom:1px solid #e2e2e2;display:block}#toc p{margin:0;padding:0 4px}#toc ul{margin:.5em .5em .5em 1.5em}#toc ul ul{margin-top:0;margin-bottom:0}#footer .beian{color:#666}#search .wrapper{margin-right:72px}#search .submit{-webkit-appearance:none;background-color:#e7e7e7;border:1px solid #bbb;border-left:0;border-radius:0;color:#222;display:block;font-size:16px;height:40px;outline:0;position:absolute;right:0;top:0;width:72px;cursor:pointer;}#searchResult .info{border-bottom:1px solid #ddd;color:#676767;font-size:13px;padding:15px 0}#searchResult .no-result{background-color:#fff4c2;border:1px solid #fc3;font-size:13px;margin:15px 0;padding:5px}#searchResult .loading,#searchResult .hot-words{margin-top:20px}#searchResult .item{border-bottom:1px solid #ddd;padding:10px 0 20px}#comments h1.title{font-size:25px;font-weight:300;line-height:35px;margin-bottom:10px}#search .wrapper input{-webkit-appearance:none;border:1px solid #bbb;border-radius:0;box-sizing:border-box;display:block;font-size:16px;height:40px;outline:0;padding:4px 6px;width:100%}#searchResult .hot-words a{margin-right:20px}#searchResult .item:last-of-type{border-bottom:0}#searchResult .item .title{margin:5px 0}#searchResult .item .desc{font-size:14px;overflow:hidden}#searchResult .item .img{border:1px solid #ccc;float:left;height:81px;margin:4px 8px 0 0;width:108px}#searchResult .item .summary{-webkit-box-orient:vertical;display:block;display:-webkit-box;-webkit-line-clamp:4;line-height:22px;max-height:88px;text-overflow:ellipsis}#searchResult .item .title a{font-size:17px}#searchResult .item .img img{border:0;margin:0;width:100%}#searchResult .item .title b,#searchResult .item .desc b{color:#C00;font-weight:400}#searchResult .item .title .type{background-color:#eee;border-radius:3px;color:#888;display:inline-block;font-size:12px;margin-right:6px;padding:0 4px;position:relative;top:-1px}.hljs-comment,.diff .hljs-header,.hljs-doctype,.hljs-pi,.lisp .hljs-string,.hljs-javadoc{color:#999}.hljs-keyword,.hljs-winutils,.method,.hljs-addition,.css .hljs-tag,.hljs-request,.hljs-status,.nginx .hljs-title{color:#859900}.hljs-number,.hljs-command,.hljs-string,.hljs-tag .hljs-value,.hljs-rule .hljs-value,.hljs-phpdoc,.hljs-dartdoc,.tex .hljs-formula,.hljs-regexp,.hljs-hexcolor,.hljs-link_url{color:#2aa198}.hljs-title,.hljs-localvars,.hljs-chunk,.hljs-decorator,.hljs-built_in,.hljs-identifier,.vhdl .hljs-literal,.hljs-id,.css .hljs-function,.hljs-name{color:#268bd2}.hljs-attribute,.hljs-variable,.lisp .hljs-body,.smalltalk .hljs-number,.hljs-constant,.hljs-class .hljs-title,.hljs-parent,.hljs-type,.hljs-link_reference{color:#b58900}.hljs-preprocessor,.hljs-preprocessor .hljs-keyword,.hljs-pragma,.hljs-shebang,.hljs-symbol,.hljs-symbol .hljs-string,.diff .hljs-change,.hljs-special,.hljs-attr_selector,.hljs-subst,.hljs-cdata,.css .hljs-pseudo,.hljs-header{color:#cb4b16}.hljs-deletion,.hljs-important{color:#dc322f}.hljs-link_label{color:#6c71c4}.goog-te-gadget-simple{background-color:rgba(0,0,0,.6)!important;border:none!important;border-radius:0 6px 0 0}.goog-te-gadget img{opacity:.8}.tex .hljs-formula{background:#eee8d5}.goog-te-gadget-simple .goog-te-menu-value{color:#ccc!important}#google_translate_element{bottom:-1px;left:0;margin:0;position:fixed}@media screen and (max-width:1024px){article{padding-bottom:15px}.left-col{width:210px}.mid-col{margin-left:210px}.mid-col .mid-col-container{padding:0 20px}#header{margin-left:30px}#footer{padding:15px 20px}article h1.title,article .entry-content{margin-left:0}}@media screen and (max-width:640px){#header{margin-left:0;padding:20px 0;text-align:center}#main-nav{margin-top:10px}#main-nav ul li{display:inline;margin:0 10px;text-align:center}#header .profilepic a{background-image:url(//st.imququ.com/static/img/blog/ququ_small.jpg);background-size:100% 100%;height:56px;left:12px;margin:0;position:absolute;top:12px;width:56px}#sub-nav .social,#sub-nav .social a{margin-bottom:0}article{padding:20px 0}.left-col{background-image:none;position:relative;width:100%}.mid-col{float:none;margin-left:0;width:100%}article .meta{margin-bottom:10px;position:static;width:auto}.mid-col .mid-col-container{padding:0 10px}.mid-col article .meta{float:none;overflow:hidden}article .meta .date,article .meta .comment,article .meta .tags{display:inline;margin-right:5px;padding-left:0}article .meta .date{margin-right:30px}#footer{padding:15px 10px}#toc{margin:0}#toc,#toc-container{float:none}#sub-nav .social a{opacity:1}}#simple_thread ol,#simple_thread ul{list-style:none;list-style-type:none}#simple_thread>.thread{color:#2a2e2e;font-family:"Helvetica Neue",arial,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}#simple_thread .avatar{float:left}#simple_thread .publisher-anchor-color a{color:#2479cc!important}#simple_thread .clearfix:after,#simple_thread .clearfix:before{clear:both;content:"";display:table;line-height:0}#simple_thread .active .publisher-nav-color::after{background-color:#2479cc!important}#simple_thread .avatar .user,#simple_thread .avatar img{border-radius:3px;display:block}#simple_thread .nav{border-bottom:2px solid #e7e9ee;margin:0 0 20px;position:relative}#simple_thread .tab-conversation{float:left}#simple_thread .btn{background:#778289;background:rgba(29,47,58,.6);border:0;border-radius:3px;color:#fff;display:inline-block;font-weight:500;line-height:1.1;padding:10px 16px;text-shadow:none;transition:background .2s}#simple_thread .post-content{margin-bottom:24px;position:relative;transition:all .2s ease-in-out}#simple_thread .post-body{overflow:hidden}#simple_thread .post-header{font-size:13px;line-height:1;margin-bottom:3px;padding-right:46px}#simple_thread .avatar img{height:48px;width:48px}#simple_thread .nav-tab>a{color:#7f919e;display:block;font-weight:700;line-height:1;margin:0;padding:0;position:relative;transition:all .2s ease-in-out}#simple_thread .tab-conversation>a{font-size:15px;margin-right:15px;padding:12px 0;text-transform:capitalize}#simple_thread .post-body spoiler{background:#7f919e;color:transparent;display:inline;padding:0 .5em}#simple_thread .post-header a{color:#7f919e;line-height:1}#simple_thread .avatar .user{background:#dbdfe4;padding:0;position:relative;z-index:100}#simple_thread .post .avatar{margin-right:12px}#simple_thread .btn:hover{background:#606d75;background:rgba(29,47,58,.7);color:#fff}#simple_thread .btn.active,#simple_thread .btn:active{background:#2e9fff;transition:none}#simple_thread .btn.busy{background:#ebeef2;color:#999;text-shadow:none}#simple_thread .post-content .indicator{border-radius:3px;height:48px;left:0;position:absolute;top:0;width:5px}#simple_thread .post-content.target{padding-left:12px}#simple_thread .post-header .author{color:#656c7a;font-weight:700}#simple_thread .post-header .time-ago{color:#7f919e;font-weight:500;font-size:12px}#simple_thread .tab-conversation.active>a{color:#2a2e2e!important}#simple_thread .post-body a[data-dsq-mention]{font-weight:700}#simple_thread .post-body spoiler:hover,#simple_thread .post-body spoiler:focus{background:#e7e9ee;color:inherit}#simple_thread .btn.busy:active,#simple_thread .btn.busy:hover{background:#ebeef2;cursor:not-allowed;text-shadow:none}#simple_thread .post-content.target>.avatar{left:12px}#simple_thread .post-content.target .indicator{background:#ffc62e}#simple_thread .tab-conversation.active>a:after{background:#2e9fff;bottom:-2px;content:" ";display:block;height:2px;left:0;position:absolute;right:0}#simple_thread .post-body a[data-dsq-mention]:before{content:'@'}#simple_thread .post-header .author,#simple_thread .post-body-inner p{font-family:"Helvetica Neue","PingFangSC-Regular",arial,sans-serif}#simple_thread .post-meta{display:inline-block}#simple_thread .load-more{margin:0 0 24px}#simple_thread .post-body-inner p{font-size:15px;line-height:21px;margin:0 0 15px;word-wrap:break-word}#simple_thread .media a{margin-right:10px}#simple_thread .post-meta .bullet{color:#c2c6cc;line-height:1.4;padding:0}#simple_thread .children .post{margin-left:60px}#simple_thread .load-more .btn{display:block;font-size:13px;font-weight:400;padding:11px 14px;text-align:center}#simple_thread.mobile .post-header{font-size:14px;line-height:18px;margin-bottom:4px;padding-right:0;position:relative;top:-4px}#simple_thread.mobile .post-body-inner{clear:left;overflow:visible;position:relative;top:-4px}#simple_thread.mobile .post-body{display:block;overflow:visible}#simple_thread .post-body-inner p:last-child{margin:0}#simple_thread.mobile .avatar img{height:30px;width:30px}#simple_thread .children .children .post{margin-left:48px}#simple_thread.mobile .post-header .post-byline{display:block;overflow:hidden;padding-right:15px;text-overflow:ellipsis;white-space:nowrap}#simple_thread.mobile .post-header .author{font-size:15px;line-height:18px}#simple_thread.mobile .post-meta .bullet,#simple_thread.mobile .tab-conversation.active>a>span{display:none}#simple_thread.mobile .post-list .post .post-content{margin:0;padding:0;margin-bottom:16px;transition:none}#simple_thread.mobile .post-list .post .children{border-left:2px solid #e7e9ee;padding-left:17px}#simple_thread .children .post .avatar .user img{width:36px}#simple_thread .children .post .avatar .user img,#simple_thread .children .post .indicator{height:36px}#simple_thread .children .children .children .children .post{margin-left:0}#simple_thread.mobile .post-list .post .post-content .indicator{height:30px}#simple_thread.mobile .post-list .post .children .post,#simple_thread.mobile .post-list .post .children .post .post-content .post-body{margin-left:0}#simple_thread.mobile .post-list .post .post-content .avatar img{height:30px;width:30px}#simple_thread.mobile .post-list .post .children li:only-child{margin-bottom:20px}#simple_thread .children .children .children .children .post .post-body{margin-left:48px}#simple_thread .children .children .children .children .post .indicator{left:0}#simple_thread.mobile .post-list .post .post-content.target .avatar{margin-left:8px}#simple_thread.mobile .post-list .post .children .children .children{border-left:none;padding-left:0} +*{margin:0;padding:0}html,body{height:100%}body{background:#ddd;color:#666;font-size:14px;font-family:"-apple-system","Open Sans","HelveticaNeue-Light","Helvetica Neue Light","Helvetica Neue",Helvetica,Arial,sans-serif}::selection,::-moz-selection,::-webkit-selection{background-color:#2479cc;color:#eee}h1{font-size:2em}h3{font-size:1.3em}h4{font-size:1.1em}a{color:#2479cc;text-decoration:none}article{border-bottom:1px solid #ddd;border-top:1px solid #fff;padding:30px 0;position:relative}.container{max-width:1600px;min-height:100%;position:relative}.left-col{background-color:#50514c;background-image:url(//st.deepzz.com/static/img/bg04.jpg);background-size:cover;height:100%;position:fixed;width:270px}.mid-col{background:#fff;left:0;margin-left:270px;min-height:100%;position:absolute;right:0}article .meta{color:#555;float:right;font-size:.9em;line-height:2;position:relative;text-align:right;width:auto}article .meta a{color:#999}article h1.title{color:#333;font-size:2em;font-weight:300;line-height:35px;margin-bottom:25px}article h1.title a{color:#333;transition:color .3s}.mid-col .mid-col-container{padding:0 70px 0 40px}article .meta .date,article .meta .comment,article .meta .tags{position:relative}article .meta .date-modified{display:none}article h1.title a:hover{color:#2479cc}#header{border-bottom:0;height:auto;line-height:30px;margin-left:50px;padding:30px 0;width:100%}#main-nav{margin-left:0}#main-nav,#sub-nav{float:none;margin-top:15px}#sub-nav{position:relative}#content{margin:0 auto;width:100%}#header a{color:#efefef;text-shadow:0 1px #666;transition:color .3s}#header h1{float:none;font-weight:300;font-size:30px}#main-nav ul li{display:block;margin-left:0;position:relative}#header .subtitle{color:#ccc}#sub-nav .social{margin-bottom:10px}#header a:hover{color:#ccc}#header .profilepic a{background-image:url(//st.deepzz.com/static/img/deepzz.jpg);background-size:160px 160px;border-radius:50%;display:block;height:160px;margin:15px 0 20px -10px;width:160px}#sub-nav .social a{background-size:20px 20px;background-position:center center;background-repeat:no-repeat;border-radius:50%;display:inline-block;height:28px;margin:0 6px 15px;opacity:.75;text-indent:-9999px;transition:opacity .3s;vertical-align:middle;width:28px}#sub-nav .social a:hover{opacity:1}#sub-nav .social a:first-of-type{margin-left:0}#sub-nav .social a:last-of-type{margin-right:0}#sub-nav .social a.twitter{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAABOklEQVR4Ae3QM4DXYQCH8W+2m7Jt15Ztc8u29myba1O2NbXlmrJ11nP8+31/GO+uz/psj7z6jzYsZBPL6KogylBM3tCDS/wDkrjNIOWgC4MorgC2MlgWLCXSesZzCWinAEoA0FAG9MOsE1VorFw0AiCd/orBF2Klc4HT3KaDctGQgF2RY+iETTzlFUAx/hDwlfmhxFjMrigS6wmXwGnG0kCiO2aTFI17xPrES8zmKhzt2MRo3uPdGIWjOgDxeNdOkbiCH/EUVyTq48cZxWIQ3g2TCTXZwT/c/ZAJpbnOOeJwN01mrMaLZ7JjO+5qywljeMRHErEZL3cM4Cdmy+SGFhzCZobMqM5E1rCM/TzB5gXdZEMZ+vMYu7cslDuqMZcrfCUkleccoL+8ozHjWcsujnGIDcyjF2VV8GUCCH5vOpRoTxYAAAAASUVORK5CYII=");background-color:#55cff8;border:1px solid #55cff8}#sub-nav .social a.search{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAAB6klEQVR4Ac3RM4AdURSA4RPbto06tm3btm3b7GLbttOsjWdrPG9OdFejRZWv/a8vqDM2s46nNot7vSusA5KrQfYk13CvYt6IXvwtiIKBuuWYnJAXsia+hPcEqhBtrsVZ2bu96EFN3LufpUGPfwCivoDNVQG00I0wHfqVY4GtG93G3Ne9mY/CNLGgRYxFgjdYOkMG9tkSptbDoMY3JW2PpCKgYGuLqWy1QYk3/YsSx5UFVdxAJPxnQc7eEgl6HmjiXpAv9cTlliXnWvwnaCkMmhxDkTA0liX2PPnpH6AjujIStsGyFHzwL/hugQ5P/qCHXHSGLIl3/wXqLuhwFsQAecYpskSfJX8cDTri6iBh7C1LrnmpqZLOCeYgkVBTlpJqIcGdAU1iHDlnkkqkPyHB9wBVuB8J5zqVbG+FhIiGrqDg24gprP5CoIa/hancuxNKQCpDk8BdTOWcBuqYIpIXUwWpwBXHButSzw76OWZARX1sAOrYWpIdsyDIfq8D6gylqFc6E3kkJOp7I9DiGMeFoQL9JLkeVQVpTMF/bwLaTB08O9inQqgQzf6kb7pWmpqTr6yNPiQk7nNjyD6+NlJIiKKnGWQfVZO3IyG9h5z4VEFwkTP8gJz5UoWNQhQDTBvIqeS2zA77SPgv/AJ8KLqSzEcuZAAAAABJRU5ErkJggg==");background-color:#afb6ca;border:1px solid #afb6ca}#sub-nav .social a.rss{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAABd0lEQVR4Ae3UA+zXQRiA8Tfbtm3briHbtm03ZLuGbNsas227hvik27v7ffH33Gd+hvNJhCEbc5lCRyqTXMKCPnzlHRfYyhgqEUdCi3PYPrOeehIaHMTtLv0kpDiPt3s0lpCgFff5hLetxJeQICaZacBMbuL0mlISGpRgOU7NJXRIyyICdZDQohQ3sDUTP5RkNXPpRj5xYC22QuKNMxhcY3TgdWYKis9EFy8cxvaNMWJhBoqdwVxldZncotiKooq4MQov1UTxROsL8UI6qjDBNZNK1jajWos/anEBW3ox2KjtifhzbdptrSncM/PFUFCDta7WtkLcyEJj6ojBAjB+Ete1D5+IJoEYrj9ADlPugNFPDF5qKyc2qoF6RNS/rbKWS2KwWNtAsbEbW01TH2jJZkozLSvFxklsTV2voJ0pRbQcFRs9sCXRO2EwzZTUWm5KIPZi0ERbdm1rTImu5as40YFFTKd4QBvIcpazgFxamv0ty2ggf/33CwQ70ADWDdQbAAAAAElFTkSuQmCC");background-color:#ef7522;border:1px solid #ef7522}#sub-nav .social a.twitter:hover{border:1px solid #24c1f6}#sub-nav .social a.search:hover{border:1px solid #909ab6}#sub-nav .social a.rss:hover{border:1px solid #cf5d0f}article input.runcode,article button{-webkit-appearance:none;background:#12b0e6;border:0;border-radius:0;box-shadow:inset 0 -5px 20px rgba(0,0,0,.1);color:#fff;cursor:pointer;font-size:14px;line-height:1;margin-top:10px;padding:.625em .5em}article button{margin-top:0}article input.runcode:hover,article input.runcode:focus,article input.runcode:active,article button:hover,article button:focus,article button:active{background:#f6ad08}article strong{font-weight:700}article em{font-style:italic}article blockquote{background-color:#f8f8f8;border-left:5px solid #2479cc;margin-top:10px;overflow:hidden;padding:15px 20px}article code{background-color:#f2f2f2;border-radius:5px;font-family:Consolas,Monaco,'Andale Mono',monospace;font-size:80%;margin:0 2px;padding:4px 5px;vertical-align:middle}article pre{background-color:#f8f8f8;border-left:5px solid #ccc;color:#5d6a6a;font-size:14px;line-height:1.6;overflow:hidden;padding:.6em;position:relative;white-space:pre-wrap;word-break:break-word;word-wrap:break-word}article img{border:1px solid #ccc;display:block;margin:10px 0 5px;max-width:100%;padding:0}article table{border:0;border-collapse:collapse;border-spacing:0}article pre code{background-color:transparent;border-radius:0;border:0;display:block;font-size:100%;margin:0;padding:0;position:relative}article table th,article table td{border:0}article table th{border-bottom:2px solid #848484;padding:6px 20px;text-align:left}article table td{border-bottom:1px solid #d0d0d0;padding:6px 20px}article .copyright-info{font-size:14px}article .expire-tips{background-color:#ffffc0;border:1px solid #e2e2e2;border-left:5px solid #fff000;color:#333;font-size:15px;padding:5px 10px}article .post-info{font-size:14px}article .entry-content{color:#444;font-size:16px;font-family:Arial,'Hiragino Sans GB',冬青黑,'Microsoft YaHei',微软雅黑,SimSun,宋体,Helvetica,Tahoma,'Arial sans-serif';-webkit-font-smoothing:antialiased;line-height:1.8;word-wrap:break-word}article img.loaded{height:auto!important}article .entry-content p,article .entry-content blockquote,article .entry-content ul,article .entry-content ol,article .entry-content dl,article .entry-content table,article .entry-content iframe,article .entry-content h1,article .entry-content h2,article .entry-content h3,article .entry-content h4,article .entry-content h5,article .entry-content h6,article .entry-content p,article .entry-content pre{margin-top:15px}article pre b.name{color:#eee;font-family:"Consolas","Liberation Mono",Courier,monospace;font-size:60px;line-height:1;pointer-events:none;position:absolute;right:10px;top:10px}article .entry-content .date{color:#999;font-size:14px}article .entry-content a:hover{text-decoration:underline}article .entry-content ul ul,article .entry-content ul ol,article .entry-content ul dl,article .entry-content ol ul,article .entry-content ol ol,article .entry-content ol dl,article .entry-content dl ul,article .entry-content dl ol,article .entry-content dl dl,article .entry-content blockquote>p:first-of-type{margin-top:0}.page-navi{border-top:1px solid #fff;border-bottom:1px solid #ddd;line-height:20px;overflow:hidden;padding:20px 0;position:relative;width:100%}article.post-search{padding-bottom:0}article .entry-content ul,article .entry-content ol,article .entry-content dl{margin-left:25px}.page-navi .prev{float:left}.page-navi .next{float:right}.page-navi .center{margin:auto;text-align:center;width:80px}#comments{border-top:1px solid #fff;border-bottom:1px solid #ddd;min-height:350px;padding:20px 0}#switch_thread_mode{font-size:14px;font-weight:400;margin-left:8px}#disqus_thread,#simple_thread{line-height:1.6}#footer{border-top:1px solid #fff;font-size:.9em;line-height:2.2;padding:15px 70px 15px 40px;text-align:center;width:auto}#searchResult{min-height:350px}#toc-container,#toc{float:right}#toc{border:1px solid #e2e2e2;font-size:14px;margin:0 0 15px 20px;max-width:260px;min-width:120px;padding:6px}#search form{position:relative}#toc strong{border-bottom:1px solid #e2e2e2;display:block}#toc p{margin:0;padding:0 4px}#toc ul{margin:.5em .5em .5em 1.5em}#toc ul ul{margin-top:0;margin-bottom:0}#footer .beian{color:#666}#search .wrapper{margin-right:72px}#search .submit{-webkit-appearance:none;background-color:#e7e7e7;border:1px solid #bbb;border-left:0;border-radius:0;color:#222;display:block;font-size:16px;height:40px;outline:0;position:absolute;right:0;top:0;width:72px;cursor:pointer;}#searchResult .info{border-bottom:1px solid #ddd;color:#676767;font-size:13px;padding:15px 0}#searchResult .no-result{background-color:#fff4c2;border:1px solid #fc3;font-size:13px;margin:15px 0;padding:5px}#searchResult .loading,#searchResult .hot-words{margin-top:20px}#searchResult .item{border-bottom:1px solid #ddd;padding:10px 0 20px}#comments h1.title{font-size:25px;font-weight:300;line-height:35px;margin-bottom:10px}#search .wrapper input{-webkit-appearance:none;border:1px solid #bbb;border-radius:0;box-sizing:border-box;display:block;font-size:16px;height:40px;outline:0;padding:4px 6px;width:100%}#searchResult .hot-words a{margin-right:20px}#searchResult .item:last-of-type{border-bottom:0}#searchResult .item .title{margin:5px 0}#searchResult .item .desc{font-size:14px;overflow:hidden}#searchResult .item .img{border:1px solid #ccc;float:left;height:81px;margin:4px 8px 0 0;width:108px}#searchResult .item .summary{-webkit-box-orient:vertical;display:block;display:-webkit-box;-webkit-line-clamp:4;line-height:22px;max-height:88px;text-overflow:ellipsis}#searchResult .item .title a{font-size:17px}#searchResult .item .img img{border:0;margin:0;width:100%}#searchResult .item .title b,#searchResult .item .desc b{color:#C00;font-weight:400}#searchResult .item .title .type{background-color:#eee;border-radius:3px;color:#888;display:inline-block;font-size:12px;margin-right:6px;padding:0 4px;position:relative;top:-1px}.hljs-comment,.diff .hljs-header,.hljs-doctype,.hljs-pi,.lisp .hljs-string,.hljs-javadoc{color:#999}.hljs-keyword,.hljs-winutils,.method,.hljs-addition,.css .hljs-tag,.hljs-request,.hljs-status,.nginx .hljs-title{color:#859900}.hljs-number,.hljs-command,.hljs-string,.hljs-tag .hljs-value,.hljs-rule .hljs-value,.hljs-phpdoc,.hljs-dartdoc,.tex .hljs-formula,.hljs-regexp,.hljs-hexcolor,.hljs-link_url{color:#2aa198}.hljs-title,.hljs-localvars,.hljs-chunk,.hljs-decorator,.hljs-built_in,.hljs-identifier,.vhdl .hljs-literal,.hljs-id,.css .hljs-function,.hljs-name{color:#268bd2}.hljs-attribute,.hljs-variable,.lisp .hljs-body,.smalltalk .hljs-number,.hljs-constant,.hljs-class .hljs-title,.hljs-parent,.hljs-type,.hljs-link_reference{color:#b58900}.hljs-preprocessor,.hljs-preprocessor .hljs-keyword,.hljs-pragma,.hljs-shebang,.hljs-symbol,.hljs-symbol .hljs-string,.diff .hljs-change,.hljs-special,.hljs-attr_selector,.hljs-subst,.hljs-cdata,.css .hljs-pseudo,.hljs-header{color:#cb4b16}.hljs-deletion,.hljs-important{color:#dc322f}.hljs-link_label{color:#6c71c4}.goog-te-gadget-simple{background-color:rgba(0,0,0,.6)!important;border:none!important;border-radius:0 6px 0 0}.goog-te-gadget img{opacity:.8}.tex .hljs-formula{background:#eee8d5}.goog-te-gadget-simple .goog-te-menu-value{color:#ccc!important}#google_translate_element{bottom:-1px;left:0;margin:0;position:fixed}@media screen and (max-width:1024px){article{padding-bottom:15px}.left-col{width:210px}.mid-col{margin-left:210px}.mid-col .mid-col-container{padding:0 20px}#header{margin-left:30px}#footer{padding:15px 20px}article h1.title,article .entry-content{margin-left:0}}@media screen and (max-width:640px){#header{margin-left:0;padding:20px 0;text-align:center}#main-nav{margin-top:10px}#main-nav ul li{display:inline;margin:0 10px;text-align:center}#header .profilepic a{background-image:url(//st.deepzz.com/static/img/deepzz_small.jpg);background-size:100% 100%;height:56px;left:12px;margin:0;position:absolute;top:12px;width:56px}#sub-nav .social,#sub-nav .social a{margin-bottom:0}article{padding:20px 0}.left-col{background-image:none;position:relative;width:100%}.mid-col{float:none;margin-left:0;width:100%}article .meta{margin-bottom:10px;position:static;width:auto}.mid-col .mid-col-container{padding:0 10px}.mid-col article .meta{float:none;overflow:hidden}article .meta .date,article .meta .comment,article .meta .tags{display:inline;margin-right:5px;padding-left:0}article .meta .date{margin-right:30px}#footer{padding:15px 10px}#toc{margin:0}#toc,#toc-container{float:none}#sub-nav .social a{opacity:1}}#simple_thread ol,#simple_thread ul{list-style:none;list-style-type:none}#simple_thread>.thread{color:#2a2e2e;font-family:"Helvetica Neue",arial,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}#simple_thread .avatar{float:left}#simple_thread .publisher-anchor-color a{color:#2479cc!important}#simple_thread .clearfix:after,#simple_thread .clearfix:before{clear:both;content:"";display:table;line-height:0}#simple_thread .active .publisher-nav-color::after{background-color:#2479cc!important}#simple_thread .avatar .user,#simple_thread .avatar img{border-radius:3px;display:block}#simple_thread .nav{border-bottom:2px solid #e7e9ee;margin:0 0 20px;position:relative}#simple_thread .tab-conversation{float:left}#simple_thread .btn{background:#778289;background:rgba(29,47,58,.6);border:0;border-radius:3px;color:#fff;display:inline-block;font-weight:500;line-height:1.1;padding:10px 16px;text-shadow:none;transition:background .2s}#simple_thread .post-content{margin-bottom:24px;position:relative;transition:all .2s ease-in-out}#simple_thread .post-body{overflow:hidden}#simple_thread .post-header{font-size:13px;line-height:1;margin-bottom:3px;padding-right:46px}#simple_thread .avatar img{height:48px;width:48px}#simple_thread .nav-tab>a{color:#7f919e;display:block;font-weight:700;line-height:1;margin:0;padding:0;position:relative;transition:all .2s ease-in-out}#simple_thread .tab-conversation>a{font-size:15px;margin-right:15px;padding:12px 0;text-transform:capitalize}#simple_thread .post-body spoiler{background:#7f919e;color:transparent;display:inline;padding:0 .5em}#simple_thread .post-header a{color:#7f919e;line-height:1}#simple_thread .avatar .user{background:#dbdfe4;padding:0;position:relative;z-index:100}#simple_thread .post .avatar{margin-right:12px}#simple_thread .btn:hover{background:#606d75;background:rgba(29,47,58,.7);color:#fff}#simple_thread .btn.active,#simple_thread .btn:active{background:#2e9fff;transition:none}#simple_thread .btn.busy{background:#ebeef2;color:#999;text-shadow:none}#simple_thread .post-content .indicator{border-radius:3px;height:48px;left:0;position:absolute;top:0;width:5px}#simple_thread .post-content.target{padding-left:12px}#simple_thread .post-header .author{color:#656c7a;font-weight:700}#simple_thread .post-header .time-ago{color:#7f919e;font-weight:500;font-size:12px}#simple_thread .tab-conversation.active>a{color:#2a2e2e!important}#simple_thread .post-body a[data-dsq-mention]{font-weight:700}#simple_thread .post-body spoiler:hover,#simple_thread .post-body spoiler:focus{background:#e7e9ee;color:inherit}#simple_thread .btn.busy:active,#simple_thread .btn.busy:hover{background:#ebeef2;cursor:not-allowed;text-shadow:none}#simple_thread .post-content.target>.avatar{left:12px}#simple_thread .post-content.target .indicator{background:#ffc62e}#simple_thread .tab-conversation.active>a:after{background:#2e9fff;bottom:-2px;content:" ";display:block;height:2px;left:0;position:absolute;right:0}#simple_thread .post-body a[data-dsq-mention]:before{content:'@'}#simple_thread .post-header .author,#simple_thread .post-body-inner p{font-family:"Helvetica Neue","PingFangSC-Regular",arial,sans-serif}#simple_thread .post-meta{display:inline-block}#simple_thread .load-more{margin:0 0 24px}#simple_thread .post-body-inner p{font-size:15px;line-height:21px;margin:0 0 15px;word-wrap:break-word}#simple_thread .media a{margin-right:10px}#simple_thread .post-meta .bullet{color:#c2c6cc;line-height:1.4;padding:0}#simple_thread .children .post{margin-left:60px}#simple_thread .load-more .btn{display:block;font-size:13px;font-weight:400;padding:11px 14px;text-align:center}#simple_thread.mobile .post-header{font-size:14px;line-height:18px;margin-bottom:4px;padding-right:0;position:relative;top:-4px}#simple_thread.mobile .post-body-inner{clear:left;overflow:visible;position:relative;top:-4px}#simple_thread.mobile .post-body{display:block;overflow:visible}#simple_thread .post-body-inner p:last-child{margin:0}#simple_thread.mobile .avatar img{height:30px;width:30px}#simple_thread .children .children .post{margin-left:48px}#simple_thread.mobile .post-header .post-byline{display:block;overflow:hidden;padding-right:15px;text-overflow:ellipsis;white-space:nowrap}#simple_thread.mobile .post-header .author{font-size:15px;line-height:18px}#simple_thread.mobile .post-meta .bullet,#simple_thread.mobile .tab-conversation.active>a>span{display:none}#simple_thread.mobile .post-list .post .post-content{margin:0;padding:0;margin-bottom:16px;transition:none}#simple_thread.mobile .post-list .post .children{border-left:2px solid #e7e9ee;padding-left:17px}#simple_thread .children .post .avatar .user img{width:36px}#simple_thread .children .post .avatar .user img,#simple_thread .children .post .indicator{height:36px}#simple_thread .children .children .children .children .post{margin-left:0}#simple_thread.mobile .post-list .post .post-content .indicator{height:30px}#simple_thread.mobile .post-list .post .children .post,#simple_thread.mobile .post-list .post .children .post .post-content .post-body{margin-left:0}#simple_thread.mobile .post-list .post .post-content .avatar img{height:30px;width:30px}#simple_thread.mobile .post-list .post .children li:only-child{margin-bottom:20px}#simple_thread .children .children .children .children .post .post-body{margin-left:48px}#simple_thread .children .children .children .children .post .indicator{left:0}#simple_thread.mobile .post-list .post .post-content.target .avatar{margin-left:8px}#simple_thread.mobile .post-list .post .children .children .children{border-left:none;padding-left:0} {{end}} diff --git a/views/st_blog_js.js b/views/st_blog_js.js index 4fbf5a2..5d2e7c7 100644 --- a/views/st_blog_js.js +++ b/views/st_blog_js.js @@ -1,3 +1,3 @@ {{define "blog_js"}} -$(".entry-content > pre code").each(function(i,block){hljs.highlightBlock(block)});var stringProto=String.prototype;stringProto.decode4Html=function(){return this.replace(/<[^>]*>/gi,"")},stringProto.decode4Html=function(){var e=document.createElement("div");return e.innerHTML=this.stripTags(),e.childNodes[0]?e.childNodes[0].nodeValue||"":""},function(e){e.disqus_shortname="deepzz",$.each(["CURRENT_PAGE","CDN_DOMAIN"],function(t,n){e[n]="";var r=$("#"+n);r&&(e[n]=r.val())})}(this),function(e){function t(t){var n,r,i={selector:null,height:200};i=$.extend(i,t),n=i.height,r=function(){var t=$(e).scrollTop(),r=$(e).height()+t;$(i.selector).find("img[data-src]").each(function(){var e=$(this);setTimeout(function(){var i,o=e.offset(),a=e.height();o.top>r+n||o.top+a
'+(t.url?'':'')+'
'+t.message+'
    '+n(t.children)+"
";return r}function n(e){var n,r;if(!e||!e.length){return""}for(n="",r=0;r没有找到任何评论数据~

点此发表评论 \xbb

'}var t='';return t}function i(){a||(a=!0,$.get("/data/comment",{id:e.simple_config.id,cursor:s},function(t){console.log(t.data);var i,u;a=!1,t&&0==t.errno?(s?(i=n(t.data.comments),o.find(".post-list").append(i)):(i=r(t.data),o.html(i),$(e).trigger("hashchange","scrollIntoView")),u=o.find(".load-more a"),t.data.next?u.removeClass("busy"):u.hide(),s=t.data.next,$(e).trigger("scroll")):o.hide()}))}var o=$("#simple_thread"),a=!1,s="";o.on("click",".load-more a",function(e){e.preventDefault(),$(this).addClass("busy"),i()}).on("click",".time-ago",function(e){e.preventDefault(),location.hash="simple-"+$(this).data("id")}),$(e).on("hashchange",function(t,n){var r,i=location.hash.match(/#(?:comment|simple)-(\d+)/);i&&(r=o.find("#post-"+i[1]),r.length&&(o.find(".post-content.target").removeClass("target"),r.find(">.post-content").addClass("target"),n&&$(e).scrollTop(r.offset().top-90)))}),/(iPhone|Android)/.test(navigator.userAgent)&&o.addClass("mobile"),e.initSimpleThread=i}(window,document),function(e,t){return"127.0.0.1"!=t.domain&&"192.168.99.100"!=t.domain&&"deepzz.com"!=t.domain?void (location.href=location.href.replace(/(https?:\/\/[^\/]+)\//i,"//deepzz.com/")):void $(function(){lazyLoad({selector:"#content",height:100}),function(){var e=$("#content"),t=e.find("img"),n=e.width();t.each(function(){var e=$(this),t=0|e.attr("width"),r=0|e.attr("height"),i=e.prop("complete");t>n&&e.attr("height",Math.ceil(r/t*n)),e.prop("src")&&(i?e.addClass("loaded"):e.on("load",function(){e.addClass("loaded")}))})}(),function(){if("search-post"==CURRENT_PAGE){var e=$("#keyword");e.val()||e.focus()}}(),function(){var t,n,r,i=$("#disqus_thread"),o=$("#simple_thread"),a=!1,s=!1,u=$("#switch_thread_mode");u.length&&(e.disqus_config=function(){this.language="en",this.page.url=i.data("url"),this.page.identifier=i.data("identifier")},e.simple_config={id:o.data("id")},t=function(){i.show(),o.hide(),u.html('「切换到评论浏览模式」'),localStorage.comment_type="disqus_thread",a||(a=!0,i.html("评论加载中...

注:如果长时间无法加载,请针对 disq.us | disquscdn.com | disqus.com 启用代理;或者切换到评论浏览模式。"),$.getScript("//deepzz.disqus.com/embed.js"))},n=function(){i.hide(),o.show(),u.html('「切换到评论完整模式」'),localStorage.comment_type="simple_thread",s||(s=!0,o.html("评论加载中...

注:本模式仅供浏览,如需发表评论请切换到评论完整模式。"),e.initSimpleThread())},r=function(){var e=location.hash;return"#simple_thread"==e||/#simple-\d+$/.test(e)?(n(),!0):"#disqus_thread"==e||/#comment-\d+$/.test(e)?(t(),!0):void 0},$(e).on("hashchange",r),setTimeout(function(){/#(simple|comment)-\d+$/.test(location.hash)&&$("#comments").get(0).scrollIntoView();var o=setInterval(function(){var a=i.offset().top,s=$(e).scrollTop();if(Math.abs(a-s)<1000){if(clearTimeout(o),r()){return}if("simple_thread"==localStorage.comment_type){return void n()}t()}},150)},250))}()})}(this,document),function(e){$(function(){$(".entry-content pre").each(function(e){var t,n,r,i=$(this),o=i.find("code");if(o.length&&o.prop("className")&&(o.hasClass("language-html")&&(t="__HTML_CODE_"+e,o.prop("id",t),n=$(''),n.insertAfter(i)),o.html().split("\n").length>3&&o.prop("className").indexOf("language")>-1)){r=o.prop("className").replace("language-","").toUpperCase();$(''+r+"").insertBefore(o)}}),$(".entry-content input.runcode").each(function(){var t=$(this);t.click(function(t){var n,r,i;t.preventDefault(),n=$("#"+$(this).data("id")).html().stripTags().decode4Html(),r=e.open("","_preview",""),i=r.document,i.open(),i.write(n),i.close()})})})}(this),function(){$(function(){$(".entry-content img[data-replace]").each(function(){var e=$(this);e.click(function(){var t,n,r,i,o=1000*(e.data("dur")||20);e.css("cursor")&&(t="/static/img/blank.gif",n=e.prop("src"),r=e.data("replace"),e.prop("src",t),e.css("cursor",""),i=new Image,i.onload=function(){e.prop("src",r),setTimeout(function(){e.prop("src",n),e.css("cursor","pointer")},o)},i.src=r)}),e.css("cursor","pointer")})})}(this); +$(".entry-content > pre code").each(function(i,block){hljs.highlightBlock(block)});var stringProto=String.prototype;stringProto.decode4Html=function(){return this.replace(/<[^>]*>/gi,"")},stringProto.decode4Html=function(){var e=document.createElement("div");return e.innerHTML=this.stripTags(),e.childNodes[0]?e.childNodes[0].nodeValue||"":""},function(e){e.disqus_shortname="deepzz",$.each(["CURRENT_PAGE","CDN_DOMAIN"],function(t,n){e[n]="";var r=$("#"+n);r&&(e[n]=r.val())})}(this),function(e){function t(t){var n,r,i={selector:null,height:200};i=$.extend(i,t),n=i.height,r=function(){var t=$(e).scrollTop(),r=$(e).height()+t;$(i.selector).find("img[data-src]").each(function(){var e=$(this);setTimeout(function(){var i,o=e.offset(),a=e.height();o.top>r+n||o.top+a
'+(t.url?'':'')+'
'+t.message+'
    '+n(t.children)+"
";return r}function n(e){var n,r;if(!e||!e.length){return""}for(n="",r=0;r没有找到任何评论数据~

点此发表评论 \xbb

'}var t='';return t}function i(){a||(a=!0,$.get("/data/comment",{id:e.simple_config.id,cursor:s},function(t){var i,u;a=!1,t&&0==t.errno?(s?(i=n(t.data.comments),o.find(".post-list").append(i)):(i=r(t.data),o.html(i),$(e).trigger("hashchange","scrollIntoView")),u=o.find(".load-more a"),t.data.next?u.removeClass("busy"):u.hide(),s=t.data.next,$(e).trigger("scroll")):o.hide()}))}var o=$("#simple_thread"),a=!1,s="";o.on("click",".load-more a",function(e){e.preventDefault(),$(this).addClass("busy"),i()}).on("click",".time-ago",function(e){e.preventDefault(),location.hash="simple-"+$(this).data("id")}),$(e).on("hashchange",function(t,n){var r,i=location.hash.match(/#(?:comment|simple)-(\d+)/);i&&(r=o.find("#post-"+i[1]),r.length&&(o.find(".post-content.target").removeClass("target"),r.find(">.post-content").addClass("target"),n&&$(e).scrollTop(r.offset().top-90)))}),/(iPhone|Android)/.test(navigator.userAgent)&&o.addClass("mobile"),e.initSimpleThread=i}(window,document),function(e,t){return"127.0.0.1"!=t.domain&&"192.168.99.100"!=t.domain&&"deepzz.com"!=t.domain?void (location.href=location.href.replace(/(https?:\/\/[^\/]+)\//i,"//deepzz.com/")):void $(function(){lazyLoad({selector:"#content",height:100}),function(){var e=$("#content"),t=e.find("img"),n=e.width();t.each(function(){var e=$(this),t=0|e.attr("width"),r=0|e.attr("height"),i=e.prop("complete");t>n&&e.attr("height",Math.ceil(r/t*n)),e.prop("src")&&(i?e.addClass("loaded"):e.on("load",function(){e.addClass("loaded")}))})}(),function(){if("search-post"==CURRENT_PAGE){var e=$("#keyword");e.val()||e.focus()}}(),function(){var t,n,r,i=$("#disqus_thread"),o=$("#simple_thread"),a=!1,s=!1,u=$("#switch_thread_mode");u.length&&(e.disqus_config=function(){this.language="en",this.page.url=i.data("url"),this.page.identifier=i.data("identifier")},e.simple_config={id:o.data("id")},t=function(){i.show(),o.hide(),u.html('「切换到评论浏览模式」'),localStorage.comment_type="disqus_thread",a||(a=!0,i.html("评论加载中...

注:如果长时间无法加载,请针对 disq.us | disquscdn.com | disqus.com 启用代理;或者切换到评论浏览模式。"),$.getScript("//deepzz.disqus.com/embed.js"))},n=function(){i.hide(),o.show(),u.html('「切换到评论完整模式」'),localStorage.comment_type="simple_thread",s||(s=!0,o.html("评论加载中...

注:本模式仅供浏览,如需发表评论请切换到评论完整模式。"),e.initSimpleThread())},r=function(){var e=location.hash;return"#simple_thread"==e||/#simple-\d+$/.test(e)?(n(),!0):"#disqus_thread"==e||/#comment-\d+$/.test(e)?(t(),!0):void 0},$(e).on("hashchange",r),setTimeout(function(){/#(simple|comment)-\d+$/.test(location.hash)&&$("#comments").get(0).scrollIntoView();var o=setInterval(function(){var a=i.offset().top,s=$(e).scrollTop();if(Math.abs(a-s)<1000){if(clearTimeout(o),r()){return}if("simple_thread"==localStorage.comment_type){return void n()}t()}},150)},250))}()})}(this,document),function(e){$(function(){$(".entry-content pre").each(function(e){var t,n,r,i=$(this),o=i.find("code");if(o.length&&o.prop("className")&&(o.hasClass("language-html")&&(t="__HTML_CODE_"+e,o.prop("id",t),n=$(''),n.insertAfter(i)),o.html().split("\n").length>3&&o.prop("className").indexOf("language")>-1)){r=o.prop("className").replace("language-","").toUpperCase();$(''+r+"").insertBefore(o)}}),$(".entry-content input.runcode").each(function(){var t=$(this);t.click(function(t){var n,r,i;t.preventDefault(),n=$("#"+$(this).data("id")).html().stripTags().decode4Html(),r=e.open("","_preview",""),i=r.document,i.open(),i.write(n),i.close()})})})}(this),function(){$(function(){$(".entry-content img[data-replace]").each(function(){var e=$(this);e.click(function(){var t,n,r,i,o=1000*(e.data("dur")||20);e.css("cursor")&&(t="/static/img/blank.gif",n=e.prop("src"),r=e.data("replace"),e.prop("src",t),e.css("cursor",""),i=new Image,i.onload=function(){e.prop("src",r),setTimeout(function(){e.prop("src",n),e.css("cursor","pointer")},o)},i.src=r)}),e.css("cursor","pointer")})})}(this); {{end}} diff --git a/xml.go b/xml.go index 5456c71..9b3df6a 100644 --- a/xml.go +++ b/xml.go @@ -24,12 +24,17 @@ func init() { if err != nil { logd.Fatal(err) } - + doOpensearch() go doFeed() go doSitemap() } func doFeed() { + tpl := tpls.Lookup("feedTpl.xml") + if tpl == nil { + logd.Error("not found feedTpl.") + return + } _, _, artcs := PageList(1, FEED_COUNT) buildDate := time.Now() params := map[string]interface{}{ @@ -41,17 +46,12 @@ func doFeed() { "Artcs": artcs, } - f, err := os.OpenFile("conf/feed.xml", os.O_WRONLY|os.O_CREATE|os.O_TRUNC, os.ModePerm) + f, err := os.OpenFile("static/feed.xml", os.O_WRONLY|os.O_CREATE|os.O_TRUNC, os.ModePerm) if err != nil { logd.Error(err) return } defer f.Close() - tpl := tpls.Lookup("feedTpl.xml") - if tpl == nil { - logd.Error(err) - return - } err = tpl.Execute(f, params) if err != nil { logd.Error(err) @@ -61,18 +61,18 @@ func doFeed() { } func doSitemap() { + tpl := tpls.Lookup("sitemapTpl.xml") + if tpl == nil { + logd.Error("not found sitemapTpl.") + return + } params := map[string]interface{}{"Artcs": Ei.Articles, "Domain": runmode.Domain, "Enablehttps": runmode.EnableHttps} - f, err := os.OpenFile("conf/sitemap.xml", os.O_WRONLY|os.O_CREATE|os.O_TRUNC, os.ModePerm) + f, err := os.OpenFile("static/sitemap.xml", os.O_WRONLY|os.O_CREATE|os.O_TRUNC, os.ModePerm) if err != nil { logd.Error(err) return } defer f.Close() - tpl := tpls.Lookup("sitemapTpl.xml") - if tpl == nil { - logd.Error(err) - return - } err = tpl.Execute(f, params) if err != nil { logd.Error(err) @@ -80,3 +80,26 @@ func doSitemap() { } time.AfterFunc(time.Hour*24, doFeed) } + +func doOpensearch() { + tpl := tpls.Lookup("opensearchTpl.xml") + if tpl == nil { + logd.Error("not found opensearchTpl.") + return + } + params := map[string]string{ + "BTitle": Ei.BTitle, + "SubTitle": Ei.SubTitle, + } + f, err := os.OpenFile("static/opensearch.xml", os.O_WRONLY|os.O_CREATE|os.O_TRUNC, os.ModePerm) + if err != nil { + logd.Error(err) + return + } + defer f.Close() + err = tpl.Execute(f, params) + if err != nil { + logd.Error(err) + return + } +}