├── static ├── .gitkeep ├── image │ ├── logo.png │ ├── logo1.png │ ├── white.png │ ├── banner.png │ ├── loading.png │ ├── search.png │ ├── serach.png │ ├── language.png │ ├── logo1@2x.png │ └── wechartCode.jpg └── icon │ ├── iconfont.eot │ ├── iconfont.ttf │ ├── iconfont.woff │ ├── iconfont.css │ ├── demo.css │ ├── iconfont.svg │ └── iconfont.js ├── src ├── util │ ├── meta.js │ └── util.js ├── assets │ └── logo.png ├── modules │ ├── stopcock │ │ ├── index.js │ │ └── stopcock.vue │ ├── address │ │ ├── index.js │ │ └── address.vue │ ├── home │ │ └── index.js │ ├── hash │ │ ├── index.js │ │ ├── hash.vue │ │ └── hashlist.vue │ └── block │ │ ├── index.js │ │ ├── blocklist.vue │ │ └── block.vue ├── App.vue ├── router │ └── index.js ├── style │ ├── comm.media.less │ ├── common.css │ └── media.less ├── components │ ├── loading.vue │ ├── back.vue │ ├── hightcart.vue │ ├── header.vue │ ├── dropdown.vue │ ├── foot.vue │ ├── headers.vue │ └── footer.vue ├── main.js ├── http │ └── api.js └── il8n │ └── lang │ ├── cn.js │ └── en.js ├── .eslintignore ├── test ├── unit │ ├── setup.js │ ├── .eslintrc │ ├── specs │ │ └── HelloWorld.spec.js │ └── jest.conf.js └── e2e │ ├── specs │ └── test.js │ ├── custom-assertions │ └── elementCount.js │ ├── nightwatch.conf.js │ └── runner.js ├── config ├── prod.env.js ├── test.env.js ├── dev.env.js └── index.js ├── .editorconfig ├── .gitignore ├── .postcssrc.js ├── .babelrc ├── README.md ├── .eslintrc.js ├── package.json └── index.html /static/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/util/meta.js: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | /build/ 2 | /config/ 3 | /dist/ 4 | /*.js 5 | /test/unit/coverage/ 6 | -------------------------------------------------------------------------------- /src/assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cocos-BCX/explorer/HEAD/src/assets/logo.png -------------------------------------------------------------------------------- /test/unit/setup.js: -------------------------------------------------------------------------------- 1 | // import Vue from 'vue' 2 | 3 | Vue.config.productionTip = false 4 | -------------------------------------------------------------------------------- /config/prod.env.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | module.exports = { 3 | NODE_ENV: '"production"' 4 | } 5 | -------------------------------------------------------------------------------- /static/image/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cocos-BCX/explorer/HEAD/static/image/logo.png -------------------------------------------------------------------------------- /static/image/logo1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cocos-BCX/explorer/HEAD/static/image/logo1.png -------------------------------------------------------------------------------- /static/image/white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cocos-BCX/explorer/HEAD/static/image/white.png -------------------------------------------------------------------------------- /static/icon/iconfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cocos-BCX/explorer/HEAD/static/icon/iconfont.eot -------------------------------------------------------------------------------- /static/icon/iconfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cocos-BCX/explorer/HEAD/static/icon/iconfont.ttf -------------------------------------------------------------------------------- /static/image/banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cocos-BCX/explorer/HEAD/static/image/banner.png -------------------------------------------------------------------------------- /static/image/loading.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cocos-BCX/explorer/HEAD/static/image/loading.png -------------------------------------------------------------------------------- /static/image/search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cocos-BCX/explorer/HEAD/static/image/search.png -------------------------------------------------------------------------------- /static/image/serach.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cocos-BCX/explorer/HEAD/static/image/serach.png -------------------------------------------------------------------------------- /static/icon/iconfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cocos-BCX/explorer/HEAD/static/icon/iconfont.woff -------------------------------------------------------------------------------- /static/image/language.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cocos-BCX/explorer/HEAD/static/image/language.png -------------------------------------------------------------------------------- /static/image/logo1@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cocos-BCX/explorer/HEAD/static/image/logo1@2x.png -------------------------------------------------------------------------------- /test/unit/.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "jest": true 4 | }, 5 | "globals": { 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /static/image/wechartCode.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cocos-BCX/explorer/HEAD/static/image/wechartCode.jpg -------------------------------------------------------------------------------- /src/modules/stopcock/index.js: -------------------------------------------------------------------------------- 1 | import Stopcock from './stopcock.vue' 2 | 3 | export default [{ 4 | path: '/stopcock', 5 | name: 'Stopcock', 6 | component: Stopcock 7 | }] 8 | -------------------------------------------------------------------------------- /config/test.env.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const merge = require('webpack-merge') 3 | const devEnv = require('./dev.env') 4 | 5 | module.exports = merge(devEnv, { 6 | NODE_ENV: '"testing"' 7 | }) 8 | -------------------------------------------------------------------------------- /config/dev.env.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const merge = require('webpack-merge') 3 | const prodEnv = require('./prod.env') 4 | 5 | module.exports = merge(prodEnv, { 6 | NODE_ENV: '"development"', 7 | }) 8 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | indent_style = space 6 | indent_size = 2 7 | end_of_line = lf 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | -------------------------------------------------------------------------------- /src/modules/address/index.js: -------------------------------------------------------------------------------- 1 | // import Address from './address.vue' 2 | 3 | export default [{ 4 | path: '/address/:address_name', 5 | name: 'Address', 6 | component: (r) => { 7 | require(["./address.vue"], r) 8 | } 9 | }] 10 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules/ 3 | /dist/ 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | /test/unit/coverage/ 8 | /test/e2e/reports/ 9 | selenium-debug.log 10 | 11 | # Editor directories and files 12 | .idea 13 | .vscode 14 | *.suo 15 | *.ntvs* 16 | *.njsproj 17 | *.sln 18 | -------------------------------------------------------------------------------- /.postcssrc.js: -------------------------------------------------------------------------------- 1 | // https://github.com/michael-ciniawsky/postcss-load-config 2 | 3 | module.exports = { 4 | "plugins": { 5 | "postcss-import": {}, 6 | "postcss-url": {}, 7 | // to edit target browsers: use "browserslist" field in package.json 8 | "autoprefixer": {} 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/modules/home/index.js: -------------------------------------------------------------------------------- 1 | import Home from './home.vue' 2 | 3 | export default [{ 4 | path: '/', 5 | name: 'Home', 6 | component: (r) => { 7 | require(["./home.vue"], r) 8 | } 9 | }, 10 | { 11 | path: '*', 12 | name: '404', 13 | component: Home 14 | } 15 | ] 16 | -------------------------------------------------------------------------------- /src/App.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 17 | 22 | -------------------------------------------------------------------------------- /src/modules/hash/index.js: -------------------------------------------------------------------------------- 1 | // import Hash from './hash.vue' 2 | // import HashList from './hashlist.vue' 3 | 4 | export default [{ 5 | path: '/hash/:trans_id', 6 | name: 'Hash', 7 | component: (r) => { 8 | require(["./hash.vue"], r) 9 | } 10 | }, { 11 | path: '/hash_list', 12 | name: 'HashList', 13 | component: (r) => { 14 | require(["./hashlist.vue"], r) 15 | } 16 | }] 17 | -------------------------------------------------------------------------------- /src/modules/block/index.js: -------------------------------------------------------------------------------- 1 | // import Block from './block.vue' 2 | // import BlockList from './blocklist.vue' 3 | export default [{ 4 | path: '/block/:block_height', 5 | name: 'Block', 6 | component: (r) => { 7 | require(["./block.vue"], r) 8 | } 9 | }, { 10 | path: '/block_list', 11 | name: 'BlockList', 12 | component: (r) => { 13 | require(["./blocklist.vue"], r) 14 | } 15 | }] 16 | -------------------------------------------------------------------------------- /test/unit/specs/HelloWorld.spec.js: -------------------------------------------------------------------------------- 1 | // import Vue from 'vue' 2 | import HelloWorld from '@/components/HelloWorld' 3 | 4 | describe('HelloWorld.vue', () => { 5 | it('should render correct contents', () => { 6 | const Constructor = Vue.extend(HelloWorld) 7 | const vm = new Constructor().$mount() 8 | expect(vm.$el.querySelector('.hello h1').textContent) 9 | .toEqual('Welcome to Your Vue.js App') 10 | }) 11 | }) -------------------------------------------------------------------------------- /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | ["env", { 4 | "modules": false, 5 | "targets": { 6 | "browsers": ["> 1%", "last 2 versions", "not ie <= 8"] 7 | } 8 | }], 9 | "stage-2" 10 | ], 11 | "plugins": ["transform-vue-jsx", "transform-runtime"], 12 | "env": { 13 | "test": { 14 | "presets": ["env", "stage-2"], 15 | "plugins": ["transform-vue-jsx", "transform-es2015-modules-commonjs", "dynamic-import-node"] 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # explorer-front 2 | 3 | > Simple Block Explorer For Cocos-BCX 4 | 5 | Visit on https://explorer.cocosbcx.io/ 6 | 7 | ## Preparation 8 | 9 | node.js 8.9.3+ 10 | 11 | ## Build Setup 12 | 13 | ``` bash 14 | # install dependencies 15 | npm install 16 | 17 | # serve with hot reload at localhost:8080 18 | npm run dev 19 | 20 | # build for production with minification 21 | npm run build 22 | 23 | # build for production and view the bundle analyzer report 24 | npm run build --report 25 | -------------------------------------------------------------------------------- /src/router/index.js: -------------------------------------------------------------------------------- 1 | // import Vue from 'vue' 2 | import Router from 'vue-router' 3 | import Home from '../modules/home' 4 | import Block from '../modules/block' 5 | import Address from '../modules/address' 6 | import Hash from '../modules/hash' 7 | import Stopcock from '../modules/stopcock' 8 | 9 | Vue.use(Router) 10 | // Home包含404放最后 11 | export default new Router({ 12 | mode: 'history', 13 | routes: [ 14 | ...Block, 15 | ...Address, 16 | ...Hash, 17 | ...Stopcock, 18 | ...Home 19 | ] 20 | }) 21 | -------------------------------------------------------------------------------- /src/style/comm.media.less: -------------------------------------------------------------------------------- 1 | @media (min-width: 1200px) and (max-width: 1440px) { 2 | .block { 3 | .detail { 4 | width: 1200px; 5 | .content { 6 | width: 1024px; 7 | .info { 8 | width: 957px; 9 | } 10 | } 11 | } 12 | } 13 | } 14 | @media (max-width: 1200px) { 15 | .block { 16 | .detail { 17 | width: 1024px; 18 | .content { 19 | width: 870px; 20 | .info { 21 | width: 813px; 22 | } 23 | } 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/util/util.js: -------------------------------------------------------------------------------- 1 | import moment from 'moment' 2 | export default function (time) { 3 | let block_time = new Date().getTime() - new Date(time).getTime() 4 | let days = Math.floor(block_time / 1000 / 60 / 60 / 24) 5 | let hours = Math.floor(block_time / 1000 / 60 / 60 % 24) 6 | let minutes = Math.floor(block_time / 1000 / 60 % 60) 7 | let seconds = Math.floor(block_time / 1000 % 60) 8 | let times = { 9 | days, 10 | hours, 11 | minutes, 12 | seconds, 13 | times: moment(time).format('MMM DD YYYY HH:MM:SS A Z') 14 | } 15 | return times 16 | } 17 | -------------------------------------------------------------------------------- /test/e2e/specs/test.js: -------------------------------------------------------------------------------- 1 | // For authoring Nightwatch tests, see 2 | // http://nightwatchjs.org/guide#usage 3 | 4 | module.exports = { 5 | 'default e2e tests': function (browser) { 6 | // automatically uses dev Server port from /config.index.js 7 | // default: http://localhost:8080 8 | // see nightwatch.conf.js 9 | const devServer = browser.globals.devServerURL 10 | browser 11 | .url(devServer) 12 | .waitForElementVisible('#app', 5000) 13 | .assert.elementPresent('.hello') 14 | .assert.containsText('h1', 'Welcome to Your Vue.js App') 15 | .assert.elementCount('img', 1) 16 | .end() 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/components/loading.vue: -------------------------------------------------------------------------------- 1 | 6 | 23 | 37 | -------------------------------------------------------------------------------- /test/unit/jest.conf.js: -------------------------------------------------------------------------------- 1 | const path = require('path') 2 | 3 | module.exports = { 4 | rootDir: path.resolve(__dirname, '../../'), 5 | moduleFileExtensions: [ 6 | 'js', 7 | 'json', 8 | 'vue' 9 | ], 10 | moduleNameMapper: { 11 | '^@/(.*)$': '/src/$1' 12 | }, 13 | transform: { 14 | '^.+\\.js$': '/node_modules/babel-jest', 15 | '.*\\.(vue)$': '/node_modules/vue-jest' 16 | }, 17 | testPathIgnorePatterns: [ 18 | '/test/e2e' 19 | ], 20 | snapshotSerializers: ['/node_modules/jest-serializer-vue'], 21 | setupFiles: ['/test/unit/setup'], 22 | mapCoverage: true, 23 | coverageDirectory: '/test/unit/coverage', 24 | collectCoverageFrom: [ 25 | 'src/**/*.{js,vue}', 26 | '!src/main.js', 27 | '!src/router/index.js', 28 | '!**/node_modules/**' 29 | ] 30 | } 31 | -------------------------------------------------------------------------------- /test/e2e/custom-assertions/elementCount.js: -------------------------------------------------------------------------------- 1 | // A custom Nightwatch assertion. 2 | // The assertion name is the filename. 3 | // Example usage: 4 | // 5 | // browser.assert.elementCount(selector, count) 6 | // 7 | // For more information on custom assertions see: 8 | // http://nightwatchjs.org/guide#writing-custom-assertions 9 | 10 | exports.assertion = function (selector, count) { 11 | this.message = 'Testing if element <' + selector + '> has count: ' + count 12 | this.expected = count 13 | this.pass = function (val) { 14 | return val === this.expected 15 | } 16 | this.value = function (res) { 17 | return res.value 18 | } 19 | this.command = function (cb) { 20 | var self = this 21 | return this.api.execute(function (selector) { 22 | return document.querySelectorAll(selector).length 23 | }, [selector], function (res) { 24 | cb.call(self, res) 25 | }) 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | // https://eslint.org/docs/user-guide/configuring 2 | 3 | module.exports = { 4 | root: true, 5 | parserOptions: { 6 | parser: 'babel-eslint' 7 | }, 8 | env: { 9 | browser: true, 10 | }, 11 | extends: [ 12 | // https://github.com/vuejs/eslint-plugin-vue#priority-a-essential-error-prevention 13 | // consider switching to `plugin:vue/strongly-recommended` or `plugin:vue/recommended` for stricter rules. 14 | 'plugin:vue/essential', 15 | // https://github.com/standard/standard/blob/master/docs/RULES-en.md 16 | 'standard' 17 | ], 18 | // required to lint *.vue files 19 | plugins: [ 20 | 'vue', 21 | 'component', { 22 | 'libraryName': 'element-ui', 23 | 'styleLibraryName': 'theme-chalk' 24 | } 25 | ], 26 | // add your custom rules here 27 | rules: { 28 | // allow async-await 29 | 'generator-star-spacing': 'off', 30 | // allow debugger during development 31 | 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off' 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /test/e2e/nightwatch.conf.js: -------------------------------------------------------------------------------- 1 | require('babel-register') 2 | var config = require('../../config') 3 | 4 | // http://nightwatchjs.org/gettingstarted#settings-file 5 | module.exports = { 6 | src_folders: ['test/e2e/specs'], 7 | output_folder: 'test/e2e/reports', 8 | custom_assertions_path: ['test/e2e/custom-assertions'], 9 | 10 | selenium: { 11 | start_process: true, 12 | server_path: require('selenium-server').path, 13 | host: '127.0.0.1', 14 | port: 4444, 15 | cli_args: { 16 | 'webdriver.chrome.driver': require('chromedriver').path 17 | } 18 | }, 19 | 20 | test_settings: { 21 | default: { 22 | selenium_port: 4444, 23 | selenium_host: 'localhost', 24 | silent: true, 25 | globals: { 26 | devServerURL: 'http://localhost:' + (process.env.PORT || config.dev.port) 27 | } 28 | }, 29 | 30 | chrome: { 31 | desiredCapabilities: { 32 | browserName: 'chrome', 33 | javascriptEnabled: true, 34 | acceptSslCerts: true 35 | } 36 | }, 37 | 38 | firefox: { 39 | desiredCapabilities: { 40 | browserName: 'firefox', 41 | javascriptEnabled: true, 42 | acceptSslCerts: true 43 | } 44 | } 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /src/components/back.vue: -------------------------------------------------------------------------------- 1 | 8 | 22 | 56 | -------------------------------------------------------------------------------- /test/e2e/runner.js: -------------------------------------------------------------------------------- 1 | // 1. start the dev server using production config 2 | process.env.NODE_ENV = 'testing' 3 | 4 | const webpack = require('webpack') 5 | const DevServer = require('webpack-dev-server') 6 | 7 | const webpackConfig = require('../../build/webpack.prod.conf') 8 | const devConfigPromise = require('../../build/webpack.dev.conf') 9 | 10 | let server 11 | 12 | devConfigPromise.then(devConfig => { 13 | const devServerOptions = devConfig.devServer 14 | const compiler = webpack(webpackConfig) 15 | server = new DevServer(compiler, devServerOptions) 16 | const port = devServerOptions.port 17 | const host = devServerOptions.host 18 | return server.listen(port, host) 19 | }) 20 | .then(() => { 21 | // 2. run the nightwatch test suite against it 22 | // to run in additional browsers: 23 | // 1. add an entry in test/e2e/nightwatch.conf.js under "test_settings" 24 | // 2. add it to the --env flag below 25 | // or override the environment flag, for example: `npm run e2e -- --env chrome,firefox` 26 | // For more information on Nightwatch's config file, see 27 | // http://nightwatchjs.org/guide#settings-file 28 | let opts = process.argv.slice(2) 29 | if (opts.indexOf('--config') === -1) { 30 | opts = opts.concat(['--config', 'test/e2e/nightwatch.conf.js']) 31 | } 32 | if (opts.indexOf('--env') === -1) { 33 | opts = opts.concat(['--env', 'chrome']) 34 | } 35 | 36 | const spawn = require('cross-spawn') 37 | const runner = spawn('./node_modules/.bin/nightwatch', opts, { stdio: 'inherit' }) 38 | 39 | runner.on('exit', function (code) { 40 | server.close() 41 | process.exit(code) 42 | }) 43 | 44 | runner.on('error', function (err) { 45 | server.close() 46 | throw err 47 | }) 48 | }) 49 | -------------------------------------------------------------------------------- /src/modules/stopcock/stopcock.vue: -------------------------------------------------------------------------------- 1 | 13 | 29 | -------------------------------------------------------------------------------- /config/index.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | // Template version: 1.3.1 3 | // see http://vuejs-templates.github.io/webpack for documentation. 4 | 5 | const path = require('path') 6 | 7 | module.exports = { 8 | dev: { 9 | // Paths 10 | assetsSubDirectory: 'static', 11 | assetsPublicPath: '/', 12 | proxyTable: {}, 13 | 14 | // Various Dev Server settings 15 | host: 'localhost', // can be overwritten by process.env.HOST 16 | port: 9000, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined 17 | autoOpenBrowser: false, 18 | errorOverlay: true, 19 | notifyOnErrors: true, 20 | poll: false, // https://webpack.js.org/configuration/dev-server/#devserver-watchoptions- 21 | 22 | // Use Eslint Loader? 23 | // If true, your code will be linted during bundling and 24 | // linting errors and warnings will be shown in the console. 25 | useEslint: false, 26 | // If true, eslint errors and warnings will also be shown in the error overlay 27 | // in the browser. 28 | showEslintErrorsInOverlay: false, 29 | 30 | /** 31 | * Source Maps 32 | */ 33 | 34 | // https://webpack.js.org/configuration/devtool/#development 35 | devtool: 'cheap-module-eval-source-map', 36 | 37 | // If you have problems debugging vue-files in devtools, 38 | // set this to false - it *may* help 39 | // https://vue-loader.vuejs.org/en/options.html#cachebusting 40 | cacheBusting: true, 41 | 42 | cssSourceMap: true, 43 | }, 44 | 45 | build: { 46 | // Template for index.html 47 | index: path.resolve(__dirname, '../dist/index.html'), 48 | 49 | // Paths 50 | assetsRoot: path.resolve(__dirname, '../dist'), 51 | assetsSubDirectory: 'static', 52 | assetsPublicPath: '/', 53 | 54 | /** 55 | * Source Maps 56 | */ 57 | 58 | productionSourceMap: true, 59 | // https://webpack.js.org/configuration/devtool/#production 60 | devtool: '#source-map', 61 | 62 | // Gzip off by default as many popular static hosts such as 63 | // Surge or Netlify already gzip all static assets for you. 64 | // Before setting to `true`, make sure to: 65 | // npm install --save-dev compression-webpack-plugin 66 | productionGzip: false, 67 | productionGzipExtensions: ['js', 'css'], 68 | 69 | // Run the build command with an extra argument to 70 | // View the bundle analyzer report after build finishes: 71 | // `npm run build --report` 72 | // Set to `true` or `false` to always turn it on or off 73 | bundleAnalyzerReport: process.env.npm_config_report, 74 | }, 75 | } 76 | -------------------------------------------------------------------------------- /src/main.js: -------------------------------------------------------------------------------- 1 | // The Vue build version to load with the `import` command 2 | // (runtime-only or standalone) has been set in webpack.base.conf with an alias. 3 | // import Vue from 'vue' 4 | // author cocos-bcx team 5 | import App from './App' 6 | import router from './router' 7 | import VueI18n from 'vue-i18n' 8 | import Vuex from 'vuex' 9 | import VueLazyload from 'vue-lazyload' 10 | import Highcharts from 'highcharts/highstock' 11 | import VueClipboard from 'vue-clipboard2' 12 | import qs from 'qs' 13 | import cn from './il8n/lang/cn' 14 | import en from './il8n/lang/en' 15 | import { 16 | Pagination, 17 | MessageBox, 18 | Dialog 19 | } from 'element-ui'; 20 | // import VuePaginate from 'vue-paginate' 21 | // import defaults from './http/api'; 22 | Vue.component(MessageBox) 23 | Vue.component(Pagination) 24 | Vue.component(Dialog) 25 | Vue.prototype.$qs = qs; 26 | Vue.use(Vuex) 27 | Vue.use(VueLazyload) 28 | Vue.use(VueI18n) 29 | Vue.use(VueClipboard) 30 | Vue.prototype.$alert = MessageBox.alert; 31 | // Vue.use(VueLazyload, { 32 | // preLoad: 1.3, 33 | // error: 'dist/error.png', 34 | // loading: 'dist/loading.gif', 35 | // attempt: 1 36 | // }) 37 | const store = new Vuex.Store({}) 38 | const i18n = new VueI18n({ 39 | locale: 'cn', // 语言标识, 通过切换locale的值来实现语言切换,this.$i18n.locale 40 | messages: { 41 | en: { 42 | ...en 43 | }, // 中文语言包 44 | cn: { 45 | ...cn 46 | } 47 | } 48 | }) 49 | store.registerModule('app', { 50 | state: { 51 | language: { 52 | name: 'English', 53 | type: 'cn' 54 | }, 55 | defaults: { 56 | trade: '14 day Transaction History', 57 | address: '14 day Address Growth' 58 | } 59 | }, 60 | mutations: { 61 | setLanguage(state, language) { 62 | state.language = language 63 | }, 64 | setDefault(state, defaults) { 65 | state.defaults = defaults 66 | } 67 | } 68 | }) 69 | Vue.config.productionTip = false 70 | router.afterEach((to, from, next) => { 71 | window.scrollTo(0, 0); 72 | var _hmt = _hmt || []; 73 | (function () { 74 | var hm = document.createElement("script"); 75 | hm.src = "https://hm.baidu.com/hm.js?bab6d19be10a79632bc890001c815bbd"; 76 | var s = document.getElementsByTagName("script")[0]; 77 | s.parentNode.insertBefore(hm, s); 78 | })(); 79 | }) 80 | /* eslint-disable no-new */ 81 | new Vue({ 82 | el: '#app', 83 | router, 84 | i18n, 85 | store, 86 | components: { 87 | App 88 | }, 89 | template: '', 90 | methods: { 91 | moreChart() { 92 | var options = this.getMoreOptions(this.type) 93 | 94 | if (this.chart) { 95 | this.chart.destroy() 96 | }; 97 | // 初始化 Highcharts 图表 98 | this.chart = new Highcharts.Chart('highcharts-more', options); 99 | } 100 | } 101 | }) 102 | -------------------------------------------------------------------------------- /src/components/hightcart.vue: -------------------------------------------------------------------------------- 1 | 4 | -------------------------------------------------------------------------------- /src/http/api.js: -------------------------------------------------------------------------------- 1 | import axios from 'axios' 2 | import qs from 'qs' 3 | let cancel, 4 | promiseArr = {} 5 | 6 | 7 | axios.interceptors.response.use( 8 | response => { 9 | if (response.status === 200 && response.statusText === 'OK') { 10 | return response 11 | } else { 12 | return Promise.reject(response) 13 | } 14 | }, 15 | err => { 16 | let error = qs.parse(qs.stringify(err)) 17 | if (error && error.response) { 18 | switch (error.response.status) { 19 | case 400: 20 | error.message = '错误请求' 21 | break 22 | case 401: 23 | error.message = '未授权,请重新登录' 24 | break 25 | case 403: 26 | error.message = '拒绝访问' 27 | break 28 | case 404: 29 | error.message = '请求错误,未找到该资源' 30 | break 31 | case 405: 32 | error.message = '请求方法未允许' 33 | break 34 | case 408: 35 | error.message = '请求超时' 36 | break 37 | case 500: 38 | error.message = '服务器端出错' 39 | break 40 | case 501: 41 | error.message = '网络未实现' 42 | break 43 | case 502: 44 | error.message = '网络错误' 45 | break 46 | case 503: 47 | error.message = '服务不可用' 48 | break 49 | case 504: 50 | error.message = '网络超时' 51 | break 52 | case 505: 53 | error.message = 'http版本不支持该请求' 54 | break 55 | default: 56 | error.message = `连接错误${error.response.status}` 57 | } 58 | } else { 59 | error.message = '连接到服务器失败' 60 | } 61 | return Promise.reject(error.response) 62 | } 63 | ) 64 | 65 | 66 | axios.defaults.baseURL = 67 | process.env.NODE_ENV === 'development' ? 68 | 'https://explorer.cocosbcx.io/api/' : 69 | 'https://explorer.cocosbcx.io/api/' 70 | axios.defaults.headers = { 71 | 'X-Requested-With': 'XMLHttpRequest', 72 | 'Content-Type': 'application/json;charset=UTF-8' 73 | } 74 | axios.defaults.timeout = 10000 75 | 76 | export default { 77 | get(url, param) { 78 | return new Promise((resolve, reject) => { 79 | axios({ 80 | method: 'get', 81 | url, 82 | params: param 83 | // cancelToken: new CancelToken(c => { 84 | // cancel = c 85 | // }) 86 | }) 87 | .then(res => { 88 | resolve(res.data) 89 | }) 90 | .catch(err => { 91 | reject(err) 92 | }) 93 | }) 94 | }, 95 | post(url, param) { 96 | return new Promise((resolve, reject) => { 97 | axios({ 98 | method: 'post', 99 | url, 100 | data: param, 101 | cancelToken: new CancelToken(c => { 102 | cancel = c 103 | }) 104 | }) 105 | .then(res => { 106 | resolve(res.data) 107 | }) 108 | .catch(err => { 109 | reject(err) 110 | }) 111 | }) 112 | } 113 | } 114 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "explorer-front", 3 | "version": "1.0.0", 4 | "description": "A Vue.js project", 5 | "author": "zhen.liu ", 6 | "private": true, 7 | "scripts": { 8 | "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js", 9 | "start": "npm run dev", 10 | "unit": "jest --config test/unit/jest.conf.js --coverage", 11 | "e2e": "node test/e2e/runner.js", 12 | "test": "npm run unit && npm run e2e", 13 | "lint": "eslint --ext .js,.vue src test/unit test/e2e/specs", 14 | "build": "node build/build.js" 15 | }, 16 | "dependencies": { 17 | "@types/highcharts": "^5.0.33", 18 | "axios": "^0.18.0", 19 | "binary-extensions": "^1.13.0", 20 | "bootstrap": "^4.1.3", 21 | "element-ui": "^2.4.11", 22 | "highcharts": "^6.2.0", 23 | "moment": "^2.24.0", 24 | "pm2": "^3.2.2", 25 | "qs": "^6.6.0", 26 | "vue": "^2.5.2", 27 | "vue-clipboard2": "^0.2.1", 28 | "vue-count-to": "^1.0.13", 29 | "vue-highcharts": "0.0.10", 30 | "vue-i18n": "^8.3.2", 31 | "vue-pagination": "^0.3.3", 32 | "vue-router": "^3.0.1", 33 | "vuex": "^3.0.1" 34 | }, 35 | "devDependencies": { 36 | "autoprefixer": "^7.1.2", 37 | "babel-core": "^6.22.1", 38 | "babel-eslint": "^8.2.1", 39 | "babel-helper-vue-jsx-merge-props": "^2.0.3", 40 | "babel-jest": "^21.0.2", 41 | "babel-loader": "^7.1.1", 42 | "babel-plugin-component": "^1.1.1", 43 | "babel-plugin-dynamic-import-node": "^1.2.0", 44 | "babel-plugin-syntax-jsx": "^6.18.0", 45 | "babel-plugin-transform-es2015-modules-commonjs": "^6.26.0", 46 | "babel-plugin-transform-runtime": "^6.22.0", 47 | "babel-plugin-transform-vue-jsx": "^3.5.0", 48 | "babel-preset-env": "^1.3.2", 49 | "babel-preset-stage-2": "^6.22.0", 50 | "babel-register": "^6.22.0", 51 | "chalk": "^2.0.1", 52 | "chromedriver": "^2.27.2", 53 | "copy-webpack-plugin": "^4.0.1", 54 | "cross-spawn": "^5.0.1", 55 | "css-loader": "^0.28.0", 56 | "eslint": "^4.15.0", 57 | "eslint-config-standard": "^10.2.1", 58 | "eslint-friendly-formatter": "^3.0.0", 59 | "eslint-loader": "^1.7.1", 60 | "eslint-plugin-import": "^2.7.0", 61 | "eslint-plugin-node": "^5.2.0", 62 | "eslint-plugin-promise": "^3.4.0", 63 | "eslint-plugin-standard": "^3.0.1", 64 | "eslint-plugin-vue": "^4.0.0", 65 | "extract-text-webpack-plugin": "^3.0.0", 66 | "file-loader": "^1.1.4", 67 | "friendly-errors-webpack-plugin": "^1.6.1", 68 | "html-webpack-plugin": "^2.30.1", 69 | "jest": "^22.0.4", 70 | "jest-serializer-vue": "^0.3.0", 71 | "less": "^3.8.1", 72 | "less-loader": "^4.1.0", 73 | "nightwatch": "^0.9.12", 74 | "node-notifier": "^5.1.2", 75 | "optimize-css-assets-webpack-plugin": "^3.2.0", 76 | "ora": "^1.2.0", 77 | "portfinder": "^1.0.13", 78 | "postcss-import": "^11.0.0", 79 | "postcss-loader": "^2.0.8", 80 | "postcss-url": "^7.2.1", 81 | "rimraf": "^2.6.0", 82 | "selenium-server": "^3.0.1", 83 | "semver": "^5.3.0", 84 | "shelljs": "^0.7.6", 85 | "uglifyjs-webpack-plugin": "^1.1.1", 86 | "url-loader": "^0.5.8", 87 | "vue-jest": "^1.0.2", 88 | "vue-lazyload": "^1.2.6", 89 | "vue-loader": "^13.3.0", 90 | "vue-style-loader": "^3.0.1", 91 | "vue-template-compiler": "^2.5.2", 92 | "webpack": "^3.6.0", 93 | "webpack-bundle-analyzer": "^3.3.2", 94 | "webpack-dev-server": "^3.1.11", 95 | "webpack-merge": "^4.1.0" 96 | }, 97 | "engines": { 98 | "node": ">= 6.0.0", 99 | "npm": ">= 3.0.0" 100 | }, 101 | "browserslist": [ 102 | "> 1%", 103 | "last 2 versions", 104 | "not ie <= 8" 105 | ] 106 | } 107 | -------------------------------------------------------------------------------- /static/icon/iconfont.css: -------------------------------------------------------------------------------- 1 | 2 | @font-face {font-family: "iconfont"; 3 | src: url('iconfont.eot?t=1544011028905'); /* IE9*/ 4 | src: url('iconfont.eot?t=1544011028905#iefix') format('embedded-opentype'), /* IE6-IE8 */ 5 | url('data:application/x-font-woff;charset=utf-8;base64,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') format('woff'), 6 | url('iconfont.ttf?t=1544011028905') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/ 7 | url('iconfont.svg?t=1544011028905#iconfont') format('svg'); /* iOS 4.1- */ 8 | } 9 | 10 | .iconfont { 11 | font-family:"iconfont" !important; 12 | font-size:16px; 13 | font-style:normal; 14 | -webkit-font-smoothing: antialiased; 15 | -moz-osx-font-smoothing: grayscale; 16 | } 17 | 18 | .icon-facebook:before { content: "\eab7"; } 19 | 20 | .icon-icon:before { content: "\e64b"; } 21 | 22 | .icon-weibo:before { content: "\e67a"; } 23 | 24 | .icon-wechat:before { content: "\e634"; } 25 | 26 | .icon-telegram:before { content: "\e65f"; } 27 | 28 | .icon-github:before { content: "\f1b4"; } 29 | 30 | -------------------------------------------------------------------------------- /src/il8n/lang/cn.js: -------------------------------------------------------------------------------- 1 | export default { 2 | home: { 3 | prompt: '温馨提示', 4 | content: '正在维护中,主网公测链数据即将上线', 5 | button: { 6 | cancel: '取消', 7 | confirm: '确认', 8 | }, 9 | search: '搜索地址、区块、交易hash', 10 | banner: { 11 | node: '测试节点', 12 | block: '区块高度', 13 | trade: '过去一天交易数', 14 | count: '账户数量', 15 | tps: 'TPS' 16 | }, 17 | header: { 18 | homepage: "首页", 19 | develop: '开发者', 20 | developPlan: '开发者计划', 21 | developApi: '开发文档', 22 | developsq: '开发者社区', 23 | jili: '悬赏', 24 | ct: '激励', 25 | stproduct: '生态产品', 26 | action: '动态', 27 | browser: '浏览器', 28 | about: '关于我们', 29 | whiteBook: '白皮书', 30 | team: '团队与合作单位', 31 | }, 32 | footer: { 33 | contact: '联系方式', 34 | subscribe: '订阅我们的报告', 35 | submit: '订阅', 36 | int_email: '请输入您的电子邮件地址...', 37 | }, 38 | charts: { 39 | trade: '过去14天交易数', 40 | address: '过去14天地址增长' 41 | }, 42 | list: { 43 | block: { 44 | title: '区块', 45 | more: '查看全部', 46 | block_detail: { 47 | block: '区块', 48 | minutes: '分', 49 | second: '秒前', 50 | produced: '由矿工', 51 | trade: '交易', 52 | by: '于', 53 | time: '秒', 54 | reward: '区块奖励', 55 | eth: '以太币' 56 | } 57 | }, 58 | trade: { 59 | title: '交易', 60 | more: '查看全部', 61 | trade_detail: { 62 | trade: '交易 #', 63 | from: '发送方', 64 | to: '接收方', 65 | num: '数额', 66 | time: '秒前', 67 | eth: '以太币' 68 | } 69 | } 70 | } 71 | }, 72 | block: { 73 | title: '区块', 74 | detail: { 75 | high: '区块高度', 76 | status: { 77 | name: '状态', 78 | enter: '已确认', 79 | padding: '待确认' 80 | }, 81 | time: { 82 | name: '时间戳', 83 | day: '天', 84 | hour: '小时', 85 | min: '分钟', 86 | second: '秒', 87 | ago: '前', 88 | trade: '交易' 89 | }, 90 | hash: '哈希', 91 | f_hash: '父哈希', 92 | code: '节点', 93 | bit: '字节', 94 | num: '交易数量', 95 | size: '大小', 96 | copy: '复制' 97 | }, 98 | trade: { 99 | title: '转账', 100 | hash: '哈希值', 101 | age: '块龄', 102 | from: '发送人', 103 | to: '接收人', 104 | num: '数量' 105 | }, 106 | list: { 107 | high: '高度', 108 | age: '块龄', 109 | produced: '出块者', 110 | trade: '交易', 111 | bit: '字节' 112 | } 113 | }, 114 | address: { 115 | title: '地址信息', 116 | detail: { 117 | address: '地址', 118 | name: '名称', 119 | trade: '转账', 120 | balance: '余额' 121 | }, 122 | trade: { 123 | title: '转账', 124 | hash: '哈希值', 125 | age: '块龄', 126 | from: '发送人', 127 | to: '接收人', 128 | num: '数量', 129 | copy: '复制' 130 | } 131 | }, 132 | trade: { 133 | title: '交易', 134 | detail: { 135 | status: '状态', 136 | type: { 137 | center: '已确定', 138 | padding: '待确定' 139 | }, 140 | hash: '哈希', 141 | block: '区块', 142 | time: '时间', 143 | copy: '复制' 144 | }, 145 | trade_detail: { 146 | trade: '交易信息', 147 | address: '地址间转账通证', 148 | from: '发送人', 149 | to: '接收人', 150 | num: '数量', 151 | contract: '合约', 152 | create: '创建人', 153 | account: '账户', 154 | }, 155 | list: { 156 | hash: '交易 #', 157 | block: '区块', 158 | time: '创建时间', 159 | from: '发送人', 160 | to: '接收人', 161 | count: '价值' 162 | } 163 | }, 164 | faucet: { 165 | title: '水龙头', 166 | des: '每个地址只能获取一次代币', 167 | search: '请输入测试网地址', 168 | register: '没有地址 去注册测试网地址', 169 | get: '获取' 170 | }, 171 | bottom: { 172 | subscribe: '订阅我们的报告', 173 | message: '请输入您的邮箱', 174 | email: '请输入正确的邮箱', 175 | success: '订阅成功', 176 | error: '订阅失败' 177 | } 178 | 179 | } 180 | -------------------------------------------------------------------------------- /src/components/header.vue: -------------------------------------------------------------------------------- 1 | 21 | 45 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Cocos-BCX 区块浏览器 8 | 9 | 10 | 11 | 12 | 125 | 126 | 127 | 128 | 129 |
130 | 131 | 132 | 133 | 134 | -------------------------------------------------------------------------------- /src/il8n/lang/en.js: -------------------------------------------------------------------------------- 1 | export default { 2 | home: { 3 | prompt: 'Prompt', 4 | content: "Under maintenance, the main net public beta chain's data is about to be online ", 5 | button: { 6 | cancel: 'cancel', 7 | confirm: 'confirm', 8 | }, 9 | search: 'Search Address,Block,Transaction Hash', 10 | banner: { 11 | node: 'Testing Nodes', 12 | block: 'Block Height', 13 | trade: 'Transactions Last Day', 14 | count: 'Total Accounts', 15 | tps: 'TPS' 16 | }, 17 | header: { 18 | homepage: "HOME", 19 | develop: 'DEVELOPER', 20 | developPlan: 'PROGRAM', 21 | developApi: 'DOC', 22 | developsq: 'FORUM', 23 | jili: 'BOUNTY', 24 | ct: 'CONTRIBUTION', 25 | stproduct: 'ECOSYSTEM', 26 | action: 'NEWS', 27 | browser: 'EXPLORER', 28 | about: 'ABOUT', 29 | whiteBook: 'WHITE PAPER', 30 | team: 'Team & Partners', 31 | }, 32 | footer: { 33 | contact: 'Contact Info', 34 | subscribe: 'Subscribe to our community updates', 35 | submit: 'SUBSCRIBE', 36 | int_email: 'Enter your email address...', 37 | }, 38 | charts: { 39 | trade: '14 day Transaction History', 40 | address: '14 day Address Growth' 41 | }, 42 | list: { 43 | block: { 44 | title: 'Block', 45 | more: 'Show All', 46 | block_detail: { 47 | block: 'Block', 48 | minutes: 'minutes', 49 | second: 'seconds', 50 | trade: 'transaction', 51 | produced: 'Produced by', 52 | by: 'by ', 53 | time: 'seconds ago', 54 | reward: 'Block Reward', 55 | eth: 'ETH' 56 | } 57 | }, 58 | trade: { 59 | title: 'Transactions', 60 | more: 'Show All', 61 | trade_detail: { 62 | trade: 'Tx #', 63 | from: 'From', 64 | to: 'To', 65 | time: 'seconds ago', 66 | num: 'Amount', 67 | eth: 'ETH' 68 | } 69 | } 70 | } 71 | }, 72 | block: { 73 | title: 'BLOCK', 74 | detail: { 75 | high: 'Height', 76 | status: { 77 | name: 'Status', 78 | enter: 'CONFIRMED', 79 | padding: 'UNCONFIRMED' 80 | }, 81 | time: { 82 | name: 'Timestamp', 83 | day: 'days', 84 | hour: 'hours', 85 | min: 'minutes', 86 | second: 'seconds', 87 | ago: 'ago', 88 | trade: 'Transfers' 89 | }, 90 | hash: 'Hash', 91 | f_hash: 'Parent Hash', 92 | code: 'Node', 93 | num: 'Transactions', 94 | size: 'Size', 95 | bit: 'byte', 96 | copy: 'Copy' 97 | }, 98 | trade: { 99 | title: 'Transfers', 100 | hash: 'Hash', 101 | age: 'Age', 102 | from: 'From', 103 | to: 'To', 104 | num: 'AMOUNT', 105 | copy: 'Copy' 106 | }, 107 | list: { 108 | high: 'HIGHT', 109 | age: 'AGE', 110 | produced: 'Produced by', 111 | trade: 'Transfers', 112 | bit: 'byte' 113 | } 114 | }, 115 | address: { 116 | title: 'ADDRESS', 117 | detail: { 118 | address: 'Address', 119 | name: 'Name', 120 | trade: 'Transfers', 121 | balance: 'Balance' 122 | }, 123 | trade: { 124 | title: 'Transfers', 125 | hash: 'Hash', 126 | age: 'Age', 127 | from: 'From', 128 | to: 'To', 129 | num: 'Amount', 130 | copy: 'Copy' 131 | } 132 | }, 133 | trade: { 134 | title: 'TRANSACTION', 135 | detail: { 136 | status: 'Status', 137 | type: { 138 | center: 'CONFIRMED', 139 | padding: 'UNCONFIRMED' 140 | }, 141 | hash: 'Hash', 142 | block: 'Block', 143 | time: 'Time', 144 | copy: 'Copy' 145 | }, 146 | trade_detail: { 147 | trade: 'Transaction Detail', 148 | address: 'TRX transfer between address', 149 | from: 'From', 150 | to: 'To', 151 | num: 'VALUE', 152 | contract: 'Contract', 153 | create: 'Registrar', 154 | account: 'Account', 155 | }, 156 | list: { 157 | hash: 'TRANSACTION #', 158 | block: 'BLOCK', 159 | time: 'TIME', 160 | from: 'FROM', 161 | to: 'TO', 162 | count: 'AMOUNT' 163 | } 164 | }, 165 | faucet: { 166 | title: 'Faucet', 167 | des: 'An address receives token for once ', 168 | search: 'Enter your testing address', 169 | register: ' Haven’t registered? Create your testing address', 170 | get: 'Take' 171 | }, 172 | bottom: { 173 | subscribe: 'Subscribe to our community updates.', 174 | message: 'Your Email Address', 175 | email: 'Enter your email address', 176 | success: 'Success', 177 | error: 'Error' 178 | } 179 | } 180 | -------------------------------------------------------------------------------- /src/style/common.css: -------------------------------------------------------------------------------- 1 | /* 2 | html5doctor.com Reset Stylesheet v1.6.1 3 | Last Updated: 2010-09-17 4 | Author: Richard Clark - http://richclarkdesign.com 5 | */ 6 | html, 7 | body, 8 | div, 9 | span, 10 | object, 11 | iframe, 12 | h1, 13 | h2, 14 | h3, 15 | h4, 16 | h5, 17 | h6, 18 | p, 19 | blockquote, 20 | pre, 21 | abbr, 22 | address, 23 | cite, 24 | code, 25 | del, 26 | dfn, 27 | em, 28 | img, 29 | ins, 30 | kbd, 31 | q, 32 | samp, 33 | small, 34 | strong, 35 | sub, 36 | sup, 37 | var, 38 | b, 39 | i, 40 | dl, 41 | dt, 42 | dd, 43 | ol, 44 | ul, 45 | li, 46 | fieldset, 47 | form, 48 | label, 49 | legend, 50 | table, 51 | caption, 52 | tbody, 53 | tfoot, 54 | thead, 55 | tr, 56 | th, 57 | td, 58 | article, 59 | aside, 60 | canvas, 61 | details, 62 | figcaption, 63 | figure, 64 | footer, 65 | header, 66 | hgroup, 67 | menu, 68 | nav, 69 | section, 70 | summary, 71 | time, 72 | mark, 73 | audio, 74 | video { 75 | margin: 0; 76 | padding: 0; 77 | border: 0; 78 | outline: 0; 79 | font-size: 100%; 80 | list-style: none; 81 | /* vertical-align:middle; */ 82 | /* box-sizing: border-box; */ 83 | /* background:transparent; */ 84 | font-family: "Helvetica Neue", Helvetica, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "微软雅黑", Arial, sans-serif, "\5b8b\4f53"; 85 | } 86 | 87 | body { 88 | /* color:#fff; */ 89 | line-height: 1; 90 | font-size: 14px; 91 | min-width: 320px; 92 | background: #fff; 93 | } 94 | 95 | article, 96 | aside, 97 | details, 98 | figcaption, 99 | figure, 100 | footer, 101 | header, 102 | hgroup, 103 | menu, 104 | nav, 105 | section { 106 | display: block; 107 | } 108 | 109 | nav ul { 110 | list-style: none; 111 | } 112 | 113 | blockquote, 114 | q { 115 | quotes: none; 116 | } 117 | 118 | blockquote:before, 119 | blockquote:after, 120 | q:before, 121 | q:after { 122 | content: ''; 123 | content: none; 124 | } 125 | 126 | a { 127 | margin: 0; 128 | padding: 0; 129 | color: #fff; 130 | font-size: 100%; 131 | text-decoration: none; 132 | vertical-align: middle; 133 | background: transparent; 134 | } 135 | 136 | /* change colours to suit your needs */ 137 | ins { 138 | background-color: #ff9; 139 | color: #000; 140 | text-decoration: none; 141 | } 142 | 143 | /* change colours to suit your needs */ 144 | mark { 145 | background-color: #ff9; 146 | color: #000; 147 | font-style: italic; 148 | font-weight: bold; 149 | } 150 | 151 | del { 152 | text-decoration: line-through; 153 | } 154 | 155 | abbr[title], 156 | dfn[title] { 157 | border-bottom: 1px dotted; 158 | cursor: help; 159 | } 160 | 161 | table { 162 | width: 100%; 163 | border-collapse: collapse; 164 | border-spacing: 0; 165 | } 166 | 167 | /* change border colour to suit your needs */ 168 | hr { 169 | display: block; 170 | height: 1px; 171 | border: 0; 172 | border-top: 1px solid #cccccc; 173 | margin: 1em 0; 174 | padding: 0; 175 | } 176 | 177 | /* 178 | input, 179 | select { 180 | width: 100%; 181 | box-sizing: border-box; 182 | vertical-align: middle; 183 | background: inherit !important; 184 | } 185 | 186 | .el-select-dropdown { 187 | background: inherit !important; 188 | } 189 | 190 | input, 191 | button { 192 | color: #fff; 193 | border: none; 194 | display: block; 195 | font-size: 15px; 196 | line-height: 19px; 197 | padding: 12px 10px; 198 | border-radius: 6px; 199 | background: inherit; 200 | -webkit-appearance: none; 201 | } */ 202 | 203 | ul { 204 | background: inherit !important; 205 | } 206 | 207 | .clearfix { 208 | *zoom: 1; 209 | } 210 | 211 | .clearfix:after { 212 | display: block; 213 | content: "\200B"; 214 | clear: both; 215 | height: 0; 216 | } 217 | 218 | .float-left { 219 | float: left !important; 220 | } 221 | 222 | .float-right { 223 | float: right !important; 224 | } 225 | 226 | /* 修改input p */ 227 | input:-moz-placeholder { 228 | color: #999; 229 | } 230 | 231 | input::-moz-placeholder { 232 | color: #999; 233 | } 234 | 235 | input:-ms-input-placeholder { 236 | color: #999; 237 | } 238 | 239 | input::-webkit-input-placeholder { 240 | color: #999; 241 | } 242 | 243 | input, 244 | textarea, 245 | select, 246 | button, 247 | a:focus { 248 | outline: none; 249 | } 250 | 251 | 252 | .el-pagination.is-background .el-pager li:not(.disabled).active { 253 | background: rgba(246, 246, 246, 1); 254 | color: #989898; 255 | } 256 | 257 | .el-pagination.is-background .btn-next, 258 | .el-pagination.is-background .btn-prev, 259 | .el-pagination.is-background .el-pager li { 260 | margin: 0; 261 | background-color: rgba(255, 255, 255, 1); 262 | color: #666666; 263 | min-width: 40px; 264 | height: 40px; 265 | line-height: 40px; 266 | text-align: center; 267 | border: 1px solid #e6e6e6; 268 | border-left: none; 269 | border-radius: 0; 270 | font-size: 15px; 271 | font-weight: 400; 272 | } 273 | 274 | .el-pagination { 275 | text-align: right; 276 | margin-top: 39px; 277 | } 278 | 279 | .el-dialog__header, 280 | .el-dialog__body, 281 | .el-dialog__footer { 282 | text-align: center 283 | } 284 | 285 | .black { 286 | color: #bbb !important 287 | } 288 | 289 | .el-pagination.is-background .btn-prev { 290 | border-left: 1px solid #e6e6e6; 291 | } 292 | 293 | .el-pagination .btn-prev .el-icon { 294 | font-size: 15px; 295 | margin-top: 2px; 296 | } 297 | 298 | .el-pagination .btn-next .el-icon { 299 | font-size: 15px; 300 | margin-top: 2px; 301 | 302 | } 303 | 304 | .el-pagination button, 305 | .el-pagination span:not([class*=suffix]) { 306 | color: #989898; 307 | height: 40px; 308 | line-height: 40px; 309 | font-size: 15px; 310 | margin-left: 12px; 311 | } 312 | 313 | .cursor { 314 | cursor: pointer; 315 | } 316 | -------------------------------------------------------------------------------- /src/components/dropdown.vue: -------------------------------------------------------------------------------- 1 | 29 | 30 | 125 | 126 | -------------------------------------------------------------------------------- /src/modules/block/blocklist.vue: -------------------------------------------------------------------------------- 1 | 43 | 137 | -------------------------------------------------------------------------------- /static/icon/demo.css: -------------------------------------------------------------------------------- 1 | *{margin: 0;padding: 0;list-style: none;} 2 | /* 3 | KISSY CSS Reset 4 | 理念:1. reset 的目的不是清除浏览器的默认样式,这仅是部分工作。清除和重置是紧密不可分的。 5 | 2. reset 的目的不是让默认样式在所有浏览器下一致,而是减少默认样式有可能带来的问题。 6 | 3. reset 期望提供一套普适通用的基础样式。但没有银弹,推荐根据具体需求,裁剪和修改后再使用。 7 | 特色:1. 适应中文;2. 基于最新主流浏览器。 8 | 维护:玉伯, 正淳 9 | */ 10 | 11 | /** 清除内外边距 **/ 12 | body, h1, h2, h3, h4, h5, h6, hr, p, blockquote, /* structural elements 结构元素 */ 13 | dl, dt, dd, ul, ol, li, /* list elements 列表元素 */ 14 | pre, /* text formatting elements 文本格式元素 */ 15 | form, fieldset, legend, button, input, textarea, /* form elements 表单元素 */ 16 | th, td /* table elements 表格元素 */ { 17 | margin: 0; 18 | padding: 0; 19 | } 20 | 21 | /** 设置默认字体 **/ 22 | body, 23 | button, input, select, textarea /* for ie */ { 24 | font: 12px/1.5 tahoma, arial, \5b8b\4f53, sans-serif; 25 | } 26 | h1, h2, h3, h4, h5, h6 { font-size: 100%; } 27 | address, cite, dfn, em, var { font-style: normal; } /* 将斜体扶正 */ 28 | code, kbd, pre, samp { font-family: courier new, courier, monospace; } /* 统一等宽字体 */ 29 | small { font-size: 12px; } /* 小于 12px 的中文很难阅读,让 small 正常化 */ 30 | 31 | /** 重置列表元素 **/ 32 | ul, ol { list-style: none; } 33 | 34 | /** 重置文本格式元素 **/ 35 | a { text-decoration: none; } 36 | a:hover { text-decoration: underline; } 37 | 38 | 39 | /** 重置表单元素 **/ 40 | legend { color: #000; } /* for ie6 */ 41 | fieldset, img { border: 0; } /* img 搭车:让链接里的 img 无边框 */ 42 | button, input, select, textarea { font-size: 100%; } /* 使得表单元素在 ie 下能继承字体大小 */ 43 | /* 注:optgroup 无法扶正 */ 44 | 45 | /** 重置表格元素 **/ 46 | table { border-collapse: collapse; border-spacing: 0; } 47 | 48 | /* 清除浮动 */ 49 | .ks-clear:after, .clear:after { 50 | content: '\20'; 51 | display: block; 52 | height: 0; 53 | clear: both; 54 | } 55 | .ks-clear, .clear { 56 | *zoom: 1; 57 | } 58 | 59 | .main { 60 | padding: 30px 100px; 61 | width: 960px; 62 | margin: 0 auto; 63 | } 64 | .main h1{font-size:36px; color:#333; text-align:left;margin-bottom:30px; border-bottom: 1px solid #eee;} 65 | 66 | .helps{margin-top:40px;} 67 | .helps pre{ 68 | padding:20px; 69 | margin:10px 0; 70 | border:solid 1px #e7e1cd; 71 | background-color: #fffdef; 72 | overflow: auto; 73 | } 74 | 75 | .icon_lists{ 76 | width: 100% !important; 77 | 78 | } 79 | 80 | .icon_lists li{ 81 | float:left; 82 | width: 100px; 83 | height:180px; 84 | text-align: center; 85 | list-style: none !important; 86 | } 87 | .icon_lists .icon{ 88 | font-size: 42px; 89 | line-height: 100px; 90 | margin: 10px 0; 91 | color:#333; 92 | -webkit-transition: font-size 0.25s ease-out 0s; 93 | -moz-transition: font-size 0.25s ease-out 0s; 94 | transition: font-size 0.25s ease-out 0s; 95 | 96 | } 97 | .icon_lists .icon:hover{ 98 | font-size: 100px; 99 | } 100 | 101 | 102 | 103 | .markdown { 104 | color: #666; 105 | font-size: 14px; 106 | line-height: 1.8; 107 | } 108 | 109 | .highlight { 110 | line-height: 1.5; 111 | } 112 | 113 | .markdown img { 114 | vertical-align: middle; 115 | max-width: 100%; 116 | } 117 | 118 | .markdown h1 { 119 | color: #404040; 120 | font-weight: 500; 121 | line-height: 40px; 122 | margin-bottom: 24px; 123 | } 124 | 125 | .markdown h2, 126 | .markdown h3, 127 | .markdown h4, 128 | .markdown h5, 129 | .markdown h6 { 130 | color: #404040; 131 | margin: 1.6em 0 0.6em 0; 132 | font-weight: 500; 133 | clear: both; 134 | } 135 | 136 | .markdown h1 { 137 | font-size: 28px; 138 | } 139 | 140 | .markdown h2 { 141 | font-size: 22px; 142 | } 143 | 144 | .markdown h3 { 145 | font-size: 16px; 146 | } 147 | 148 | .markdown h4 { 149 | font-size: 14px; 150 | } 151 | 152 | .markdown h5 { 153 | font-size: 12px; 154 | } 155 | 156 | .markdown h6 { 157 | font-size: 12px; 158 | } 159 | 160 | .markdown hr { 161 | height: 1px; 162 | border: 0; 163 | background: #e9e9e9; 164 | margin: 16px 0; 165 | clear: both; 166 | } 167 | 168 | .markdown p, 169 | .markdown pre { 170 | margin: 1em 0; 171 | } 172 | 173 | .markdown > p, 174 | .markdown > blockquote, 175 | .markdown > .highlight, 176 | .markdown > ol, 177 | .markdown > ul { 178 | width: 80%; 179 | } 180 | 181 | .markdown ul > li { 182 | list-style: circle; 183 | } 184 | 185 | .markdown > ul li, 186 | .markdown blockquote ul > li { 187 | margin-left: 20px; 188 | padding-left: 4px; 189 | } 190 | 191 | .markdown > ul li p, 192 | .markdown > ol li p { 193 | margin: 0.6em 0; 194 | } 195 | 196 | .markdown ol > li { 197 | list-style: decimal; 198 | } 199 | 200 | .markdown > ol li, 201 | .markdown blockquote ol > li { 202 | margin-left: 20px; 203 | padding-left: 4px; 204 | } 205 | 206 | .markdown code { 207 | margin: 0 3px; 208 | padding: 0 5px; 209 | background: #eee; 210 | border-radius: 3px; 211 | } 212 | 213 | .markdown pre { 214 | border-radius: 6px; 215 | background: #f7f7f7; 216 | padding: 20px; 217 | } 218 | 219 | .markdown pre code { 220 | border: none; 221 | background: #f7f7f7; 222 | margin: 0; 223 | } 224 | 225 | .markdown strong, 226 | .markdown b { 227 | font-weight: 600; 228 | } 229 | 230 | .markdown > table { 231 | border-collapse: collapse; 232 | border-spacing: 0px; 233 | empty-cells: show; 234 | border: 1px solid #e9e9e9; 235 | width: 95%; 236 | margin-bottom: 24px; 237 | } 238 | 239 | .markdown > table th { 240 | white-space: nowrap; 241 | color: #333; 242 | font-weight: 600; 243 | 244 | } 245 | 246 | .markdown > table th, 247 | .markdown > table td { 248 | border: 1px solid #e9e9e9; 249 | padding: 8px 16px; 250 | text-align: left; 251 | } 252 | 253 | .markdown > table th { 254 | background: #F7F7F7; 255 | } 256 | 257 | .markdown blockquote { 258 | font-size: 90%; 259 | color: #999; 260 | border-left: 4px solid #e9e9e9; 261 | padding-left: 0.8em; 262 | margin: 1em 0; 263 | font-style: italic; 264 | } 265 | 266 | .markdown blockquote p { 267 | margin: 0; 268 | } 269 | 270 | .markdown .anchor { 271 | opacity: 0; 272 | transition: opacity 0.3s ease; 273 | margin-left: 8px; 274 | } 275 | 276 | .markdown .waiting { 277 | color: #ccc; 278 | } 279 | 280 | .markdown h1:hover .anchor, 281 | .markdown h2:hover .anchor, 282 | .markdown h3:hover .anchor, 283 | .markdown h4:hover .anchor, 284 | .markdown h5:hover .anchor, 285 | .markdown h6:hover .anchor { 286 | opacity: 1; 287 | display: inline-block; 288 | } 289 | 290 | .markdown > br, 291 | .markdown > p > br { 292 | clear: both; 293 | } 294 | 295 | 296 | .hljs { 297 | display: block; 298 | background: white; 299 | padding: 0.5em; 300 | color: #333333; 301 | overflow-x: auto; 302 | } 303 | 304 | .hljs-comment, 305 | .hljs-meta { 306 | color: #969896; 307 | } 308 | 309 | .hljs-string, 310 | .hljs-variable, 311 | .hljs-template-variable, 312 | .hljs-strong, 313 | .hljs-emphasis, 314 | .hljs-quote { 315 | color: #df5000; 316 | } 317 | 318 | .hljs-keyword, 319 | .hljs-selector-tag, 320 | .hljs-type { 321 | color: #a71d5d; 322 | } 323 | 324 | .hljs-literal, 325 | .hljs-symbol, 326 | .hljs-bullet, 327 | .hljs-attribute { 328 | color: #0086b3; 329 | } 330 | 331 | .hljs-section, 332 | .hljs-name { 333 | color: #63a35c; 334 | } 335 | 336 | .hljs-tag { 337 | color: #333333; 338 | } 339 | 340 | .hljs-title, 341 | .hljs-attr, 342 | .hljs-selector-id, 343 | .hljs-selector-class, 344 | .hljs-selector-attr, 345 | .hljs-selector-pseudo { 346 | color: #795da3; 347 | } 348 | 349 | .hljs-addition { 350 | color: #55a532; 351 | background-color: #eaffea; 352 | } 353 | 354 | .hljs-deletion { 355 | color: #bd2c00; 356 | background-color: #ffecec; 357 | } 358 | 359 | .hljs-link { 360 | text-decoration: underline; 361 | } 362 | 363 | pre{ 364 | background: #fff; 365 | } 366 | 367 | 368 | 369 | 370 | 371 | -------------------------------------------------------------------------------- /src/components/foot.vue: -------------------------------------------------------------------------------- 1 | 73 | 151 | 293 | -------------------------------------------------------------------------------- /src/modules/address/address.vue: -------------------------------------------------------------------------------- 1 | 77 | 183 | -------------------------------------------------------------------------------- /static/icon/iconfont.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | 8 | Created by iconfont 9 | 10 | 11 | 12 | 13 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /src/modules/hash/hash.vue: -------------------------------------------------------------------------------- 1 | 119 | 192 | -------------------------------------------------------------------------------- /src/style/media.less: -------------------------------------------------------------------------------- 1 | @media (min-width: 1390px) and (max-width: 1500px) { 2 | .banner { 3 | height: 295px; 4 | width: 100%; 5 | 6 | .content-box { 7 | width: 1000px; 8 | height: 295px; 9 | 10 | .content { 11 | height: 295px; 12 | width: 1000px; 13 | 14 | .logo { 15 | margin-top: 25px; 16 | width: 110px; 17 | height: 48px; 18 | 19 | img { 20 | width: 110px; 21 | height: 48px; 22 | } 23 | } 24 | 25 | .language { 26 | width: 75px; 27 | height: 23px; 28 | margin-top: 55px; 29 | border-radius: 3px; 30 | font-size: 10px; 31 | 32 | .icon { 33 | height: 9px; 34 | width: 12px; 35 | margin-left: 3px; 36 | } 37 | } 38 | 39 | .search-box { 40 | margin: 63px 0 0 110px; 41 | width: 781px; 42 | height: 50px; 43 | border-radius: 30px; 44 | 45 | input { 46 | width: 687px; 47 | padding-left: 30px; 48 | margin-left: 5px; 49 | font-size: 14px; 50 | } 51 | 52 | input:focus { 53 | outline: none; 54 | } 55 | 56 | .btn { 57 | width: 68px; 58 | height: 50px; 59 | margin-left: 2px; 60 | border-radius: 0 25px 25px 0; 61 | background: rgba(56, 141, 244, 1); 62 | 63 | img { 64 | height: 16px; 65 | width: 16px; 66 | } 67 | } 68 | } 69 | 70 | .banner-bottom { 71 | width: 1000px; 72 | height: 32px; 73 | margin-top: 77px; 74 | background: white; 75 | } 76 | } 77 | } 78 | } 79 | 80 | .content-box-total { 81 | position: absolute; 82 | height: 224px; 83 | top: 422px; 84 | 85 | .count { 86 | display: flex; 87 | width: 1000px; 88 | height: 224px; 89 | 90 | .num { 91 | div { 92 | margin-top: 13px; 93 | font-size: 27px; 94 | font-weight: 500; 95 | color: rgba(51, 51, 51, 1); 96 | line-height: 37px; 97 | 98 | span { 99 | font-size: 27px; 100 | font-weight: 500; 101 | color: rgba(51, 51, 51, 1); 102 | line-height: 37px; 103 | } 104 | } 105 | 106 | span { 107 | height: 17px; 108 | font-size: 15px; 109 | font-weight: 400; 110 | color: rgba(152, 152, 152, 1); 111 | line-height: 17px; 112 | } 113 | } 114 | } 115 | } 116 | 117 | .body { 118 | // height: 1250px; 119 | // height: 900px; 120 | width: 100%; 121 | 122 | .content-box { 123 | width: 1000px; // height: 1250px; 124 | 125 | .chart { 126 | width: 1000px; 127 | margin: 100px auto 0; 128 | display: flex; 129 | justify-content: space-between; 130 | 131 | .child-chart { 132 | // height: 410px; 133 | width: 500px; 134 | background: white; 135 | } 136 | } 137 | } 138 | 139 | .block_trade { 140 | width: 1000px; 141 | margin: 20px auto 0; 142 | height: 625px; 143 | 144 | .title { 145 | height: 26px; 146 | font-size: 18px; 147 | 148 | span { 149 | font-size: 17px; 150 | } 151 | 152 | .more { 153 | font-size: 12px; 154 | color: rgba(56, 141, 244, 1); 155 | margin-right: 18px; 156 | cursor: pointer; 157 | } 158 | } 159 | 160 | .block { 161 | padding: 27px 0 0 17px; 162 | 163 | .block-content { 164 | height: 600px; 165 | } 166 | 167 | .block-piece { 168 | padding-top: 15px; 169 | height: 77px; 170 | border-bottom: 1px solid rgba(224, 224, 224, 1); 171 | display: flex; 172 | 173 | .block-id { 174 | height: 60px; 175 | width: 112px; 176 | font-size: 14px; 177 | } 178 | 179 | .block-detail { 180 | margin-left: 15px; 181 | font-size: 14px; 182 | height: 60px; 183 | } 184 | } 185 | } 186 | 187 | .trade { 188 | margin-left: 18px; 189 | 190 | .trade-info { 191 | span { 192 | margin-left: 4px; 193 | } 194 | 195 | .cut { 196 | height: 17px; 197 | width: 20px; 198 | } 199 | } 200 | 201 | .trade-time { 202 | font-size: 14px; 203 | margin-right: 19px; 204 | } 205 | } 206 | } 207 | } 208 | } 209 | 210 | @media (max-width: 1389px) { 211 | .content-box-total { 212 | position: absolute; 213 | height: 414px; 214 | top: 522px; 215 | 216 | .count { 217 | display: flex; 218 | height: 424px; 219 | 220 | .num { 221 | // width: 200px; 222 | div { 223 | margin-top: 13px; 224 | font-size: 27px; 225 | font-weight: 500; 226 | color: rgba(51, 51, 51, 1); 227 | line-height: 37px; 228 | 229 | span { 230 | font-size: 27px; 231 | font-weight: 500; 232 | color: rgba(51, 51, 51, 1); 233 | line-height: 37px; 234 | } 235 | } 236 | 237 | span { 238 | height: 17px; 239 | font-size: 15px; 240 | font-weight: 400; 241 | color: rgba(152, 152, 152, 1); 242 | line-height: 17px; 243 | } 244 | } 245 | } 246 | } 247 | 248 | .banner { 249 | height: 251px; 250 | width: 100%; 251 | 252 | .content-box { 253 | width: 852px; 254 | margin: 0 auto; 255 | height: 251px; 256 | 257 | // .content { 258 | // height: 251px; 259 | // margin: 0 auto; 260 | // width: 852px; 261 | 262 | // .logo { 263 | // margin-top: 21px; 264 | // width: 94px; 265 | // height: 41px; 266 | 267 | // img { 268 | // width: 94px; 269 | // height: 41px; 270 | // } 271 | // } 272 | 273 | // .language { 274 | // width: 64px; 275 | // height: 19px; 276 | // margin-top: 47px; 277 | // border-radius: 3px; 278 | // font-size: 12px; 279 | 280 | // .icon { 281 | // height: 7px; 282 | // width: 10px; 283 | // margin-left: 3px; 284 | // } 285 | // } 286 | 287 | // .search-box { 288 | // margin: 54px 0 0 94px; 289 | // width: 666px; 290 | // height: 43px; 291 | // border-radius: 21px; 292 | 293 | // input { 294 | // width: 586px; 295 | // padding-left: 21px; 296 | // margin-left: 4px; 297 | // font-size: 14px; 298 | // } 299 | 300 | // input:focus { 301 | // outline: none; 302 | // } 303 | 304 | // .btn { 305 | // width: 57px; 306 | // height: 43px; 307 | // margin-left: 2px; 308 | // border-radius: 0 21px 21px 0; 309 | 310 | // img { 311 | // height: 14px; 312 | // width: 14px; 313 | // } 314 | // } 315 | // } 316 | 317 | // .banner-bottom { 318 | // width: 852px; 319 | // height: 27px; 320 | // margin-top: 65px; 321 | // } 322 | // } 323 | } 324 | } 325 | 326 | .content-box-total { 327 | position: absolute; 328 | height: 174px; 329 | top: 440px; 330 | 331 | .count { 332 | height: 174px; 333 | width: 852px; 334 | margin: auto; 335 | 336 | .num { 337 | width: 170px; 338 | 339 | img { 340 | height: 45px; 341 | width: 45px; 342 | margin: 30px 0 15px; 343 | } 344 | 345 | div { 346 | margin-top: 11px; 347 | font-size: 22px; 348 | line-height: 32px; 349 | 350 | span { 351 | font-size: 23px; 352 | line-height: 32px; 353 | } 354 | } 355 | 356 | span { 357 | height: 14px; 358 | font-size: 14px; 359 | line-height: 15px; 360 | } 361 | } 362 | } 363 | } 364 | 365 | .body { 366 | width: 100%; 367 | 368 | .content-box { 369 | width: 852px; 370 | // height: 760px; 371 | // height: 1140px; 372 | 373 | .chart { 374 | width: 852px; // height: 570px; 375 | margin: 70px auto 0; 376 | 377 | .child-chart { 378 | width: 419px; 379 | background: white; 380 | } 381 | } 382 | } 383 | 384 | .block_trade { 385 | width: 853px; 386 | margin: 17px auto 0; 387 | height: 532px; 388 | 389 | .title { 390 | height: 18px; 391 | font-size: 14px; 392 | 393 | span { 394 | font-size: 16px; 395 | color: #333; 396 | } 397 | 398 | .more { 399 | font-size: 12px; 400 | margin-right: 18px; 401 | } 402 | } 403 | 404 | .block { 405 | width: 404px; 406 | padding: 23px 0 0 14px; 407 | 408 | .block-content { 409 | height: 511px; // margin-top: 10px; 410 | } 411 | 412 | .block-piece { 413 | padding-top: 13px; 414 | height: 65px; 415 | 416 | .block-id { 417 | height: 72px; 418 | width: 135px; 419 | font-size: 14px; 420 | } 421 | 422 | .block-detail { 423 | margin-left: 14px; 424 | font-size: 12px; 425 | height: 51px; 426 | } 427 | } 428 | } 429 | 430 | .trade { 431 | margin-left: 12px; 432 | 433 | .trade-info { 434 | font-size: 12px; 435 | 436 | span { 437 | margin-left: 4px; 438 | } 439 | 440 | .trade-address { 441 | margin-top: 4px; 442 | } 443 | 444 | .cut { 445 | height: 14px; 446 | width: 16px; 447 | } 448 | 449 | .trade-id { 450 | margin-top: 4px; 451 | 452 | span { 453 | width: 129px; 454 | } 455 | } 456 | 457 | .trade-num { 458 | margin-top: 4px; 459 | } 460 | } 461 | 462 | .trade-time { 463 | font-size: 10px; 464 | margin-right: 15px; 465 | } 466 | } 467 | } 468 | } 469 | } 470 | -------------------------------------------------------------------------------- /static/icon/iconfont.js: -------------------------------------------------------------------------------- 1 | !function(a){var t,l='',e=(t=document.getElementsByTagName("script"))[t.length-1].getAttribute("data-injectcss");if(e&&!a.__iconfont__svg__cssinject__){a.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(t){console&&console.log(t)}}!function(t){if(document.addEventListener)if(~["complete","loaded","interactive"].indexOf(document.readyState))setTimeout(t,0);else{var e=function(){document.removeEventListener("DOMContentLoaded",e,!1),t()};document.addEventListener("DOMContentLoaded",e,!1)}else document.attachEvent&&(c=t,o=a.document,i=!1,n=function(){i||(i=!0,c())},(l=function(){try{o.documentElement.doScroll("left")}catch(t){return void setTimeout(l,50)}n()})(),o.onreadystatechange=function(){"complete"==o.readyState&&(o.onreadystatechange=null,n())});var c,o,i,n,l}(function(){var t,e,c,o,i,n;(t=document.createElement("div")).innerHTML=l,l=null,(e=t.getElementsByTagName("svg")[0])&&(e.setAttribute("aria-hidden","true"),e.style.position="absolute",e.style.width=0,e.style.height=0,e.style.overflow="hidden",c=e,(o=document.body).firstChild?(i=c,(n=o.firstChild).parentNode.insertBefore(i,n)):o.appendChild(c))})}(window); -------------------------------------------------------------------------------- /src/modules/hash/hashlist.vue: -------------------------------------------------------------------------------- 1 | 111 | 234 | -------------------------------------------------------------------------------- /src/components/headers.vue: -------------------------------------------------------------------------------- 1 | 133 | 224 | 543 | -------------------------------------------------------------------------------- /src/modules/block/block.vue: -------------------------------------------------------------------------------- 1 | 175 | 332 | -------------------------------------------------------------------------------- /src/components/footer.vue: -------------------------------------------------------------------------------- 1 | 172 | // 284 | 872 | --------------------------------------------------------------------------------