Commit e555ea2e authored by 神楽坂玲奈's avatar 神楽坂玲奈

动态下载地址

parent 29bba1f3
FROM node
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY package.json /usr/src/app/
RUN npm install
COPY . /usr/src/app
RUN npm run build:aot
VOLUME /usr/src/app/aot
CMD [ "echo", "mycard-store" ]
...@@ -6,7 +6,6 @@ ...@@ -6,7 +6,6 @@
<a class="navbar-brand" href="#"> <a class="navbar-brand" href="#">
<img src="https://mycard.moe/logo_60.png" width="40" height="40" class="d-inline-block align-center" alt=""> MyCard <img src="https://mycard.moe/logo_60.png" width="40" height="40" class="d-inline-block align-center" alt=""> MyCard
</a> </a>
<!--<a class="navbar-brand" href="#"></a>-->
<div class="collapse navbar-collapse" id="navbarsExampleDefault"> <div class="collapse navbar-collapse" id="navbarsExampleDefault">
<ul class="navbar-nav mr-auto"> <ul class="navbar-nav mr-auto">
...@@ -28,12 +27,13 @@ ...@@ -28,12 +27,13 @@
<div class="col-md-5" id="title"> <div class="col-md-5" id="title">
<h1 class="display-3">萌卡<sup class="titileBeta">BETA</sup></h1> <h1 class="display-3">萌卡<sup class="titileBeta">BETA</sup></h1>
<p>MyCard 同人游戏平台</p> <p>MyCard 同人游戏平台</p>
<p> <p *ngIf="latest">
<a class="btn btn-primary btn-lg" href="https://wudizhanche.mycard.moe/download?platform=win32" role="button">立即安装</a> <a class="btn btn-primary btn-lg" [href]="latest.win32.url" role="button">立即安装</a>
</p> </p>
<p> <p *ngIf="latest">
萌卡平台支持 <a href="https://wudizhanche.mycard.moe/download?platform=win32">Windows</a> 萌卡平台支持 <a [href]="latest.win32.url">Windows</a><a [href]="latest.darwin.url">Mac</a> 操作系统。
<a href="https://wudizhanche.mycard.moe/download?platform=darwin">Mac</a> 操作系统。</p> </p>
<p *ngIf="!latest">Loading...</p>
</div> </div>
<div class="col"> <div class="col">
<img id="pic" src="MyCardProduct.png"> <img id="pic" src="MyCardProduct.png">
...@@ -114,9 +114,9 @@ ...@@ -114,9 +114,9 @@
<div id="requirements-wrapper"> <div id="requirements-wrapper">
<div class="container"> <div class="container">
<div class="row"> <div class="row">
<div id="setup" class="col"> <div id="setup" class="col" *ngIf="latest">
<p>欢迎加入萌卡这个大家庭</p> <p>欢迎加入萌卡这个大家庭</p>
<a class="btn btn-primary btn-lg" href="https://wudizhanche.mycard.moe/download?platform=win32" role="button">立即安装</a> <a class="btn btn-primary btn-lg" [href]="latest.win32.url" role="button">立即安装</a>
</div> </div>
<div id="requirements" class="col"> <div id="requirements" class="col">
<p> <p>
...@@ -139,4 +139,3 @@ ...@@ -139,4 +139,3 @@
</footer> </footer>
</div> </div>
</div> </div>
import {Component, OnInit} from '@angular/core'; import {Component, OnInit} from '@angular/core';
import {Http, URLSearchParams} from '@angular/http'; import {Http, URLSearchParams} from '@angular/http';
import 'rxjs/Rx'; import 'rxjs/Rx';
import * as yaml from 'js-yaml';
@Component({ @Component({
moduleId: module.id, moduleId: module.id,
...@@ -9,22 +10,49 @@ import 'rxjs/Rx'; ...@@ -9,22 +10,49 @@ import 'rxjs/Rx';
styleUrls: ['store.component.css'], styleUrls: ['store.component.css'],
}) })
export class StoreComponent implements OnInit { export class StoreComponent implements OnInit {
signups: number; stats: {signups: number; online: number;};
online: number; latest: {win32: {version: string, url: string}, darwin: {version: string, url: string}};
constructor (private http: Http) { constructor (private http: Http) {
} }
async ngOnInit () { async ngOnInit () {
this.latest = {
win32: await this.get_latest_win32(),
darwin: await this.get_latest_darwin()
};
this.stats = {
signups: await this.get_stats_signups(),
online: await this.get_stats_online()
};
}
async get_latest_win32 () {
let data = await this.http.get('https://wudizhanche.mycard.moe/downloads/latest.yml').map(response => yaml.safeLoad(response.text())).toPromise();
data.url = 'https://r.my-card.in/downloads/' + data.path;
return data;
}
async get_latest_darwin () {
let data = await this.http.get('https://wudizhanche.mycard.moe/downloads/latest-mac.json').map(response => response.json()).toPromise();
data.url = data.url.replace('-mac.zip', '.dmg').replace('https://wudizhanche.mycard.moe/downloads/', 'https://r.my-card.in/downloads/');
return data;
}
async get_stats_signups () {
let params = new URLSearchParams(); let params = new URLSearchParams();
params.set('api_key', 'dc7298a754828b3d26b709f035a0eeceb43e73cbd8c4fa8dec18951f8a95d2bc'); params.set('api_key', 'dc7298a754828b3d26b709f035a0eeceb43e73cbd8c4fa8dec18951f8a95d2bc');
params.set('api_username', 'zh99998'); params.set('api_username', 'zh99998');
let data = await this.http.get('https://ygobbs.com/admin/dashboard.json', {search: params}) let data = await this.http.get('https://ygobbs.com/admin/dashboard.json', {search: params})
.map(response => response.json()).toPromise(); .map(response => response.json()).toPromise();
this.signups = data.global_reports.find((item: any) => item.type === 'signups').total; return data.global_reports.find((item: any) => item.type === 'signups').total;
}
async get_stats_online () {
let document = await this.http.get('https://chat.mycard.moe/stats/online') let document = await this.http.get('https://chat.mycard.moe/stats/online')
.map(response => new DOMParser().parseFromString(response.text(), 'text/xml')).toPromise(); .map(response => new DOMParser().parseFromString(response.text(), 'text/xml')).toPromise();
this.online = parseInt(document.querySelector('#content > table > tbody > tr:nth-child(2) > td:nth-child(2)').textContent); return parseInt(document.querySelector('#content > table > tbody > tr:nth-child(2) > td:nth-child(2)').textContent);
} }
} }
...@@ -28,28 +28,30 @@ ...@@ -28,28 +28,30 @@
"@angular/platform-browser": "latest", "@angular/platform-browser": "latest",
"@angular/platform-browser-dynamic": "latest", "@angular/platform-browser-dynamic": "latest",
"@angular/router": "latest", "@angular/router": "latest",
"@types/bootstrap": "latest",
"@types/jquery": "latest",
"@types/node": "^7.0.1",
"@types/tether": "latest",
"angular-in-memory-web-api": "latest", "angular-in-memory-web-api": "latest",
"bootstrap": "next", "bootstrap": "next",
"core-js": "latest", "core-js": "latest",
"jquery": "latest", "jquery": "latest",
"js-yaml": "latest",
"rxjs": "latest", "rxjs": "latest",
"systemjs": "latest", "systemjs": "latest",
"tether": "latest", "tether": "latest",
"zone.js": "^0.7.4" "zone.js": "latest"
}, },
"devDependencies": { "devDependencies": {
"@angular/compiler-cli": "^2.4.4", "@angular/compiler-cli": "latest",
"@angular/platform-server": "^2.4.4", "@angular/platform-server": "latest",
"@types/bootstrap": "latest",
"@types/jquery": "latest",
"@types/js-yaml": "latest",
"@types/node": "latest",
"@types/tether": "latest",
"lite-server": "latest", "lite-server": "latest",
"rollup": "^0.41.4", "rollup": "latest",
"rollup-plugin-commonjs": "^7.0.0", "rollup-plugin-commonjs": "latest",
"rollup-plugin-node-resolve": "^2.0.0", "rollup-plugin-node-resolve": "latest",
"rollup-plugin-uglify": "^1.0.1", "rollup-plugin-uglify": "latest",
"tslint": "^3.15.1", "tslint": "latest",
"typescript": "latest" "typescript": "latest"
}, },
"repository": {} "repository": {}
......
...@@ -29,7 +29,8 @@ ...@@ -29,7 +29,8 @@
'jquery': 'npm:jquery/dist/jquery.min.js', 'jquery': 'npm:jquery/dist/jquery.min.js',
'tether': 'npm:tether/dist/js/tether.min.js', 'tether': 'npm:tether/dist/js/tether.min.js',
'bootstrap': 'npm:bootstrap/dist/js/bootstrap.min.js' 'bootstrap': 'npm:bootstrap/dist/js/bootstrap.min.js',
'js-yaml': 'npm:js-yaml/dist/js-yaml.min.js'
}, },
// packages tells the System loader how to load when no filename and/or no extension // packages tells the System loader how to load when no filename and/or no extension
packages: { packages: {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment