diff --git a/.cursor/rules/5sguize.mdc b/.cursor/rules/5sguize.mdc index 1e843c6..b3f2026 100644 --- a/.cursor/rules/5sguize.mdc +++ b/.cursor/rules/5sguize.mdc @@ -1,5 +1,5 @@ --- -alwaysApply: false +alwaysApply: true --- ### **软件开发人员5S个人工作规范体系** **版本:** 1.0 diff --git a/.venv/Lib/site-packages/__pycache__/typing_extensions.cpython-312.pyc b/.venv/Lib/site-packages/__pycache__/typing_extensions.cpython-312.pyc index a625060..1be9ebe 100644 Binary files a/.venv/Lib/site-packages/__pycache__/typing_extensions.cpython-312.pyc and b/.venv/Lib/site-packages/__pycache__/typing_extensions.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/blinker/__pycache__/__init__.cpython-312.pyc b/.venv/Lib/site-packages/blinker/__pycache__/__init__.cpython-312.pyc index 053baf5..8e3cea4 100644 Binary files a/.venv/Lib/site-packages/blinker/__pycache__/__init__.cpython-312.pyc and b/.venv/Lib/site-packages/blinker/__pycache__/__init__.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/blinker/__pycache__/_utilities.cpython-312.pyc b/.venv/Lib/site-packages/blinker/__pycache__/_utilities.cpython-312.pyc index 33a48c0..965ba6d 100644 Binary files a/.venv/Lib/site-packages/blinker/__pycache__/_utilities.cpython-312.pyc and b/.venv/Lib/site-packages/blinker/__pycache__/_utilities.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/blinker/__pycache__/base.cpython-312.pyc b/.venv/Lib/site-packages/blinker/__pycache__/base.cpython-312.pyc index 25e86fc..0272771 100644 Binary files a/.venv/Lib/site-packages/blinker/__pycache__/base.cpython-312.pyc and b/.venv/Lib/site-packages/blinker/__pycache__/base.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/click/__pycache__/__init__.cpython-312.pyc b/.venv/Lib/site-packages/click/__pycache__/__init__.cpython-312.pyc index a6d05c5..0178a94 100644 Binary files a/.venv/Lib/site-packages/click/__pycache__/__init__.cpython-312.pyc and b/.venv/Lib/site-packages/click/__pycache__/__init__.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/click/__pycache__/_compat.cpython-312.pyc b/.venv/Lib/site-packages/click/__pycache__/_compat.cpython-312.pyc index 645ddad..1017a93 100644 Binary files a/.venv/Lib/site-packages/click/__pycache__/_compat.cpython-312.pyc and b/.venv/Lib/site-packages/click/__pycache__/_compat.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/click/__pycache__/_winconsole.cpython-312.pyc b/.venv/Lib/site-packages/click/__pycache__/_winconsole.cpython-312.pyc index ef96f14..57b30c4 100644 Binary files a/.venv/Lib/site-packages/click/__pycache__/_winconsole.cpython-312.pyc and b/.venv/Lib/site-packages/click/__pycache__/_winconsole.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/click/__pycache__/core.cpython-312.pyc b/.venv/Lib/site-packages/click/__pycache__/core.cpython-312.pyc index 618e9cd..a041452 100644 Binary files a/.venv/Lib/site-packages/click/__pycache__/core.cpython-312.pyc and b/.venv/Lib/site-packages/click/__pycache__/core.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/click/__pycache__/decorators.cpython-312.pyc b/.venv/Lib/site-packages/click/__pycache__/decorators.cpython-312.pyc index 653cc3e..b6417e2 100644 Binary files a/.venv/Lib/site-packages/click/__pycache__/decorators.cpython-312.pyc and b/.venv/Lib/site-packages/click/__pycache__/decorators.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/click/__pycache__/exceptions.cpython-312.pyc b/.venv/Lib/site-packages/click/__pycache__/exceptions.cpython-312.pyc index bf5be04..7048b3c 100644 Binary files a/.venv/Lib/site-packages/click/__pycache__/exceptions.cpython-312.pyc and b/.venv/Lib/site-packages/click/__pycache__/exceptions.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/click/__pycache__/formatting.cpython-312.pyc b/.venv/Lib/site-packages/click/__pycache__/formatting.cpython-312.pyc index 127176f..9f9b71b 100644 Binary files a/.venv/Lib/site-packages/click/__pycache__/formatting.cpython-312.pyc and b/.venv/Lib/site-packages/click/__pycache__/formatting.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/click/__pycache__/globals.cpython-312.pyc b/.venv/Lib/site-packages/click/__pycache__/globals.cpython-312.pyc index c022a49..2580a1a 100644 Binary files a/.venv/Lib/site-packages/click/__pycache__/globals.cpython-312.pyc and b/.venv/Lib/site-packages/click/__pycache__/globals.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/click/__pycache__/parser.cpython-312.pyc b/.venv/Lib/site-packages/click/__pycache__/parser.cpython-312.pyc index 9a9f4ad..7962113 100644 Binary files a/.venv/Lib/site-packages/click/__pycache__/parser.cpython-312.pyc and b/.venv/Lib/site-packages/click/__pycache__/parser.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/click/__pycache__/termui.cpython-312.pyc b/.venv/Lib/site-packages/click/__pycache__/termui.cpython-312.pyc index e228844..0984aed 100644 Binary files a/.venv/Lib/site-packages/click/__pycache__/termui.cpython-312.pyc and b/.venv/Lib/site-packages/click/__pycache__/termui.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/click/__pycache__/types.cpython-312.pyc b/.venv/Lib/site-packages/click/__pycache__/types.cpython-312.pyc index 6c9d2a7..b1f85d1 100644 Binary files a/.venv/Lib/site-packages/click/__pycache__/types.cpython-312.pyc and b/.venv/Lib/site-packages/click/__pycache__/types.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/click/__pycache__/utils.cpython-312.pyc b/.venv/Lib/site-packages/click/__pycache__/utils.cpython-312.pyc index afcaf0b..d37a376 100644 Binary files a/.venv/Lib/site-packages/click/__pycache__/utils.cpython-312.pyc and b/.venv/Lib/site-packages/click/__pycache__/utils.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/colorama/__pycache__/__init__.cpython-312.pyc b/.venv/Lib/site-packages/colorama/__pycache__/__init__.cpython-312.pyc index 0598a6c..983e648 100644 Binary files a/.venv/Lib/site-packages/colorama/__pycache__/__init__.cpython-312.pyc and b/.venv/Lib/site-packages/colorama/__pycache__/__init__.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/colorama/__pycache__/ansi.cpython-312.pyc b/.venv/Lib/site-packages/colorama/__pycache__/ansi.cpython-312.pyc index 9c308c1..ae833f4 100644 Binary files a/.venv/Lib/site-packages/colorama/__pycache__/ansi.cpython-312.pyc and b/.venv/Lib/site-packages/colorama/__pycache__/ansi.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/colorama/__pycache__/ansitowin32.cpython-312.pyc b/.venv/Lib/site-packages/colorama/__pycache__/ansitowin32.cpython-312.pyc index 682c499..181f835 100644 Binary files a/.venv/Lib/site-packages/colorama/__pycache__/ansitowin32.cpython-312.pyc and b/.venv/Lib/site-packages/colorama/__pycache__/ansitowin32.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/colorama/__pycache__/initialise.cpython-312.pyc b/.venv/Lib/site-packages/colorama/__pycache__/initialise.cpython-312.pyc index c4bbd42..1e68b8c 100644 Binary files a/.venv/Lib/site-packages/colorama/__pycache__/initialise.cpython-312.pyc and b/.venv/Lib/site-packages/colorama/__pycache__/initialise.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/colorama/__pycache__/win32.cpython-312.pyc b/.venv/Lib/site-packages/colorama/__pycache__/win32.cpython-312.pyc index 4f3c644..9293053 100644 Binary files a/.venv/Lib/site-packages/colorama/__pycache__/win32.cpython-312.pyc and b/.venv/Lib/site-packages/colorama/__pycache__/win32.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/colorama/__pycache__/winterm.cpython-312.pyc b/.venv/Lib/site-packages/colorama/__pycache__/winterm.cpython-312.pyc index f3f9799..dd2b8bc 100644 Binary files a/.venv/Lib/site-packages/colorama/__pycache__/winterm.cpython-312.pyc and b/.venv/Lib/site-packages/colorama/__pycache__/winterm.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/flask/__pycache__/__init__.cpython-312.pyc b/.venv/Lib/site-packages/flask/__pycache__/__init__.cpython-312.pyc index 8cbf084..529d388 100644 Binary files a/.venv/Lib/site-packages/flask/__pycache__/__init__.cpython-312.pyc and b/.venv/Lib/site-packages/flask/__pycache__/__init__.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/flask/__pycache__/app.cpython-312.pyc b/.venv/Lib/site-packages/flask/__pycache__/app.cpython-312.pyc index d3e5c11..5c52557 100644 Binary files a/.venv/Lib/site-packages/flask/__pycache__/app.cpython-312.pyc and b/.venv/Lib/site-packages/flask/__pycache__/app.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/flask/__pycache__/blueprints.cpython-312.pyc b/.venv/Lib/site-packages/flask/__pycache__/blueprints.cpython-312.pyc index 38829d4..fc303de 100644 Binary files a/.venv/Lib/site-packages/flask/__pycache__/blueprints.cpython-312.pyc and b/.venv/Lib/site-packages/flask/__pycache__/blueprints.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/flask/__pycache__/cli.cpython-312.pyc b/.venv/Lib/site-packages/flask/__pycache__/cli.cpython-312.pyc index 54801cb..4c45e11 100644 Binary files a/.venv/Lib/site-packages/flask/__pycache__/cli.cpython-312.pyc and b/.venv/Lib/site-packages/flask/__pycache__/cli.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/flask/__pycache__/config.cpython-312.pyc b/.venv/Lib/site-packages/flask/__pycache__/config.cpython-312.pyc index 89bb2e8..3930879 100644 Binary files a/.venv/Lib/site-packages/flask/__pycache__/config.cpython-312.pyc and b/.venv/Lib/site-packages/flask/__pycache__/config.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/flask/__pycache__/ctx.cpython-312.pyc b/.venv/Lib/site-packages/flask/__pycache__/ctx.cpython-312.pyc index 5ea228d..91e5e6e 100644 Binary files a/.venv/Lib/site-packages/flask/__pycache__/ctx.cpython-312.pyc and b/.venv/Lib/site-packages/flask/__pycache__/ctx.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/flask/__pycache__/globals.cpython-312.pyc b/.venv/Lib/site-packages/flask/__pycache__/globals.cpython-312.pyc index a940874..bdf7003 100644 Binary files a/.venv/Lib/site-packages/flask/__pycache__/globals.cpython-312.pyc and b/.venv/Lib/site-packages/flask/__pycache__/globals.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/flask/__pycache__/helpers.cpython-312.pyc b/.venv/Lib/site-packages/flask/__pycache__/helpers.cpython-312.pyc index c3a098f..3ad0a57 100644 Binary files a/.venv/Lib/site-packages/flask/__pycache__/helpers.cpython-312.pyc and b/.venv/Lib/site-packages/flask/__pycache__/helpers.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/flask/__pycache__/logging.cpython-312.pyc b/.venv/Lib/site-packages/flask/__pycache__/logging.cpython-312.pyc index 5c48b43..9bcd34c 100644 Binary files a/.venv/Lib/site-packages/flask/__pycache__/logging.cpython-312.pyc and b/.venv/Lib/site-packages/flask/__pycache__/logging.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/flask/__pycache__/sessions.cpython-312.pyc b/.venv/Lib/site-packages/flask/__pycache__/sessions.cpython-312.pyc index 00c2c8b..f0d2cc4 100644 Binary files a/.venv/Lib/site-packages/flask/__pycache__/sessions.cpython-312.pyc and b/.venv/Lib/site-packages/flask/__pycache__/sessions.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/flask/__pycache__/signals.cpython-312.pyc b/.venv/Lib/site-packages/flask/__pycache__/signals.cpython-312.pyc index 70ce6c6..1819680 100644 Binary files a/.venv/Lib/site-packages/flask/__pycache__/signals.cpython-312.pyc and b/.venv/Lib/site-packages/flask/__pycache__/signals.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/flask/__pycache__/templating.cpython-312.pyc b/.venv/Lib/site-packages/flask/__pycache__/templating.cpython-312.pyc index af054b5..23fb00b 100644 Binary files a/.venv/Lib/site-packages/flask/__pycache__/templating.cpython-312.pyc and b/.venv/Lib/site-packages/flask/__pycache__/templating.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/flask/__pycache__/typing.cpython-312.pyc b/.venv/Lib/site-packages/flask/__pycache__/typing.cpython-312.pyc index bda8237..97db9c4 100644 Binary files a/.venv/Lib/site-packages/flask/__pycache__/typing.cpython-312.pyc and b/.venv/Lib/site-packages/flask/__pycache__/typing.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/flask/__pycache__/wrappers.cpython-312.pyc b/.venv/Lib/site-packages/flask/__pycache__/wrappers.cpython-312.pyc index 943fe30..0f29688 100644 Binary files a/.venv/Lib/site-packages/flask/__pycache__/wrappers.cpython-312.pyc and b/.venv/Lib/site-packages/flask/__pycache__/wrappers.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/flask/json/__pycache__/__init__.cpython-312.pyc b/.venv/Lib/site-packages/flask/json/__pycache__/__init__.cpython-312.pyc index deae1fd..18850ec 100644 Binary files a/.venv/Lib/site-packages/flask/json/__pycache__/__init__.cpython-312.pyc and b/.venv/Lib/site-packages/flask/json/__pycache__/__init__.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/flask/json/__pycache__/provider.cpython-312.pyc b/.venv/Lib/site-packages/flask/json/__pycache__/provider.cpython-312.pyc index 558db18..edc0430 100644 Binary files a/.venv/Lib/site-packages/flask/json/__pycache__/provider.cpython-312.pyc and b/.venv/Lib/site-packages/flask/json/__pycache__/provider.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/flask/json/__pycache__/tag.cpython-312.pyc b/.venv/Lib/site-packages/flask/json/__pycache__/tag.cpython-312.pyc index 53ae3d0..12e2657 100644 Binary files a/.venv/Lib/site-packages/flask/json/__pycache__/tag.cpython-312.pyc and b/.venv/Lib/site-packages/flask/json/__pycache__/tag.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/flask/sansio/__pycache__/app.cpython-312.pyc b/.venv/Lib/site-packages/flask/sansio/__pycache__/app.cpython-312.pyc index 4853c85..62facb6 100644 Binary files a/.venv/Lib/site-packages/flask/sansio/__pycache__/app.cpython-312.pyc and b/.venv/Lib/site-packages/flask/sansio/__pycache__/app.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/flask/sansio/__pycache__/blueprints.cpython-312.pyc b/.venv/Lib/site-packages/flask/sansio/__pycache__/blueprints.cpython-312.pyc index 3b825d5..a8d120f 100644 Binary files a/.venv/Lib/site-packages/flask/sansio/__pycache__/blueprints.cpython-312.pyc and b/.venv/Lib/site-packages/flask/sansio/__pycache__/blueprints.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/flask/sansio/__pycache__/scaffold.cpython-312.pyc b/.venv/Lib/site-packages/flask/sansio/__pycache__/scaffold.cpython-312.pyc index 7b5988e..c72bbd4 100644 Binary files a/.venv/Lib/site-packages/flask/sansio/__pycache__/scaffold.cpython-312.pyc and b/.venv/Lib/site-packages/flask/sansio/__pycache__/scaffold.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/itsdangerous/__pycache__/__init__.cpython-312.pyc b/.venv/Lib/site-packages/itsdangerous/__pycache__/__init__.cpython-312.pyc index 27dc22c..b9b4bd8 100644 Binary files a/.venv/Lib/site-packages/itsdangerous/__pycache__/__init__.cpython-312.pyc and b/.venv/Lib/site-packages/itsdangerous/__pycache__/__init__.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/itsdangerous/__pycache__/_json.cpython-312.pyc b/.venv/Lib/site-packages/itsdangerous/__pycache__/_json.cpython-312.pyc index f9dd95a..f0d25c9 100644 Binary files a/.venv/Lib/site-packages/itsdangerous/__pycache__/_json.cpython-312.pyc and b/.venv/Lib/site-packages/itsdangerous/__pycache__/_json.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/itsdangerous/__pycache__/encoding.cpython-312.pyc b/.venv/Lib/site-packages/itsdangerous/__pycache__/encoding.cpython-312.pyc index 7c3dabd..3102b68 100644 Binary files a/.venv/Lib/site-packages/itsdangerous/__pycache__/encoding.cpython-312.pyc and b/.venv/Lib/site-packages/itsdangerous/__pycache__/encoding.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/itsdangerous/__pycache__/exc.cpython-312.pyc b/.venv/Lib/site-packages/itsdangerous/__pycache__/exc.cpython-312.pyc index f5e1271..4d0f0aa 100644 Binary files a/.venv/Lib/site-packages/itsdangerous/__pycache__/exc.cpython-312.pyc and b/.venv/Lib/site-packages/itsdangerous/__pycache__/exc.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/itsdangerous/__pycache__/serializer.cpython-312.pyc b/.venv/Lib/site-packages/itsdangerous/__pycache__/serializer.cpython-312.pyc index 786d322..bafc8f3 100644 Binary files a/.venv/Lib/site-packages/itsdangerous/__pycache__/serializer.cpython-312.pyc and b/.venv/Lib/site-packages/itsdangerous/__pycache__/serializer.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/itsdangerous/__pycache__/signer.cpython-312.pyc b/.venv/Lib/site-packages/itsdangerous/__pycache__/signer.cpython-312.pyc index 969206d..a19073e 100644 Binary files a/.venv/Lib/site-packages/itsdangerous/__pycache__/signer.cpython-312.pyc and b/.venv/Lib/site-packages/itsdangerous/__pycache__/signer.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/itsdangerous/__pycache__/timed.cpython-312.pyc b/.venv/Lib/site-packages/itsdangerous/__pycache__/timed.cpython-312.pyc index 20839c5..c32fa2f 100644 Binary files a/.venv/Lib/site-packages/itsdangerous/__pycache__/timed.cpython-312.pyc and b/.venv/Lib/site-packages/itsdangerous/__pycache__/timed.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/itsdangerous/__pycache__/url_safe.cpython-312.pyc b/.venv/Lib/site-packages/itsdangerous/__pycache__/url_safe.cpython-312.pyc index 2a0fc20..3a75e24 100644 Binary files a/.venv/Lib/site-packages/itsdangerous/__pycache__/url_safe.cpython-312.pyc and b/.venv/Lib/site-packages/itsdangerous/__pycache__/url_safe.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/jinja2/__pycache__/__init__.cpython-312.pyc b/.venv/Lib/site-packages/jinja2/__pycache__/__init__.cpython-312.pyc index dbab2c2..554f16f 100644 Binary files a/.venv/Lib/site-packages/jinja2/__pycache__/__init__.cpython-312.pyc and b/.venv/Lib/site-packages/jinja2/__pycache__/__init__.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/jinja2/__pycache__/_identifier.cpython-312.pyc b/.venv/Lib/site-packages/jinja2/__pycache__/_identifier.cpython-312.pyc index b4f24cf..80f9754 100644 Binary files a/.venv/Lib/site-packages/jinja2/__pycache__/_identifier.cpython-312.pyc and b/.venv/Lib/site-packages/jinja2/__pycache__/_identifier.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/jinja2/__pycache__/async_utils.cpython-312.pyc b/.venv/Lib/site-packages/jinja2/__pycache__/async_utils.cpython-312.pyc index 5fface0..4b6bafd 100644 Binary files a/.venv/Lib/site-packages/jinja2/__pycache__/async_utils.cpython-312.pyc and b/.venv/Lib/site-packages/jinja2/__pycache__/async_utils.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/jinja2/__pycache__/bccache.cpython-312.pyc b/.venv/Lib/site-packages/jinja2/__pycache__/bccache.cpython-312.pyc index 8dfc348..08a0d1d 100644 Binary files a/.venv/Lib/site-packages/jinja2/__pycache__/bccache.cpython-312.pyc and b/.venv/Lib/site-packages/jinja2/__pycache__/bccache.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/jinja2/__pycache__/compiler.cpython-312.pyc b/.venv/Lib/site-packages/jinja2/__pycache__/compiler.cpython-312.pyc index bc71d90..77af103 100644 Binary files a/.venv/Lib/site-packages/jinja2/__pycache__/compiler.cpython-312.pyc and b/.venv/Lib/site-packages/jinja2/__pycache__/compiler.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/jinja2/__pycache__/defaults.cpython-312.pyc b/.venv/Lib/site-packages/jinja2/__pycache__/defaults.cpython-312.pyc index d32d608..b3ee0de 100644 Binary files a/.venv/Lib/site-packages/jinja2/__pycache__/defaults.cpython-312.pyc and b/.venv/Lib/site-packages/jinja2/__pycache__/defaults.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/jinja2/__pycache__/environment.cpython-312.pyc b/.venv/Lib/site-packages/jinja2/__pycache__/environment.cpython-312.pyc index c30fa2d..c3ba0eb 100644 Binary files a/.venv/Lib/site-packages/jinja2/__pycache__/environment.cpython-312.pyc and b/.venv/Lib/site-packages/jinja2/__pycache__/environment.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/jinja2/__pycache__/exceptions.cpython-312.pyc b/.venv/Lib/site-packages/jinja2/__pycache__/exceptions.cpython-312.pyc index 99dde3d..fbecc16 100644 Binary files a/.venv/Lib/site-packages/jinja2/__pycache__/exceptions.cpython-312.pyc and b/.venv/Lib/site-packages/jinja2/__pycache__/exceptions.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/jinja2/__pycache__/filters.cpython-312.pyc b/.venv/Lib/site-packages/jinja2/__pycache__/filters.cpython-312.pyc index 0db2461..8c71c47 100644 Binary files a/.venv/Lib/site-packages/jinja2/__pycache__/filters.cpython-312.pyc and b/.venv/Lib/site-packages/jinja2/__pycache__/filters.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/jinja2/__pycache__/idtracking.cpython-312.pyc b/.venv/Lib/site-packages/jinja2/__pycache__/idtracking.cpython-312.pyc index 7c2c9cc..e95153b 100644 Binary files a/.venv/Lib/site-packages/jinja2/__pycache__/idtracking.cpython-312.pyc and b/.venv/Lib/site-packages/jinja2/__pycache__/idtracking.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/jinja2/__pycache__/lexer.cpython-312.pyc b/.venv/Lib/site-packages/jinja2/__pycache__/lexer.cpython-312.pyc index dcafe74..e608b4b 100644 Binary files a/.venv/Lib/site-packages/jinja2/__pycache__/lexer.cpython-312.pyc and b/.venv/Lib/site-packages/jinja2/__pycache__/lexer.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/jinja2/__pycache__/loaders.cpython-312.pyc b/.venv/Lib/site-packages/jinja2/__pycache__/loaders.cpython-312.pyc index 3317f36..b51444d 100644 Binary files a/.venv/Lib/site-packages/jinja2/__pycache__/loaders.cpython-312.pyc and b/.venv/Lib/site-packages/jinja2/__pycache__/loaders.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/jinja2/__pycache__/nodes.cpython-312.pyc b/.venv/Lib/site-packages/jinja2/__pycache__/nodes.cpython-312.pyc index 1de93ca..8172981 100644 Binary files a/.venv/Lib/site-packages/jinja2/__pycache__/nodes.cpython-312.pyc and b/.venv/Lib/site-packages/jinja2/__pycache__/nodes.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/jinja2/__pycache__/optimizer.cpython-312.pyc b/.venv/Lib/site-packages/jinja2/__pycache__/optimizer.cpython-312.pyc index 41f150e..3917fad 100644 Binary files a/.venv/Lib/site-packages/jinja2/__pycache__/optimizer.cpython-312.pyc and b/.venv/Lib/site-packages/jinja2/__pycache__/optimizer.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/jinja2/__pycache__/parser.cpython-312.pyc b/.venv/Lib/site-packages/jinja2/__pycache__/parser.cpython-312.pyc index a8714fe..059e1b1 100644 Binary files a/.venv/Lib/site-packages/jinja2/__pycache__/parser.cpython-312.pyc and b/.venv/Lib/site-packages/jinja2/__pycache__/parser.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/jinja2/__pycache__/runtime.cpython-312.pyc b/.venv/Lib/site-packages/jinja2/__pycache__/runtime.cpython-312.pyc index 567d3bc..bd6e4eb 100644 Binary files a/.venv/Lib/site-packages/jinja2/__pycache__/runtime.cpython-312.pyc and b/.venv/Lib/site-packages/jinja2/__pycache__/runtime.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/jinja2/__pycache__/tests.cpython-312.pyc b/.venv/Lib/site-packages/jinja2/__pycache__/tests.cpython-312.pyc index 178c322..81eb39b 100644 Binary files a/.venv/Lib/site-packages/jinja2/__pycache__/tests.cpython-312.pyc and b/.venv/Lib/site-packages/jinja2/__pycache__/tests.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/jinja2/__pycache__/utils.cpython-312.pyc b/.venv/Lib/site-packages/jinja2/__pycache__/utils.cpython-312.pyc index 0f40445..9d7b4a8 100644 Binary files a/.venv/Lib/site-packages/jinja2/__pycache__/utils.cpython-312.pyc and b/.venv/Lib/site-packages/jinja2/__pycache__/utils.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/jinja2/__pycache__/visitor.cpython-312.pyc b/.venv/Lib/site-packages/jinja2/__pycache__/visitor.cpython-312.pyc index c1a664b..cf9922a 100644 Binary files a/.venv/Lib/site-packages/jinja2/__pycache__/visitor.cpython-312.pyc and b/.venv/Lib/site-packages/jinja2/__pycache__/visitor.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/markupsafe/__pycache__/__init__.cpython-312.pyc b/.venv/Lib/site-packages/markupsafe/__pycache__/__init__.cpython-312.pyc index cea30eb..2993b77 100644 Binary files a/.venv/Lib/site-packages/markupsafe/__pycache__/__init__.cpython-312.pyc and b/.venv/Lib/site-packages/markupsafe/__pycache__/__init__.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/werkzeug/__pycache__/__init__.cpython-312.pyc b/.venv/Lib/site-packages/werkzeug/__pycache__/__init__.cpython-312.pyc index cb7b811..e551417 100644 Binary files a/.venv/Lib/site-packages/werkzeug/__pycache__/__init__.cpython-312.pyc and b/.venv/Lib/site-packages/werkzeug/__pycache__/__init__.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/werkzeug/__pycache__/_internal.cpython-312.pyc b/.venv/Lib/site-packages/werkzeug/__pycache__/_internal.cpython-312.pyc index 573ca96..6004cbd 100644 Binary files a/.venv/Lib/site-packages/werkzeug/__pycache__/_internal.cpython-312.pyc and b/.venv/Lib/site-packages/werkzeug/__pycache__/_internal.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/werkzeug/__pycache__/_reloader.cpython-312.pyc b/.venv/Lib/site-packages/werkzeug/__pycache__/_reloader.cpython-312.pyc index bb3915f..7d32a9b 100644 Binary files a/.venv/Lib/site-packages/werkzeug/__pycache__/_reloader.cpython-312.pyc and b/.venv/Lib/site-packages/werkzeug/__pycache__/_reloader.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/werkzeug/__pycache__/exceptions.cpython-312.pyc b/.venv/Lib/site-packages/werkzeug/__pycache__/exceptions.cpython-312.pyc index bd000ad..f07276c 100644 Binary files a/.venv/Lib/site-packages/werkzeug/__pycache__/exceptions.cpython-312.pyc and b/.venv/Lib/site-packages/werkzeug/__pycache__/exceptions.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/werkzeug/__pycache__/formparser.cpython-312.pyc b/.venv/Lib/site-packages/werkzeug/__pycache__/formparser.cpython-312.pyc index 325948d..22692af 100644 Binary files a/.venv/Lib/site-packages/werkzeug/__pycache__/formparser.cpython-312.pyc and b/.venv/Lib/site-packages/werkzeug/__pycache__/formparser.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/werkzeug/__pycache__/http.cpython-312.pyc b/.venv/Lib/site-packages/werkzeug/__pycache__/http.cpython-312.pyc index 20b5fbe..93afa3c 100644 Binary files a/.venv/Lib/site-packages/werkzeug/__pycache__/http.cpython-312.pyc and b/.venv/Lib/site-packages/werkzeug/__pycache__/http.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/werkzeug/__pycache__/local.cpython-312.pyc b/.venv/Lib/site-packages/werkzeug/__pycache__/local.cpython-312.pyc index d0a2642..74ed019 100644 Binary files a/.venv/Lib/site-packages/werkzeug/__pycache__/local.cpython-312.pyc and b/.venv/Lib/site-packages/werkzeug/__pycache__/local.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/werkzeug/__pycache__/security.cpython-312.pyc b/.venv/Lib/site-packages/werkzeug/__pycache__/security.cpython-312.pyc index b74b13a..ab3177b 100644 Binary files a/.venv/Lib/site-packages/werkzeug/__pycache__/security.cpython-312.pyc and b/.venv/Lib/site-packages/werkzeug/__pycache__/security.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/werkzeug/__pycache__/serving.cpython-312.pyc b/.venv/Lib/site-packages/werkzeug/__pycache__/serving.cpython-312.pyc index 0570280..e41be0a 100644 Binary files a/.venv/Lib/site-packages/werkzeug/__pycache__/serving.cpython-312.pyc and b/.venv/Lib/site-packages/werkzeug/__pycache__/serving.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/werkzeug/__pycache__/test.cpython-312.pyc b/.venv/Lib/site-packages/werkzeug/__pycache__/test.cpython-312.pyc index d2ffc95..bd7fd0c 100644 Binary files a/.venv/Lib/site-packages/werkzeug/__pycache__/test.cpython-312.pyc and b/.venv/Lib/site-packages/werkzeug/__pycache__/test.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/werkzeug/__pycache__/urls.cpython-312.pyc b/.venv/Lib/site-packages/werkzeug/__pycache__/urls.cpython-312.pyc index 2dc8693..bff7f3c 100644 Binary files a/.venv/Lib/site-packages/werkzeug/__pycache__/urls.cpython-312.pyc and b/.venv/Lib/site-packages/werkzeug/__pycache__/urls.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/werkzeug/__pycache__/user_agent.cpython-312.pyc b/.venv/Lib/site-packages/werkzeug/__pycache__/user_agent.cpython-312.pyc index 1f2194f..96d6772 100644 Binary files a/.venv/Lib/site-packages/werkzeug/__pycache__/user_agent.cpython-312.pyc and b/.venv/Lib/site-packages/werkzeug/__pycache__/user_agent.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/werkzeug/__pycache__/utils.cpython-312.pyc b/.venv/Lib/site-packages/werkzeug/__pycache__/utils.cpython-312.pyc index 42ec19a..f48eb1e 100644 Binary files a/.venv/Lib/site-packages/werkzeug/__pycache__/utils.cpython-312.pyc and b/.venv/Lib/site-packages/werkzeug/__pycache__/utils.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/werkzeug/__pycache__/wsgi.cpython-312.pyc b/.venv/Lib/site-packages/werkzeug/__pycache__/wsgi.cpython-312.pyc index 4f9bd81..01996d0 100644 Binary files a/.venv/Lib/site-packages/werkzeug/__pycache__/wsgi.cpython-312.pyc and b/.venv/Lib/site-packages/werkzeug/__pycache__/wsgi.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/werkzeug/datastructures/__pycache__/__init__.cpython-312.pyc b/.venv/Lib/site-packages/werkzeug/datastructures/__pycache__/__init__.cpython-312.pyc index 3c58137..7273a3b 100644 Binary files a/.venv/Lib/site-packages/werkzeug/datastructures/__pycache__/__init__.cpython-312.pyc and b/.venv/Lib/site-packages/werkzeug/datastructures/__pycache__/__init__.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/werkzeug/datastructures/__pycache__/accept.cpython-312.pyc b/.venv/Lib/site-packages/werkzeug/datastructures/__pycache__/accept.cpython-312.pyc index cea233a..6859cd0 100644 Binary files a/.venv/Lib/site-packages/werkzeug/datastructures/__pycache__/accept.cpython-312.pyc and b/.venv/Lib/site-packages/werkzeug/datastructures/__pycache__/accept.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/werkzeug/datastructures/__pycache__/auth.cpython-312.pyc b/.venv/Lib/site-packages/werkzeug/datastructures/__pycache__/auth.cpython-312.pyc index 76ad0d6..263f0c8 100644 Binary files a/.venv/Lib/site-packages/werkzeug/datastructures/__pycache__/auth.cpython-312.pyc and b/.venv/Lib/site-packages/werkzeug/datastructures/__pycache__/auth.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/werkzeug/datastructures/__pycache__/cache_control.cpython-312.pyc b/.venv/Lib/site-packages/werkzeug/datastructures/__pycache__/cache_control.cpython-312.pyc index a1ae389..df7408c 100644 Binary files a/.venv/Lib/site-packages/werkzeug/datastructures/__pycache__/cache_control.cpython-312.pyc and b/.venv/Lib/site-packages/werkzeug/datastructures/__pycache__/cache_control.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/werkzeug/datastructures/__pycache__/csp.cpython-312.pyc b/.venv/Lib/site-packages/werkzeug/datastructures/__pycache__/csp.cpython-312.pyc index bb151fb..d3ace26 100644 Binary files a/.venv/Lib/site-packages/werkzeug/datastructures/__pycache__/csp.cpython-312.pyc and b/.venv/Lib/site-packages/werkzeug/datastructures/__pycache__/csp.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/werkzeug/datastructures/__pycache__/etag.cpython-312.pyc b/.venv/Lib/site-packages/werkzeug/datastructures/__pycache__/etag.cpython-312.pyc index 38daca2..27e9368 100644 Binary files a/.venv/Lib/site-packages/werkzeug/datastructures/__pycache__/etag.cpython-312.pyc and b/.venv/Lib/site-packages/werkzeug/datastructures/__pycache__/etag.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/werkzeug/datastructures/__pycache__/file_storage.cpython-312.pyc b/.venv/Lib/site-packages/werkzeug/datastructures/__pycache__/file_storage.cpython-312.pyc index fc525cc..999c43a 100644 Binary files a/.venv/Lib/site-packages/werkzeug/datastructures/__pycache__/file_storage.cpython-312.pyc and b/.venv/Lib/site-packages/werkzeug/datastructures/__pycache__/file_storage.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/werkzeug/datastructures/__pycache__/headers.cpython-312.pyc b/.venv/Lib/site-packages/werkzeug/datastructures/__pycache__/headers.cpython-312.pyc index 24c5721..b994442 100644 Binary files a/.venv/Lib/site-packages/werkzeug/datastructures/__pycache__/headers.cpython-312.pyc and b/.venv/Lib/site-packages/werkzeug/datastructures/__pycache__/headers.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/werkzeug/datastructures/__pycache__/mixins.cpython-312.pyc b/.venv/Lib/site-packages/werkzeug/datastructures/__pycache__/mixins.cpython-312.pyc index 9c288af..4cc942d 100644 Binary files a/.venv/Lib/site-packages/werkzeug/datastructures/__pycache__/mixins.cpython-312.pyc and b/.venv/Lib/site-packages/werkzeug/datastructures/__pycache__/mixins.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/werkzeug/datastructures/__pycache__/range.cpython-312.pyc b/.venv/Lib/site-packages/werkzeug/datastructures/__pycache__/range.cpython-312.pyc index cf6d9b3..73464fb 100644 Binary files a/.venv/Lib/site-packages/werkzeug/datastructures/__pycache__/range.cpython-312.pyc and b/.venv/Lib/site-packages/werkzeug/datastructures/__pycache__/range.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/werkzeug/datastructures/__pycache__/structures.cpython-312.pyc b/.venv/Lib/site-packages/werkzeug/datastructures/__pycache__/structures.cpython-312.pyc index d635e6d..0225800 100644 Binary files a/.venv/Lib/site-packages/werkzeug/datastructures/__pycache__/structures.cpython-312.pyc and b/.venv/Lib/site-packages/werkzeug/datastructures/__pycache__/structures.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/werkzeug/debug/__pycache__/__init__.cpython-312.pyc b/.venv/Lib/site-packages/werkzeug/debug/__pycache__/__init__.cpython-312.pyc index f6f6d5c..399d093 100644 Binary files a/.venv/Lib/site-packages/werkzeug/debug/__pycache__/__init__.cpython-312.pyc and b/.venv/Lib/site-packages/werkzeug/debug/__pycache__/__init__.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/werkzeug/debug/__pycache__/console.cpython-312.pyc b/.venv/Lib/site-packages/werkzeug/debug/__pycache__/console.cpython-312.pyc index 6723ced..0ab19de 100644 Binary files a/.venv/Lib/site-packages/werkzeug/debug/__pycache__/console.cpython-312.pyc and b/.venv/Lib/site-packages/werkzeug/debug/__pycache__/console.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/werkzeug/debug/__pycache__/repr.cpython-312.pyc b/.venv/Lib/site-packages/werkzeug/debug/__pycache__/repr.cpython-312.pyc index d7d1fbf..3d08b34 100644 Binary files a/.venv/Lib/site-packages/werkzeug/debug/__pycache__/repr.cpython-312.pyc and b/.venv/Lib/site-packages/werkzeug/debug/__pycache__/repr.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/werkzeug/debug/__pycache__/tbtools.cpython-312.pyc b/.venv/Lib/site-packages/werkzeug/debug/__pycache__/tbtools.cpython-312.pyc index b250e1b..1defd62 100644 Binary files a/.venv/Lib/site-packages/werkzeug/debug/__pycache__/tbtools.cpython-312.pyc and b/.venv/Lib/site-packages/werkzeug/debug/__pycache__/tbtools.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/werkzeug/routing/__pycache__/__init__.cpython-312.pyc b/.venv/Lib/site-packages/werkzeug/routing/__pycache__/__init__.cpython-312.pyc index b470a2d..1d39dcf 100644 Binary files a/.venv/Lib/site-packages/werkzeug/routing/__pycache__/__init__.cpython-312.pyc and b/.venv/Lib/site-packages/werkzeug/routing/__pycache__/__init__.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/werkzeug/routing/__pycache__/converters.cpython-312.pyc b/.venv/Lib/site-packages/werkzeug/routing/__pycache__/converters.cpython-312.pyc index 9cce96a..1007d05 100644 Binary files a/.venv/Lib/site-packages/werkzeug/routing/__pycache__/converters.cpython-312.pyc and b/.venv/Lib/site-packages/werkzeug/routing/__pycache__/converters.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/werkzeug/routing/__pycache__/exceptions.cpython-312.pyc b/.venv/Lib/site-packages/werkzeug/routing/__pycache__/exceptions.cpython-312.pyc index 501654e..ac5065d 100644 Binary files a/.venv/Lib/site-packages/werkzeug/routing/__pycache__/exceptions.cpython-312.pyc and b/.venv/Lib/site-packages/werkzeug/routing/__pycache__/exceptions.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/werkzeug/routing/__pycache__/map.cpython-312.pyc b/.venv/Lib/site-packages/werkzeug/routing/__pycache__/map.cpython-312.pyc index 93b18f8..fd4e13b 100644 Binary files a/.venv/Lib/site-packages/werkzeug/routing/__pycache__/map.cpython-312.pyc and b/.venv/Lib/site-packages/werkzeug/routing/__pycache__/map.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/werkzeug/routing/__pycache__/matcher.cpython-312.pyc b/.venv/Lib/site-packages/werkzeug/routing/__pycache__/matcher.cpython-312.pyc index f24b36f..cf6398a 100644 Binary files a/.venv/Lib/site-packages/werkzeug/routing/__pycache__/matcher.cpython-312.pyc and b/.venv/Lib/site-packages/werkzeug/routing/__pycache__/matcher.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/werkzeug/routing/__pycache__/rules.cpython-312.pyc b/.venv/Lib/site-packages/werkzeug/routing/__pycache__/rules.cpython-312.pyc index 26a1630..936428c 100644 Binary files a/.venv/Lib/site-packages/werkzeug/routing/__pycache__/rules.cpython-312.pyc and b/.venv/Lib/site-packages/werkzeug/routing/__pycache__/rules.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/werkzeug/sansio/__pycache__/__init__.cpython-312.pyc b/.venv/Lib/site-packages/werkzeug/sansio/__pycache__/__init__.cpython-312.pyc index 03bfc64..ce359a7 100644 Binary files a/.venv/Lib/site-packages/werkzeug/sansio/__pycache__/__init__.cpython-312.pyc and b/.venv/Lib/site-packages/werkzeug/sansio/__pycache__/__init__.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/werkzeug/sansio/__pycache__/http.cpython-312.pyc b/.venv/Lib/site-packages/werkzeug/sansio/__pycache__/http.cpython-312.pyc index 3f5da89..2fbfc2d 100644 Binary files a/.venv/Lib/site-packages/werkzeug/sansio/__pycache__/http.cpython-312.pyc and b/.venv/Lib/site-packages/werkzeug/sansio/__pycache__/http.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/werkzeug/sansio/__pycache__/multipart.cpython-312.pyc b/.venv/Lib/site-packages/werkzeug/sansio/__pycache__/multipart.cpython-312.pyc index 396d565..4ee6455 100644 Binary files a/.venv/Lib/site-packages/werkzeug/sansio/__pycache__/multipart.cpython-312.pyc and b/.venv/Lib/site-packages/werkzeug/sansio/__pycache__/multipart.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/werkzeug/sansio/__pycache__/request.cpython-312.pyc b/.venv/Lib/site-packages/werkzeug/sansio/__pycache__/request.cpython-312.pyc index 1b13968..521ef1f 100644 Binary files a/.venv/Lib/site-packages/werkzeug/sansio/__pycache__/request.cpython-312.pyc and b/.venv/Lib/site-packages/werkzeug/sansio/__pycache__/request.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/werkzeug/sansio/__pycache__/response.cpython-312.pyc b/.venv/Lib/site-packages/werkzeug/sansio/__pycache__/response.cpython-312.pyc index 3c0b53d..ccdedb6 100644 Binary files a/.venv/Lib/site-packages/werkzeug/sansio/__pycache__/response.cpython-312.pyc and b/.venv/Lib/site-packages/werkzeug/sansio/__pycache__/response.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/werkzeug/sansio/__pycache__/utils.cpython-312.pyc b/.venv/Lib/site-packages/werkzeug/sansio/__pycache__/utils.cpython-312.pyc index d9a2dc6..d35f93e 100644 Binary files a/.venv/Lib/site-packages/werkzeug/sansio/__pycache__/utils.cpython-312.pyc and b/.venv/Lib/site-packages/werkzeug/sansio/__pycache__/utils.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/werkzeug/wrappers/__pycache__/__init__.cpython-312.pyc b/.venv/Lib/site-packages/werkzeug/wrappers/__pycache__/__init__.cpython-312.pyc index 004b409..1900ceb 100644 Binary files a/.venv/Lib/site-packages/werkzeug/wrappers/__pycache__/__init__.cpython-312.pyc and b/.venv/Lib/site-packages/werkzeug/wrappers/__pycache__/__init__.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/werkzeug/wrappers/__pycache__/request.cpython-312.pyc b/.venv/Lib/site-packages/werkzeug/wrappers/__pycache__/request.cpython-312.pyc index 2c41a7e..928cb39 100644 Binary files a/.venv/Lib/site-packages/werkzeug/wrappers/__pycache__/request.cpython-312.pyc and b/.venv/Lib/site-packages/werkzeug/wrappers/__pycache__/request.cpython-312.pyc differ diff --git a/.venv/Lib/site-packages/werkzeug/wrappers/__pycache__/response.cpython-312.pyc b/.venv/Lib/site-packages/werkzeug/wrappers/__pycache__/response.cpython-312.pyc index 61b705d..a6f55b8 100644 Binary files a/.venv/Lib/site-packages/werkzeug/wrappers/__pycache__/response.cpython-312.pyc and b/.venv/Lib/site-packages/werkzeug/wrappers/__pycache__/response.cpython-312.pyc differ diff --git a/__pycache__/config.cpython-312.pyc b/__pycache__/config.cpython-312.pyc index f16b6ed..a9fe1f4 100644 Binary files a/__pycache__/config.cpython-312.pyc and b/__pycache__/config.cpython-312.pyc differ diff --git a/app.db b/app.db deleted file mode 100644 index e0ea0bf..0000000 Binary files a/app.db and /dev/null differ diff --git a/app.py b/app.py deleted file mode 100644 index 11f7d45..0000000 --- a/app.py +++ /dev/null @@ -1,4 +0,0 @@ -#rjbtesttt -from flask_prompt_master import create_app - -app = create_app() diff --git a/flask_prompt_master/docs/api_documentation.txt b/docs/api_documentation.txt similarity index 100% rename from flask_prompt_master/docs/api_documentation.txt rename to docs/api_documentation.txt diff --git a/flask_prompt_master/__init__.py b/flask_prompt_master/__init__.py deleted file mode 100644 index a158833..0000000 --- a/flask_prompt_master/__init__.py +++ /dev/null @@ -1,30 +0,0 @@ -from flask import Flask -from flask_sqlalchemy import SQLAlchemy -from flask_migrate import Migrate -from config import Config -import os -from flask_cors import CORS - -# 初始化扩展 -db = SQLAlchemy() -migrate = Migrate() - -def create_app(config_class=Config): - app = Flask(__name__, - template_folder='templates', - static_folder='../static') - - app.config.from_object(config_class) - - # 启用跨域支持 - CORS(app) - - # 初始化扩展 - db.init_app(app) - migrate.init_app(app, db) - - # 注册蓝图 - from flask_prompt_master.routes import main_bp - app.register_blueprint(main_bp) - - return app \ No newline at end of file diff --git a/flask_prompt_master/__pycache__/__init__.cpython-312.pyc b/flask_prompt_master/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index ffc5b9e..0000000 Binary files a/flask_prompt_master/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/flask_prompt_master/__pycache__/chat_routes.cpython-312.pyc b/flask_prompt_master/__pycache__/chat_routes.cpython-312.pyc deleted file mode 100644 index 00908ee..0000000 Binary files a/flask_prompt_master/__pycache__/chat_routes.cpython-312.pyc and /dev/null differ diff --git a/flask_prompt_master/__pycache__/forms.cpython-312.pyc b/flask_prompt_master/__pycache__/forms.cpython-312.pyc deleted file mode 100644 index 39d12ac..0000000 Binary files a/flask_prompt_master/__pycache__/forms.cpython-312.pyc and /dev/null differ diff --git a/flask_prompt_master/__pycache__/init_db.cpython-312.pyc b/flask_prompt_master/__pycache__/init_db.cpython-312.pyc deleted file mode 100644 index e0e7a52..0000000 Binary files a/flask_prompt_master/__pycache__/init_db.cpython-312.pyc and /dev/null differ diff --git a/flask_prompt_master/__pycache__/models.cpython-312.pyc b/flask_prompt_master/__pycache__/models.cpython-312.pyc deleted file mode 100644 index 0e52017..0000000 Binary files a/flask_prompt_master/__pycache__/models.cpython-312.pyc and /dev/null differ diff --git a/flask_prompt_master/__pycache__/routes.cpython-312.pyc b/flask_prompt_master/__pycache__/routes.cpython-312.pyc deleted file mode 100644 index d9e7b0f..0000000 Binary files a/flask_prompt_master/__pycache__/routes.cpython-312.pyc and /dev/null differ diff --git a/flask_prompt_master/app.db b/flask_prompt_master/app.db deleted file mode 100644 index c540eb2..0000000 Binary files a/flask_prompt_master/app.db and /dev/null differ diff --git a/flask_prompt_master/app.py b/flask_prompt_master/app.py deleted file mode 100644 index b05fed0..0000000 --- a/flask_prompt_master/app.py +++ /dev/null @@ -1,239 +0,0 @@ -from flask import Flask, jsonify, request -from flask_cors import CORS -from datetime import datetime - -app = Flask(__name__) -CORS(app) # 允许跨域请求 - -# 模拟数据库中的模板数据 -MOCK_TEMPLATES = [ - { - "id": "1", - "name": "后端开发工程师", - "description": "专业的后端开发工程师模板", - "category": "软件开发", - "industry": "互联网", - "profession": "开发工程师", - "sub_category": "后端开发", - "system_prompt": "你是一位专业的后端开发工程师..." - }, - { - "id": "2", - "name": "前端开发工程师", - "description": "专业的前端开发工程师模板", - "category": "软件开发", - "industry": "互联网", - "profession": "开发工程师", - "sub_category": "前端开发", - "system_prompt": "你是一位专业的前端开发工程师..." - } -] - -# 身份验证装饰器 -def require_auth(f): - from functools import wraps - @wraps(f) - def decorated(*args, **kwargs): - auth_header = request.headers.get('Authorization') - if not auth_header or not auth_header.startswith('Bearer '): - return jsonify({'error': 'No authorization token provided'}), 401 - # 这里简单验证token,实际应该更严格 - token = auth_header.split(' ')[1] - if token != 'test_token_123': - return jsonify({'error': 'Invalid token'}), 401 - return f(*args, **kwargs) - return decorated - -# 获取模板列表接口 -@app.route('/api/v1/templates', methods=['GET']) -@require_auth -def get_templates(): - # 获取查询参数 - page = int(request.args.get('page', 1)) - size = int(request.args.get('size', 10)) - category = request.args.get('category') - industry = request.args.get('industry') - profession = request.args.get('profession') - - # 过滤模板 - filtered_templates = MOCK_TEMPLATES - if category: - filtered_templates = [t for t in filtered_templates if t['category'] == category] - if industry: - filtered_templates = [t for t in filtered_templates if t['industry'] == industry] - if profession: - filtered_templates = [t for t in filtered_templates if t['profession'] == profession] - - # 计算分页 - start = (page - 1) * size - end = start + size - paginated_templates = filtered_templates[start:end] - - return jsonify({ - 'code': 200, - 'data': { - 'total': len(filtered_templates), - 'pages': (len(filtered_templates) + size - 1) // size, - 'current_page': page, - 'templates': paginated_templates - } - }) - -# 获取单个模板接口 -@app.route('/api/v1/templates/', methods=['GET']) -@require_auth -def get_template(template_id): - template = next((t for t in MOCK_TEMPLATES if t['id'] == template_id), None) - if not template: - return jsonify({'error': 'Template not found'}), 404 - - return jsonify({ - 'code': 200, - 'data': template - }) - -# 创建模板接口 -@app.route('/api/v1/templates', methods=['POST']) -@require_auth -def create_template(): - data = request.get_json() - - # 验证必要字段 - required_fields = ['name', 'description', 'category', 'industry', 'profession'] - for field in required_fields: - if field not in data: - return jsonify({'error': f'Missing required field: {field}'}), 400 - - # 创建新模板 - new_template = { - 'id': str(len(MOCK_TEMPLATES) + 1), - **data, - 'created_at': datetime.now().isoformat() - } - MOCK_TEMPLATES.append(new_template) - - return jsonify({ - 'code': 200, - 'data': { - 'id': new_template['id'], - 'message': 'Template created successfully' - } - }) - -# 更新模板接口 -@app.route('/api/v1/templates/', methods=['PUT']) -@require_auth -def update_template(template_id): - template = next((t for t in MOCK_TEMPLATES if t['id'] == template_id), None) - if not template: - return jsonify({'error': 'Template not found'}), 404 - - data = request.get_json() - template.update(data) - - return jsonify({ - 'code': 200, - 'data': { - 'message': 'Template updated successfully' - } - }) - -# 删除模板接口 -@app.route('/api/v1/templates/', methods=['DELETE']) -@require_auth -def delete_template(template_id): - template_index = next((i for i, t in enumerate(MOCK_TEMPLATES) if t['id'] == template_id), None) - if template_index is None: - return jsonify({'error': 'Template not found'}), 404 - - MOCK_TEMPLATES.pop(template_index) - - return jsonify({ - 'code': 200, - 'data': { - 'message': 'Template deleted successfully' - } - }) - -# 模糊搜索提示词模板接口 -@app.route('/api/v1/templates/search', methods=['GET']) -@require_auth -def search_templates(): - """模糊搜索提示词模板""" - # 获取搜索参数 - keyword = request.args.get('keyword', '').strip() - page = int(request.args.get('page', 1)) - size = int(request.args.get('size', 10)) - - # 如果没有关键词,返回空结果 - if not keyword: - return jsonify({ - 'code': 200, - 'data': { - 'total': 0, - 'pages': 0, - 'current_page': page, - 'templates': [] - } - }) - - # 执行模糊搜索 - # 搜索范围:名称、描述、分类、行业、职业、子分类、系统提示词 - search_results = [] - for template in MOCK_TEMPLATES: - # 在各个字段中搜索关键词 - if any(keyword.lower() in str(value).lower() for value in [ - template.get('name', ''), - template.get('description', ''), - template.get('category', ''), - template.get('industry', ''), - template.get('profession', ''), - template.get('sub_category', ''), - template.get('system_prompt', '') - ]): - # 添加匹配度信息 - match_score = sum( - str(value).lower().count(keyword.lower()) - for value in [ - template.get('name', ''), - template.get('description', ''), - template.get('category', ''), - template.get('industry', ''), - template.get('profession', ''), - template.get('sub_category', ''), - template.get('system_prompt', '') - ] - ) - search_results.append({ - **template, - '_match_score': match_score - }) - - # 按匹配度排序 - search_results.sort(key=lambda x: x['_match_score'], reverse=True) - - # 移除匹配度信息 - search_results = [{k: v for k, v in t.items() if k != '_match_score'} - for t in search_results] - - # 计算分页 - total = len(search_results) - total_pages = (total + size - 1) // size - start = (page - 1) * size - end = start + size - paginated_results = search_results[start:end] - - # 返回结果 - return jsonify({ - 'code': 200, - 'data': { - 'total': total, - 'pages': total_pages, - 'current_page': page, - 'keyword': keyword, - 'templates': paginated_results - } - }) - -if __name__ == '__main__': - app.run(debug=True, port=5000) \ No newline at end of file diff --git a/flask_prompt_master/forms.py b/flask_prompt_master/forms.py deleted file mode 100644 index f6b5f68..0000000 --- a/flask_prompt_master/forms.py +++ /dev/null @@ -1,12 +0,0 @@ -from flask_wtf import FlaskForm -from wtforms import TextAreaField, SubmitField, IntegerField -from wtforms.validators import DataRequired, Length, NumberRange - -class PromptForm(FlaskForm): - input_text = TextAreaField('输入文本', validators=[DataRequired(), Length(min=1, max=1000)]) - submit = SubmitField('生成提示词') - -class FeedbackForm(FlaskForm): - rating = IntegerField('评分', validators=[DataRequired(), NumberRange(min=1, max=5)]) - comment = TextAreaField('评论') - submit = SubmitField('提交反馈') \ No newline at end of file diff --git a/flask_prompt_master/models.py b/flask_prompt_master/models.py deleted file mode 100644 index a5195d8..0000000 --- a/flask_prompt_master/models.py +++ /dev/null @@ -1,89 +0,0 @@ -from flask_prompt_master import db -from datetime import datetime - -class User(db.Model): - __tablename__ = 'user' - - uid = db.Column(db.Integer, primary_key=True) - nickname = db.Column(db.String(100), nullable=False) - mobile = db.Column(db.String(20), nullable=True) - email = db.Column(db.String(100), nullable=True) - sex = db.Column(db.Integer, nullable=False, default=0) - avatar = db.Column(db.String(64), nullable=True) - login_name = db.Column(db.String(20), nullable=False, unique=True) - login_pwd = db.Column(db.String(32), nullable=False) - login_salt = db.Column(db.String(32), nullable=False) - status = db.Column(db.Integer, nullable=False, default=1) - openid = db.Column(db.String(64), unique=True) - session_key = db.Column(db.String(64)) - unionid = db.Column(db.String(64), unique=True) - wx_nickname = db.Column(db.String(100)) - wx_avatar = db.Column(db.String(255)) - updated_time = db.Column(db.DateTime, default=datetime.utcnow) - created_time = db.Column(db.DateTime, default=datetime.utcnow) - - prompts = db.relationship('Prompt', backref='author', lazy='dynamic') - feedbacks = db.relationship('Feedback', backref='author', lazy='dynamic') - -class WxUser(db.Model): - """微信小程序用户表""" - __tablename__ = 'wx_user' - - id = db.Column(db.Integer, primary_key=True) - openid = db.Column(db.String(64), unique=True, nullable=False) - session_key = db.Column(db.String(64)) - unionid = db.Column(db.String(64), unique=True) - nickname = db.Column(db.String(100)) - avatar_url = db.Column(db.String(255)) - gender = db.Column(db.Integer, default=0) # 0:未知, 1:男, 2:女 - country = db.Column(db.String(50)) - province = db.Column(db.String(50)) - city = db.Column(db.String(50)) - language = db.Column(db.String(20)) - phone = db.Column(db.String(20)) - is_active = db.Column(db.Boolean, default=True) - last_login = db.Column(db.DateTime, default=datetime.utcnow) - created_at = db.Column(db.DateTime, default=datetime.utcnow) - updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) - - # 关联到提示词和反馈 - prompts = db.relationship('Prompt', backref='wx_user', lazy='dynamic', - foreign_keys='Prompt.wx_user_id') - feedbacks = db.relationship('Feedback', backref='wx_user', lazy='dynamic', - foreign_keys='Feedback.wx_user_id') - -class Prompt(db.Model): - __tablename__ = 'prompt' - - id = db.Column(db.Integer, primary_key=True) - input_text = db.Column(db.Text, nullable=False) - generated_text = db.Column(db.Text, nullable=False) - created_at = db.Column(db.DateTime, default=datetime.utcnow) - user_id = db.Column(db.Integer, db.ForeignKey('user.uid')) # 修改为可空 - wx_user_id = db.Column(db.Integer, db.ForeignKey('wx_user.id')) # 添加微信用户ID - feedbacks = db.relationship('Feedback', backref='prompt', lazy='dynamic') - -class Feedback(db.Model): - __tablename__ = 'feedback' - - id = db.Column(db.Integer, primary_key=True) - rating = db.Column(db.Integer, nullable=False) - comment = db.Column(db.Text) - created_at = db.Column(db.DateTime, default=datetime.utcnow) - user_id = db.Column(db.Integer, db.ForeignKey('user.uid')) # 修改为可空 - wx_user_id = db.Column(db.Integer, db.ForeignKey('wx_user.id')) # 添加微信用户ID - prompt_id = db.Column(db.Integer, db.ForeignKey('prompt.id'), nullable=False) - -class PromptTemplate(db.Model): - __tablename__ = 'prompt_template' - - id = db.Column(db.Integer, primary_key=True) - name = db.Column(db.String(100), nullable=False) - description = db.Column(db.Text) - category = db.Column(db.String(50)) - industry = db.Column(db.String(50)) - profession = db.Column(db.String(50)) - sub_category = db.Column(db.String(50)) - system_prompt = db.Column(db.Text, nullable=False) - is_default = db.Column(db.Boolean, default=False) - created_at = db.Column(db.DateTime, default=datetime.utcnow) \ No newline at end of file diff --git a/flask_prompt_master/routes.py b/flask_prompt_master/routes.py deleted file mode 100644 index 1d205fd..0000000 --- a/flask_prompt_master/routes.py +++ /dev/null @@ -1,1177 +0,0 @@ -from flask import Blueprint, render_template, request, redirect, url_for, flash, jsonify, current_app -from openai import OpenAI -from flask_prompt_master import db -from flask_prompt_master.models import User, Prompt, Feedback, PromptTemplate, WxUser -from flask_prompt_master.forms import PromptForm, FeedbackForm -from config import Config -import pymysql -from datetime import datetime -import requests -import hashlib -import time -import json - -main_bp = Blueprint('main', __name__) - -client = OpenAI(api_key=Config.LLM_API_KEY, base_url=Config.LLM_API_URL) - -# 从配置中获取微信小程序配置 -WX_APPID = Config.WX_APPID -WX_SECRET = Config.WX_SECRET - -def get_system_prompt(template_id=None): - """获取系统提示词模板""" - if template_id: - template = PromptTemplate.query.get(template_id) - if template: - return template.system_prompt - - # 如果没有指定模板ID或模板不存在,返回默认模板 - default_template = PromptTemplate.query.filter_by(is_default=True).first() - if default_template: - return default_template.system_prompt - - # 如果数据库中没有模板,返回硬编码的默认模板 - return """你是一个专业的提示词工程师,擅长将普通的描述转换为结构化、专业的 Prompt。 - -你需要: -1. 分析用户的需求和意图 -2. 将其转换为清晰、详细的提示词 -3. 添加必要的上下文和约束条件 -4. 使用专业的术语和格式 -5. 确保生成的提示词能够获得最佳的 AI 响应 - -请直接返回优化后的提示词,不要添加任何解释或其他内容。""" - -def generate_with_llm(input_text, template_id=None): - """调用大模型API生成提示词""" - try: - system_prompt = get_system_prompt(template_id) - - # 打印参数 - print("\n=== API 调用参数 ===") - print(f"模板ID: {template_id}") - print(f"输入文本: {input_text}") - print(f"系统提示: {system_prompt}") - print("==================\n") - - response = client.chat.completions.create( - model="deepseek-chat", - messages=[ - {"role": "system", "content": system_prompt}, - {"role": "user", "content": input_text} - ], - temperature=0.7, - max_tokens=500 - ) - - # 打印响应 - generated_text = response.choices[0].message.content.strip() - print("\n=== API 响应结果 ===") - print(f"生成的提示词: {generated_text}") - print("==================\n") - - return generated_text - except Exception as e: - current_app.logger.error(f'LLM API调用失败: {str(e)}') - return "提示词生成失败,请稍后重试" - -def get_template_icon(category): - """根据分类返回对应的Font Awesome图标类名""" - icons = { - '通用工具': 'fa-magic', - '内容创作': 'fa-pen-fancy', - '设计创意': 'fa-palette', - '技术研发': 'fa-code', - '商业营销': 'fa-chart-line', - '专业服务': 'fa-briefcase', - '教育培训': 'fa-graduation-cap', - '智慧城市': 'fa-city', - '工业制造': 'fa-industry', - '生活服务': 'fa-concierge-bell' - } - return icons.get(category, 'fa-star') # 默认返回星星图标 - -@main_bp.route('/', methods=['GET', 'POST']) -def index(): - form = PromptForm() - templates = PromptTemplate.query.all() - - # 获取所有可用的分类选项 - industries = sorted(set(t.industry for t in templates if t.industry)) - professions = sorted(set(t.profession for t in templates if t.profession)) - categories = sorted(set(t.category for t in templates if t.category)) - sub_categories = sorted(set(t.sub_category for t in templates if t.sub_category)) - - if form.validate_on_submit(): - template_id = request.form.get('template_id') - generated_text = generate_with_llm(form.input_text.data, template_id) - - # 获取默认用户的 uid - try: - conn = pymysql.connect( - host='localhost', - user='root', - password='123456', - database='food_db', - charset='utf8mb4' - ) - cursor = conn.cursor() - cursor.execute("SELECT uid FROM user WHERE login_name = 'admin' LIMIT 1") - result = cursor.fetchone() - if result: - user_id = result[0] - else: - user_id = 1 # 如果没有找到用户,使用默认值 - cursor.close() - conn.close() - except Exception as e: - print(f"获取用户ID失败: {str(e)}") - user_id = 1 # 如果查询失败,使用默认值 - - prompt = Prompt( - input_text=form.input_text.data, - generated_text=generated_text, - user_id=user_id # 使用查询到的用户ID - ) - db.session.add(prompt) - db.session.commit() - return render_template('generate.html', form=form, prompt=prompt, templates=templates, - get_template_icon=get_template_icon, industries=industries, - professions=professions, categories=categories, - sub_categories=sub_categories) - return render_template('generate.html', form=form, prompt=None, templates=templates, - get_template_icon=get_template_icon, industries=industries, - professions=professions, categories=categories, - sub_categories=sub_categories) - -@main_bp.route('/prompt/') -def show_prompt(prompt_id): - prompt = Prompt.query.get_or_404(prompt_id) - return render_template('prompt.html', prompt=prompt) - -@main_bp.route('/feedback/', methods=['GET', 'POST']) -def submit_feedback(prompt_id): - prompt = Prompt.query.get_or_404(prompt_id) - form = FeedbackForm() - if form.validate_on_submit(): - feedback = Feedback( - rating=form.rating.data, - comment=form.comment.data, - user_id=1, # 临时用户ID - prompt_id=prompt.id - ) - db.session.add(feedback) - db.session.commit() - flash('感谢您的反馈!') - return redirect(url_for('main.show_prompt', prompt_id=prompt.id)) - return render_template('feedback.html', form=form, prompt=prompt) - -# 添加一个API端点来获取模板详情 -@main_bp.route('/api/template/') -def get_template_details(template_id): - template = PromptTemplate.query.get_or_404(template_id) - return jsonify({ - 'id': template.id, - 'name': template.name, - 'description': template.description, - 'system_prompt': template.system_prompt - }) - -# 添加删除模板的API路由 -@main_bp.route('/api/templates/', methods=['DELETE']) -def delete_template(template_id): - try: - # 查找模板 - template = PromptTemplate.query.get_or_404(template_id) - - # 检查是否是默认模板 - if template.is_default: - return jsonify({ - 'success': False, - 'message': '默认模板不能删除' - }), 403 - - # 检查权限(可选:如果需要检查用户是否有权限删除) - # if template.user_id != current_user.id: - # return jsonify({ - # 'success': False, - # 'message': '没有权限删除此模板' - # }), 403 - - # 删除模板 - db.session.delete(template) - db.session.commit() - - return jsonify({ - 'success': True, - 'message': '模板删除成功' - }) - - except Exception as e: - # 回滚事务 - db.session.rollback() - # 记录错误 - current_app.logger.error(f'删除模板失败: {str(e)}') - return jsonify({ - 'success': False, - 'message': '删除模板失败,请稍后重试' - }), 500 - -# 添加微信小程序API路由 -@main_bp.route('/api/wx/generate', methods=['POST']) -def wx_generate_prompt(): - """微信小程序生成提示词接口""" - try: - data = request.get_json() - if not data or 'input_text' not in data or 'uid' not in data: - return jsonify({ - 'code': 400, - 'message': '缺少必要参数', - 'data': None - }) - - input_text = data.get('input_text') - template_id = data.get('template_id') - wx_user_id = data.get('uid') # 使用uid - - # 调用大模型生成提示词 - generated_text = generate_with_llm(input_text, template_id) - - # 保存到数据库 - prompt = Prompt( - input_text=input_text, - generated_text=generated_text, - wx_user_id=wx_user_id, # 使用wx_user_id - created_at=datetime.utcnow() - ) - db.session.add(prompt) - db.session.commit() - - return jsonify({ - 'code': 200, - 'message': 'success', - 'data': { - 'prompt_id': prompt.id, - 'input_text': prompt.input_text, - 'generated_text': prompt.generated_text, - 'created_at': prompt.created_at.strftime('%Y-%m-%d %H:%M:%S') - } - }) - - except Exception as e: - current_app.logger.error(f"生成提示词失败: {str(e)}") - return jsonify({ - 'code': 500, - 'message': str(e), - 'data': None - }) - -@main_bp.route('/api/wx/templates', methods=['GET']) -def wx_get_templates(): - """获取提示词模板列表""" - try: - # 获取筛选参数 - industry = request.args.get('industry') - profession = request.args.get('profession') - category = request.args.get('category') - sub_category = request.args.get('sub_category') - - # 构建查询 - query = PromptTemplate.query - - if industry: - query = query.filter_by(industry=industry) - if profession: - query = query.filter_by(profession=profession) - if category: - query = query.filter_by(category=category) - if sub_category: - query = query.filter_by(sub_category=sub_category) - - templates = query.all() - - # 返回模板列表 - return jsonify({ - 'code': 200, - 'message': 'success', - 'data': [{ - 'id': t.id, - 'name': t.name, - 'description': t.description, - 'category': t.category, - 'industry': t.industry, - 'profession': t.profession, - 'sub_category': t.sub_category, - 'is_default': t.is_default - } for t in templates] - }) - - except Exception as e: - current_app.logger.error(f"获取模板列表失败: {str(e)}") - return jsonify({ - 'code': 500, - 'message': str(e), - 'data': None - }) - -@main_bp.route('/api/wx/template/', methods=['GET']) -def wx_get_template_detail(template_id): - """获取模板详情""" - try: - template = PromptTemplate.query.get_or_404(template_id) - - return jsonify({ - 'code': 200, - 'message': 'success', - 'data': { - 'id': template.id, - 'name': template.name, - 'description': template.description, - 'category': template.category, - 'industry': template.industry, - 'profession': template.profession, - 'sub_category': template.sub_category, - 'system_prompt': template.system_prompt, - 'is_default': template.is_default - } - }) - - except Exception as e: - current_app.logger.error(f"获取模板详情失败: {str(e)}") - return jsonify({ - 'code': 500, - 'message': str(e), - 'data': None - }) - -@main_bp.route('/api/wx/login', methods=['POST']) -def wx_login(): - """微信小程序登录接口""" - try: - # 添加调试日志 - print("\n=== 微信登录配置 ===") - print(f"APPID: {WX_APPID}") - print(f"SECRET: {WX_SECRET}") - print("==================\n") - - data = request.get_json() - if not data or 'code' not in data: - return jsonify({ - 'code': 400, - 'message': '缺少code参数', - 'data': None - }) - - code = data.get('code') - print(f"收到的code: {code}") - - # 请求微信接口 - wx_url = 'https://api.weixin.qq.com/sns/jscode2session' - params = { - 'appid': WX_APPID, - 'secret': WX_SECRET, - 'js_code': code, - 'grant_type': 'authorization_code' - } - - response = requests.get(wx_url, params=params) - wx_data = response.json() - print(f"微信返回数据: {wx_data}") - - if 'errcode' in wx_data: - return jsonify({ - 'code': 500, - 'message': f"微信登录失败:{wx_data.get('errmsg')}", - 'data': None - }) - - openid = wx_data.get('openid') - session_key = wx_data.get('session_key') - - # 查找或创建微信用户 - wx_user = WxUser.query.filter_by(openid=openid).first() - if not wx_user: - wx_user = WxUser( - openid=openid, - session_key=session_key - ) - db.session.add(wx_user) - db.session.commit() - else: - wx_user.session_key = session_key - wx_user.last_login = datetime.utcnow() - db.session.commit() - - # 生成登录态token - token = hashlib.md5(f'{openid}{int(time.time())}'.encode()).hexdigest() - - return jsonify({ - 'code': 200, - 'message': 'success', - 'data': { - 'token': token, - 'openid': openid, - 'uid': wx_user.id, - 'user_info': { - 'id': wx_user.id, - 'nickname': wx_user.nickname, - 'avatar_url': wx_user.avatar_url, - 'gender': wx_user.gender, - 'phone': wx_user.phone - } - } - }) - - except Exception as e: - current_app.logger.error(f"微信登录失败: {str(e)}") - return jsonify({ - 'code': 500, - 'message': str(e), - 'data': None - }) - -@main_bp.route('/api/wx/update_userinfo', methods=['POST']) -def wx_update_userinfo(): - """更新微信用户信息""" - try: - data = request.get_json() - if not data or 'openid' not in data: - return jsonify({ - 'code': 400, - 'message': '缺少必要参数', - 'data': None - }) - - openid = data.get('openid') - wx_user = WxUser.query.filter_by(openid=openid).first() - - if not wx_user: - return jsonify({ - 'code': 404, - 'message': '用户不存在', - 'data': None - }) - - # 更新用户信息 - if 'nickName' in data: - wx_user.nickname = data['nickName'] - if 'avatarUrl' in data: - wx_user.avatar_url = data['avatarUrl'] - if 'gender' in data: - wx_user.gender = data['gender'] - if 'country' in data: - wx_user.country = data['country'] - if 'province' in data: - wx_user.province = data['province'] - if 'city' in data: - wx_user.city = data['city'] - if 'language' in data: - wx_user.language = data['language'] - - wx_user.updated_at = datetime.utcnow() - db.session.commit() - - return jsonify({ - 'code': 200, - 'message': 'success', - 'data': { - 'id': wx_user.id, - 'nickname': wx_user.nickname, - 'avatar_url': wx_user.avatar_url, - 'gender': wx_user.gender, - 'country': wx_user.country, - 'province': wx_user.province, - 'city': wx_user.city, - 'language': wx_user.language, - 'phone': wx_user.phone - } - }) - - except Exception as e: - current_app.logger.error(f"更新用户信息失败: {str(e)}") - return jsonify({ - 'code': 500, - 'message': str(e), - 'data': None - }) - -@main_bp.route('/api/wx/prompts', methods=['GET']) -def wx_get_prompts(): - """获取用户的提示词历史记录""" - try: - # 获取参数 - uid = request.args.get('uid') - page = request.args.get('page', 1, type=int) - per_page = request.args.get('per_page', 10, type=int) - - if not uid: - return jsonify({ - 'code': 400, - 'message': '缺少用户ID', - 'data': None - }) - - # 查询该用户的所有提示词记录 - query = Prompt.query.filter_by(wx_user_id=uid)\ - .order_by(Prompt.created_at.desc()) - - # 分页 - pagination = query.paginate(page=page, per_page=per_page, error_out=False) - prompts = pagination.items - - # 返回数据 - return jsonify({ - 'code': 200, - 'message': 'success', - 'data': { - 'prompts': [{ - 'id': p.id, - 'input_text': p.input_text, - 'generated_text': p.generated_text, - 'created_at': p.created_at.strftime('%Y-%m-%d %H:%M:%S') - } for p in prompts], - 'pagination': { - 'total': pagination.total, # 总记录数 - 'pages': pagination.pages, # 总页数 - 'current_page': page, # 当前页 - 'per_page': per_page, # 每页记录数 - 'has_next': pagination.has_next, # 是否有下一页 - 'has_prev': pagination.has_prev # 是否有上一页 - } - } - }) - - except Exception as e: - current_app.logger.error(f"获取提示词历史失败: {str(e)}") - return jsonify({ - 'code': 500, - 'message': str(e), - 'data': None - }) - -@main_bp.route('/api/wx/prompt/', methods=['GET']) -def wx_get_prompt_detail(prompt_id): - """获取提示词详情""" - try: - prompt = Prompt.query.get_or_404(prompt_id) - - # 可以选择性地验证用户身份 - # uid = request.args.get('uid') - # if str(prompt.wx_user_id) != str(uid): - # return jsonify({ - # 'code': 403, - # 'message': '无权访问此记录', - # 'data': None - # }) - - return jsonify({ - 'code': 200, - 'message': 'success', - 'data': { - 'id': prompt.id, - 'input_text': prompt.input_text, - 'generated_text': prompt.generated_text, - 'created_at': prompt.created_at.strftime('%Y-%m-%d %H:%M:%S'), - 'feedbacks': [{ - 'id': f.id, - 'rating': f.rating, - 'comment': f.comment, - 'created_at': f.created_at.strftime('%Y-%m-%d %H:%M:%S') - } for f in prompt.feedbacks] - } - }) - - except Exception as e: - current_app.logger.error(f"获取提示词详情失败: {str(e)}") - return jsonify({ - 'code': 500, - 'message': str(e), - 'data': None - }) - -@main_bp.route('/api/wx/prompts/count', methods=['GET']) -def wx_get_prompts_count(): - """获取用户的提示词历史记录数量""" - try: - # 获取用户ID - uid = request.args.get('uid') - - if not uid: - return jsonify({ - 'code': 400, - 'message': '缺少用户ID', - 'data': None - }) - - # 查询该用户的提示词记录数量 - count = Prompt.query.filter_by(wx_user_id=uid).count() - - # 获取今日记录数量 - today = datetime.now().date() - today_count = Prompt.query.filter_by(wx_user_id=uid)\ - .filter(db.func.date(Prompt.created_at) == today)\ - .count() - - # 获取本月记录数量 - this_month = today.replace(day=1) - month_count = Prompt.query.filter_by(wx_user_id=uid)\ - .filter(db.func.date(Prompt.created_at) >= this_month)\ - .count() - - return jsonify({ - 'code': 200, - 'message': 'success', - 'data': { - 'total_count': count, # 总记录数 - 'today_count': today_count, # 今日记录数 - 'month_count': month_count, # 本月记录数 - 'uid': uid - } - }) - - except Exception as e: - current_app.logger.error(f"获取提示词历史数量失败: {str(e)}") - return jsonify({ - 'code': 500, - 'message': str(e), - 'data': None - }) - -@main_bp.route('/api/wx/prompt/', methods=['DELETE']) -def wx_delete_prompt(prompt_id): - """删除提示词记录""" - try: - # 从 URL 参数或请求体中获取用户ID - uid = request.args.get('uid') or request.get_json().get('uid') - if not uid: - return jsonify({ - 'code': 400, - 'message': '缺少用户ID', - 'data': None - }) - - # 查找记录 - prompt = Prompt.query.get_or_404(prompt_id) - - # 验证是否是用户自己的记录 - if str(prompt.wx_user_id) != str(uid): - return jsonify({ - 'code': 403, - 'message': '无权删除此记录', - 'data': None - }) - - # 删除相关的反馈 - Feedback.query.filter_by(prompt_id=prompt_id).delete() - - # 删除提示词记录 - db.session.delete(prompt) - db.session.commit() - - return jsonify({ - 'code': 200, - 'message': '删除成功', - 'data': { - 'id': prompt_id - } - }) - - except Exception as e: - current_app.logger.error(f"删除提示词记录失败: {str(e)}") - db.session.rollback() - return jsonify({ - 'code': 500, - 'message': str(e), - 'data': None - }) - -@main_bp.route('/api/wx/prompts/search', methods=['GET']) -def wx_search_prompts(): - """搜索提示词接口""" - try: - # 获取参数 - uid = request.args.get('uid') - keyword = request.args.get('keyword', '').strip() - page = request.args.get('page', 1, type=int) - per_page = request.args.get('per_page', 10, type=int) - - if not uid: - return jsonify({ - 'code': 400, - 'message': '缺少用户ID', - 'data': None - }) - - # 构建查询 - query = Prompt.query.filter_by(wx_user_id=uid) - - # 如果有关键词,添加搜索条件 - if keyword: - search_condition = ( - Prompt.input_text.ilike(f'%{keyword}%') | # 搜索输入文本 - Prompt.generated_text.ilike(f'%{keyword}%') # 搜索生成的提示词 - ) - query = query.filter(search_condition) - - # 按时间倒序排序并分页 - query = query.order_by(Prompt.created_at.desc()) - pagination = query.paginate(page=page, per_page=per_page, error_out=False) - prompts = pagination.items - - return jsonify({ - 'code': 200, - 'message': 'success', - 'data': { - 'prompts': [{ - 'id': p.id, - 'input_text': p.input_text, - 'generated_text': p.generated_text, - 'created_at': p.created_at.strftime('%Y-%m-%d %H:%M:%S') - } for p in prompts], - 'pagination': { - 'total': pagination.total, - 'pages': pagination.pages, - 'current_page': page, - 'per_page': per_page, - 'has_next': pagination.has_next, - 'has_prev': pagination.has_prev - } - } - }) - - except Exception as e: - current_app.logger.error(f"搜索提示词失败: {str(e)}") - return jsonify({ - 'code': 500, - 'message': str(e), - 'data': None - }) - -@main_bp.route('/api/wx/templates/search', methods=['GET']) -def wx_search_templates(): - """搜索提示词模板接口""" - try: - # 获取搜索参数 - keyword = request.args.get('keyword', '').strip() - page = request.args.get('page', 1, type=int) - per_page = request.args.get('per_page', 10, type=int) - - # 构建基础查询 - query = PromptTemplate.query - - # 添加搜索条件 - if keyword: - search_condition = ( - PromptTemplate.name.ilike(f'%{keyword}%') | # 搜索模板名称 - PromptTemplate.description.ilike(f'%{keyword}%') | # 搜索模板描述 - PromptTemplate.category.ilike(f'%{keyword}%') | # 搜索分类 - PromptTemplate.industry.ilike(f'%{keyword}%') | # 搜索行业 - PromptTemplate.profession.ilike(f'%{keyword}%') | # 搜索职业 - PromptTemplate.system_prompt.ilike(f'%{keyword}%') # 搜索系统提示词 - ) - query = query.filter(search_condition) - - # 获取筛选参数(可选) - industry = request.args.get('industry') - profession = request.args.get('profession') - category = request.args.get('category') - - # 添加筛选条件 - if industry: - query = query.filter_by(industry=industry) - if profession: - query = query.filter_by(profession=profession) - if category: - query = query.filter_by(category=category) - - # 按是否默认模板和创建时间排序 - query = query.order_by(PromptTemplate.is_default.desc(), - PromptTemplate.created_at.desc()) - - # 分页 - pagination = query.paginate(page=page, per_page=per_page, error_out=False) - templates = pagination.items - - return jsonify({ - 'code': 200, - 'message': 'success', - 'data': { - 'templates': [{ - 'id': t.id, - 'name': t.name, - 'description': t.description, - 'system_prompt': t.system_prompt, # 添加system_prompt字段 - 'category': t.category, - 'industry': t.industry, - 'profession': t.profession, - 'sub_category': t.sub_category, - 'is_default': t.is_default, - 'created_at': t.created_at.strftime('%Y-%m-%d %H:%M:%S') if t.created_at else None - } for t in templates], - 'pagination': { - 'total': pagination.total, - 'pages': pagination.pages, - 'current_page': page, - 'per_page': per_page, - 'has_next': pagination.has_next, - 'has_prev': pagination.has_prev - } - } - }) - - except Exception as e: - current_app.logger.error(f"搜索模板失败: {str(e)}") - return jsonify({ - 'code': 500, - 'message': str(e), - 'data': None - }) - -@main_bp.route('/api/wx/templates/intent', methods=['POST']) -def wx_get_template_by_intent(): - """根据意图获取提示词模板""" - try: - # 获取参数 - data = request.get_json() - user_input = data.get('input_text', '').strip() - - # 意图识别系统提示词 - intent_system_prompt = """你是一位出色的意图识别专家。请分析用户输入的意图,并仅返回以下类别之一: -- 新闻获取 -- 生成图片 -- 网站开发 -- 文案创作 -- 代码开发 -- 数据分析 -- 市场营销 -- 产品设计 -- 其它 - -只返回分类名称,不要其他任何内容。""" - - # 调用意图识别 - response = client.chat.completions.create( - model="deepseek-chat", - messages=[ - {"role": "system", "content": intent_system_prompt}, - {"role": "user", "content": user_input} - ], - temperature=0.1 - ) - - intent = response.choices[0].message.content.strip() - - # 根据意图获取对应的模板提示词 - intent_prompts = { - "新闻获取": "你是一位专业的新闻编辑,擅长整理和总结新闻信息。请帮助用户获取和理解新闻内容,注意:\n1. 确保信息的准确性和时效性\n2. 提供客观中立的视角\n3. 突出重要信息要点\n4. 适当添加背景信息解释", - - "生成图片": "你是一位专业的图像生成提示词专家,擅长将文字需求转化为详细的图像生成提示词。请注意:\n1. 详细描述图像的视觉元素\n2. 指定图像的风格和氛围\n3. 添加技术参数说明\n4. 包含构图和视角建议", - - "网站开发": "你是一位专业的网站开发专家,擅长将需求转化为具体的开发方案。请注意:\n1. 明确网站的目标用户和核心功能\n2. 建议合适的技术栈\n3. 考虑性能和安全性要求\n4. 提供响应式设计建议", - - "文案创作": "你是一位专业的文案创作专家,擅长创作各类营销和品牌文案。请注意:\n1. 确定目标受众和传播渠道\n2. 突出产品/服务的核心价值\n3. 使用适当的语言风格\n4. 注意文案的节奏和结构", - - "代码开发": "你是一位专业的软件开发工程师,擅长编写高质量的代码。请注意:\n1. 遵循编码规范和最佳实践\n2. 考虑代码的可维护性和扩展性\n3. 注重性能优化\n4. 添加适当的注释和文档", - - "数据分析": "你是一位专业的数据分析师,擅长数据处理和分析。请注意:\n1. 明确分析目标和范围\n2. 选择合适的分析方法\n3. 关注数据质量和准确性\n4. 提供可操作的洞察建议", - - "市场营销": "你是一位专业的市场营销专家,擅长制定营销策略。请注意:\n1. 分析目标市场和竞争环境\n2. 制定明确的营销目标\n3. 选择合适的营销渠道\n4. 设计有效的营销活动", - - "产品设计": "你是一位专业的产品设计师,擅长用户体验和界面设计。请注意:\n1. 理解用户需求和痛点\n2. 遵循设计原则和规范\n3. 注重交互体验\n4. 考虑可实现性", - - "其它": "你是一位专业的AI助手,擅长理解和解决各类问题。请注意:\n1. 仔细理解用户需求\n2. 提供清晰的解决方案\n3. 使用专业的语言表达\n4. 确保回答的实用性" - } - - template_prompt = intent_prompts.get(intent, intent_prompts["其它"]) - - return jsonify({ - 'code': 200, - 'message': 'success', - 'data': { - 'intent': intent, - 'template_prompt': template_prompt - } - }) - - except Exception as e: - current_app.logger.error(f"获取意图模板失败: {str(e)}") - return jsonify({ - 'code': 500, - 'message': str(e), - 'data': None - }) - -@main_bp.route('/api/wx/generate/expert', methods=['POST']) -def wx_generate_expert_prompt(): - """两阶段专家提示词生成系统""" - try: - # 检查请求数据 - if not request.is_json: - return jsonify({ - 'code': 400, - 'message': '请求必须是JSON格式', - 'data': None - }) - - data = request.get_json() - if not data: - return jsonify({ - 'code': 400, - 'message': '请求数据为空', - 'data': None - }) - - # 验证必要参数 - user_input = data.get('input_text') - uid = data.get('uid') - - if not user_input or not uid: - return jsonify({ - 'code': 400, - 'message': '缺少必要参数:input_text 或 uid', - 'data': None - }) - - user_input = user_input.strip() - - # 修改第一阶段:意图识别专家的提示词,使其更严格 - intent_analyst_prompt = """你是一位资深的意图分析专家,请分析用户输入的意图和需求。 - -你必须严格按照以下JSON格式返回,不要添加任何其他内容: -{ - "core_intent": "技术", // 必须是以下选项之一:技术、创意、分析、咨询 - "domain": "web开发", // 具体的专业领域 - "key_requirements": [ // 2-4个关键需求 - "需求1", - "需求2" - ], - "expected_output": "期望输出的具体形式", // 简短描述 - "constraints": [ // 1-3个主要约束 - "约束1", - "约束2" - ], - "keywords": [ // 2-4个关键词 - "关键词1", - "关键词2" - ] -} - -注意: -1. 严格遵守JSON格式 -2. core_intent必须是四个选项之一 -3. 数组至少包含1个元素 -4. 所有字段都必须存在 -5. 不要包含注释 -6. 不要添加任何额外的文本""" - - try: - # 获取意图分析结果 - intent_response = client.chat.completions.create( - model="deepseek-chat", - messages=[ - {"role": "system", "content": intent_analyst_prompt}, - {"role": "user", "content": user_input} - ], - temperature=0.1 # 降低温度,使输出更确定 - ) - - intent_analysis_text = intent_response.choices[0].message.content.strip() - - # 添加日志记录 - current_app.logger.info(f"AI返回的意图分析结果: {intent_analysis_text}") - - # 尝试清理和解析JSON - try: - # 移除可能的markdown代码块标记 - intent_analysis_text = intent_analysis_text.replace('```json', '').replace('```', '').strip() - intent_analysis = json.loads(intent_analysis_text) - - # 验证必要字段 - required_fields = ['core_intent', 'domain', 'key_requirements', - 'expected_output', 'constraints', 'keywords'] - for field in required_fields: - if field not in intent_analysis: - raise ValueError(f"缺少必要字段: {field}") - - # 验证core_intent是否为有效值 - valid_intents = ['技术', '创意', '分析', '咨询'] - if intent_analysis['core_intent'] not in valid_intents: - intent_analysis['core_intent'] = '技术' # 默认使用技术 - - # 确保数组字段非空 - array_fields = ['key_requirements', 'constraints', 'keywords'] - for field in array_fields: - if not isinstance(intent_analysis[field], list) or len(intent_analysis[field]) == 0: - intent_analysis[field] = ['未指定'] - - except json.JSONDecodeError as e: - current_app.logger.error(f"JSON解析失败: {str(e)}, 原始文本: {intent_analysis_text}") - return jsonify({ - 'code': 500, - 'message': 'AI返回的格式有误,请重试', - 'data': None - }) - except ValueError as e: - current_app.logger.error(f"数据验证失败: {str(e)}") - return jsonify({ - 'code': 500, - 'message': str(e), - 'data': None - }) - - except Exception as e: - current_app.logger.error(f"意图分析失败: {str(e)}") - return jsonify({ - 'code': 500, - 'message': '意图分析过程出错,请重试', - 'data': None - }) - - # 第二阶段:领域专家提示生成 - domain_expert_templates = { - "技术": """你是一位专业的技术领域提示工程师。基于以下意图分析,生成一个专业的技术任务提示词: - -意图分析: -{analysis} - -请生成的提示词包含: -1. 明确的技术背景和上下文 -2. 具体的技术要求和规范 -3. 性能和质量标准 -4. 技术约束条件 -5. 预期交付成果 -6. 评估标准 - -使用专业技术术语,确保提示词的可执行性和可验证性。""", - - "创意": """你是一位专业的创意领域提示工程师。基于以下意图分析,生成一个创意设计提示词: - -意图分析: -{analysis} - -请生成的提示词包含: -1. 创意方向和灵感来源 -2. 风格和氛围要求 -3. 目标受众定义 -4. 设计元素规范 -5. 创意表现形式 -6. 评估标准 - -使用专业创意术语,确保提示词的创新性和可执行性。""", - - "分析": """你是一位专业的数据分析提示工程师。基于以下意图分析,生成一个数据分析提示词: - -意图分析: -{analysis} - -请生成的提示词包含: -1. 分析目标和范围 -2. 数据要求和规范 -3. 分析方法和工具 -4. 输出格式要求 -5. 关键指标定义 -6. 质量控制标准 - -使用专业分析术语,确保提示词的科学性和可操作性。""", - - "咨询": """你是一位专业的咨询领域提示工程师。基于以下意图分析,生成一个咨询服务提示词: - -意图分析: -{analysis} - -请生成的提示词包含: -1. 咨询问题界定 -2. 背景信息要求 -3. 分析框架设定 -4. 建议输出格式 -5. 实施考虑因素 -6. 效果评估标准 - -使用专业咨询术语,确保提示词的专业性和实用性。""" - } - - # 选择领域专家模板 - expert_prompt = domain_expert_templates.get( - intent_analysis['core_intent'], - """你是一位专业的通用领域提示工程师。基于以下意图分析,生成一个专业的提示词: - -意图分析: -{analysis} - -请生成的提示词包含: -1. 明确的目标定义 -2. 具体要求和规范 -3. 质量标准 -4. 约束条件 -5. 预期输出 -6. 评估标准 - -确保提示词的清晰性和可执行性。""" - ) - - try: - # 生成最终提示词 - final_response = client.chat.completions.create( - model="deepseek-chat", - messages=[ - {"role": "system", "content": expert_prompt.format( - analysis=json.dumps(intent_analysis, ensure_ascii=False, indent=2) - )}, - {"role": "user", "content": user_input} - ], - temperature=0.7 - ) - - generated_prompt = final_response.choices[0].message.content.strip() - - except Exception as e: - current_app.logger.error(f"生成提示词失败: {str(e)}") - return jsonify({ - 'code': 500, - 'message': '生成提示词过程出错', - 'data': None - }) - - try: - # 保存到数据库 - prompt = Prompt( - input_text=user_input, - generated_text=generated_prompt, - wx_user_id=uid, - #intent_analysis=json.dumps(intent_analysis, ensure_ascii=False), - created_at=datetime.utcnow() - ) - db.session.add(prompt) - db.session.commit() - - except Exception as e: - current_app.logger.error(f"保存到数据库失败: {str(e)}") - db.session.rollback() - # 即使保存失败,也返回生成的结果 - - return jsonify({ - 'code': 200, - 'message': 'success', - 'data': { - 'prompt_id': prompt.id if 'prompt' in locals() else None, - 'intent_analysis': intent_analysis, - 'generated_prompt': generated_prompt, - 'created_at': prompt.created_at.strftime('%Y-%m-%d %H:%M:%S') if 'prompt' in locals() else None - } - }) - - except Exception as e: - current_app.logger.error(f"生成专家提示词失败: {str(e)}") - return jsonify({ - 'code': 500, - 'message': str(e), - 'data': None - }) - -@main_bp.route('/expert_generate') -def expert_generate(): - """专家提示词生成页面""" - return render_template('expert_generate.html') - -# ... 其他路由保持不变,但要把 @app 改成 @main_bp ... \ No newline at end of file diff --git a/flask_prompt_master/static/css/style.css b/flask_prompt_master/static/css/style.css deleted file mode 100644 index 1477de7..0000000 --- a/flask_prompt_master/static/css/style.css +++ /dev/null @@ -1,18 +0,0 @@ -.prompt-container { - display: flex; - flex-wrap: wrap; - gap: 16px; - padding: 20px; - max-width: 1200px; - margin: 0 auto; -} - -.prompt-card { - width: calc((100% - 64px) / 5); - min-width: 180px; - margin: 0; - background: #fff; - border-radius: 8px; - padding: 12px; - box-shadow: 0 2px 4px rgba(0,0,0,0.1); -} \ No newline at end of file diff --git a/flask_prompt_master/templates/__pycache__/__init__.cpython-312.pyc b/flask_prompt_master/templates/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 62a9cdc..0000000 Binary files a/flask_prompt_master/templates/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/flask_prompt_master/templates/__pycache__/prompts.cpython-312.pyc b/flask_prompt_master/templates/__pycache__/prompts.cpython-312.pyc deleted file mode 100644 index 4bce577..0000000 Binary files a/flask_prompt_master/templates/__pycache__/prompts.cpython-312.pyc and /dev/null differ diff --git a/forms.py b/forms.py deleted file mode 100644 index a1e3e4d..0000000 --- a/forms.py +++ /dev/null @@ -1,24 +0,0 @@ -from flask_wtf import FlaskForm -from wtforms import StringField, TextAreaField, SelectField, SubmitField -from wtforms.validators import DataRequired, Length, NumberRange - -class PromptForm(FlaskForm): - input_text = TextAreaField('输入内容', validators=[ - DataRequired(message='请输入内容'), - Length(min=10, max=1000, message='内容长度应在10到1000个字符之间') - ]) - submit = SubmitField('生成提示词') - -class FeedbackForm(FlaskForm): - rating = SelectField('评分', choices=[ - ('5', '⭐⭐⭐⭐⭐'), - ('4', '⭐⭐⭐⭐'), - ('3', '⭐⭐⭐'), - ('2', '⭐⭐'), - ('1', '⭐') - ], validators=[DataRequired(message='请选择评分')]) - - comment = TextAreaField('评论', validators=[ - Length(max=500, message='评论不能超过500个字符') - ]) - submit = SubmitField('提交反馈') diff --git a/init_db.py b/init_db.py index 24cdeab..98bc446 100644 --- a/init_db.py +++ b/init_db.py @@ -1,12 +1,96 @@ -from flask_prompt_master import create_app, db +from src.flask_prompt_master import create_app, db +import pymysql +from src.flask_prompt_master.promptsTemplates import templates as init_templates +from src.flask_prompt_master.templates.prompts import templates as prompt_templates -def init_db(): - """初始化数据库""" - app = create_app() - with app.app_context(): - # 创建所有表 - db.create_all() - print("数据库表创建完成!") +def insert_all_templates(): + """向 prompt_template 表插入所有模板数据""" + try: + # 合并两个模板列表 + all_templates = init_templates + prompt_templates + print(f"准备插入的模板总数: {len(all_templates)}") + + # 连接MySQL数据库 + conn = pymysql.connect( + host='localhost', + user='root', + password='123456', + database='pro_db', + charset='utf8mb4' + ) + cursor = conn.cursor() + + # 先清空表 + cursor.execute("TRUNCATE TABLE prompt_template") + + # SQL 插入语句 + check_sql = "SELECT COUNT(*) FROM prompt_template WHERE name = %s" + insert_sql = """ + INSERT INTO prompt_template + (name, description, category, industry, profession, sub_category, system_prompt) + VALUES (%(name)s, %(description)s, %(category)s, %(industry)s, %(profession)s, + %(sub_category)s, %(system_prompt)s) + """ + + # 遍历所有模板数据并插入 + success_count = 0 + duplicate_count = 0 + error_count = 0 + + for template in all_templates: + try: + # 检查模板名称是否已存在 + cursor.execute(check_sql, (template['name'],)) + exists = cursor.fetchone()[0] > 0 + + if exists: + print(f"模板已存在,跳过: {template['name']}") + duplicate_count += 1 + continue + + # 准备模板数据 + template_data = { + 'name': template['name'], + 'description': template['description'], + 'category': template.get('category', ''), + 'industry': template.get('industry', ''), + 'profession': template.get('profession', ''), + 'sub_category': template.get('sub_category', ''), + 'system_prompt': template['system_prompt'] + } + + # 执行插入 + cursor.execute(insert_sql, template_data) + success_count += 1 + + print(f"成功插入模板: {template['name']}") + + except Exception as e: + print(f"插入模板 {template['name']} 失败:") + print(f"错误类型: {type(e).__name__}") + print(f"错误信息: {str(e)}") + error_count += 1 + continue + + # 提交事务 + conn.commit() + + print("\n=== 数据插入完成 ===") + print(f"成功插入: {success_count} 个模板") + print(f"重复跳过: {duplicate_count} 个模板") + print(f"插入失败: {error_count} 个模板") + print(f"总计模板: {len(all_templates)} 个") + print("===================") + + except Exception as e: + print(f"数据库连接失败: {str(e)}") + if 'conn' in locals(): + conn.rollback() + finally: + if 'cursor' in locals(): + cursor.close() + if 'conn' in locals(): + conn.close() if __name__ == '__main__': - init_db() \ No newline at end of file + insert_all_templates() \ No newline at end of file diff --git a/init_tedb.py b/init_tedb.py deleted file mode 100644 index 66590b7..0000000 --- a/init_tedb.py +++ /dev/null @@ -1,298 +0,0 @@ -from flask_prompt_master import create_app, db -from flask_prompt_master.models import PromptTemplate - -def init_db(): - """初始化数据库""" - app = create_app() - with app.app_context(): - # 创建所有表 - db.create_all() - print("数据库表创建完成!") - -def init_prompt_templates(): - """初始化提示词模板""" - templates = [ - # ... 保留原有模板 ... - - # 考公模板 - { - 'name': '行测-言语理解', - 'description': '针对行测言语理解题目的提示词优化', - 'category': '考公', - 'industry': '公务员', - 'profession': '行测', - 'sub_category': '言语理解', - 'system_prompt': """你是一个专业的公务员考试行测言语理解专家。 - -对于用户输入的言语理解相关问题,你需要: -1. 分析题目类型(主旨理解、细节理解、语句表达、逻辑填空等) -2. 提供解题思路和方法 -3. 指出关键词和重点句 -4. 分析选项特点和陷阱 -5. 总结该类题目的通用解题技巧 - -请用清晰、专业的语言描述,帮助考生提高解题效率和准确率。""" - }, - { - 'name': '行测-数量关系', - 'description': '针对行测数量关系题目的提示词优化', - 'category': '考公', - 'industry': '公务员', - 'profession': '行测', - 'sub_category': '数量关系', - 'system_prompt': """你是一个专业的公务员考试行测数量关系专家。 - -对于用户输入的数量关系问题,你需要: -1. 识别题目类型(数字推理、数学运算等) -2. 提供快速解题方法 -3. 指出计算技巧和shortcuts -4. 分析易错点和陷阱 -5. 总结该类题目的通用解题策略 - -请注重实用性和效率,帮助考生在有限时间内提高正确率。""" - }, - { - 'name': '行测-判断推理', - 'description': '针对行测判断推理题目的提示词优化', - 'category': '考公', - 'industry': '公务员', - 'profession': '行测', - 'sub_category': '判断推理', - 'system_prompt': """你是一个专业的公务员考试行测判断推理专家。 - -对于用户输入的判断推理问题,你需要: -1. 识别题型(图形推理、定义判断、类比推理、逻辑判断) -2. 提供系统的分析方法 -3. 指出关键信息和规律 -4. 分析常见的推理方式 -5. 总结该类题目的解题技巧 - -请用逻辑清晰的语言,帮助考生提高推理能力和解题速度。""" - }, - { - 'name': '申论-大作文', - 'description': '针对申论大作文的提示词优化', - 'category': '考公', - 'industry': '公务员', - 'profession': '申论', - 'sub_category': '大作文', - 'system_prompt': """你是一个专业的公务员考试申论写作专家。 - -对于用户输入的申论作文主题,你需要: -1. 分析题目要求和角度 -2. 提供论证思路和框架 -3. 推荐合适的论据和例证 -4. 指导语言表达和行文技巧 -5. 提供优秀范文示例 - -请注重思想性和实践性的结合,帮助考生提高申论写作水平。""" - }, - { - 'name': '申论-材料分析', - 'description': '针对申论材料分析题的提示词优化', - 'category': '考公', - 'industry': '公务员', - 'profession': '申论', - 'sub_category': '材料分析', - 'system_prompt': """你是一个专业的公务员考试申论材料分析专家。 - -对于用户输入的材料分析题目,你需要: -1. 提供阅读材料的方法和技巧 -2. 指导如何提取关键信息 -3. 分析问题的答题思路 -4. 指导语言组织和表达 -5. 提供答题模板和范例 - -请用专业的视角,帮助考生提高材料分析能力。""" - }, - { - 'name': '行测-资料分析', - 'description': '针对行测资料分析题目的提示词优化', - 'category': '考公', - 'industry': '公务员', - 'profession': '行测', - 'sub_category': '资料分析', - 'system_prompt': """你是一个专业的公务员考试行测资料分析专家。 - -对于用户输入的资料分析问题,你需要: -1. 快速定位关键数据 -2. 提供计算简化方法 -3. 分析数据间的关系 -4. 指出常见的陷阱 -5. 总结速算技巧 - -请注重实用性,帮助考生提高资料分析题的正确率和速度。""" - }, - { - 'name': '申论-对策建议', - 'description': '针对申论对策建议题的提示词优化', - 'category': '考公', - 'industry': '公务员', - 'profession': '申论', - 'sub_category': '对策建议', - 'system_prompt': """你是一个专业的公务员考试申论对策建议专家。 - -对于用户输入的对策建议题目,你需要: -1. 分析问题的成因 -2. 提供多角度的解决方案 -3. 确保建议的可行性 -4. 注重措施的具体性 -5. 使用规范的行政语言 - -请从实践角度出发,帮助考生提出有效的对策建议。""" - }, - # 考公-面试模板 - { - 'name': '结构化面试-综合分析', - 'description': '针对公务员面试综合分析题的提示词优化', - 'category': '考公', - 'industry': '公务员', - 'profession': '面试', - 'sub_category': '综合分析', - 'system_prompt': """你是一个专业的公务员面试辅导专家。 - -对于用户输入的综合分析题目,你需要: -1. 分析题目中的核心问题和关键词 -2. 提供多维度的分析框架 -3. 结合实际案例进行论证 -4. 给出具体可行的解决方案 -5. 使用规范的语言表达 - -请注重答题的全面性、逻辑性和实用性,帮助考生提高面试表现。""" - }, - { - 'name': '结构化面试-人际沟通', - 'description': '针对公务员面试人际沟通题的提示词优化', - 'category': '考公', - 'industry': '公务员', - 'profession': '面试', - 'sub_category': '人际沟通', - 'system_prompt': """你是一个专业的公务员面试人际沟通专家。 - -对于用户输入的人际沟通题目,你需要: -1. 分析情境中的矛盾点 -2. 提供处理问题的思路 -3. 运用沟通技巧和方法 -4. 注重情商和态度 -5. 体现公职人员的素养 - -请帮助考生展现良好的沟通能力和职业素养。""" - }, - { - 'name': '行测-常识判断', - 'description': '针对行测常识判断题目的提示词优化', - 'category': '考公', - 'industry': '公务员', - 'profession': '行测', - 'sub_category': '常识判断', - 'system_prompt': """你是一个专业的公务员考试行测常识判断专家。 - -对于用户输入的常识判断问题,你需要: -1. 梳理常识考点范围 -2. 提供记忆和理解方法 -3. 分析易混淆知识点 -4. 总结答题技巧 -5. 提供实践应用示例 - -请帮助考生系统掌握常识判断的重点和方法。""" - }, - { - 'name': '申论-概括提炼', - 'description': '针对申论概括提炼题的提示词优化', - 'category': '考公', - 'industry': '公务员', - 'profession': '申论', - 'sub_category': '概括提炼', - 'system_prompt': """你是一个专业的公务员考试申论概括提炼专家。 - -对于用户输入的概括提炼题目,你需要: -1. 教授快速阅读技巧 -2. 指导关键信息提取 -3. 分析归纳方法 -4. 指导语言精炼技巧 -5. 提供答题模板 - -请帮助考生提高信息处理和表达能力。""" - }, - { - 'name': '时政热点-分析', - 'description': '针对公务员考试时政热点的提示词优化', - 'category': '考公', - 'industry': '公务员', - 'profession': '时政', - 'sub_category': '热点分析', - 'system_prompt': """你是一个专业的公务员考试时政分析专家。 - -对于用户输入的时政热点,你需要: -1. 梳理事件背景和过程 -2. 分析政策导向和意义 -3. 总结核心观点 -4. 提供多角度思考 -5. 联系实际应用 - -请帮助考生把握时政热点的要点和考察方向。""" - }, - { - 'name': '面试-应急处理', - 'description': '针对公务员面试应急处理题的提示词优化', - 'category': '考公', - 'industry': '公务员', - 'profession': '面试', - 'sub_category': '应急处理', - 'system_prompt': """你是一个专业的公务员面试应急处理专家。 - -对于用户输入的应急处理题目,你需要: -1. 分析突发事件的类型和特点 -2. 提供处置的基本原则 -3. 制定具体应对措施 -4. 注重舆情应对 -5. 总结预防和改进建议 - -请帮助考生掌握应急处理的要点和方法。""" - }, - { - 'name': '面试-组织管理', - 'description': '针对公务员面试组织管理题的提示词优化', - 'category': '考公', - 'industry': '公务员', - 'profession': '面试', - 'sub_category': '组织管理', - 'system_prompt': """你是一个专业的公务员面试组织管理专家。 - -对于用户输入的组织管理题目,你需要: -1. 分析管理问题的本质 -2. 运用管理学原理 -3. 提供具体工作方法 -4. 注重团队协作 -5. 体现领导能力 - -请帮助考生展现管理才能和领导素质。""" - } - ] - - try: - # 添加模板 - for template in templates: - # 检查是否已存在 - existing = PromptTemplate.query.filter_by( - name=template['name'], - category=template['category'], - sub_category=template['sub_category'] - ).first() - - if not existing: - new_template = PromptTemplate(**template) - db.session.add(new_template) - print(f"添加模板: {template['name']}") - else: - print(f"模板已存在: {template['name']}") - - db.session.commit() - print("\n=== 模板初始化完成 ===") - - except Exception as e: - print(f"初始化模板失败: {str(e)}") - db.session.rollback() - -if __name__ == '__main__': - init_db() \ No newline at end of file diff --git a/instance/app.db b/instance/app.db deleted file mode 100644 index 3ce2b28..0000000 Binary files a/instance/app.db and /dev/null differ diff --git a/instance/prompt_master.db b/instance/prompt_master.db deleted file mode 100644 index ad97039..0000000 Binary files a/instance/prompt_master.db and /dev/null differ diff --git a/manage.py b/manage.py deleted file mode 100644 index 655d69a..0000000 --- a/manage.py +++ /dev/null @@ -1,11 +0,0 @@ -from flask_migrate import Migrate, MigrateCommand -from flask_script import Manager -from flask_prompt_master import create_app, db - -app = create_app() -migrate = Migrate(app, db) -manager = Manager(app) -manager.add_command('db', MigrateCommand) - -if __name__ == '__main__': - manager.run() \ No newline at end of file diff --git a/migrations/migrate_to_mysql.py b/migrations/migrate_to_mysql.py deleted file mode 100644 index df55958..0000000 --- a/migrations/migrate_to_mysql.py +++ /dev/null @@ -1,28 +0,0 @@ -from flask_prompt_master import create_app, db -from flask_prompt_master.models import PromptTemplate -import pymysql - -def migrate_to_mysql(): - """迁移数据到MySQL""" - app = create_app() - - with app.app_context(): - # 创建所有表 - db.create_all() - - try: - # 检查是否已有数据 - if PromptTemplate.query.first() is None: - # 执行init_db中的初始化 - from flask_prompt_master.init_db import init_db - init_db() - print("模板数据迁移完成!") - else: - print("数据库中已存在模板数据,跳过迁移。") - - except Exception as e: - print(f"迁移过程中出错: {str(e)}") - db.session.rollback() - -if __name__ == '__main__': - migrate_to_mysql() \ No newline at end of file diff --git a/migrations/versions/add_wx_fields.py b/migrations/versions/add_wx_fields.py deleted file mode 100644 index b7ec95b..0000000 --- a/migrations/versions/add_wx_fields.py +++ /dev/null @@ -1,66 +0,0 @@ -from flask_migrate import Migrate -from flask_prompt_master import create_app, db -import pymysql - -def upgrade_database(): - """添加微信相关字段并修改字段约束""" - try: - conn = pymysql.connect( - host='localhost', - user='root', - password='123456', - database='food_db', - charset='utf8mb4' - ) - cursor = conn.cursor() - - # 修改现有字段约束 - modify_statements = [ - "ALTER TABLE user MODIFY mobile VARCHAR(20) NULL", - "ALTER TABLE user MODIFY email VARCHAR(100) NULL", - "ALTER TABLE user MODIFY avatar VARCHAR(64) NULL" - ] - - print("\n=== 修改字段约束 ===") - for statement in modify_statements: - try: - cursor.execute(statement) - print(f"执行成功: {statement}") - except Exception as e: - print(f"执行失败: {statement}") - print(f"错误: {str(e)}") - - # 添加新字段 - add_statements = [ - "ALTER TABLE user ADD COLUMN IF NOT EXISTS openid VARCHAR(64) UNIQUE", - "ALTER TABLE user ADD COLUMN IF NOT EXISTS session_key VARCHAR(64)", - "ALTER TABLE user ADD COLUMN IF NOT EXISTS unionid VARCHAR(64) UNIQUE", - "ALTER TABLE user ADD COLUMN IF NOT EXISTS wx_nickname VARCHAR(100)", - "ALTER TABLE user ADD COLUMN IF NOT EXISTS wx_avatar VARCHAR(255)" - ] - - print("\n=== 添加新字段 ===") - for statement in add_statements: - try: - cursor.execute(statement) - print(f"执行成功: {statement}") - except Exception as e: - print(f"执行失败: {statement}") - print(f"错误: {str(e)}") - - # 提交事务 - conn.commit() - print("\n=== 数据库升级完成 ===") - - except Exception as e: - print(f"数据库升级失败: {str(e)}") - if 'conn' in locals(): - conn.rollback() - finally: - if 'cursor' in locals(): - cursor.close() - if 'conn' in locals(): - conn.close() - -if __name__ == '__main__': - upgrade_database() \ No newline at end of file diff --git a/migrations/versions/create_wx_tables.py b/migrations/versions/create_wx_tables.py deleted file mode 100644 index 5cf7f7a..0000000 --- a/migrations/versions/create_wx_tables.py +++ /dev/null @@ -1,71 +0,0 @@ -import pymysql - -def upgrade_database(): - """创建微信用户相关表""" - try: - conn = pymysql.connect( - host='localhost', - user='root', - password='123456', - database='food_db', - charset='utf8mb4' - ) - cursor = conn.cursor() - - # 创建微信用户表 - cursor.execute(""" - CREATE TABLE IF NOT EXISTS wx_user ( - id INT PRIMARY KEY AUTO_INCREMENT, - openid VARCHAR(64) UNIQUE NOT NULL, - session_key VARCHAR(64), - unionid VARCHAR(64) UNIQUE, - nickname VARCHAR(100), - avatar_url VARCHAR(255), - gender INT DEFAULT 0, - country VARCHAR(50), - province VARCHAR(50), - city VARCHAR(50), - language VARCHAR(20), - phone VARCHAR(20), - is_active BOOLEAN DEFAULT TRUE, - last_login DATETIME DEFAULT CURRENT_TIMESTAMP, - created_at DATETIME DEFAULT CURRENT_TIMESTAMP, - updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP - ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; - """) - print("创建wx_user表成功") - - # 修改现有表添加外键 - alter_statements = [ - "ALTER TABLE prompt MODIFY user_id INT NULL", - "ALTER TABLE prompt ADD COLUMN wx_user_id INT", - "ALTER TABLE prompt ADD FOREIGN KEY (wx_user_id) REFERENCES wx_user(id)", - - "ALTER TABLE feedback MODIFY user_id INT NULL", - "ALTER TABLE feedback ADD COLUMN wx_user_id INT", - "ALTER TABLE feedback ADD FOREIGN KEY (wx_user_id) REFERENCES wx_user(id)" - ] - - for statement in alter_statements: - try: - cursor.execute(statement) - print(f"执行成功: {statement}") - except Exception as e: - print(f"执行失败: {statement}") - print(f"错误: {str(e)}") - - conn.commit() - print("\n=== 数据库升级完成 ===") - - except Exception as e: - print(f"数据库升级失败: {str(e)}") - if 'conn' in locals(): - conn.rollback() - finally: - if 'cursor' in locals(): - cursor.close() - if 'conn' in locals(): - conn.close() - -if __name__ == '__main__': - upgrade_database() \ No newline at end of file diff --git a/run_dev.py b/run_dev.py index 8891696..b6494f8 100644 --- a/run_dev.py +++ b/run_dev.py @@ -1,4 +1,4 @@ -from flask_prompt_master import create_app +from src.flask_prompt_master import create_app app = create_app() diff --git a/scripts/backup_db.py b/scripts/backup_db.py deleted file mode 100644 index b21a4a1..0000000 --- a/scripts/backup_db.py +++ /dev/null @@ -1,32 +0,0 @@ -import os -import datetime -import subprocess - -def backup_mysql_db(): - """备份MySQL数据库""" - # 数据库配置 - DB_HOST = 'localhost' - DB_USER = '用户名' - DB_PASS = '密码' - DB_NAME = 'prompt_master' - - # 备份文件路径 - BACKUP_PATH = 'backups' - if not os.path.exists(BACKUP_PATH): - os.makedirs(BACKUP_PATH) - - # 生成备份文件名 - date = datetime.datetime.now().strftime('%Y%m%d_%H%M%S') - backup_file = os.path.join(BACKUP_PATH, f'prompt_master_{date}.sql') - - try: - # 执行mysqldump命令 - cmd = f'mysqldump -h {DB_HOST} -u {DB_USER} -p{DB_PASS} {DB_NAME} > {backup_file}' - subprocess.run(cmd, shell=True, check=True) - print(f"数据库备份成功: {backup_file}") - - except subprocess.CalledProcessError as e: - print(f"备份失败: {str(e)}") - -if __name__ == '__main__': - backup_mysql_db() \ No newline at end of file diff --git a/src/flask_prompt_master/__init__.py b/src/flask_prompt_master/__init__.py index a158833..f91bce8 100644 --- a/src/flask_prompt_master/__init__.py +++ b/src/flask_prompt_master/__init__.py @@ -1,7 +1,7 @@ from flask import Flask from flask_sqlalchemy import SQLAlchemy from flask_migrate import Migrate -from config import Config +from src.flask_prompt_master.config import Config import os from flask_cors import CORS @@ -24,7 +24,7 @@ def create_app(config_class=Config): migrate.init_app(app, db) # 注册蓝图 - from flask_prompt_master.routes import main_bp + from src.flask_prompt_master.routes import main_bp app.register_blueprint(main_bp) return app \ No newline at end of file diff --git a/config.py b/src/flask_prompt_master/config.py similarity index 100% rename from config.py rename to src/flask_prompt_master/config.py diff --git a/src/flask_prompt_master/forms/__init__.py b/src/flask_prompt_master/forms/__init__.py new file mode 100644 index 0000000..c73bc20 --- /dev/null +++ b/src/flask_prompt_master/forms/__init__.py @@ -0,0 +1,8 @@ +""" +表单包 +包含所有表单定义 +""" + +from .forms import * + +__all__ = ['LoginForm', 'RegisterForm', 'PromptForm'] diff --git a/src/flask_prompt_master/models/__init__.py b/src/flask_prompt_master/models/__init__.py new file mode 100644 index 0000000..a59692c --- /dev/null +++ b/src/flask_prompt_master/models/__init__.py @@ -0,0 +1,8 @@ +""" +数据模型包 +包含所有数据库模型定义 +""" + +from .models import * + +__all__ = ['User', 'Prompt', 'Feedback'] diff --git a/src/flask_prompt_master/models/models.py b/src/flask_prompt_master/models/models.py index a5195d8..1d4c2b8 100644 --- a/src/flask_prompt_master/models/models.py +++ b/src/flask_prompt_master/models/models.py @@ -1,4 +1,4 @@ -from flask_prompt_master import db +from src.flask_prompt_master import db from datetime import datetime class User(db.Model): diff --git a/flask_prompt_master/init_db.py b/src/flask_prompt_master/promptsTemplates.py similarity index 99% rename from flask_prompt_master/init_db.py rename to src/flask_prompt_master/promptsTemplates.py index d8d7364..2400242 100644 --- a/flask_prompt_master/init_db.py +++ b/src/flask_prompt_master/promptsTemplates.py @@ -1,5 +1,5 @@ -from flask_prompt_master import create_app, db -from flask_prompt_master.models import PromptTemplate +from src.flask_prompt_master import create_app, db +from src.flask_prompt_master.models import PromptTemplate import pymysql # 导出模板数据 diff --git a/src/flask_prompt_master/routes/__init__.py b/src/flask_prompt_master/routes/__init__.py new file mode 100644 index 0000000..36e3913 --- /dev/null +++ b/src/flask_prompt_master/routes/__init__.py @@ -0,0 +1,8 @@ +""" +路由包 +包含所有应用路由定义 +""" + +from .routes import * + +__all__ = ['main', 'auth', 'prompts'] diff --git a/flask_prompt_master/routes/prompts.py b/src/flask_prompt_master/routes/prompts.py similarity index 100% rename from flask_prompt_master/routes/prompts.py rename to src/flask_prompt_master/routes/prompts.py diff --git a/src/flask_prompt_master/routes/routes.py b/src/flask_prompt_master/routes/routes.py index 1d205fd..b3e5888 100644 --- a/src/flask_prompt_master/routes/routes.py +++ b/src/flask_prompt_master/routes/routes.py @@ -1,9 +1,9 @@ from flask import Blueprint, render_template, request, redirect, url_for, flash, jsonify, current_app from openai import OpenAI -from flask_prompt_master import db -from flask_prompt_master.models import User, Prompt, Feedback, PromptTemplate, WxUser -from flask_prompt_master.forms import PromptForm, FeedbackForm -from config import Config +from src.flask_prompt_master import db +from src.flask_prompt_master.models import User, Prompt, Feedback, PromptTemplate, WxUser +from src.flask_prompt_master.forms import PromptForm, FeedbackForm +from src.flask_prompt_master.config import Config import pymysql from datetime import datetime import requests diff --git a/src/flask_prompt_master/services/__init__.py b/src/flask_prompt_master/services/__init__.py new file mode 100644 index 0000000..eeaff5c --- /dev/null +++ b/src/flask_prompt_master/services/__init__.py @@ -0,0 +1,10 @@ +""" +业务逻辑包 +包含所有业务逻辑服务 +""" + +# 这里将导入具体的服务类 +# from .prompt_service import PromptService +# from .user_service import UserService + +__all__ = [] diff --git a/static/css/chat.css b/src/flask_prompt_master/static/css/chat.css similarity index 100% rename from static/css/chat.css rename to src/flask_prompt_master/static/css/chat.css diff --git a/static/css/style.css b/src/flask_prompt_master/static/css/style.css similarity index 100% rename from static/css/style.css rename to src/flask_prompt_master/static/css/style.css diff --git a/static/js/main.js b/src/flask_prompt_master/static/js/main.js similarity index 100% rename from static/js/main.js rename to src/flask_prompt_master/static/js/main.js diff --git a/flask_prompt_master/templates/__init__.py b/src/flask_prompt_master/templates/__init__.py similarity index 100% rename from flask_prompt_master/templates/__init__.py rename to src/flask_prompt_master/templates/__init__.py diff --git a/flask_prompt_master/templates/base.html b/src/flask_prompt_master/templates/base.html similarity index 100% rename from flask_prompt_master/templates/base.html rename to src/flask_prompt_master/templates/base.html diff --git a/flask_prompt_master/templates/expert_generate.html b/src/flask_prompt_master/templates/expert_generate.html similarity index 100% rename from flask_prompt_master/templates/expert_generate.html rename to src/flask_prompt_master/templates/expert_generate.html diff --git a/flask_prompt_master/templates/generate.html b/src/flask_prompt_master/templates/generate.html similarity index 100% rename from flask_prompt_master/templates/generate.html rename to src/flask_prompt_master/templates/generate.html diff --git a/flask_prompt_master/templates/index.html b/src/flask_prompt_master/templates/index.html similarity index 100% rename from flask_prompt_master/templates/index.html rename to src/flask_prompt_master/templates/index.html diff --git a/flask_prompt_master/templates/prompt.html b/src/flask_prompt_master/templates/prompt.html similarity index 100% rename from flask_prompt_master/templates/prompt.html rename to src/flask_prompt_master/templates/prompt.html diff --git a/flask_prompt_master/templates/prompt_list.html b/src/flask_prompt_master/templates/prompt_list.html similarity index 100% rename from flask_prompt_master/templates/prompt_list.html rename to src/flask_prompt_master/templates/prompt_list.html diff --git a/flask_prompt_master/templates/prompts.py b/src/flask_prompt_master/templates/prompts.py similarity index 100% rename from flask_prompt_master/templates/prompts.py rename to src/flask_prompt_master/templates/prompts.py diff --git a/src/flask_prompt_master/utils/__init__.py b/src/flask_prompt_master/utils/__init__.py new file mode 100644 index 0000000..5a08f35 --- /dev/null +++ b/src/flask_prompt_master/utils/__init__.py @@ -0,0 +1,10 @@ +""" +工具包 +包含所有工具函数和辅助类 +""" + +# 这里将导入具体的工具函数 +# from .validators import validate_prompt +# from .helpers import format_response + +__all__ = [] diff --git a/sync_templates.py b/sync_templates.py deleted file mode 100644 index 500642e..0000000 --- a/sync_templates.py +++ /dev/null @@ -1,98 +0,0 @@ -import pymysql -from flask_prompt_master.init_db import templates - -def sync_templates(): - """同步提示词模板数据到数据库""" - try: - # 连接数据库 - conn = pymysql.connect( - host='localhost', - user='root', - password='123456', - database='food_db', - charset='utf8mb4' - ) - cursor = conn.cursor() - - # 获取现有模板 - cursor.execute("SELECT name FROM prompt_template") - existing_templates = {row[0] for row in cursor.fetchall()} - - # 准备插入和更新的SQL语句 - insert_sql = """ - INSERT INTO prompt_template - (name, description, category, industry, profession, sub_category, system_prompt, is_default) - VALUES (%s, %s, %s, %s, %s, %s, %s, %s) - """ - - update_sql = """ - UPDATE prompt_template - SET description = %s, - category = %s, - industry = %s, - profession = %s, - sub_category = %s, - system_prompt = %s, - is_default = %s - WHERE name = %s - """ - - # 统计计数 - inserted_count = 0 - updated_count = 0 - - # 遍历模板数据 - for template in templates: - template_name = template['name'] - - if template_name in existing_templates: - # 更新现有模板 - cursor.execute(update_sql, ( - template['description'], - template.get('category', ''), - template.get('industry', ''), - template.get('profession', ''), - template.get('sub_category', ''), - template['system_prompt'], - template.get('is_default', False), - template_name - )) - updated_count += 1 - print(f"更新模板: {template_name}") - else: - # 插入新模板 - cursor.execute(insert_sql, ( - template_name, - template['description'], - template.get('category', ''), - template.get('industry', ''), - template.get('profession', ''), - template.get('sub_category', ''), - template['system_prompt'], - template.get('is_default', False) - )) - inserted_count += 1 - print(f"新增模板: {template_name}") - - # 提交事务 - conn.commit() - - # 打印同步结果 - print("\n=== 模板同步完成 ===") - print(f"新增模板数: {inserted_count}") - print(f"更新模板数: {updated_count}") - print(f"总模板数: {len(templates)}") - print("===================") - - except Exception as e: - print(f"同步模板失败: {str(e)}") - if 'conn' in locals(): - conn.rollback() - finally: - if 'cursor' in locals(): - cursor.close() - if 'conn' in locals(): - conn.close() - -if __name__ == '__main__': - sync_templates() \ No newline at end of file diff --git a/templates/base.html b/templates/base.html deleted file mode 100644 index e9d0f9a..0000000 --- a/templates/base.html +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - 提示词大师 - {% block title %}{% endblock %} - - - - -
- -
- -
- {% with messages = get_flashed_messages() %} - {% if messages %} -
- {% for message in messages %} -
{{ message }}
- {% endfor %} -
- {% endif %} - {% endwith %} - - {% block content %}{% endblock %} -
- -
-

© 2025 提示词大师

-
- - diff --git a/templates/feedback.html b/templates/feedback.html deleted file mode 100644 index 498bad7..0000000 --- a/templates/feedback.html +++ /dev/null @@ -1,37 +0,0 @@ -{% extends "base.html" %} - -{% block title %}提供反馈{% endblock %} - -{% block content %} - -{% endblock %} diff --git a/templates/generate.html b/templates/generate.html deleted file mode 100644 index 4a2159d..0000000 --- a/templates/generate.html +++ /dev/null @@ -1,22 +0,0 @@ -{% extends "base.html" %} - -{% block title %}生成提示词{% endblock %} - -{% block content %} -
-

生成提示词

-
- {{ form.hidden_tag() }} -
- {{ form.input_text.label }} - {{ form.input_text(class="form-control", rows=5) }} - {% for error in form.input_text.errors %} - {{ error }} - {% endfor %} -
-
- {{ form.submit(class="btn btn-primary") }} -
-
-
-{% endblock %} diff --git a/templates/prompt.html b/templates/prompt.html deleted file mode 100644 index b074d92..0000000 --- a/templates/prompt.html +++ /dev/null @@ -1,30 +0,0 @@ -{% extends "base.html" %} - -{% block title %}提示词详情{% endblock %} - -{% block content %} -
-

生成的提示词

- -
-
-

您的输入:

-

{{ prompt.input_text }}

-
- -
-

生成的提示词:

-

{{ prompt.generated_text }}

-
- - -
-
-{% endblock %} diff --git a/test_db.py b/test_db.py index 1646710..98bc446 100644 --- a/test_db.py +++ b/test_db.py @@ -1,7 +1,7 @@ -from flask_prompt_master import create_app, db +from src.flask_prompt_master import create_app, db import pymysql -from flask_prompt_master.init_db import templates as init_templates -from flask_prompt_master.templates.prompts import templates as prompt_templates +from src.flask_prompt_master.promptsTemplates import templates as init_templates +from src.flask_prompt_master.templates.prompts import templates as prompt_templates def insert_all_templates(): """向 prompt_template 表插入所有模板数据"""