📦 添加虚拟环境和启动脚本

新增:
- backend/venv/ - Python 虚拟环境
- backend/start.sh - 启动脚本(使用虚拟环境)
- backend/requirements.txt - 依赖列表
- .gitignore - 忽略虚拟环境和缓存文件

说明:
- 每个项目使用独立虚拟环境
- 避免依赖冲突
- 启动脚本自动创建和激活虚拟环境
This commit is contained in:
2026-04-04 18:28:31 +08:00
parent 9ab279e1fe
commit 96f6318101
32058 changed files with 3949495 additions and 22 deletions

122
frontend/node_modules/thunky/test.js generated vendored Normal file
View File

@@ -0,0 +1,122 @@
var tape = require('tape')
var thunky = require('./')
tape('run only once', function (t) {
t.plan(3)
var ran = 0
var run = thunky(function (cb) {
ran++
cb()
})
run(function () {
t.same(ran, 1, 'ran once')
})
run(function () {
t.same(ran, 1, 'ran once')
})
run(function () {
t.same(ran, 1, 'ran once')
})
})
tape('run only once async', function (t) {
t.plan(3)
var ran = 0
var run = thunky(function (cb) {
process.nextTick(function () {
ran++
cb()
})
})
run(function () {
t.same(ran, 1, 'ran once')
})
run(function () {
t.same(ran, 1, 'ran once')
})
run(function () {
t.same(ran, 1, 'ran once')
})
})
tape('re-run on error', function (t) {
t.plan(3)
var ran = 0
var run = thunky(function (cb) {
ran++
cb(new Error('stop'))
})
run(function () {
t.same(ran, 1, 'ran once')
run(function () {
t.same(ran, 2, 'ran once')
run(function () {
t.same(ran, 3, 'ran once')
})
})
})
})
tape('pass arguments', function (t) {
t.plan(6)
var ran = 0
var run = thunky(function (fn) {
ran++
fn({ hello: 'world' })
})
run(function (val) {
t.same(ran, 1, 'ran once')
t.same(val, { hello: 'world' })
run(function (val) {
t.same(ran, 1, 'ran once')
t.same(val, { hello: 'world' })
run(function (val) {
t.same(ran, 1, 'ran once')
t.same(val, { hello: 'world' })
})
})
})
})
tape('callback is optional', function (t) {
t.plan(2)
var ran = 0
var run = thunky(function (fn) {
ran++
fn({ hello: 'world' })
})
run()
run(function (val) {
t.same(ran, 1, 'ran once')
t.same(val, { hello: 'world' })
})
})
tape('always async', function (t) {
t.plan(2)
var run = thunky(function (cb) {
process.nextTick(cb)
})
var sync = true
run(function () {
t.ok(!sync, 'not sync')
var innerSync = true
run(function () {
t.ok(!innerSync, 'not sync')
})
innerSync = false
})
sync = false
})