├── server ├── src │ ├── main │ │ ├── resources │ │ │ ├── public │ │ │ │ ├── favicon.ico │ │ │ │ ├── css │ │ │ │ │ └── app.c9128dab.css │ │ │ │ ├── index.html │ │ │ │ └── js │ │ │ │ │ ├── app.a6306686.js │ │ │ │ │ └── app.a6306686.js.map │ │ │ ├── application.properties │ │ │ └── data.json │ │ └── java │ │ │ └── com │ │ │ └── redis │ │ │ └── basicredisleaderboarddemojava │ │ │ ├── BasicRedisLeaderLoardDemoJavaApplication.java │ │ │ ├── security │ │ │ └── SecurityConfig.java │ │ │ └── controller │ │ │ ├── Api.java │ │ │ └── Utils.java │ └── test │ │ └── java │ │ └── com │ │ └── redis │ │ └── basicredisleaderboarddemojava │ │ └── BasicRedisLeaderLoardDemoJavaApplicationTests.java ├── Procfile ├── settings.gradle ├── .env.example ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── app.json ├── build.gradle ├── gradlew.bat └── gradlew ├── client ├── .browserslistrc ├── src │ ├── .browserslistrc │ ├── vue.config.js │ ├── babel.config.js │ ├── assets │ │ └── logo.png │ ├── plugins │ │ └── vuetify.js │ ├── main.js │ ├── .gitignore │ ├── README.md │ ├── .eslintrc.js │ ├── package.json │ ├── App.vue │ ├── components │ │ ├── RankSelectionModal.vue │ │ └── Example.vue │ └── redistheme.svg ├── vue.config.js ├── babel.config.js ├── .gitignore ├── README.md ├── .eslintrc.js └── package.json ├── settings.gradle ├── Procfile ├── 1.jpg ├── 2.jpg ├── 3.jpg ├── docs ├── 1.jpg ├── 1.png ├── 2.jpg ├── 2.png ├── 3.jpg ├── 3.png ├── 4.png ├── YTThumbnail.png └── screenshot001.png ├── .gitignore ├── images └── app_preview_image.png ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── app.json ├── docker-compose.yml ├── marketplace.json ├── gradlew.bat ├── README.md └── gradlew /server/src/main/resources/public/favicon.ico: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /client/.browserslistrc: -------------------------------------------------------------------------------- 1 | > 1% 2 | last 2 versions 3 | not dead 4 | -------------------------------------------------------------------------------- /client/src/.browserslistrc: -------------------------------------------------------------------------------- 1 | > 1% 2 | last 2 versions 3 | not dead 4 | -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'basic-multiproject' 2 | include 'server' -------------------------------------------------------------------------------- /Procfile: -------------------------------------------------------------------------------- 1 | web: java -Dserver.port=$PORT $JAVA_OPTS -jar server/build/libs/*.war 2 | -------------------------------------------------------------------------------- /server/Procfile: -------------------------------------------------------------------------------- 1 | web: java -Dserver.port=$PORT $JAVA_OPTS -jar build/libs/*.war 2 | -------------------------------------------------------------------------------- /server/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'basic-redis-leader-board-demo-java' 2 | -------------------------------------------------------------------------------- /1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redis-developer/basic-redis-leaderboard-demo-java/master/1.jpg -------------------------------------------------------------------------------- /2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redis-developer/basic-redis-leaderboard-demo-java/master/2.jpg -------------------------------------------------------------------------------- /3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redis-developer/basic-redis-leaderboard-demo-java/master/3.jpg -------------------------------------------------------------------------------- /client/vue.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | "transpileDependencies": [ 3 | "vuetify" 4 | ] 5 | } -------------------------------------------------------------------------------- /client/src/vue.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | "transpileDependencies": [ 3 | "vuetify" 4 | ] 5 | } -------------------------------------------------------------------------------- /docs/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redis-developer/basic-redis-leaderboard-demo-java/master/docs/1.jpg -------------------------------------------------------------------------------- /docs/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redis-developer/basic-redis-leaderboard-demo-java/master/docs/1.png -------------------------------------------------------------------------------- /docs/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redis-developer/basic-redis-leaderboard-demo-java/master/docs/2.jpg -------------------------------------------------------------------------------- /docs/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redis-developer/basic-redis-leaderboard-demo-java/master/docs/2.png -------------------------------------------------------------------------------- /docs/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redis-developer/basic-redis-leaderboard-demo-java/master/docs/3.jpg -------------------------------------------------------------------------------- /docs/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redis-developer/basic-redis-leaderboard-demo-java/master/docs/3.png -------------------------------------------------------------------------------- /docs/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redis-developer/basic-redis-leaderboard-demo-java/master/docs/4.png -------------------------------------------------------------------------------- /server/.env.example: -------------------------------------------------------------------------------- 1 | REDIS_URL= 2 | REDIS_HOST=localhost 3 | REDIS_PORT=6379 4 | REDIS_PASSWORD= 5 | REDIS_DB= -------------------------------------------------------------------------------- /client/babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: [ 3 | '@vue/cli-plugin-babel/preset' 4 | ] 5 | } 6 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Project exclude paths 2 | /.gradle/ 3 | /build/ 4 | /build/classes/java/main/ 5 | /build/classes/java/test/ -------------------------------------------------------------------------------- /client/src/babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: [ 3 | '@vue/cli-plugin-babel/preset' 4 | ] 5 | } 6 | -------------------------------------------------------------------------------- /docs/YTThumbnail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redis-developer/basic-redis-leaderboard-demo-java/master/docs/YTThumbnail.png -------------------------------------------------------------------------------- /docs/screenshot001.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redis-developer/basic-redis-leaderboard-demo-java/master/docs/screenshot001.png -------------------------------------------------------------------------------- /client/src/assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redis-developer/basic-redis-leaderboard-demo-java/master/client/src/assets/logo.png -------------------------------------------------------------------------------- /images/app_preview_image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redis-developer/basic-redis-leaderboard-demo-java/master/images/app_preview_image.png -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redis-developer/basic-redis-leaderboard-demo-java/master/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /server/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redis-developer/basic-redis-leaderboard-demo-java/master/server/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /client/src/plugins/vuetify.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue'; 2 | import Vuetify from 'vuetify/lib/framework'; 3 | 4 | Vue.use(Vuetify); 5 | 6 | export default new Vuetify({ 7 | }); 8 | -------------------------------------------------------------------------------- /client/src/main.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import App from './App.vue' 3 | import vuetify from './plugins/vuetify'; 4 | 5 | Vue.config.productionTip = false 6 | 7 | new Vue({ 8 | vuetify, 9 | render: h => h(App) 10 | }).$mount('#app') 11 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /server/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /server/app.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Spring(java) Redis leader board", 3 | "description": "Show how the redis works with Spring(java).", 4 | "repository": "https://github.com/", 5 | "logo": "https://redis.io/images/redis-white.png", 6 | "keywords": ["java", "spring", "redis"] 7 | } -------------------------------------------------------------------------------- /server/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | server.port=5000 2 | REDIS_URL= 3 | REDIS_HOST=localhost 4 | REDIS_PORT=6379 5 | REDIS_PASSWORD= 6 | REDIS_DB= 7 | REDIS_LEADERBOARD=REDIS_LEADERBOARD 8 | LEADERBOARD_DATA_READY=LEADERBOARD_DATA_READY 9 | KEY_PREFIX=leaderboard 10 | -------------------------------------------------------------------------------- /app.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Spring(java) Redis leader board", 3 | "description": "Show how the redis works with Spring(java).", 4 | "repository": "https://github.com/", 5 | "logo": "https://redis.io/images/redis-white.png", 6 | "keywords": ["java", "spring", "redis"], 7 | "addons": ["heroku-redis"] 8 | } -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3' 2 | 3 | services: 4 | redis: 5 | image: redis:latest 6 | container_name: redis.redisleaderboard.docker 7 | restart: unless-stopped 8 | ports: 9 | - 127.0.0.1:${REDIS_PORT}:6379 10 | networks: 11 | - global 12 | networks: 13 | global: 14 | external: true -------------------------------------------------------------------------------- /client/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | 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 | pnpm-debug.log* 14 | 15 | # Editor directories and files 16 | .idea 17 | .vscode 18 | *.suo 19 | *.ntvs* 20 | *.njsproj 21 | *.sln 22 | *.sw? 23 | -------------------------------------------------------------------------------- /client/src/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | 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 | pnpm-debug.log* 14 | 15 | # Editor directories and files 16 | .idea 17 | .vscode 18 | *.suo 19 | *.ntvs* 20 | *.njsproj 21 | *.sln 22 | *.sw? 23 | -------------------------------------------------------------------------------- /server/src/main/resources/public/css/app.c9128dab.css: -------------------------------------------------------------------------------- 1 | [data-v-6d7466c0] .v-data-table>.v-data-table__wrapper>table>thead>tr>th{color:#444}[data-v-6d7466c0] .v-data-table{color:#212529;font-weight:500}#app{font-family:Noto Sans JP,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;color:#2c3e50;margin-top:60px;background:#f4f4f4}pre{background:#f6f8fa;padding:3px 5px;display:inline} -------------------------------------------------------------------------------- /server/src/test/java/com/redis/basicredisleaderboarddemojava/BasicRedisLeaderLoardDemoJavaApplicationTests.java: -------------------------------------------------------------------------------- 1 | package com.redis.basicredisleaderboarddemojava; 2 | 3 | import org.junit.jupiter.api.Test; 4 | import org.springframework.boot.test.context.SpringBootTest; 5 | 6 | @SpringBootTest 7 | class BasicRedisLeaderLoardDemoJavaApplicationTests { 8 | 9 | @Test 10 | void contextLoads() { 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /client/README.md: -------------------------------------------------------------------------------- 1 | # client 2 | 3 | ## Project setup 4 | ``` 5 | yarn install 6 | ``` 7 | 8 | ### Compiles and hot-reloads for development 9 | ``` 10 | yarn serve 11 | ``` 12 | 13 | ### Compiles and minifies for production 14 | ``` 15 | yarn build 16 | ``` 17 | 18 | ### Lints and fixes files 19 | ``` 20 | yarn lint 21 | ``` 22 | 23 | ### Customize configuration 24 | See [Configuration Reference](https://cli.vuejs.org/config/). 25 | -------------------------------------------------------------------------------- /client/src/README.md: -------------------------------------------------------------------------------- 1 | # client 2 | 3 | ## Project setup 4 | ``` 5 | yarn install 6 | ``` 7 | 8 | ### Compiles and hot-reloads for development 9 | ``` 10 | yarn serve 11 | ``` 12 | 13 | ### Compiles and minifies for production 14 | ``` 15 | yarn build 16 | ``` 17 | 18 | ### Lints and fixes files 19 | ``` 20 | yarn lint 21 | ``` 22 | 23 | ### Customize configuration 24 | See [Configuration Reference](https://cli.vuejs.org/config/). 25 | -------------------------------------------------------------------------------- /client/.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | env: { 4 | node: true 5 | }, 6 | 'extends': [ 7 | 'plugin:vue/essential', 8 | 'eslint:recommended' 9 | ], 10 | parserOptions: { 11 | parser: 'babel-eslint' 12 | }, 13 | rules: { 14 | 'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off', 15 | 'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off' 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /client/src/.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | env: { 4 | node: true 5 | }, 6 | 'extends': [ 7 | 'plugin:vue/essential', 8 | 'eslint:recommended' 9 | ], 10 | parserOptions: { 11 | parser: 'babel-eslint' 12 | }, 13 | rules: { 14 | 'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off', 15 | 'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off' 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /server/src/main/java/com/redis/basicredisleaderboarddemojava/BasicRedisLeaderLoardDemoJavaApplication.java: -------------------------------------------------------------------------------- 1 | package com.redis.basicredisleaderboarddemojava; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | 7 | @SpringBootApplication 8 | public class BasicRedisLeaderLoardDemoJavaApplication { 9 | public static void main(String[] args) { 10 | SpringApplication.run(BasicRedisLeaderLoardDemoJavaApplication.class, args); 11 | 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /client/src/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Redis-Leaderboard-Demo", 3 | "version": "0.1.0", 4 | "private": true, 5 | "scripts": { 6 | "serve": "vue-cli-service serve", 7 | "build": "vue-cli-service build && mv ./dist ../core/static", 8 | "lint": "vue-cli-service lint" 9 | }, 10 | "dependencies": { 11 | "axios": "^0.21.0", 12 | "core-js": "^3.6.5", 13 | "country-flags-svg": "^1.1.0", 14 | "vue": "^2.6.11", 15 | "vuetify": "^2.2.11" 16 | }, 17 | "devDependencies": { 18 | "@vue/cli-plugin-babel": "~4.5.0", 19 | "@vue/cli-plugin-eslint": "~4.5.0", 20 | "@vue/cli-service": "~4.5.0", 21 | "babel-eslint": "^10.1.0", 22 | "eslint": "^6.7.2", 23 | "eslint-plugin-vue": "^6.2.2", 24 | "sass": "^1.19.0", 25 | "sass-loader": "^8.0.0", 26 | "vue-cli-plugin-vuetify": "~2.0.9", 27 | "vue-template-compiler": "^2.6.11", 28 | "vuetify-loader": "^1.3.0" 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /client/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Redis-Leaderboard-Demo", 3 | "version": "0.1.0", 4 | "private": true, 5 | "scripts": { 6 | "serve": "vue-cli-service serve", 7 | "build": "vue-cli-service build && mv ./dist/* ../server/src/main/resources/public/", 8 | "lint": "vue-cli-service lint" 9 | }, 10 | "dependencies": { 11 | "axios": "^0.21.1", 12 | "core-js": "^3.6.5", 13 | "country-flags-svg": "^1.1.0", 14 | "vue": "^2.6.11", 15 | "vuetify": "^2.2.11" 16 | }, 17 | "devDependencies": { 18 | "@vue/cli-plugin-babel": "~4.5.0", 19 | "@vue/cli-plugin-eslint": "~4.5.0", 20 | "@vue/cli-service": "~4.5.0", 21 | "babel-eslint": "^10.1.0", 22 | "eslint": "^6.7.2", 23 | "eslint-plugin-vue": "^6.2.2", 24 | "sass": "^1.19.0", 25 | "sass-loader": "^8.0.0", 26 | "vue-cli-plugin-vuetify": "~2.0.9", 27 | "vue-template-compiler": "^2.6.11", 28 | "vuetify-loader": "^1.3.0" 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /client/src/App.vue: -------------------------------------------------------------------------------- 1 | 16 | 17 | 27 | 28 | 45 | -------------------------------------------------------------------------------- /server/src/main/java/com/redis/basicredisleaderboarddemojava/security/SecurityConfig.java: -------------------------------------------------------------------------------- 1 | package com.redis.basicredisleaderboarddemojava.security; 2 | 3 | import org.springframework.context.annotation.Configuration; 4 | import org.springframework.security.config.annotation.web.builders.HttpSecurity; 5 | import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; 6 | import org.springframework.web.servlet.config.annotation.CorsRegistry; 7 | import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; 8 | 9 | @Configuration 10 | public class SecurityConfig extends WebSecurityConfigurerAdapter implements WebMvcConfigurer { 11 | @Override 12 | public void configure(HttpSecurity http) throws Exception { 13 | http.authorizeRequests().antMatchers("/**").permitAll(); 14 | http.csrf().disable().authorizeRequests().anyRequest().permitAll(); 15 | 16 | } 17 | @Override 18 | public void addCorsMappings(CorsRegistry registry) { 19 | registry.addMapping("/**") 20 | .allowedOrigins("*") 21 | .allowedMethods("*"); 22 | } 23 | } 24 | 25 | -------------------------------------------------------------------------------- /server/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'org.springframework.boot' version '2.4.1' 3 | id 'io.spring.dependency-management' version '1.0.10.RELEASE' 4 | id 'java' 5 | id 'war' 6 | 7 | } 8 | 9 | 10 | group = 'com.redis' 11 | version = '0.0.1-SNAPSHOT' 12 | sourceCompatibility = '1.8' 13 | 14 | configurations { 15 | compileOnly { 16 | extendsFrom annotationProcessor 17 | } 18 | } 19 | 20 | repositories { 21 | mavenCentral() 22 | } 23 | 24 | dependencies { 25 | implementation group: 'org.json', name: 'json', version: '20140107' 26 | implementation group: 'commons-io', name: 'commons-io', version: '2.8.0' 27 | implementation 'org.springframework.boot:spring-boot-starter-web' 28 | developmentOnly 'org.springframework.boot:spring-boot-devtools' 29 | testImplementation 'org.springframework.boot:spring-boot-starter-test' 30 | implementation 'org.springframework.boot:spring-boot-starter-security:2.4.1' 31 | implementation group: 'redis.clients', name: 'jedis', version: '3.5.1' 32 | providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat' 33 | } 34 | 35 | test { 36 | useJUnitPlatform() 37 | } 38 | 39 | apply plugin: 'application' 40 | apply plugin: "war" 41 | 42 | mainClassName = 'com.redis.basicredisleaderboarddemojava.BasicRedisLeaderLoardDemoJavaApplication' -------------------------------------------------------------------------------- /server/src/main/resources/public/index.html: -------------------------------------------------------------------------------- 1 | Redis-Leaderboard-Demo
-------------------------------------------------------------------------------- /marketplace.json: -------------------------------------------------------------------------------- 1 | { 2 | "app_name": "Basic Redis leaderboard example in Java (Spring)", 3 | "description": "Showcases how to impliment leaderboard appliation in Java (Spring)", 4 | "type": "Building Block", 5 | "contributed_by": "Redis", 6 | "repo_url": "https://github.com/redis-developer/basic-redis-leaderboard-demo-java", 7 | "preview_image_url": "https://raw.githubusercontent.com/redis-developer/basic-redis-leaderboard-demo-java/master/images/app_preview_image.png", 8 | "download_url": "https://github.com/redis-developer/basic-redis-leaderboard-demo-java/archive/main.zip", 9 | "hosted_url": "", 10 | "quick_deploy": "true", 11 | "deploy_buttons": [ 12 | { 13 | "heroku": "https://heroku.com/deploy?template=https://github.com/redis-developer/basic-redis-leaderboard-demo-java" 14 | }, 15 | { 16 | "Google": "https://deploy.cloud.run/?git_repo=https://github.com/redis-developer/basic-redis-leaderboard-demo-java.git" 17 | } 18 | ], 19 | "language": [ 20 | "Java" 21 | ], 22 | "redis_commands": [ 23 | "HSET", 24 | "ZADD", 25 | "ZREVRANGE", 26 | "ZRANGE", 27 | "ZREVRANGE", 28 | "ZSCORE", 29 | "ZINCRBY", 30 | "ZCOUNT" 31 | ], 32 | "redis_use_cases": [ 33 | "Leaderboard" 34 | ], 35 | "redis_features": [], 36 | "app_image_urls": [ 37 | "https://github.com/redis-developer/basic-redis-leaderboard-demo-java/blob/master/docs/screenshot001.png?raw=true" 38 | ], 39 | "youtube_url": "https://www.youtube.com/watch?v=zzinHxdZ34I", 40 | "special_tags": [], 41 | "verticals": [ 42 | "Others" 43 | ], 44 | "markdown": "https://raw.githubusercontent.com/redis-developer/basic-redis-leaderboard-demo-java/master/README.md" 45 | } -------------------------------------------------------------------------------- /gradlew.bat: -------------------------------------------------------------------------------- 1 | @rem 2 | @rem Copyright 2015 the original author or authors. 3 | @rem 4 | @rem Licensed under the Apache License, Version 2.0 (the "License"); 5 | @rem you may not use this file except in compliance with the License. 6 | @rem You may obtain a copy of the License at 7 | @rem 8 | @rem https://www.apache.org/licenses/LICENSE-2.0 9 | @rem 10 | @rem Unless required by applicable law or agreed to in writing, software 11 | @rem distributed under the License is distributed on an "AS IS" BASIS, 12 | @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | @rem See the License for the specific language governing permissions and 14 | @rem limitations under the License. 15 | @rem 16 | 17 | @if "%DEBUG%" == "" @echo off 18 | @rem ########################################################################## 19 | @rem 20 | @rem Gradle startup script for Windows 21 | @rem 22 | @rem ########################################################################## 23 | 24 | @rem Set local scope for the variables with windows NT shell 25 | if "%OS%"=="Windows_NT" setlocal 26 | 27 | set DIRNAME=%~dp0 28 | if "%DIRNAME%" == "" set DIRNAME=. 29 | set APP_BASE_NAME=%~n0 30 | set APP_HOME=%DIRNAME% 31 | 32 | @rem Resolve any "." and ".." in APP_HOME to make it shorter. 33 | for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi 34 | 35 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 36 | set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" 37 | 38 | @rem Find java.exe 39 | if defined JAVA_HOME goto findJavaFromJavaHome 40 | 41 | set JAVA_EXE=java.exe 42 | %JAVA_EXE% -version >NUL 2>&1 43 | if "%ERRORLEVEL%" == "0" goto execute 44 | 45 | echo. 46 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 47 | echo. 48 | echo Please set the JAVA_HOME variable in your environment to match the 49 | echo location of your Java installation. 50 | 51 | goto fail 52 | 53 | :findJavaFromJavaHome 54 | set JAVA_HOME=%JAVA_HOME:"=% 55 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 56 | 57 | if exist "%JAVA_EXE%" goto execute 58 | 59 | echo. 60 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 61 | echo. 62 | echo Please set the JAVA_HOME variable in your environment to match the 63 | echo location of your Java installation. 64 | 65 | goto fail 66 | 67 | :execute 68 | @rem Setup the command line 69 | 70 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 71 | 72 | 73 | @rem Execute Gradle 74 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* 75 | 76 | :end 77 | @rem End local scope for the variables with windows NT shell 78 | if "%ERRORLEVEL%"=="0" goto mainEnd 79 | 80 | :fail 81 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 82 | rem the _cmd.exe /c_ return code! 83 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 84 | exit /b 1 85 | 86 | :mainEnd 87 | if "%OS%"=="Windows_NT" endlocal 88 | 89 | :omega 90 | -------------------------------------------------------------------------------- /server/gradlew.bat: -------------------------------------------------------------------------------- 1 | @rem 2 | @rem Copyright 2015 the original author or authors. 3 | @rem 4 | @rem Licensed under the Apache License, Version 2.0 (the "License"); 5 | @rem you may not use this file except in compliance with the License. 6 | @rem You may obtain a copy of the License at 7 | @rem 8 | @rem https://www.apache.org/licenses/LICENSE-2.0 9 | @rem 10 | @rem Unless required by applicable law or agreed to in writing, software 11 | @rem distributed under the License is distributed on an "AS IS" BASIS, 12 | @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | @rem See the License for the specific language governing permissions and 14 | @rem limitations under the License. 15 | @rem 16 | 17 | @if "%DEBUG%" == "" @echo off 18 | @rem ########################################################################## 19 | @rem 20 | @rem Gradle startup script for Windows 21 | @rem 22 | @rem ########################################################################## 23 | 24 | @rem Set local scope for the variables with windows NT shell 25 | if "%OS%"=="Windows_NT" setlocal 26 | 27 | set DIRNAME=%~dp0 28 | if "%DIRNAME%" == "" set DIRNAME=. 29 | set APP_BASE_NAME=%~n0 30 | set APP_HOME=%DIRNAME% 31 | 32 | @rem Resolve any "." and ".." in APP_HOME to make it shorter. 33 | for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi 34 | 35 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 36 | set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" 37 | 38 | @rem Find java.exe 39 | if defined JAVA_HOME goto findJavaFromJavaHome 40 | 41 | set JAVA_EXE=java.exe 42 | %JAVA_EXE% -version >NUL 2>&1 43 | if "%ERRORLEVEL%" == "0" goto execute 44 | 45 | echo. 46 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 47 | echo. 48 | echo Please set the JAVA_HOME variable in your environment to match the 49 | echo location of your Java installation. 50 | 51 | goto fail 52 | 53 | :findJavaFromJavaHome 54 | set JAVA_HOME=%JAVA_HOME:"=% 55 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 56 | 57 | if exist "%JAVA_EXE%" goto execute 58 | 59 | echo. 60 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 61 | echo. 62 | echo Please set the JAVA_HOME variable in your environment to match the 63 | echo location of your Java installation. 64 | 65 | goto fail 66 | 67 | :execute 68 | @rem Setup the command line 69 | 70 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 71 | 72 | 73 | @rem Execute Gradle 74 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* 75 | 76 | :end 77 | @rem End local scope for the variables with windows NT shell 78 | if "%ERRORLEVEL%"=="0" goto mainEnd 79 | 80 | :fail 81 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 82 | rem the _cmd.exe /c_ return code! 83 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 84 | exit /b 1 85 | 86 | :mainEnd 87 | if "%OS%"=="Windows_NT" endlocal 88 | 89 | :omega 90 | -------------------------------------------------------------------------------- /client/src/components/RankSelectionModal.vue: -------------------------------------------------------------------------------- 1 | 63 | 64 | 131 | 132 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Basic Redis Leaderboard Demo Java (Spring) 2 | 3 | A basic leaderboard application using Redis and Java/Spring. The application models public companies and their market capitalization. 4 | 5 | ## Try it out 6 | 7 |

8 | 9 | Deploy to Heroku 10 | 11 |

12 |

13 | 14 | Run on Google Cloud 15 | 16 | (See notes: How to run on Google Cloud) 17 |

18 | 19 | ## How to run on Google Cloud 20 | 21 |

22 | If you don't have redis yet, plug it in (https://spring-gcp.saturnism.me/app-dev/cloud-services/cache/memorystore-redis). 23 | After successful deployment, you need to manually enable the vpc connector as shown in the pictures: 24 |

25 | 26 | 1. Click on "Run on Google Cloud" 27 | 28 | ![1 step](https://raw.githubusercontent.com/redis-developer/basic-redis-leaderboard-demo-java/master/1.jpg) 29 | 30 | 2. Click "Edit and deploy new revision" button and choose "Variables and Secrets". 31 | 32 | ![2 step](https://raw.githubusercontent.com/redis-developer/basic-redis-leaderboard-demo-java/master/2.jpg) 33 | 34 | 3. Manage the traffic 35 | 36 | 37 | ![3 step](https://raw.githubusercontent.com/redis-developer/basic-redis-leaderboard-demo-java/master/docs/3.jpg) 38 | 39 | 40 | Problem with unsupported flags when deploying google cloud run button 41 | 42 | 43 | ## How it works? 44 | 45 | 46 | ## 1. How the data is stored: 47 | 48 | #### How the data is stored: 49 | 50 | - The AAPL's details - market cap of 2.6 triillions and USA origin - are stored in a hash like below: 51 | ```bash 52 | HSET "company:AAPL" symbol "AAPL" market_cap "2600000000000" country USA 53 | ``` 54 | 55 | - The Ranks of AAPL of 2.6 trillions are stored in a ZSET. 56 | 57 | ```bash 58 | ZADD companyLeaderboard 2600000000000 company:AAPL 59 | ``` 60 | 61 | #### How the data is accessed: 62 | 63 | - Top 10 companies: 64 | 65 | ```bash 66 | ZREVRANGE companyLeaderboard 0 9 WITHSCORES 67 | ``` 68 | 69 | - All companies: 70 | 71 | ```bash 72 | ZREVRANGE companyLeaderboard 0 -1 WITHSCORES 73 | ``` 74 | 75 | - Bottom 10 companies: 76 | 77 | ```bash 78 | ZRANGE companyLeaderboard 0 9 WITHSCORES 79 | ``` 80 | 81 | - Between rank 10 and 15: 82 | 83 | ```bash 84 | ZREVRANGE companyLeaderboard 9 14 WITHSCORES 85 | ``` 86 | 87 | - Show ranks of AAPL, FB and TSLA: 88 | 89 | ```bash 90 | ZREVRANGE companyLeaderBoard company:AAPL company:FB company:TSLA 91 | ``` 92 | 93 | - Adding 1 billion to market cap of FB company: 94 | 95 | ```bash 96 | ZINCRBY companyLeaderBoard 1000000000 "company:FB" 97 | ``` 98 | 99 | - Reducing 1 billion of market cap of FB company: 100 | 101 | ```bash 102 | ZINCRBY companyLeaderBoard -1000000000 "company:FB" 103 | ``` 104 | 105 | - Companies between 500 billion and 1 trillion: 106 | 107 | ```bash 108 | ZCOUNT companyLeaderBoard 500000000000 1000000000000 109 | ``` 110 | 111 | - Companies over a Trillion: 112 | 113 | ```bash 114 | ZCOUNT companyLeaderBoard 1000000000000 +inf 115 | ``` 116 | 117 | 118 | ## How to run it locally? 119 | 120 | #### Open the files server/.env.example to see the available environment variables. You may set these variables when you start the application. 121 | - REDIS_URL: Redis server url 122 | - REDIS_HOST: Redis server host 123 | - REDIS_PORT: Redis server port 124 | - REDIS_PASSWORD: Redis server password 125 | 126 | #### Run backend 127 | 128 | 1. Install gradle (Use Gradle 6.3 or later) (on mac: https://gradle.org/install/) 129 | 130 | 2. Install JDK (use 8 or later version) (on mac: https://docs.oracle.com/javase/10/install/installation-jdk-and-jre-macos.htm) 131 | 132 | 3. Set any relevant environment variables (if not connecting to Redis on localhost:6379). For example: 133 | 134 | ``` sh 135 | $ REDIS_PORT=6379 136 | ``` 137 | 138 | 3. From the root directory of the project, run the following commands: 139 | ``` sh 140 | cd server 141 | ./gradlew build 142 | ./gradlew run 143 | ``` 144 | 145 | 4. Point your browser to `localhost:5000`. 146 | -------------------------------------------------------------------------------- /server/src/main/java/com/redis/basicredisleaderboarddemojava/controller/Api.java: -------------------------------------------------------------------------------- 1 | package com.redis.basicredisleaderboarddemojava.controller; 2 | 3 | import org.json.JSONObject; 4 | import org.springframework.beans.factory.annotation.Value; 5 | import org.springframework.context.ApplicationListener; 6 | import org.springframework.context.event.ContextRefreshedEvent; 7 | import org.springframework.stereotype.Component; 8 | import org.springframework.stereotype.Service; 9 | import org.springframework.web.bind.annotation.*; 10 | import redis.clients.jedis.Jedis; 11 | 12 | import java.util.*; 13 | 14 | import static com.redis.basicredisleaderboarddemojava.controller.Utils.*; 15 | 16 | 17 | @RestController 18 | @Service 19 | @Component 20 | public class Api implements ApplicationListener { 21 | @Value("${REDIS_URL}") 22 | private String redisUrl; 23 | 24 | @Value("${REDIS_HOST}") 25 | private String redisHost; 26 | 27 | @Value("${REDIS_PORT}") 28 | private String redisPort; 29 | 30 | @Value("${REDIS_PASSWORD}") 31 | private String redisPassword; 32 | 33 | @Value("${REDIS_DB}") 34 | private String redisDB; 35 | 36 | @Value("${REDIS_LEADERBOARD}") 37 | private String redisLeaderboard; 38 | 39 | @Value("${LEADERBOARD_DATA_READY}") 40 | private String dataReadyRedisKey; 41 | 42 | @Value("${KEY_PREFIX}") 43 | private String keyPrefix; 44 | 45 | Jedis jedis; 46 | 47 | 48 | @RequestMapping(value = "/api/list/top10", produces = { "text/html; charset=utf-8" }) 49 | @ResponseBody 50 | public String getTop10() { 51 | return getRedisDataZrevrangeWithScores(0, 9, jedis, redisLeaderboard, keyPrefix); 52 | } 53 | 54 | @RequestMapping(value = "/api/list/all", produces = { "text/html; charset=utf-8" }) 55 | @ResponseBody 56 | public String getAll() { 57 | return getRedisDataZrevrangeWithScores(0, -1, jedis, redisLeaderboard, keyPrefix); 58 | } 59 | 60 | @RequestMapping(value = "/api/list/bottom10", produces = { "text/html; charset=utf-8" }) 61 | @ResponseBody 62 | public String get10() { 63 | return getRedisDataZrangeWithScores(0, 9, jedis, redisLeaderboard, keyPrefix); 64 | } 65 | 66 | @RequestMapping("/api/list/inRank") 67 | @ResponseBody 68 | public String getInRank(@RequestParam(name = "start") int start, 69 | @RequestParam(name = "end") int end) { 70 | return getRedisDataZrevrangeWithScores(start, end, jedis, redisLeaderboard, keyPrefix); 71 | } 72 | 73 | @RequestMapping("/api/list/getBySymbol") 74 | @ResponseBody 75 | public String getBySymbol(@RequestParam(name = "symbols") List symbols) { 76 | List list = new ArrayList<>(); 77 | String updateSymbol; 78 | for (String symbol : symbols) { 79 | updateSymbol = addPrefix(keyPrefix, symbol); 80 | list.add(addDataToResult(jedis.hgetAll(updateSymbol), 81 | jedis.zscore(redisLeaderboard, updateSymbol).longValue(), 82 | symbol, keyPrefix)); 83 | } 84 | return list.toString(); 85 | } 86 | 87 | 88 | @RequestMapping(value = "/api/rank/update") 89 | public String updateAmount(@RequestParam(name = "symbol") String symbol, 90 | @RequestParam(name = "amount") Long amount) { 91 | boolean isOk = true; 92 | try { 93 | jedis.zincrby(redisLeaderboard, 94 | (amount).doubleValue(), 95 | addPrefix(keyPrefix, symbol)); 96 | 97 | } 98 | catch (Exception e) { 99 | isOk = false; 100 | } 101 | return String.format("{success: %s}", isOk); 102 | } 103 | 104 | @RequestMapping("/api/rank/reset") 105 | @ResponseBody 106 | public String reset() { 107 | return resetData(false, jedis, dataReadyRedisKey, redisLeaderboard, keyPrefix); 108 | } 109 | 110 | @Override 111 | public void onApplicationEvent(ContextRefreshedEvent event) { 112 | try { 113 | if (!redisUrl.equals("")) { 114 | jedis = new Jedis(redisUrl); 115 | } else { 116 | jedis = new Jedis(redisHost, Integer.parseInt(redisPort)); 117 | } 118 | if (!redisPassword.equals("")){ 119 | jedis.auth(redisPassword); 120 | } 121 | if (!redisDB.equals("")){ 122 | jedis.select(Integer.parseInt(redisDB)); 123 | } 124 | resetData(Boolean.parseBoolean( 125 | jedis.get(dataReadyRedisKey)), 126 | jedis, dataReadyRedisKey, 127 | redisLeaderboard, keyPrefix); 128 | } 129 | catch (Exception ignored) { 130 | } 131 | } 132 | 133 | } 134 | -------------------------------------------------------------------------------- /server/src/main/java/com/redis/basicredisleaderboarddemojava/controller/Utils.java: -------------------------------------------------------------------------------- 1 | package com.redis.basicredisleaderboarddemojava.controller; 2 | 3 | import org.json.JSONArray; 4 | import org.json.JSONException; 5 | import org.json.JSONObject; 6 | import redis.clients.jedis.Jedis; 7 | import redis.clients.jedis.Tuple; 8 | 9 | import java.io.BufferedReader; 10 | import java.io.FileReader; 11 | import java.util.ArrayList; 12 | import java.util.List; 13 | import java.util.Map; 14 | import java.util.Set; 15 | import java.util.concurrent.atomic.AtomicInteger; 16 | 17 | public class Utils { 18 | public static String resetData(boolean isDataReady, Jedis jedis, String dataReadyRedisKey, 19 | String redisLeaderboard, String keyPrefix) { 20 | boolean isOk = true; 21 | if (!isDataReady){ 22 | try { 23 | JSONArray companyJsonArray = new JSONArray(readFile("src/main/resources/data.json")); 24 | JSONObject companyJson; 25 | String symbol; 26 | for (int i = 0; i < companyJsonArray.length(); i++) { 27 | companyJson = companyJsonArray.getJSONObject(i); 28 | symbol = addPrefix(keyPrefix, companyJson.get("symbol").toString().toLowerCase()); 29 | jedis.zadd(redisLeaderboard, Double.parseDouble(companyJson.get("marketCap").toString()), symbol); 30 | jedis.hset(symbol, "company", companyJson.get("company").toString()); 31 | jedis.hset(symbol, "country", companyJson.get("country").toString()); 32 | } 33 | jedis.set(dataReadyRedisKey, "true"); 34 | } catch (Exception e) { 35 | isOk = false; 36 | } 37 | } 38 | return String.format("{\"succes\":%s}", isOk); 39 | } 40 | 41 | protected static String getRedisDataZrangeWithScores(int start, int end, Jedis jedis, String redisLeaderboard, 42 | String prefix) { 43 | Set zrangeWithScores = jedis.zrangeWithScores(redisLeaderboard, start, end); 44 | return resultList(zrangeWithScores, jedis, 45 | new AtomicInteger((zrangeWithScores.size() + 1) / (1 - start)), 46 | false, prefix); 47 | } 48 | 49 | protected static String getRedisDataZrevrangeWithScores(int start, int end, Jedis jedis, String redisLeaderboard, 50 | String prefix) { 51 | return resultList(jedis.zrevrangeWithScores(redisLeaderboard, start, end), jedis, 52 | new AtomicInteger(start), 53 | true, prefix); 54 | } 55 | 56 | private static String readFile(String filename) { 57 | String result = ""; 58 | try { 59 | BufferedReader br = new BufferedReader(new FileReader(filename)); 60 | StringBuilder sb = new StringBuilder(); 61 | String line = br.readLine(); 62 | while (line != null) { 63 | sb.append(line); 64 | line = br.readLine(); 65 | } 66 | result = sb.toString(); 67 | } catch(Exception e) { 68 | e.printStackTrace(); 69 | } 70 | return result; 71 | } 72 | 73 | private static String resultList(Set jedisRedis, Jedis jedis, AtomicInteger index, boolean isIncrease, 74 | String prefix) { 75 | List resultList = new ArrayList<>(); 76 | jedisRedis.forEach((k) -> { 77 | 78 | Map company = jedis.hgetAll(k.getElement()); 79 | JSONObject json = addDataToResult(company, ((Double) k.getScore()).longValue(), k.getElement(), prefix); 80 | try { 81 | json.put("rank", isIncrease ? index.incrementAndGet() : index.decrementAndGet()); 82 | } catch (JSONException e) { 83 | e.printStackTrace(); 84 | } 85 | resultList.add(json); 86 | }); 87 | return resultList.toString(); 88 | } 89 | 90 | protected static JSONObject addDataToResult(Map company, Long marketCap, String symbol, 91 | String prefix){ 92 | JSONObject json = new JSONObject(); 93 | try { 94 | json.put("marketCap", (marketCap)); 95 | json.put("symbol", deletePrefix(prefix, symbol)); 96 | json.put("country", company.get("country")); 97 | json.put("company", company.get("company")); 98 | } catch (JSONException e) { 99 | e.printStackTrace(); 100 | } 101 | return json; 102 | } 103 | 104 | protected static String addPrefix(String prefix, String symbol){ 105 | return prefix+ ":" + symbol; 106 | } 107 | 108 | protected static String deletePrefix(String prefix, String symbol){ 109 | return symbol.replace(prefix +":" , ""); 110 | } 111 | } 112 | -------------------------------------------------------------------------------- /gradlew: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | 3 | # 4 | # Copyright 2015 the original author or authors. 5 | # 6 | # Licensed under the Apache License, Version 2.0 (the "License"); 7 | # you may not use this file except in compliance with the License. 8 | # You may obtain a copy of the License at 9 | # 10 | # https://www.apache.org/licenses/LICENSE-2.0 11 | # 12 | # Unless required by applicable law or agreed to in writing, software 13 | # distributed under the License is distributed on an "AS IS" BASIS, 14 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 | # See the License for the specific language governing permissions and 16 | # limitations under the License. 17 | # 18 | 19 | ############################################################################## 20 | ## 21 | ## Gradle start up script for UN*X 22 | ## 23 | ############################################################################## 24 | 25 | # Attempt to set APP_HOME 26 | # Resolve links: $0 may be a link 27 | PRG="$0" 28 | # Need this for relative symlinks. 29 | while [ -h "$PRG" ] ; do 30 | ls=`ls -ld "$PRG"` 31 | link=`expr "$ls" : '.*-> \(.*\)$'` 32 | if expr "$link" : '/.*' > /dev/null; then 33 | PRG="$link" 34 | else 35 | PRG=`dirname "$PRG"`"/$link" 36 | fi 37 | done 38 | SAVED="`pwd`" 39 | cd "`dirname \"$PRG\"`/" >/dev/null 40 | APP_HOME="`pwd -P`" 41 | cd "$SAVED" >/dev/null 42 | 43 | APP_NAME="Gradle" 44 | APP_BASE_NAME=`basename "$0"` 45 | 46 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 47 | DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' 48 | 49 | # Use the maximum available, or set MAX_FD != -1 to use that value. 50 | MAX_FD="maximum" 51 | 52 | warn () { 53 | echo "$*" 54 | } 55 | 56 | die () { 57 | echo 58 | echo "$*" 59 | echo 60 | exit 1 61 | } 62 | 63 | # OS specific support (must be 'true' or 'false'). 64 | cygwin=false 65 | msys=false 66 | darwin=false 67 | nonstop=false 68 | case "`uname`" in 69 | CYGWIN* ) 70 | cygwin=true 71 | ;; 72 | Darwin* ) 73 | darwin=true 74 | ;; 75 | MINGW* ) 76 | msys=true 77 | ;; 78 | NONSTOP* ) 79 | nonstop=true 80 | ;; 81 | esac 82 | 83 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 84 | 85 | 86 | # Determine the Java command to use to start the JVM. 87 | if [ -n "$JAVA_HOME" ] ; then 88 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 89 | # IBM's JDK on AIX uses strange locations for the executables 90 | JAVACMD="$JAVA_HOME/jre/sh/java" 91 | else 92 | JAVACMD="$JAVA_HOME/bin/java" 93 | fi 94 | if [ ! -x "$JAVACMD" ] ; then 95 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 96 | 97 | Please set the JAVA_HOME variable in your environment to match the 98 | location of your Java installation." 99 | fi 100 | else 101 | JAVACMD="java" 102 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 103 | 104 | Please set the JAVA_HOME variable in your environment to match the 105 | location of your Java installation." 106 | fi 107 | 108 | # Increase the maximum file descriptors if we can. 109 | if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then 110 | MAX_FD_LIMIT=`ulimit -H -n` 111 | if [ $? -eq 0 ] ; then 112 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then 113 | MAX_FD="$MAX_FD_LIMIT" 114 | fi 115 | ulimit -n $MAX_FD 116 | if [ $? -ne 0 ] ; then 117 | warn "Could not set maximum file descriptor limit: $MAX_FD" 118 | fi 119 | else 120 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" 121 | fi 122 | fi 123 | 124 | # For Darwin, add options to specify how the application appears in the dock 125 | if $darwin; then 126 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" 127 | fi 128 | 129 | # For Cygwin or MSYS, switch paths to Windows format before running java 130 | if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then 131 | APP_HOME=`cygpath --path --mixed "$APP_HOME"` 132 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` 133 | 134 | JAVACMD=`cygpath --unix "$JAVACMD"` 135 | 136 | # We build the pattern for arguments to be converted via cygpath 137 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` 138 | SEP="" 139 | for dir in $ROOTDIRSRAW ; do 140 | ROOTDIRS="$ROOTDIRS$SEP$dir" 141 | SEP="|" 142 | done 143 | OURCYGPATTERN="(^($ROOTDIRS))" 144 | # Add a user-defined pattern to the cygpath arguments 145 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then 146 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" 147 | fi 148 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 149 | i=0 150 | for arg in "$@" ; do 151 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` 152 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option 153 | 154 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition 155 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` 156 | else 157 | eval `echo args$i`="\"$arg\"" 158 | fi 159 | i=`expr $i + 1` 160 | done 161 | case $i in 162 | 0) set -- ;; 163 | 1) set -- "$args0" ;; 164 | 2) set -- "$args0" "$args1" ;; 165 | 3) set -- "$args0" "$args1" "$args2" ;; 166 | 4) set -- "$args0" "$args1" "$args2" "$args3" ;; 167 | 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; 168 | 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; 169 | 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; 170 | 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; 171 | 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; 172 | esac 173 | fi 174 | 175 | # Escape application args 176 | save () { 177 | for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done 178 | echo " " 179 | } 180 | APP_ARGS=`save "$@"` 181 | 182 | # Collect all arguments for the java command, following the shell quoting and substitution rules 183 | eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" 184 | 185 | exec "$JAVACMD" "$@" 186 | -------------------------------------------------------------------------------- /server/gradlew: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | 3 | # 4 | # Copyright 2015 the original author or authors. 5 | # 6 | # Licensed under the Apache License, Version 2.0 (the "License"); 7 | # you may not use this file except in compliance with the License. 8 | # You may obtain a copy of the License at 9 | # 10 | # https://www.apache.org/licenses/LICENSE-2.0 11 | # 12 | # Unless required by applicable law or agreed to in writing, software 13 | # distributed under the License is distributed on an "AS IS" BASIS, 14 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 | # See the License for the specific language governing permissions and 16 | # limitations under the License. 17 | # 18 | 19 | ############################################################################## 20 | ## 21 | ## Gradle start up script for UN*X 22 | ## 23 | ############################################################################## 24 | 25 | # Attempt to set APP_HOME 26 | # Resolve links: $0 may be a link 27 | PRG="$0" 28 | # Need this for relative symlinks. 29 | while [ -h "$PRG" ] ; do 30 | ls=`ls -ld "$PRG"` 31 | link=`expr "$ls" : '.*-> \(.*\)$'` 32 | if expr "$link" : '/.*' > /dev/null; then 33 | PRG="$link" 34 | else 35 | PRG=`dirname "$PRG"`"/$link" 36 | fi 37 | done 38 | SAVED="`pwd`" 39 | cd "`dirname \"$PRG\"`/" >/dev/null 40 | APP_HOME="`pwd -P`" 41 | cd "$SAVED" >/dev/null 42 | 43 | APP_NAME="Gradle" 44 | APP_BASE_NAME=`basename "$0"` 45 | 46 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 47 | DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' 48 | 49 | # Use the maximum available, or set MAX_FD != -1 to use that value. 50 | MAX_FD="maximum" 51 | 52 | warn () { 53 | echo "$*" 54 | } 55 | 56 | die () { 57 | echo 58 | echo "$*" 59 | echo 60 | exit 1 61 | } 62 | 63 | # OS specific support (must be 'true' or 'false'). 64 | cygwin=false 65 | msys=false 66 | darwin=false 67 | nonstop=false 68 | case "`uname`" in 69 | CYGWIN* ) 70 | cygwin=true 71 | ;; 72 | Darwin* ) 73 | darwin=true 74 | ;; 75 | MINGW* ) 76 | msys=true 77 | ;; 78 | NONSTOP* ) 79 | nonstop=true 80 | ;; 81 | esac 82 | 83 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 84 | 85 | 86 | # Determine the Java command to use to start the JVM. 87 | if [ -n "$JAVA_HOME" ] ; then 88 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 89 | # IBM's JDK on AIX uses strange locations for the executables 90 | JAVACMD="$JAVA_HOME/jre/sh/java" 91 | else 92 | JAVACMD="$JAVA_HOME/bin/java" 93 | fi 94 | if [ ! -x "$JAVACMD" ] ; then 95 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 96 | 97 | Please set the JAVA_HOME variable in your environment to match the 98 | location of your Java installation." 99 | fi 100 | else 101 | JAVACMD="java" 102 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 103 | 104 | Please set the JAVA_HOME variable in your environment to match the 105 | location of your Java installation." 106 | fi 107 | 108 | # Increase the maximum file descriptors if we can. 109 | if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then 110 | MAX_FD_LIMIT=`ulimit -H -n` 111 | if [ $? -eq 0 ] ; then 112 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then 113 | MAX_FD="$MAX_FD_LIMIT" 114 | fi 115 | ulimit -n $MAX_FD 116 | if [ $? -ne 0 ] ; then 117 | warn "Could not set maximum file descriptor limit: $MAX_FD" 118 | fi 119 | else 120 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" 121 | fi 122 | fi 123 | 124 | # For Darwin, add options to specify how the application appears in the dock 125 | if $darwin; then 126 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" 127 | fi 128 | 129 | # For Cygwin or MSYS, switch paths to Windows format before running java 130 | if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then 131 | APP_HOME=`cygpath --path --mixed "$APP_HOME"` 132 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` 133 | 134 | JAVACMD=`cygpath --unix "$JAVACMD"` 135 | 136 | # We build the pattern for arguments to be converted via cygpath 137 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` 138 | SEP="" 139 | for dir in $ROOTDIRSRAW ; do 140 | ROOTDIRS="$ROOTDIRS$SEP$dir" 141 | SEP="|" 142 | done 143 | OURCYGPATTERN="(^($ROOTDIRS))" 144 | # Add a user-defined pattern to the cygpath arguments 145 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then 146 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" 147 | fi 148 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 149 | i=0 150 | for arg in "$@" ; do 151 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` 152 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option 153 | 154 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition 155 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` 156 | else 157 | eval `echo args$i`="\"$arg\"" 158 | fi 159 | i=`expr $i + 1` 160 | done 161 | case $i in 162 | 0) set -- ;; 163 | 1) set -- "$args0" ;; 164 | 2) set -- "$args0" "$args1" ;; 165 | 3) set -- "$args0" "$args1" "$args2" ;; 166 | 4) set -- "$args0" "$args1" "$args2" "$args3" ;; 167 | 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; 168 | 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; 169 | 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; 170 | 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; 171 | 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; 172 | esac 173 | fi 174 | 175 | # Escape application args 176 | save () { 177 | for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done 178 | echo " " 179 | } 180 | APP_ARGS=`save "$@"` 181 | 182 | # Collect all arguments for the java command, following the shell quoting and substitution rules 183 | eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" 184 | 185 | exec "$JAVACMD" "$@" 186 | -------------------------------------------------------------------------------- /client/src/components/Example.vue: -------------------------------------------------------------------------------- 1 | 136 | 137 | 266 | 267 | 268 | 277 | -------------------------------------------------------------------------------- /server/src/main/resources/public/js/app.a6306686.js: -------------------------------------------------------------------------------- 1 | (function(e){function t(t){for(var n,i,l=t[0],c=t[1],s=t[2],u=0,d=[];uO?"$".concat((e/O).toFixed(3)," T"):e>L?"$".concat((e/L).toFixed(2)," B"):e>F?"$".concat((e/F).toFixed(1)," M"):"$ ".concat(e)},getCountryFlag:function(e){var t={"S. Arabia":"Saudi Arabia","S. Korea":"South Korea"},a=Object(u["findFlagUrlByCountryName"])(t[e]||e);return a}}},E=B,U=(a("1e58"),a("62ad")),j=a("a523"),N=a("8fea"),I=a("cd55"),$=a("49e2"),D=a("c865"),H=a("0393"),Z=a("0fd9"),M=Object(h["a"])(E,i,l,!1,null,"6d7466c0",null),G=M.exports;x()(M,{VBtn:_["a"],VCard:k["a"],VCol:U["a"],VContainer:j["a"],VDataTable:N["a"],VExpansionPanel:I["a"],VExpansionPanelContent:$["a"],VExpansionPanelHeader:D["a"],VExpansionPanels:H["a"],VIcon:w["a"],VRow:Z["a"],VSelect:R["a"]});var K={name:"App",components:{Example:G}},W=K,z=(a("034f"),a("7496")),J=Object(h["a"])(W,o,r,!1,null,null,null),Y=J.exports;x()(J,{VApp:z["a"]});var q=a("f309");n["a"].use(q["a"]);var Q=new q["a"]({});n["a"].config.productionTip=!1,new n["a"]({vuetify:Q,render:function(e){return e(Y)}}).$mount("#app")},"85ec":function(e,t,a){}}); 2 | //# sourceMappingURL=app.a6306686.js.map -------------------------------------------------------------------------------- /server/src/main/resources/data.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "company": "Apple", 4 | "symbol": "AAPL", 5 | "marketCap": 2222000000, 6 | "country": "USA" 7 | }, 8 | { 9 | "company": "Saudi Aramco", 10 | "symbol": "2222.SR", 11 | "marketCap": 2046000000, 12 | "country": "S. Arabia" 13 | }, 14 | { 15 | "company": "Microsoft", 16 | "symbol": "MSFT", 17 | "marketCap": 1660000000, 18 | "country": "USA" 19 | }, 20 | { 21 | "company": "Amazon", 22 | "symbol": "AMZN", 23 | "marketCap": 1597000000, 24 | "country": "USA" 25 | }, 26 | { 27 | "company": "Alphabet (Google)", 28 | "symbol": "GOOG", 29 | "marketCap": 1218000000, 30 | "country": "USA" 31 | }, 32 | { 33 | "company": "Tesla", 34 | "symbol": "TSLA", 35 | "marketCap": 834170000, 36 | "country": "USA" 37 | }, 38 | { 39 | "company": "Facebook", 40 | "symbol": "FB", 41 | "marketCap": 762110000, 42 | "country": "USA" 43 | }, 44 | { 45 | "company": "Tencent", 46 | "symbol": "TCEHY", 47 | "marketCap": 742230000, 48 | "country": "China" 49 | }, 50 | { 51 | "company": "Alibaba", 52 | "symbol": "BABA", 53 | "marketCap": 642220000, 54 | "country": "China" 55 | }, 56 | { 57 | "company": "Berkshire Hathaway", 58 | "symbol": "BRK-A", 59 | "marketCap": 549580000, 60 | "country": "USA" 61 | }, 62 | { 63 | "company": "Samsung", 64 | "symbol": "005930.KS", 65 | "marketCap": 526630000, 66 | "country": "S. Korea" 67 | }, 68 | { 69 | "company": "TSMC", 70 | "symbol": "TSM", 71 | "marketCap": 511700000, 72 | "country": "Taiwan" 73 | }, 74 | { 75 | "company": "Visa", 76 | "symbol": "V", 77 | "marketCap": 474940000, 78 | "country": "USA" 79 | }, 80 | { 81 | "company": "Johnson & Johnson", 82 | "symbol": "JNJ", 83 | "marketCap": 421310000, 84 | "country": "USA" 85 | }, 86 | { 87 | "company": "Walmart", 88 | "symbol": "WMT", 89 | "marketCap": 414850000, 90 | "country": "USA" 91 | }, 92 | { 93 | "company": "JPMorgan Chase", 94 | "symbol": "JPM", 95 | "marketCap": 414610000, 96 | "country": "USA" 97 | }, 98 | { 99 | "company": "Kweichow Moutai", 100 | "symbol": "600519.SS", 101 | "marketCap": 392630000, 102 | "country": "China" 103 | }, 104 | { 105 | "company": "Mastercard", 106 | "symbol": "MA", 107 | "marketCap": 352760000, 108 | "country": "USA" 109 | }, 110 | { 111 | "company": "UnitedHealth", 112 | "symbol": "UNH", 113 | "marketCap": 344790000, 114 | "country": "USA" 115 | }, 116 | { 117 | "company": "Procter & Gamble", 118 | "symbol": "PG", 119 | "marketCap": 344140000, 120 | "country": "USA" 121 | }, 122 | { 123 | "company": "Nestlé", 124 | "symbol": "NSRGY", 125 | "marketCap": 333610000, 126 | "country": "Switzerland" 127 | }, 128 | { 129 | "company": "NVIDIA", 130 | "symbol": "NVDA", 131 | "marketCap": 328730000, 132 | "country": "USA" 133 | }, 134 | { 135 | "company": "LVMH", 136 | "symbol": "LVMUY", 137 | "marketCap": 327040000, 138 | "country": "France" 139 | }, 140 | { 141 | "company": "Walt Disney", 142 | "symbol": "DIS", 143 | "marketCap": 322900000, 144 | "country": "USA" 145 | }, 146 | { 147 | "company": "Roche", 148 | "symbol": "RHHBY", 149 | "marketCap": 293520000, 150 | "country": "Switzerland" 151 | }, 152 | { 153 | "company": "Home Depot", 154 | "symbol": "HD", 155 | "marketCap": 289700000, 156 | "country": "USA" 157 | }, 158 | { 159 | "company": "PayPal", 160 | "symbol": "PYPL", 161 | "marketCap": 284080000, 162 | "country": "USA" 163 | }, 164 | { 165 | "company": "Bank of America", 166 | "symbol": "BAC", 167 | "marketCap": 281410000, 168 | "country": "USA" 169 | }, 170 | { 171 | "company": "ICBC", 172 | "symbol": "1398.HK", 173 | "marketCap": 266230000, 174 | "country": "China" 175 | }, 176 | { 177 | "company": "Meituan-Dianping", 178 | "symbol": "MPNGF", 179 | "marketCap": 246210000, 180 | "country": "China" 181 | }, 182 | { 183 | "company": "Verizon", 184 | "symbol": "VZ", 185 | "marketCap": 239180000, 186 | "country": "USA" 187 | }, 188 | { 189 | "company": "Ping An Insurance", 190 | "symbol": "PNGAY", 191 | "marketCap": 237140000, 192 | "country": "China" 193 | }, 194 | { 195 | "company": "Comcast", 196 | "symbol": "CMCSA", 197 | "marketCap": 235810000, 198 | "country": "USA" 199 | }, 200 | { 201 | "company": "Adobe", 202 | "symbol": "ADBE", 203 | "marketCap": 232710000, 204 | "country": "USA" 205 | }, 206 | { 207 | "company": "Nike", 208 | "symbol": "NKE", 209 | "marketCap": 230710000, 210 | "country": "USA" 211 | }, 212 | { 213 | "company": "Netflix", 214 | "symbol": "NFLX", 215 | "marketCap": 225490000, 216 | "country": "USA" 217 | }, 218 | { 219 | "company": "Pinduoduo", 220 | "symbol": "PDD", 221 | "marketCap": 221680000, 222 | "country": "China" 223 | }, 224 | { 225 | "company": "Coca-Cola", 226 | "symbol": "KO", 227 | "marketCap": 219510000, 228 | "country": "USA" 229 | }, 230 | { 231 | "company": "Novartis", 232 | "symbol": "NVS", 233 | "marketCap": 214590000, 234 | "country": "Switzerland" 235 | }, 236 | { 237 | "company": "Toyota", 238 | "symbol": "TM", 239 | "marketCap": 212390000, 240 | "country": "Japan" 241 | }, 242 | { 243 | "company": "ASML", 244 | "symbol": "ASML", 245 | "marketCap": 212100000, 246 | "country": "Netherlands" 247 | }, 248 | { 249 | "company": "Intel", 250 | "symbol": "INTC", 251 | "marketCap": 211660000, 252 | "country": "USA" 253 | }, 254 | { 255 | "company": "L\" Oréal", 256 | "symbol": "OR.PA", 257 | "marketCap": 210160000, 258 | "country": "France" 259 | }, 260 | { 261 | "company": "Merck", 262 | "symbol": "MRK", 263 | "marketCap": 210060000, 264 | "country": "USA" 265 | }, 266 | { 267 | "company": "AT&T", 268 | "symbol": "T", 269 | "marketCap": 206790000, 270 | "country": "USA" 271 | }, 272 | { 273 | "company": "Pfizer", 274 | "symbol": "PFE", 275 | "marketCap": 206380000, 276 | "country": "USA" 277 | }, 278 | { 279 | "company": "Salesforce", 280 | "symbol": "CRM", 281 | "marketCap": 203770000, 282 | "country": "USA" 283 | }, 284 | { 285 | "company": "Thermo Fisher Scientific", 286 | "symbol": "TMO", 287 | "marketCap": 203040000, 288 | "country": "USA" 289 | }, 290 | { 291 | "company": "Pepsico", 292 | "symbol": "PEP", 293 | "marketCap": 199250000, 294 | "country": "USA" 295 | }, 296 | { 297 | "company": "Abbott Laboratories", 298 | "symbol": "ABT", 299 | "marketCap": 197810000, 300 | "country": "USA" 301 | }, 302 | { 303 | "company": "China Construction Bank", 304 | "symbol": "CICHY", 305 | "marketCap": 193710000, 306 | "country": "China" 307 | }, 308 | { 309 | "company": "Exxon Mobil", 310 | "symbol": "XOM", 311 | "marketCap": 192210000, 312 | "country": "USA" 313 | }, 314 | { 315 | "company": "Oracle", 316 | "symbol": "ORCL", 317 | "marketCap": 190830000, 318 | "country": "USA" 319 | }, 320 | { 321 | "company": "Cisco", 322 | "symbol": "CSCO", 323 | "marketCap": 190400000, 324 | "country": "USA" 325 | }, 326 | { 327 | "company": "AbbVie", 328 | "symbol": "ABBV", 329 | "marketCap": 189380000, 330 | "country": "USA" 331 | }, 332 | { 333 | "company": "BHP Group", 334 | "symbol": "BHP", 335 | "marketCap": 186040000, 336 | "country": "Australia" 337 | }, 338 | { 339 | "company": "Broadcom", 340 | "symbol": "AVGO", 341 | "marketCap": 181240000, 342 | "country": "USA" 343 | }, 344 | { 345 | "company": "CM Bank", 346 | "symbol": "3968.HK", 347 | "marketCap": 180460000, 348 | "country": "China" 349 | }, 350 | { 351 | "company": "QUALCOMM", 352 | "symbol": "QCOM", 353 | "marketCap": 177150000, 354 | "country": "USA" 355 | }, 356 | { 357 | "company": "Reliance Industries", 358 | "symbol": "RELIANCE.NS", 359 | "marketCap": 177100000, 360 | "country": "India" 361 | }, 362 | { 363 | "company": "Chevron", 364 | "symbol": "CVX", 365 | "marketCap": 175320000, 366 | "country": "USA" 367 | }, 368 | { 369 | "company": "Accenture", 370 | "symbol": "ACN", 371 | "marketCap": 175020000, 372 | "country": "Ireland" 373 | }, 374 | { 375 | "company": "Danaher", 376 | "symbol": "DHR", 377 | "marketCap": 172960000, 378 | "country": "USA" 379 | }, 380 | { 381 | "company": "Agricultural Bank of China", 382 | "symbol": "ACGBY", 383 | "marketCap": 168730000, 384 | "country": "China" 385 | }, 386 | { 387 | "company": "T-Mobile US", 388 | "symbol": "TMUS", 389 | "marketCap": 167630000, 390 | "country": "USA" 391 | }, 392 | { 393 | "company": "Prosus", 394 | "symbol": "PRX.VI", 395 | "marketCap": 165690000, 396 | "country": "Netherlands" 397 | }, 398 | { 399 | "company": "Costco", 400 | "symbol": "COST", 401 | "marketCap": 163860000, 402 | "country": "USA" 403 | }, 404 | { 405 | "company": "Novo Nordisk", 406 | "symbol": "NVO", 407 | "marketCap": 162260000, 408 | "country": "Denmark" 409 | }, 410 | { 411 | "company": "Medtronic", 412 | "symbol": "MDT", 413 | "marketCap": 161130000, 414 | "country": "Ireland" 415 | }, 416 | { 417 | "company": "McDonald", 418 | "symbol": "MCD", 419 | "marketCap": 160840000, 420 | "country": "USA" 421 | }, 422 | { 423 | "company": "Unilever", 424 | "symbol": "UL", 425 | "marketCap": 160420000, 426 | "country": "Netherlands" 427 | }, 428 | { 429 | "company": "Eli Lilly", 430 | "symbol": "LLY", 431 | "marketCap": 159180000, 432 | "country": "USA" 433 | }, 434 | { 435 | "company": "Nextera Energy", 436 | "symbol": "NEE", 437 | "marketCap": 158930000, 438 | "country": "USA" 439 | }, 440 | { 441 | "company": "Texas Instruments", 442 | "symbol": "TXN", 443 | "marketCap": 157110000, 444 | "country": "USA" 445 | }, 446 | { 447 | "company": "SAP", 448 | "symbol": "SAP", 449 | "marketCap": 156750000, 450 | "country": "Germany" 451 | }, 452 | { 453 | "company": "Tata", 454 | "symbol": "TCS.NS", 455 | "marketCap": 156350000, 456 | "country": "India" 457 | }, 458 | { 459 | "company": "Shell", 460 | "symbol": "RYDAF", 461 | "marketCap": 155950000, 462 | "country": "Netherlands" 463 | }, 464 | { 465 | "company": "AIA", 466 | "symbol": "AAIGF", 467 | "marketCap": 153920000, 468 | "country": "Hong Kong" 469 | }, 470 | { 471 | "company": "Union Pacific Corporation", 472 | "symbol": "UNP", 473 | "marketCap": 147450000, 474 | "country": "USA" 475 | }, 476 | { 477 | "company": "Honeywell", 478 | "symbol": "HON", 479 | "marketCap": 147370000, 480 | "country": "USA" 481 | }, 482 | { 483 | "company": "Jingdong Mall", 484 | "symbol": "JD", 485 | "marketCap": 146600000, 486 | "country": "China" 487 | }, 488 | { 489 | "company": "Shopify", 490 | "symbol": "SHOP", 491 | "marketCap": 145120000, 492 | "country": "Canada" 493 | }, 494 | { 495 | "company": "SoftBank", 496 | "symbol": "SFTBF", 497 | "marketCap": 143310000, 498 | "country": "Japan" 499 | }, 500 | { 501 | "company": "China Life Insurance", 502 | "symbol": "LFC", 503 | "marketCap": 142650000, 504 | "country": "China" 505 | }, 506 | { 507 | "company": "Linde", 508 | "symbol": "LIN", 509 | "marketCap": 141920000, 510 | "country": "UK" 511 | }, 512 | { 513 | "company": "Anheuser-Busch Inbev", 514 | "symbol": "BUD", 515 | "marketCap": 141810000, 516 | "country": "Belgium" 517 | }, 518 | { 519 | "company": "Bristol-Myers Squibb", 520 | "symbol": "BMY", 521 | "marketCap": 141210000, 522 | "country": "USA" 523 | }, 524 | { 525 | "company": "Amgen", 526 | "symbol": "AMGN", 527 | "marketCap": 138840000, 528 | "country": "USA" 529 | }, 530 | { 531 | "company": "Keyence", 532 | "symbol": "KYCCF", 533 | "marketCap": 137430000, 534 | "country": "Japan" 535 | }, 536 | { 537 | "company": "Wells Fargo", 538 | "symbol": "WFC", 539 | "marketCap": 137220000, 540 | "country": "USA" 541 | }, 542 | { 543 | "company": "United Parcel Service", 544 | "symbol": "UPS", 545 | "marketCap": 136910000, 546 | "country": "USA" 547 | }, 548 | { 549 | "company": "Morgan Stanley", 550 | "symbol": "MS", 551 | "marketCap": 136140000, 552 | "country": "USA" 553 | }, 554 | { 555 | "company": "Citigroup", 556 | "symbol": "C", 557 | "marketCap": 136090000, 558 | "country": "USA" 559 | }, 560 | { 561 | "company": "Astrazeneca", 562 | "symbol": "AZN", 563 | "marketCap": 135460000, 564 | "country": "UK" 565 | }, 566 | { 567 | "company": "Bank of China", 568 | "symbol": "BACHF", 569 | "marketCap": 132660000, 570 | "country": "China" 571 | }, 572 | { 573 | "company": "Philip Morris", 574 | "symbol": "PM", 575 | "marketCap": 129390000, 576 | "country": "USA" 577 | }, 578 | { 579 | "company": "Sony", 580 | "symbol": "SNE", 581 | "marketCap": 127620000, 582 | "country": "Japan" 583 | }, 584 | { 585 | "company": "Charter Communications", 586 | "symbol": "CHTR", 587 | "marketCap": 126790000, 588 | "country": "USA" 589 | }, 590 | { 591 | "company": "Starbucks", 592 | "symbol": "SBUX", 593 | "marketCap": 124020000, 594 | "country": "USA" 595 | }, 596 | { 597 | "company": "NTT Docomo", 598 | "symbol": "NTDMF", 599 | "marketCap": 122470000, 600 | "country": "Japan" 601 | } 602 | ] 603 | -------------------------------------------------------------------------------- /server/src/main/resources/public/js/app.a6306686.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/App.vue?0f16","webpack:///./src/components/Example.vue?5af1","webpack:///./src/App.vue?47bc","webpack:///./src/components/Example.vue?0ca5","webpack:///./src/components/RankSelectionModal.vue?dab9","webpack:///src/components/RankSelectionModal.vue","webpack:///./src/components/RankSelectionModal.vue?8d6e","webpack:///./src/components/RankSelectionModal.vue","webpack:///src/components/Example.vue","webpack:///./src/components/Example.vue?8849","webpack:///./src/components/Example.vue?baf6","webpack:///src/App.vue","webpack:///./src/App.vue?3359","webpack:///./src/App.vue?2667","webpack:///./src/plugins/vuetify.js","webpack:///./src/main.js"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","executeModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","deferredModules","apply","checkDeferredModules","result","deferredModule","fulfilled","j","depId","splice","__webpack_require__","s","installedModules","exports","module","l","m","c","d","name","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","p","jsonpArray","window","oldJsonpFunction","slice","_vm","this","_h","$createElement","_c","_self","staticClass","attrs","staticStyle","_v","staticRenderFns","model","callback","$$v","panel","expression","ACTION_LIST","method","companies","on","onUpdateRank","scopedSlots","_u","fn","ref","_g","rankForm","headers","loading","item","_s","rank","symbol","toUpperCase","company","formatUSD","marketCap","getCountryFlag","country","proxy","loadData","_e","_t","dialog","close","internalValue","$set","RANK_OP","AMOUNT_LIST","isValid","components","props","type","Array","watch","computed","op","amount","set","$emit","val","methods","component","VBtn","VCard","VCardActions","VCardText","VCardTitle","VDialog","VIcon","VSelect","VSpacer","RankSelectionModal","handler","immediate","created","usd","MILLION","VCol","VContainer","VDataTable","VExpansionPanel","VExpansionPanelContent","VExpansionPanelHeader","VExpansionPanels","VRow","Example","VApp","Vue","use","Vuetify","config","productionTip","vuetify","render","h","App","$mount"],"mappings":"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","file":"js/app.a6306686.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n \t\tvar executeModules = data[2];\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t\t// add entry modules from loaded chunk to deferred list\n \t\tdeferredModules.push.apply(deferredModules, executeModules || []);\n\n \t\t// run deferred modules when all chunks ready\n \t\treturn checkDeferredModules();\n \t};\n \tfunction checkDeferredModules() {\n \t\tvar result;\n \t\tfor(var i = 0; i < deferredModules.length; i++) {\n \t\t\tvar deferredModule = deferredModules[i];\n \t\t\tvar fulfilled = true;\n \t\t\tfor(var j = 1; j < deferredModule.length; j++) {\n \t\t\t\tvar depId = deferredModule[j];\n \t\t\t\tif(installedChunks[depId] !== 0) fulfilled = false;\n \t\t\t}\n \t\t\tif(fulfilled) {\n \t\t\t\tdeferredModules.splice(i--, 1);\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = deferredModule[0]);\n \t\t\t}\n \t\t}\n\n \t\treturn result;\n \t}\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t\"app\": 0\n \t};\n\n \tvar deferredModules = [];\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/\";\n\n \tvar jsonpArray = window[\"webpackJsonp\"] = window[\"webpackJsonp\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// add entry module to deferred list\n \tdeferredModules.push([0,\"chunk-vendors\"]);\n \t// run deferred modules when ready\n \treturn checkDeferredModules();\n","export * from \"-!../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=style&index=0&lang=css&\"","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Example.vue?vue&type=style&index=0&id=6d7466c0&scoped=true&lang=css&\"","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-app',{staticClass:\"mt-0\",attrs:{\"id\":\"app\"}},[_c('div',{staticStyle:{\"position\":\"absolute\",\"top\":\"-50px\",\"right\":\"0px\",\"width\":\"300px\"}},[_c('img',{attrs:{\"src\":\"https://redislabs.com/wp-content/uploads/2020/12/RedisLabs_Illustration_HomepageHero_v4.svg\"}})]),_c('div',{staticStyle:{\"height\":\"50px\"}}),_c('h1',{staticClass:\"text-center\",staticStyle:{\"color\":\"#444444\"}},[_vm._v(\"Redis Leaderboard Demo\")]),_c('div',{staticStyle:{\"height\":\"50px\"}}),_c('example')],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-container',{staticClass:\"example\"},[_c('v-row',{staticClass:\"mb-5\"},[_c('v-col',{attrs:{\"cols\":\"12\"}},[_c('v-expansion-panels',{attrs:{\"multiple\":\"\"},model:{value:(_vm.panel),callback:function ($$v) {_vm.panel=$$v},expression:\"panel\"}},[_c('v-expansion-panel',[_c('v-expansion-panel-header',[_vm._v(\"How it works?\")]),_c('v-expansion-panel-content',[_c('b',[_vm._v(\"1. How the data is stored:\")]),_c('ol',[_c('li',[_vm._v(\"The company data is stored in a hash like below: \"),_c('pre',[_vm._v(\"HSET \\\"company:AAPL\\\" symbol \\\"AAPL\\\" market_cap \\\"2600000000000\\\" country USA\")])]),_c('li',[_vm._v(\"The Ranks are stored in a ZSET. \"),_c('pre',[_vm._v(\"ZADD companyLeaderboard 2600000000000 company:AAPL\")])])]),_c('br'),_c('b',[_vm._v(\"2. How the data is accessed:\")]),_c('ol',[_c('li',[_vm._v(\"Top 10 companies: \"),_c('pre',[_vm._v(\"ZREVRANGE companyLeaderboard 0 9 WITHSCORES\")])]),_c('li',[_vm._v(\"All companies: \"),_c('pre',[_vm._v(\"ZREVRANGE companyLeaderboard 0 -1 WITHSCORES\")])]),_c('li',[_vm._v(\"Bottom 10 companies: \"),_c('pre',[_vm._v(\"ZRANGE companyLeaderboard 0 9 WITHSCORES\")])]),_c('li',[_vm._v(\"Between rank 10 and 15: \"),_c('pre',[_vm._v(\"ZREVRANGE companyLeaderboard 9 14 WITHSCORES\")])]),_c('li',[_vm._v(\"Show ranks of AAPL, FB and TSLA: \"),_c('pre',[_vm._v(\"ZSCORE companyLeaderBoard company:AAPL company:FB company:TSLA\")])]),_c('li',[_vm._v(\"Adding market cap to companies: \"),_c('pre',[_vm._v(\"ZINCRBY companyLeaderBoard 1000000000 \\\"company:FB\\\"\")])]),_c('li',[_vm._v(\"Reducing market cap to companies: \"),_c('pre',[_vm._v(\"ZINCRBY companyLeaderBoard -1000000000 \\\"company:FB\\\"\")])]),_c('li',[_vm._v(\"Companies over a Trillion: \"),_c('pre',[_vm._v(\"ZCOUNT companyLeaderBoard 1000000000000 +inf\")])]),_c('li',[_vm._v(\"Companies between 500 billion and 1 trillion: \"),_c('pre',[_vm._v(\"ZCOUNT companyLeaderBoard 500000000000 1000000000000\")])])])])],1)],1)],1)],1),_c('v-row',[_c('v-col',{attrs:{\"cols\":\"4\"}},[_c('v-select',{staticStyle:{\"background\":\"#FFF\"},attrs:{\"items\":_vm.ACTION_LIST,\"dense\":\"\",\"outlined\":\"\",\"hide-details\":\"\"},model:{value:(_vm.method),callback:function ($$v) {_vm.method=$$v},expression:\"method\"}})],1),_c('v-col',{staticClass:\"text-right\",attrs:{\"cols\":\"8\"}},[_c('rank-selection-modal',{attrs:{\"companies\":_vm.companies},on:{\"onUpdateRank\":_vm.onUpdateRank},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-btn',_vm._g({attrs:{\"color\":\"grey\",\"outlined\":\"\"}},on),[_c('v-icon',{staticClass:\"mr-2\"},[_vm._v(\"mdi-cog-outline\")]),_c('span',{staticStyle:{\"color\":\"#111\",\"text-transform\":\"initial\"}},[_vm._v(\"Update Rank\")])],1)]}}]),model:{value:(_vm.rankForm),callback:function ($$v) {_vm.rankForm=$$v},expression:\"rankForm\"}})],1)],1),_c('v-row',[_c('v-col',{attrs:{\"cols\":\"12\"}},[_c('v-card',{staticClass:\"px-2\",staticStyle:{\"border-right\":\"10px\"}},[_c('v-data-table',{attrs:{\"headers\":_vm.headers,\"items\":_vm.companies,\"loading\":_vm.loading,\"disable-pagination\":true,\"hide-default-footer\":true},scopedSlots:_vm._u([{key:\"item.rank\",fn:function(ref){\nvar item = ref.item;\nreturn [_vm._v(\" \"+_vm._s(item.rank)+\" \")]}},{key:\"item.company\",fn:function(ref){\nvar item = ref.item;\nreturn [_c('div',{staticClass:\"d-flex align-center py-2\"},[_c('div',[_c('img',{staticClass:\"mr-3 my-2\",attrs:{\"src\":(\"https://companiesmarketcap.com//img/company-logos/80/\" + (item.symbol.toUpperCase()) + \".png\"),\"width\":\"40\",\"height\":\"40\"}})]),_c('div',[_c('div',{staticStyle:{\"font-size\":\"1.1rem\"}},[_vm._v(_vm._s(item.company))]),_c('div',{staticClass:\"grey--text\",staticStyle:{\"font-size\":\"0.7rem\"}},[_vm._v(_vm._s(item.symbol.toUpperCase()))])])])]}},{key:\"item.marketCap\",fn:function(ref){\nvar item = ref.item;\nreturn [_c('div',{},[_vm._v(_vm._s(_vm.formatUSD(item.marketCap)))])]}},{key:\"item.country\",fn:function(ref){\nvar item = ref.item;\nreturn [_c('div',{staticClass:\"d-flex align-center\"},[_c('div',[_c('img',{staticClass:\"mr-1\",attrs:{\"src\":_vm.getCountryFlag(item.country),\"width\":\"20\"}})]),_c('div',{},[_vm._v(_vm._s(item.country))])])]}},{key:\"no-data\",fn:function(){return [_c('span',[_vm._v(\" No Results Found. \")])]},proxy:true}])}),(_vm.method === 'paginate')?_c('v-btn',{attrs:{\"color\":\"primary\",\"block\":\"\"},on:{\"click\":_vm.loadData}},[_vm._v(\" Load next 10 \")]):_vm._e()],1)],1)],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-dialog',{attrs:{\"transition\":\"dialog-bottom-transition\",\"max-width\":\"400px\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nvar attrs = ref.attrs;\nreturn [_vm._t(\"activator\",null,null,{ on: on, attrs: attrs })]}}],null,true),model:{value:(_vm.dialog),callback:function ($$v) {_vm.dialog=$$v},expression:\"dialog\"}},[_c('v-card',[_c('v-card-title',[_c('v-spacer'),_c('v-icon',{attrs:{\"aria-label\":\"Close\"},on:{\"click\":_vm.close}},[_vm._v(\" mdi-close \")])],1),_c('v-card-text',[_c('div',{staticClass:\"headline text-center mb-4\"},[_vm._v(\" Select the menus below to update the rank of the companies \")]),_c('v-select',{attrs:{\"items\":_vm.companies,\"item-text\":\"company\",\"item-value\":\"symbol\",\"placeholder\":\"Select a company\",\"dense\":\"\",\"outlined\":\"\"},model:{value:(_vm.internalValue.symbol),callback:function ($$v) {_vm.$set(_vm.internalValue, \"symbol\", $$v)},expression:\"internalValue.symbol\"}}),_c('v-select',{attrs:{\"items\":_vm.RANK_OP,\"placeholder\":\"Add or Subtract\",\"dense\":\"\",\"outlined\":\"\"},model:{value:(_vm.internalValue.op),callback:function ($$v) {_vm.$set(_vm.internalValue, \"op\", $$v)},expression:\"internalValue.op\"}}),_c('v-select',{attrs:{\"items\":_vm.AMOUNT_LIST,\"placeholder\":\"Select Amount\",\"dense\":\"\",\"outlined\":\"\"},model:{value:(_vm.internalValue.amount),callback:function ($$v) {_vm.$set(_vm.internalValue, \"amount\", $$v)},expression:\"internalValue.amount\"}})],1),_c('v-card-actions',[_c('v-spacer'),_c('v-btn',{staticClass:\"mb-4\",attrs:{\"color\":\"primary\",\"disabled\":!_vm.isValid},on:{\"click\":_vm.onUpdateRank}},[_vm._v(\" Update \")])],1)],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RankSelectionModal.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RankSelectionModal.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./RankSelectionModal.vue?vue&type=template&id=67081f4c&\"\nimport script from \"./RankSelectionModal.vue?vue&type=script&lang=js&\"\nexport * from \"./RankSelectionModal.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VBtn } from 'vuetify/lib/components/VBtn';\nimport { VCard } from 'vuetify/lib/components/VCard';\nimport { VCardActions } from 'vuetify/lib/components/VCard';\nimport { VCardText } from 'vuetify/lib/components/VCard';\nimport { VCardTitle } from 'vuetify/lib/components/VCard';\nimport { VDialog } from 'vuetify/lib/components/VDialog';\nimport { VIcon } from 'vuetify/lib/components/VIcon';\nimport { VSelect } from 'vuetify/lib/components/VSelect';\nimport { VSpacer } from 'vuetify/lib/components/VGrid';\ninstallComponents(component, {VBtn,VCard,VCardActions,VCardText,VCardTitle,VDialog,VIcon,VSelect,VSpacer})\n","\n\n\n\n\n\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Example.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Example.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Example.vue?vue&type=template&id=6d7466c0&scoped=true&\"\nimport script from \"./Example.vue?vue&type=script&lang=js&\"\nexport * from \"./Example.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Example.vue?vue&type=style&index=0&id=6d7466c0&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"6d7466c0\",\n null\n \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VBtn } from 'vuetify/lib/components/VBtn';\nimport { VCard } from 'vuetify/lib/components/VCard';\nimport { VCol } from 'vuetify/lib/components/VGrid';\nimport { VContainer } from 'vuetify/lib/components/VGrid';\nimport { VDataTable } from 'vuetify/lib/components/VDataTable';\nimport { VExpansionPanel } from 'vuetify/lib/components/VExpansionPanel';\nimport { VExpansionPanelContent } from 'vuetify/lib/components/VExpansionPanel';\nimport { VExpansionPanelHeader } from 'vuetify/lib/components/VExpansionPanel';\nimport { VExpansionPanels } from 'vuetify/lib/components/VExpansionPanel';\nimport { VIcon } from 'vuetify/lib/components/VIcon';\nimport { VRow } from 'vuetify/lib/components/VGrid';\nimport { VSelect } from 'vuetify/lib/components/VSelect';\ninstallComponents(component, {VBtn,VCard,VCol,VContainer,VDataTable,VExpansionPanel,VExpansionPanelContent,VExpansionPanelHeader,VExpansionPanels,VIcon,VRow,VSelect})\n","\n\n\n\n\n","import mod from \"-!../node_modules/cache-loader/dist/cjs.js??ref--12-0!../node_modules/thread-loader/dist/cjs.js!../node_modules/babel-loader/lib/index.js!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../node_modules/cache-loader/dist/cjs.js??ref--12-0!../node_modules/thread-loader/dist/cjs.js!../node_modules/babel-loader/lib/index.js!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./App.vue?vue&type=template&id=70837e76&\"\nimport script from \"./App.vue?vue&type=script&lang=js&\"\nexport * from \"./App.vue?vue&type=script&lang=js&\"\nimport style0 from \"./App.vue?vue&type=style&index=0&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VApp } from 'vuetify/lib/components/VApp';\ninstallComponents(component, {VApp})\n","import Vue from 'vue';\nimport Vuetify from 'vuetify/lib/framework';\n\nVue.use(Vuetify);\n\nexport default new Vuetify({\n});\n","import Vue from 'vue'\nimport App from './App.vue'\nimport vuetify from './plugins/vuetify';\n\nVue.config.productionTip = false\n\nnew Vue({\n vuetify,\n render: h => h(App)\n}).$mount('#app')\n"],"sourceRoot":""} -------------------------------------------------------------------------------- /client/src/redistheme.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 254 | 255 | 256 | 257 | 258 | 259 | 260 | 261 | 262 | 263 | 264 | 265 | 266 | 267 | 268 | 269 | 270 | 271 | 272 | 273 | 274 | 275 | 276 | 277 | 278 | 279 | 280 | 281 | 282 | 283 | 284 | 285 | 286 | 288 | 290 | 291 | 292 | 293 | 294 | 295 | 296 | 297 | 298 | 300 | 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308 | 309 | 310 | 311 | 312 | 314 | 315 | 316 | 317 | 318 | 319 | 320 | 321 | 322 | 324 | 325 | 326 | 328 | 331 | 332 | 333 | 334 | 336 | 339 | 340 | 341 | 343 | 346 | 347 | 350 | 351 | 352 | 353 | 354 | 355 | 356 | 358 | 360 | 361 | 362 | 363 | 364 | 365 | 366 | 367 | 368 | 370 | 371 | 372 | 374 | 377 | 378 | 379 | 381 | 383 | 384 | 385 | 386 | 387 | 388 | 390 | 392 | 393 | 394 | 395 | 396 | 397 | 398 | 399 | 400 | 402 | 403 | 404 | 406 | 409 | 410 | 411 | 414 | 417 | 419 | 421 | 424 | 427 | 430 | 432 | 435 | 436 | 437 | 438 | 439 | 440 | 442 | 444 | 445 | 446 | 447 | 448 | 449 | 450 | 451 | 452 | 454 | 455 | 457 | 460 | 461 | 462 | 485 | 493 | 501 | 502 | 503 | 504 | 505 | 507 | 509 | 510 | 511 | 512 | 513 | 514 | 515 | 516 | 517 | 519 | 520 | 521 | 522 | 523 | 524 | 525 | 526 | 527 | 528 | 529 | 530 | 531 | 533 | 534 | 535 | 536 | 537 | 538 | 539 | 540 | 541 | 543 | 544 | 545 | 547 | 550 | 551 | 552 | 553 | 555 | 558 | 559 | 560 | 562 | 565 | 566 | 569 | 570 | 571 | 572 | 573 | 574 | 575 | 577 | 579 | 580 | 581 | 582 | 583 | 584 | 585 | 586 | 587 | 589 | 590 | 591 | 592 | 593 | 594 | 595 | 597 | 600 | 601 | 602 | 622 | 623 | 624 | 625 | 626 | 627 | 629 | 631 | 632 | 633 | 634 | 635 | 636 | 637 | 638 | 639 | 641 | 642 | 643 | 645 | 648 | 649 | 650 | 654 | 661 | 663 | 664 | 670 | 671 | 672 | 673 | 674 | 675 | 677 | 679 | 680 | 681 | 682 | 683 | 684 | 685 | 686 | 687 | 689 | 690 | 691 | 692 | 693 | 694 | 695 | 696 | 697 | 698 | 699 | 700 | 701 | 703 | 704 | 705 | 706 | 707 | 708 | 709 | 710 | 711 | 713 | 714 | 715 | 717 | 720 | 721 | 722 | 723 | 725 | 728 | 729 | 730 | 732 | 735 | 736 | 739 | 740 | 741 | 742 | 743 | 744 | 745 | 746 | 747 | 748 | 749 | 750 | 751 | 752 | 753 | 754 | 755 | 756 | 757 | 758 | 759 | 760 | 761 | 762 | 763 | --------------------------------------------------------------------------------