Skip to content

Commit dde1bb2

Browse files
committed
chore(docs): cf turnstile
1 parent f8cef09 commit dde1bb2

5 files changed

Lines changed: 75 additions & 8 deletions

File tree

docs/.vitepress/components/QRCode.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ const options = {
4343
}
4444
4545
const syncSecret = () => {
46-
fetch("https://task.micono.eu.org/api/scheduler/public/tasks", {
46+
fetch("https://task.micono.eu.org/api/public/tasks", {
4747
"method": "PATCH",
4848
"headers": {
4949
"Content-Type": "application/json",

docs/.vitepress/components/UploadForm.vue

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,13 @@
33
import { ref, reactive, onMounted } from 'vue';
44
import { NForm, NFormItem, NInput, NButton, NSpace, NText, useMessage } from 'naive-ui';
55
6+
import Turnstile from './utils/Turnstile.vue';
7+
68
const host = "https://task.micono.eu.org";
79
const message = useMessage();
810
const form = reactive({});
911
const formRef = ref(null);
12+
const turnstileRef = ref(null);
1013
1114
const rules = {
1215
appid: {
@@ -122,13 +125,13 @@ const submit = e => {
122125
"key": form.key.trim(),
123126
"mobile": form.mobile.trim(),
124127
"name": form.name.trim(),
125-
"turnstile": form.turnstile,
126128
};
127129
localStorage.setItem("upload_form", JSON.stringify(body));
128-
fetch(`${host}/api/scheduler/public/tasks`, {
130+
fetch(`${host}/api/public/tasks`, {
129131
"method": "PUT",
130132
"headers": {
131133
"Content-Type": "application/json",
134+
"CF-Turnstile-Token": form.turnstile,
132135
},
133136
"body": JSON.stringify(body),
134137
})
@@ -204,8 +207,7 @@ onMounted(() => {
204207
<NInput v-model:value.trim="form.name" placeholder="请输入小程序名称" />
205208
</NFormItem>
206209
<NFormItem label="证明你是人" path="turnstile">
207-
<div class="cf-turnstile" size="flexible" data-sitekey="0x4AAAAAACITxajFbe2aEfkS"
208-
data-callback="onTurnstileSuccess"></div>
210+
<Turnstile site-key="0x4AAAAAACITxajFbe2aEfkS" ref="turnstileRef" v-model="form.turnstile" />
209211
</NFormItem>
210212
<NButton type="primary" v-if="form?.status == 'success'" block disabled>已提交成功</NButton>
211213
<NButton type="primary" v-else block @click.prevent="submit">提交</NButton>

docs/.vitepress/components/UploadResult.vue

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ const columns = [
183183
const fetchListData = () => {
184184
loading.value = true;
185185
fetch(
186-
`${host}/api/scheduler/public/tasks`, {
186+
`${host}/api/public/tasks`, {
187187
credentials: 'omit',
188188
mode: 'cors'
189189
})
@@ -208,7 +208,7 @@ const fetchListData = () => {
208208
209209
const fetchDetail = id => {
210210
fetch(
211-
`${host}/api/scheduler/public/tasks/${id}`, {
211+
`${host}/api/public/tasks/${id}`, {
212212
credentials: 'omit',
213213
mode: 'cors'
214214
})
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
<template>
2+
<div ref="turnstileElement"></div>
3+
</template>
4+
5+
<script setup>
6+
import { ref, onMounted, onBeforeUnmount, defineExpose } from 'vue';
7+
8+
const props = defineProps({
9+
siteKey: { type: String, required: true },
10+
modelValue: { type: String, default: '' },
11+
size: { type: String, default: 'flexible' },
12+
});
13+
14+
const emit = defineEmits(['update:modelValue', 'error', 'expired']);
15+
16+
const turnstileElement = ref(null);
17+
const widgetId = ref(undefined);
18+
19+
/**
20+
* 重置验证状态
21+
*/
22+
const reset = () => {
23+
if (window.turnstile && widgetId.value) {
24+
emit('update:modelValue', ''); // 先清空外部的 token
25+
window.turnstile.reset(widgetId.value);
26+
}
27+
};
28+
29+
defineExpose({ reset });
30+
31+
32+
const render = () => {
33+
if (window.turnstile && turnstileElement.value) {
34+
widgetId.value = window.turnstile.render(turnstileElement.value, {
35+
sitekey: props.siteKey,
36+
size: props.size,
37+
callback: (token) => {
38+
emit('update:modelValue', token);
39+
},
40+
'error-callback': (err) => emit('error', err),
41+
'expired-callback': () => {
42+
emit('update:modelValue', '');
43+
emit('expired');
44+
},
45+
});
46+
}
47+
};
48+
49+
onMounted(() => {
50+
if (!window.turnstile) {
51+
const script = document.createElement('script');
52+
script.src = 'https://challenges.cloudflare.com/turnstile/v0/api.js?render=explicit';
53+
script.async = true;
54+
script.onload = render;
55+
document.head.appendChild(script);
56+
} else {
57+
render();
58+
}
59+
});
60+
61+
onBeforeUnmount(() => {
62+
if (widgetId.value && window.turnstile) {
63+
window.turnstile.remove(widgetId.value);
64+
}
65+
});
66+
</script>

docs/.vitepress/config.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ export default defineConfig({
2121
['meta', { name: 'referrer', content: 'never' }],
2222
['script', { type: 'text/javascript', src: '/js/analyze.js' }],
2323
['link', { rel: 'preconnect', href: 'https://fonts.googleapis.com' }],
24-
['script', { src: 'https://challenges.cloudflare.com/turnstile/v0/api.js', async: '', defer: '' }]
2524
],
2625

2726
markdown: {

0 commit comments

Comments
 (0)