feat: PWA (#40)

This commit is contained in:
Dream Hunter
2023-12-12 17:26:56 +08:00
committed by GitHub
parent bf6374af52
commit c2c1e4ae59
10 changed files with 3218 additions and 664 deletions
+1
View File
@@ -28,3 +28,4 @@ coverage
*.sw? *.sw?
.env.* .env.*
*-dist/
+3 -1
View File
@@ -3,9 +3,11 @@
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<link rel="icon" href="/favicon.ico"> <link rel="icon" href="/logo.svg">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Temp Email</title> <title>Temp Email</title>
<link rel="icon" href="/logo.svg" sizes="any">
<link rel="apple-touch-icon" href="/logo.svg">
</head> </head>
<body> <body>
+8 -7
View File
@@ -6,19 +6,20 @@
"dev": "vite", "dev": "vite",
"build": "vite build -m prod --emptyOutDir", "build": "vite build -m prod --emptyOutDir",
"preview": "vite preview", "preview": "vite preview",
"deploy": "wrangler pages deploy ../dist --branch production" "deploy": "npm run build && wrangler pages deploy ../dist --branch production"
}, },
"dependencies": { "dependencies": {
"@vueuse/core": "^10.1.2", "@vueuse/core": "^10.7.0",
"axios": "^1.6.2", "axios": "^1.6.2",
"naive-ui": "^2.34.3", "naive-ui": "^2.35.0",
"vue": "^3.3.4", "vue": "^3.3.11",
"vue-clipboard3": "^2.0.0", "vue-clipboard3": "^2.0.0",
"vue-i18n": "9", "vue-i18n": "^9.8.0",
"vue-router": "^4.2.5" "vue-router": "^4.2.5"
}, },
"devDependencies": { "devDependencies": {
"@vitejs/plugin-vue": "^4.2.3", "@vitejs/plugin-vue": "^4.5.2",
"vite": "^4.4.6" "vite-plugin-pwa": "^0.17.4",
"vite": "^4.5.1"
} }
} }
+2995 -233
View File
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 50 KiB

+20 -4
View File
@@ -43,6 +43,8 @@ const { t } = useI18n({
deleteTip: 'Are you sure to delete this email?', deleteTip: 'Are you sure to delete this email?',
refresh: 'Refresh', refresh: 'Refresh',
emails: 'Emails', emails: 'Emails',
itemCount: 'itemCount',
query: 'Query',
}, },
zh: { zh: {
title: '临时邮件 Admin', title: '临时邮件 Admin',
@@ -58,6 +60,8 @@ const { t } = useI18n({
deleteTip: '确定要删除这个邮箱吗?', deleteTip: '确定要删除这个邮箱吗?',
refresh: '刷新', refresh: '刷新',
emails: '邮件', emails: '邮件',
itemCount: '总数',
query: '查询',
} }
} }
}); });
@@ -270,7 +274,11 @@ const fetchMailUnknowData = async () => {
<n-tab-pane name="account" tab="account"> <n-tab-pane name="account" tab="account">
<div style="display: inline-block;"> <div style="display: inline-block;">
<n-pagination v-model:page="page" v-model:page-size="pageSize" :item-count="count" :page-sizes="[20, 50, 100]" <n-pagination v-model:page="page" v-model:page-size="pageSize" :item-count="count" :page-sizes="[20, 50, 100]"
show-size-picker /> show-size-picker>
<template #prefix="{ itemCount }">
{{ t('itemCount') }}: {{ itemCount }}
</template>
</n-pagination>
</div> </div>
<n-button tertiary @click="fetchData" type="primary"> <n-button tertiary @click="fetchData" type="primary">
{{ t('refresh') }} {{ t('refresh') }}
@@ -286,7 +294,11 @@ const fetchMailUnknowData = async () => {
</n-input-group> </n-input-group>
<n-list hoverable clickable> <n-list hoverable clickable>
<div style="display: inline-block; margin-bottom: 10px;"> <div style="display: inline-block; margin-bottom: 10px;">
<n-pagination v-model:page="mailPage" v-model:page-size="mailPageSize" :item-count="mailCount" simple /> <n-pagination v-model:page="mailPage" v-model:page-size="mailPageSize" :item-count="mailCount" simple>
<template #prefix="{ itemCount }">
{{ t('itemCount') }}: {{ itemCount }}
</template>
</n-pagination>
</div> </div>
<n-list-item v-for="row in mailData" v-bind:key="row.id"> <n-list-item v-for="row in mailData" v-bind:key="row.id">
<n-thing class="center" :title="row.subject"> <n-thing class="center" :title="row.subject">
@@ -307,12 +319,16 @@ const fetchMailUnknowData = async () => {
</n-tab-pane> </n-tab-pane>
<n-tab-pane name="unknow" tab="unknown"> <n-tab-pane name="unknow" tab="unknown">
<n-button @click="fetchMailUnknowData" type="primary" ghost> <n-button @click="fetchMailUnknowData" type="primary" ghost>
{{ t('refresh') }} {{ t('query') }}
</n-button> </n-button>
<n-list hoverable clickable> <n-list hoverable clickable>
<div style="display: inline-block; margin-bottom: 10px;"> <div style="display: inline-block; margin-bottom: 10px;">
<n-pagination v-model:page="mailUnknowPage" v-model:page-size="mailUnknowPageSize" <n-pagination v-model:page="mailUnknowPage" v-model:page-size="mailUnknowPageSize"
:item-count="mailUnknowCount" simple /> :item-count="mailUnknowCount" simple>
<template #prefix="{ itemCount }">
{{ t('itemCount') }}: {{ itemCount }}
</template>
</n-pagination>
</div> </div>
<n-list-item v-for="row in mailUnknowData" v-bind:key="row.id"> <n-list-item v-for="row in mailUnknowData" v-bind:key="row.id">
<n-thing class="center" :title="row.subject"> <n-thing class="center" :title="row.subject">
+19
View File
@@ -2,6 +2,7 @@ import { fileURLToPath, URL } from 'node:url'
import { defineConfig } from 'vite' import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue' import vue from '@vitejs/plugin-vue'
import { VitePWA } from 'vite-plugin-pwa'
// https://vitejs.dev/config/ // https://vitejs.dev/config/
export default defineConfig({ export default defineConfig({
@@ -10,6 +11,24 @@ export default defineConfig({
}, },
plugins: [ plugins: [
vue(), vue(),
VitePWA({
registerType: 'autoUpdate',
devOptions: {
enabled: true
},
manifest: {
name: 'Temp Email',
short_name: 'Temp Email',
description: 'Temp Email - Temporary Email',
icons: [
{
src: '/logo.svg',
sizes: '192x192',
type: 'image/svg+xml'
}
]
}
})
], ],
resolve: { resolve: {
alias: { alias: {
+3 -3
View File
@@ -7,12 +7,12 @@
"start": "wrangler dev" "start": "wrangler dev"
}, },
"devDependencies": { "devDependencies": {
"wrangler": "^3.5.1" "wrangler": "^3.19.0"
}, },
"dependencies": { "dependencies": {
"hono": "^3.4.3", "hono": "^3.11.4",
"mailparser": "^3.6.5", "mailparser": "^3.6.5",
"postal-mime": "^1.0.16" "postal-mime": "^1.1.0"
}, },
"pnpm": { "pnpm": {
"patchedDependencies": { "patchedDependencies": {
+167 -415
View File
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -179,7 +179,7 @@ api.get('/admin/mails_unknow', async (c) => {
let count = 0; let count = 0;
if (offset == 0) { if (offset == 0) {
const { count: mailCount } = await c.env.DB.prepare(` const { count: mailCount } = await c.env.DB.prepare(`
SELECT count(*) FROM mails SELECT count(*) as count FROM mails
where address NOT IN where address NOT IN
(select concat('${c.env.PREFIX}', name) from address)` (select concat('${c.env.PREFIX}', name) from address)`
).first(); ).first();