1
0
mirror of https://codeberg.org/ilovexjp/health-code-simulator.git synced 2024-11-24 12:37:37 +08:00
This commit is contained in:
ilovexjp 2022-11-29 17:07:18 +08:00
parent 29964454b5
commit 801e161bf1
69 changed files with 2745 additions and 346 deletions

View File

@ -1,13 +0,0 @@
build: clean makeassets
./build.sh
serve: makeassets
sass --watch src/common/nav.scss src/common/nav.css &
python3 -m http.server --directory src 80
makeassets:
sed -i "s/\(\/\*\ BEGIN\ ASSETS\ \*\/\).*/\1/" src/service-worker.js || sed -i "" "s/\(\/\*\ BEGIN\ ASSETS\ \*\/\).*/\1/" src/service-worker.js
./makeassets.sh >> src/service-worker.js
clean:
rm -rf build

View File

@ -1,27 +1,24 @@
# health-code-simulator
常见问题:[FAQ.md](https://codeberg.org/ilovexjp/health-code-simulator/src/branch/main/docs/FAQ.md)
## Installation
Telegram 频道:[@gh_ilovexjp](https://t.me/gh_ilovexjp)
```shell
npm install
```
网页演示:[Cloudflare](https://ilovexjp.pages.dev)
## Development
Reddit: [r/ILoveHealthCode](https://reddit.com/r/ILoveHealthCode)
```shell
npm run dev
# develop with https server
npm run dev:https
```
## Build
### Build for production
```shell
npm i -g uglify-js clean-css-cli html-minifier sass
make build
```
### Launch local server
Requires python3.
```shell
npm i -g sass
make serve
npm run build
```

91
build.mjs Normal file
View File

@ -0,0 +1,91 @@
import { task, build, watch, serve } from './buildrunner.mjs';
import { appendFile } from 'node:fs/promises';
import { fileURLToPath } from 'node:url';
import path from 'node:path';
import HTMLMinifier from 'html-minifier';
import CleanCSS from 'clean-css';
import UglifyJS from 'uglify-js';
import sass from 'sass';
import _ from 'lodash';
import { globby } from 'globby';
const htmlOptions = {
collapseWhitespace: true,
removeComments: true,
removeOptionalTags: true,
removeRedundantAttributes: true,
removeScriptTypeAttributes: true,
removeTagWhitespace: true,
useShortDoctype: true,
minifyCSS: true,
minifyJS: true,
};
const cssCleanner = new CleanCSS();
const isDev = process.argv.includes('--dev');
task('src/common/nav.scss')
.transform((contents, ctx) => {
const result = sass.compileString(contents.toString(), { loadPaths: [ctx.path()], sourceMap: false });
ctx.watch(result.loadedUrls.map(fileURLToPath), { markAsBuilt: true });
return result.css;
})
.staged('src/common/nav.css');
const selfDestroyingSW = `
self.addEventListener('install', function(e) {
self.skipWaiting();
});
self.addEventListener('activate', function(e) {
self.registration.unregister()
.then(function() {
return self.clients.matchAll();
})
.then(function(clients) {
clients.forEach(client => client.navigate(client.url))
});
});`
task('src/service-worker.js')
.transform((contents) => isDev ? selfDestroyingSW : contents)
.staged();
if(!isDev) {
task('src/**/*.html')
.transform((contents) => HTMLMinifier.minify(contents.toString(), htmlOptions));
task('src/**/*.css')
.transform((contents) => cssCleanner.minify(contents.toString()).styles);
task('src/**/*.js')
.transform((contents) => UglifyJS.minify(contents.toString()).code);
}
// copy rest files
task(['src/**/*']);
await build('build/');
if(!isDev) {
const files = await globby(['build/**/*', '!build/service-worker.js']);
const assets = _.groupBy(files.map(file => file.substring(6)), // strip 'build/'
file => file.includes(path.sep) ? file.split(path.sep, 1)[0] : 'root');
await appendFile('build/service-worker.js', `;assets = ${JSON.stringify(assets)}`);
}
if(process.argv.includes('--watch')) {
watch();
}
if(process.argv.includes('--serve')) {
serve();
} else if(process.argv.includes('--serve-https')) {
serve({
https: {
key: './tools/local-https/key.pem',
cert: './tools/local-https/cert.pem'
}
});
}

View File

@ -1,32 +0,0 @@
echo "Building project..."
BUILDPATH=./build
mkdir $BUILDPATH
echo "Copying files..."
cp -R ./src/* $BUILDPATH/
echo "Compiling..."
sass --no-source-map ./src/common/nav.scss:./build/common/nav.css
rm ./build/common/nav.css.map
rm ./build/common/nav.scss
rm -rf ./build/common/components
for file in $( find src -type f -name "*.html"); do
html-minifier $file --collapse-whitespace --remove-comments --remove-optional-tags --remove-redundant-attributes --remove-script-type-attributes --remove-tag-whitespace --use-short-doctype --minify-css true --minify-js > $BUILDPATH/${file#*src/} &&
echo "+"${file#*src/} &
done
for file in $( find src -type f -name "*.css"); do
cleancss -o $BUILDPATH/${file#*src/} $file &&
echo "+"${file#*src/} &
done
for file in $( find src -type f -name "*.js"); do
uglifyjs $file -c -o $BUILDPATH/${file#*src/} &&
echo "+"${file#*src/} &
done
wait;
echo "Build complete"

223
buildrunner.mjs Normal file
View File

@ -0,0 +1,223 @@
import { globby } from 'globby';
import micromatch from 'micromatch';
import { readFile, writeFile, copyFile, mkdir } from 'node:fs/promises';
import path from 'node:path';
import chokidar from 'chokidar';
import { createServer } from 'http-server';
const tasks = [];
const STAGED_KEEP = Symbol();
class TaskRegister {
constructor(src) {
tasks.push({ src });
this.index = tasks.length - 1;
}
transform(cb) {
tasks[this.index].transform = cb;
return this;
}
staged(val) {
tasks[this.index].staged = val || STAGED_KEEP;
return this;
}
}
export function task(src) {
return new TaskRegister(src);
}
function transformStagedFilename(staged, file) {
if(staged === STAGED_KEEP) {
return file;
} else if(typeof staged === 'string' || staged instanceof String) {
return staged.toString();
} else if(typeof staged === 'function') {
return staged(file);
}
console.error('unrecognized staged type', typeof(staged));
}
export function replaceExtension(file, newExtension) {
return path.parse(file).name + newExtension;
}
const history = new Map();
const watches = new Map();
let basePath = 'dist/';
async function getFileContent(file) {
if(history.has(file)) {
const item = history.get(file);
if(item.content != null) {
return item.content;
}
}
return await readFile(file);
}
function getHistory(file) {
if(!history.has(file)) history.set(file, {});
return history.get(file);
}
function getWatch(file) {
if(!watches.has(file)) watches.set(file, {
/**
* task indexes
*/
passes: [],
/**
* use another file as task entry
*/
entry: '',
/**
* execute passes and redirect to another file
*/
redirect: '',
});
return watches.get(file);
}
class TaskContext {
constructor(index, file) {
this.index = index;
this.file = file;
}
file() { return this.file; }
path() { return path.dirname(this.file); }
watch(file, { markAsBuilt = false } = {}) {
const files = (Array.isArray(file) ? file : files).map(f => path.relative('.', f));
for(const f of files) {
getWatch(f).entry = this.file;
getWatch(f).passes.push(this.index);
if(markAsBuilt) {
getHistory(f).built = true;
console.log(`[-] dependency ${f} marked as built`);
}
}
}
}
async function doTask(index, file, addToWatch) {
const task = tasks[index];
const { dir } = path.parse(file);
const destinationFolder = dir.replace(dir.split('/')[0], basePath);
await mkdir(destinationFolder, { recursive: true });
const outFile = path.join(destinationFolder, path.basename(file));
const isDirectCopy = !task.staged && !task.transform && getHistory(file).content == null;
if(isDirectCopy) {
await copyFile(file, outFile);
console.log(`[>] ${file}${outFile}`);
return;
}
let content = await getFileContent(file);
if(task.transform) {
const ctx = new TaskContext(index, file);
content = task.transform(content, ctx);
}
if(task.staged) {
const newFile = transformStagedFilename(task.staged, file);
getHistory(newFile).built = false;
getHistory(newFile).content = content;
addToWatch && getWatch(file).passes.push(index);
if(newFile !== file) {
// set old file built so that it won't build again
getHistory(file).built = true;
addToWatch && (getWatch(file).redirect = newFile);
console.log(`[^] ${file}${newFile} staged`);
} else {
console.log(`[^] ${file} staged`);
}
} else {
await writeFile(outFile, content);
getHistory(file).built = true;
addToWatch && getWatch(file).passes.push(index);
console.log(`[+] ${file}${outFile}`);
}
}
export async function build(outPath) {
basePath = outPath;
history.clear();
watches.clear();
for(let i = 0; i < tasks.length; i++) {
const files = [...new Set(
(await globby(tasks[i].src)) // glob files
.concat(micromatch([...history.keys()], tasks[i].src)) // staged files
.filter(file => !getHistory(file).built)
)];
await Promise.all(files.map(file => doTask(i, file, true)));
}
console.log('[✓] build completed.');
}
async function onFileChanged(file) {
let curFile = file;
while(curFile) {
const watch = watches.get(curFile);
if(watch.entry) {
curFile = watch.entry;
continue;
}
for(let pass of watch.passes) {
await doTask(pass, curFile, false);
}
if(watch.redirect) {
curFile = watch.redirect;
continue;
}
curFile = '';
}
}
export function watch() {
// all built files and dependencies
chokidar.watch([...watches.keys()], { ignoreInitial: true })
.on('change', onFileChanged);
// watch new files
for(let i = 0; i < tasks.length; i++) {
chokidar.watch(tasks[i].src, { ignoreInitial: true })
.on('add', file => doTask(i, file, true));
}
console.log(`[ ] watching file changes`);
}
export function serve({ host = '0.0.0.0', port = 3001, https } = {}) {
createServer({
root: basePath,
https,
}).listen(port, host);
console.log(`[ ] server started on ${https ? 'https' : 'http'}://${host}:${port}`);
}

View File

@ -1,14 +0,0 @@
cd src
printf "assets={"
printf "\"root\":[\"./\","
find . -maxdepth 1 -type f -not -path "*/.*" -not -path "./service-worker.js" | xargs printf "\"%s\"," "$@"
printf "],"
for DIR in $(find . -type d -mindepth 1 -maxdepth 1); do
printf "\""${DIR#*./}"\":["
printf "\"%s/\"," "${DIR#*./}"
find $DIR -type f -not -path "*/.*" -not -name "*.scss" -not -name "*.css.map" | xargs printf "\"%s\"," "$@"
# find $DIR -type d -not -path '*/.*' | xargs printf "\"%s/\"," "$@"
printf "],"
done
printf "};"

1675
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

32
package.json Normal file
View File

@ -0,0 +1,32 @@
{
"name": "health-code-simulator",
"version": "0.0.1",
"main": "index.js",
"directories": {
"doc": "docs"
},
"scripts": {
"dev": "node build.mjs --dev --watch --serve",
"dev:https": "node build.mjs --dev --watch --serve-https",
"build": "node build.mjs",
"build:serve": "node build.mjs --serve"
},
"repository": {
"type": "git",
"url": "git+https://codeberg.org/ilovexjp/health-code-simulator.git"
},
"homepage": "https://codeberg.org/ilovexjp/health-code-simulator",
"devDependencies": {
"chokidar": "^3.5.3",
"clean-css": "^5.3.1",
"globby": "^13.1.2",
"html-minifier": "^4.0.0",
"http-server": "^14.1.1",
"micromatch": "^4.0.5",
"sass": "^1.56.1",
"uglify-js": "^3.17.4"
},
"dependencies": {
"lodash": "^4.17.21"
}
}

View File

@ -105,38 +105,6 @@ body {
opacity: 0.6;
}
.app:has(.app-menu-item.active[data-role="pin"]):not(.inactivated) {
order: -1;
}
.app.inactivated {
order: 1000 !important;
}
.app.inactivated .app-title {
color: rgba(0, 0, 0, 0.6);
font-size: 14px;
margin-left: 8px;
}
.app.inactivated .app-title::after {
content: "暂不可用";
margin-left: 5px;
font-weight: 400;
}
.app.inactivated .app-menu {
display: none;
}
.app.inactivated .app-content > img {
display: none;
}
.app.inactivated .app-title-icon {
display: none;
}
.app-content {
display: flex;
flex-direction: row;

View File

@ -15,9 +15,9 @@ const apps = {
help_text:
"<p>点击姓名、城市、场所地址等可以修改对应<p>点击二维码可以切换 “粤康码” 及 “粤康码场所通行” 页面。</p>",
menu: [
{ title: "场所", icon: "place", link: "ykm/checkin.html" },
{ title: "核酸", icon: "vaccines", link: "ykm/detail.html" },
{ title: "广州", icon: "map", link: "gwongzau-hc/checkin.html" },
{ title: "场所", icon: "@place", link: "ykm/checkin.html" },
{ title: "核酸", icon: "@vaccines", link: "ykm/detail.html" },
{ title: "广州", icon: "@map", link: "gwongzau-hc/checkin.html" },
],
},
"skm": {
@ -28,8 +28,8 @@ const apps = {
help_text:
"<p>点击姓名、证件号、场所地址等可以修改对应信息;</p><p>点击二维码可以展示签到页面。</p>",
menu: [
{ title: "场所", icon: "place", link: "skm/index.html#checkin" },
{ title: "核酸", icon: "vaccines", link: "skm/detail.html" },
{ title: "场所", icon: "@place", link: "skm/index.html#checkin" },
{ title: "核酸", icon: "@vaccines", link: "skm/detail.html" },
],
},
"jkb": {
@ -40,8 +40,8 @@ const apps = {
help_text:
"<p>点击姓名、证件号可以修改对应信息;</p><p>点击照片可以更改或移除照片,超过 4MB 的图片可能无法在本地保存;</p><p>点击右上角二维码标志可以在 “本人健康码自查询” 和 “本人信息扫码登记” 间切换;</p><p>点击 “未见异常” 可以切换 “通勤” 标志。</p>",
menu: [
{ title: "扫描", icon: "qr_code_scanner", link: "jkb/scan.html" },
{ title: "场所", icon: "place", link: "jkb/checkin.html" },
{ title: "扫描", icon: "@qr_code_scanner", link: "jkb/scan.html" },
{ title: "场所", icon: "@place", link: "jkb/checkin.html" },
],
},
"tfjkt": {
@ -51,9 +51,66 @@ const apps = {
color: "#0ba099",
help_text:
"<p>点击姓名、证件号、场所地址等可以修改对应信息;</p><p>点击“扫场所码”展示场所码。</p>",
menu: [{ title: "场所", icon: "place", link: "tfjkt/checkin.html" }],
menu: [{ title: "场所", icon: "@place", link: "tfjkt/checkin.html" }],
},
"ssm": {
html: `
<div class="app" data-link="ssm/index.html" data-role="app" data-app-name="ssm"
style="padding: 0 0 8px 0; margin: 18px 0 60px 0; border-radius: 8px; background-color: #eee; position: relative;">
<div style="justify-content: space-between; padding: 6px 10px; color: white; background-color: blue;
border-radius: 8px 8px 0 0; display: flex; align-items: center;">
<span style="width: 20px; text-align: center;"></span>
<span style="font-weight: 500; font-size: 22px;">乌鲁木齐中路</span>
<span style="width: 20px; text-align: center;"></span>
</div>
<div style="justify-content: space-between; padding: 2px 10px; color: #777; background-color: white;
border-radius: 0 0 8px 8px; display: flex; align-items: center;">
<span style="width: 20px; text-align: center;">N</span>
<span style="font-weight: 500; font-size: 16px;">Wulumuqi Rd.(M)</span>
<span style="width: 20px; text-align: center;">S</span>
</div>
<div class="app-content" style="justify-content: center;">
<div class="app-description">
<div class="app-menu" style="width: 100%;justify-content: center;">
<style>
.app[data-app-name="ssm"] .app-menu-item:not(.active) { background: white; }
</style>
<div class="app-menu-item" data-role="link" data-link="ssm">
<img class="app-menu-app-icon" src="ssm/static/ssbapp-logo.png"
style="border-radius: 20px; margin-right: 2px;">
<span class="app-menu-app-title">随申码</span>
</div>
<div class="app-menu-item" data-role="link" data-link="ssm/scan.html">
<img class="app-menu-app-icon" src="common/icons/qr_code_scanner.svg">
<span class="app-menu-app-title">扫描</span>
</div>
<div class="app-menu-item" data-role="link" data-link="ssm/checkin.html">
<img class="app-menu-app-icon" src="common/icons/place.svg">
<span class="app-menu-app-title">场所</span>
</div>
<div class="app-menu-item ${localStorage.getItem("pinned")
&& localStorage.getItem("pinned").split(",").indexOf("ssm") >= 0
&& "active" || ""}" data-role="pin">
<img class="app-menu-app-icon" src="common/icons/push_pin.svg">
</div>
<div class="app-menu-item" data-role="help" style="margin-right: 0;">
<img class="app-menu-app-icon" src="common/icons/info.svg">
</div>
</div>
</div>
</div>
<div style="border-width: 0 3px 0 3px; border-color: #555; border-style: solid; background-color: #eee;
width: 24px; height: 60px; align-self: center; position: absolute; top: 117.5px;"></div>
<div class="app-help" style="position: fixed; bottom: 0; left: 0; margin: 30px 12px;
background-color: #fff; border: 2px solid #000; z-index: 20;"
onclick="this.style.display = 'none';
this.closest('.app').querySelector('.app-menu-item[data-role=help]').classList.remove('active');">
<div class="app-help-subtitle">随申码使用说明</div>
<p>点击姓名证件号场所地址等可以修改对应信息</p>
<p>点击照片可以更改或移除照片超过 4MB 的图片可能无法在本地保存</p>
<p>点击二维码展示场所码</p>
</div>
</div>`,
title: "随申码",
icon: "ssm/static/ssbapp-logo.png",
link: "ssm/index.html",
@ -61,8 +118,9 @@ const apps = {
help_text:
"<p>点击姓名、证件号、场所地址等可以修改对应信息;</p><p>点击照片可以更改或移除照片,超过 4MB 的图片可能无法在本地保存;</p><p>点击二维码展示场所码。</p>",
menu: [
{ title: "扫描", icon: "qr_code_scanner", link: "ssm/scan.html" },
{ title: "场所", icon: "place", link: "ssm/checkin.html" },
// { title: "随申码", icon: "ssm/static/ssbapp-logo.png", link: "ssm" },
{ title: "扫描", icon: "@qr_code_scanner", link: "ssm/scan.html" },
{ title: "场所", icon: "@place", link: "ssm/checkin.html" },
],
},
"shandong-hc": {
@ -75,10 +133,10 @@ const apps = {
menu: [
{
title: "场所",
icon: "place",
icon: "@place",
link: "shandong-hc/index.html#checkin",
},
{ title: "威海", icon: "map", link: "weihai-hc/index.html" },
{ title: "威海", icon: "@map", link: "weihai-hc/index.html" },
],
contributors: [
{
@ -109,7 +167,7 @@ const apps = {
icon: "hunan-hc/static/logo-b18dcf7bf55c412ec04989061d0512ad.png",
link: "hunan-hc/index.html",
help_text: "<p>点击姓名、证件号、采样点、场所地址等可以修改对应信息。</p><p>点击“二维码”可以切换“健康卡”与“场所码”</p>",
menu: [{ title: "场所", icon: "place", link: "hunan-hc/checkin.html"}],
menu: [{ title: "场所", icon: "@place", link: "hunan-hc/checkin.html"}],
contributors: [
{ name: "uodedcli", description: "参与制作", style: "namestrip" },
],
@ -121,7 +179,7 @@ const apps = {
color: "#3a5eff",
help_text:
"<p>点击姓名、证件号可以修改对应信息;</p><p>点击 “扫一扫” 进入场所张贴码。</p>",
menu: [{ title: "场所", icon: "place", link: "fujian-hc/checkin.html" }],
menu: [{ title: "场所", icon: "@place", link: "fujian-hc/checkin.html" }],
},
"zhejiang-hc": {
title: "浙江健康码",
@ -137,7 +195,7 @@ const apps = {
color: "#e84336",
help_text:
"<p>点击城市名、姓名、证件号可以修改对应信息;</p><p>点击二维码可以切换至“疫情防控场所码”。</p>",
menu: [{ title: "场所", icon: "place", link: "henan-hc/checkin.html" }],
menu: [{ title: "场所", icon: "@place", link: "henan-hc/checkin.html" }],
},
"tianjin-hc": {
title: "天津数字防疫",
@ -153,7 +211,10 @@ const apps = {
color: "#0bae81",
help_text:
"<p>点击地点名称、姓名、证件号可以修改对应信息;</p><p>点击核酸检测时间可以切换小时数;</p><p>点击“已采样”可以切换今日是否采样。</p>",
menu: [{ title: "场所", icon: "place", link: "shaanxi-hc/checkin.html" }],
menu: [
{ title: "场所", icon: "@place", link: "shaanxi-hc/checkin.html" },
{ title: "核酸", icon: "@vaccines", link: "shaanxi-hc/nucResult.html" },
],
},
"chongqing-hc": {
title: "渝康码",
@ -162,8 +223,8 @@ const apps = {
color: "#f5aa06",
help_text: "<p>点击地点名称、姓名、证件号可以修改对应信息;</p><p>点击二维码可以切换至重庆市“场所码”。</p>",
menu: [
{ title: "场所", icon: "place", link: "chongqing-hc/checkin.html" },
{ title: "核酸", icon: "vaccines", link: "chongqing-hc/detail.html" },
{ title: "场所", icon: "@place", link: "chongqing-hc/checkin.html" },
{ title: "核酸", icon: "@vaccines", link: "chongqing-hc/detail.html" },
]
},
"hebei-hc": {
@ -175,19 +236,20 @@ const apps = {
},
};
function onIconFail(t) {
t.closest(".app").classList.add("inactivated");
}
function render() {
let html = "";
for (const [name, app] of Object.entries(apps)) {
if (app.html) { html += app.html; continue; }
let menu_html = "";
if (app.menu) {
for (const menu_item of app.menu) {
let icon = menu_item.icon || "@qr_code";
if (icon.startsWith("@")) {
icon = `common/icons/${icon.slice(1)}.svg`;
}
menu_html += `
<div class="app-menu-item" data-role="link" data-link="${menu_item.link || ""}">
<img class="app-menu-app-icon" src="common/icons/${menu_item.icon || "qr_code"}.svg"></img>
<img class="app-menu-app-icon" src="${icon}"></img>
<span class="app-menu-app-title">${menu_item.title}</span>
</div>
`;
@ -231,7 +293,7 @@ function render() {
html += `
<div class="app" data-link="${app.link || ""}" data-role="app" data-app-name="${name}">
<div class="app-content">
<img src="${app.icon}" onerror="onIconFail(this);" style="border-color: ${app.color || "#aaa"};">
${app.icon && `<img src="${app.icon}" style="border-color: ${app.color || "#aaa"};">` || ""}
<div class="app-description">
<div class="app-title-wrapper">
<span class="app-title">${app.title}</span>
@ -257,7 +319,7 @@ function render() {
document.querySelector(".apps-list").innerHTML = html;
const elements = [
...document.querySelectorAll(".app:not(.inactivated)"),
...document.querySelectorAll(".app"),
...document.getElementsByClassName("app-menu-item")
];
if (elements.length) {
@ -268,7 +330,6 @@ function render() {
if (data_link) {
element.addEventListener("click", (e) => {
e.stopPropagation();
if (element.classList.contains("inactivated")) return;
// try {
// navigator.serviceWorker.controller.postMessage({
// type: "download",
@ -324,12 +385,12 @@ function render() {
const pinned_list = localStorage.getItem("pinned") ? localStorage.getItem("pinned").split(",") : [];
if (pinned_list) {
for (const element of document.querySelectorAll(".app:not(.inactivated)") || []) {
for (const element of document.querySelectorAll(".app") || []) {
if (pinned_list.includes(element.attributes["data-app-name"].value)) {
element.style.order = -1;
}
element.addEventListener("touchstart", (e) => {
if (!(e.target.classList && e.target.classList[0].startsWith("app-menu-item")))
if (!(e.target.classList[0] && e.target.classList[0].startsWith("app-menu-item")))
element.classList.add("selected");
});
element.addEventListener("touchmove", () => {
@ -452,7 +513,7 @@ function render() {
document.querySelector(".sw-status").innerHTML = `
<div class="icon-align" onclick="toggleDisplay('#pwa-install-help');">
<img class="icon" src="common/icons/add_box.svg">
<span>添加至主屏幕</span>
<span>全屏显示</span>
</div>`;
} else {
document.querySelector(".sw-status").innerHTML = `

View File

@ -257,7 +257,7 @@
<script>
setDynamicTime("#datetime");
setStaticTime(".covid-test-time", 0, 19, 12, 12)
addStorageField("_name", "#name", "名字", "习近平", presetFilters.lastnameonly);
addStorageField("_name", "#name", "名字", "习近平", presetFilters.name_preferlastname);
addStorageField("_idcard", "#idcard", "身份证号", "110101195306153019", presetFilters.idcard(4, 4));
addStorageField("_covid_test_institution", ".covid-test-institution", "检测机构", "河北省疾病预防控制中心");

View File

@ -61,6 +61,9 @@
<img src="common/icons/download_done.svg">
后项目可离线使用
</div>
<div class="link-wrapper">
<a href="https://twitter.com/RhgbuEaAsCCyPrA/status/1597142947774230530" style="margin-right: 6px;">境外势力</a> 强势驱动
</div>
</div>
<div class="links-list links-list-help">
@ -74,7 +77,7 @@
<a id="clear-local-data">清除本地数据</a>
</div>
<div class="link-wrapper">
<span id="last-update" onclick="updateServiceWorker(this);">上次更新2022-11-25<span id="last-update-version"></span></span>
<span id="last-update" onclick="updateServiceWorker(this);">上次更新2022-11-29<span id="last-update-version"></span></span>
</div>
</div>
</footer>

View File

@ -186,7 +186,7 @@
<span>获取到的所有信息均在本地处理</span>
<br>
<span>“扫描” 开始后</span>
<span><b>轻触屏幕</b> 将会 <b>播放“绿码,核酸一天”提示音</b></span>
<span><b>轻触屏幕</b> 将会播放 <b>“绿码,核酸一天”</b> 提示音</span>
<span>并显示北京健康宝页面</span>
<br><br>
<p id="tap-to-continue">轻触屏幕继续...</p>

File diff suppressed because one or more lines are too long

View File

@ -126,7 +126,7 @@
<view style="width:50px;height:50px;border-radius:0px;overflow:visible;background-color:transparent"
class="u-image data-v-042b391e">
<image src="./static/index/hsjccx.png" mode="aspectFill"
style="border-radius:0px;width:50px;height:50px;" role="img" class="u-image__image data-v-042b391e">
style="border-radius:0px;width:50px;height:50px;" role="img" class="u-image__image data-v-042b391e" onclick="window.location.href='nucResult.html';">
</image>
</view>
</view>

View File

@ -82,7 +82,7 @@
<view style="width:50px;height:50px;border-radius:0px;overflow:visible;background-color:transparent"
class="u-image data-v-042b391e">
<image src="./static/index/hsjccx.png" mode="aspectFill"
style="border-radius:0px;width:50px;height:50px;" role="img" class="u-image__image data-v-042b391e">
style="border-radius:0px;width:50px;height:50px;" role="img" class="u-image__image data-v-042b391e" onclick="window.location.href='nucResult.html';">
</image>
</view>
</view>

View File

@ -0,0 +1,132 @@
<!DOCTYPE html>
<html>
<head>
<title>核酸检测查询</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="viewport"
content="width=device-width,height=device-height,viewport-fit=cover,initial-scale=1,maximum-scale=1,user-scalable=0">
<meta name="theme-color" content="#0bae81">
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
<link rel="icon" type="image/png" href="./static/myCode/greenLogo.png">
<link rel="manifest" href="manifest.json">
<link rel="apple-touch-icon" sizes="145x144" href="./static/myCode/greenLogo.png">
<link rel="stylesheet" href="../common/nav.css">
<link rel="stylesheet" type="text/css" href="./static/css/main-menu.css">
<link rel="stylesheet" type="text/css" href="./static/css/index.css">
<link rel="stylesheet" type="text/css" href="./static/css/u-image.css">
<link rel="stylesheet" type="text/css" href="./static/css/app.css">
<link rel="stylesheet" type="text/css" href="./static/css/qrcode.css">
<link rel="stylesheet" type="text/css" href="./static/css/nucResult.css">
<script src="../common/base.js"></script>
</head>
<body>
<view class="navbar navbar--wechat navbar--wechat-alternative">
<view class="navbar__placeholder"></view>
<view class="navbar__inner" style="background:#0bae81">
<view class="navbar__left">
<view class="navbar__buttons" onclick="history.back()">
<view class="navbar__button-goback"></view>
</view>
</view>
<view class="navbar__center"><text>核酸检测查询</text></view>
<view class="navbar__right"></view>
</view>
<view class="capsule capsule--wechat capsule--alternative" onclick="navigateHome()"><svg class="capsule__menu-icon"
viewBox="0 0 64 28" xmlns="http://www.w3.org/2000/svg">
<circle cx="32" cy="14" r="9.5"></circle>
<circle cx="54" cy="14" r="6"></circle>
<circle cx="10" cy="14" r="6"></circle>
</svg>
<view class="capsule__splitter"></view><svg class="capsule__exit-icon" viewBox="0 0 60 60"
xmlns="http://www.w3.org/2000/svg">
<circle cx="30" cy="30" r="9"></circle>
<circle cx="30" cy="30" r="23" stroke-width="6" fill="transparent"></circle>
</svg>
</view>
</view>
<view class="page-view nuc data-v-17195bd9">
<view class="bg data-v-17195bd9">核酸检测结果由各医院和检测机构提供,纸质检验报告到检测单位获取</view>
<view class="nuc-content data-v-17195bd9">
<view class="data-v-17195bd9">
<view class="data-v-17195bd9 today-result succuss">
<view class="t-icon t-icon-duigouxiao data-v-17195bd9"></view>
<text class="data-v-17195bd9" style="font-size:4.267vw">24小时内核酸采样已完成</text>
</view>
</view>
<view class="Chinese-English data-v-17195bd9">
<view class="tic data-v-17195bd9">48小时内核酸检测信息</view>
</view>
<view class="reportTip data-v-17195bd9">(以出具报告时间为准)</view>
<view class="nuc-item data-v-224fe6b7">
<view class="data-v-224fe6b7">
<view class="info data-v-224fe6b7">
<view class="cell data-v-224fe6b7">
<view class="label data-v-224fe6b7">姓名</view>
<text class="va data-v-224fe6b7" id="name"></text>
</view>
<view class="cell data-v-224fe6b7">
<view class="label data-v-224fe6b7">关系</view>
<text class="va data-v-224fe6b7">本人</text>
</view>
<view class="cell data-v-224fe6b7">
<view class="label data-v-224fe6b7">证件号码</view>
<text class="va data-v-224fe6b7" id="idcard"></text>
</view>
<view class="data-v-224fe6b7 result t-icon t-icon-yinxing1"></view>
<view class="ci l_ci data-v-224fe6b7"></view>
<view class="ci r_ci data-v-224fe6b7"></view>
</view>
<view class="address data-v-224fe6b7">
<view class="item data-v-224fe6b7">
<text class="label data-v-224fe6b7">采样时间:</text>
<text class="data-v-224fe6b7" id="sample-time"></text>
</view>
<view class="item data-v-224fe6b7">
<text class="label data-v-224fe6b7">检测时间:</text>
<text class="data-v-224fe6b7" id="test-time"></text>
</view>
<view class="data-v-224fe6b7">
<text class="label data-v-224fe6b7">检测机构:</text>
<text class="data-v-224fe6b7" id="test-institution"></text>
</view>
</view>
</view>
</view>
<view class="other-provinces data-v-17195bd9">
<text class="mini-btn buttonStyle data-v-17195bd9" disabled="true" plain="true" size="mini" color="#3DA2FF" text-align="center" type="warn">查询外省市核酸检测结果并上传陕西一码通</text>
</view>
<view class="data-v-17195bd9">
<view class="box data-v-17195bd9">
<text class="show-tit data-v-17195bd9">近14天全部核酸检测结果</text>
<view class="u-icon__icon data-v-2ee87dc9 uicon-arrow-down"></view>
</view>
</view>
</view>
<view class="tips-b data-v-17195bd9">
<view class="data-v-17195bd9">核酸和抗体检测数据在不断汇聚和完善中</view>
<view class="data-v-17195bd9">查询结果仅供参考</view>
</view>
<view class="bottom-btn data-v-17195bd9">
<view class="t-icon t-icon-wenti data-v-17195bd9"></view>
<text class="data-v-17195bd9">核酸检测结果异常帮助文档</text>
</view>
</view>
<script>
// addStorageField("_sample_time", "#sample-time", "采样时间", "2022-11-28 08:12:33");
// addStorageField("_test_time", "#test-time", "检测时间", "2022-11-28 08:12:33");
setStaticTime("#sample-time", 0, 19, 20, 8);
setStaticTime("#test-time", 0, 19, 12, 8);
addStorageField("_test_institution", "#test-institution", "检测机构", "西安中美弘康医学检验实验室");
addStorageField('_name', '#name', '姓名', '习近平', presetFilters.name_preferfirstname);
addStorageField('_idcard', '#idcard', '证件号码', '110101195306153019', presetFilters.idcard(1, 2));
initServiceWorker('shaanxi-hc');
</script>
</body>
</html>

View File

@ -0,0 +1,220 @@
.page-view.data-v-17195bd9 {
background: #f7f7f7;
min-height: 100vh;
position: relative;
}
.nuc.data-v-17195bd9 {
padding-bottom: 26.667vw;
}
.nuc .bg.data-v-17195bd9 {
background: #0bae81;
box-sizing: border-box;
color: #fff;
font-size: 3.733vw;
height: 18.133vw;
padding: 2.667vw 3.733vw;
}
.nuc .nuc-content.data-v-17195bd9 {
background-color: #f7f7f7;
border-radius: 2.667vw 2.667vw 0 0;
margin-top: -2.667vw;
padding: 2.667vw 3.733vw 0;
}
.nuc .nuc-content .Chinese-English.data-v-17195bd9 {
align-items: center;
display: flex;
justify-content: space-between;
margin-top: 2.667vw;
}
.nuc .nuc-content .Chinese-English .tic.data-v-17195bd9 {
color: #000;
font-size: 4.267vw;
font-weight: 600;
}
.nuc .reportTip.data-v-17195bd9 {
color: #a6a6a6;
font-family: PingFangSC-Regular,PingFang SC;
font-size: 3.2vw;
font-weight: 400;
line-height: 5.333vw;
margin-bottom: 8px;
}
.nuc .today-result.data-v-17195bd9 {
align-items: center;
border-radius: 2.667vw;
display: flex;
font-size: 4.8vw;
font-weight: 600;
height: 13.867vw;
justify-content: center;
}
.nuc .today-result .t-icon.data-v-17195bd9 {
height: 4.8vw;
margin-right: 1.6vw;
width: 4.8vw;
}
.nuc .today-result.succuss.data-v-17195bd9 {
background-color: #e0f7f1;
color: #0bae81;
}
.nuc .buttonStyle.data-v-17195bd9 {
background-color: #fff;
border: 1px solid #fff;
color: #3da2ff;
font-size: 3.733vw;
height: 8vw;
line-height: 8vw;
padding: 1.067vw 6.4vw;
width: 100%;
}
.nuc-item.data-v-224fe6b7 {
background: #fff;
border-radius: 2.667vw;
margin-bottom: 2.667vw;
}
.nuc-item .info.data-v-224fe6b7 {
border-bottom: 0.267vw dashed #a6a6a6;
font-size: 4.267vw;
padding: 2.933vw 0;
position: relative;
}
.nuc-item .info .cell.data-v-224fe6b7 {
display: flex;
padding: 1.867vw 3.733vw;
}
.nuc-item .info .label.data-v-224fe6b7 {
color: #a6a6a6;
width: 22.4vw;
}
.nuc-item .info .va.data-v-224fe6b7 {
color: #343434;
}
.nuc-item .info .result.data-v-224fe6b7 {
height: 22.4vw;
position: absolute;
right: 4vw;
top: 4vw;
width: 22.4vw;
}
.nuc-item .info .ci.data-v-224fe6b7 {
background-color: #f7f7f7;
bottom: -2.667vw;
height: 5.333vw;
position: absolute;
width: 5.333vw;
}
.nuc-item .info .ci.l_ci.data-v-224fe6b7 {
border-radius: 0 50% 50% 0;
left: -2.667vw;
}
.nuc-item .info .ci.r_ci.data-v-224fe6b7 {
border-radius: 50% 0 0 50%;
right: -2.667vw;
}
.nuc-item .address.data-v-224fe6b7 {
color: #a6a6a6;
font-size: 3.733vw;
padding: 4.8vw 3.733vw;
}
.nuc-item .address .item.data-v-224fe6b7 {
margin-bottom: 1.6vw;
}
.nuc-item .address .label.data-v-224fe6b7 {
padding-right: 2.667vw;
}
.other-provinces.data-v-17195bd9 {
background: #fff;
border-radius: 2.667vw;
color: #3da2ff;
font-size: 3.733vw;
font-weight: 400;
margin-bottom: 2.133vw;
padding: 3.2vw 0;
text-align: center;
}
.nuc .box.data-v-17195bd9 {
background: #fff;
border-radius: 2.133vw;
display: flex;
justify-content: center;
margin-bottom: 2.667vw;
padding: 3.467vw 4.133vw;
}
.nuc .show-tit.data-v-17195bd9 {
color: #343434;
padding-right: 1.067vw;
}
@font-face {
font-family:uicon-iconfont;src:url("https://at.alicdn.com/t/font_2225171_8kdcwk4po24.ttf") format("truetype");
}
.u-icon__icon.data-v-2ee87dc9 {
align-items: center;
display: flex;
flex-direction: row;
font-family: uicon-iconfont;
position: relative;
}
.nuc .tips-b.data-v-17195bd9 {
color: #a6a6a6;
font-size: 3.2vw;
line-height: 1.8;
padding: 0 0 18.667vw;
text-align: center;
}
.nuc .bottom-btn.data-v-17195bd9 {
align-items: center;
color: #ff9500;
font-size: 4.267vw;
justify-content: center;
}
.nuc .bottom-btn .t-icon.data-v-17195bd9 {
height: 4.267vw;
margin-right: 0.8vw;
width: 4.267vw;
}
.bottom-btn.data-v-17195bd9 {
align-items: center;
background: #fff;
bottom: 0;
box-sizing: border-box;
display: flex;
height: calc(16.533vw + env(safe-area-inset-bottom));
justify-content: space-between;
left: 0;
padding-bottom: env(safe-area-inset-bottom);
padding-left: 4.533vw;
padding-right: 4.533vw;
position: fixed;
width: 100vw;
z-index: 2;
}

View File

@ -79,7 +79,7 @@
<div data-v-52870d82="" id="hours"><img data-v-52870d82="" src="./src/hours.dc948a63.png"></div>
<div data-v-52870d82=""><span data-v-52870d82="">姓名:</span><span data-v-52870d82="" class="name"></span></div>
<div data-v-52870d82=""><span data-v-52870d82="">采样点:</span><span data-v-52870d82="" class="sample-spot"></span></div>
<div data-v-52870d82=""><span data-v-52870d82="">检测时间:</span><span data-v-52870d82="" class="_test_datetime" data-traceback-hours="10" data-traceback-range="4" id="red"></span>
<div data-v-52870d82=""><span data-v-52870d82="">检测时间:</span><span data-v-52870d82="" class="_test_datetime" data-traceback-hours="10" data-traceback-range="6" id="red"></span>
</div>
<div data-v-52870d82=""><span data-v-52870d82="">检测结果:</span><span data-v-52870d82=""
style="font-weight: bold; color: rgb(0, 201, 2);">阴性</span></div>
@ -89,7 +89,16 @@
<div data-v-52870d82="" id="hours"><img data-v-52870d82="" src="./src/hours.dc948a63.png"></div>
<div data-v-52870d82=""><span data-v-52870d82="">姓名:</span><span data-v-52870d82="" class="name"></span></div>
<div data-v-52870d82=""><span data-v-52870d82="">采样点:</span><span data-v-52870d82="" class="sample-spot"></span></div>
<div data-v-52870d82=""><span data-v-52870d82="">检测时间:</span><span data-v-52870d82="" class="_test_datetime" data-traceback-hours="38" data-traceback-range="4" id="red"></span>
<div data-v-52870d82=""><span data-v-52870d82="">检测时间:</span><span data-v-52870d82="" class="_test_datetime" data-traceback-hours="38" data-traceback-range="6" id="red"></span>
</div>
<div data-v-52870d82=""><span data-v-52870d82="">检测结果:</span><span data-v-52870d82=""
style="font-weight: bold; color: rgb(0, 201, 2);">阴性</span></div>
</div>
<div data-v-52870d82="" class="list-container-item">
<div data-v-52870d82="" class="bg">江苏省卫生健康委员会</div>
<div data-v-52870d82=""><span data-v-52870d82="">姓名:</span><span data-v-52870d82="" class="name"></span></div>
<div data-v-52870d82=""><span data-v-52870d82="">采样点:</span><span data-v-52870d82="" class="sample-spot"></span></div>
<div data-v-52870d82=""><span data-v-52870d82="">检测时间:</span><span data-v-52870d82="" class="_test_datetime" data-traceback-hours="58" data-traceback-range="6"></span>
</div>
<div data-v-52870d82=""><span data-v-52870d82="">检测结果:</span><span data-v-52870d82=""
style="font-weight: bold; color: rgb(0, 201, 2);">阴性</span></div>
@ -102,7 +111,7 @@
</div>
</div>
<div data-v-52870d82="" class="explain">
<p data-v-52870d82="">数据来源:江苏省卫生健康委员会,反映近30天内核酸检测情况,数据在不断汇聚和完善中。</p>
<p data-v-52870d82="">数据来源:江苏省卫生健康委员会,反映近7天内核酸检测情况,数据在不断汇聚和完善中。</p>
</div><br data-v-52870d82="">
<div data-v-52870d82="" class="footer">
<div data-v-52870d82=""><span data-v-52870d82="">技术支持:江苏省卫生健康信息中心</span></div>

View File

@ -186,8 +186,10 @@
<span>获取到的所有信息均在本地处理</span>
<br>
<span>“扫描” 开始后</span>
<span><b>轻触屏幕</b> 将会 <b>播放“绿码核酸24小时内阴性”提示音</b></span>
<span><b>轻触屏幕</b> 将会播放 <b>“绿码核酸24小时内阴性”</b>提示音</span>
<span>并显示随申码场所码页面</span>
<br>
<span>目前 <b>不能识别</b> 场所码信息,请提前编辑场所名称及地址</span>
<br><br>
<p id="tap-to-continue">轻触屏幕继续...</p>
<br><br>

View File

@ -48,7 +48,8 @@
<!-- Begin Marquee -->
<view class="wa-comp-tf-jkt-Marquee" id="id1" style="height: 6.4vw; color: black;">
<view class="container" id="id4" style="display: flex; flex-direction: row; animation-duration: 10s;">
<text class="text" id="id2" style="width: 100%; white-space: nowrap;">👉 场所码一定要扫吗?被赋黄码怎么办……四川疾控专家权威解答</text>
<text class="text" id="id2" style="width: 100%; white-space: nowrap;">👉 四川疾控健康提示2022年11月28日18时【点击查看详情】</text>
<!-- https://jiankangma-1301171536.file.myqcloud.com/res/Q9_59yNGHZ/region/notice.json -->
</view>
</view>
<!-- End Marquee -->

View File

@ -1,139 +1,128 @@
<!DOCTYPE html>
<html lang=en>
<head>
<title>天津数字防疫</title>
<meta http-equiv=Content-Type content="text/html;charset=UTF-8">
<meta name=viewport
content="width=device-width,height=device-height,viewport-fit=cover,initial-scale=1,maximum-scale=1,user-scalable=0">
<meta name=theme-color content=#004FFF>
<meta name=apple-mobile-web-app-status-bar-style content=black-translucent>
<link rel=manifest href=manifest.json>
<link rel=icon type=image/png href=./static/img/logo.png>
<link rel=apple-touch-icon href=./static/img/logo.png>
<script src=../common/base.js></script>
<style>
* {
<!DOCTYPE html><html lang=en><head><title>天津数字防疫</title><meta http-equiv=Content-Type content="text/html;charset=UTF-8"><meta name=viewport content="width=device-width,height=device-height,viewport-fit=cover,initial-scale=1,maximum-scale=1,user-scalable=0"><meta name=theme-color content=#004FFF><meta name=apple-mobile-web-app-status-bar-style content=black-translucent><link rel=manifest href=manifest.json><link rel=icon type=image/png href=./static/img/logo.png><link rel=apple-touch-icon href=./static/img/logo.png><script src=../common/base.js></script><style>* {
box-sizing: border-box;
}
/* p {
color: #fff;
font-family: sans-serif;
text-align: center;
font-weight: 600;
} */
html,
body,
.scanner-container {
width: 100%;
height: 100%;
overflow: hidden;
}
.scanner-container {
display: flex;
.scan-wrapper {
visibility: hidden;
}
.relative {
position: relative;
z-index: 1;
}
.square {
#scan {
width: 100%;
position: relative;
overflow: hidden;
transition: 0.3s;
}
.square:after {
content: '';
top: 0;
display: block;
padding-bottom: 100%;
}
.square>div {
height: 100%;
position: absolute;
top: 0;
left: 0;
bottom: 0;
right: 0;
top: 50%;
background: radial-gradient(circle, rgba(93,200,148,1) 0%, rgba(0,0,0,0) 50%);
}
.surround-cover {
box-shadow: 0 0 0 99999px rgba(0, 0, 0, 0.8);
}
.barcode-scanner--area--container {
width: 80%;
max-width: min(500px, 80vh);
margin: auto;
}
.barcode-scanner--area--outer {
display: flex;
border-radius: 1em;
}
.barcode-scanner--area--inner {
#scan-parent {
width: 100%;
margin: 1rem;
border: 2px solid #fff;
box-shadow: 0px 0px 2px 1px rgb(0 0 0 / 0.5),
inset 0px 0px 2px 1px rgb(0 0 0 / 0.5);
border-radius: 1rem;
height: 100%;
position: fixed;
left: 0;
bottom: 30%;
transform: scale(1, 0.2);
overflow: hidden;
animation: scan 2s linear infinite, opacity 1s ease-out infinite alternate;
z-index: 30;
}
@keyframes shake {
0% {
transform: translate(0, 0) rotate(0deg) scale(1);
@keyframes scan {
from {
bottom: 40%;
}
20% {
transform: translate(5px, 5px) rotate(-1deg) scale(1.05);
}
40% {
transform: translate(5px, 5px) rotate(-2deg) scale(1.07);
}
60% {
transform: translate(2px, 2px) rotate(0deg) scale(1.04);
}
80% {
transform: translate(-1px, -1px) rotate(-2deg) scale(1.05);
}
100% {
transform: translate(0, 0) rotate(0deg) scale(1);
to {
bottom: -20%;
}
}
</style>
<link href=static/css/app.75f3ec59.css rel=stylesheet>
</head>
@keyframes opacity {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
#mask {
width: 100%;
height: 100%;
position: fixed;
left: 0;
top: 0;
background-color: rgba(0, 0, 0, .2);
z-index: 10;
}
#scan-widgets > * {
z-index: 20;
}
#close-button {
position: fixed;
top: 36px;
top: calc(36px + env(safe-area-inset-top, 0));
left: 30px;
height: 26px;
width: 26px;
border-radius: 100px;
background-color: #fff;
color: rgba(0, 0, 0, .6);
display: flex;
justify-content: center;
align-items: center;
}
#album-button {
position: fixed;
right: 30px;
bottom: 90px;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
color: rgba(255, 255, 255, .87);
font-size: 14px;
}
#album-button > div {
height: 48px;
width: 48px;
border-radius: 50px;
background-color: rgba(0, 0, 0, .4);
margin-bottom: 6px;
display: flex;
justify-content: center;
align-items: center;
}
video {
position: fixed;
top: 0;
}
<body><noscript><strong>We're sorry but Webpack App doesn't work properly without JavaScript enabled. Please enable it
to continue.</strong></noscript>
<div id=app></div>
<div class=scanner-container>
<div class=barcode-scanner--area--container>
<div class=relative>
<p></p>
</div>
<div class="square surround-cover">
<div class="barcode-scanner--area--outer surround-cover">
<div class=barcode-scanner--area--inner></div>
</div>
</div>
</div>
</div>
<script src=static/js/runtime~app.2ae274cd.js></script>
<script src=static/js/app.1faafef1.js></script>
<script>initServiceWorker("tianjin-hc");</script>
</body>
body.scanner-active .scan-wrapper {
visibility: visible;
}
body.scanner-active #app {
background: transparent;
visibility: hidden;
}</style><link href=/tianjin-hc/static/css/chunk-058132aa.60a88c55.css rel=prefetch><link href=/tianjin-hc/static/css/chunk-10aabacd.0c0f497d.css rel=prefetch><link href=/tianjin-hc/static/css/chunk-48084dec.15052ed4.css rel=prefetch><link href=/tianjin-hc/static/css/chunk-4a6c042c.c61d4756.css rel=prefetch><link href=/tianjin-hc/static/css/chunk-7162b29a.a3cf78e6.css rel=prefetch><link href=/tianjin-hc/static/css/chunk-729dcadd.c112cd15.css rel=prefetch><link href=/tianjin-hc/static/css/chunk-7cef904f.61e7a339.css rel=prefetch><link href=/tianjin-hc/static/css/chunk-b6c841ba.1a0699ea.css rel=prefetch><link href=/tianjin-hc/static/js/chunk-058132aa.59160687.js rel=prefetch><link href=/tianjin-hc/static/js/chunk-10aabacd.c4180356.js rel=prefetch><link href=/tianjin-hc/static/js/chunk-15920e85.91c40b35.js rel=prefetch><link href=/tianjin-hc/static/js/chunk-2d0aba8a.97b14652.js rel=prefetch><link href=/tianjin-hc/static/js/chunk-2d0e6128.22197f0b.js rel=prefetch><link href=/tianjin-hc/static/js/chunk-2d0e93c0.e5590f8d.js rel=prefetch><link href=/tianjin-hc/static/js/chunk-48084dec.26aed5d0.js rel=prefetch><link href=/tianjin-hc/static/js/chunk-4a6c042c.481dfff5.js rel=prefetch><link href=/tianjin-hc/static/js/chunk-7162b29a.d5c616bc.js rel=prefetch><link href=/tianjin-hc/static/js/chunk-729dcadd.37078fff.js rel=prefetch><link href=/tianjin-hc/static/js/chunk-784448d2.2ff3b8e1.js rel=prefetch><link href=/tianjin-hc/static/js/chunk-7cef904f.47e43f2e.js rel=prefetch><link href=/tianjin-hc/static/js/chunk-b6c841ba.7f570979.js rel=prefetch><link href=/tianjin-hc/static/css/index.69aca790.css rel=preload as=style><link href=/tianjin-hc/static/js/index.abc09dc0.js rel=preload as=script><link href=/tianjin-hc/static/css/index.69aca790.css rel=stylesheet></head><body><noscript><strong>We're sorry but Webpack App doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id=app></div><audio id=qrcode-found style="display: none;" src=./qrcode_found.wav></audio><div id=scan-wrapper class=scan-wrapper><video id=scanner-camera width=auto height=100% autoplay muted playsinline></video><div id=mask></div><div id=scan-parent><div id=scan></div></div><div id=scan-widgets><div id=close-button onclick=""><svg xmlns=http://www.w3.org/2000/svg height=14px viewBox="0 0 24 24" width=14px fill="rgba(0, 0, 0, .6)"><path d="M0 0h24v24H0V0z" fill=none /><path d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41z"/></svg></div><div id=album-button><div><svg xmlns=http://www.w3.org/2000/svg height=28px viewBox="0 0 24 24" width=28px fill="rgba(255, 255, 255, .87)"><path d="M0 0h24v24H0V0z" fill=none /><path d="M19 5v14H5V5h14m0-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-4.86 8.86l-3 3.87L9 13.14 6 17h12l-3.86-5.14z"/></svg></div><span>相册</span></div></div></div><script>const video = document.querySelector("#scanner-camera")
function openScanner() {
if (navigator.mediaDevices) {
document.querySelector('body').classList.add('scanner-active');
</html>
navigator.mediaDevices.getUserMedia({
audio: false,
video: {
facingMode: "environment",
}
})
.then((stream) => {
video.srcObject = stream;
video.onloadedmetadata = () => {
video.play();
};
})
.catch((err) => {
console.log(err);
});
}
}
function closeScanner() {
video.srcObject && video.srcObject.getTracks().forEach(function(track) {
track.stop();
});
document.querySelector('body').classList.remove('scanner-active');
}
document.getElementById("scan-wrapper").addEventListener("click", closeScanner);</script><script>initServiceWorker("tianjin-hc");</script><script src=/tianjin-hc/static/js/index.abc09dc0.js></script></body></html>

View File

@ -12,5 +12,6 @@
"start_url": ".",
"display": "standalone",
"scope": "/",
"description": "天津数字防疫模拟"
"description": "天津数字防疫模拟",
"orientation": "portrait-primary"
}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
.page[data-v-9c16a7ca]{display:flex;flex-flow:column;padding-top:0}.head[data-v-9c16a7ca]{background:url(../../static/img/bg_me_top.2402edfe.png) no-repeat;background-size:cover;background-position-y:bottom;height:183px;padding:21px 16px;padding-top:calc(env(safe-area-inset-top) + 21px)}.head .caption[data-v-9c16a7ca]{color:#fff;font-size:15pt;font-weight:700}.head .avatar img[data-v-9c16a7ca]{width:50px}.head .info[data-v-9c16a7ca]{color:#fff;display:flex;flex-flow:row;align-items:center;font-size:16px;margin-top:20px}.head .info .names[data-v-9c16a7ca]{margin-left:8px;line-height:1.5em;display:flex;flex-flow:column}.head .info .names .name[data-v-9c16a7ca]{display:flex;flex-flow:row;align-items:center}.head .info .id[data-v-9c16a7ca]{display:flex;align-items:center}.main[data-v-9c16a7ca]{background-color:#f7f7f7;flex-grow:4}

View File

@ -0,0 +1 @@
.page[data-v-9d7bf948]{background:url(../../static/img/bg_health.cf16faaa.png) no-repeat;background-size:cover;padding-top:env(safe-area-inset-top);padding-left:14px;padding-right:14px}.head[data-v-9d7bf948]{font-size:20px;color:#fff;display:flex;justify-content:space-between;margin:21px 0}.head .name[data-v-9d7bf948]{font-weight:700}.days[data-v-9d7bf948]{padding-bottom:4px}.code[data-v-9d7bf948],.days[data-v-9d7bf948]{margin-top:18px;display:flex;background:#fff;border:1px solid #fff;border-radius:6px;width:100%;position:relative}.code[data-v-9d7bf948]{padding-bottom:18px;padding-top:30px;flex-direction:column}.code .time[data-v-9d7bf948]{text-align:center;width:100%}.code .time .line1[data-v-9d7bf948]{font-size:20px;font-weight:700}.code .time .line2[data-v-9d7bf948]{font-size:30px;font-weight:700}.code .core img[data-v-9d7bf948]{width:100%}.code .place[data-v-9d7bf948]{font-weight:700;line-height:1.8em;font-size:10.5pt;display:flex;justify-content:center}.code .place .place-text[data-v-9d7bf948]{max-width:calc(100% - 5em)}.code .place .txt[data-v-9d7bf948]{color:#3773f4}.others[data-v-9d7bf948]{display:flex;width:100%;position:relative;padding-bottom:18px;padding-top:18px;flex-direction:row;justify-content:space-between}.others .vaccine[data-v-9d7bf948],.others .xck[data-v-9d7bf948]{background:#fff;border:1px solid #fff;border-radius:6px;width:calc(50% - 6px);padding:4px}.others img[data-v-9d7bf948]{width:100%}.main[data-v-9d7bf948]{background:#fff;border:1px solid #fff;border-radius:6px}.member[data-v-9d7bf948]{display:flex;align-items:center;font-size:14px;width:100%;padding:0 8px;margin:12px 0}.member .icon img[data-v-9d7bf948]{height:40px}.member .texts[data-v-9d7bf948]{flex-grow:1;display:flex;flex-direction:column;padding-left:4px}.member .texts .line1[data-v-9d7bf948]{display:flex;align-items:center}.member .texts .line1 .name[data-v-9d7bf948]{padding-right:4px}.member .texts .id[data-v-9d7bf948]{line-height:1.5em}.member .actions[data-v-9d7bf948]{display:flex;justify-content:flex-end}.member .actions .tiny-button[data-v-9d7bf948]{font-size:11px}.van-button--mini[data-v-9d7bf948]{height:20px;padding:0 7px}.add-member-wrapper[data-v-9d7bf948]{display:flex;justify-content:center;padding:8px}.add-member-wrapper .van-button[data-v-9d7bf948]{width:90%}

View File

@ -1 +0,0 @@
.left-span[data-v-19f6d3d8]{font-size:1.1rem;color:#1989fa}.page[data-v-4182dabc]{display:flex;flex-direction:column;font-size:14pt}.topping[data-v-4182dabc] .van-nav-bar--fixed{top:auto}

View File

@ -1 +0,0 @@
.page[data-v-ed8c93d8]{background:url(../../static/img/bg_nucleic_acid.f1330aba.png) no-repeat;background-size:100%;height:100vh}.title[data-v-ed8c93d8]{margin:80px auto 40px auto;width:100%;padding:0 40px}.buttons[data-v-ed8c93d8]{display:flex;justify-content:space-evenly;margin:20px}.buttons img[data-v-ed8c93d8]{height:72px}

View File

@ -0,0 +1 @@
.page[data-v-1e4c9296]{background:url(../../static/img/bg_nucleic_acid.5895ec95.png) no-repeat;background-size:cover;height:100vh}.head[data-v-1e4c9296]{font-size:20px;color:#fff;display:flex;justify-content:space-between;margin:21px 0;padding-left:14px;padding-right:14px}.head .name[data-v-1e4c9296]{font-weight:700}.title[data-v-1e4c9296]{margin:60px auto 50px auto;width:100%;padding:0 30px}.buttons[data-v-1e4c9296]{display:flex;justify-content:space-evenly;margin:40px}.buttons img[data-v-1e4c9296]{height:76px}.member[data-v-1e4c9296]{display:flex;align-items:center;font-size:14px;width:100%;padding:0 8px;margin:12px 0}.member .icon img[data-v-1e4c9296]{height:40px}.member .texts[data-v-1e4c9296]{flex-grow:1;display:flex;flex-direction:column;padding-left:4px}.member .texts .line1[data-v-1e4c9296]{display:flex;align-items:center}.member .texts .line1 .name[data-v-1e4c9296]{padding-right:4px}.member .texts .id[data-v-1e4c9296]{line-height:1.5em}.member .actions[data-v-1e4c9296]{display:flex;justify-content:flex-end}.member .actions .tiny-button[data-v-1e4c9296]{font-size:11px}.van-button--mini[data-v-1e4c9296]{height:20px;padding:0 7px}.add-member-wrapper[data-v-1e4c9296]{display:flex;justify-content:center;padding:8px}.add-member-wrapper .van-button[data-v-1e4c9296]{width:90%}

View File

@ -1 +0,0 @@
.page[data-v-2eaf9ee6]{background:url(../../static/img/bg_health.cf16faaa.png) no-repeat;background-size:100%;padding-top:0}.main[data-v-2eaf9ee6]{background:#fff;border:1px solid #fff;border-radius:6px;margin:0 16px;display:flex;flex-direction:column;align-items:center;position:relative}.main .names[data-v-2eaf9ee6]{margin:12px;color:#424242;font-size:17px;width:100%}.main .names .line1[data-v-2eaf9ee6]{font-weight:700}.main .names p[data-v-2eaf9ee6]{margin:4px 0;text-indent:2em}.main .time[data-v-2eaf9ee6]{text-align:center;width:100%;font-size:24px;font-weight:700}.main .today[data-v-2eaf9ee6]{margin:12px}.main .query-button[data-v-2eaf9ee6]{background:#edf6fd;border:1px solid #9cbde0;color:#3f80f4;display:inline-flex;justify-content:center;align-items:center;padding:6px 16px;font-size:14px;font-weight:700}.main .query-button .txt[data-v-2eaf9ee6]{margin-left:6px;display:inline-block}.main .todayOK[data-v-2eaf9ee6]{color:#07a969;font-weight:700;font-size:28px}.main .qrcode-wrap[data-v-2eaf9ee6]{width:268px;height:268px;margin:0 auto;display:flex;flex-direction:column;justify-content:center;align-items:center;position:relative}.main .qrcode-wrap img[data-v-2eaf9ee6]{width:268px;height:268px}.main .qrcode-wrap .txt[data-v-2eaf9ee6]{color:#fff;font-size:24px;position:absolute}.buttons[data-v-2eaf9ee6]{display:flex;justify-content:space-evenly;margin:20px}.buttons img[data-v-2eaf9ee6]{height:72px}

View File

@ -0,0 +1 @@
.page[data-v-b311319a]{background:url(../../static/img/bg_health.cf16faaa.png) no-repeat;background-size:cover;padding-top:calc(env(safe-area-inset-top) + 54px);padding-left:14px;padding-right:14px}.page-title[data-v-b311319a]{color:#fff;font-size:18px}.van-nav-bar[data-v-b311319a]{padding-top:env(safe-area-inset-top);background:none}.records[data-v-b311319a]{background:#fff;border:1px solid #fff;border-radius:6px;line-height:2em}.records .caption[data-v-b311319a]{font-size:17px;margin:6px 8px}.records .hairline-bottom[data-v-b311319a]{border-bottom:.5px solid #ccc}.records .negative[data-v-b311319a]{background-color:#61c05a;color:#fff;width:40px;height:40px;border:.5px solid #61c05a;border-radius:50%;display:flex;justify-content:center;align-items:center;font-weight:400;font-size:18px}.records .item[data-v-b311319a]{background:#f3f3f3;border:1px solid #f3f3f3;border-radius:6px;display:flex;justify-content:space-between;margin:10px 8px;padding:12px;font-size:16px}.records .item .captions[data-v-b311319a]{width:86px;flex-shrink:0}.records .item .content[data-v-b311319a]{flex-grow:3}.records .item .icon[data-v-b311319a]{display:flex;align-items:center;margin:0 8px;margin-right:0}.disclaimer[data-v-b311319a]{color:#fff;margin:12px;padding:0 20px;font-size:14px;text-align:center}

View File

@ -1 +0,0 @@
.page[data-v-6377acba]{background:url(../../static/img/bg_health.cf16faaa.png) no-repeat;background-size:100vh;padding-top:calc(env(safe-area-inset-top) + 54px);padding-left:14px;padding-right:14px}.page-title[data-v-6377acba]{color:#fff;font-size:18px}.van-nav-bar[data-v-6377acba]{padding-top:env(safe-area-inset-top);background:none}.records[data-v-6377acba]{background:#fff;border:1px solid #fff;border-radius:6px;line-height:2em}.records .caption[data-v-6377acba]{font-size:17px;margin:6px 8px}.records .hairline-bottom[data-v-6377acba]{border-bottom:.5px solid #ccc}.records .negative[data-v-6377acba]{background-color:#61c05a;color:#fff;width:40px;height:40px;border:.5px solid #61c05a;border-radius:50%;display:flex;justify-content:center;align-items:center;font-weight:400;font-size:18px}.records .item[data-v-6377acba]{background:#f3f3f3;border:1px solid #f3f3f3;border-radius:6px;display:flex;justify-content:space-between;margin:10px 8px;padding:12px;font-size:16px}.records .item .captions[data-v-6377acba]{width:86px;flex-shrink:0}.records .item .icon[data-v-6377acba]{display:flex;align-items:center;margin:0 8px;margin-right:0}.disclaimer[data-v-6377acba]{color:#fff;margin:12px;padding:0 20px;font-size:14px;text-align:center}

View File

@ -1 +0,0 @@
.page[data-v-5e92a1be]{background:url(../../static/img/bg_health.cf16faaa.png) no-repeat;background-size:100%;padding-top:env(safe-area-inset-top);padding-left:14px;padding-right:14px}.head[data-v-5e92a1be]{font-size:17px;color:#fff;display:flex;justify-content:space-between}.head .name[data-v-5e92a1be]{font-weight:700}.days[data-v-5e92a1be]{padding-bottom:4px}.code[data-v-5e92a1be],.days[data-v-5e92a1be]{margin-top:18px;display:flex;background:#fff;border:1px solid #fff;border-radius:6px;width:100%;position:relative}.code[data-v-5e92a1be]{padding-bottom:18px;padding-top:30px;flex-direction:column}.code .time[data-v-5e92a1be]{text-align:center;width:100%}.code .time .line1[data-v-5e92a1be]{font-size:20px;font-weight:700}.code .time .line2[data-v-5e92a1be]{font-size:28px;font-weight:700}.code .core img[data-v-5e92a1be]{width:100%}.code .place[data-v-5e92a1be]{font-weight:700;line-height:1.8em;font-size:10.5pt;display:flex;justify-content:center}.code .place .place-text[data-v-5e92a1be]{max-width:calc(100% - 5em)}.code .place .txt[data-v-5e92a1be]{color:#3773f4}.others[data-v-5e92a1be]{display:flex;width:100%;position:relative;padding-bottom:18px;padding-top:18px;flex-direction:row;justify-content:space-between}.others .vaccine[data-v-5e92a1be],.others .xck[data-v-5e92a1be]{background:#fff;border:1px solid #fff;border-radius:6px;width:calc(50% - 6px);padding:4px}.others img[data-v-5e92a1be]{width:100%}.main[data-v-5e92a1be]{background:#fff;border:1px solid #fff;border-radius:6px}.member[data-v-5e92a1be]{display:flex;align-items:center;font-size:14px;width:100%;padding:0 8px;margin:12px 0}.member .icon img[data-v-5e92a1be]{height:40px}.member .texts[data-v-5e92a1be]{flex-grow:1;display:flex;flex-direction:column;padding-left:4px}.member .texts .line1[data-v-5e92a1be]{display:flex;align-items:center}.member .texts .line1 .name[data-v-5e92a1be]{padding-right:4px}.member .texts .id[data-v-5e92a1be]{line-height:1.5em}.member .actions[data-v-5e92a1be]{display:flex;justify-content:flex-end}.member .actions .tiny-button[data-v-5e92a1be]{font-size:11px}.van-button--mini[data-v-5e92a1be]{height:20px;padding:0 7px}.add-member-wrapper[data-v-5e92a1be]{display:flex;justify-content:center;padding:8px}.add-member-wrapper .van-button[data-v-5e92a1be]{width:90%}

View File

@ -0,0 +1 @@
.left-span[data-v-19f6d3d8]{font-size:1.1rem;color:#1989fa}.page[data-v-2029837e]{display:flex;flex-flow:column;font-size:14pt;padding-top:calc(env(safe-area-inset-top) + 21px)}.van-form[data-v-2029837e]{margin:8px 0}p.desc[data-v-2029837e]{font-size:14px;color:#666;margin:0;padding:12px 12px 6px 12px}p.desc ul[data-v-2029837e]{list-style-type:disc;margin-left:1.5em}

View File

@ -1 +0,0 @@
.page{background:url(../../static/img/bg_health.cf16faaa.png) no-repeat;background-size:100%}

View File

@ -0,0 +1 @@
.page[data-v-415bc270]{background:url(../../static/img/bg_health.cf16faaa.png) no-repeat;background-size:100%;padding-top:0}.main[data-v-415bc270]{background:#fff;border:1px solid #fff;border-radius:6px;margin:0 16px;display:flex;flex-direction:column;align-items:center;position:relative}.main .van-notice-bar[data-v-415bc270]{width:100%;border-radius:6px}.main .van-notice-bar[data-v-415bc270] .van-notice-bar__content{font-size:17px;font-weight:700}.main .names[data-v-415bc270]{margin:12px;color:#424242;font-size:17px;width:100%}.main .names .line1[data-v-415bc270]{font-weight:700}.main .names p[data-v-415bc270]{margin:4px 0;text-indent:1.2em}.main .time[data-v-415bc270]{text-align:center;width:100%;font-size:24px;font-weight:700}.main .today[data-v-415bc270]{margin:12px}.main .query-button[data-v-415bc270]{background:#edf6fd;border:1px solid #9cbde0;color:#3f80f4;display:inline-flex;justify-content:center;align-items:center;padding:6px 16px;font-size:14px;font-weight:700}.main .query-button .txt[data-v-415bc270]{margin-left:6px;display:inline-block}.main .todayOK[data-v-415bc270]{color:#07a969;font-weight:700;font-size:28px}.main .qrcode-wrap[data-v-415bc270]{width:268px;height:268px;margin:0 auto;display:flex;flex-direction:column;justify-content:center;align-items:center;position:relative}.main .qrcode-wrap img[data-v-415bc270]{width:268px;height:268px}.main .qrcode-wrap .txt[data-v-415bc270]{color:#fff;font-size:24px;position:absolute}.buttons[data-v-415bc270]{display:flex;justify-content:space-evenly;margin:20px}.buttons img[data-v-415bc270]{height:72px}

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 563 KiB

View File

Before

Width:  |  Height:  |  Size: 126 KiB

After

Width:  |  Height:  |  Size: 126 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 214 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 83 KiB

View File

Before

Width:  |  Height:  |  Size: 112 KiB

After

Width:  |  Height:  |  Size: 112 KiB

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +0,0 @@
(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-258b3eb3"],{"030e":function(t,e,a){"use strict";a("a1de")},"3c96":function(t,e,a){"use strict";a.d(e,"a",(function(){return i})),a.d(e,"b",(function(){return n}));a("456d"),a("ac6a"),a("f3e2");var i=function(){for(var t={},e=arguments.length,a=new Array(e),i=0;i<e;i++)a[i]=arguments[i];return a.forEach((function(e){t[e]=window.localStorage.getItem(e)||null})),t},n=function(t){Object.keys(t).forEach((function(e){var a=t[e];window.localStorage.setItem(e,a)}))}},"41e5":function(t,e,a){t.exports=a.p+"static/img/ic_get_report_gray.50a14653.png"},"456d":function(t,e,a){var i=a("4bf8"),n=a("0d58");a("5eda")("keys",(function(){return function(t){return n(i(t))}}))},"5eda":function(t,e,a){var i=a("5ca1"),n=a("8378"),r=a("79e5");t.exports=function(t,e){var a=(n.Object||{})[t]||Object[t],s={};s[t]=e(a),i(i.S+i.F*r((function(){a(1)})),"Object",s)}},"9a67":function(t,e,a){t.exports=a.p+"static/img/ic_nucleicacid_title.aa40abf8.png"},a1de:function(t,e,a){},ac6a:function(t,e,a){for(var i=a("cadf"),n=a("0d58"),r=a("2aba"),s=a("7726"),c=a("32e9"),o=a("84f2"),f=a("2b4c"),d=f("iterator"),u=f("toStringTag"),l=o.Array,m={CSSRuleList:!0,CSSStyleDeclaration:!1,CSSValueList:!1,ClientRectList:!1,DOMRectList:!1,DOMStringList:!1,DOMTokenList:!0,DataTransferItemList:!1,FileList:!1,HTMLAllCollection:!1,HTMLCollection:!1,HTMLFormElement:!1,HTMLSelectElement:!1,MediaList:!0,MimeTypeArray:!1,NamedNodeMap:!1,NodeList:!0,PaintRequestList:!1,Plugin:!1,PluginArray:!1,SVGLengthList:!1,SVGNumberList:!1,SVGPathSegList:!1,SVGPointList:!1,SVGStringList:!1,SVGTransformList:!1,SourceBufferList:!1,StyleSheetList:!0,TextTrackCueList:!1,TextTrackList:!1,TouchList:!1},g=n(m),p=0;p<g.length;p++){var h,L=g[p],S=m[L],T=s[L],b=T&&T.prototype;if(b&&(b[d]||c(b,d,l),b[u]||c(b,u,L),o[L]=l,S))for(h in i)b[h]||r(b,h,i[h],!0)}},bf77:function(t,e,a){t.exports=a.p+"static/img/ic_nucleicacid_save2.a7f9ae61.png"},de53:function(t,e,a){t.exports=a.p+"static/img/report-bg.74e16362.png"},e051:function(t,e,a){"use strict";a.r(e);var i=function(){var t=this,e=t._self._c;return e("div",{staticClass:"page"},[e("img",{staticClass:"page-part-2 title",attrs:{src:a("9a67")}}),e("img",{ref:"reportImage",staticStyle:{display:"none"},attrs:{src:a("de53")}}),e("canvas",{ref:"canvas",staticClass:"page-part-2",staticStyle:{display:"none"},attrs:{width:"1284",height:"907"}}),e("img",{ref:"finalImage",staticClass:"page-part-2"}),t._m(0)])},n=[function(){var t=this,e=t._self._c;return e("div",{staticClass:"buttons"},[e("img",{attrs:{src:a("bf77")}}),e("img",{attrs:{src:a("41e5")}})])}],r=(a("7f7f"),a("5a0c")),s=a.n(r),c=a("3c96"),o={data:function(){return{form:{},pcrTime1:s()().add(-1,"day").add(6,"hour").add(60*Math.random(),"minute").add(60*Math.random(),"second").format("YYYY-MM-DD HH:mm"),pcrTime2:s()().add(-1,"day").add(12,"hour").add(60*Math.random(),"minute").add(60*Math.random(),"second").format("YYYY-MM-DD HH:mm")}},mounted:function(){this.form=Object.assign(this.form,Object(c["a"])("name","id")),this.draw()},methods:{draw:function(){var t=this,e=this.$refs.canvas.getContext("2d");this.$refs.reportImage.addEventListener("load",(function(){e.drawImage(t.$refs.reportImage,0,0),e.font="20px sans-serif",e.fillText(t.form.name,314,220),e.fillText(t.form.id,370,260),e.fillText(t.pcrTime1,480,668),e.fillText(t.pcrTime2,960,668),t.$refs.finalImage.src=t.$refs.canvas.toDataURL()}))}}},f=o,d=(a("030e"),a("2877")),u=Object(d["a"])(f,i,n,!1,null,"ed8c93d8",null);e["default"]=u.exports},f3e2:function(t,e,a){"use strict";var i=a("5ca1"),n=a("0a49")(0),r=a("2f21")([].forEach,!0);i(i.P+i.F*!r,"Array",{forEach:function(t){return n(this,t,arguments[1])}})}}]);

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-60ef386e"],{"4ac6":function(c,t,n){"use strict";n.r(t);var s=function(){var c=this;c._self._c;return c._m(0)},e=[function(){var c=this,t=c._self._c;return t("div",{staticClass:"page"},[t("img",{staticClass:"legend",attrs:{src:n("7ac2")}})])}],i=(n("9d55"),n("2877")),a={},r=Object(i["a"])(a,s,e,!1,null,"fc819e78",null);t["default"]=r.exports},"7ac2":function(c,t,n){c.exports=n.p+"static/img/bg_icon_describe.f59ddbec.png"},"9d55":function(c,t,n){"use strict";n("c955")},c955:function(c,t,n){}}]);
(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-7162b29a"],{"4ac6":function(c,t,n){"use strict";n.r(t);var s=function(){var c=this;c._self._c;return c._m(0)},i=[function(){var c=this,t=c._self._c;return t("div",{staticClass:"page"},[t("img",{staticClass:"legend",attrs:{src:n("7ac2")}})])}],e=(n("9d55"),n("2877")),a={},r=Object(e["a"])(a,s,i,!1,null,"fc819e78",null);t["default"]=r.exports},"7ac2":function(c,t,n){c.exports=n.p+"static/img/bg_icon_describe.f59ddbec.png"},"9d55":function(c,t,n){"use strict";n("c955")},c955:function(c,t,n){}}]);

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +0,0 @@
(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-81baaa6e"],{2035:function(t,n,c){},"7d5e":function(t,n,c){t.exports=c.p+"static/img/config-0.221fb95a.png"},e8c7:function(t,n,c){"use strict";c("2035")},eb88:function(t,n,c){"use strict";c.r(n);var i=function(){var t=this,n=t._self._c;return n("div",{staticClass:"page",on:{click:t.gotoConfig}},[n("img",{staticClass:"page-part-2",attrs:{src:c("7d5e")}})])},o=[],s={methods:{gotoConfig:function(){this.$router.push("/config")}}},e=s,a=(c("e8c7"),c("2877")),u=Object(a["a"])(e,i,o,!1,null,null,null);n["default"]=u.exports}}]);

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +0,0 @@
(function(e){function n(n){for(var r,c,o=n[0],f=n[1],i=n[2],d=0,h=[];d<o.length;d++)c=o[d],Object.prototype.hasOwnProperty.call(a,c)&&a[c]&&h.push(a[c][0]),a[c]=0;for(r in f)Object.prototype.hasOwnProperty.call(f,r)&&(e[r]=f[r]);l&&l(n);while(h.length)h.shift()();return u.push.apply(u,i||[]),t()}function t(){for(var e,n=0;n<u.length;n++){for(var t=u[n],r=!0,c=1;c<t.length;c++){var o=t[c];0!==a[o]&&(r=!1)}r&&(u.splice(n--,1),e=f(f.s=t[0]))}return e}var r={},c={"runtime~app":0},a={"runtime~app":0},u=[];function o(e){return f.p+"static/js/"+({}[e]||e)+"."+{"chunk-138c822c":"ba9b8f0d","chunk-15920e85":"6eec9ac6","chunk-258b3eb3":"d9403a56","chunk-5870a64c":"7449e3ed","chunk-4bad5866":"f4231835","chunk-743435bd":"8ba2534d","chunk-79557ba2":"01fd515f","chunk-60ef386e":"1f86de1c","chunk-81baaa6e":"6f2d5070","chunk-e58f8fbe":"251b9f78","chunk-2d0e93c0":"e5590f8d","chunk-2d0aba8a":"97b14652","chunk-2d0e6128":"22197f0b"}[e]+".js"}function f(n){if(r[n])return r[n].exports;var t=r[n]={i:n,l:!1,exports:{}};return e[n].call(t.exports,t,t.exports,f),t.l=!0,t.exports}f.e=function(e){var n=[],t={"chunk-138c822c":1,"chunk-258b3eb3":1,"chunk-4bad5866":1,"chunk-743435bd":1,"chunk-79557ba2":1,"chunk-60ef386e":1,"chunk-81baaa6e":1,"chunk-e58f8fbe":1};c[e]?n.push(c[e]):0!==c[e]&&t[e]&&n.push(c[e]=new Promise((function(n,t){for(var r="static/css/"+({}[e]||e)+"."+{"chunk-138c822c":"e042f172","chunk-15920e85":"31d6cfe0","chunk-258b3eb3":"efb43758","chunk-5870a64c":"31d6cfe0","chunk-4bad5866":"2b261d97","chunk-743435bd":"83093c21","chunk-79557ba2":"7642c8d5","chunk-60ef386e":"a3cf78e6","chunk-81baaa6e":"9e9ecaa4","chunk-e58f8fbe":"c61d4756","chunk-2d0e93c0":"31d6cfe0","chunk-2d0aba8a":"31d6cfe0","chunk-2d0e6128":"31d6cfe0"}[e]+".css",a=f.p+r,u=document.getElementsByTagName("link"),o=0;o<u.length;o++){var i=u[o],d=i.getAttribute("data-href")||i.getAttribute("href");if("stylesheet"===i.rel&&(d===r||d===a))return n()}var h=document.getElementsByTagName("style");for(o=0;o<h.length;o++){i=h[o],d=i.getAttribute("data-href");if(d===r||d===a)return n()}var l=document.createElement("link");l.rel="stylesheet",l.type="text/css",l.onload=n,l.onerror=function(n){var r=n&&n.target&&n.target.src||a,u=new Error("Loading CSS chunk "+e+" failed.\n("+r+")");u.code="CSS_CHUNK_LOAD_FAILED",u.request=r,delete c[e],l.parentNode.removeChild(l),t(u)},l.href=a;var s=document.getElementsByTagName("head")[0];s.appendChild(l)})).then((function(){c[e]=0})));var r=a[e];if(0!==r)if(r)n.push(r[2]);else{var u=new Promise((function(n,t){r=a[e]=[n,t]}));n.push(r[2]=u);var i,d=document.createElement("script");d.charset="utf-8",d.timeout=120,f.nc&&d.setAttribute("nonce",f.nc),d.src=o(e);var h=new Error;i=function(n){d.onerror=d.onload=null,clearTimeout(l);var t=a[e];if(0!==t){if(t){var r=n&&("load"===n.type?"missing":n.type),c=n&&n.target&&n.target.src;h.message="Loading chunk "+e+" failed.\n("+r+": "+c+")",h.name="ChunkLoadError",h.type=r,h.request=c,t[1](h)}a[e]=void 0}};var l=setTimeout((function(){i({type:"timeout",target:d})}),12e4);d.onerror=d.onload=i,document.head.appendChild(d)}return Promise.all(n)},f.m=e,f.c=r,f.d=function(e,n,t){f.o(e,n)||Object.defineProperty(e,n,{enumerable:!0,get:t})},f.r=function(e){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},f.t=function(e,n){if(1&n&&(e=f(e)),8&n)return e;if(4&n&&"object"===typeof e&&e&&e.__esModule)return e;var t=Object.create(null);if(f.r(t),Object.defineProperty(t,"default",{enumerable:!0,value:e}),2&n&&"string"!=typeof e)for(var r in e)f.d(t,r,function(n){return e[n]}.bind(null,r));return t},f.n=function(e){var n=e&&e.__esModule?function(){return e["default"]}:function(){return e};return f.d(n,"a",n),n},f.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},f.p="",f.oe=function(e){throw console.error(e),e};var i=window["webpackJsonp"]=window["webpackJsonp"]||[],d=i.push.bind(i);i.push=n,i=i.slice();for(var h=0;h<i.length;h++)n(i[h]);var l=d;t()})([]);

View File

@ -0,0 +1,21 @@
-----BEGIN CERTIFICATE-----
MIIDazCCAlOgAwIBAgIUJI9QRFOC7dy1Dqs+vbf0eE53p3QwDQYJKoZIhvcNAQEL
BQAwRTELMAkGA1UEBhMCQ04xEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM
GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDAeFw0yMjExMjYwNDQyNDZaFw0zMjEx
MjMwNDQyNDZaMEUxCzAJBgNVBAYTAkNOMRMwEQYDVQQIDApTb21lLVN0YXRlMSEw
HwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQwggEiMA0GCSqGSIb3DQEB
AQUAA4IBDwAwggEKAoIBAQDH1VXDiZjkgKcN3JoLy0JQyX81v5YVwS4myyy0Gaoc
OT2dadAwQ1mJrNPGO39vtmWueK8M8Yqo7f6PtXj5lEsxEK9R3E/LdQtUAK/C3NYx
lSnaRE7Suay07JoARawmXaAno0FFzbFLMh1TdlKO3TuzK8yPZc4i8IK7BKU3OFe7
sPXGUVfJL5q0OaOwaHJVwv3Qi854+IL1xc7mkoCTlMdE74XVa5fTpIWq80SXSC2s
Usq7f4FCnBVde0mNT+g2cFLEE25yNGYYXDTvtTR18mA79eqYL2VMnWFAW0cXSCzW
7oVYL+5lr5AjzQfQGZq3kQykN1Oge+LPsJg3Pd9HpCcjAgMBAAGjUzBRMB0GA1Ud
DgQWBBRvH2z78HnhknCwGa0zbIdSQ/AkIzAfBgNVHSMEGDAWgBRvH2z78HnhknCw
Ga0zbIdSQ/AkIzAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQCe
hlkw7PF1cmD9TcULwPA0UgmkpIGgXriW4VUrJ2DBSjFXTJKIkssOW+BhwwDcB9Xa
Zt+lhRpPirUOlYd64ODRU4zFyiTpjP86C50zQwVQRep+vV3TBZ7e68uj2NhG8kgj
DS4XsGKC2sAvsBAXv6qNDiGxaJhMkIv2k8MzHSuwpDFjxmkyJNb8fN3sy7o+zAL0
rQSeDcJQDUqLQzHHPdKcsINF9O+Sd7qlyByRYbL3/143tSEf+d8qPtzhPBST3Gcx
X+mVlaArRPSXkup5zqTBfrHEq1I26OTAhHgMjRMB8sCkJcL7SaUg/Qmoo+CvKDeu
mE4nBtYM3j7sZzFgXZkf
-----END CERTIFICATE-----

28
tools/local-https/key.pem Normal file
View File

@ -0,0 +1,28 @@
-----BEGIN PRIVATE KEY-----
MIIEuwIBADANBgkqhkiG9w0BAQEFAASCBKUwggShAgEAAoIBAQDH1VXDiZjkgKcN
3JoLy0JQyX81v5YVwS4myyy0GaocOT2dadAwQ1mJrNPGO39vtmWueK8M8Yqo7f6P
tXj5lEsxEK9R3E/LdQtUAK/C3NYxlSnaRE7Suay07JoARawmXaAno0FFzbFLMh1T
dlKO3TuzK8yPZc4i8IK7BKU3OFe7sPXGUVfJL5q0OaOwaHJVwv3Qi854+IL1xc7m
koCTlMdE74XVa5fTpIWq80SXSC2sUsq7f4FCnBVde0mNT+g2cFLEE25yNGYYXDTv
tTR18mA79eqYL2VMnWFAW0cXSCzW7oVYL+5lr5AjzQfQGZq3kQykN1Oge+LPsJg3
Pd9HpCcjAgMBAAECggEBAMQdBM8isY7HB6td7TxX3Rwls5dPD38IGD/wM04Ixd5u
+p4Ko0tKPYwUtb0c1QMQcRfZzomYXulMr//fK/tb4rMjWbuvyAu3MUfeaJ+HVRpR
9kIDuYuqtujULorH1ZvNVIix+jQEGtPeOdOYEousaJN9D4NHeRbnDJV3iKD5xXgn
Ba9gAuRdSagASDkB37LhGws7gD7qKW4giVSSmM1Q/A3REcLWDhP0hzb4NCv38Ip9
6qNZ6v0Aa3d6B7FcW5Myw/xeg5itYXtJuUheFBG8TGMd31Egc53niS62N4LFugoj
DYeIQWaD7nj3HXQjNTqC90/zVrXoS1uw+XGC94hx33ECgYEA63DszNTTYq6pAT2b
AufaV1rxNxyb3GyfS/Piz7gxm24rNmVsNOxo6LXqZ1ByE9XjEgBcgDVp3D0afqjx
22bLuC+Bn86qwDVaUdQdBf6yxSwqCdsOwysoQsL5hdDz7J/QYXdAMr9C+e54Mxcu
hn/IOkrmj/nGciKBQ3IInSGc1fkCgYEA2UhuH01f5og+9lLncpYwp2W7eHG6/m1g
Sp9fCnMWvouJ+RLaCSLGiEgV6UK6bY6ndP9XN1S9fMu0GWfWBB6zuGBQe54FZwLx
wbqPxwLPzIwEHhpTp1Tdwqzw0UaH+bN8QFfkYaorFU+poBHzXU4V0Se27XaPKSKJ
zW9KvWR4PPsCf2YVkJc/sGgZUy42h/+6h/FYfT5oKSxp7KgCF1X5h4jdO99aGpDX
8KT2O6yQNOZk1w/3GCR/BGd6FwLUPgnjiHFUJ+Aiu+abO44/alYvGVRk0dV0JfJ5
w/sujwJ2l00B/lhEXJGkXGYCABwm8QVgYnDkCRRkOKdETsfvqcx3xokCgYAy7nlx
uO9b2F/52WELSQ1Kj9wr1Wzhqr3BgC4FAwk3zPmgerzFG3OyCkOok82jVKcIE7pb
6+8my5EBy4ctHA1AkMMM1vOpO9Vzdcmx+oS/C6sDa2Rkes4ojeU9CO1iqKHdazzL
b9n9etjl/o8vNdiDWG3Wp83S9JecohPA5UYR9QKBgGK6fqaOHZNI1YhvU0VCtpER
rzNZHOJZIK+qUa0xakEWkvMdrMLcozIYGWuUztczOE9q0p6r9FfYZ1RnQ7zQ+w9P
YEGYS91IN6t+cOmqfFzV8tJ1yS0osuxpu2kizNsGqSJVaAEyr6/NBZVejZdY+CQM
CJwOSQQJVjZZykpE2Xda
-----END PRIVATE KEY-----