├── .browserslistrc ├── .eslintrc.js ├── .gitignore ├── .travis.yml ├── README.md ├── babel.config.js ├── doc └── development.md ├── jsconfig.json ├── package-lock.json ├── package.json ├── postcss.config.js ├── public ├── about.jpg ├── about_activity.jpg ├── about_badge.jpg ├── about_meetup.png ├── about_portal.jpg ├── about_sign_in.jpg ├── about_wx.jpg ├── cryptomeetup.jpg ├── css │ ├── materialdesignicons.css │ ├── materialdesignicons.css.map │ ├── materialdesignicons.min.css │ └── materialdesignicons.min.css.map ├── earth.jpg ├── favicon.ico ├── fonts │ ├── materialdesignicons-webfont.eot │ ├── materialdesignicons-webfont.ttf │ ├── materialdesignicons-webfont.woff │ └── materialdesignicons-webfont.woff2 ├── index.html ├── matataki-white.svg ├── scss │ ├── _animated.scss │ ├── _core.scss │ ├── _extras.scss │ ├── _functions.scss │ ├── _icons.scss │ ├── _path.scss │ ├── _variables.scss │ └── materialdesignicons.scss ├── starfield.png └── weather.jpg ├── src ├── App.vue ├── Global.js ├── api │ ├── index.js │ └── login.js ├── assets │ ├── CMU_Token_Logo.png │ ├── badge_checkin_1.svg │ ├── icons │ │ ├── close.png │ │ ├── load.png │ │ └── my-location.png │ └── logo.png ├── components │ ├── GlobalLayer.vue │ ├── GlobalProgress.vue │ ├── GlobalSpinner.vue │ ├── Globe.vue │ ├── InviteModal.vue │ ├── Loading.vue │ ├── MapPopup.vue │ ├── MeetupBox.vue │ ├── RedeemCodeCopyDialog.vue │ ├── SponsorPaymentModal.vue │ └── landmark │ │ ├── LocationPopup.vue │ │ ├── MapMarkerLocation.vue │ │ ├── MapMarkerMeetup.vue │ │ ├── createLocation.vue │ │ ├── enlargeImg.vue │ │ └── myPortal.vue ├── config │ ├── index.js │ ├── modules.js │ └── network.js ├── global.scss ├── i18n │ ├── Country_zh_tw.json │ ├── about_en.html │ ├── about_en.md │ ├── about_jp.html │ ├── about_jp.md │ ├── about_ko.html │ ├── about_ru.html │ ├── about_ru.md │ ├── about_tw.md │ ├── about_zh.html │ ├── about_zh.md │ ├── about_zh_tw.html │ ├── about_zh_tw.md │ ├── en.js │ ├── index.js │ ├── jp.js │ ├── ko.js │ ├── ru.js │ ├── zh.js │ └── zh_tw.js ├── libs │ └── SimpleWallet │ │ ├── index.d.ts │ │ ├── index.js │ │ └── interfaces.d.ts ├── main.js ├── router.js ├── store │ ├── index.js │ └── ui.js ├── theme │ └── icon.scss ├── util │ ├── ajax.js │ ├── api.js │ ├── apis │ │ ├── eos.js │ │ └── index.js │ ├── cookies.js │ ├── countryLatLon.json │ ├── countryPoints.json │ ├── geo.js │ ├── land.js │ ├── priceFormatter.js │ ├── prototypeExtend.js │ └── storeUtil.js └── views │ ├── About.vue │ ├── Friends.vue │ ├── GlobeView.vue │ ├── MapView.vue │ ├── Notifications.vue │ ├── Oauth.vue │ ├── Subscribe.vue │ ├── Token.vue │ ├── UserProfile.vue │ ├── customgeo.json │ └── location.js └── vue.config.js /.browserslistrc: -------------------------------------------------------------------------------- 1 | > 1% 2 | last 2 versions 3 | not ie <= 8 4 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | env: { 4 | node: true, 5 | }, 6 | extends: [ 7 | 'plugin:vue/essential', 8 | '@vue/airbnb', 9 | ], 10 | rules: { 11 | 'no-console': 'off', 12 | 'no-debugger': 'off', 13 | 'no-mixed-operators': 'off', 14 | 'no-plusplus': 'off', 15 | 'no-param-reassign': 'off', 16 | 'class-methods-use-this': 'off', 17 | 'max-len': 'off', 18 | 'no-alert': 'off', 19 | 'comma-dangle': 'off', 20 | 'no-unused-expressions': 'off', 21 | semi: 'off', 22 | 'arrow-parens': 'off', 23 | 'arrow-spacing': 'off', 24 | 'no-unused-vars': 'off', 25 | 'import/no-extraneous-dependencies': 'off', 26 | 'space-before-function-paren': 'off', 27 | 'no-trailing-spaces': 'off', 28 | 'linebreak-style': 'off', 29 | 'consistent-return': 'off', 30 | 'key-spacing': 'off', 31 | 'no-irregular-whitespace': 'off', 32 | 'object-curly-spacing': 'off', 33 | 'object-curly-newline': 'off', 34 | 'import/first': 'off', 35 | 'import/extensions': 'off', 36 | 'prefer-destructuring': 'off', 37 | 'radix': 'off', 38 | 'prefer-template': 'off', 39 | }, 40 | parserOptions: { 41 | parser: 'babel-eslint', 42 | }, 43 | }; -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /dist 4 | 5 | # local env files 6 | .env.local 7 | .env.*.local 8 | 9 | # Log files 10 | npm-debug.log* 11 | yarn-debug.log* 12 | yarn-error.log* 13 | 14 | # Editor directories and files 15 | .idea 16 | .vscode 17 | *.suo 18 | *.ntvs* 19 | *.njsproj 20 | *.sln 21 | *.sw* 22 | yarn.lock 23 | 24 | \.vs/ 25 | 26 | .env* -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - "8" 4 | cache: npm 5 | dist: trusty 6 | # Build Lifecycle 7 | install: 8 | - npm install 9 | 10 | before_script: 11 | - npm run lint 12 | 13 | script: 14 | - npm run build -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # cryptomeetup-portal 2 | 3 | Welcome to Cryptomeetup! 4 | 5 | # https://cryptomeetup.io/#/ 6 | 7 | Cryptomeetup is a decentralized events platform powered by cutting-edge blockchain technology, which integrates decentralized games, blockchain events, and blockchain ticketing. It provides user generated content (UGC) features as a whole. Cryptomeetup is an open source project, and it opens to all the developers in the community and motivates by token economic. 8 | 9 | Cryptomeetups currently provides globe module and map module, and integrates gameplay and openness. The future growing direction will depends on the community consensus. 10 | 11 | Cryptomeetup is currently divided into the globe module and the map module: 12 | 13 | In the Globe Module, we devided the land into serveral levels, such as the world, continents, countries, cities, and landmarks. And these game assets are Non-Fungible Tokens, which are unique and transparent on the blockchain. Cryptomeetup will provides different gameplay with variety levels of assets. 14 | 15 | In the map module, users can upload their own landmarks, which are be recorded on the blockchain and turned into user's own assets. Cryptomeetup offers variety of gameplay options, giving users the greatest freedom to create; Users can freely buy and sell their own landmarks, define their attributes, hold events on own land for revenue, etc. 16 | 17 | ## Blockchain Events 18 | 19 | Users can buy and sell land token (such as national token) to become regional manager of the area and have the right to manage activities in the area. 20 | 21 | ## Chech-in at blockchain events 22 | 23 | Cryptomeetup launched its check in function at the [first DApp Developer Conference in Beijing](https://www.bagevent.com/event/1871915?from=singlemessage&isappinstalled=0) on 8 ~ 9 November 2018. People who attended the conference could use EOS accounts with chrome + scatter plugin, or EOS mobile wallet such as Tokenpocket or Meet.one or Math wallet, to win the genesis badge of cryptomeetup by checking in at specific time and region. Players who had this badge can apply for free tickets of 2nd Dapp Developer Conference! 24 | 25 | ## UGC - to upload your own landmarks 26 | 27 | User-generated content is the most important part of the blockchain applications. Cryptomeetup allows players to use mobile wallets such as tokenpocket to create landmarks in any unclaimed locations, complete with descriptions and images. Verified landmarks will be uploaded to the EOS blockchain as an digital non-frigiable asset which is tradable and can be reuse on other LBS blockchain games. 28 | 29 | In order to prevent users from uploading spam, we allow core cryptomeetup players to review these UGC content and will be completely open to the whole commuinty in the future. 30 | 31 | ## Crypto Gaming Part 32 | 33 | The project is still in the development and iteration. 3rd round of the game testing will open at 12:00pm UTC, on 14 Dec 2018. 34 | 35 | ### Globe Module 36 | 37 | The third round of game tesing will be open to 249 countries. The starting price of each country was 0.1 EOS, and each purchase made the country price increase by 35%. The amount of the next purchase will be returned to the previous player's principal and the increased amount will be distributed as follows: 38 | 39 | - 60% previous player in EOS 40 | - 27% dividend pool in CMU 41 | - 3% inviter (if not, enter the dividend pool) in CMU 42 | - 10% prize pool in CMU 43 | 44 | ### Map Module 45 | 46 | Players will be able to create their own landmarks through cryptomeetup.io website, which will automatically get location parameters and pricing it. To customize parameters, you can go to Github ([https://github.com/crypto-meetup-dev/portal-list](https://github.com/crypto-meetup-dev/portal-list)) and edit the configuration file. 47 | 48 | The next player's purchase the landmark will firstly return the original player's principal.The increased amount will be distributed according to the following proportions: 49 | - 5% dividend pool in CMU 50 | - x% inviter in CMU 51 | - y% the creator in EOS 52 | - 95% - x% -y% previous player in EOS 53 | 54 | *If the inviter does not exist, the inviter part will enter the participating pool.* 55 | Note: x% and y% are set by the creator of the landmark. 56 | 57 | **Explanation of the Dividend Pool** 58 | 59 | Users can stake CMU to receive cryptomeetup's devidends in real time. The dividends will be distributed according to the ratio of staked CMU. 60 | 61 | **Explanation of the Prize pool & Countdown Timer** 62 | 63 | The third round of gaming test increases the countdown function. It stars from 30 days. If every 1 EOS flows into the smart contract for the purchase of land, the countdown timer will increase by 1 minute. When the countdown timer reaches 0, the last player who purchases the land will win the total prize pool. 64 | 65 | ## CMU Token 66 | 67 | "CMU" is the Cryptomeetup platform's token. Token holders can share the profit of Cryptomeetup platform and participant in the community’s self-government by staking CMU token. Also, the CMU token is a utility token that players can use CMU as game assets. 68 | 69 | ## How to get CMU tokens 70 | 71 | 1. Purchase from Cryptomeetup.io website. 72 | 2. Participants in the gameplay and stake CMU to get the projects' devidends. 73 | 74 | *5% transation fee will be charged if you sell CMU token to the smart contract.* 75 | 76 | Official Website:[https://cryptomeetup.io](https://cryptomeetup.io) 77 | 78 | Telegram Group:[https://t.me/Cryptomeetup_Official](https://t.me/Cryptomeetup_Official) 79 | 80 | Discord Group: [https://discord.gg/Ws3ENJf](https://discord.gg/Ws3ENJf) 81 | 82 | Add WeChat ID: **"DAppsDev"**,and he will invite you to the cryptomeetup WeChat Group ! 83 | 84 | ## Development Documentation 85 | 86 | [Documentation](https://github.com/crypto-meetup-dev/cryptomeetup-portal/blob/master/doc/development.md) 87 | 88 | ## Project setup 89 | ``` 90 | npm install 91 | ``` 92 | 93 | ### Compiles and hot-reloads for development 94 | ``` 95 | npm run serve 96 | ``` 97 | 98 | ### Compiles and minifies for production 99 | ``` 100 | npm run build 101 | ``` 102 | 103 | ### Run your tests 104 | ``` 105 | npm run test 106 | ``` 107 | 108 | ### Lints and fixes files 109 | ``` 110 | npm run lint 111 | ``` 112 | -------------------------------------------------------------------------------- /babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: [ 3 | '@vue/app', 4 | ], 5 | }; 6 | -------------------------------------------------------------------------------- /doc/development.md: -------------------------------------------------------------------------------- 1 | # Documentation 2 | ## Development Environment 3 | **Due to security concerns, serveral parameteres and files will not be git commit to server. At this kind of circumstances, you need .env in order to run this instance.** -------------------------------------------------------------------------------- /jsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "baseUrl": "src/.", 4 | "experimentalDecorators": true, 5 | "paths": { 6 | "@/*": ["*"] 7 | } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "cryptomeetup-portal", 3 | "version": "0.1.0", 4 | "private": true, 5 | "scripts": { 6 | "serve": "vue-cli-service serve", 7 | "build": "vue-cli-service build && echo '/* /index.html 200' >> ./dist/_redirects", 8 | "test": "npm run lint", 9 | "lint": "vue-cli-service lint" 10 | }, 11 | "dependencies": { 12 | "@geo-maps/countries-coastline-10km": "^0.6.0", 13 | "@xkeshi/vue-qrcode": "^1.0.0", 14 | "axios": "^0.18.0", 15 | "buefy": "^0.7.0", 16 | "core-decorators": "^0.20.0", 17 | "d3-geo": "^1.11.1", 18 | "eosjs": "16.0.9", 19 | "eventemitter2": "^5.0.1", 20 | "geolib": "^2.0.24", 21 | "hammerjs": "^2.0.8", 22 | "i18n-iso-countries": "^3.7.8", 23 | "is-touch-device": "^1.0.1", 24 | "js-cookie": "^2.2.1", 25 | "js-sha256": "^0.9.0", 26 | "lodash": "^4.17.11", 27 | "lodash-decorators": "^6.0.0", 28 | "mapbox-gl": "^0.51.0-beta.2", 29 | "mapbox-gl-vue": "^1.9.0", 30 | "marked": "^0.5.1", 31 | "prejs": "^1.2.6", 32 | "scatterjs-core": "^2.3.3", 33 | "scatterjs-plugin-eosjs": "^1.3.9", 34 | "three": "^0.97.0", 35 | "v-offline": "^1.2.1", 36 | "vue": "^2.5.17", 37 | "vue-clipboard2": "^0.2.1", 38 | "vue-i18n": "^8.2.1", 39 | "vue-markdown": "^2.2.4", 40 | "vue-moment": "^4.0.0", 41 | "vue-router": "^3.0.1", 42 | "vue2-transitions": "^0.2.3", 43 | "vuex": "^3.0.1" 44 | }, 45 | "devDependencies": { 46 | "@vue/cli-plugin-babel": "^3.0.5", 47 | "@vue/cli-plugin-eslint": "^3.0.5", 48 | "@vue/cli-service": "^3.0.5", 49 | "@vue/eslint-config-airbnb": "^3.0.5", 50 | "babel-eslint": "^10.0.1", 51 | "node-sass": "^4.9.4", 52 | "raw-loader": "^0.5.1", 53 | "sass-loader": "^7.1.0", 54 | "url-loader": "^1.1.2", 55 | "vue-cli-plugin-webpack-bundle-analyzer": "^1.2.0", 56 | "vue-markdown-loader": "^2.4.1", 57 | "vue-template-compiler": "^2.5.17" 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | autoprefixer: {}, 4 | }, 5 | }; 6 | -------------------------------------------------------------------------------- /public/about.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crypto-meetup-dev/cryptomeetup-portal/08790ef81987110c2781070820174fc1915552a6/public/about.jpg -------------------------------------------------------------------------------- /public/about_activity.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crypto-meetup-dev/cryptomeetup-portal/08790ef81987110c2781070820174fc1915552a6/public/about_activity.jpg -------------------------------------------------------------------------------- /public/about_badge.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crypto-meetup-dev/cryptomeetup-portal/08790ef81987110c2781070820174fc1915552a6/public/about_badge.jpg -------------------------------------------------------------------------------- /public/about_meetup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crypto-meetup-dev/cryptomeetup-portal/08790ef81987110c2781070820174fc1915552a6/public/about_meetup.png -------------------------------------------------------------------------------- /public/about_portal.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crypto-meetup-dev/cryptomeetup-portal/08790ef81987110c2781070820174fc1915552a6/public/about_portal.jpg -------------------------------------------------------------------------------- /public/about_sign_in.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crypto-meetup-dev/cryptomeetup-portal/08790ef81987110c2781070820174fc1915552a6/public/about_sign_in.jpg -------------------------------------------------------------------------------- /public/about_wx.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crypto-meetup-dev/cryptomeetup-portal/08790ef81987110c2781070820174fc1915552a6/public/about_wx.jpg -------------------------------------------------------------------------------- /public/cryptomeetup.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crypto-meetup-dev/cryptomeetup-portal/08790ef81987110c2781070820174fc1915552a6/public/cryptomeetup.jpg -------------------------------------------------------------------------------- /public/earth.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crypto-meetup-dev/cryptomeetup-portal/08790ef81987110c2781070820174fc1915552a6/public/earth.jpg -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crypto-meetup-dev/cryptomeetup-portal/08790ef81987110c2781070820174fc1915552a6/public/favicon.ico -------------------------------------------------------------------------------- /public/fonts/materialdesignicons-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crypto-meetup-dev/cryptomeetup-portal/08790ef81987110c2781070820174fc1915552a6/public/fonts/materialdesignicons-webfont.eot -------------------------------------------------------------------------------- /public/fonts/materialdesignicons-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crypto-meetup-dev/cryptomeetup-portal/08790ef81987110c2781070820174fc1915552a6/public/fonts/materialdesignicons-webfont.ttf -------------------------------------------------------------------------------- /public/fonts/materialdesignicons-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crypto-meetup-dev/cryptomeetup-portal/08790ef81987110c2781070820174fc1915552a6/public/fonts/materialdesignicons-webfont.woff -------------------------------------------------------------------------------- /public/fonts/materialdesignicons-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crypto-meetup-dev/cryptomeetup-portal/08790ef81987110c2781070820174fc1915552a6/public/fonts/materialdesignicons-webfont.woff2 -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Crypto Meetup 9 | 11 | 13 | 144 | 145 | 146 | 147 |
148 |
149 |
150 |
151 |
152 |
153 |
154 |
155 |
156 |
157 |
158 |
159 |
Crypto Meetup is loading...
160 |
161 |
162 | 163 |
164 | 168 | 169 | 170 | -------------------------------------------------------------------------------- /public/scss/_animated.scss: -------------------------------------------------------------------------------- 1 | // From Font Awesome 2 | .#{$mdi-css-prefix}-spin:before { 3 | -webkit-animation: #{$mdi-css-prefix}-spin 2s infinite linear; 4 | animation: #{$mdi-css-prefix}-spin 2s infinite linear; 5 | } 6 | 7 | @-webkit-keyframes #{$mdi-css-prefix}-spin { 8 | 0% { 9 | -webkit-transform: rotate(0deg); 10 | transform: rotate(0deg); 11 | } 12 | 100% { 13 | -webkit-transform: rotate(359deg); 14 | transform: rotate(359deg); 15 | } 16 | } 17 | 18 | @keyframes #{$mdi-css-prefix}-spin { 19 | 0% { 20 | -webkit-transform: rotate(0deg); 21 | transform: rotate(0deg); 22 | } 23 | 100% { 24 | -webkit-transform: rotate(359deg); 25 | transform: rotate(359deg); 26 | } 27 | } -------------------------------------------------------------------------------- /public/scss/_core.scss: -------------------------------------------------------------------------------- 1 | .#{$mdi-css-prefix}:before, 2 | .#{$mdi-css-prefix}-set { 3 | display: inline-block; 4 | font: normal normal normal #{$mdi-font-size-base}/1 '#{$mdi-font-name}'; // shortening font declaration 5 | font-size: inherit; // can't have font-size inherit on line above, so need to override 6 | text-rendering: auto; // optimizelegibility throws things off #1094 7 | line-height: inherit; 8 | -webkit-font-smoothing: antialiased; 9 | -moz-osx-font-smoothing: grayscale; 10 | } -------------------------------------------------------------------------------- /public/scss/_extras.scss: -------------------------------------------------------------------------------- 1 | $mdi-sizes: 18 24 36 48 !default; 2 | @each $mdi-size in $mdi-sizes { 3 | .#{$mdi-css-prefix}-#{$mdi-size}px { 4 | &.#{$mdi-css-prefix}-set, 5 | &.#{$mdi-css-prefix}:before { 6 | font-size: $mdi-size * 1px; 7 | } 8 | } 9 | } 10 | 11 | .#{$mdi-css-prefix}-dark { 12 | &:before { 13 | color: rgba(0, 0, 0, 0.54); 14 | } 15 | &.#{$mdi-css-prefix}-inactive:before { 16 | color: rgba(0, 0, 0, 0.26); 17 | } 18 | } 19 | .#{$mdi-css-prefix}-light { 20 | &:before { 21 | color: rgba(255, 255, 255, 1); 22 | } 23 | &.#{$mdi-css-prefix}-inactive:before { 24 | color: rgba(255, 255, 255, 0.3); 25 | } 26 | } 27 | 28 | $mdi-degrees: 45 90 135 180 225 270 315 !default; 29 | @each $mdi-degree in $mdi-degrees { 30 | .#{$mdi-css-prefix}-rotate-#{$mdi-degree}{ 31 | &:before { 32 | -webkit-transform: rotate(#{$mdi-degree}deg); 33 | -ms-transform: rotate(#{$mdi-degree}deg); 34 | transform: rotate(#{$mdi-degree}deg); 35 | } 36 | /* 37 | // Not included in production 38 | &.#{$mdi-css-prefix}-flip-h:before { 39 | -webkit-transform: scaleX(-1) rotate(#{$mdi-degree}deg); 40 | transform: scaleX(-1) rotate(#{$mdi-degree}deg); 41 | filter: FlipH; 42 | -ms-filter: "FlipH"; 43 | } 44 | &.#{$mdi-css-prefix}-flip-v:before { 45 | -webkit-transform: scaleY(-1) rotate(#{$mdi-degree}deg); 46 | -ms-transform: rotate(#{$mdi-degree}deg); 47 | transform: scaleY(-1) rotate(#{$mdi-degree}deg); 48 | filter: FlipV; 49 | -ms-filter: "FlipV"; 50 | } 51 | */ 52 | } 53 | } 54 | .#{$mdi-css-prefix}-flip-h:before { 55 | -webkit-transform: scaleX(-1); 56 | transform: scaleX(-1); 57 | filter: FlipH; 58 | -ms-filter: "FlipH"; 59 | } 60 | .#{$mdi-css-prefix}-flip-v:before { 61 | -webkit-transform: scaleY(-1); 62 | transform: scaleY(-1); 63 | filter: FlipV; 64 | -ms-filter: "FlipV"; 65 | } -------------------------------------------------------------------------------- /public/scss/_functions.scss: -------------------------------------------------------------------------------- 1 | @function char($character-code) { 2 | @if function-exists("selector-append") { 3 | @return unquote("\"\\#{$character-code}\""); 4 | } 5 | 6 | @if "\\#{'x'}" == "\\x" { 7 | @return str-slice("\x", 1, 1) + $character-code; 8 | } 9 | @else { 10 | @return #{"\"\\"}#{$character-code + "\""}; 11 | } 12 | } 13 | 14 | @function mdi($name) { 15 | @if map-has-key($mdi-icons, $name) == false { 16 | @warn "Icon #{$name} not found."; 17 | @return ""; 18 | } 19 | @return char(map-get($mdi-icons, $name)); 20 | } -------------------------------------------------------------------------------- /public/scss/_icons.scss: -------------------------------------------------------------------------------- 1 | @each $key, $value in $mdi-icons { 2 | .#{$mdi-css-prefix}-#{$key}::before { 3 | content: char($value); 4 | } 5 | } 6 | 7 | .#{$mdi-css-prefix}-blank::before { 8 | content: "\F68C"; 9 | visibility: hidden; 10 | } -------------------------------------------------------------------------------- /public/scss/_path.scss: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: '#{$mdi-font-name}'; 3 | src: url('#{$mdi-font-path}/#{$mdi-filename}-webfont.eot?v=#{$mdi-version}'); 4 | src: url('#{$mdi-font-path}/#{$mdi-filename}-webfont.eot?#iefix&v=#{$mdi-version}') format('embedded-opentype'), 5 | url('#{$mdi-font-path}/#{$mdi-filename}-webfont.woff2?v=#{$mdi-version}') format('woff2'), 6 | url('#{$mdi-font-path}/#{$mdi-filename}-webfont.woff?v=#{$mdi-version}') format('woff'), 7 | url('#{$mdi-font-path}/#{$mdi-filename}-webfont.ttf?v=#{$mdi-version}') format('truetype'); 8 | font-weight: normal; 9 | font-style: normal; 10 | } 11 | -------------------------------------------------------------------------------- /public/scss/materialdesignicons.scss: -------------------------------------------------------------------------------- 1 | /* MaterialDesignIcons.com */ 2 | @import "variables"; 3 | @import "functions"; 4 | @import "path"; 5 | @import "core"; 6 | @import "icons"; 7 | @import "extras"; 8 | @import "animated"; -------------------------------------------------------------------------------- /public/starfield.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crypto-meetup-dev/cryptomeetup-portal/08790ef81987110c2781070820174fc1915552a6/public/starfield.png -------------------------------------------------------------------------------- /public/weather.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crypto-meetup-dev/cryptomeetup-portal/08790ef81987110c2781070820174fc1915552a6/public/weather.jpg -------------------------------------------------------------------------------- /src/Global.js: -------------------------------------------------------------------------------- 1 | // 利用vue单例充当 全站 事件 有必要的话可以把数据也接进来 2 | import Vue from 'vue' 3 | 4 | // 关于Portal用的数据 5 | const globalPortal = { 6 | scatterAccount: null, 7 | portalInfoList: [], 8 | } 9 | 10 | const globalContract = { 11 | contractType: 'eos' 12 | } 13 | 14 | export default new Vue({ 15 | data () { 16 | return { 17 | ...globalPortal, 18 | ...globalContract 19 | } 20 | }, 21 | methods: { 22 | setScatterAccount(scatterAccount) { 23 | this.scatterAccount = scatterAccount 24 | }, 25 | setPortalInfoList(portalInfoList) { 26 | this.portalInfoList = portalInfoList 27 | }, 28 | setGlobalContract(contractType) { 29 | this.contractType = contractType 30 | } 31 | }, 32 | beforeDestroy() { 33 | this.$off() 34 | } 35 | }) 36 | -------------------------------------------------------------------------------- /src/api/index.js: -------------------------------------------------------------------------------- 1 | import axios from 'axios'; 2 | import { getCookie } from '../util/cookies'; 3 | import { Toast } from 'buefy/dist/components/toast'; 4 | 5 | const client = axios.create({ 6 | baseURL: process.env.VUE_APP_MATATAKIAPI, 7 | timeout: 1000 * 30, 8 | headers: {}, 9 | }); 10 | 11 | // Just copy from matataki-fe 12 | client.interceptors.request.use( 13 | (config) => { 14 | if (getCookie('ACCESS_TOKEN')) { 15 | config.headers['x-access-token'] = getCookie('ACCESS_TOKEN'); 16 | } 17 | return config; 18 | }, 19 | // eslint-disable-next-line arrow-body-style 20 | (error) => { return Promise.reject(error); } 21 | ); 22 | 23 | client.interceptors.response.use( 24 | // eslint-disable-next-line arrow-body-style 25 | (response) => { return response.data; }, 26 | (error) => { 27 | // loadingInstance.close() 28 | console.log(error.message); 29 | 30 | if (error.message.includes('status code 401')) { 31 | Toast.open({ 32 | message: '登录状态异常,请重新登录', 33 | type: 'is-danger', 34 | duration: 4000, 35 | queue: false, 36 | }) 37 | } 38 | // if (process.browser && window && window.$nuxt) { 39 | 40 | // // window.$nuxt.$store.commit('setLoginModal', true) 41 | 42 | // try { 43 | // // 重置all store 44 | // window.$nuxt.$store.dispatch('resetAllStore') 45 | // .then(() => { 46 | // clearAllCookie() 47 | // // 防止没有清除干净 48 | // removeCookie('ACCESS_TOKEN') 49 | // removeCookie('idProvider') 50 | // store.clearAll() 51 | // sessionStorage.clear() 52 | // }).catch(err => { 53 | // console.log(err) 54 | // removeCookie('ACCESS_TOKEN') 55 | // }) 56 | // } catch(e) { 57 | // console.log(e) 58 | // removeCookie('ACCESS_TOKEN') 59 | // } 60 | // } 61 | // } 62 | 63 | // 超时处理 64 | if (error.message.includes('timeout')) { 65 | // Message.closeAll() 66 | Toast.open({ 67 | message: '请求超时', 68 | type: 'is-danger', 69 | duration: 4000, 70 | queue: false, 71 | }) 72 | } 73 | if (error.message.includes('Network Error')) { 74 | Toast.open({ 75 | message: 'Network Error', 76 | type: 'is-danger', 77 | duration: 4000, 78 | queue: false, 79 | }) 80 | } 81 | // loadingInstance.close() 82 | return Promise.reject(error); 83 | } 84 | ); 85 | 86 | export default client; 87 | -------------------------------------------------------------------------------- /src/api/login.js: -------------------------------------------------------------------------------- 1 | import client from './index'; 2 | import Axios from 'axios' 3 | 4 | export function loginWithEmail(username, password) { 5 | return Axios.post(process.env.VUE_APP_MATATAKIAPI + '/login/account', { username, password }); 6 | } 7 | 8 | export function getUserProfile(uid) { 9 | return Axios.get(process.env.VUE_APP_MATATAKIAPI + `/user/${uid}`); 10 | } 11 | 12 | export function getAvatarUrl(location) { 13 | const imageCDNServer = process.env.VUE_APP_MTTKIMGCDN; 14 | return `${imageCDNServer}${location}`; 15 | } 16 | -------------------------------------------------------------------------------- /src/assets/CMU_Token_Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crypto-meetup-dev/cryptomeetup-portal/08790ef81987110c2781070820174fc1915552a6/src/assets/CMU_Token_Logo.png -------------------------------------------------------------------------------- /src/assets/badge_checkin_1.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 分组 4 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /src/assets/icons/close.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crypto-meetup-dev/cryptomeetup-portal/08790ef81987110c2781070820174fc1915552a6/src/assets/icons/close.png -------------------------------------------------------------------------------- /src/assets/icons/load.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crypto-meetup-dev/cryptomeetup-portal/08790ef81987110c2781070820174fc1915552a6/src/assets/icons/load.png -------------------------------------------------------------------------------- /src/assets/icons/my-location.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crypto-meetup-dev/cryptomeetup-portal/08790ef81987110c2781070820174fc1915552a6/src/assets/icons/my-location.png -------------------------------------------------------------------------------- /src/assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crypto-meetup-dev/cryptomeetup-portal/08790ef81987110c2781070820174fc1915552a6/src/assets/logo.png -------------------------------------------------------------------------------- /src/components/GlobalLayer.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 12 | 25 | -------------------------------------------------------------------------------- /src/components/GlobalProgress.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 23 | 47 | -------------------------------------------------------------------------------- /src/components/GlobalSpinner.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 17 | 70 | -------------------------------------------------------------------------------- /src/components/InviteModal.vue: -------------------------------------------------------------------------------- 1 | 30 | 31 | 67 | -------------------------------------------------------------------------------- /src/components/Loading.vue: -------------------------------------------------------------------------------- 1 | 17 | 18 | 34 | 35 | 118 | 119 | -------------------------------------------------------------------------------- /src/components/MapPopup.vue: -------------------------------------------------------------------------------- 1 | 18 | 19 | 44 | 52 | -------------------------------------------------------------------------------- /src/components/MeetupBox.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 24 | 65 | 66 | -------------------------------------------------------------------------------- /src/components/RedeemCodeCopyDialog.vue: -------------------------------------------------------------------------------- 1 | 23 | 24 | 52 | 60 | -------------------------------------------------------------------------------- /src/components/SponsorPaymentModal.vue: -------------------------------------------------------------------------------- 1 | 61 | 62 | 165 | 170 | -------------------------------------------------------------------------------- /src/components/landmark/MapMarkerLocation.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 12 | 27 | -------------------------------------------------------------------------------- /src/components/landmark/MapMarkerMeetup.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 16 | 56 | -------------------------------------------------------------------------------- /src/components/landmark/createLocation.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 17 | 41 | 65 | -------------------------------------------------------------------------------- /src/components/landmark/enlargeImg.vue: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | 8 | 9 | 24 | 74 | 75 | -------------------------------------------------------------------------------- /src/components/landmark/myPortal.vue: -------------------------------------------------------------------------------- 1 | 28 | 29 | 78 | 199 | -------------------------------------------------------------------------------- /src/config/index.js: -------------------------------------------------------------------------------- 1 | import { networks } from './network'; 2 | 3 | export const appScatterName = 'CryptoMeetup'; 4 | 5 | export const network = networks; 6 | 7 | export const i18n = [ 8 | { 9 | locale: 'zh', 10 | aliases: ['zh', 'zh-cn', 'zh-hk', 'zh-sg', 'zh-tw'], 11 | }, 12 | { 13 | locale: 'en', 14 | aliases: ['en', 'en-us', 'en-au', 'en-bz', 'en-ca', 'en-ie', 'en-jm', 'en-nz', 'en-ph', 'en-za', 'en-tt', 'en-gb', 'en-zw'], 15 | }, 16 | { 17 | locale: 'ja', 18 | aliases: ['jp', 'ja', 'ja-jp'], 19 | }, 20 | { 21 | locale: 'ko', 22 | aliases: ['ko'], 23 | }, 24 | 25 | ]; 26 | 27 | export const referrerStorageKey = 'cryptomeetup_referrer'; 28 | -------------------------------------------------------------------------------- /src/config/modules.js: -------------------------------------------------------------------------------- 1 | const modules = { 2 | eos: { 3 | map: true, 4 | token: true, 5 | globe: true 6 | }, 7 | tron: { 8 | globe: true, 9 | token: false, 10 | map: false, 11 | }, 12 | ont: { 13 | globe: true, 14 | token: false, 15 | map: false, 16 | }, 17 | bos: { 18 | token: true, 19 | globe: true, 20 | map: false, 21 | } 22 | } 23 | 24 | export default modules 25 | -------------------------------------------------------------------------------- /src/config/network.js: -------------------------------------------------------------------------------- 1 | export const networks = { 2 | eos: { 3 | protocol: 'https', 4 | blockchain: 'eos', 5 | host: 'api.eosnewyork.io', 6 | port: 443, 7 | chainId: 'aca376f206b8fc25a6ed44dbdc66547c36c6c33e3a119ffbeaef943642f0e906', 8 | }, 9 | bos: { 10 | protocol: 'https', 11 | blockchain: 'eos', 12 | host: 'hapi.bos.eosrio.io', 13 | port: 443, 14 | chainId: 'd5a3d18fbb3c084e3b1f3fa98c21014b5f3db536cc15d08f9f6479517c6a3d86', 15 | } 16 | } 17 | 18 | export default networks 19 | 20 | // Use EOS Asia for Mainnet https://api1.eosasia.one' 21 | // export const eosOptions = { 22 | // eosasia: { 23 | // httpEndpoint: 'https://api.eosbeijing.one', 24 | // verbose: true, 25 | // chainId: 'aca376f206b8fc25a6ed44dbdc66547c36c6c33e3a119ffbeaef943642f0e906', 26 | // }, 27 | // kylin: { 28 | // httpEndpoint: 'https://api-kylin.eosasia.one', 29 | // verbose: true, 30 | // chainId: '5fff1dae8dc8e2fc4d5b23b2c7665c97f9e9d8edf2b6485a86ba311c25639191', 31 | // }, 32 | // local: { 33 | // httpEndpoint: 'http://127.0.0.1:8888', 34 | // verbose: true, 35 | // chainId: 'cf057bbfb72640471fd910bcb67639c22df9f92470936cddc1ade0e2f2e7dc4f', 36 | // }, 37 | // }; 38 | 39 | // Use CryptoKylin for Testnet 40 | // export const networks = { 41 | // kylin: { 42 | // protocol: 'https', 43 | // blockchain: 'eos', 44 | // host: 'api-kylin.eosasia.one', 45 | // port: 443, 46 | // chainId: '5fff1dae8dc8e2fc4d5b23b2c7665c97f9e9d8edf2b6485a86ba311c25639191', 47 | // }, 48 | // local: { 49 | // blockchain: 'eos', 50 | // host: '127.0.0.1', 51 | // port: 8888, 52 | // protocol: 'http', 53 | // chainId: 'cf057bbfb72640471fd910bcb67639c22df9f92470936cddc1ade0e2f2e7dc4f', 54 | // verbose: true, 55 | // debug: true, 56 | // }, 57 | // eosasia: { 58 | // protocol: 'https', 59 | // blockchain: 'eos', 60 | // host: 'api.eosbeijing.one', 61 | // port: 443, 62 | // chainId: 'aca376f206b8fc25a6ed44dbdc66547c36c6c33e3a119ffbeaef943642f0e906', 63 | // }, 64 | // }; 65 | -------------------------------------------------------------------------------- /src/global.scss: -------------------------------------------------------------------------------- 1 | @import "~bulma/sass/utilities/_all"; 2 | 3 | $primary: #21BEDA; 4 | $primary-invert: findColorInvert($primary); 5 | 6 | $colors: ( 7 | "white": ($white, $black), 8 | "black": ($black, $white), 9 | "light": ($light, $light-invert), 10 | "dark": ($dark, $dark-invert), 11 | "primary": ($primary, $primary-invert), 12 | "info": ($info, $info-invert), 13 | "success": ($success, $success-invert), 14 | "warning": ($warning, $warning-invert), 15 | "danger": ($danger, $danger-invert), 16 | ); 17 | 18 | $background: $black-ter; 19 | $link: $primary; 20 | $link-invert: $primary-invert; 21 | $link-focus-border: $primary; 22 | $link-focus: $white; 23 | $link-active: $white; 24 | $link-visited: $primary; 25 | $link-hover: $primary; 26 | $text: $white-ter; 27 | $text-invert: findColorInvert($text); 28 | $text-strong: $white; 29 | $title-color: $yellow; 30 | $title-strong-color: $yellow; 31 | $subtitle-color: $yellow; 32 | $subtitle-strong-color: $yellow; 33 | $border: $grey-dark; 34 | $content-heading-color: $yellow; 35 | $modal-card-title-color: $content-heading-color; 36 | $modal-background-background-color: rgba($black, 0.2); 37 | $modal-card-body-background-color: $black-ter; 38 | $button-background-color: $black-ter; 39 | $button-disabled-background-color: $black-ter; 40 | $button-disabled-border-color: $grey-light; 41 | $button-color: $grey-lighter; 42 | $label-color: $grey-lighter; 43 | 44 | $app-nav-height: 3rem; 45 | -------------------------------------------------------------------------------- /src/i18n/Country_zh_tw.json: -------------------------------------------------------------------------------- 1 | { 2 | "locale": "zh_tw", 3 | "countries": { 4 | "AD": "安道爾", 5 | "AE": "阿聯酋", 6 | "AF": "阿富汗", 7 | "AG": "安地卡及巴布達", 8 | "AI": "安圭拉", 9 | "AL": "阿爾巴尼亞", 10 | "AM": "亞美尼亞", 11 | "AO": "安哥拉", 12 | "AQ": "南極洲", 13 | "AR": "阿根廷", 14 | "AS": "美属萨摩亚", 15 | "AT": "奥地利", 16 | "AU": "澳大利亚", 17 | "AW": "阿鲁巴", 18 | "AX": "奥兰", 19 | "AZ": "阿塞拜疆", 20 | "BA": "波斯尼亚和黑塞哥维那", 21 | "BB": "巴巴多斯", 22 | "BD": "孟加拉国", 23 | "BE": "比利时", 24 | "BF": "布吉纳法索", 25 | "BG": "保加利亚", 26 | "BH": "巴林", 27 | "BI": "布隆迪", 28 | "BJ": "贝宁", 29 | "BL": "圣巴泰勒米", 30 | "BM": "百慕大", 31 | "BN": "文莱", 32 | "BO": "玻利维亚", 33 | "BQ": "加勒比荷兰", 34 | "BR": "巴西", 35 | "BS": "巴哈马", 36 | "BT": "不丹", 37 | "BV": "布韦岛", 38 | "BW": "博茨瓦纳", 39 | "BY": "白俄罗斯", 40 | "BZ": "伯利兹", 41 | "CA": "加拿大", 42 | "CC": "科科斯(基林)群岛", 43 | "CD": "刚果(金)", 44 | "CF": "中非", 45 | "CG": "刚果(布)", 46 | "CH": "瑞士", 47 | "CI": "科特迪瓦", 48 | "CK": "库克群岛", 49 | "CL": "智利", 50 | "CM": "喀麦隆", 51 | "CN": "中国", 52 | "CO": "哥伦比亚", 53 | "CR": "哥斯达黎加", 54 | "CU": "古巴", 55 | "CV": "佛得角", 56 | "CW": "库拉索", 57 | "CX": "圣诞岛", 58 | "CY": "赛普勒斯", 59 | "CZ": "捷克", 60 | "DE": "德国", 61 | "DJ": "吉布提", 62 | "DK": "丹麦", 63 | "DM": "多米尼克", 64 | "DO": "多米尼加", 65 | "DZ": "阿尔及利亚", 66 | "EC": "厄瓜多尔", 67 | "EE": "爱沙尼亚", 68 | "EG": "埃及", 69 | "EH": "阿拉伯撒哈拉民主共和国", 70 | "ER": "厄立特里亚", 71 | "ES": "西班牙", 72 | "ET": "衣索比亚", 73 | "FI": "芬兰", 74 | "FJ": "斐济", 75 | "FK": "福克兰群岛", 76 | "FM": "密克罗尼西亚联邦", 77 | "FO": "法罗群岛", 78 | "FR": "法国", 79 | "GA": "加彭", 80 | "GB": "英国", 81 | "GD": "格瑞那达", 82 | "GE": "格鲁吉亚", 83 | "GF": "法属圭亚那", 84 | "GG": "根西", 85 | "GH": "加纳", 86 | "GI": "直布罗陀", 87 | "GL": "格陵兰", 88 | "GM": "冈比亚", 89 | "GN": "几内亚", 90 | "GP": "瓜德罗普", 91 | "GQ": "赤道几内亚", 92 | "GR": "希腊", 93 | "GS": "南乔治亚和南桑威奇群岛", 94 | "GT": "危地马拉", 95 | "GU": "关岛", 96 | "GW": "几内亚比绍", 97 | "GY": "圭亚那", 98 | "HK": "香港", 99 | "HM": "赫德岛和麦克唐纳群岛", 100 | "HN": "宏都拉斯", 101 | "HR": "克罗地亚", 102 | "HT": "海地", 103 | "HU": "匈牙利", 104 | "ID": "印尼", 105 | "IE": "爱尔兰", 106 | "IL": "以色列", 107 | "IM": "马恩岛", 108 | "IN": "印度", 109 | "IO": "英属印度洋领地", 110 | "IQ": "伊拉克", 111 | "IR": "伊朗", 112 | "IS": "冰岛", 113 | "IT": "意大利", 114 | "JE": "泽西", 115 | "JM": "牙买加", 116 | "JO": "约旦", 117 | "JP": "日本", 118 | "KE": "肯尼亚", 119 | "KG": "吉尔吉斯斯坦", 120 | "KH": "柬埔寨", 121 | "KI": "基里巴斯", 122 | "KM": "科摩罗", 123 | "KN": "圣基茨和尼维斯", 124 | "KP": "朝鲜", 125 | "KR": "韩国", 126 | "KW": "科威特", 127 | "KY": "开曼群岛", 128 | "KZ": "哈萨克斯坦", 129 | "LA": "老挝", 130 | "LB": "黎巴嫩", 131 | "LC": "圣卢西亚", 132 | "LI": "列支敦斯登", 133 | "LK": "斯里兰卡", 134 | "LR": "利比里亚", 135 | "LS": "赖索托", 136 | "LT": "立陶宛", 137 | "LU": "卢森堡", 138 | "LV": "拉脱维亚", 139 | "LY": "利比亚", 140 | "MA": "摩洛哥", 141 | "MC": "摩纳哥", 142 | "MD": "摩尔多瓦", 143 | "ME": "蒙特内哥罗", 144 | "MF": "法属圣马丁", 145 | "MG": "马达加斯加", 146 | "MH": "马绍尔群岛", 147 | "MK": "马其顿", 148 | "ML": "马里", 149 | "MM": "缅甸", 150 | "MN": "蒙古", 151 | "MO": "澳门", 152 | "MP": "北马里亚纳群岛", 153 | "MQ": "马提尼克", 154 | "MR": "毛里塔尼亚", 155 | "MS": "蒙特塞拉特", 156 | "MT": "马尔他", 157 | "MU": "模里西斯", 158 | "MV": "马尔地夫", 159 | "MW": "马拉维", 160 | "MX": "墨西哥", 161 | "MY": "马来西亚", 162 | "MZ": "莫桑比克", 163 | "NA": "纳米比亚", 164 | "NC": "新喀里多尼亚", 165 | "NE": "尼日尔", 166 | "NF": "诺福克岛", 167 | "NG": "奈及利亚", 168 | "NI": "尼加拉瓜", 169 | "NL": "荷兰", 170 | "NO": "挪威", 171 | "NP": "尼泊尔", 172 | "NR": "瑙鲁", 173 | "NU": "纽埃", 174 | "NZ": "新西兰", 175 | "OM": "阿曼", 176 | "PA": "巴拿马", 177 | "PE": "秘鲁", 178 | "PF": "法属玻里尼西亚", 179 | "PG": "巴布亚新几内亚", 180 | "PH": "菲律宾", 181 | "PK": "巴基斯坦", 182 | "PL": "波兰", 183 | "PM": "圣皮埃尔和密克隆", 184 | "PN": "皮特凯恩群岛", 185 | "PR": "波多黎各", 186 | "PS": "巴勒斯坦", 187 | "PT": "葡萄牙", 188 | "PW": "帛琉", 189 | "PY": "巴拉圭", 190 | "QA": "卡塔尔", 191 | "RE": "留尼汪", 192 | "RO": "罗马尼亚", 193 | "RS": "塞尔维亚", 194 | "RU": "俄罗斯", 195 | "RW": "卢旺达", 196 | "SA": "沙乌地阿拉伯", 197 | "SB": "所罗门群岛", 198 | "SC": "塞舌尔", 199 | "SD": "苏丹", 200 | "SE": "瑞典", 201 | "SG": "新加坡", 202 | "SH": "圣赫勒拿", 203 | "SI": "斯洛维尼亚", 204 | "SJ": "斯瓦尔巴群岛和扬马延岛", 205 | "SK": "斯洛伐克", 206 | "SL": "塞拉利昂", 207 | "SM": "圣马力诺", 208 | "SN": "塞内加尔", 209 | "SO": "索马利亚", 210 | "SR": "苏里南", 211 | "SS": "南苏丹", 212 | "ST": "圣多美和普林西比", 213 | "SV": "萨尔瓦多", 214 | "SX": "荷属圣马丁", 215 | "SY": "叙利亚", 216 | "SZ": "斯威士兰", 217 | "TC": "特克斯和凯科斯群岛", 218 | "TD": "乍得", 219 | "TF": "法属南部领地", 220 | "TG": "多哥", 221 | "TH": "泰国", 222 | "TJ": "塔吉克斯坦", 223 | "TK": "托克劳", 224 | "TL": "东帝汶", 225 | "TM": "土库曼斯坦", 226 | "TN": "突尼西亚", 227 | "TO": "汤加", 228 | "TR": "土耳其", 229 | "TT": "千里达及托巴哥", 230 | "TV": "图瓦卢", 231 | "TW": "臺湾", 232 | "TZ": "坦桑尼亚", 233 | "UA": "乌克兰", 234 | "UG": "乌干达", 235 | "UM": "美国本土外小岛屿", 236 | "US": "美国", 237 | "UY": "乌拉圭", 238 | "UZ": "乌兹别克斯坦", 239 | "VA": "梵蒂冈", 240 | "VC": "圣文森及格瑞那丁", 241 | "VE": "委内瑞拉", 242 | "VG": "英属维尔京群岛", 243 | "VI": "美属维尔京群岛", 244 | "VN": "越南", 245 | "VU": "瓦努阿图", 246 | "WF": "瓦利斯和富图纳", 247 | "WS": "萨摩亚", 248 | "YE": "叶门", 249 | "YT": "马约特", 250 | "ZA": "南非", 251 | "ZM": "尚比亚", 252 | "ZW": "辛巴威", 253 | "XK": "科索沃" 254 | } 255 | } 256 | -------------------------------------------------------------------------------- /src/i18n/about_en.html: -------------------------------------------------------------------------------- 1 |

Cryptomeetup Introduction

2 | 3 |
4 | 5 |

Cryptomeetup is a decentralized events platform powered by cutting-edge blockchain technology, which integrates 6 | decentralized games, blockchain events, and blockchain ticketing. It provides user generated content (UGC) features as 7 | a whole. Cryptomeetup is an open source project, and it opens to all the developers in the community and motivates by 8 | token economic.

9 | 10 |

Cryptomeetups currently provides globe module and map module, and integrates gameplay and openness. The future growing 11 | direction will depends on the community consensus.

12 | 13 |

Cryptomeetup is currently divided into the globe module and the map module:

14 | 15 |

In the Globe Module, we devided the land into serveral levels, such as the world, continents, countries, cities, and 16 | landmarks. And these game assets are Non-Fungible Tokens, which are unique and transparent on the blockchain. 17 | Cryptomeetup will provides different gameplay with variety levels of assets.

18 | 19 |

n the map module, users can upload their own landmarks, which are be recorded on the blockchain and turned into user's 20 | own assets. Cryptomeetup offers variety of gameplay options, giving users the greatest freedom to create; Users can 21 | freely buy and sell their own landmarks, define their attributes, hold events on own land for revenue, etc.

22 | 23 |

1. Blockchain Events

24 | 25 |

Users can buy and sell land token (such as national token) to become regional manager of the area and have the right to 26 | manage activities in the area

27 | 28 |
29 | 30 |

2、Chech-in at blockchain events

31 | 32 |
33 | 34 |

Cryptomeetup launched its check in function at the first DApp Developer Conference in Beijing on 8 ~ 9 November 2018. 35 | People who attended the conference could use EOS accounts with chrome + scatter plugin, or EOS mobile wallet such as 36 | Tokenpocket or Meet.one or Math wallet, to win the genesis badge of cryptomeetup by checking in at specific time and 37 | region. Players who had this badge can apply for free tickets of 2nd Dapp Developer Conference!

38 | 39 |
40 | 41 |

3. UGC - to upload your own landmarks

42 | 43 |
44 | 45 |

User-generated content is the most important part of the blockchain applications. Cryptomeetup allows players to use 46 | mobile wallets such as tokenpocket to create landmarks in any unclaimed locations, complete with descriptions and 47 | images. Verified landmarks will be uploaded to the EOS blockchain as an digital non-frigiable asset which is tradable 48 | and can be reuse on other LBS blockchain games.

49 | 50 |

In order to prevent users from uploading spam, we allow core cryptomeetup players to review these UGC content and will 51 | be completely open to the whole commuinty in the future.

52 | 53 |

4. Crypto Gaming Part

54 | 55 |

The project is still in the development and iteration. 3rd round of the game testing will open at 12:00pm UTC, on 14 56 | Dec 2018.

57 | 58 |

4.1 Globe Module

59 | 60 |

The third round of game tesing will be open to 249 countries. The starting price of each country was 0.1 EOS, and each 61 | purchase made the country price increase by 35%. The amount of the next purchase will be returned to the previous 62 | player's principal and the increased amount will be distributed as follows:

63 | 64 | 70 | 71 |

4.2 Map Module

72 | 73 |

Players will be able to create their own landmarks through cryptomeetup.io website, which will automatically get 74 | location parameters and pricing it. To customize parameters, you can go togithuband edit the configuration file.

75 | 76 |

The next player's purchase the landmark will firstly return the original player's principal.The increased amount will 77 | be distributed according to the following proportions:

78 | 79 | 87 | 88 |

Explanation of the Dividend Pool

89 |

Users can stake CMU to receive cryptomeetup's devidends in real time. The dividends will be distributed according to 90 | the ratio of staked CMU

91 | 92 |

Explanation of the Prize pool & Countdown Timer

93 | 94 |

The third round of gaming test increases the countdown function. It stars from 30 days. If every 1 EOS flows into the 95 | smart contract for the purchase of land, the countdown timer will increase by 1 minute. When the countdown timer 96 | reaches 0, the last player who purchases the land will win the total prize pool.

97 | 98 |

5. Blockchain Ticketing (Coming in future release)

99 | 100 | 106 | 107 |
108 | 109 |

CMU Token

110 | 111 |

"CMU" is the Cryptomeetup platform's token. Token holders can share the profit of Cryptomeetup platform and participant 112 | in the community’s self-government by staking CMU token. Also, the CMU token is a utility token that players can use 113 | CMU as game assets.

114 | 115 |

How to get CMU tokens

116 | 117 | 121 | 122 |

* 5% transation fee will be charged if you sell CMU token to the smart contract.

123 | 124 | 125 | 132 | 133 |
134 |

(WeChat ID: DAppsDev)

-------------------------------------------------------------------------------- /src/i18n/about_en.md: -------------------------------------------------------------------------------- 1 | # About CryptoMeetup 2 | 3 | ### 1. New Beta Coming Up 4 | 5 | This round of testing will open 249 countries and each country token's price starts from 0.1 EOS and each purchase raises 35% to the next selling price. The price inflation becomes the profit, and will be split into several pots: 6 | 7 | * 50% to the last token owner 8 | * 30% to the CMU token holder 9 | * 10% to the pot (prize pool) 10 | * 5% to the last owner of the alpha test 11 | * 5% to the referrer 12 | 13 | The new round of testing adds a countdown timer and each purchase will reset the timer. The countdown time is related to the size of the prize pool, following t = 1 min + 24 hrs - pot / 2000 * 23.59 hrs, reducing from 24 hours to 1 minute. 14 | 15 | Notice:When the timer reaches zero, last person to buy the land wins the prize pool and all land data during the testing round will be deleted. Users’ CMU Token won’t be affected. -------------------------------------------------------------------------------- /src/i18n/about_jp.html: -------------------------------------------------------------------------------- 1 |

貨幣を集めて紹介す

2 | 3 |
4 | 5 |

コインは、ブロックチェーンにおいて、ブロックチェーンゲーム、ブロックチェーンの活动、ブロックチェーンのチケット、およびユーザオリジナルコンテンツを一体化したブロックチェーン複合プラットフォームである。 6 | コインコードはオープンソースで、コミュニティ開発者に開発され、通信エコノミーを活用してインセンティブを与える。

7 | 8 |

コインは、地球モジュールと地図モジュール、ゲーム性、オープン性、未来の発展方向コミュニティはコミュニティによって决定される。

9 | 10 |

コインは現在、主に地球モジュールと地図モジュールに分けられている

11 | 12 |

地球モジュールでは、地球、大陸、国、都市、ランドマークなどの土地を区別していますこれらのゲーム資産は、地球、大陸、国、都市、ランドマークなどです。 各階層の土地を結合して、様々な遊び方を実現する。

13 | 14 |

地図モジュールでは、ユーザは自律的に主上、ラベルはすぐにブロック・チェーン上に記録され、ユーザのアセットになる。 15 | コインは豊富な游び方を提供して、ユーザーに最大の自由创造空间を与える、ユーザーは、ランドマークの属性を定义し、ランドマークの上でイベントを开催して収入を得ることなどを提供します。 16 |

17 | 18 |

1. ブロックリンクアクティビティー展示

19 | 20 |

ユーザーは土地通证(国家通证)を売买することによって、その地域の管理者となり、その地域の活动を管理する権利があります。

21 | 22 |
23 | 24 |

2、ブロックチェーン活动タイムカードにサインする

25 | 26 |
27 | 28 |

2018年11月10日に北京で开催された第1回 dapp 开発者大会では、コインの集まりが先に「タイムカード」機能を開放した。 ユーザーがクローム + scsomething プラグインを使用できます あるいはお似合いの eos 29 | ケータイ财布(例: tokenpocket、 ya.). 自分の e o s アカウントにログインし、指定された時間と地理的範囲内で開き、創世記章を受け取る。 創世勲章を受章したユーザーは、次期 d p a d 30 | 開発者大会の入場券を受け取る。

31 | 32 |
33 | 34 |

3、ユーザーがコンテンツを生成し、アップリンクアイコンを作成する 35 |

36 | 37 |
38 | 39 |

ユーザ生成コンテンツは、ブロックチェーンアプリケーションの中で最も重要なプロセスであり、ユーザーは、 tokenpocket 40 | などの携帯電話の財布を通じて、誰も認めない地理的位置にランドマークを作成し、ロケールの説明と写真を追加することができる。 審査を通過したロゴは、 e o s ゾーンのブロックチェーンにアップロードされ、自由に取引できる資産になる。 41 | さらに、他の地理的位置に基づくブロック・チェーン・ゲームは、これらのアイコンに基づいてゲームを行うことができる。

42 | 43 |

ユーザーがスパム情報をアップロードすることを防ぐため、現在はコミュニティーの中心プレーヤーに、審査を委託しました将来はコミュニティーに完全に開放されます。 44 |

45 | 46 |

4. 土地取引游戏(2018年12月14日8:00 pm より新ラウンドのテストを开始する) 47 |

48 | 49 |

4.1[ earth モジュール]国際取引 50 |

51 | 52 |

国家取引ゲームの2ラウンドをオープンし、スマート契约を更新することになりました。2018年12月14日に第3次削除内测を発表する

53 | 54 |

第3ラウンドのテストは249か国, それぞれの国のトークンの開始価格は0.1 eos であり, それぞれの国の価格は35パーセント値上がりした。 次回購入する金額は、前回のプレーヤーの元金に戻り、次の比率で増加分を割り当てます

55 | 56 | 62 | 63 |

Netbeans ide 4.2[マッピングモジュール]アドレス指定

64 | 65 |

プレイヤーは、コインポリマーサイト上で自分のロケーションを作成することができ、コインは自動的に地理的位置パラメータ、カスタマイズ価格を自動的に取得し、パラメータをカスタマイズするには、githubに行くことができる

66 | 67 |

次のプレーヤーはこの無尽を購入して最初に前のプレーヤーの元金に戻り、付加価値の部分を次の割合で割り当てる

68 | 69 | 78 | 79 |

レッド・チームによる説明です

80 |

現在のプロジェクト収益の配当は、現在のプロジェクト収入の配当をリアルタイムで入手でき、配当はモーゲージ cmu の比率によって配られる。

81 | 82 |

カウントダウン説明

83 | 84 |

3次试験でカウントダウン机能が追加され、30日间から0に减り、1 eos ごとにスマートフォンに流入して土地を购入し、カウントダウンは1分増え、カウントダウンは0時に最終的に購入したプレーヤーが賞金総額を獲得した。

85 | 86 |

5、ブロックリンクチケット(まだ开いていない)

87 | 88 | 93 | 94 |
95 | 96 |

Cmu 通信

97 | 98 |

ディスカウントのプラットフォームは「 cmu 」です。 通信保有者は、モーゲージ・プラットフォームの利益配当と参加プラットフォームを分かち合うことができる。 また、 cmu 通信はアプリケーション型通信であり、プレイヤーは cmu 99 | を使用してゲームアセットを購入できる

100 | 101 |

Cmu 通信の取得方法

102 | 103 | 107 | 108 |

ユーザー間フリートレーション cmu は、 cmu を直接売却し、5% の手数料を受け取り、ユーザ間の自由な振込み c m u は無料だ。

109 | 110 | 111 | 118 | 119 |
120 |

(WeChat id: dappsdev)

-------------------------------------------------------------------------------- /src/i18n/about_jp.md: -------------------------------------------------------------------------------- 1 | # CryptoMeetupの説明 2 | 3 | ### 1 .新しい1ラウンドのテストを開く 4 | 5 | 次のテストは、全国のTKenの開始価格が0.1 EOSで、この国の価格は35 %増加した。次の購入金額は、先のプレイヤーの本金に戻り、増値部分を次のような割合で分配する。 6 | 7 | * 50 %は前回のプレイヤーに 8 | * 30 %がCMを持っている人に 9 | * 賞池に10 %入り 10 | * %を1ラウンドのテストで立ち止まった 11 | * 5 %推薦人 12 | 13 | 新たなテストでカウントダウンを加え、購入するたびにカウントダウンをリセットします。カウントダウン時間は、賞池の大きさに関連して、t = 1ミニ+ 24 hrs -賞池/ 2000 * 23 - 59 hrsに従って、24時間から1分まで減少します。 14 | 15 | 注意:カウントダウンが終了すると、最後に購入したプレイヤーがプールを取得したので、土地情報が削除されます。ユーザーが持っているCMは影響を受けません。 -------------------------------------------------------------------------------- /src/i18n/about_ko.html: -------------------------------------------------------------------------------- 1 |

동전 소개

2 | 3 |
4 | 5 |

동전 클러스터는 블록 체인에서 실행되며 블록 체인 게임, 블록 체인 활동, 블럭 체인 티켓팅 및 사용자 고유 콘텐츠를 통합하는 블록 체인 통합 플랫폼입니다. 코인 코드는 완전히 오픈 소스이며 커뮤니티 개발자를 위해 6 | 개발되었으며 CIS 경제에 의해 동기 부여됩니다.

7 | 8 |

동전은 기존 지구 모듈과지도 모듈을 모으고 게임 플레이와 개방성을 통합합니다. 지역 사회의 향후 발전 방향은 지역 사회의 합의에 의해 결정됩니다.

9 | 10 |

동전 집합체는 주로 지구 모듈과지도 모듈로 나뉩니다.

11 | 12 |

지구 모듈에서는 지구를 대륙, 대륙, 국가, 도시, 랜드 마크 등의 레벨로 나눕니다. 이러한 게임 자산은 고유하고 체인이 준비된 비 균질 인증서입니다. 동전 수집은 여러 가지 수준의 토지를 결합하여 다양한 방식으로 13 | 게임을 진행합니다.

14 | 15 |

지도 모듈에서 사용자는 랜드 마크를 자치적으로 업로드 할 수 있으며 랜드 마크는 블록 체인에 기록되어 사용자 자산이됩니다. 동전 수집은 풍부한 게임 플레이를 제공하여 사용자가 공간을 만들 수있는 최대의 자유를 16 | 제공하고 사용자는 표식을 사고 팔고 표식의 속성을 정의하고 표식에 이벤트를 구성하여 소득을 얻을 수 있습니다.

17 | 18 |

1. 블록 체인 활동 표시

19 | 20 |

사용자는 육로를 구매 및 판매함으로써 해당 지역의 관리자가 될 수 있으며 해당 지역의 활동을 관리 할 권리가 있습니다.

21 | 22 |
23 | 24 |

2, 블록 체인 액티비티 체크인

25 | 26 |
27 | 28 |

2018 년 11 월 10 일 베이징에서 열린 DApp Developers Conference에서 동전 수령은 처음으로 "체크인"기능을 열었습니다. 사용자는 Chrome + Scatter 플러그인 또는 EOS 29 | 모바일 지갑 (예 : Tokenpocket, Meet.one, Wheat)을 통해 EOS 계정에 로그인하여 지정된 시간 및 지리적 범위에서 체크인을 열어 생성 배지를 얻을 수 있습니다. 창조 메달을받은 사용자는 30 | 자신의 계정 번호로 다음 DApp 개발자 컨퍼런스 티켓을 신청할 것입니다.

31 | 32 |
33 | 34 |

3、사용자가 생성 한 콘텐츠로 구불 구불 한 경계표 생성

35 | 36 |
37 | 38 |

사용자가 생성 한 콘텐츠는 블록 체인 응용 프로그램에서 가장 중요한 부분입니다. 플레이어는 TokenPocket과 같은 모바일 지갑을 통해 청구되지 않은 위치에 랜드 마크를 만들고 랜드 마크 설명 및 이미지를 보완 39 | 할 수 있습니다. 승인 된 랜드 마크는 EOS 블록 체인에 업로드되고 자유롭게 교환 가능한 자산이됩니다. 또한 다른 지리적 기반 블록 체인 게임도 이러한 랜드 마크를 기반으로 할 수 있습니다.

40 | 41 |

사용자가 스팸을 업로드하지 못하도록하기 위해이 단계에서 우리는 동전 수집 커뮤니티의 핵심 플레이어에게 랜드 마크 리뷰를 넘겨 주었고 미래는 완전히 커뮤니티에 개방 될 것입니다.

42 | 43 |

4、토지 거래 게임 (새로운 라운드는 2018 년 12 월 14 일 오후 8시에 시작됩니다)

44 | 45 |

4.1 [지구 모듈] 내셔널 트레이딩

46 | 47 |

우리는 전국 거래 게임에 대한 베타 테스트 2 라운드를 시작했으며 현명한 계약을 업데이트하려고합니다. 2018 년 12 월 14 일에 3 차 내부 테스트를 시작합니다. 게임 플레이는 다음과 같습니다 :

48 | 49 |

테스트의 세 번째 라운드는 249 개국을 열었고, 각 국가의 Token의 시작 가격은 0.1 EOS였으며, 각 구매로 인해 국가의 가격이 35 % 증가했습니다. 다음 구매 금액은 이전 플레이어의 주인에게 반환되며 50 | 추가 된 금액은 다음과 같이 분배됩니다.

51 | 52 | 58 | 59 |

4.2 [지도 모듈] 랜드 마크 거래

60 | 61 |

플레이어는 웹 사이트를 통해 업로드하여 자신의 랜드 마크를 만들 수 있으며 동전에 위치 매개 변수와 사용자 정의 가격이 자동으로 표시됩니다. 매개 변수를 사용자 정의하려면github로 이동하십시오. -dev / portal-list의 구성 파일을 수정하십시오.

62 | 63 |

랜드 마크를 구입 한 다음 플레이어가 원래 플레이어의 교장을 먼저 돌려주고 부가가치 부분은 다음 비율에 따라 배포됩니다.

64 | 65 | 74 | 75 |

분할 된 풀 설명

76 |

동전 컬렉션 인 "Token -> Dividend Pool"에서 모기지 플랫폼 CMU는 현재 프로젝트 수입의 배당금을 실시간으로 얻을 수 있으며, 배당금은 모기지 CMU의 비율에 따라 배분됩니다.

77 | 78 |

카운트 다운 지침

79 | 80 |

테스트의 세 번째 라운드는 30 일에서 0으로 카운트 다운 기능을 늘렸고 EOS가 토지 매입을위한 스마트 계약으로 유입 될 때마다 카운트 다운이 1 분 증가했으며 마지막으로 구매 한 플레이어가 총 상금 풀을 81 | 획득했을 때 카운트 다운은 0이었습니다.

82 | 83 |

5、블록 체인 티켓팅 (아직 열지 않음)

84 | 85 | 91 | 92 |
93 | 94 |

CMU 인증서

95 | 96 |

코인 풀 플랫폼은 "CMU"입니다. 합격자는 코인 수집 플랫폼의 이익 분배를 공유하고 모기지 통과를 통해 플랫폼의 분산 된 자율성에 참여할 수 있습니다. 또한, CMU 패스는 응용 프로그램 통과이며, 플레이어는 97 | CMU를 사용하여 게임 자산을 구입할 수 있습니다.

98 | 99 |

CMU 인증서를받는 방법

100 | 101 | 105 | 106 |

* 동전 수집에서 스마트 계약에 CMU를 직접 판매하는 경우 5 % 수수료가 청구되며 CMU는 무료입니다.

107 | 108 | 109 | 116 | 117 |
118 |

(WeChat ID : DAppsDev)

-------------------------------------------------------------------------------- /src/i18n/about_ru.html: -------------------------------------------------------------------------------- 1 |

Введение в монеты

2 | 3 |
4 | 5 |

Монетный кластер работает на блокчейне и представляет собой интегрированную платформу блокчейна, объединяющую игры 6 | блокчейна, действия блокчейна, создание билетов блокчейна и оригинальный контент пользователя. Код монеты является 7 | полностью открытым исходным кодом, разработан для разработчиков сообщества и мотивирован экономикой СНГ.

8 | 9 |

Монета собирает существующий модуль Земли и модуль карты, а также объединяет игровой процесс и открытость. Направление 10 | развития сообщества определяется консенсусом сообщества.

11 | 12 |

Агрегация монет в основном делится на модуль земли и модуль карты:

13 | 14 |

В модуле Земля мы делим землю по уровням, таким как земля, континенты, страны, города, достопримечательности и т. Д. 15 | Эти игровые активы являются неоднородными сертификатами, уникальными и готовыми к цепочке. Сбор монет будет объединять 16 | разные уровни земли для достижения разных способов игры.

17 | 18 |

В модуле карты пользователь может загружать ориентиры автономно, а ориентиры записываются в блокчейн и становятся 19 | активами пользователя. Коллекция монет предоставляет богатый игровой процесс, предоставляя пользователям максимальную 20 | свободу для создания пространства, пользователи могут покупать и продавать ориентиры, определять атрибуты ориентиров и 21 | организовывать мероприятия на ориентирах, чтобы получать доход.

22 | 23 |

1、Отображение активности блокчейна

24 | 25 |

Пользователи могут стать менеджерами региона, покупая и продавая пропуска (например, пропуска по стране) и имея право 26 | управлять деятельностью в этом районе.

27 | 28 |
29 | 30 |

2、признак регистрации активности блокчейна

31 | 32 |
33 | 34 |

На первой конференции разработчиков DApp, состоявшейся в Пекине 10 ноября 2018 года, коллекция монет была первой, 35 | которая открыла функцию «регистрации». Пользователи могут войти в свою учетную запись EOS через плагин Chrome + Scatter 36 | или адаптированный мобильный кошелек EOS (например, Tokenpocket, Meet.one, Wheat), чтобы открыть регистрацию в 37 | указанное время и географический охват для получения значка создания. Пользователи, получившие Medal of Creation, 38 | подадут заявку на следующий билет DApp Developer Conference с номером своей учетной записи.

39 | 40 |
41 | 42 |

3、пользователь генерирует контент, создает извилистый ориентир

43 | 44 |
45 | 46 |

Пользовательский контент - самая важная часть приложения блокчейна: игроки могут создавать ориентиры в невостребованных 47 | местах с помощью мобильных кошельков, таких как TokenPocket, дополняя описания ориентиров и изображения. Утвержденные 48 | ориентиры будут загружены в блокчейн EOS и станут свободно торгуемыми активами. Кроме того, другие ориентированные на 49 | гео игры блокчейна также могут основываться на этих ориентирах.

50 | 51 |

Чтобы пользователи не могли загружать спам, на этом этапе мы передали обзор ориентиров основным игрокам сообщества по 52 | сбору монет, и будущее будет полностью открыто для сообщества.

53 | 54 |

4、Land Trading Game (Новый раунд тестирования будет запущен в 8:00 вечера 14 декабря 2018 года)

55 | 56 |

4.1 【земной модулей】Национальная торговля

57 | 58 |

Мы открыли два раунда бета-тестирования национальных торговых игр и собираемся обновить наши умные контракты. Мы начнем 59 | третий раунд внутреннего тестирования 14 декабря 2018 года. Игровой процесс выглядит следующим образом:

60 | 61 |

Третий раунд тестирования открыл 249 стран, стартовая цена токена в каждой стране составляла 0,1 EOS, и каждая покупка 62 | приводила к увеличению цены в стране на 35%. Сумма следующей покупки будет возвращена основной сумме предыдущего 63 | игрока, а добавленная стоимость будет распределена следующим образом:

64 | 65 | 71 | 72 |

4.2  [Модуль карты] Торговля ориентирами

73 | 74 |

Игроки могут создавать свои собственные ориентиры, загружая их через веб-сайт, и монеты автоматически получат параметры 75 | местоположения и индивидуальные цены. Если вы хотите настроить параметры, вы можете перейти наgithub. Измените файл конфигурации в -dev / portal-list).

76 | 77 |

Следующий игрок, который приобретет ориентир, первым вернет основного игрока, а часть с добавленной стоимостью будет 78 | распределена в следующих пропорциях:

79 | 80 | 89 | 90 |

Описание разделенного пула

91 |

В коллекции монет «Токен -> Дивидендный пул» ипотечная платформа CMU может получать дивиденды от текущего дохода 92 | проекта в реальном времени, а дивиденды будут распределяться в соответствии с пропорцией ипотечного CMU.

93 | 94 |

Инструкции обратного отсчета

95 | 96 |

Третий раунд испытаний увеличил функцию обратного отсчета, с 30 дней до 0, каждый 1 поток EOS в умный контракт на 97 | покупку земли, обратный отсчет увеличился на 1 минуту, и отсчет был 0, когда последний купленный игрок выиграл общий 98 | призовой фонд.

99 | 100 |

5、билеты в блокчейн (пока не открыты)

101 | 102 |

Используйте умные контракты EOS, выпускайте тикеты блокчейнов, уникально идентифицируйте каждую цепочку тикетов и 103 | устраняйте фальшивые тикеты 104 | Эффективность торговли на вторичном рынке была значительно улучшена. Билет передан, и нет необходимости в громоздком 105 | процессе транзакции лицом к лицу. 106 | Организация мероприятий и участие в мероприятиях заключается в участии в создании сообщества по сбору монет, получении 107 | большого количества сертификатов и повышении их влияния в сообществе.

108 | 109 |
110 | 111 |

Сертификат CMU

112 | 113 |

Платформа для пула монет - «CMU». Владелец пропуска может делиться распределением прибыли платформы для сбора монет и 114 | участвовать в децентрализованной автономии платформы через ипотечный пропуск. Кроме того, CMU Pass также является 115 | пропуском приложения, игроки могут использовать CMU для покупки игровых активов.

116 | 117 |

Как получить сертификат CMU

118 | 119 | 123 | 124 |

В коллекции монет непосредственно продаются CMU для смарт-контракта, взимается комиссия в размере 5%, бесплатный 125 | перевод между пользователями CMU бесплатно.

126 | 127 | 128 | 135 | 136 |
137 |

(Идентификатор WeChat: DAppsDev)

-------------------------------------------------------------------------------- /src/i18n/about_ru.md: -------------------------------------------------------------------------------- 1 | # CryptoMeetup Элемент Описание 2 | 3 | ### 1. Начните новый раунд тестирования 4 | 5 | Следующий раунд тестирования открыл 249 стран, а стартовая цена Token в каждой стране составила 0,1 EOS, и каждая покупка сделала рост цены страны на 35%. Сумма следующей покупки будет возвращена основному игроку предыдущего игрока, а добавленная стоимость будет распределена следующим образом: 6 | 7 | * 50% предыдущему игроку 8 | * 30% держателям CMU 9 | * 10% в призовой фонд 10 | * 5% дали последний раунд тестирования 11 | * 5% для судей 12 | 13 | В новом раунде тестов добавлен обратный отсчет, и каждая покупка сбрасывает обратный отсчет. Время обратного отсчета зависит от размера призового фонда, следующего за t = 1 мин + 24 часа - призового фонда / 2000 * 23,59 часа, от 24 часов до 1 минуты. 14 | 15 | Примечание. В конце обратного отсчета последний приобретенный игрок выигрывает призовой фонд, поэтому информация о земле будет удалена. КМУ, удерживаемый пользователем, не затрагивается. -------------------------------------------------------------------------------- /src/i18n/about_tw.md: -------------------------------------------------------------------------------- 1 | # CryptoMeetup項目說明 2 | 3 | ### 1. 開啟新一輪測試 4 | 5 | 下一輪測試開放249個國家,每個國家Token的起始價格是 0.1 EOS,每次購買使得該國家的價格增長35%。下一次購買的金額先返回上一個玩家的本金,並將增值部分按照如下比例進行分配: 6 | 7 | * 50%給到上一個玩家 8 | * 30%給到CMU持幣者 9 | * 10%進入獎池 10 | * 5%給上一輪測試中站崗的 11 | * 5%給推薦人 12 | 13 |  新一輪的測試中加入了倒計時,每次購買行為都將重置倒計時。倒計時時間跟獎池大小相關,遵從 t = 1 min+24 hrs - 獎池 / 2000 * 23.59 hrs,從24小時遞減到1分鐘。 14 | 15 |  注意:倒計時結束時,最後一個購買的玩家獲得獎池,所以土地信息將被刪檔。用戶持有的CMU不受影響。 -------------------------------------------------------------------------------- /src/i18n/about_zh.html: -------------------------------------------------------------------------------- 1 |

币聚介绍

2 | 3 |
4 | 5 |

币聚运行在区块链上,是区块链游戏、区块链活动、区块链票务及用户原创内容为一体的区块链综合平台。币聚代码完全开源,开发给社区开发者,并使用通证经济予以激励。

6 | 7 |

币聚现有地球模块和地图模块,集游戏性、开放性于一体,未来的发展方向社区由社区共识决定。

8 | 9 |

币聚当前主要分为地球模块地图模块

10 | 11 |

在地球模块,我们把土地按级别划分,如地球、大洲、国家、城市、地标等,这些游戏资产都是非同质通证,独一无二、链上可查。币聚将结合各个层级的土地,实现不同的玩法。

12 | 13 |

在地图模块,用户可以自主上传地标,地标随即记录在区块链上,变成用户资产。币聚提供了丰富的玩法,给予用户最大的自由创造空间;用户可买卖地标,定义地标的属性、在地标上举办活动赚取收入等。

14 | 15 |

1、区块链活动展示

16 | 17 |

用户可以通过买卖土地通证(如:国家通证),来成为该区域的管理员,有权利管理该区域上的活动。

18 | 19 |
20 | 21 |

2、区块链活动打卡签到

22 | 23 |
24 | 25 |

在2018年11月10日于北京举办的第一届DApp开发者大会上,币聚率先开放了“打卡签到”功能。用户可以通过Chrome+Scatter插件,或适配过的EOS手机钱包(如:Tokenpocket、Meet.one、麦子 ) 26 | 来登陆自己的EOS账号,在指定的时间和地理范围内打开签到,获得创世徽章。获得创世勋章的用户,将凭账号申请获得下一届DApp开发者大会的门票。

27 | 28 |
29 | 30 |

3、用户产生内容,创建上链地标

31 | 32 |
33 | 34 |

用户生成内容是区块链应用中最重要的环节,玩家可以通过 TokenPocket 35 | 等手机钱包,在无人认领的地理位置创建地标,补充地标说明及图片。通过审核的地标将被上传到EOS区块链上,成为可以自由交易的资产。除此之外,其他基于地理位置的区块链游戏,也可以基于这些地标进行游戏。

36 | 37 |

为了防止用户上传垃圾信息,现阶段,我们把地标的审核工作交给了币聚社区的核心玩家,未来将完全开放给社区。

38 | 39 |

4、土地交易游戏 (将于2018年12月14日 8:00pm 开启新一轮测试)

40 | 41 |

4.1 【地球模块】国家交易

42 | 43 |

我们开放过国家交易游戏的两轮内测,即将更新智能合约,将于2018年12月14日推出第三轮删档内测,玩法如下:

44 | 45 |

第三轮测试开放249个国家,每个国家Token的起始价格是 0.1 EOS,每次购买使得该国家的价格增长35%。下一次购买的金额先返回上一个玩家的本金,并将增值部分按照如下比例进行分配:

46 | 47 | 53 | 54 |

4.2 【地图模块】地标交易

55 | 56 |

玩家可以通过币聚网站上传来创建属于自己的地标,币聚将自动获取地理位置参数、自定义价格;若想要自定义参数,可以去github上修改配置文件

57 | 58 |

下一个玩家购买该地标会率先返回上一个玩家的本金,并将增值部分按照如下比例进行分配

59 | 60 | 69 | 70 |

分红池说明

71 |

在币聚"Token -> 分红池"处抵押平台通证CMU,便可实时获取当前项目收入的分红,分红将按照抵押CMU的比例进行发放

72 | 73 |

倒计时说明

74 | 75 |

第三轮测试增加了倒计时功能,从30天开始减至0,每有 1 EOS流入智能合约用于购买土地,倒计时增加1分钟,倒计时为0时最后购买的玩家赢得总奖池

76 | 77 |

5、区块链票务 (尚未开放)

78 | 79 | 84 | 85 |
86 | 87 |

CMU通证

88 | 89 |

币聚的平台通证是 “CMU”。通证持有者可以通过抵押通证来分享币聚平台的利润分红及参与平台去中心化自治。除此之外,CMU通证也是应用型通证,玩家可以使用CMU来购买游戏资产。

90 | 91 |

如何获得CMU通证

92 | 93 | 97 | 98 |

在币聚直接卖出CMU给智能合约,将被收取5%手续费;用户间自由转账CMU免费

99 | 100 | 101 | 108 | 109 |
110 |

(微信ID: DAppsDev)

-------------------------------------------------------------------------------- /src/i18n/about_zh.md: -------------------------------------------------------------------------------- 1 | # CryptoMeetup项目说明 2 | 3 | ### 1. 开启新一轮测试 4 | 5 | 下一轮测试开放249个国家,每个国家Token的起始价格是 0.1 EOS,每次购买使得该国家的价格增长35%。下一次购买的金额先返回上一个玩家的本金,并将增值部分按照如下比例进行分配: 6 | 7 | * 50%给到上一个玩家 8 | * 30%给到CMU持币者 9 | * 10%进入奖池 10 | * 5%给上一轮测试中站岗的 11 | * 5%给推荐人 12 | 13 | 新一轮的测试中加入了倒计时,每次购买行为都将重置倒计时。倒计时时间跟奖池大小相关,遵从 t = 1 min+24 hrs - 奖池 / 2000 * 23.59 hrs,从24小时递减到1分钟。 14 | 15 | 注意:倒计时结束时,最后一个购买的玩家获得奖池,所以土地信息将被删档。用户持有的CMU不受影响。 -------------------------------------------------------------------------------- /src/i18n/about_zh_tw.html: -------------------------------------------------------------------------------- 1 |

幣聚介紹

2 | 3 |
4 | 5 |

幣聚運行在區塊鏈上,是區塊鏈遊戲、區塊鏈活動、區塊鏈票務及用戶原創內容為一體的區塊鏈綜合平台。幣聚代碼完全開源,開發給社區開發者,並使用通證經濟予以激勵。

6 | 7 |

幣聚現有地球模塊和地圖模塊,集遊戲性、開放性於一體,未來的發展方向社區由社區共識決定。 8 |

9 | 10 |

幣聚當前主要分為地球模塊地圖模塊

11 | 12 |

在地球模塊,我們把土地按級別劃分,如地球、大洲、國家、城市、地標等,這些遊戲資產都是非同質通證,獨一無二、鏈上可查。幣聚將結合各個層級的土地,實現不同的玩法

13 | 14 |

在地圖模塊,用戶可以自主上傳地標,地標隨即記錄在區塊鏈上,變成用戶資產。幣聚提供了豐富的玩法,給予用戶最大的自由創造空間;用戶可買賣地標,定義地標的屬性、在地標上舉辦活動賺取收入等。

15 | 16 |

1、區塊鏈活動展示

17 | 18 |

用戶可以通過買賣土地通證(如:國家通證),來成為該區域的管理員,有權利管理該區域上的活動。

19 | 20 |
21 | 22 |

2、區塊鏈活動打卡簽到

23 | 24 |
25 | 26 |

在2018年11月10日於北京舉辦的第一屆DApp開發者大會上,幣聚率先開放了“打卡簽到”功能。用戶可以通過Chrome+Scatter插件,或適配過的EOS手機錢包(如:Tokenpocket、Meet.one、麥子 ) 27 | 來登陸自己的EOS賬號,在指定的時間和地理範圍內打開簽到,獲得創世徽章。獲得創世勳章的用戶,將憑賬號申請獲得下一屆DApp開發者大會的門票

28 | 29 |
30 | 31 |

3、用戶產生內容,創建上鍊地標

32 | 33 |
34 | 35 |

用戶生成內容是區塊鏈應用中最重要的環節,玩家可以通過 TokenPocket 36 | 等手機錢包,在無人認領的地理位置創建地標,補充地標說明及圖片。通過審核的地標將被上傳到EOS區塊鏈上,成為可以自由交易的資產。除此之外,其他基於地理位置的區塊鏈遊戲,也可以基於這些地標進行遊戲。

37 | 38 |

為了防止用戶上傳垃圾信息,現階段,我們把地標的審核工作交給了幣聚社區的核心玩家,未來將完全開放給社區

39 | 40 |

4、土地交易遊戲 (將於2018年12月14日 8:00pm 開啟新一輪測試

41 | 42 |

4.1【地球模塊】國家交易

43 | 44 |

我們開放過國家交易遊戲的兩輪內測,即將更新智能合約,將於2018年12月14日推出第三輪刪檔內測,玩法如下:

45 | 46 |

第三輪測試開放249個國家,每個國家Token的起始價格是 0.1 EOS,每次購買使得該國家的價格增長35%。下一次購買的金額先返回上一個玩家的本金,並將增值部分按照如下比例進行分配:

47 | 48 | 54 | 55 |

4.2 【地圖模塊】地標交易

56 | 57 |

玩家可以通過幣聚網站上傳來創建屬於自己的地標,幣聚將自動獲取地理位置參數、自定義價格;若想要自定義參數,可以去githubgithub上修改配置文件

58 | 59 |

下一個玩家購買該地標會率先返回上一個玩家的本金,並將增值部分按照如下比例進行分配:

60 | 61 | 70 | 71 |

分紅池說明

72 |

在幣聚"Token -> 分紅池"處抵押平台通證CMU,便可實時獲取當前項目收入的分紅,分紅將按照抵押CMU的比例進行發放。

73 | 74 |

倒計時說明

75 | 76 |

第三輪測試增加了倒計時功能,從30天開始減至0,每有 1 EOS流入智能合約用於購買土地,倒計時增加1分鐘,倒計時為0時最後購買的玩家贏得總獎池。

77 | 78 |

5、區塊鏈票務 (尚未開放)

79 | 80 | 85 | 86 |
87 | 88 |

CMU通證

89 | 90 |

幣聚的平台通證是 “CMU”。通證持有者可以通過抵押通證來分享幣聚平台的利潤分紅及參與平台去中心化自治。除此之外,CMU通證也是應用型通證,玩家可以使用CMU來購買遊戲資產。

91 | 92 |

如何獲得CMU通證

93 | 94 | 98 | 99 |

*在幣聚直接賣出CMU給智能合約,將被收取5%手續費;用戶間自由轉賬CMU免費。

100 | 101 | 102 | 109 | 110 |
111 |

(微信ID: DAppsDev)

-------------------------------------------------------------------------------- /src/i18n/about_zh_tw.md: -------------------------------------------------------------------------------- 1 | # CryptoMeetup項目說明 2 | 3 | ### 1. 開啟新一輪測試 4 | 5 | 下一輪測試開放249個國家,每個國家Token的起始價格是 0.1 EOS,每次購買使得該國家的價格增長35%。下一次購買的金額先返回上一個玩家的本金,並將增值部分按照如下比例進行分配: 6 | 7 | * 50%給到上一個玩家 8 | * 30%給到CMU持幣者 9 | * 10%進入獎池 10 | * 5%給上一輪測試中站崗的 11 | * 5%給推薦人 12 | 13 |  新一輪的測試中加入了倒計時,每次購買行為都將重置倒計時。倒計時時間跟獎池大小相關,遵從 t = 1 min+24 hrs - 獎池 / 2000 * 23.59 hrs,從24小時遞減到1分鐘。 14 | 15 |  注意:倒計時結束時,最後一個購買的玩家獲得獎池,所以土地信息將被刪檔。用戶持有的CMU不受影響。 -------------------------------------------------------------------------------- /src/i18n/en.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | import ABOUT_CONTENT from './about_en.html' 3 | 4 | export default { 5 | switch_lang: 'Switch Lang.', 6 | globe: 'Globe', 7 | map: 'Map', 8 | token_view: 'Token', 9 | about_view: 'About', 10 | login: 'Login', 11 | logout: 'Logout', 12 | back: 'Back', 13 | filter_country_or_region: 'Filter Country or Region', 14 | my_EOS: 'My EOS', 15 | my_CMU: 'My CMU', 16 | my_staked: 'My Staked', 17 | my_refund: 'My Refund', 18 | total_staked: 'Total Staked', 19 | my_dividend: 'My Dividend', 20 | total_dividend: 'Total Dividend', 21 | contract_supply: 'Contract Supply', 22 | contract_balance: 'Contract Balance', 23 | contract_price: 'Contract Price', 24 | 25 | payout_pool_tab: 'Payout Pool', 26 | my_assets_tab: 'My Assets', 27 | stake_tab: 'Stake', 28 | bancor_trade_tab: 'Bancor Trade', 29 | 30 | stake_btn: 'Stake', 31 | unstake_btn: 'Unstake', 32 | refund_btn: 'Refund', 33 | my_refundtime :'Refund waiting time', 34 | buy_btn: 'Buy', 35 | sell_btn: 'Sell', 36 | claim_btn: 'Claim', 37 | 38 | last_buyer: 'Latest Buyer', 39 | count_down: 'Count Down', 40 | prize_pool: 'Prize Pool', 41 | ABOUT_CONTENT, 42 | 43 | cmu_creator: 'Created by CryptoMeetup Team', 44 | powered_by: 'Powered By', 45 | 46 | stake_number_alert: 'How many CMU do you want to stake?', 47 | stake_successful_alert: 'CMU token Stake successful', 48 | stake_pay_attention_alert: 'Pay attention to My Staked changes later', 49 | stake_confirmed_btn: 'Confirmed', 50 | unstake_alert: 'How many CMU do you want to unstake?', 51 | unstake_success: 'Unstake success', 52 | claim_success: 'Claim dividend success', 53 | wait_alert: 'Please wait a moment', 54 | claim_fail: 'Claim dividend failed', 55 | buy_cmu_alert: 'How many EOS equivalent CMU do you want to purchase?', 56 | buy_cmu_success_alert: 'CMU token purchase was successful', 57 | after_buy_cmu_alert: 'Pay attention to CMU balance changes later', 58 | sell_cmu_alert: 'How many CMUs do you want to sell?', 59 | ok: 'OK', 60 | sell_cmu_success_alert: 'CMU sold successfully', 61 | after_sell_cmu_alert: 'Pay attention to EOS balance changes later', 62 | scatter_login_fail: 'Failed to login Scatter The users Scatter is locked. They have been notified and should unlock before continuing', 63 | scatter_login_success: 'You successful login in with scatter', 64 | 65 | buy_land_withApp_success: 'The transfer is successful and the data is automatically refreshed within 30 seconds to confirm if you are a new landlord. All transactions are subject to transaction records on the blockchain, and refunds are made if the purchase of the land fails.', 66 | buy_land_success_alert: 'Buy land success', 67 | buy_land_success_msg: 'The transfer has been submitted to the blockchain and the data is automatically refreshed after 30 seconds to confirm that the purchase was successful.', 68 | buy_land_success_comfm: 'Cool!', 69 | 70 | app_FTextBubble:'Exchange CMU to EOS', 71 | token_FTextBubble:'You can claim your dividend if your Dividend balance larger than zero.', 72 | refund_FtextBubble:'The refund will arrive after one day', 73 | 74 | input_title: 'Enter the title', 75 | input_description: 'Enter the description', 76 | input_nickname: 'Nickname', 77 | upload_photo: 'Upload image', 78 | confirm_update: 'Confirm', 79 | update_btn: 'Update', 80 | 81 | state_review: 'Review', 82 | state_owned: 'Owned', 83 | state_unopened: 'Unopened', 84 | state_occupied: 'Occupied', 85 | invite: 'Invite', 86 | 87 | create_portal: 'Create Portal', 88 | create_portal_btn: 'Create Portal', 89 | server_error_alert: 'There is some thing wrong with server', 90 | fill_information_alert: 'Please fill the full landmark information', 91 | update_prefix: 'Update', 92 | create_prefix: 'Create', 93 | landmark_success_suffix: 'landmark success', 94 | 95 | vote_btn: 'Vote', 96 | current_vote: 'Current Vote', 97 | vote_address: 'Vote Address', 98 | 99 | open_thermodynamic_chart: 'open thermodynamic chart', 100 | close_thermodynamic_chart: 'close thermodynamic chart', 101 | 102 | buy_portal: 'Buy', 103 | buy_portal_error: 'Intelligent contract did not find this landmark', 104 | buy_portal_success: 'Buy portal success', 105 | 106 | my_portal_nav: 'My portal', 107 | my_portal_title: 'My portal', 108 | my_portal_no_time: 'No time', 109 | my_portal_name: 'name', 110 | my_portal_des: 'details', 111 | my_portal_price: 'price', 112 | 113 | jackpot_income: 'Game income', 114 | create_portal_income: 'Fee income', 115 | share_income: 'Share income', 116 | 117 | my_portal_creator: 'Creator', 118 | my_portal_owner: 'Owner', 119 | 120 | countryName: 'Sponsor {countryName}', 121 | newCountryName: 'To become the new sponsor of {countryName}, you need to pay {price}', 122 | countryNameScatter: 'Pay with Scatter Desktop', 123 | scatterDesktop: 'Scatter Desktop allows convenient transactions securely.', 124 | noScatter: 'Unable to detect Scatter Desktop.', 125 | wnlockScatter: 'If you would like to pay with Scatter Desktop, please open and unlock your Scatter Desktop, then refresh this page.', 126 | useScatter: 'If you don‘t have one, check out: [How to use Scatter](https://support.newdex.io/hc/en-us/articles/360016322611-How-to-Use-Scatter-Desktop)', 127 | loginScatter: 'Login with Scatter to Continue', 128 | scatterPay: 'Pay with Scatter', 129 | scatterAppPay: 'Pay with Wallet Apps', 130 | supportPay: 'We support[Math Wallet](http://www.mathwallet.org/en/),[Token Pocket](https://www.mytokenpocket.vip/en/)and[MEET.ONE](http://meet.one/)Scan QR code to pay:', 131 | appPay: 'Pay in Apps', 132 | loginPay: 'Login to Continue', 133 | appPayOk: 'I have paid with Wallet Apps', 134 | payClose: 'Close', 135 | loginSuccess: 'Check In Succeeded!', 136 | copy: 'Copy', 137 | sponsor: 'Sponsor', 138 | yuoBuy: 'This country is brought to you by @{owner}', 139 | priceNum: 'Pay {price} to be the new sponsor', 140 | countryNameActivity: 'Meetups in {countryName}', 141 | noActivity: 'There is no meetup.', 142 | checkIn: 'Check In', 143 | inviteFriends: 'Invite friends to get rewards', 144 | online: 'Online', 145 | offline: 'Offline', 146 | loginFailed: 'Email or Password Incorrect', 147 | invitationSent: 'Invitation Sent', 148 | invitationSentFailed: 'Invitation Sent Failed', 149 | friends: 'Friends', 150 | notifications: 'Notifications', 151 | createSubscription: 'Create Subscription', 152 | createSubscriptionSuccess: 'Subscription Created', 153 | createSubscriptionFailed: 'Failed to create subscription', 154 | subscribe: 'Subscribe', 155 | searchSubscription: 'Search Available Subscription' 156 | }; 157 | -------------------------------------------------------------------------------- /src/i18n/index.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | import Vue from 'vue'; 3 | import VueI18n from 'vue-i18n'; 4 | 5 | import zh from './zh'; 6 | import en from './en'; 7 | import ja from './jp'; 8 | import ko from './ko'; 9 | import ru from './ru'; 10 | import zh_tw from './zh_tw'; 11 | 12 | Vue.use(VueI18n); 13 | 14 | export default new VueI18n({ 15 | locale: 'en', 16 | fallbackLocale: 'en', 17 | messages: { 18 | en, 19 | ja, 20 | ko, 21 | ru, 22 | zh, 23 | zh_tw 24 | }, 25 | }); 26 | -------------------------------------------------------------------------------- /src/i18n/jp.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | import ABOUT_CONTENT from './about_jp.html'; 3 | 4 | export default { 5 | switch_lang: '他の言語', 6 | globe: '地球', 7 | map: '地図', 8 | token_view: 'トークン', 9 | about_view: 'お問い合わせ', 10 | login: 'ログイン', 11 | logout: 'ログアウト ', 12 | back: '戻り', 13 | filter_country_or_region: '国家とエリアの選択', 14 | my_EOS: '私のEOS', 15 | my_CMU: '私のCMU', 16 | my_staked: '私の抵当', 17 | my_refund: '私の払い戻し', 18 | total_staked: '抵当合計', 19 | my_dividend: '私の配当金', 20 | total_dividend: '配当金合計', 21 | contract_supply: '契約供給', 22 | contract_balance: '契約敷金', 23 | contract_price: '契約価格', 24 | 25 | payout_pool_tab: '配当金プール', 26 | my_assets_tab: '私の資産', 27 | stake_tab: '抵当', 28 | bancor_trade_tab: 'バンコアの取引', 29 | 30 | stake_btn: '抵当', 31 | unstake_btn: '抵押をキャンセル', 32 | refund_btn: '払い戻し', 33 | my_refundtime :'払い戻し待ち時間', 34 | buy_btn: '買う', 35 | sell_btn: '売る', 36 | claim_btn: '配当金の貰い', 37 | 38 | last_buyer: '最後の購入者', 39 | count_down: '残り時間', 40 | prize_pool: '賞池', 41 | ABOUT_CONTENT, 42 | 43 | cmu_creator: 'クラッシュアップチームが力を入れて作った', 44 | powered_by: 'Powered By', 45 | 46 | stake_number_alert: 'いくつのCMUを住宅ローンにしたいですか? ', 47 |   stake_successful_alert: 'CMUトークンモーゲージ成功', 48 |   stake_pay_attention_alert:'「私のStakedを見てください」後で、', 49 |   stake_confirmed_btn: '確認', 50 |   unstake_alert: 'どのくらいのCMUを取り消したいですか? ', 51 |   unstake_success:'「住宅ローンの成功を元に戻す」', 52 |   claim_success: '配当を正しくインポートする', 53 |   wait_alert:'「お待ちください」', 54 |   claim_fail: '抽出に失敗しました', 55 |   buy_cmu_alert: 'EOS相当のCMUはいくつ購入しますか? ', 56 |   buy_cmu_success_alert: 'CMUトークンの購入に成功しました', 57 |   after_buy_cmu_alert: '後でCMU残高の変更に注意を払う', 58 |   sell_cmu_alert: 'あなたは売りたいCMUをいくつですか? ', 59 |   oK:'「良い」', 60 |   sell_cmu_success_alert: 'CMU販売に成功しました', 61 |   after_sell_cmu_alert: '後でEOS残高の変更に注意を払う', 62 |   scatter_login_fail: 'スキャッタ・ログインに失敗しました:ユーザーのスキャッタ・ウォレットがロックされ、次の手順に進む前にユーザーに通知されました。', 63 |   scatter_login_success: 'スキャッタウォレットを使用してログインに成功しました', 64 | 65 |   buy_land_withApp_success: '転送に成功し、30秒以内に自動的にデータを更新すると、あなたが新しい家主であるかどうかを確認できます。すべての取引はブロックチェーンの取引記録の対象となり、土地の購入が失敗した場合は払い戻しが行われます。 ', 66 |   buy_land_success_alert: '「成功した購入」', 67 |   buy_land_success_msg: '転送がブロックチェーンに送信されました.30秒後にデータが自動的に更新され、購入が成功したかどうかが確認されます。 ', 68 | buy_land_success_comfm: 'OK', 69 | 70 | token_FTextBubble:'配当の残高がゼロよりも大きい場合は、配当を請求することができます。', 71 | app_FTextBubble:'Exchange CMUからEOSへの交換', 72 | refund_FtextBubble:'払い戻しは1日後に到着します', 73 | 74 | input_title: '目印名を入力してください', 75 | input_description: '目印の説明を入力してください', 76 | input_nickname: 'ニックネーム', 77 | upload_photo: 'ランドマーク画像をアップロードする', 78 | confirm_update: '確認', 79 | update_btn: '更新', 80 | 81 | state_review: '審査中', 82 | state_owned: '持っている', 83 | state_unopened: '領主がない', 84 | state_occupied: '占領した', 85 | invite: '招待状', 86 | 87 | create_portal: '作成地入札', 88 | create_portal_btn: '作成地マーク', 89 | server_error_alert: 'サーバーが小差した', 90 | fill_information_alert: '完全なマークの情報を記入してください', 91 | update_prefix: '更新', 92 | create_prefix: '作成', 93 | landmark_success_suffix: '地札が成功する', 94 | 95 | vote_btn: '投票する', 96 | current_vote: '現在の投票', 97 | vote_address: '議決権行使アドレス', 98 | 99 | open_thermodynamic_chart: '熱力図を開く', 100 | close_thermodynamic_chart: '熱力図を閉じる', 101 | 102 | buy_portal: '地札を買う', 103 | buy_portal_error: 'スマートな契約はこのマークが見つかりません', 104 | buy_portal_success: '買い付けが成功する', 105 | 106 | my_portal_nav: '私の地札', 107 | my_portal_title: '私の持っている地盤', 108 | my_portal_no_time: '見送る', 109 | my_portal_name: '名称', 110 | my_portal_des: '詳細', 111 | my_portal_price: '価格', 112 | 113 | // 以下修改确认,确认后请删除这条注释 114 | portal_income: '不動産収入', 115 | share_income: '推薦収入', 116 | create_portal_income: '収入をつくる', 117 | jackpot_income: '賞池収入', 118 | 119 | my_portal_creator: '創建者', 120 | my_portal_owner: '所有者', 121 | 122 | countryName: 'スポンサー{countryName}', 123 | newCountryName: '新しい{countryName}スポンサーになるには、{price}を支払う必要があります', 124 | countryNameScatter: 'Scatterデスクトップ版で支払います', 125 | scatterDesktop: 'Scatter Desktopは支払いをより便利で安全にします', 126 | noScatter: 'Scatterデスクトップを検出できません', 127 | wnlockScatter: 'Scatterデスクトップ版で支払いたい場合は、開き、ロックを解除してこのページを更新してください。', 128 | useScatter: 'まだお持ちでない方は、こちらをご覧ください。[How to use Scatter](https://support.newdex.io/hc/en-us/articles/360016322611-How-to-Use-Scatter-Desktop)', 129 | loginScatter: 'Scatterでログインし続けます', 130 | scatterPay: 'スキャターで支払う', 131 | scatterAppPay: '財布アプリで支払う', 132 | supportPay: '[Math Wallet](http://www.mathwallet.org/en/)、[Token Pocket](https://www.mytokenpocket.vip/en/)、[MEET.ONE](http://Meet.one/)スキャンコードの支払い:', 133 | appPay: 'アプリで支払います', 134 | loginPay: '続けるにはログインしてください', 135 | appPayOk: '私は支払いを完了するために財布アプリを使いました。', 136 | payClose: '閉じる', 137 | loginSuccess: 'ログイン成功', 138 | copy: 'コピーする', 139 | sponsor: 'スポンサー', 140 | yuoBuy: 'あなたは、@を買っ国{owner}', 141 | priceNum: '新しいスポンサーになるために{price}を支払う', 142 | countryNameActivity: '{countryName}アクティビティ', 143 | noActivity: '活動なし', 144 | checkIn: 'ログイン', 145 | inviteFriends: 'パートナーに報酬をもらう', 146 | online: 'Online', 147 | offline: 'Offline', 148 | loginFailed: 'Email or Password Incorrect', 149 | invitationSent: 'Invitation Sent', 150 | invitationSentFailed: 'Invitation Sent Failed', 151 | friends: 'Friends', 152 | notifications: 'Notifications', 153 | createSubscription: 'Create Subscription', 154 | createSubscriptionSuccess: 'Subscription Created', 155 | createSubscriptionFailed: 'Failed to create subscription', 156 | subscribe: 'Subscribe', 157 | searchSubscription: 'Search Available Subscription' 158 | }; 159 | -------------------------------------------------------------------------------- /src/i18n/ko.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | // const ABOUT_CONTENT = require('raw-loader!./about_zh.html'); 3 | import ABOUT_CONTENT from './about_ko.html'; 4 | 5 | export default { 6 | switch_lang: '스위치 언어', 7 | globe: '지구', 8 | map: '지도', 9 | token_view: '패스 카드', 10 | about_view: '정보', 11 | login: '로그인', 12 | logout: '로그 아웃', 13 | back: '뒤로', 14 | filter_country_or_region: '국가 또는 지역 선택', 15 | my_EOS: '내 EOS', 16 | my_CMU: '내 CMU', 17 | my_staked: '내 모기지', 18 | my_refund: '내 환불', 19 | my_refundtime :'환불 대기 시간', 20 | total_staked: '총 모기지', 21 | my_dividend: '나의 배당금', 22 | total_dividend: '총 배당금', 23 | contract_supply: '계약 유통', 24 | contract_balance: '계약 준비금', 25 | contract_price: '계약 통화 가격', 26 | 27 | payout_pool_tab: '빨간색 풀', 28 | my_assets_tab: '내 저작물', 29 | stake_tab: '모기지', 30 | bancor_trade_tab: 'Bancor 트랜잭션', 31 | 32 | stake_btn: '모기지', 33 | unstake_btn: '구독 취소', 34 | refund_btn: '환불', 35 | buy_btn: '구매', 36 | sell_btn: '판매', 37 | claim_btn: '배당금 수령', 38 | 39 | last_buyer: '마지막 구매자', 40 | count_down: '남은 시간', 41 | prize_pool: '상금 풀', 42 | ABOUT_CONTENT, 43 | 44 | cmu_creator: 'Cryptomeetup 팀에 의해 생성되었습니다', 45 | powered_by: '에 의해 제공', 46 | 47 | // 一些其他的翻译 48 | stake_number_alert: '얼마나 많은 CMU를 처분할까요?', 49 | stake_successful_alert: 'CMU 토큰 스테이크 성공', 50 | stake_pay_attention_alert: '나중에 내 Staked 변경 사항에주의하십시오.', 51 | stake_confirmed_btn: '확인 됨', 52 | unstake_alert: '스테이크 취소는 모든 스테이크 CMU를 취소합니다.', 53 | unstake_success: '성공적인 추출', 54 | claim_success: '청구 배당 성공', 55 | wait_alert: '참을성있게 기다려주세요.', 56 | claim_fail: '추출에 실패했습니다', 57 | buy_cmu_alert: '얼마나 많은 EOS에 해당하는 CMU를 구매 하시겠습니까?', 58 | buy_cmu_success_alert: 'CMU 토큰 구매 성공', 59 | after_buy_cmu_alert: '나중에 CMU 잔액 변경 사항에주의하십시오.', 60 | sell_cmu_alert: '나중에 CMU 잔액 변경 사항에주의하십시오.', 61 | ok: '승인', 62 | sell_cmu_success_alert: 'CMU 가 성공적으로 판매되었습니다.', 63 | after_sell_cmu_alert: '나중에 EOS 잔액 변화에주의하십시오.', 64 | scatter_login_fail: '로그인하지 못했습니다. 스 캐터 사용자가 스 캐터가 잠겨 있습니다. 계속 알림을 받고 계속하기 전에 잠금을 해제해야합니다.', 65 | scatter_login_success: '성공적인 분산 로그인', 66 | 67 | buy_land_withApp_success: '이전이 성공적으로 완료되고 새 집주인인지 확인하기 위해 30 초 이내에 데이터가 자동으로 새로 고쳐집니다. 모든 거래는 블록 체인의 거래 기록의 대상이되며, 토지 구입이 실패하면 환불됩니다.', 68 | buy_land_success_alert: '토지 성공 구입', 69 | buy_land_success_msg: '전송이 블록 체인에 제출되었으며 30 초 후에 데이터가 자동으로 새로 고쳐서 구매가 성공적으로 완료되었는지 확인합니다.', 70 | buy_land_success_comfm: '시원한!', 71 | 72 | token_FTextBubble:'배당금이 0보다 큰 경우 배당을 청구 할 수 있습니다.', 73 | app_FTextBubble:'EOS로 CMU 교환', 74 | refund_FtextBubble:'하루 후에 환불이 도착할 것입니다.', 75 | 76 | input_title: '장소 표시 이름을 입력하십시오', 77 | input_description: '장소 표시에 대한 설명을 입력하십시오', 78 | input_nickname: '닉네임', 79 | upload_photo: '랜드 마크 이미지 업로드', 80 | confirm_update: '확인', 81 | update_btn: 'Update', 82 | 83 | state_review: '심사중', 84 | state_owned: '이미 소유하다', 85 | state_unopened: '무령주', 86 | state_occupied: '점령하다', 87 | invite: '초대장', 88 | 89 | create_portal: '지표 만들기', 90 | create_portal_btn: '지표 만들기', 91 | server_error_alert: '서버 다운로드', 92 | fill_information_alert: '전체 표시 정보', 93 | update_prefix: '갱신', 94 | create_prefix: '생성', 95 | landmark_success_suffix: '지표가 성공하다', 96 | 97 | vote_btn: '투표', 98 | current_vote: '현재 투표', 99 | vote_address: '투표소 주소', 100 | 101 | open_thermodynamic_chart: '열도를 열다', 102 | close_thermodynamic_chart: '열도 닫기', 103 | 104 | buy_portal: '지표를 구입하다.', 105 | buy_portal_error: '스마트 계약 찾을 수 없음', 106 | buy_portal_success: '지표 구매가 성공하다', 107 | 108 | my_portal_nav: '나의 지표', 109 | my_portal_title: '내가 가진 지표', 110 | my_portal_no_time: '없다', 111 | my_portal_name: '명칭.', 112 | my_portal_des: '상세한 상황', 113 | my_portal_price: '가격.', 114 | 115 | // 以下修改确认,确认后请删除这条注释 116 | portal_income: '부동산 수입', 117 | share_income: '추천 수입', 118 | create_portal_income: '수입을 창건하다.', 119 | jackpot_income: '상장 수입', 120 | 121 | my_portal_creator: '공지 창건자', 122 | my_portal_owner: '지표 소유자', 123 | 124 | countryName: '스폰서{countryName}', 125 | newCountryName: '새로운 {countryName} 스폰서가 되시면 {price}를 (를) 지불해야합니다.', 126 | countryNameScatter: 'Scatter 데스크탑 버전으로 지불', 127 | scatterDesktop: 'Scatter Desktop은보다 편리하고 안전하게 결제 할 수 있습니다', 128 | noScatter: 'Scatter 데스크탑을 감지 할 수 없음', 129 | wnlockScatter: 'Scatter 데스크탑 버전으로 결제하려면이 페이지를 열고이 페이지를 새로 고침하십시오.', 130 | useScatter: '아직 보지 않았다면 다음을 참조하십시오 :[How to use Scatter](https://support.newdex.io/hc/en-us/articles/360016322611-How-to-Use-Scatter-Desktop)', 131 | loginScatter: 'Scatter로 계속 로그인하십시오.', 132 | scatterPay: 'Scatter로 지불', 133 | scatterAppPay: '지갑 앱으로 결제', 134 | supportPay: '우리는 [Math Wallet](http://www.mathwallet.org/en/), [Token Pocket](https://www.mytokenpocket.vip/en/)및 [MEET.ONE](http://Meet.one/)을 지원합니다. 스캔 코드 지불 :', 135 | appPay: '앱 지불', 136 | loginPay: '계속하려면 로그인하십시오.', 137 | appPayOk: '나는 지갑 응용 프로그램을 사용하여 지불을 완료했습니다.', 138 | payClose: '닫기', 139 | loginSuccess: '로그인 성공', 140 | copy: '복사', 141 | sponsor: '스폰서', 142 | yuoBuy: '당신은 @를 구입 한 국가 {owner}', 143 | priceNum: '{price}를 새로운 스폰서로 지불하십시오.', 144 | countryNameActivity: '{countryName} 활동', 145 | noActivity: '활동 없음', 146 | checkIn: '로그인', 147 | inviteFriends: '파트너를 초대하여 보상 받기', 148 | online: 'Online', 149 | offline: 'Offline', 150 | loginFailed: 'Email or Password Incorrect', 151 | invitationSent: 'Invitation Sent', 152 | invitationSentFailed: 'Invitation Sent Failed', 153 | friends: 'Friends', 154 | notifications: 'Notifications', 155 | createSubscription: 'Create Subscription', 156 | createSubscriptionSuccess: 'Subscription Created', 157 | createSubscriptionFailed: 'Failed to create subscription', 158 | subscribe: 'Subscribe', 159 | searchSubscription: 'Search Available Subscription' 160 | }; 161 | -------------------------------------------------------------------------------- /src/i18n/ru.js: -------------------------------------------------------------------------------- 1 | // const ABOUT_CONTENT = require('raw-loader!./about_zh.html'); 2 | import ABOUT_CONTENT from './about_ru.html'; 3 | 4 | export default { 5 | switch_lang: 'язык переключения', 6 | globe: 'Земля', 7 | map: 'Карта', 8 | token_view: 'карточка прохода', 9 | about_view: 'Для более', 10 | login: 'авторизоваться', 11 | logout: 'выход из системы', 12 | back: 'Назад', 13 | filter_country_or_region: 'Выберите страну', 14 | my_EOS: 'Мой EOS', 15 | my_CMU: 'Мой CMU', 16 | my_staked: 'Мой ипотечный кредит', 17 | my_refund: 'Мой возврат', 18 | my_refundtime :'Время ожидания возврата', 19 | total_staked: 'общая ипотека', 20 | my_dividend: 'Мой дивиденд', 21 | total_dividend: 'Общий дивиденд', 22 | contract_supply: 'Тираж контракта', 23 | contract_balance: 'Контракты резерв', 24 | contract_price: 'Валюта контракта', 25 | 26 | payout_pool_tab: 'Бонусный пул', 27 | my_assets_tab: 'Мои активы', 28 | stake_tab: 'ипотека', 29 | bancor_trade_tab: 'Bancor сделки', 30 | 31 | stake_btn: 'ипотека', 32 | unstake_btn: 'отменена ипотека', 33 | refund_btn: 'возвращение', 34 | buy_btn: 'Купить', 35 | sell_btn: 'продавать', 36 | claim_btn: 'Принимать дивиденды', 37 | 38 | last_buyer: 'покупатель последней инстанции', 39 | count_down: 'оставшееся время', 40 | prize_pool: 'Призовой фонд', 41 | ABOUT_CONTENT, 42 | 43 | cmu_creator: 'Создано командой Cryptomeetup', 44 | powered_by: 'Техническая поддержка', 45 | 46 | stake_number_alert: 'Количество заложенных CMU', 47 | stake_successful_alert: 'CMU Успех ипотеки Token', 48 | stake_pay_attention_alert: 'Обратите внимание на это позже. My Staked', 49 | stake_confirmed_btn: 'подтвердить', 50 | unstake_alert: 'Сколько вы хотите снять CMU ипотеку?', 51 | unstake_success: 'Ипотека успешно отозвана', 52 | claim_success: 'Успешно извлекать дивиденды', 53 | wait_alert: 'Пожалуйста, будьте терпеливы', 54 | claim_fail: 'Ошибка при извлечении', 55 | buy_cmu_alert: 'Сколько EOS эквивалентных CMU вы хотите купить?', 56 | buy_cmu_success_alert: 'CMU жетоны, чтобы купить успех', 57 | after_buy_cmu_alert: 'Обратите внимание на изменения баланса CMU позже', 58 | sell_cmu_alert: 'Сколько CMU вы хотите продать?', 59 | ok: 'хорошая', 60 | sell_cmu_success_alert: 'CMU успешно продан', 61 | after_sell_cmu_alert: 'Обратите внимание на изменения баланса EOS позже', 62 | scatter_login_fail: 'Ошибка входа в Scatter: кошелек пользователя Scatter был заблокирован, и пользователь был уведомлен, прежде чем перейти к следующему шагу', 63 | scatter_login_success: 'Успешно войти в систему, используя кошелек Scatter', 64 | 65 | buy_land_withApp_success: 'Передача выполнена успешно, и данные автоматически обновляются в течение 30 секунд, чтобы подтвердить, являетесь ли вы новым домовладельцем. Все транзакции подлежат записям транзакций на блок-цепочке, и возмещение производится, если покупка земли не удалась.', 66 | buy_land_success_alert: 'Успех покупки', 67 | buy_land_success_msg: 'Передача была передана блочной цепочке, и данные автоматически обновляются после 30 секунд, чтобы подтвердить, что покупка прошла успешно.', 68 | buy_land_success_comfm: 'хорошая', 69 | 70 | token_FTextBubble:'Вы можете требовать свой дивиденд, если ваш баланс дивидендов больше нуля.', 71 | app_FTextBubble:'Обмен CMU на EOS', 72 | refund_FtextBubble:'Возврат прибудет через один день', 73 | 74 | input_title: 'Введите имя метки', 75 | input_description: 'Введите описание метки', 76 | input_nickname: 'nickname', 77 | upload_photo: 'Загрузить изображение ориентира', 78 | confirm_update: 'подтвердить', 79 | update_btn: 'Update', 80 | 81 | state_review: ' аудит', 82 | state_owned: ' владеть', 83 | state_unopened: 'без лидера', 84 | state_occupied: 'оккупация', 85 | invite: 'приглашение', 86 | 87 | create_portal: 'Создание ориентира ', 88 | create_portal_btn: 'Создание ориентира ', 89 | server_error_alert: 'сервер распускался.', 90 | fill_information_alert: 'Заполните, пожалуйста, полную информацию, пожалуйста', 91 | update_prefix: 'Обновить', 92 | create_prefix: 'Создать', 93 | landmark_success_suffix: 'успех ориентира был успешным', 94 | 95 | vote_btn: 'голосование', 96 | current_vote: 'Текущий голос', 97 | vote_address: 'Голосование', 98 | 99 | open_thermodynamic_chart: 'открытая тепловая карта ', 100 | close_thermodynamic_chart: 'закрытая тепловая карта ', 101 | 102 | buy_portal: 'покупка ориентира', 103 | buy_portal_error: 'смартизированный договор не найден.', 104 | buy_portal_success: 'покупка маяка', 105 | 106 | my_portal_nav: 'мой ориентир.', 107 | my_portal_title: ' У меня есть ориентир, который у меня есть', 108 | my_portal_no_time: 'Пока нет', 109 | my_portal_name: 'имя', 110 | my_portal_des: 'подробности', 111 | my_portal_price: 'цена', 112 | 113 | portal_income: 'доходы от недвижимости', 114 | share_income: 'рекомендуемый доход', 115 | create_portal_income: 'создать доход', 116 | jackpot_income: 'доход от медалей', 117 | 118 | my_portal_creator: 'основатель ориентира', 119 | my_portal_owner: 'землевладелец', 120 | 121 | countryName: 'Спонсоры{countryName}', 122 | newCountryName: 'Чтобы стать новым спонсором {countryName}, вам необходимо заплатить {price}', 123 | countryNameScatter: 'Оплата с настольной версией Scatter', 124 | scatterDesktop: 'Scatter Desktop делает оплату более удобной и безопасной', 125 | noScatter: 'Невозможно обнаружить рабочий стол Scatter', 126 | wnlockScatter: 'Если вы хотите оплатить настольную версию Scatter, откройте ее и разблокируйте, чтобы обновить эту страницу.', 127 | useScatter: 'Если вы еще этого не сделали, пожалуйста, смотрите:[How to use Scatter](https://support.newdex.io/hc/en-us/articles/360016322611-How-to-Use-Scatter-Desktop)', 128 | loginScatter: 'Продолжить вход с Scatter', 129 | scatterPay: 'Оплатить с помощью Scatter', 130 | scatterAppPay: 'Оплатить с помощью приложения кошелька', 131 | supportPay: 'Мы поддерживаем [Math Wallet](http://www.mathwallet.org/en/), [Token Pocket](https://www.mytokenpocket.vip/en/) и [MEET.ONE](http://Meet.one/) сканировать код оплаты:', 132 | appPay: 'Оплатить в приложении', 133 | loginPay: 'Войдите, чтобы продолжить', 134 | appPayOk: 'Я использовал приложение кошелька для завершения платежа.', 135 | payClose: 'близко', 136 | loginSuccess: 'Успешный вход', 137 | copy: 'копия', 138 | sponsor: 'Спонсоры', 139 | yuoBuy: 'Страна, где вы купили @ {owner}', 140 | priceNum: '{price}Заплатите, чтобы стать новым спонсором{price}', 141 | countryNameActivity: 'Встречи в {countryName}', 142 | noActivity: 'Нет активности', 143 | checkIn: 'войти', 144 | inviteFriends: 'Пригласите партнеров, чтобы получить награды', 145 | online: 'Online', 146 | offline: 'Offline', 147 | loginFailed: 'Email or Password Incorrect', 148 | invitationSent: 'Invitation Sent', 149 | invitationSentFailed: 'Invitation Sent Failed', 150 | friends: 'Friends', 151 | notifications: 'Notifications', 152 | createSubscription: 'Create Subscription', 153 | createSubscriptionSuccess: 'Subscription Created', 154 | createSubscriptionFailed: 'Failed to create subscription', 155 | subscribe: 'Subscribe', 156 | searchSubscription: 'Search Available Subscription' 157 | }; 158 | -------------------------------------------------------------------------------- /src/i18n/zh.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | // const ABOUT_CONTENT = require('raw-loader!./about_zh.html'); 3 | import ABOUT_CONTENT from './about_zh.html'; 4 | 5 | export default { 6 | switch_lang: '切换语言', 7 | globe: '地球', 8 | map: '地图', 9 | token_view: '通证', 10 | about_view: '关于', 11 | login: '登录', 12 | logout: '登出', 13 | back: '后退', 14 | filter_country_or_region: '选择国家或地区', 15 | my_EOS: '我的EOS', 16 | my_CMU: '我的CMU', 17 | my_staked: '我的抵押', 18 | my_refund: '我的退款', 19 | my_refundtime :'退款等待时间', 20 | total_staked: '合计抵押', 21 | my_dividend: '我的分红', 22 | total_dividend: '合计分红', 23 | contract_supply: '合约发行量', 24 | contract_balance: '合约储备金', 25 | contract_price: '合约币价', 26 | 27 | payout_pool_tab: '红利池', 28 | my_assets_tab: '我的资产', 29 | stake_tab: '抵押', 30 | bancor_trade_tab: 'Bancor 交易', 31 | 32 | stake_btn: '抵押', 33 | unstake_btn: '取消抵押', 34 | refund_btn: '退还', 35 | buy_btn: '购买', 36 | sell_btn: '卖出', 37 | claim_btn: '领取分红', 38 | 39 | last_buyer: '最后的买家', 40 | count_down: '剩余时间', 41 | prize_pool: '奖池', 42 | ABOUT_CONTENT, 43 | 44 | cmu_creator: '由 Cryptomeetup(币聚)团队倾力打造', 45 | powered_by: 'Powered By', 46 | 47 | stake_number_alert: '你要抵押多少CMU?', 48 | stake_successful_alert: 'CMU 代币抵押成功', 49 | stake_pay_attention_alert: '稍后留意 My Staked', 50 | stake_confirmed_btn: '确认', 51 | unstake_alert: '你要撤销抵押多少 CMU ?', 52 | unstake_success: '撤销抵押成功', 53 | claim_success: '提取分红成功', 54 | wait_alert: '请耐心等待', 55 | claim_fail: '提取失败', 56 | buy_cmu_alert: '你要购买多少 EOS 等值的 CMU ?', 57 | buy_cmu_success_alert: 'CMU 代币购买成功', 58 | after_buy_cmu_alert: '稍后留意 CMU 余额变动', 59 | sell_cmu_alert: '你要卖出多少CMU?', 60 | ok: '好的', 61 | sell_cmu_success_alert: 'CMU 成功卖出', 62 | after_sell_cmu_alert: '稍后留意 EOS 余额变动', 63 | scatter_login_fail: 'Scatter 登入失败:用户的 Scatter 钱包已被锁定,在进行下一步之前用户已经被通知', 64 | scatter_login_success: '成功使用 Scatter 钱包登录', 65 | 66 | buy_land_withApp_success: '转账成功,30 秒内自动刷新数据,即可确认你是否为新地主。一切以区块链上交易记录为准,购买地皮失败则退款。', 67 | buy_land_success_alert: '成功购买', 68 | buy_land_success_msg: '转账已提交到区块链,30 秒后自动刷新数据,即可确认是否购买成功。', 69 | buy_land_success_comfm: '好的', 70 | 71 | token_FTextBubble:'如果您的股息余额大于零,您可以申请股息。', 72 | app_FTextBubble:'将 CMU 交换到 EOS', 73 | refund_FtextBubble:'退款将在一天后到达', 74 | 75 | input_title: '请输入地标名称', 76 | input_description: '请输入地标描述', 77 | input_nickname: '昵称', 78 | upload_photo: '上传地标图片', 79 | confirm_update: '确认', 80 | update_btn: '更新', 81 | 82 | state_review: '审核中', 83 | state_owned: '已拥有', 84 | state_unopened: '无领主', 85 | state_occupied: '已占领', 86 | invite: '邀请', 87 | 88 | create_portal: '创建地标', 89 | create_portal_btn: '创建地标', 90 | server_error_alert: '服务器开小差了', 91 | fill_information_alert: '请填写完整地标信息', 92 | update_prefix: '更新', 93 | create_prefix: '创建', 94 | landmark_success_suffix: '地标成功', 95 | 96 | vote_btn: '投票', 97 | current_vote: '当前投票', 98 | vote_address: '投票地址', 99 | 100 | open_thermodynamic_chart: '打开热力图', 101 | close_thermodynamic_chart: '关闭热力图', 102 | 103 | buy_portal: '购买', 104 | buy_portal_error: '未在区块链中找到地标', 105 | buy_portal_success: '购买地标成功', 106 | 107 | my_portal_nav: '我的地标', 108 | my_portal_title: '我拥有的地标', 109 | my_portal_no_time: '暂无', 110 | my_portal_name: '名称', 111 | my_portal_des: '详情', 112 | my_portal_price: '价格', 113 | 114 | jackpot_income: '游戏收入', 115 | share_income: '推荐返佣', 116 | create_portal_income: '手续费收入', 117 | 118 | my_portal_creator: '创建者', 119 | my_portal_owner: '拥有者', 120 | 121 | countryName: '{countryName}赞助者', 122 | newCountryName: '成为新的 {countryName}赞助者, 您需要支付 {price}', 123 | countryNameScatter: '使用Scatter桌面版进行支付', 124 | scatterDesktop: 'Scatter桌面版使支付更加便利、安全', 125 | noScatter: '无法检测到Scatter桌面版', 126 | wnlockScatter: '如果你想使用Scatter桌面版支付,请将其打开并解锁之后,刷新此页面。', 127 | useScatter: '如您尚无,请参阅:[How to use Scatter](https://support.newdex.io/hc/en-us/articles/360016322611-How-to-Use-Scatter-Desktop)', 128 | loginScatter: '使用Scatter登录后继续', 129 | scatterPay: '使用Scatter支付', 130 | scatterAppPay: '使用钱包APP支付', 131 | supportPay: '我们支持[Math Wallet](http://www.mathwallet.org/en/),[Token Pocket](https://www.mytokenpocket.vip/en/)and[MEET.ONE](http://meet.one/)扫码支付:', 132 | appPay: '在APP中进行支付', 133 | loginPay: '登录继续', 134 | appPayOk: '我已使用钱包APP完成支付', 135 | payClose: '关闭', 136 | loginSuccess: '登录成功', 137 | copy: '复制', 138 | sponsor: '赞助者', 139 | yuoBuy: '该国家由您向 @{owner}购买', 140 | priceNum: '支付{price} 成为新的赞助者', 141 | countryNameActivity: '{countryName}活动', 142 | noActivity: '暂无活动', 143 | checkIn: '登录', 144 | inviteFriends: '邀请伙伴获得奖励', 145 | online: '在线', 146 | offline: '离线', 147 | loginFailed: '用户名或密码错误', 148 | invitationSent: '已发送邀请', 149 | invitationSentFailed: '邀请发送失败', 150 | friends: '朋友', 151 | notifications: '通知', 152 | createSubscription: '创建订阅', 153 | createSubscriptionSuccess: '创建成功', 154 | createSubscriptionFailed: '创建失败', 155 | subscribe: '订阅', 156 | searchSubscription: '搜索可用的订阅' 157 | }; 158 | -------------------------------------------------------------------------------- /src/i18n/zh_tw.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | // const ABOUT_CONTENT = require('raw-loader!./about_zh.html'); 3 | import ABOUT_CONTENT from './about_zh_tw.html'; 4 | 5 | export default { 6 | switch_lang: '切換語言', 7 | globe: '地球', 8 | map: '地圖', 9 | token_view: '通證', 10 | about_view: '關於', 11 | login: '登錄', 12 | logout: '登出', 13 | back: '後退', 14 | filter_country_or_region: '選擇國家或地區', 15 | my_EOS: '我的EOS', 16 | my_CMU: '我的CMU', 17 | my_staked: '我的抵押', 18 | my_refund: '我的退款', 19 | my_refundtime :'退款等待時間', 20 | total_staked: '合計抵押', 21 | my_dividend: '我的分紅', 22 | total_dividend: '合計分紅', 23 | contract_supply: '合約發行量', 24 | contract_balance: '合約儲備金', 25 | contract_price: '合約幣價', 26 | 27 | payout_pool_tab: '紅利池', 28 | my_assets_tab: '我的資產', 29 | stake_tab: '抵押', 30 | bancor_trade_tab: 'Bancor 交易', 31 | 32 | stake_btn: '抵押', 33 | unstake_btn: '取消抵押', 34 | refund_btn: '退還', 35 | buy_btn: '購買', 36 | sell_btn: '賣出', 37 | claim_btn: '領取分紅', 38 | 39 | last_buyer: '最後的買家', 40 | count_down: '剩余時間', 41 | prize_pool: '獎池', 42 | ABOUT_CONTENT, 43 | 44 | cmu_creator: '由 Cryptomeetup(幣聚)團隊傾力打造', 45 | powered_by: 'Powered By', 46 | 47 | stake_number_alert: '妳要抵押多少CMU?', 48 | stake_successful_alert: 'CMU 代幣抵押成功', 49 | stake_pay_attention_alert: '稍後留意 My Staked', 50 | stake_confirmed_btn: '確認', 51 | unstake_alert: '妳要撤銷抵押多少 CMU ?', 52 | unstake_success: '撤銷抵押成功', 53 | claim_success: '提取分紅成功', 54 | wait_alert: '請耐心等待', 55 | claim_fail: '提取失敗', 56 | buy_cmu_alert: '妳要購買多少 EOS 等值的 CMU ?', 57 | buy_cmu_success_alert: 'CMU 代幣購買成功', 58 | after_buy_cmu_alert: '稍後留意 CMU 余額變動', 59 | sell_cmu_alert: '妳要賣出多少CMU?', 60 | ok: '好的', 61 | sell_cmu_success_alert: 'CMU 成功賣出', 62 | after_sell_cmu_alert: '稍後留意 EOS 余額變動', 63 | scatter_login_fail: 'Scatter 登入失敗:用戶的 Scatter 錢包已被鎖定,在進行下壹步之前用戶已經被通知', 64 | scatter_login_success: '成功使用Scatter錢包登錄', 65 | 66 | buy_land_withApp_success: '轉賬成功,30 秒內自動刷新數據,即可確認妳是否為新地主。壹切以區塊鏈上交易記錄為準,購買地皮失敗則退款。', 67 | buy_land_success_alert: '成功購買', 68 | buy_land_success_msg: '轉賬已提交到區塊鏈,30秒後自動刷新數據,即可確認是否購買成功。', 69 | buy_land_success_comfm: '好的', 70 | 71 | token_FTextBubble:'如果您的股息余額大於零,您可以申請股息。', 72 | app_FTextBubble:'將CMU交換到EOS', 73 | refund_FtextBubble:'退款將在一天后到達', 74 | 75 | input_title: '請輸入地標名稱', 76 | input_description: '請輸入地標描述', 77 | input_nickname: '昵稱', 78 | upload_photo: '上傳地標圖片', 79 | confirm_update: '確認', 80 | update_btn: '更新', 81 | 82 | state_review: '審核中', 83 | state_owned: '已擁有', 84 | state_unopened: '無領主', 85 | state_occupied: '已占領', 86 | invite: '邀請', 87 | 88 | create_portal: '創建地標', 89 | create_portal_btn: '創建地標', 90 | server_error_alert: '服務器開小差了', 91 | fill_information_alert: '請填寫完整地標資訊', 92 | update_prefix: '更新', 93 | create_prefix: '創建', 94 | landmark_success_suffix: '地標成功', 95 | 96 | vote_btn: '投票', 97 | current_vote: '當前投票', 98 | vote_address: '投票地址', 99 | 100 | open_thermodynamic_chart: '打開熱力圖', 101 | close_thermodynamic_chart: '關閉熱力圖', 102 | 103 | buy_portal: '購買', 104 | buy_portal_error: '智慧合約未找到此地標', 105 | buy_portal_success: '購買地標成功', 106 | 107 | my_portal_nav: '我的地標', 108 | my_portal_title: '我擁有的地標', 109 | my_portal_no_time: '暫無', 110 | my_portal_name: '名稱', 111 | my_portal_des: '詳情', 112 | my_portal_price: '價格', 113 | 114 | jackpot_income: '遊戲收入', 115 | share_income: '推薦返佣', 116 | create_portal_income: '手續費收入', 117 | 118 | my_portal_creator: '創建者', 119 | my_portal_owner: '擁有者', 120 | 121 | countryName: '{countryName}贊助者', 122 | newCountryName: '成為新的 {countryName}贊助者, 您需要支付 {price}', 123 | countryNameScatter: '使用Scatter桌面版進行支付', 124 | scatterDesktop: 'Scatter案頭版使支付更加便利、安全', 125 | noScatter: '無法檢測到Scatter桌面版', 126 | wnlockScatter: '如果你想使用Scatter桌面版支付,請將其打開並解鎖之後,刷新此頁面。', 127 | useScatter: '如您尚無,請參閱:[How to use Scatter](https://support.newdex.io/hc/en-us/articles/360016322611-How-to-Use-Scatter-Desktop)', 128 | loginScatter: '使用Scatter登錄後繼續', 129 | scatterPay: '使用Scatter支付', 130 | scatterAppPay: '使用錢包APP支付', 131 | supportPay: '我們支持[Math Wallet](http://www.mathwallet.org/en/),[Token Pocket](https://www.mytokenpocket.vip/en/)and[MEET.ONE](http:// meet.one/)掃碼支付:', 132 | appPay: '在APP中進行支付', 133 | loginPay: '登錄繼續', 134 | appPayOk: '我已使用錢包APP完成支付', 135 | payClose: '關閉', 136 | loginSuccess: '登錄成功', 137 | copy: '複製', 138 | sponsor: '贊助者', 139 | yuoBuy: '該國家由您向 @{owner}購買', 140 | priceNum: '支付{price}作為新的讚助商', 141 | countryNameActivity: '{countryName}活動', 142 | noActivity: '暫無活動', 143 | checkIn: '登錄', 144 | inviteFriends: '邀請夥伴獲得獎勵', 145 | online: '在綫', 146 | offline: '離綫', 147 | loginFailed: '電郵或用戶密碼錯誤', 148 | invitationSent: '已发送邀请', 149 | invitationSentFailed: '邀请发送失败', 150 | friends: '朋友', 151 | notifications: '通知', 152 | createSubscription: '创建订阅', 153 | createSubscriptionSuccess: '创建成功', 154 | createSubscriptionFailed: '创建失败', 155 | subscribe: '订阅', 156 | searchSubscription: '搜索可用的订阅' 157 | }; -------------------------------------------------------------------------------- /src/libs/SimpleWallet/index.d.ts: -------------------------------------------------------------------------------- 1 | import { SimpleWalletCommonField, ExportedTransaction, IPay, ILoginRequest, ExportedLoginRequest } from "./interfaces"; 2 | export default class SimpleWalletApp { 3 | dappName: string; 4 | dappIcon: string; 5 | commonField: SimpleWalletCommonField; 6 | constructor(dappName: string, dappIcon?: string); 7 | pay(params: IPay): ExportedTransaction; 8 | transfer(params: IPay): ExportedTransaction; 9 | login(params: ILoginRequest): ExportedLoginRequest; 10 | } 11 | -------------------------------------------------------------------------------- /src/libs/SimpleWallet/index.js: -------------------------------------------------------------------------------- 1 | export default class SimpleWalletApp { 2 | constructor(dappName, dappIcon) { 3 | this.dappName = dappName; 4 | this.dappIcon = dappIcon; 5 | this.commonField = { 6 | protocol: 'SimpleWallet', 7 | version: '1.0', 8 | dappName, 9 | dappIcon, 10 | }; 11 | } 12 | pay(params) { 13 | return Object.assign({}, this.commonField, { action: 'transfer' }, params); 14 | } 15 | transfer(params) { 16 | return this.pay(params); 17 | } 18 | login(params) { 19 | return Object.assign({ action: 'login' }, params, this.commonField); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/libs/SimpleWallet/interfaces.d.ts: -------------------------------------------------------------------------------- 1 | export interface SimpleWalletCommonField { 2 | protocol: string; 3 | version: string; 4 | dappName?: string; 5 | dappIcon?: string; 6 | } 7 | export interface IPay { 8 | from?: string; 9 | to: string; 10 | amount: number; 11 | contract: string; 12 | symbol: string; 13 | precision: number; 14 | dappData?: string; 15 | desc?: string; 16 | expired: number; 17 | callback?: string; 18 | } 19 | export interface ExportedData { 20 | action: string; 21 | } 22 | export interface ExportedTransaction extends SimpleWalletCommonField, IPay, ExportedData { 23 | } 24 | export interface ExportedLoginRequest extends SimpleWalletCommonField, ILoginRequest, ExportedData { 25 | } 26 | export interface ILoginRequest { 27 | uuID: string; 28 | loginUrl: string; 29 | expired: number; 30 | loginMemo?: string; 31 | } 32 | -------------------------------------------------------------------------------- /src/main.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue'; 2 | import '@/util/prototypeExtend'; 3 | import '@/theme/icon.scss' 4 | import Buefy from 'buefy'; 5 | import VueMoment from 'vue-moment'; 6 | import Transitions from 'vue2-transitions'; 7 | import VueClipboard from 'vue-clipboard2'; 8 | import router from '@/router'; 9 | import store from '@/store'; 10 | import i18n from '@/i18n'; 11 | import API from '@/util/api'; 12 | import PriceFormatter from '@/util/priceFormatter'; 13 | import App from '@/App.vue'; 14 | 15 | Vue.config.productionTip = false; 16 | Vue.use(Buefy); 17 | Vue.use(VueMoment); 18 | Vue.use(Transitions); 19 | Vue.use(VueClipboard); 20 | Vue.use(PriceFormatter); 21 | Vue.use(API); 22 | 23 | new Vue({ 24 | router, 25 | store, 26 | i18n, 27 | render: h => h(App), 28 | }).$mount('#app'); 29 | 30 | document.querySelector('#load').remove(); 31 | -------------------------------------------------------------------------------- /src/router.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue'; 2 | import Router from 'vue-router'; 3 | import PreJS from 'prejs'; 4 | import store from '@/store'; 5 | 6 | Vue.use(Router); 7 | 8 | const router = new Router({ 9 | mode: 'history', 10 | routes: [ 11 | { 12 | path: '/globe', 13 | name: 'globe', 14 | component: () => import('@/views/GlobeView.vue'), 15 | beforeEnter: (to, from, next) => { 16 | store.commit('ui/setGlobalProgressVisible', true); 17 | store.commit('ui/setGlobalProgressValue', 0); 18 | const pre = new PreJS(); 19 | pre.on('progress', (progress) => { 20 | store.commit('ui/setGlobalProgressValue', progress); 21 | }); 22 | pre.on('complete', () => { 23 | store.commit('ui/setGlobalProgressVisible', false); 24 | next(); 25 | }); 26 | pre.load([ 27 | '/earth.jpg', 28 | '/starfield.png', 29 | '/weather.jpg', 30 | ]); 31 | }, 32 | }, 33 | { 34 | path: '/map', 35 | name: 'home', 36 | component: () => import('@/views/MapView.vue'), 37 | }, 38 | { 39 | path: '/oauth/:id', 40 | name: 'Oauth', 41 | component: () => import('@/views/Oauth.vue'), 42 | props: true 43 | } 44 | ], 45 | }); 46 | 47 | router.beforeEach((to, from, next) => { 48 | store.commit('ui/setGlobalSpinnerVisible', true); 49 | next(); 50 | }); 51 | router.afterEach(() => { 52 | store.commit('ui/setGlobalSpinnerVisible', false); 53 | }); 54 | 55 | export default router; 56 | -------------------------------------------------------------------------------- /src/store/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue'; 2 | import Vuex from 'vuex'; 3 | import { Toast } from 'buefy/dist/components/toast'; 4 | import ui from './ui'; 5 | import modules from '@/config/modules.js'; 6 | import { loginWithEmail, getUserProfile } from '../api/login' 7 | import { getCookie, setCookie, disassemble, removeCookie, clearAllCookie } from '../util/cookies' 8 | import Axios from 'axios'; 9 | 10 | Vue.use(Vuex); 11 | 12 | export default new Vuex.Store({ 13 | modules: { 14 | ui, 15 | }, 16 | state: { 17 | modulesConfig: modules, 18 | contractType: 'eos', 19 | isScatterConnected: false, 20 | balances: { 21 | eos: '0 EOS', 22 | cmu: '0 CMU', 23 | bos: '0 BOS' 24 | }, 25 | isLoggingIn: false, 26 | isLoadingData: false, 27 | landInfo: {}, 28 | landInfoUpdateAt: null, 29 | marketInfo: {}, 30 | stakedInfo: { 31 | staked: 0, 32 | refund: '0 CMU', 33 | }, 34 | myCheckInStatus: [], 35 | globalInfo: null, 36 | dividendInfo: { 37 | land_profit: 0, 38 | ref_profit: 0, 39 | fee_profit: 0, 40 | pool_profit: 0, 41 | staked_income: 0, 42 | council_income: 0, 43 | }, 44 | mapObject: {}, 45 | userProfile: { 46 | id: 0 47 | }, 48 | friends: '', 49 | notification: '', 50 | userId: 0, 51 | token: '', 52 | wallet: '' 53 | }, 54 | getters: { 55 | getUserProfile(state) { 56 | return state.userProfile 57 | } 58 | }, 59 | mutations: { 60 | setContractType(state, type) { 61 | state.contractType = type 62 | }, 63 | setLandInfo(state, landInfo) { 64 | state.landInfo = landInfo; 65 | state.landInfoUpdateAt = new Date(); 66 | }, 67 | setMarketInfo(state, marketInfo) { 68 | state.marketInfo = marketInfo; 69 | }, 70 | setStakedInfo(state, stakedInfo) { 71 | state.stakedInfo = stakedInfo; 72 | }, 73 | setGlobalInfo(state, globalInfo) { 74 | state.globalInfo = globalInfo; 75 | }, 76 | setIsLoggingIn(state, isLoggingIn) { 77 | state.isLoggingIn = isLoggingIn; 78 | }, 79 | setIsLoadingData(state, isLoadingData) { 80 | state.isLoadingData = isLoadingData; 81 | }, 82 | setIsScatterConnected(state, isScatterConnected) { 83 | state.isScatterConnected = isScatterConnected; 84 | }, 85 | setMyBalance(state, { symbol, balance }) { 86 | state.balances[symbol] = balance; 87 | }, 88 | setDividendInfo(state, dividendInfo) { 89 | state.dividendInfo = dividendInfo; 90 | }, 91 | setMyCheckInStatus(state, status) { 92 | state.myCheckInStatus = status; 93 | }, 94 | setUserProfile(state, userProfile) { 95 | state.userProfile = userProfile 96 | }, 97 | setMapObject(state, mapObject) { 98 | state.mapObject = mapObject 99 | }, 100 | setFriends(state, friends) { 101 | state.friends = friends 102 | }, 103 | setUserId(state, userId) { 104 | state.userId = userId 105 | }, 106 | setToken(state, token) { 107 | state.token = token 108 | }, 109 | setWallet(state, wallet) { 110 | state.wallet = wallet 111 | } 112 | }, 113 | actions: { 114 | async setToken({ commit }, data) { 115 | const accessToken = data 116 | setCookie('cryptomeetuptoken', accessToken) 117 | commit('setToken', accessToken) 118 | }, 119 | async logout({ commit }) { 120 | removeCookie('cryptomeetuptoken') 121 | clearAllCookie() 122 | commit('setIsLoggingIn', false) 123 | return true 124 | }, 125 | async setLoggedIn({ commit }, res) { 126 | console.log(res) 127 | const res2 = await getUserProfile(res.id) 128 | commit('setUserId', res.id) 129 | commit('setIsLoggingIn', true) 130 | commit('setUserProfile', res2.data.data) 131 | console.log(res2.data) 132 | Axios.get(process.env.VUE_APP_CMUAPI + '/user/login?id=' + res.id + '&email=undefined&nickname=' + res2.data.data.nickname + '&avatar=' + res2.data.data.avatar).then(r => { 133 | console.log(r) 134 | }) 135 | Axios({ 136 | url: process.env.VUE_APP_MATATAKIAPI + '/token/tokenlist?pagesize=999&order=0&page=1', 137 | method: 'GET', 138 | headers: { 'x-access-token': getCookie('cryptomeetuptoken') } 139 | }).then(res3 => { 140 | commit('setWallet', res3.data.data.list) 141 | }) 142 | }, 143 | async setMapObject({ commit }, map) { 144 | commit('setMapObject', map) 145 | }, 146 | async setWallet({ commit }, data) { 147 | commit('setWallet', data) 148 | }, 149 | async invite(context, data) { 150 | const arr = [] 151 | arr.push(data.email) 152 | const res = await Axios.get(process.env.VUE_APP_CMUAPI + '/invite?id=' + context.state.userId + '&email=' + data.email) 153 | if (res.data.status === 'failed') { 154 | Toast.open({ 155 | message: data.invitationSentFailedMsg, 156 | type: 'is-danger', 157 | duration: 4000, 158 | queue: false, 159 | }) 160 | } 161 | Toast.open({ 162 | message: data.invitationSentMsg, 163 | type: 'is-success', 164 | duration: 4000, 165 | queue: false, 166 | }) 167 | }, 168 | async acceptInvite(context, data) { 169 | Axios.get(process.env.VUE_APP_CMUAPI + '/invite/update?id=' + context.state.userId + '&result=accept¬ifyId=' + data.notifyId + '&inviteUser=' + data.userId) 170 | }, 171 | async denyInvite(context, data) { 172 | Axios.get(process.env.VUE_APP_CMUAPI + '/invite/update?id=' + context.state.userId + '&result=deny¬ifyId=' + data.notifyId + '&inviteUser=' + data.userId) 173 | } 174 | }, 175 | }); 176 | -------------------------------------------------------------------------------- /src/store/ui.js: -------------------------------------------------------------------------------- 1 | export default { 2 | namespaced: true, 3 | state: { 4 | navBurgerVisible: true, 5 | latestBuyerVisible: false, 6 | globalSpinnerVisible: false, 7 | globalProgressVisible: false, // if progress visible, then spinner will hide 8 | globalProgressValue: 0, // 0 ~ 1 9 | }, 10 | mutations: { 11 | setNavBurgerVisible(state, visible) { 12 | state.navBurgerVisible = visible; 13 | }, 14 | setGlobalSpinnerVisible(state, visible) { 15 | state.globalSpinnerVisible = visible; 16 | }, 17 | setGlobalProgressVisible(state, visible) { 18 | state.globalProgressVisible = visible; 19 | }, 20 | setGlobalProgressValue(state, value) { 21 | state.globalProgressValue = value; 22 | }, 23 | setLatestBuyerVisible(state, visible) { 24 | state.latestBuyerVisible = visible; 25 | }, 26 | }, 27 | }; 28 | -------------------------------------------------------------------------------- /src/theme/icon.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crypto-meetup-dev/cryptomeetup-portal/08790ef81987110c2781070820174fc1915552a6/src/theme/icon.scss -------------------------------------------------------------------------------- /src/util/ajax.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | 3 | import axios from 'axios'; 4 | const instance = axios.create({ 5 | timeout: 30000 6 | }); 7 | 8 | 9 | instance.interceptors.request.use(config => { 10 | config.url = config.url; 11 | return config; 12 | }, error => { 13 | return Promise.reject(error); 14 | }) 15 | 16 | 17 | instance.interceptors.response.use(response => { 18 | if (response.status === 200) { 19 | return response; 20 | } else { 21 | console.log('这里弹窗需要做 错误处理', response) 22 | } 23 | 24 | }, (error) => { 25 | return Promise.reject(error) 26 | }) 27 | 28 | export const ajax = instance 29 | 30 | export function analysis (api, data) { 31 | let url = '' 32 | for (let key in data) { 33 | if (url.indexOf('?') > -1) { 34 | url += `${'&' + key}=${data[key]}` 35 | } else { 36 | url += `?${key}=${data[key]}` 37 | } 38 | } 39 | return api + url 40 | } 41 | 42 | 43 | export default { ajax, analysis } -------------------------------------------------------------------------------- /src/util/api.js: -------------------------------------------------------------------------------- 1 | import ScatterJS from 'scatterjs-core'; 2 | import ScatterEOS from 'scatterjs-plugin-eosjs'; 3 | import Eos from 'eosjs'; 4 | import * as config from '@/config'; 5 | import PriceFormatter from './priceFormatter'; 6 | 7 | ScatterJS.plugins(new ScatterEOS()); 8 | 9 | function getInviteCode () { 10 | const inviteArr = window.location.hash.split('/invite/') 11 | return inviteArr.length === 2 ? inviteArr[1] : '' 12 | } 13 | 14 | // api https://get-scatter.com/docs/api-create-transaction 15 | 16 | // @trick: use function to lazy eval Scatter eos, in order to avoid no ID problem. 17 | const eos = () => ScatterJS.scatter.eos(config.network.eos, Eos, { expireInSeconds: 60 }); 18 | const currentEOSAccount = () => ScatterJS.scatter.identity && ScatterJS.scatter.identity.accounts.find(x => x.blockchain === 'eos'); 19 | 20 | const API = { 21 | async getMyStakedInfoAsync({ accountName }) { 22 | const { rows } = await eos().getTableRows({ 23 | json: true, 24 | code: 'cryptomeetup', 25 | scope: accountName, 26 | table: 'voters', 27 | limit: 1024, 28 | }); 29 | return rows; 30 | }, 31 | async getPlayerInfoAsync({ accountName }) { 32 | const { rows } = await eos().getTableRows({ 33 | json: true, 34 | code: 'cryptomeetup', 35 | scope: accountName, 36 | table: 'players', 37 | limit: 1024, 38 | }); 39 | return rows; 40 | }, 41 | async getBalancesByContract({ tokenContract = 'eosio.token', accountName, symbol }) { 42 | return eos().getCurrencyBalance(tokenContract, accountName, symbol); 43 | }, 44 | async getRefund() { 45 | const { rows } = await eos().getTableRows({ 46 | json: true, 47 | code: 'cryptomeetup', 48 | scope: currentEOSAccount().name, 49 | table: 'refunds', 50 | limit: 256, 51 | }); 52 | return rows; 53 | }, 54 | getNextPrice(land) { 55 | return land.price * 1.4; 56 | }, 57 | install(Vue) { 58 | Object.defineProperties(Vue.prototype, { 59 | $API: { 60 | get() { 61 | return API; 62 | }, 63 | }, 64 | }); 65 | }, 66 | transferEOSAsync({ 67 | to, 68 | memo = '', 69 | amount = 0, 70 | }) { 71 | return eos().transfer( 72 | currentEOSAccount().name, 73 | to, 74 | PriceFormatter.formatPrice(amount), 75 | getInviteCode() ? `${memo} ${getInviteCode()}` : memo, { 76 | authorization: [`${currentEOSAccount().name}@${currentEOSAccount().authority}`], 77 | }, 78 | ); 79 | }, 80 | async transferTokenAsync({ 81 | to, 82 | memo = '', 83 | amount = 0, 84 | tokenContract = 'eosio.token', 85 | }) { 86 | const contract = await eos().contract(tokenContract); 87 | 88 | return contract.transfer( 89 | currentEOSAccount().name, 90 | to, 91 | amount, 92 | getInviteCode() ? `${memo} ${getInviteCode()}` : memo, { 93 | authorization: [`${currentEOSAccount().name}@${currentEOSAccount().authority}`], 94 | }, 95 | ); 96 | }, 97 | async voteAsync({ 98 | to, 99 | tokenContract = 'cryptomeetup', 100 | }) { 101 | const contract = await eos().contract(tokenContract); 102 | return contract.vote( 103 | currentEOSAccount().name, 104 | to, { 105 | authorization: [`${currentEOSAccount().name}@${currentEOSAccount().authority}`], 106 | }, 107 | ); 108 | }, 109 | async stakeCMUAsync({ 110 | to, 111 | memo = '', 112 | amount = 0, 113 | tokenContract = 'dacincubator', 114 | }) { 115 | const contract = await eos().contract(tokenContract); 116 | return contract.transfer( 117 | currentEOSAccount().name, 118 | to, 119 | amount, 120 | getInviteCode() ? `${memo} ${getInviteCode()}` : memo, { 121 | authorization: [`${currentEOSAccount().name}@${currentEOSAccount().authority}`], 122 | }, 123 | ); 124 | }, 125 | async getCheckInRedeemCodeAsync() { 126 | const sha256lib = await import('js-sha256'); 127 | const token = String(Math.floor(Math.random() * 0xFFFFFF)); 128 | return sha256lib.sha256(token).slice(0, 10); 129 | }, 130 | async redeemCodeAsync({ code }) { 131 | if (code.length !== 10) { 132 | throw new Error('Invalid redeem code'); 133 | } 134 | const contract = await eos().contract('cryptomeetup'); 135 | return contract.checkin( 136 | currentEOSAccount().name, 137 | '0196d5b5d9ec1bc78ba927d2db2cb327d836f002601c77bd8c3f144a07ddc737', 138 | { authorization: [`${currentEOSAccount().name}@${currentEOSAccount().authority}`] }, 139 | ); 140 | }, 141 | async getMyCheckInStatus({ accountName }) { 142 | const { rows } = await eos().getTableRows({ 143 | json: true, 144 | code: 'cryptomeetup', 145 | scope: accountName, 146 | table: 'checkins', 147 | limit: 1024, 148 | }); 149 | return rows; 150 | }, 151 | }; 152 | 153 | export default API; 154 | export { eos, currentEOSAccount }; 155 | -------------------------------------------------------------------------------- /src/util/apis/eos.js: -------------------------------------------------------------------------------- 1 | import ScatterJS from 'scatterjs-core'; 2 | import ScatterEOS from 'scatterjs-plugin-eosjs'; 3 | import Eos from 'eosjs'; 4 | import * as config from '@/config'; 5 | import PriceFormatter from '../priceFormatter'; 6 | import Global from '@/Global.js'; 7 | 8 | ScatterJS.plugins(new ScatterEOS()); 9 | 10 | function getInviteCode() { 11 | const inviteArr = window.location.hash.split('/invite/') 12 | return inviteArr.length === 2 ? inviteArr[1] : '' 13 | } 14 | 15 | // api https://get-scatter.com/docs/api-create-transaction 16 | 17 | // @trick: use function to lazy eval Scatter eos, in order to avoid no ID problem. 18 | 19 | const eos = () => ScatterJS.scatter.eos(config.network[Global.contractType], Eos, { expireInSeconds: 60 }); 20 | export const currentEOSAccount = () => ScatterJS.scatter.identity && ScatterJS.scatter.identity.accounts.find(x => x.blockchain === 'eos'); 21 | 22 | export const api = { 23 | async getMyStakedInfoAsync({ accountName }) { 24 | const { rows } = await eos().getTableRows({ 25 | json: true, 26 | code: 'cryptomeetup', 27 | scope: accountName, 28 | table: 'voters', 29 | limit: 1024, 30 | }); 31 | return rows; 32 | }, 33 | async getPlayerInfoAsync({ accountName }) { 34 | const { rows } = await eos().getTableRows({ 35 | json: true, 36 | code: 'cryptomeetup', 37 | scope: accountName, 38 | table: 'players', 39 | limit: 1024, 40 | }); 41 | return rows; 42 | }, 43 | async getLandsInfoAsync() { 44 | const { rows } = await eos().getTableRows({ 45 | json: true, 46 | code: 'cryptomeetup', 47 | scope: 'cryptomeetup', 48 | table: 'land', 49 | limit: 256, 50 | }); 51 | return rows; 52 | }, 53 | async getPortalInfoAsync() { 54 | const { rows } = await eos().getTableRows({ 55 | json: true, 56 | code: 'cryptomeetup', 57 | scope: 'cryptomeetup', 58 | table: 'portal', 59 | limit: 256, 60 | }); 61 | return rows; 62 | }, 63 | async getMarketInfoAsync() { 64 | const { rows } = await eos().getTableRows({ 65 | json: true, 66 | code: 'cryptomeetup', 67 | scope: 'cryptomeetup', 68 | table: 'market', 69 | limit: 256, 70 | }); 71 | return rows; 72 | }, 73 | async getBalancesByContract({ 74 | tokenContract = 'eosio.token', 75 | accountName, 76 | symbol, 77 | contractType 78 | }) { 79 | console.log(contractType, 'contractType') 80 | if (contractType === 'eos') { 81 | return eos().getCurrencyBalance('dacincubator', accountName, symbol); 82 | } else if (contractType === 'bos') { 83 | return eos().getCurrencyBalance('ncldwqxpkgav', accountName, symbol); 84 | } 85 | return eos().getCurrencyBalance(tokenContract, accountName, symbol); 86 | }, 87 | async getRefund() { 88 | const { rows } = await eos().getTableRows({ 89 | json: true, 90 | code: 'cryptomeetup', 91 | scope: currentEOSAccount().name, 92 | table: 'refunds', 93 | limit: 256, 94 | }); 95 | return rows; 96 | }, 97 | getNextPrice(land) { 98 | return land.price * 1.4; 99 | }, 100 | install(Vue) { 101 | Object.defineProperties(Vue.prototype, { 102 | $API: { 103 | get() { 104 | return api; 105 | }, 106 | }, 107 | }); 108 | }, 109 | connectScatterAsync() { 110 | return ScatterJS.scatter.connect(config.appScatterName, { initTimeout: 2000 }); 111 | }, 112 | loginScatterAsync() { 113 | const requiredFields = { accounts: [config.network[Global.contractType]] }; 114 | return ScatterJS.scatter.getIdentity(requiredFields); 115 | }, 116 | logoutScatterAsync() { 117 | return ScatterJS.scatter.forgetIdentity(); 118 | }, 119 | transferEOSAsync({ 120 | to, 121 | symbol, 122 | memo = '', 123 | amount = 0, 124 | }) { 125 | return eos().transfer( 126 | currentEOSAccount().name, 127 | to, 128 | PriceFormatter.formatPrice(amount, symbol), 129 | getInviteCode() ? `${memo} ${getInviteCode()}` : memo, { 130 | authorization: [`${currentEOSAccount().name}@${currentEOSAccount().authority}`], 131 | }, 132 | ); 133 | }, 134 | async transferTokenAsync({ 135 | to, 136 | memo = '', 137 | amount = 0, 138 | tokenContract = 'eosio.token', 139 | }) { 140 | const contract = await eos().contract(tokenContract); 141 | 142 | return contract.transfer( 143 | currentEOSAccount().name, 144 | to, 145 | amount, 146 | getInviteCode() ? `${memo} ${getInviteCode()}` : memo, { 147 | authorization: [`${currentEOSAccount().name}@${currentEOSAccount().authority}`], 148 | }, 149 | ); 150 | }, 151 | async voteAsync({ 152 | to, 153 | tokenContract = 'cryptomeetup', 154 | }) { 155 | const contract = await eos().contract(tokenContract); 156 | return contract.vote( 157 | currentEOSAccount().name, 158 | to, { 159 | authorization: [`${currentEOSAccount().name}@${currentEOSAccount().authority}`], 160 | }, 161 | ); 162 | }, 163 | async refund() { 164 | const contract = await eos().contract('cryptomeetup'); 165 | await contract.refund( 166 | currentEOSAccount().name, 167 | { 168 | authorization: [`${currentEOSAccount().name}@${currentEOSAccount().authority}`], 169 | }, 170 | ); 171 | }, 172 | async claim() { 173 | const contract = await eos().contract('cryptomeetup'); 174 | await contract.claim( 175 | currentEOSAccount().name, 176 | { 177 | authorization: [`${currentEOSAccount().name}@${currentEOSAccount().authority}`], 178 | }, 179 | ); 180 | }, 181 | async stakeCMUAsync({ 182 | to, 183 | memo = '', 184 | amount = 0, 185 | tokenContract = 'cryptomeetup', 186 | }) { 187 | const contract = await eos().contract(tokenContract); 188 | return contract.transfer( 189 | currentEOSAccount().name, 190 | to, 191 | amount, 192 | getInviteCode() ? `${memo} ${getInviteCode()}` : memo, { 193 | authorization: [`${currentEOSAccount().name}@${currentEOSAccount().authority}`], 194 | }, 195 | ); 196 | }, 197 | async unStakeCMUAsync({ 198 | amount = 0 199 | }) { 200 | const contract = await eos().contract('cryptomeetup'); 201 | return contract.unstake( 202 | currentEOSAccount().name, 203 | amount, 204 | { 205 | authorization: [`${currentEOSAccount().name}@${currentEOSAccount().authority}`], 206 | }, 207 | ); 208 | }, 209 | async getCheckInRedeemCodeAsync() { 210 | const sha256lib = await import('js-sha256'); 211 | const token = String(Math.floor(Math.random() * 0xFFFFFF)); 212 | return sha256lib.sha256(token).slice(0, 10); 213 | }, 214 | async redeemCodeAsync({ code }) { 215 | if (code.length !== 10) { 216 | throw new Error('Invalid redeem code'); 217 | } 218 | const contract = await eos().contract('cryptomeetup'); 219 | return contract.checkin( 220 | currentEOSAccount().name, 221 | '0196d5b5d9ec1bc78ba927d2db2cb327d836f002601c77bd8c3f144a07ddc737', 222 | { authorization: [`${currentEOSAccount().name}@${currentEOSAccount().authority}`] }, 223 | ); 224 | }, 225 | async getMyCheckInStatus({ accountName }) { 226 | const { rows } = await eos().getTableRows({ 227 | json: true, 228 | code: 'cryptomeetup', 229 | scope: accountName, 230 | table: 'checkins', 231 | limit: 1024, 232 | }); 233 | return rows; 234 | }, 235 | }; 236 | 237 | export default { api, currentEOSAccount }; 238 | 239 | -------------------------------------------------------------------------------- /src/util/apis/index.js: -------------------------------------------------------------------------------- 1 | import { api, currentEOSAccount} from './eos.js'; 2 | 3 | 4 | function getApi(contractType) { 5 | if (contractType === 'eos' || contractType === 'bos') { 6 | return { 7 | api, 8 | currentEOSAccount 9 | } 10 | } 11 | } 12 | 13 | export default getApi 14 | -------------------------------------------------------------------------------- /src/util/cookies.js: -------------------------------------------------------------------------------- 1 | import Cookies from 'js-cookie'; 2 | 3 | export function getCookie(key) { 4 | return Cookies.get(key); 5 | } 6 | 7 | export function setCookie(key, val, options) { 8 | return Cookies.set(key, val, options); 9 | } 10 | 11 | export function removeCookie(key) { 12 | return Cookies.remove(key); 13 | } 14 | 15 | export function clearAllCookie() { 16 | // eslint-disable-next-line no-useless-escape 17 | const keys = document.cookie.match(/[^ =;]+(?=\=)/g); 18 | if (keys) { 19 | for (let i = keys.length; i--;) { 20 | document.cookie = keys[i] + '=0;expires=' + new Date(0).toUTCString(); 21 | } 22 | } 23 | } 24 | 25 | export function disassemble(token) { 26 | if (!token) return { iss: null, exp: 0, platform: null, id: null }; 27 | let tokenPayload = token.substring(token.indexOf('.') + 1); 28 | tokenPayload = tokenPayload.substring(0, tokenPayload.indexOf('.')); 29 | return JSON.parse(atob(tokenPayload)); 30 | } 31 | -------------------------------------------------------------------------------- /src/util/geo.js: -------------------------------------------------------------------------------- 1 | import getCountriesGeoJson from '@geo-maps/countries-coastline-10km'; 2 | import * as THREE from 'three'; 3 | import * as d3 from 'd3-geo'; 4 | 5 | function getMidpoint(point1, point2) { 6 | const midpointLon = (point1[0] + point2[0]) / 2; 7 | const midpointLat = (point1[1] + point2[1]) / 2; 8 | const midpoint = [midpointLon, midpointLat]; 9 | return midpoint; 10 | } 11 | 12 | /** 13 | * If the distance between two latitude and longitude values is 14 | * greater than five degrees, return true. 15 | */ 16 | function needsInterpolation(point2, point1) { 17 | const lon1 = point1[0]; 18 | const lat1 = point1[1]; 19 | const lon2 = point2[0]; 20 | const lat2 = point2[1]; 21 | const lonDis = Math.abs(lon1 - lon2); 22 | const latDis = Math.abs(lat1 - lat2); 23 | if (lonDis > 5 || latDis > 5) { 24 | return true; 25 | } 26 | return false; 27 | } 28 | 29 | function interpolatePoints(interpoArr) { 30 | // This function is recursive. It will continue to add midpoints to the 31 | // interpolation array until needsInterpolation() returns false. 32 | let ret = []; 33 | let point1; 34 | let point2; 35 | 36 | for (let pointIdx = 0; pointIdx < interpoArr.length - 1; pointIdx++) { 37 | point1 = interpoArr[pointIdx]; 38 | point2 = interpoArr[pointIdx + 1]; 39 | 40 | if (needsInterpolation(point2, point1)) { 41 | ret.push(point1); 42 | ret.push(getMidpoint(point1, point2)); 43 | } else { 44 | ret.push(point1); 45 | } 46 | } 47 | 48 | ret.push(interpoArr[interpoArr.length - 1]); 49 | 50 | if (ret.length > interpoArr.length) { 51 | ret = interpolatePoints(ret); 52 | } else { 53 | return ret; 54 | } 55 | return ret; 56 | } 57 | 58 | function createCoordinateArray(feature) { 59 | // Loop through the coordinates and figure out if the points need interpolation. 60 | const ret = []; 61 | let interpo = []; 62 | for (let pointIdx = 0; pointIdx < feature.length; pointIdx++) { 63 | const point1 = feature[pointIdx]; 64 | const point2 = feature[pointIdx - 1]; 65 | if (pointIdx > 0) { 66 | if (needsInterpolation(point2, point1)) { 67 | interpo = [point2, point1]; 68 | interpo = interpolatePoints(interpo); 69 | for (let interpoIdx = 0; interpoIdx < interpo.length; interpoIdx++) { 70 | ret.push(interpo[interpoIdx]); 71 | } 72 | } else { 73 | ret.push(point1); 74 | } 75 | } else { 76 | ret.push(point1); 77 | } 78 | } 79 | return ret; 80 | } 81 | 82 | function convertToSphereCoords(coordinates, radius, x, y, z) { 83 | const lon = coordinates[0]; 84 | const lat = coordinates[1]; 85 | x.push(Math.cos(lat * Math.PI / 180) * Math.cos(lon * Math.PI / 180) * radius); 86 | y.push(Math.cos(lat * Math.PI / 180) * Math.sin(lon * Math.PI / 180) * radius); 87 | z.push(Math.sin(lat * Math.PI / 180) * radius); 88 | } 89 | 90 | function buildLineMesh(x, y, z, material) { 91 | const geometry = new THREE.Geometry(); 92 | for (let i = 0; i < x.length; i++) { 93 | geometry.vertices.push(new THREE.Vector3( 94 | x[i], 95 | y[i], 96 | z[i], 97 | )); 98 | } 99 | const line = new THREE.Line(geometry, material); 100 | return line; 101 | } 102 | 103 | const Geo = { 104 | /** 105 | * Get the country code from lat lon. 106 | */ 107 | getCountryFromLatLng(lat, lon) { 108 | const countries = getCountriesGeoJson(); 109 | const len = countries.features.length; 110 | for (let i = 0; i < len; i++) { 111 | const country = countries.features[i]; 112 | if (d3.geoContains(country, [lon, lat])) { 113 | return country.properties.A3; 114 | } 115 | } 116 | return null; 117 | }, 118 | 119 | /** 120 | * Get a map from country ID to GeoJSON geometry. 121 | * @param {Object} geoJson 122 | */ 123 | getGeoJsonCountries() { 124 | const output = {}; 125 | const countries = getCountriesGeoJson(); 126 | countries.features.forEach((country) => { 127 | output[country.properties.A3] = country.geometry; 128 | }); 129 | return output; 130 | }, 131 | 132 | /** 133 | * Get a THREE.js line geometry from a GeoJson getmetry. 134 | */ 135 | buildLinesFromGeoJson(geometry, radius, material) { 136 | const meshes = []; 137 | 138 | let xValues = []; 139 | let yValues = []; 140 | let zValues = []; 141 | 142 | switch (geometry.type) { 143 | case 'LineString': 144 | { 145 | const coods = createCoordinateArray(geometry.coordinates); 146 | for (let coodIdx = 0; coodIdx < coods.length; coodIdx++) { 147 | convertToSphereCoords(coods[coodIdx], radius, xValues, yValues, zValues); 148 | } 149 | meshes.push(buildLineMesh(xValues, yValues, zValues, material)); 150 | break; 151 | } 152 | case 'Polygon': 153 | { 154 | for (let segIdx = 0; segIdx < geometry.coordinates.length; segIdx++) { 155 | const coods = createCoordinateArray(geometry.coordinates[segIdx]); 156 | for (let coodIdx = 0; coodIdx < coods.length; coodIdx++) { 157 | convertToSphereCoords(coods[coodIdx], radius, xValues, yValues, zValues); 158 | } 159 | meshes.push(buildLineMesh(xValues, yValues, zValues, material)); 160 | xValues = []; 161 | yValues = []; 162 | zValues = []; 163 | } 164 | break; 165 | } 166 | case 'MultiLineString': 167 | { 168 | for (let segIdx = 0; segIdx < geometry.coordinates.length; segIdx++) { 169 | const coods = createCoordinateArray(geometry.coordinates[segIdx]); 170 | for (let coodIdx = 0; coodIdx < coods.length; coodIdx++) { 171 | convertToSphereCoords(coods[coodIdx], radius, xValues, yValues, zValues); 172 | } 173 | meshes.push(buildLineMesh(xValues, yValues, zValues, material)); 174 | xValues = []; 175 | yValues = []; 176 | zValues = []; 177 | } 178 | break; 179 | } 180 | case 'MultiPolygon': 181 | { 182 | for (let polygonIdx = 0; polygonIdx < geometry.coordinates.length; polygonIdx++) { 183 | for (let segIdx = 0; segIdx < geometry.coordinates[polygonIdx].length; segIdx++) { 184 | const coods = createCoordinateArray(geometry.coordinates[polygonIdx][segIdx]); 185 | for (let coodIdx = 0; coodIdx < coods.length; coodIdx++) { 186 | convertToSphereCoords(coods[coodIdx], radius, xValues, yValues, zValues); 187 | } 188 | meshes.push(buildLineMesh(xValues, yValues, zValues, material)); 189 | xValues = []; 190 | yValues = []; 191 | zValues = []; 192 | } 193 | } 194 | break; 195 | } 196 | default: 197 | throw Error('Unsupported Geometry Type'); 198 | } 199 | return meshes; 200 | }, 201 | 202 | /** 203 | * Note: Not really used in code. 204 | * But it can generate `countryPoints.json` (padding = 2) 205 | */ 206 | getCountryPoints(padding) { 207 | return getCountriesGeoJson().features 208 | .map((country) => { 209 | const points = []; 210 | const bound = d3.geoBounds(country); 211 | const lonBegin = bound[0][0] - (bound[0][0] % padding); 212 | const lonEnd = bound[1][0] - (bound[1][0] % padding); 213 | const latBegin = bound[0][1] - (bound[0][1] % padding); 214 | const latEnd = bound[1][1] - (bound[1][1] % padding); 215 | if (lonBegin > lonEnd) { 216 | for (let lon = lonBegin; lon <= 180; lon += padding) { 217 | for (let lat = latBegin; lat <= latEnd; lat += padding) { 218 | if (d3.geoContains(country, [lon, lat])) { 219 | points.push(lon, lat); 220 | } 221 | } 222 | } 223 | for (let lon = -180; lon <= lonEnd; lon += padding) { 224 | for (let lat = latBegin; lat <= latEnd; lat += padding) { 225 | if (d3.geoContains(country, [lon, lat])) { 226 | points.push(lon, lat); 227 | } 228 | } 229 | } 230 | } else { 231 | for (let lon = lonBegin; lon <= lonEnd; lon += padding) { 232 | for (let lat = latBegin; lat <= latEnd; lat += padding) { 233 | if (d3.geoContains(country, [lon, lat])) { 234 | points.push(lon, lat); 235 | } 236 | } 237 | } 238 | } 239 | return { 240 | code: country.properties.A3, 241 | points, 242 | }; 243 | }); 244 | }, 245 | }; 246 | 247 | export default Geo; 248 | -------------------------------------------------------------------------------- /src/util/land.js: -------------------------------------------------------------------------------- 1 | import * as CountryCode from 'i18n-iso-countries'; 2 | 3 | const Land = { 4 | countryCodeToLandId(countryCode) { 5 | // TODO: Directly use country id code 6 | return Object.keys(CountryCode.getAlpha3Codes()).indexOf(countryCode); 7 | }, 8 | 9 | landIdToCountryCode(landId) { 10 | return Object.keys(CountryCode.getAlpha3Codes())[landId]; 11 | }, 12 | }; 13 | 14 | export default Land; 15 | -------------------------------------------------------------------------------- /src/util/priceFormatter.js: -------------------------------------------------------------------------------- 1 | const PriceFormatter = { 2 | formatPrice(price, unit = 'EOS') { 3 | return `${(price / 10000).toDecimal(4)} ${unit}`; 4 | }, 5 | install(Vue) { 6 | Vue.filter('price', (value, unit) => PriceFormatter.formatPrice(value, unit)); 7 | }, 8 | }; 9 | 10 | export default PriceFormatter; 11 | -------------------------------------------------------------------------------- /src/util/prototypeExtend.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | 3 | 'use strict' 4 | // 数字 prototype 开始-------------- 5 | const getPrecision = (a = 0) => ((a.toString().split('.')[1] || []).length) 6 | 7 | // 乘 8 | Number.prototype.mul = function (b) { 9 | var snReg = /[eE]+/ 10 | var d = this.toString() 11 | var e = b.toString() 12 | if (snReg.test(d) || snReg.test(e)) { 13 | return this * b 14 | } 15 | 16 | var c = 0 17 | c += getPrecision(d) 18 | c += getPrecision(e) 19 | return Number(d.replace('.', '')) * Number(e.replace('.', '')) / Math.pow(10, c) 20 | } 21 | 22 | // 除 23 | Number.prototype.div = function (arg) { 24 | var l1 = this.toString().indexOf('.') > 0 ? this.toString().split(".")[1].length : 0 25 | var l2 = arg.toString().indexOf('.') > 0 ? arg.toString().split(".")[1].length : 0 26 | 27 | var r1 = Number(this.toString().replace(".", "")) 28 | var r2 = Number(arg.toString().replace(".", "")) 29 | return (r1 / r2) * window.Math.pow(10, l2 - l1) 30 | } 31 | 32 | // 加 33 | Number.prototype.add = function (b) { 34 | var c, d, e 35 | c =getPrecision(this) 36 | d = getPrecision(b) 37 | return e = Math.pow(10, Math.max(c, d)), (this.mul(e) + b.mul(e)) / e 38 | } 39 | 40 | // 减 41 | Number.prototype.sub = function (b) { 42 | var c = getPrecision(this) 43 | var d = getPrecision(b) 44 | var e = Math.pow(10, Math.max(c, d)) 45 | return (this.mul(e) - Number(b).mul(e)) / e 46 | } 47 | 48 | // 向下保留几位小数 49 | Number.prototype.toDecimal = function (digit) { 50 | if (window.parseFloat(this).toString() === 'NaN') { 51 | return '' 52 | } 53 | 54 | if (!digit) { 55 | if (this.toString().indexOf('.') > 0) { 56 | const numArr = this.toString().split('.') 57 | return numArr[0] 58 | } 59 | return this 60 | } 61 | 62 | if (this.toString().indexOf('.') > 0) { 63 | const numArr = this.toString().split('.') 64 | 65 | if (numArr[1].length > digit) { 66 | return `${numArr[0]}.${numArr[1].slice(0, digit)}` 67 | } 68 | 69 | if (numArr[1].length === digit) { 70 | return this 71 | } 72 | 73 | const floating = '0'.repeat(digit - numArr[1].length) 74 | return `${numArr[0]}.${numArr[1]}${floating}` 75 | } 76 | 77 | return `${this}.${'0'.repeat(digit)}` 78 | } 79 | 80 | // 数字 prototype 结束---------------- 81 | -------------------------------------------------------------------------------- /src/util/storeUtil.js: -------------------------------------------------------------------------------- 1 | const formatKey = key => key.replace(/\W/g, '_'); 2 | 3 | export function setLocalStorage(key, value) { 4 | sessionStorage.setItem(formatKey(key), value); 5 | } 6 | 7 | export function getLocalStorage(key) { 8 | return sessionStorage.getItem(formatKey(key)); 9 | } 10 | 11 | export function removeLocalStorage(key) { 12 | sessionStorage.removeItem(formatKey(key)); 13 | } 14 | 15 | export default { setLocalStorage, getLocalStorage, removeLocalStorage }; 16 | -------------------------------------------------------------------------------- /src/views/About.vue: -------------------------------------------------------------------------------- 1 | 33 | 34 | 75 | 76 | 144 | -------------------------------------------------------------------------------- /src/views/GlobeView.vue: -------------------------------------------------------------------------------- 1 | 44 | 45 | 134 | 135 | 214 | -------------------------------------------------------------------------------- /src/views/Notifications.vue: -------------------------------------------------------------------------------- 1 | 41 | 42 | 180 | 181 | 305 | 344 | -------------------------------------------------------------------------------- /src/views/Oauth.vue: -------------------------------------------------------------------------------- 1 | 5 | 6 | 43 | -------------------------------------------------------------------------------- /src/views/location.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | 3 | import mapboxgl from 'mapbox-gl' 4 | import Vue from 'vue' 5 | import { ajax, analysis } from '@/util/ajax' 6 | import { getLocalStorage } from '@/util/storeUtil.js' 7 | import MyLocationComp from '@/components/landmark/MapMarkerLocation.vue' 8 | import createLocation from '@/components/landmark/createLocation.vue' 9 | import LocationPopupComp from '@/components/landmark/LocationPopup.vue' 10 | import i18n from '@/i18n' 11 | import Global from '../Global' 12 | import Axios from 'axios' 13 | 14 | const amap = new AMap.Map('amap', { 15 | resizeEnable: true 16 | }) 17 | 18 | const location = { 19 | map: null, 20 | myLocation: null, 21 | myLocationMarker: null, 22 | createLocationPopup: null, 23 | locationArr: null, 24 | locationPopup: null, 25 | locationPopupFn: null, 26 | locationPopupComp: null, 27 | myLocationNum: null, 28 | animationRespA: 0, 29 | animationRespB: 0, 30 | animationRespC: 0, 31 | isGetMylocation: false, 32 | isGetData: false, 33 | onMapLoaded(map, error, openImg, uid) { 34 | this.map = map 35 | this.errorCallback = error 36 | this.openImg = openImg 37 | this.getMyLocation(uid) 38 | this.interval() 39 | }, 40 | getLocation (callbacl) { 41 | const slef = this 42 | 43 | AMap.plugin('AMap.Geolocation', function () { 44 | var geolocation = new AMap.Geolocation({ 45 | enableHighAccuracy: true,//是否使用高精度定位,默认:true 46 | timeout: 10000, //超过10秒后停止定位,默认:5s 47 | buttonPosition: 'RB', //定位按钮的停靠位置 48 | buttonOffset: new AMap.Pixel(10, 20),//定位按钮与设置的停靠位置的偏移量,默认:Pixel(10, 20) 49 | zoomToAccuracy: true, //定位成功后是否自动调整地图视野到定位点 50 | }); 51 | 52 | amap.addControl(geolocation); 53 | geolocation.getCurrentPosition(function (status, result) { 54 | if (status == 'complete') { 55 | const coord = [result.position.lng, result.position.lat] 56 | slef.myLocationNum = coord 57 | callbacl(coord) 58 | } else { 59 | // slef.errorCallback(result.message) 60 | const center = amap.getCenter() 61 | const coord = [center.lng, center.lat] 62 | 63 | slef.myLocationNum = coord 64 | callbacl(coord) 65 | } 66 | }); 67 | }); 68 | }, 69 | getMyLocation (uid) { 70 | this.getLocation(coord => { 71 | Axios.get(process.env.VUE_APP_CMUAPI + `/user/update/position?id=${uid}&lng=${coord[0]}&lat=${coord[1]}`) 72 | this.map.flyTo({ center: coord, zoom: 13 }) 73 | this.addMyLocationComp(coord) 74 | this.isGetMylocation = true 75 | this.isGetData && this.getLocationArr(coord) 76 | !this.isGetData && this.touristGetData() 77 | }) 78 | }, 79 | addMyLocationComp (coord) { 80 | // 添加我的位置的icon 81 | this.myLocationMarker = new mapboxgl.Marker(new Vue(MyLocationComp).$mount().$el) 82 | this.myLocationMarker.setLngLat(coord).addTo(this.map) 83 | this.addCreatePupup(coord) 84 | }, 85 | addCreatePupup(coord) { 86 | // 创建地标的按钮 87 | const createLocationComp = new Vue({ ...createLocation, i18n}).$mount().$on('openCreatePopup', () => { 88 | // 点击创建 89 | this.openCreatePopup(coord) 90 | }) 91 | // 吧创建地标的按钮 append到地图上 92 | this.createLocationPopup = new mapboxgl.Popup({ 93 | offset: 25, 94 | closeButton: false, 95 | closeOnClick: false, 96 | className: 'create-location-popup' 97 | }).setDOMContent(createLocationComp.$mount().$el) 98 | 99 | // 添加展示地标以及创建地标popup 100 | this.locationPopupComp = new Vue({ ...LocationPopupComp, i18n}) 101 | this.locationPopupComp.$mount().$on('createLocation', () => { 102 | this.createLocationSuccess() 103 | }); 104 | this.locationPopupComp.$mount().$on('openImg', url => { 105 | this.openImg(url) 106 | }); 107 | this.locationPopupFn = new mapboxgl.Popup({ 108 | offset: 25, 109 | closeButton: false, 110 | }).setDOMContent(this.locationPopupComp.$mount().$el); 111 | }, 112 | openCreatePopup(coord) { 113 | // 打开创建地标的ui 114 | this.createLocationPopup.remove() 115 | this.locationPopupComp.$mount().setData(null, this.myLocationNum[0], this.myLocationNum[1]) 116 | this.locationPopupFn.setLngLat(coord).addTo(this.map) 117 | }, 118 | formatData (data) { 119 | const features = [] 120 | data.length && data.forEach(item => { 121 | if (+item.status === 1) { 122 | if (item.userId === getLocalStorage('userId') && 123 | item.dappId + '' !== 'null' && 124 | item.dappId + '' !== 'undefined' 125 | ) { 126 | features.push({ 127 | type: 'Feature', 128 | properties: item, 129 | geometry: { 130 | type: 'Point', 131 | coordinates: [item.longitude, item.latitude] 132 | } 133 | }) 134 | } 135 | } else { 136 | if (item.dappId + '' !== 'null' && 137 | item.dappId + '' !== 'undefined') { 138 | features.push({ 139 | type: 'Feature', 140 | properties: item, 141 | geometry: { 142 | type: 'Point', 143 | coordinates: [item.longitude, item.latitude] 144 | } 145 | }) 146 | } 147 | } 148 | }) 149 | 150 | this.locationArr = { 151 | type: 'FeatureCollection', 152 | features, 153 | } 154 | 155 | console.log('渲染用户') 156 | this.map.getSource('earthquakes') && this.map.removeSource('earthquakes') 157 | this.map.getLayer('clusters') && this.map.setLayoutProperty('clusters', 'visibility', 'none') 158 | this.map.getLayer('cluster-count') && this.map.setLayoutProperty('cluster-count', 'visibility', 'none') 159 | this.map.getLayer('unclustered-point') && this.map.setLayoutProperty('unclustered-point', 'visibility', 'none') 160 | setTimeout(() => { 161 | this.renderLocation('userload') 162 | }, 300); 163 | }, 164 | getLocationArr () { 165 | // 获取所有地标数组 166 | ajax.get(analysis('/pub/bt/point/distance1', { 167 | latitude: this.myLocationNum[1], 168 | longitude: this.myLocationNum[0], 169 | distance: 20000000, 170 | limit: 1000 171 | }), {headers: { 172 | Authorization: getLocalStorage('Authorization'), 173 | userId: getLocalStorage('userId') 174 | }}).then(resp => { 175 | resp.data.data.records && this.formatData(resp.data.data.records) 176 | resp.data.data.records && Global.$emit('portalList', resp.data.data.records) 177 | }) 178 | }, 179 | renderLocation (type) { 180 | this.map.addSource(type || 'earthquakes', { 181 | type: 'geojson', 182 | data: this.locationArr, 183 | cluster: true, 184 | clusterMaxZoom: 14, 185 | clusterRadius: 50 186 | }) 187 | 188 | this.map.addLayer({ 189 | id: type ? `${type}clusters` : "clusters", 190 | type: "circle", 191 | source: type || 'earthquakes', 192 | filter: ["has", "point_count"], 193 | paint: { 194 | "circle-color": ["step", ["get", "point_count"], "#8d7da3", 100, "#3a3146", 750, "#213b13"], 195 | "circle-radius": ["step", ["get", "point_count"], 20, 100, 30, 750, 40] 196 | } 197 | }) 198 | 199 | this.map.addLayer({ 200 | id: type ? `${type}cluster-count` : "cluster-count", 201 | type: "symbol", 202 | source: type || 'earthquakes', 203 | filter: ["has", "point_count"], 204 | layout: { 205 | "text-field": "{point_count_abbreviated}", 206 | "text-font": ["DIN Offc Pro Medium", "Arial Unicode MS Bold"], 207 | "text-size": 18, 208 | } 209 | }) 210 | 211 | this.map.addLayer({ 212 | id: type ? `${type}unclustered-point` : "unclustered-point", 213 | type: "circle", 214 | source: type || 'earthquakes', 215 | filter: ["!", ["has", "point_count"]], 216 | paint: { 217 | "circle-color": "transparent", // transparent 218 | "circle-radius": 8, 219 | "circle-stroke-width": 3, 220 | "circle-stroke-color": "transparent" 221 | } 222 | }) 223 | 224 | this.map.on('click', type ? `${type}clusters` : 'clusters', e => { 225 | const features = this.map.queryRenderedFeatures(e.point, { layers: [type ? `${type}clusters` : 'clusters'] }) 226 | const clusterId = features[0].properties.cluster_id 227 | this.map.getSource(type || 'earthquakes').getClusterExpansionZoom(clusterId, (err, zoom) => { 228 | if (err) { 229 | return 230 | } 231 | this.map.easeTo({ 232 | center: features[0].geometry.coordinates, 233 | zoom: zoom 234 | }) 235 | }) 236 | }) 237 | 238 | this.map.on('click', type ? `${type}unclustered-point` : 'unclustered-point', e => { 239 | const features = this.map.queryRenderedFeatures(e.point, { layers: [type ? `${type}unclustered-point` : 'unclustered-point'] }) 240 | this.openLocationPopup(features[0].properties) 241 | }) 242 | 243 | this.map.on('mouseenter', type ? `${type}clusters` : 'clusters', () => { 244 | this.map.getCanvas().style.cursor = 'pointer'; 245 | }) 246 | 247 | this.map.on('mouseleave', type ? `${type}clusters` : 'clusters', () => { 248 | this.map.getCanvas().style.cursor = ''; 249 | }) 250 | 251 | this.animation(type) 252 | }, 253 | animation(type) { 254 | if (!(this.animationRespB % 10)) { 255 | this.animationRespC < 10 ? this.animationRespC++ : this.animationRespC = 3 256 | this.map.setPaintProperty(type ? `${type}unclustered-point` : 'unclustered-point', 'circle-radius', this.animationRespC) 257 | 258 | if (this.animationRespC === 10) { 259 | this.map.setPaintProperty(type ? `${type}unclustered-point` : 'unclustered-point', 'circle-stroke-color', 'transparent') 260 | } else if (this.animationRespC > 5) { 261 | this.map.setPaintProperty(type ? `${type}unclustered-point` : 'unclustered-point', 'circle-stroke-color', '#4EFFF3') 262 | } 263 | } 264 | 265 | window.requestAnimationFrame(() => { 266 | this.animationRespB += 1 267 | this.animation(type) 268 | }) 269 | }, 270 | openLocationPopup(features) { 271 | // console.log(features, 'featuresfeaturesfeatures') 272 | // const data = JSON.parse(features.infos) 273 | this.locationPopupComp.$mount().setData(features, features.latitude, features.longitude) 274 | this.locationPopupFn.setLngLat([features.longitude, features.latitude]); 275 | this.locationPopupFn.addTo(this.map) 276 | }, 277 | createLocationSuccess () { 278 | // 创建地标成功 279 | this.locationPopupFn.remove() 280 | this.createLocationPopup.setLngLat(this.myLocationNum).addTo(this.map) 281 | }, 282 | interval () { 283 | setInterval(() => { 284 | if (!this.locationPopupFn || !this.createLocationPopup) { 285 | return false 286 | } 287 | if (!this.locationPopupFn.isOpen() && !this.createLocationPopup.isOpen() && getLocalStorage('name')) { 288 | this.createLocationPopup.setLngLat(this.myLocationNum).addTo(this.map) 289 | } 290 | }, 2000) 291 | }, 292 | opencreatePopup () { 293 | this.createLocationPopup && this.createLocationPopup.setLngLat(this.myLocationNum).addTo(this.map) 294 | }, 295 | getData () { 296 | this.isGetData = true 297 | this.isGetMylocation && this.getLocationArr(this.myLocationNum) 298 | }, 299 | touristGetData () { 300 | 301 | }, 302 | formattouristGetData (data) { 303 | const features = [] 304 | data.forEach(item => { 305 | features.push({ 306 | type: 'Feature', 307 | properties: item, 308 | geometry: { 309 | type: 'Point', 310 | coordinates: [item.longitude, item.latitude] 311 | } 312 | }) 313 | }) 314 | this.locationArr = { 315 | type: 'FeatureCollection', 316 | features, 317 | } 318 | console.log('渲染游客') 319 | this.renderLocation() 320 | }, 321 | updateLocation (fly) { 322 | if (this.map && fly) { 323 | this.getLocation(coord => { 324 | this.map.flyTo({ center: coord, zoom: 13 }) 325 | // this.myLocationMarker.setLngLat(coord).addTo(this.map) 326 | // this.createLocationPopup.setLngLat(coord).addTo(this.map) 327 | }) 328 | } 329 | }, 330 | updateToLocation (coord) { 331 | if (this.map) { 332 | console.log(coord) 333 | this.map.flyTo({ center: coord, zoom: 13 }) 334 | } 335 | } 336 | } 337 | 338 | export default location -------------------------------------------------------------------------------- /vue.config.js: -------------------------------------------------------------------------------- 1 | const webpack = require('webpack'); 2 | // eslint-disable-line import/no-extraneous-dependencies 3 | const protocol = process.env.HTTPS === 'true' ? 'https' : 'http'; 4 | // const path = require('path'); 5 | 6 | module.exports = { 7 | publicPath: process.env.NODE_ENV === 'production' ? '//cryptomeetup.async.moe' : '/', 8 | css: { 9 | loaderOptions: { 10 | sass: { 11 | data: '@import "@/global.scss";', 12 | }, 13 | }, 14 | }, 15 | configureWebpack: { 16 | module: { 17 | rules: [ 18 | { 19 | test: /\.html$/, 20 | use: 'raw-loader', 21 | } 22 | ], 23 | }, 24 | }, 25 | chainWebpack: (config) => { 26 | config 27 | .plugin('provide') 28 | .use(webpack.ProvidePlugin, [{ 29 | mapboxgl: 'mapbox-gl', 30 | }]); 31 | // 别动md的loader,这里就是这样的 32 | config.module.rule('md') 33 | .test(/\.md/) 34 | .use('raw-loader') 35 | .loader('raw-loader') 36 | .end(); 37 | config.module.rule('images').use('url-loader').loader('url-loader').tap(options => Object.assign(options, { limit: 10240 })); 38 | }, 39 | pluginOptions: { 40 | webpackBundleAnalyzer: { 41 | openAnalyzer: false, 42 | }, 43 | }, 44 | devServer: { 45 | host: '0.0.0.0', 46 | port: 7500, 47 | https: false 48 | }, 49 | }; 50 | --------------------------------------------------------------------------------