├── 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 | 2 | 3 | 4 | 5 | 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 | 2 | 3 | 4 | 5 | 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 | 2 | 3 | 4 | 5 | 6 | 7 | 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 | 2 | 3 | 4 | 5 | {{$t('faucet.title')}} 6 | {{$t('faucet.des')}} 7 | 8 | {{$t('faucet.register')}} 9 | {{$t('faucet.get')}}100 COCOS 10 | 11 | 12 | 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 | 2 | 3 | 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 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 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 |