Compare commits

...

9 Commits

Author SHA1 Message Date
adams549659584
76d44c7d0a fix: fix dependencies 2023-06-03 14:26:19 +08:00
adams549659584
e6b8dec171 fix: 🐛 fix auth 2023-06-01 23:23:55 +08:00
adams549659584
5aaa77f183 docs: 📝 update docs 2023-05-31 21:07:39 +08:00
adams549659584
4c05bc508c chore: pwa 2023-05-31 00:56:06 +08:00
adams549659584
538d8a4791 fix: pwa 还是先 autoUpdate 吧 2023-05-30 10:37:06 +08:00
adams549659584
da33467128 fix: 🐛 pwa 立即切换 bug、优化loading、设置等 2023-05-30 09:09:59 +08:00
adams549659584
d39376c8cc fix: fix cloudflare home 2023-05-30 01:30:07 +08:00
adams549659584
db188a6da2 fix: fix cloudflare home 2023-05-30 01:21:57 +08:00
adams549659584
90df9416f9 fix: cloudflare index 2023-05-30 01:02:12 +08:00
26 changed files with 870 additions and 801 deletions

14
.gitignore vendored Normal file
View File

@ -0,0 +1,14 @@
# Editor directories and files
.vscode/*
!.vscode/extensions.json
!.vscode/launch.json
.idea
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
.DS_Store
release

5
.vscode/extensions.json vendored Normal file
View File

@ -0,0 +1,5 @@
{
"recommendations": [
"golang.go"
]
}

View File

@ -22,7 +22,7 @@
- [网页展示](#网页展示)
- [侧边栏](#侧边栏)
- [演示站点](#演示站点)
- [获取 Cookie](#获取Cookie)
- [设置用户](#设置用户)
- [环境变量](#环境变量)
- [部署](#部署)
- [Docker](#Docker)
@ -90,13 +90,13 @@
- https://go-proxy-bingai.onrender.com
## 获取 Cookie
## 设置用户
- 访问 https://www.bing.com/ 或 https://cn.bing.com/ ,登录
- F12 或 Ctrl + Shift + I 打开控制台
- 拿到 Cookie 后,在网站设置用户 Cookie 弹窗填入即可。
- 拿到 Cookie 中 _U 的值 后,在网站设置 => 设置用户 中填入即可。
![获取Cookie](./docs/img/bing-cookie.png)

View File

@ -12,7 +12,7 @@ func Index(w http.ResponseWriter, r *http.Request) {
http.Redirect(w, r, common.PROXY_WEB_PAGE_PATH, http.StatusFound)
return
}
if strings.HasPrefix("/turing", r.URL.Path) {
if strings.HasPrefix(r.URL.Path, "/turing") {
if !helper.CheckAuth(r) {
helper.UnauthorizedResult(w)
return

View File

@ -3,9 +3,9 @@
<head>
<meta content="text/html; charset=utf-8" http-equiv="content-type" />
<link rel="icon" type="image/svg+xml" href="https://bing.vcanbb.top/web/img/logo.svg" />
<link rel="icon" type="image/svg+xml" href="/github/frontend/public/img/logo.svg" />
<meta content="yes" name="apple-mobile-web-app-capable" />
<link rel="apple-touch-icon" href="https://bing.vcanbb.top/web/favicon.ico">
<link rel="apple-touch-icon" href="/github/frontend/public/img/pwa/logo-192.png">
<meta name="viewport"
content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, viewport-fit=cover" />
<meta name="referrer" content="origin-when-cross-origin" />
@ -41,7 +41,7 @@
class="relative bg-white px-6 pb-8 pt-10 shadow-xl ring-1 ring-gray-900/5 sm:mx-auto sm:max-w-lg sm:rounded-lg sm:px-10 lg:max-w-3xl">
<div class="mx-auto max-w-3xl">
<div class="flex justify-center">
<img src="https://bing.vcanbb.top/web/img/logo.svg" class="h-24" alt="BingAI" />
<img src="/github/frontend/public/img/logo.svg" class="h-24" alt="BingAI" />
</div>
<div class="mt-6 text-center text-3xl text-gray-600">聊天服务器已部署完成</div>
<div class="divide-y divide-gray-300/50">

View File

@ -70,10 +70,26 @@ const getRandomIP = () => {
return randomIP;
};
const home = async () => {
const res = await fetch('https://raw.githubusercontent.com/adams549659584/go-proxy-bingai/master/cloudflare/index.html');
/**
* home
* @param {string} pathname
* @returns
*/
const home = async (pathname) => {
const baseUrl = 'https://raw.githubusercontent.com/adams549659584/go-proxy-bingai/master/';
let url;
// if (pathname.startsWith('/github/')) {
if (pathname.indexOf('/github/') === 0) {
url = pathname.replace('/github/', baseUrl);
} else {
url = baseUrl + 'cloudflare/index.html';
}
const res = await fetch(url);
const newRes = new Response(res.body, res);
newRes.headers.set('content-type', 'text/html; charset=utf-8');
if (pathname === '/') {
newRes.headers.delete('content-security-policy');
newRes.headers.set('content-type', 'text/html; charset=utf-8');
}
return newRes;
};
@ -87,8 +103,9 @@ export default {
*/
async fetch(request, env, ctx) {
const currentUrl = new URL(request.url);
if (currentUrl.pathname === '/') {
return home();
// if (currentUrl.pathname === '/' || currentUrl.pathname.startsWith('/github/')) {
if (currentUrl.pathname === '/' || currentUrl.pathname.indexOf('/github/') === 0) {
return home(currentUrl.pathname);
}
const targetUrl = new URL(SYDNEY_ORIGIN + currentUrl.pathname + currentUrl.search);

View File

@ -1,6 +1,6 @@
{
"name": "go-proxy-bingai",
"version": "1.8.3",
"version": "1.8.7",
"private": true,
"scripts": {
"dev": "vite",
@ -12,6 +12,7 @@
"format": "prettier --write src/"
},
"dependencies": {
"naive-ui": "^2.34.4",
"pinia": "^2.0.36",
"pinia-plugin-persistedstate": "^3.1.0",
"vue": "^3.3.2",
@ -29,7 +30,6 @@
"autoprefixer": "^10.4.14",
"eslint": "^8.39.0",
"eslint-plugin-vue": "^9.11.0",
"naive-ui": "^2.34.3",
"npm-run-all": "^4.1.5",
"postcss": "^8.4.23",
"prettier": "^2.8.8",

View File

@ -1,6 +1,9 @@
lockfileVersion: '6.0'
dependencies:
naive-ui:
specifier: ^2.34.4
version: 2.34.4(vue@3.3.2)
pinia:
specifier: ^2.0.36
version: 2.0.36(typescript@5.0.4)(vue@3.3.2)
@ -48,9 +51,6 @@ devDependencies:
eslint-plugin-vue:
specifier: ^9.11.0
version: 9.13.0(eslint@8.40.0)
naive-ui:
specifier: ^2.34.3
version: 2.34.3(vue@3.3.2)
npm-run-all:
specifier: ^4.1.5
version: 4.1.5
@ -1233,7 +1233,6 @@ packages:
engines: {node: '>=6.9.0'}
dependencies:
regenerator-runtime: 0.13.11
dev: true
/@babel/template@7.20.7:
resolution: {integrity: sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==}
@ -1276,7 +1275,7 @@ packages:
css-render: ~0.15.12
dependencies:
css-render: 0.15.12
dev: true
dev: false
/@css-render/vue3-ssr@0.15.12(vue@3.3.2):
resolution: {integrity: sha512-AQLGhhaE0F+rwybRCkKUdzBdTEM/5PZBYy+fSYe1T9z9+yxMuV/k7ZRqa4M69X+EI1W8pa4kc9Iq2VjQkZx4rg==}
@ -1284,11 +1283,11 @@ packages:
vue: ^3.0.11
dependencies:
vue: 3.3.2
dev: true
dev: false
/@emotion/hash@0.8.0:
resolution: {integrity: sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==}
dev: true
dev: false
/@esbuild/android-arm64@0.17.19:
resolution: {integrity: sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==}
@ -1587,7 +1586,7 @@ packages:
/@juggle/resize-observer@3.4.0:
resolution: {integrity: sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==}
dev: true
dev: false
/@nodelib/fs.scandir@2.1.5:
resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
@ -1724,17 +1723,17 @@ packages:
/@types/katex@0.14.0:
resolution: {integrity: sha512-+2FW2CcT0K3P+JMR8YG846bmDwplKUTsWgT2ENwdQ1UdVfRk3GQrh6Mi4sTopy30gI8Uau5CEqHTDZ6YvWIUPA==}
dev: true
dev: false
/@types/lodash-es@4.17.7:
resolution: {integrity: sha512-z0ptr6UI10VlU6l5MYhGwS4mC8DZyYer2mCoyysZtSF7p26zOX8UpbrV0YpNYLGS8K4PUFIyEr62IMFFjveSiQ==}
dependencies:
'@types/lodash': 4.14.194
dev: true
'@types/lodash': 4.14.195
dev: false
/@types/lodash@4.14.194:
resolution: {integrity: sha512-r22s9tAS7imvBt2lyHC9B8AGwWnXaYb1tY09oyLkXDs4vArpYJzw09nj8MLx5VfciBPGIb+ZwG0ssYnEPJxn/g==}
dev: true
/@types/lodash@4.14.195:
resolution: {integrity: sha512-Hwx9EUgdwf2GLarOjQp5ZH8ZmblzcbTBC2wtQWNKARBSxM9ezRIAUpeDTgoQRAFB0+8CNWXVA9+MaSOzOF3nPg==}
dev: false
/@types/node@18.16.10:
resolution: {integrity: sha512-sMo3EngB6QkMBlB9rBe1lFdKSLqljyWPPWv6/FzSxh/IDlyVWSzE9RiF4eAuerQHybrWdqBgAGb03PM89qOasA==}
@ -2139,7 +2138,7 @@ packages:
/async-validator@4.2.5:
resolution: {integrity: sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==}
dev: true
dev: false
/async@3.2.4:
resolution: {integrity: sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==}
@ -2392,7 +2391,7 @@ packages:
dependencies:
'@emotion/hash': 0.8.0
csstype: 3.0.11
dev: true
dev: false
/cssesc@3.0.0:
resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==}
@ -2402,7 +2401,7 @@ packages:
/csstype@3.0.11:
resolution: {integrity: sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw==}
dev: true
dev: false
/csstype@3.1.2:
resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==}
@ -2413,14 +2412,14 @@ packages:
date-fns: '>=2.0.0'
dependencies:
date-fns: 2.30.0
dev: true
dev: false
/date-fns@2.30.0:
resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==}
engines: {node: '>=0.11'}
dependencies:
'@babel/runtime': 7.21.5
dev: true
dev: false
/de-indent@1.0.2:
resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==}
@ -2759,7 +2758,7 @@ packages:
/evtd@0.2.4:
resolution: {integrity: sha512-qaeGN5bx63s/AXgQo8gj6fBkxge+OoLddLniox5qtLAEY5HSnuSlISXVPxnSae1dWblvTh4/HoMIB+mbMsvZzw==}
dev: true
dev: false
/fast-deep-equal@3.1.3:
resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
@ -3043,7 +3042,7 @@ packages:
/highlight.js@11.8.0:
resolution: {integrity: sha512-MedQhoqVdr0U6SSnWPzfiadUcDHfN/Wzq25AkXiQv9oiOO/sG0S7XkvpFIqWBl9Yq1UYyYOOVORs5UW2XlPyzg==}
engines: {node: '>=12.0.0'}
dev: true
dev: false
/hosted-git-info@2.8.9:
resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==}
@ -3375,7 +3374,7 @@ packages:
/lodash-es@4.17.21:
resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==}
dev: true
dev: false
/lodash.debounce@4.0.8:
resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==}
@ -3391,7 +3390,6 @@ packages:
/lodash@4.17.21:
resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
dev: true
/lru-cache@5.1.1:
resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
@ -3483,15 +3481,15 @@ packages:
thenify-all: 1.6.0
dev: true
/naive-ui@2.34.3(vue@3.3.2):
resolution: {integrity: sha512-fUMr0dzb/iGsOTWgoblPVobY5X5dihQ1eam5dA+H74oyLYAvgX4pL96xQFPBLIYqvyRFBAsN85kHN5pLqdtpxA==}
/naive-ui@2.34.4(vue@3.3.2):
resolution: {integrity: sha512-aPG8PDfhSzIzn/jSC9y3Jb3Pe2wHJ7F0cFV1EWlbImSrZECeUmoc+fIcOSWbizoztkKfaUAeKwYdMl09MKkj1g==}
peerDependencies:
vue: ^3.0.0
dependencies:
'@css-render/plugin-bem': 0.15.12(css-render@0.15.12)
'@css-render/vue3-ssr': 0.15.12(vue@3.3.2)
'@types/katex': 0.14.0
'@types/lodash': 4.14.194
'@types/lodash': 4.14.195
'@types/lodash-es': 4.17.7
async-validator: 4.2.5
css-render: 0.15.12
@ -3507,7 +3505,7 @@ packages:
vooks: 0.2.12(vue@3.3.2)
vue: 3.3.2
vueuc: 0.4.51(vue@3.3.2)
dev: true
dev: false
/nanoid@3.3.6:
resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==}
@ -3937,7 +3935,6 @@ packages:
/regenerator-runtime@0.13.11:
resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==}
dev: true
/regenerator-transform@0.15.1:
resolution: {integrity: sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==}
@ -4053,7 +4050,7 @@ packages:
/seemly@0.3.6:
resolution: {integrity: sha512-lEV5VB8BUKTo/AfktXJcy+JeXns26ylbMkIUco8CYREsQijuz4mrXres2Q+vMLdwkuLxJdIPQ8IlCIxLYm71Yw==}
dev: true
dev: false
/semver@5.7.1:
resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==}
@ -4375,7 +4372,7 @@ packages:
/treemate@0.3.11:
resolution: {integrity: sha512-M8RGFoKtZ8dF+iwJfAJTOH/SM4KluKOKRJpjCMhI8bG3qB74zrFoArKZ62ll0Fr3mqkMJiQOmWYkdYgDeITYQg==}
dev: true
dev: false
/ts-interface-checker@0.1.13:
resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==}
@ -4509,7 +4506,7 @@ packages:
dependencies:
evtd: 0.2.4
vue: 3.3.2
dev: true
dev: false
/vite-plugin-pwa@0.14.7(vite@4.3.6)(workbox-build@6.5.4)(workbox-window@6.6.0):
resolution: {integrity: sha512-dNJaf0fYOWncmjxv9HiSa2xrSjipjff7IkYE5oIUJ2x5HKu3cXgA8LRgzOwTc5MhwyFYRSU0xyN0Phbx3NsQYw==}
@ -4570,7 +4567,7 @@ packages:
dependencies:
evtd: 0.2.4
vue: 3.3.2
dev: true
dev: false
/vue-demi@0.14.1(vue@3.3.2):
resolution: {integrity: sha512-rt+yuCtXvscYot9SQQj3WKZJVSriPNqVkpVBNEHPzSgBv7QIYzsS410VqVgvx8f9AAPgjg+XPKvmV3vOqqkJQQ==}
@ -4663,7 +4660,7 @@ packages:
vdirs: 0.1.8(vue@3.3.2)
vooks: 0.2.12(vue@3.3.2)
vue: 3.3.2
dev: true
dev: false
/webidl-conversions@4.0.2:
resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==}

View File

@ -1,7 +1,6 @@
<script setup lang="ts">
import { NMessageProvider, NConfigProvider, type GlobalThemeOverrides, NDialogProvider } from 'naive-ui';
import { RouterView } from 'vue-router';
import ReloadPWA from '@/components/ReloadPWA/ReloadPWA.vue';
const themeOverrides: GlobalThemeOverrides = {
common: {
@ -17,7 +16,6 @@ const themeOverrides: GlobalThemeOverrides = {
<NConfigProvider :theme-overrides="themeOverrides">
<NDialogProvider>
<NMessageProvider>
<ReloadPWA />
<RouterView />
</NMessageProvider>
</NDialogProvider>

View File

@ -134,10 +134,10 @@ const saveUserToken = () => {
<template>
<NDropdown v-if="isMobile()" class="select-none" :show="isShowMore" :options="navConfigs" :render-label="renderDropdownLabel" @select="handleSelect">
<NImage class="fixed top-6 right-4 cursor-pointer" :src="settingSvgUrl" alt="设置菜单" :preview-disabled="true" @click="isShowMore = !isShowMore"></NImage>
<NImage class="fixed top-6 right-4 cursor-pointer z-50" :src="settingSvgUrl" alt="设置菜单" :preview-disabled="true" @click="isShowMore = !isShowMore"></NImage>
</NDropdown>
<NDropdown v-else class="select-none" trigger="hover" :options="navConfigs" :render-label="renderDropdownLabel" @select="handleSelect">
<NImage class="fixed top-6 right-6 cursor-pointer" :src="settingSvgUrl" alt="设置菜单" :preview-disabled="true"></NImage>
<NImage class="fixed top-6 right-6 cursor-pointer z-50" :src="settingSvgUrl" alt="设置菜单" :preview-disabled="true"></NImage>
</NDropdown>
<NModal v-model:show="isShowSetTokenModal" preset="dialog" :show-icon="false">
<template #header>

View File

@ -1,44 +1,35 @@
<script setup lang="ts">
import { onMounted } from 'vue';
import { ref } from 'vue';
defineProps<{
isShow: boolean;
}>();
const isRemoveLoading = ref(false);
const loadingRef = ref<HTMLDivElement>();
onMounted(() => {
if (loadingRef.value) {
loadingRef.value.addEventListener('transitionend', () => {
isRemoveLoading.value = true;
});
}
});
</script>
<template>
<div v-if="!isRemoveLoading" ref="loadingRef" class="loading-spinner" :class="{ hidden: !isShow }">
<div class="bounce1"></div>
<div class="bounce2"></div>
<div class="bounce3"></div>
</div>
<Transition name="fade">
<div v-if="isShow" class="loading-spinner">
<div class="bounce1"></div>
<div class="bounce2"></div>
<div class="bounce3"></div>
</div>
</Transition>
</template>
<style scoped>
.fade-enter-active,
.fade-leave-active {
transition: opacity 2.5s ease;
}
.fade-enter-from,
.fade-leave-to {
opacity: 0;
}
.loading-spinner {
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
opacity: 1;
transition: opacity 2s ease-out;
}
.loading-spinner.hidden {
opacity: 0;
}
.loading-spinner > div {

View File

@ -1,9 +1,11 @@
<script setup lang="ts">
import { ref } from 'vue';
import { NModal, NButton } from 'naive-ui';
import { NModal, NButton, useMessage } from 'naive-ui';
import { useRegisterSW } from 'virtual:pwa-register/vue';
const message = useMessage();
const isShowModal = ref(false);
const isUpdateLoading = ref(false);
const { offlineReady, needRefresh, updateServiceWorker } = useRegisterSW({
immediate: true,
@ -17,6 +19,7 @@ const { offlineReady, needRefresh, updateServiceWorker } = useRegisterSW({
},
onNeedRefresh() {
isShowModal.value = true;
// updateServiceWorker();
},
});
@ -25,13 +28,21 @@ const close = async () => {
needRefresh.value = false;
isShowModal.value = false;
};
const update = async () => {
isUpdateLoading.value = true;
await updateServiceWorker();
message.success('已切换新版');
isUpdateLoading.value = false;
isShowModal.value = false;
};
</script>
<template>
<NModal v-model:show="isShowModal" preset="dialog" title="更新提示" content="新版本已经更新完毕,是否切换?">
<template #action>
<NButton size="large" @click="close">下次再说</NButton>
<NButton ghost size="large" type="info" @click="updateServiceWorker()">立即切换</NButton>
<NButton ghost size="large" type="info" @click="update" :loading="isUpdateLoading">立即切换</NButton>
</template>
</NModal>
</template>

View File

@ -8,7 +8,9 @@ declare let self: ServiceWorkerGlobalScope;
const CACHE_NAME_PREFIX = 'BingAI';
self.addEventListener('message', (event) => {
if (event.data && event.data.type === 'SKIP_WAITING') self.skipWaiting();
if (event.data && event.data.type === 'SKIP_WAITING') {
self.skipWaiting();
}
});
// self.__WB_MANIFEST is default injection point
@ -21,7 +23,9 @@ cleanupOutdatedCaches();
registerRoute(new NavigationRoute(createHandlerBoundToURL('./index.html')));
registerRoute(
({ request }) => request.destination === 'style' || request.destination === 'manifest' || request.destination === 'script' || request.destination === 'worker',
({ request, url }) => {
return request.destination === 'style' || request.destination === 'manifest' || request.destination === 'script' || request.destination === 'worker';
},
new StaleWhileRevalidate({
cacheName: `${CACHE_NAME_PREFIX}-assets`,
plugins: [new CacheableResponsePlugin({ statuses: [200] })],
@ -44,3 +48,7 @@ registerRoute(
],
})
);
self.addEventListener('install', (ev) => {
self.skipWaiting();
});

View File

@ -4,3 +4,31 @@ export const isMobile = () => {
};
export const sleep = (timeout: number) => new Promise((resolve, reject) => setTimeout(resolve, timeout));
export const copy = async (text: string) => {
if (navigator.clipboard && navigator.clipboard.writeText) {
// 使用Clipboard API复制文本到剪贴板
try {
await navigator.clipboard.writeText(text);
return true;
} catch (error) {
console.error('error : ', error);
}
}
// 使用备用方案
try {
const ele = document.createElement('textarea');
ele.value = text;
ele.setAttribute('readonly', '');
ele.style.position = 'absolute';
ele.style.left = '-9999px';
document.body.appendChild(ele);
ele.select();
document.execCommand('copy');
document.body.removeChild(ele);
return true;
} catch (error) {
console.error(error);
}
return false;
};

View File

@ -46,13 +46,14 @@ const initPwaOptions = (env: Record<string, string>) => {
// type: 'module',
// },
strategies: 'injectManifest',
workbox: {
cleanupOutdatedCaches: true,
clientsClaim: true,
skipWaiting: true,
},
// workbox: {
// cleanupOutdatedCaches: true,
// clientsClaim: true,
// skipWaiting: true,
// },
// 取消注册服务工作进程
// selfDestroying: true,
registerType: 'autoUpdate',
};
return pwaOptions;
};

View File

@ -1 +0,0 @@
.loading-spinner[data-v-aff729bc]{display:flex;justify-content:center;align-items:center;height:100vh;opacity:1;transition:opacity 2s ease-out}.loading-spinner.hidden[data-v-aff729bc]{opacity:0}.loading-spinner>div[data-v-aff729bc]{width:30px;height:30px;background:linear-gradient(90deg,#2870ea 10.79%,#1b4aef 87.08%);border-radius:100%;display:inline-block;animation:sk-bouncedelay-aff729bc 1.4s infinite ease-in-out both}.loading-spinner .bounce1[data-v-aff729bc]{animation-delay:-.32s}.loading-spinner .bounce2[data-v-aff729bc]{animation-delay:-.16s}@keyframes sk-bouncedelay-aff729bc{0%,80%,to{transform:scale(0)}40%{transform:scale(1)}}

View File

@ -0,0 +1 @@
.fade-enter-active[data-v-4813a901],.fade-leave-active[data-v-4813a901]{transition:opacity 2.5s ease}.fade-enter-from[data-v-4813a901],.fade-leave-to[data-v-4813a901]{opacity:0}.loading-spinner[data-v-4813a901]{display:flex;justify-content:center;align-items:center;height:100vh}.loading-spinner>div[data-v-4813a901]{width:30px;height:30px;background:linear-gradient(90deg,#2870ea 10.79%,#1b4aef 87.08%);border-radius:100%;display:inline-block;animation:sk-bouncedelay-4813a901 1.4s infinite ease-in-out both}.loading-spinner .bounce1[data-v-4813a901]{animation-delay:-.32s}.loading-spinner .bounce2[data-v-4813a901]{animation-delay:-.16s}@keyframes sk-bouncedelay-4813a901{0%,80%,to{transform:scale(0)}40%{transform:scale(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

File diff suppressed because one or more lines are too long

View File

@ -1,2 +0,0 @@
try{self["workbox:window:6.5.4"]&&_()}catch{}function S(t,r){return new Promise(function(e){var i=new MessageChannel;i.port1.onmessage=function(f){e(f.data)},t.postMessage(r,[i.port2])})}function W(t,r){for(var e=0;e<r.length;e++){var i=r[e];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}function E(t,r){(r==null||r>t.length)&&(r=t.length);for(var e=0,i=new Array(r);e<r;e++)i[e]=t[e];return i}function k(t,r){var e;if(typeof Symbol>"u"||t[Symbol.iterator]==null){if(Array.isArray(t)||(e=function(f,d){if(f){if(typeof f=="string")return E(f,d);var h=Object.prototype.toString.call(f).slice(8,-1);return h==="Object"&&f.constructor&&(h=f.constructor.name),h==="Map"||h==="Set"?Array.from(f):h==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(h)?E(f,d):void 0}}(t))||r&&t&&typeof t.length=="number"){e&&(t=e);var i=0;return function(){return i>=t.length?{done:!0}:{done:!1,value:t[i++]}}}throw new TypeError(`Invalid attempt to iterate non-iterable instance.
In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}return(e=t[Symbol.iterator]()).next.bind(e)}try{self["workbox:core:6.5.4"]&&_()}catch{}var y=function(){var t=this;this.promise=new Promise(function(r,e){t.resolve=r,t.reject=e})};function b(t,r){var e=location.href;return new URL(t,e).href===new URL(r,e).href}var g=function(t,r){this.type=t,Object.assign(this,r)};function p(t,r,e){return e?r?r(t):t:(t&&t.then||(t=Promise.resolve(t)),r?t.then(r):t)}function L(){}var j={type:"SKIP_WAITING"};function P(t,r){if(!r)return t&&t.then?t.then(L):Promise.resolve()}var x=function(t){var r,e;function i(v,c){var n,o;return c===void 0&&(c={}),(n=t.call(this)||this).nn={},n.tn=0,n.rn=new y,n.en=new y,n.on=new y,n.un=0,n.an=new Set,n.cn=function(){var s=n.fn,a=s.installing;n.tn>0||!b(a.scriptURL,n.sn.toString())||performance.now()>n.un+6e4?(n.vn=a,s.removeEventListener("updatefound",n.cn)):(n.hn=a,n.an.add(a),n.rn.resolve(a)),++n.tn,a.addEventListener("statechange",n.ln)},n.ln=function(s){var a=n.fn,u=s.target,l=u.state,m=u===n.vn,w={sw:u,isExternal:m,originalEvent:s};!m&&n.mn&&(w.isUpdate=!0),n.dispatchEvent(new g(l,w)),l==="installed"?n.wn=self.setTimeout(function(){l==="installed"&&a.waiting===u&&n.dispatchEvent(new g("waiting",w))},200):l==="activating"&&(clearTimeout(n.wn),m||n.en.resolve(u))},n.dn=function(s){var a=n.hn,u=a!==navigator.serviceWorker.controller;n.dispatchEvent(new g("controlling",{isExternal:u,originalEvent:s,sw:a,isUpdate:n.mn})),u||n.on.resolve(a)},n.gn=(o=function(s){var a=s.data,u=s.ports,l=s.source;return p(n.getSW(),function(){n.an.has(l)&&n.dispatchEvent(new g("message",{data:a,originalEvent:s,ports:u,sw:l}))})},function(){for(var s=[],a=0;a<arguments.length;a++)s[a]=arguments[a];try{return Promise.resolve(o.apply(this,s))}catch(u){return Promise.reject(u)}}),n.sn=v,n.nn=c,navigator.serviceWorker.addEventListener("message",n.gn),n}e=t,(r=i).prototype=Object.create(e.prototype),r.prototype.constructor=r,r.__proto__=e;var f,d,h=i.prototype;return h.register=function(v){var c=(v===void 0?{}:v).immediate,n=c!==void 0&&c;try{var o=this;return function(s,a){var u=s();return u&&u.then?u.then(a):a(u)}(function(){if(!n&&document.readyState!=="complete")return P(new Promise(function(s){return window.addEventListener("load",s)}))},function(){return o.mn=!!navigator.serviceWorker.controller,o.yn=o.pn(),p(o.bn(),function(s){o.fn=s,o.yn&&(o.hn=o.yn,o.en.resolve(o.yn),o.on.resolve(o.yn),o.yn.addEventListener("statechange",o.ln,{once:!0}));var a=o.fn.waiting;return a&&b(a.scriptURL,o.sn.toString())&&(o.hn=a,Promise.resolve().then(function(){o.dispatchEvent(new g("waiting",{sw:a,wasWaitingBeforeRegister:!0}))}).then(function(){})),o.hn&&(o.rn.resolve(o.hn),o.an.add(o.hn)),o.fn.addEventListener("updatefound",o.cn),navigator.serviceWorker.addEventListener("controllerchange",o.dn),o.fn})})}catch(s){return Promise.reject(s)}},h.update=function(){try{return this.fn?P(this.fn.update()):void 0}catch(v){return Promise.reject(v)}},h.getSW=function(){return this.hn!==void 0?Promise.resolve(this.hn):this.rn.promise},h.messageSW=function(v){try{return p(this.getSW(),function(c){return S(c,v)})}catch(c){return Promise.reject(c)}},h.messageSkipWaiting=function(){this.fn&&this.fn.waiting&&S(this.fn.waiting,j)},h.pn=function(){var v=navigator.serviceWorker.controller;return v&&b(v.scriptURL,this.sn.toString())?v:void 0},h.bn=function(){try{var v=this;return function(c,n){try{var o=c()}catch(s){return n(s)}return o&&o.then?o.then(void 0,n):o}(function(){return p(navigator.serviceWorker.register(v.sn,v.nn),function(c){return v.un=performance.now(),c})},function(c){throw c})}catch(c){return Promise.reject(c)}},f=i,(d=[{key:"active",get:function(){return this.en.promise}},{key:"controlling",get:function(){return this.on.promise}}])&&W(f.prototype,d),i}(function(){function t(){this.Pn=new Map}var r=t.prototype;return r.addEventListener=function(e,i){this.Sn(e).add(i)},r.removeEventListener=function(e,i){this.Sn(e).delete(i)},r.dispatchEvent=function(e){e.target=this;for(var i,f=k(this.Sn(e.type));!(i=f()).done;)(0,i.value)(e)},r.Sn=function(e){return this.Pn.has(e)||this.Pn.set(e,new Set),this.Pn.get(e)},t}());export{x as Workbox,g as WorkboxEvent,S as messageSW};

View File

@ -40,9 +40,9 @@
<script src="/web/js/bing/chat/global.js"></script>
<script src="/web/js/bing/chat/amd.js"></script>
<script src="/web/js/bing/chat/config.js"></script>
<script type="module" crossorigin src="/web/assets/index-8a670f2e.js"></script>
<link rel="stylesheet" href="/web/assets/index-2c05b5de.css">
<link rel="manifest" href="/web/manifest.webmanifest"></head>
<script type="module" crossorigin src="/web/assets/index-63d32cbb.js"></script>
<link rel="stylesheet" href="/web/assets/index-29dab197.css">
<link rel="manifest" href="/web/manifest.webmanifest"><script id="vite-plugin-pwa:register-sw" src="/web/registerSW.js"></script></head>
<body>
<div id="b_sydHeadBg"></div>

1
web/registerSW.js Normal file
View File

@ -0,0 +1 @@
if('serviceWorker' in navigator) {window.addEventListener('load', () => {navigator.serviceWorker.register('/web/sw.js', { scope: '/web/' })})}

File diff suppressed because one or more lines are too long