commit 35ca477a2dace04260c0d9c573e133ec34a26271 Author: userName Date: Fri Aug 23 11:01:27 2024 +0000 first commit diff --git a/README.md b/README.md new file mode 100755 index 0000000..08cf016 --- /dev/null +++ b/README.md @@ -0,0 +1,31 @@ + +npm install +axios +my-vue-app/ +├── node_modules/ # 通过 npm 或 yarn 安装的项目依赖包 +├── public/ # 存放静态资源和公共资源 +│ ├── favicon.ico # 网站图标 +│ ├── index.html # HTML 模板文件 +│ └── ... # 其他静态资源如图片、字体等 +├── src/ # 源代码目录 +│ ├── App.vue # 根组件 +│ ├── main.js # 应用入口文件 +│ ├── assets/ # 静态资源,如图片、样式文件等 +│ ├── components/ # 全局可复用的组件 +│ ├── views/ # 视图组件 +│ ├── router/ # 路由配置 +│ ├── store/ # Vuex 状态管理 +│ ├── utils/ # 工具函数 +│ └── ... +├── .gitignore # Git 忽略文件配置 +├── package.json # 项目元数据和依赖关系 +├── vue.config.js # Vue CLI 配置文件 +├── README.md # 项目文档 +└── ... + + + + \ No newline at end of file diff --git a/backend/1.py b/backend/1.py new file mode 100755 index 0000000..7a1609b --- /dev/null +++ b/backend/1.py @@ -0,0 +1,17 @@ +# start_service.py +import subprocess + +def run_service(): + # 激活虚拟环境 + activate_cmd = '/home/lqs1/app/venv/bin/activate' + # 运行服务 + service_cmd = ['uvicorn', 'backend.main:app', '--reload'] + + # 构建完整的命令 + full_cmd = f'source {activate_cmd} && cd /home/lqs1/app/ && uvicorn backend.main:app --reload' + + # 使用 Popen 执行命令 + subprocess.Popen(full_cmd, shell=True, executable='/bin/bash') + +if __name__ == '__main__': + run_service() \ No newline at end of file diff --git a/backend/2.py b/backend/2.py new file mode 100755 index 0000000..7c5992e --- /dev/null +++ b/backend/2.py @@ -0,0 +1,16 @@ +# stop_service.py +import subprocess + +def stop_service(): + # 查找 uvicorn 进程 ID + find_cmd = "ps aux | grep 'uvicorn backend.main:app --reload' | grep -v grep | awk '{print $2}'" + process = subprocess.run(find_cmd, shell=True, capture_output=True, text=True) + pid = process.stdout.strip() + + if pid: + # 终止进程 + kill_cmd = f"kill {pid}" + subprocess.run(kill_cmd, shell=True) + +if __name__ == '__main__': + stop_service() \ No newline at end of file diff --git a/backend/README.md b/backend/README.md new file mode 100755 index 0000000..367c664 --- /dev/null +++ b/backend/README.md @@ -0,0 +1,22 @@ + +uvicorn backend.main:app --reload + +import configparser +uvicorn main:app --reload +# 创建ConfigParser对象 +config = configparser.ConfigParser() +# 读取配置文件 +config.read('app.conf') +# 获取配置项 +value = config['SectionName']['KeyName'] +VUE3 +npm install socket.io-client + +#数据库迁移 +alembic init alembic +alembic revision autogenrate -m "Add is_superuser column to admin table2" +alembic upgrade head +# 删除所有表 +# Base.metadata.drop_all(bind=engine) +# print("数据库表已重置") + diff --git a/backend/__init__.py b/backend/__init__.py new file mode 100755 index 0000000..9a7e03e --- /dev/null +++ b/backend/__init__.py @@ -0,0 +1 @@ +from . import models \ No newline at end of file diff --git a/backend/__pycache__/__init__.cpython-312.pyc b/backend/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000..49d9109 Binary files /dev/null and b/backend/__pycache__/__init__.cpython-312.pyc differ diff --git a/backend/__pycache__/database.cpython-312.pyc b/backend/__pycache__/database.cpython-312.pyc new file mode 100755 index 0000000..838831b Binary files /dev/null and b/backend/__pycache__/database.cpython-312.pyc differ diff --git a/backend/__pycache__/main.cpython-312.pyc b/backend/__pycache__/main.cpython-312.pyc new file mode 100644 index 0000000..ae0fbf0 Binary files /dev/null and b/backend/__pycache__/main.cpython-312.pyc differ diff --git a/backend/database/1脚本.py b/backend/database/1脚本.py new file mode 100755 index 0000000..86b5de8 --- /dev/null +++ b/backend/database/1脚本.py @@ -0,0 +1,13 @@ +import subprocess + +def run_service(): + bash_cmd = f""" + source /home/lqs1/app/venv/bin/activate && \ + cd /home/lqs1/app/backend/database && \ + alembic revision -m "Initial migration" --autogenerate + """ + subprocess.Popen(bash_cmd, shell=True, executable='/bin/bash') + +if __name__ == '__main__': + run_service() +#alembic revision -m "initial migration" \ No newline at end of file diff --git a/backend/database/2迁移.py b/backend/database/2迁移.py new file mode 100755 index 0000000..528fd31 --- /dev/null +++ b/backend/database/2迁移.py @@ -0,0 +1,19 @@ +import subprocess + +def run_service(): + # 激活虚拟环境并运行服务 + # 注意:这里的命令被组合成了一个bash脚本字符串 + # 首先激活虚拟环境,然后改变目录,最后执行alembic命令 + bash_cmd = f""" + source /home/lqs1/app/venv/bin/activate && \ + cd /home/lqs1/app/backend/database && \ + alembic upgrade head + """ + + # 使用 Popen 执行bash命令 + # 注意:这里使用shell=True,因为我们正在执行一个bash脚本 + # executable='/bin/bash' 是可选的,因为默认就是bash,但明确指出也无妨 + subprocess.Popen(bash_cmd, shell=True, executable='/bin/bash') + +if __name__ == '__main__': + run_service() diff --git a/backend/database/3.py b/backend/database/3.py new file mode 100755 index 0000000..20f094b --- /dev/null +++ b/backend/database/3.py @@ -0,0 +1,23 @@ +import subprocess + +def run_service(): + # 激活虚拟环境并运行服务 + # 注意:这里的命令被组合成了一个bash脚本字符串 + # 首先激活虚拟环境,然后改变目录,最后执行alembic命令 + bash_cmd = f""" + source /home/lqs1/app/venv/bin/activate && \ + cd /home/lqs1/app/backend/database && \ + alembic revision -m "Add shuai column" + + """ + + # 使用 Popen 执行bash命令 + # 注意:这里使用shell=True,因为我们正在执行一个bash脚本 + # executable='/bin/bash' 是可选的,因为默认就是bash,但明确指出也无妨 + subprocess.Popen(bash_cmd, shell=True, executable='/bin/bash') + +if __name__ == '__main__': + run_service() + # alembic revision --autogenerate -m "Add is_superuser column to admin table2" && \ + # alembic revision -m "Initial migration" --autogenerate && \ + # alembic upgrade head diff --git a/backend/database/__pycache__/database.cpython-312.pyc b/backend/database/__pycache__/database.cpython-312.pyc new file mode 100755 index 0000000..df8ce4a Binary files /dev/null and b/backend/database/__pycache__/database.cpython-312.pyc differ diff --git a/backend/database/alembic.ini b/backend/database/alembic.ini new file mode 100755 index 0000000..e75771f --- /dev/null +++ b/backend/database/alembic.ini @@ -0,0 +1,116 @@ +# A generic, single database configuration. + +[alembic] +# path to migration scripts +# Use forward slashes (/) also on windows to provide an os agnostic path +script_location = alembic + +# template used to generate migration file names; The default value is %%(rev)s_%%(slug)s +# Uncomment the line below if you want the files to be prepended with date and time +# see https://alembic.sqlalchemy.org/en/latest/tutorial.html#editing-the-ini-file +# for all available tokens +# file_template = %%(year)d_%%(month).2d_%%(day).2d_%%(hour).2d%%(minute).2d-%%(rev)s_%%(slug)s + +# sys.path path, will be prepended to sys.path if present. +# defaults to the current working directory. +prepend_sys_path = . + +# timezone to use when rendering the date within the migration file +# as well as the filename. +# If specified, requires the python>=3.9 or backports.zoneinfo library. +# Any required deps can installed by adding `alembic[tz]` to the pip requirements +# string value is passed to ZoneInfo() +# leave blank for localtime +# timezone = + +# max length of characters to apply to the "slug" field +# truncate_slug_length = 40 + +# set to 'true' to run the environment during +# the 'revision' command, regardless of autogenerate +# revision_environment = false + +# set to 'true' to allow .pyc and .pyo files without +# a source .py file to be detected as revisions in the +# versions/ directory +# sourceless = false + +# version location specification; This defaults +# to alembic/versions. When using multiple version +# directories, initial revisions must be specified with --version-path. +# The path separator used here should be the separator specified by "version_path_separator" below. +# version_locations = %(here)s/bar:%(here)s/bat:alembic/versions + +# version path separator; As mentioned above, this is the character used to split +# version_locations. The default within new alembic.ini files is "os", which uses os.pathsep. +# If this key is omitted entirely, it falls back to the legacy behavior of splitting on spaces and/or commas. +# Valid values for version_path_separator are: +# +# version_path_separator = : +# version_path_separator = ; +# version_path_separator = space +version_path_separator = os # Use os.pathsep. Default configuration used for new projects. + +# set to 'true' to search source files recursively +# in each "version_locations" directory +# new in Alembic version 1.10 +# recursive_version_locations = false + +# the output encoding used when revision files +# are written from script.py.mako +# output_encoding = utf-8 + +sqlalchemy.url = postgresql://fastapi:Sj89061189@localhost/fastapi + + +[post_write_hooks] +# post_write_hooks defines scripts or Python functions that are run +# on newly generated revision scripts. See the documentation for further +# detail and examples + +# format using "black" - use the console_scripts runner, against the "black" entrypoint +# hooks = black +# black.type = console_scripts +# black.entrypoint = black +# black.options = -l 79 REVISION_SCRIPT_FILENAME + +# lint with attempts to fix using "ruff" - use the exec runner, execute a binary +# hooks = ruff +# ruff.type = exec +# ruff.executable = %(here)s/.venv/bin/ruff +# ruff.options = --fix REVISION_SCRIPT_FILENAME + +# Logging configuration +[loggers] +keys = root,sqlalchemy,alembic + +[handlers] +keys = console + +[formatters] +keys = generic + +[logger_root] +level = WARN +handlers = console +qualname = + +[logger_sqlalchemy] +level = WARN +handlers = +qualname = sqlalchemy.engine + +[logger_alembic] +level = INFO +handlers = +qualname = alembic + +[handler_console] +class = StreamHandler +args = (sys.stderr,) +level = NOTSET +formatter = generic + +[formatter_generic] +format = %(levelname)-5.5s [%(name)s] %(message)s +datefmt = %H:%M:%S diff --git a/backend/database/alembic/README b/backend/database/alembic/README new file mode 100755 index 0000000..98e4f9c --- /dev/null +++ b/backend/database/alembic/README @@ -0,0 +1 @@ +Generic single-database configuration. \ No newline at end of file diff --git a/backend/database/alembic/__pycache__/env.cpython-312.pyc b/backend/database/alembic/__pycache__/env.cpython-312.pyc new file mode 100755 index 0000000..2d9f7fe Binary files /dev/null and b/backend/database/alembic/__pycache__/env.cpython-312.pyc differ diff --git a/backend/database/alembic/env.py b/backend/database/alembic/env.py new file mode 100755 index 0000000..9565651 --- /dev/null +++ b/backend/database/alembic/env.py @@ -0,0 +1,89 @@ +from logging.config import fileConfig + +from sqlalchemy import engine_from_config +from sqlalchemy import pool + +from alembic import context +import sys +import os.path +sys.path.append(os.path.realpath('../models')) +import admin +target_metadata = admin.Base.metadata + +# sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) + +# # 导入所有模型 +# from models import Base +# target_metadata = Base.metadata + +# this is the Alembic Config object, which provides +# access to the values within the .ini file in use. +config = context.config + +# Interpret the config file for Python logging. +# This line sets up loggers basically. +if config.config_file_name is not None: + fileConfig(config.config_file_name) + +# add your model's MetaData object here +# for 'autogenerate' support +# from myapp import mymodel +# target_metadata = mymodel.Base.metadata + + +# other values from the config, defined by the needs of env.py, +# can be acquired: +# my_important_option = config.get_main_option("my_important_option") +# ... etc. + + +def run_migrations_offline() -> None: + """Run migrations in 'offline' mode. + + This configures the context with just a URL + and not an Engine, though an Engine is acceptable + here as well. By skipping the Engine creation + we don't even need a DBAPI to be available. + + Calls to context.execute() here emit the given string to the + script output. + + """ + url = config.get_main_option("sqlalchemy.url") + context.configure( + url=url, + target_metadata=target_metadata, + literal_binds=True, + dialect_opts={"paramstyle": "named"}, + ) + + with context.begin_transaction(): + context.run_migrations() + + +def run_migrations_online() -> None: + """Run migrations in 'online' mode. + + In this scenario we need to create an Engine + and associate a connection with the context. + + """ + connectable = engine_from_config( + config.get_section(config.config_ini_section, {}), + prefix="sqlalchemy.", + poolclass=pool.NullPool, + ) + + with connectable.connect() as connection: + context.configure( + connection=connection, target_metadata=target_metadata + ) + + with context.begin_transaction(): + context.run_migrations() + + +if context.is_offline_mode(): + run_migrations_offline() +else: + run_migrations_online() diff --git a/backend/database/alembic/script.py.mako b/backend/database/alembic/script.py.mako new file mode 100755 index 0000000..fbc4b07 --- /dev/null +++ b/backend/database/alembic/script.py.mako @@ -0,0 +1,26 @@ +"""${message} + +Revision ID: ${up_revision} +Revises: ${down_revision | comma,n} +Create Date: ${create_date} + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa +${imports if imports else ""} + +# revision identifiers, used by Alembic. +revision: str = ${repr(up_revision)} +down_revision: Union[str, None] = ${repr(down_revision)} +branch_labels: Union[str, Sequence[str], None] = ${repr(branch_labels)} +depends_on: Union[str, Sequence[str], None] = ${repr(depends_on)} + + +def upgrade() -> None: + ${upgrades if upgrades else "pass"} + + +def downgrade() -> None: + ${downgrades if downgrades else "pass"} diff --git a/backend/database/alembic/versions/48d1670daeba_initial_migration.py b/backend/database/alembic/versions/48d1670daeba_initial_migration.py new file mode 100644 index 0000000..de3e277 --- /dev/null +++ b/backend/database/alembic/versions/48d1670daeba_initial_migration.py @@ -0,0 +1,26 @@ +"""initial migration + +Revision ID: 48d1670daeba +Revises: +Create Date: 2024-08-17 09:56:35.223567 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision: str = '48d1670daeba' +down_revision: Union[str, None] = None +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + pass + + +def downgrade() -> None: + pass diff --git a/backend/database/alembic/versions/__pycache__/057af36bed93_initial_migration.cpython-312.pyc b/backend/database/alembic/versions/__pycache__/057af36bed93_initial_migration.cpython-312.pyc new file mode 100755 index 0000000..8b5b5e9 Binary files /dev/null and b/backend/database/alembic/versions/__pycache__/057af36bed93_initial_migration.cpython-312.pyc differ diff --git a/backend/database/alembic/versions/__pycache__/1f3fa17e926c_initial_migration.cpython-312.pyc b/backend/database/alembic/versions/__pycache__/1f3fa17e926c_initial_migration.cpython-312.pyc new file mode 100755 index 0000000..f7acd39 Binary files /dev/null and b/backend/database/alembic/versions/__pycache__/1f3fa17e926c_initial_migration.cpython-312.pyc differ diff --git a/backend/database/alembic/versions/__pycache__/275d2b94cf24_initial_migration.cpython-312.pyc b/backend/database/alembic/versions/__pycache__/275d2b94cf24_initial_migration.cpython-312.pyc new file mode 100755 index 0000000..8edbb25 Binary files /dev/null and b/backend/database/alembic/versions/__pycache__/275d2b94cf24_initial_migration.cpython-312.pyc differ diff --git a/backend/database/alembic/versions/__pycache__/347465e1c4d3_your_message_here.cpython-312.pyc b/backend/database/alembic/versions/__pycache__/347465e1c4d3_your_message_here.cpython-312.pyc new file mode 100755 index 0000000..2e18cc0 Binary files /dev/null and b/backend/database/alembic/versions/__pycache__/347465e1c4d3_your_message_here.cpython-312.pyc differ diff --git a/backend/database/alembic/versions/__pycache__/37aa766db787_add_shuai_column.cpython-312.pyc b/backend/database/alembic/versions/__pycache__/37aa766db787_add_shuai_column.cpython-312.pyc new file mode 100755 index 0000000..cd92e25 Binary files /dev/null and b/backend/database/alembic/versions/__pycache__/37aa766db787_add_shuai_column.cpython-312.pyc differ diff --git a/backend/database/alembic/versions/__pycache__/37be8eb74fa4_initial_migration.cpython-312.pyc b/backend/database/alembic/versions/__pycache__/37be8eb74fa4_initial_migration.cpython-312.pyc new file mode 100755 index 0000000..3d79439 Binary files /dev/null and b/backend/database/alembic/versions/__pycache__/37be8eb74fa4_initial_migration.cpython-312.pyc differ diff --git a/backend/database/alembic/versions/__pycache__/3c01d541a925_initial_migration.cpython-312.pyc b/backend/database/alembic/versions/__pycache__/3c01d541a925_initial_migration.cpython-312.pyc new file mode 100755 index 0000000..e105f84 Binary files /dev/null and b/backend/database/alembic/versions/__pycache__/3c01d541a925_initial_migration.cpython-312.pyc differ diff --git a/backend/database/alembic/versions/__pycache__/3cc884e2a8d3_initial_migration.cpython-312.pyc b/backend/database/alembic/versions/__pycache__/3cc884e2a8d3_initial_migration.cpython-312.pyc new file mode 100755 index 0000000..34ed1cd Binary files /dev/null and b/backend/database/alembic/versions/__pycache__/3cc884e2a8d3_initial_migration.cpython-312.pyc differ diff --git a/backend/database/alembic/versions/__pycache__/40990bd8e401_add_is_superuser_column_to_admin_table2.cpython-312.pyc b/backend/database/alembic/versions/__pycache__/40990bd8e401_add_is_superuser_column_to_admin_table2.cpython-312.pyc new file mode 100755 index 0000000..4dc634d Binary files /dev/null and b/backend/database/alembic/versions/__pycache__/40990bd8e401_add_is_superuser_column_to_admin_table2.cpython-312.pyc differ diff --git a/backend/database/alembic/versions/__pycache__/48d1670daeba_initial_migration.cpython-312.pyc b/backend/database/alembic/versions/__pycache__/48d1670daeba_initial_migration.cpython-312.pyc new file mode 100644 index 0000000..a903be0 Binary files /dev/null and b/backend/database/alembic/versions/__pycache__/48d1670daeba_initial_migration.cpython-312.pyc differ diff --git a/backend/database/alembic/versions/__pycache__/4f0882096885_your_message_here.cpython-312.pyc b/backend/database/alembic/versions/__pycache__/4f0882096885_your_message_here.cpython-312.pyc new file mode 100755 index 0000000..581ea87 Binary files /dev/null and b/backend/database/alembic/versions/__pycache__/4f0882096885_your_message_here.cpython-312.pyc differ diff --git a/backend/database/alembic/versions/__pycache__/56e6221ef11e_add_is_superuser_column_to_admin_table3.cpython-312.pyc b/backend/database/alembic/versions/__pycache__/56e6221ef11e_add_is_superuser_column_to_admin_table3.cpython-312.pyc new file mode 100755 index 0000000..f96db2a Binary files /dev/null and b/backend/database/alembic/versions/__pycache__/56e6221ef11e_add_is_superuser_column_to_admin_table3.cpython-312.pyc differ diff --git a/backend/database/alembic/versions/__pycache__/69535bfa3a9c_add_is_superuser_column_to_admin_table.cpython-312.pyc b/backend/database/alembic/versions/__pycache__/69535bfa3a9c_add_is_superuser_column_to_admin_table.cpython-312.pyc new file mode 100755 index 0000000..287b892 Binary files /dev/null and b/backend/database/alembic/versions/__pycache__/69535bfa3a9c_add_is_superuser_column_to_admin_table.cpython-312.pyc differ diff --git a/backend/database/alembic/versions/__pycache__/736afbdbbcc2_add_is_superuser_column_to_admin_table.cpython-312.pyc b/backend/database/alembic/versions/__pycache__/736afbdbbcc2_add_is_superuser_column_to_admin_table.cpython-312.pyc new file mode 100755 index 0000000..0ed35f2 Binary files /dev/null and b/backend/database/alembic/versions/__pycache__/736afbdbbcc2_add_is_superuser_column_to_admin_table.cpython-312.pyc differ diff --git a/backend/database/alembic/versions/__pycache__/75e8f8be9a13_initial_migration.cpython-312.pyc b/backend/database/alembic/versions/__pycache__/75e8f8be9a13_initial_migration.cpython-312.pyc new file mode 100755 index 0000000..6778baa Binary files /dev/null and b/backend/database/alembic/versions/__pycache__/75e8f8be9a13_initial_migration.cpython-312.pyc differ diff --git a/backend/database/alembic/versions/__pycache__/8c6b184949d3_initial_migration.cpython-312.pyc b/backend/database/alembic/versions/__pycache__/8c6b184949d3_initial_migration.cpython-312.pyc new file mode 100755 index 0000000..4c69767 Binary files /dev/null and b/backend/database/alembic/versions/__pycache__/8c6b184949d3_initial_migration.cpython-312.pyc differ diff --git a/backend/database/alembic/versions/__pycache__/8ed08d2a41d5_add_shuai_column_to_admin_table.cpython-312.pyc b/backend/database/alembic/versions/__pycache__/8ed08d2a41d5_add_shuai_column_to_admin_table.cpython-312.pyc new file mode 100755 index 0000000..5f76358 Binary files /dev/null and b/backend/database/alembic/versions/__pycache__/8ed08d2a41d5_add_shuai_column_to_admin_table.cpython-312.pyc differ diff --git a/backend/database/alembic/versions/__pycache__/90ad915d3816_initial_migration.cpython-312.pyc b/backend/database/alembic/versions/__pycache__/90ad915d3816_initial_migration.cpython-312.pyc new file mode 100755 index 0000000..dfd4845 Binary files /dev/null and b/backend/database/alembic/versions/__pycache__/90ad915d3816_initial_migration.cpython-312.pyc differ diff --git a/backend/database/alembic/versions/__pycache__/92f06dcf4f92_initial_migration.cpython-312.pyc b/backend/database/alembic/versions/__pycache__/92f06dcf4f92_initial_migration.cpython-312.pyc new file mode 100755 index 0000000..84309fd Binary files /dev/null and b/backend/database/alembic/versions/__pycache__/92f06dcf4f92_initial_migration.cpython-312.pyc differ diff --git a/backend/database/alembic/versions/__pycache__/a54285218ba6_your_message_here.cpython-312.pyc b/backend/database/alembic/versions/__pycache__/a54285218ba6_your_message_here.cpython-312.pyc new file mode 100755 index 0000000..5f23a97 Binary files /dev/null and b/backend/database/alembic/versions/__pycache__/a54285218ba6_your_message_here.cpython-312.pyc differ diff --git a/backend/database/alembic/versions/__pycache__/abe61746079e_initial_migration.cpython-312.pyc b/backend/database/alembic/versions/__pycache__/abe61746079e_initial_migration.cpython-312.pyc new file mode 100755 index 0000000..b96f9aa Binary files /dev/null and b/backend/database/alembic/versions/__pycache__/abe61746079e_initial_migration.cpython-312.pyc differ diff --git a/backend/database/alembic/versions/__pycache__/b6710aeaa23a_initial_migration.cpython-312.pyc b/backend/database/alembic/versions/__pycache__/b6710aeaa23a_initial_migration.cpython-312.pyc new file mode 100755 index 0000000..5629fb1 Binary files /dev/null and b/backend/database/alembic/versions/__pycache__/b6710aeaa23a_initial_migration.cpython-312.pyc differ diff --git a/backend/database/alembic/versions/__pycache__/bc4e660c15ff_add_is_superuser_column_to_admin_table.cpython-312.pyc b/backend/database/alembic/versions/__pycache__/bc4e660c15ff_add_is_superuser_column_to_admin_table.cpython-312.pyc new file mode 100755 index 0000000..6c8a0c9 Binary files /dev/null and b/backend/database/alembic/versions/__pycache__/bc4e660c15ff_add_is_superuser_column_to_admin_table.cpython-312.pyc differ diff --git a/backend/database/alembic/versions/__pycache__/bf6edcc4f46f_initial_migration.cpython-312.pyc b/backend/database/alembic/versions/__pycache__/bf6edcc4f46f_initial_migration.cpython-312.pyc new file mode 100755 index 0000000..603f5f8 Binary files /dev/null and b/backend/database/alembic/versions/__pycache__/bf6edcc4f46f_initial_migration.cpython-312.pyc differ diff --git a/backend/database/alembic/versions/__pycache__/ca7f41eac79a_initial_migration.cpython-312.pyc b/backend/database/alembic/versions/__pycache__/ca7f41eac79a_initial_migration.cpython-312.pyc new file mode 100644 index 0000000..9ca6b81 Binary files /dev/null and b/backend/database/alembic/versions/__pycache__/ca7f41eac79a_initial_migration.cpython-312.pyc differ diff --git a/backend/database/alembic/versions/__pycache__/d2eaab3c2b3f_add_is_superuser_column_to_admin_table.cpython-312.pyc b/backend/database/alembic/versions/__pycache__/d2eaab3c2b3f_add_is_superuser_column_to_admin_table.cpython-312.pyc new file mode 100755 index 0000000..037f2c0 Binary files /dev/null and b/backend/database/alembic/versions/__pycache__/d2eaab3c2b3f_add_is_superuser_column_to_admin_table.cpython-312.pyc differ diff --git a/backend/database/alembic/versions/__pycache__/e8584ccd4c53_initial_migration.cpython-312.pyc b/backend/database/alembic/versions/__pycache__/e8584ccd4c53_initial_migration.cpython-312.pyc new file mode 100755 index 0000000..2539e37 Binary files /dev/null and b/backend/database/alembic/versions/__pycache__/e8584ccd4c53_initial_migration.cpython-312.pyc differ diff --git a/backend/database/alembic/versions/__pycache__/ec2675172a66_initial_migration.cpython-312.pyc b/backend/database/alembic/versions/__pycache__/ec2675172a66_initial_migration.cpython-312.pyc new file mode 100755 index 0000000..bba46f1 Binary files /dev/null and b/backend/database/alembic/versions/__pycache__/ec2675172a66_initial_migration.cpython-312.pyc differ diff --git a/backend/database/alembic/versions/__pycache__/f2b940705f3d_add_shuai_column_to_admin_table.cpython-312.pyc b/backend/database/alembic/versions/__pycache__/f2b940705f3d_add_shuai_column_to_admin_table.cpython-312.pyc new file mode 100755 index 0000000..34d4fb9 Binary files /dev/null and b/backend/database/alembic/versions/__pycache__/f2b940705f3d_add_shuai_column_to_admin_table.cpython-312.pyc differ diff --git a/backend/database/alembic/versions/__pycache__/fda5e617cf2b_initial_migration.cpython-312.pyc b/backend/database/alembic/versions/__pycache__/fda5e617cf2b_initial_migration.cpython-312.pyc new file mode 100755 index 0000000..d975f2c Binary files /dev/null and b/backend/database/alembic/versions/__pycache__/fda5e617cf2b_initial_migration.cpython-312.pyc differ diff --git a/backend/database/database.py b/backend/database/database.py new file mode 100755 index 0000000..ffeb039 --- /dev/null +++ b/backend/database/database.py @@ -0,0 +1,21 @@ +from sqlalchemy import create_engine +from sqlalchemy.orm import sessionmaker +from sqlalchemy.ext.declarative import declarative_base + +DATABASE_URL = "postgresql://fastapi:Sj89061189@localhost/fastapi" + +engine = create_engine(DATABASE_URL) +#不会提交事务 不会自动刷新 不会预加载 +SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) + +#ORM 模型都将继承自 Base +Base = declarative_base() + +def get_db(): + #创建一个数据库会话 + db = SessionLocal() + #发送异常正确关闭 + try: + yield db + finally: + db.close() \ No newline at end of file diff --git a/backend/main.py b/backend/main.py new file mode 100755 index 0000000..3092769 --- /dev/null +++ b/backend/main.py @@ -0,0 +1,35 @@ +from fastapi import FastAPI +app = FastAPI() + +from fastapi.middleware.cors import CORSMiddleware +origins = [ + "*", + # "http://localhost:7999", + # "http://www.gdsfs.top:2023", + # "http://localhost:8000", + # "http://localhost:2023", + # "https://www.gdsfs.top", # 修正了末尾的换行符和空格 + # "http://www.gdsfs.top:7999", # 修正了末尾的换行符和空格 + # "https://www.gdsfs.top:7999", # 修正了中间的空格 +] +app.add_middleware( + CORSMiddleware, + allow_origins=origins, + allow_credentials=True, + allow_methods=["*"], # 允许所有 HTTP 方法 + allow_headers=["*"], # 允许所有头部 +) + +from .database.database import engine +from .models.admin import Base +from .models.products import Base +# from .models import Base # 从 models 包导入所有子模块 +# 在应用启动时创建表 +Base.metadata.create_all(bind=engine) + +from .routers import admin,products +app.include_router(admin.router, prefix="/admin", tags=["员工"]) +app.include_router(products.router, prefix="/products", tags=["产品"]) + + + diff --git a/backend/models/__init__.py b/backend/models/__init__.py new file mode 100755 index 0000000..b5901ce --- /dev/null +++ b/backend/models/__init__.py @@ -0,0 +1,5 @@ +from . import admin, products # 导入所有包含模型的子模块 +from .admin import Base # 导入 admin 模块中的 Base + +# models/products/__init__.py +from .products import Base # 导入 products 模块中的 Base \ No newline at end of file diff --git a/backend/models/__pycache__/__init__.cpython-312.pyc b/backend/models/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000..65a18dc Binary files /dev/null and b/backend/models/__pycache__/__init__.cpython-312.pyc differ diff --git a/backend/models/__pycache__/admin.cpython-312.pyc b/backend/models/__pycache__/admin.cpython-312.pyc new file mode 100755 index 0000000..2962d83 Binary files /dev/null and b/backend/models/__pycache__/admin.cpython-312.pyc differ diff --git a/backend/models/__pycache__/products.cpython-312.pyc b/backend/models/__pycache__/products.cpython-312.pyc new file mode 100755 index 0000000..9c11d45 Binary files /dev/null and b/backend/models/__pycache__/products.cpython-312.pyc differ diff --git a/backend/models/admin.py b/backend/models/admin.py new file mode 100755 index 0000000..d74d2eb --- /dev/null +++ b/backend/models/admin.py @@ -0,0 +1,23 @@ + + +from sqlalchemy import Column, Integer, String, Boolean + +#ORM基类 +from sqlalchemy.ext.declarative import declarative_base + +#创建ORM +Base = declarative_base() + +class Admin(Base): + __tablename__ = "admin" + + #字段 主键 索引 + id = Column(Integer, primary_key=True, index=True) + + name = Column(String, index=True) + #唯一约束 + username = Column(String, unique=True, index=True) + + password = Column(String) + + is_superuser = Column(Boolean, default=False, nullable=False) diff --git a/backend/models/products.py b/backend/models/products.py new file mode 100755 index 0000000..51632f6 --- /dev/null +++ b/backend/models/products.py @@ -0,0 +1,20 @@ + + +from sqlalchemy import Column, Integer, String + +#ORM基类 +from sqlalchemy.ext.declarative import declarative_base + +#创建ORM +Base = declarative_base() + +class Products(Base): + __tablename__ = "products" + + #字段 主键 索引 + id = Column(Integer, primary_key=True, index=True) + #唯一约束 + name = Column(String, unique=True, index=True) + + described = Column(String) + diff --git a/backend/requirements.txt b/backend/requirements.txt new file mode 100755 index 0000000..370cdf3 --- /dev/null +++ b/backend/requirements.txt @@ -0,0 +1,18 @@ +# requirements.txt + +# pip install -r requirements.txt + +fastapi # 检查最新版本以使用最新的功能和修复 +pydantic # 数据验证和设置管理 +asyncpg # 一个快速、纯Python编写的异步PostgreSQL数据库客户端 +sqlalchemy # SQLAlchemy支持ORM(可选,如果需要使用ORM) +python-multipart +uvicorn[standard] +psycopg2-binary +passlib +pyJWT +alembic#数据库迁移 +#fastapi-utils==0.7.1 +# 用于测试 +#pytest==7.1.1 +#pytest-asyncio==0.18.1 diff --git a/backend/routers/__init__.py b/backend/routers/__init__.py new file mode 100755 index 0000000..e69de29 diff --git a/backend/routers/__pycache__/__init__.cpython-312.pyc b/backend/routers/__pycache__/__init__.cpython-312.pyc new file mode 100755 index 0000000..bf3915f Binary files /dev/null and b/backend/routers/__pycache__/__init__.cpython-312.pyc differ diff --git a/backend/routers/__pycache__/admin.cpython-312.pyc b/backend/routers/__pycache__/admin.cpython-312.pyc new file mode 100644 index 0000000..8fea601 Binary files /dev/null and b/backend/routers/__pycache__/admin.cpython-312.pyc differ diff --git a/backend/routers/__pycache__/login.cpython-312.pyc b/backend/routers/__pycache__/login.cpython-312.pyc new file mode 100755 index 0000000..7dda5af Binary files /dev/null and b/backend/routers/__pycache__/login.cpython-312.pyc differ diff --git a/backend/routers/__pycache__/products.cpython-312.pyc b/backend/routers/__pycache__/products.cpython-312.pyc new file mode 100755 index 0000000..bc790a3 Binary files /dev/null and b/backend/routers/__pycache__/products.cpython-312.pyc differ diff --git a/backend/routers/admin.py b/backend/routers/admin.py new file mode 100755 index 0000000..b2d3974 --- /dev/null +++ b/backend/routers/admin.py @@ -0,0 +1,133 @@ +from fastapi import APIRouter, Depends, HTTPException, status +router = APIRouter() +from sqlalchemy.orm import Session +from datetime import datetime, timedelta +from passlib.context import CryptContext +from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm +from typing import Optional +import jwt +from ..database.database import get_db +from ..models.admin import Admin as AdminModel +from ..schemas.admin import AdminCreate ,AdminSearchAll,AdminUpdate +from ..main import app +import re +#token加索锁#注意要完整路径 +SECRET_KEY = "87d8876300bd2591a738e8ec88fc721bf57ed44944531708c4bdae88d5e9beb5" +ALGORITHM = "HS256" +ACCESS_TOKEN_EXPIRE_MINUTES = 30 +def verify_password(plain_password:str, hashed_password:str): + #校验明文密码 + return pwd_context.verify(plain_password, hashed_password) +def authenticate_admin(username: str, password: str, db: Session): + employee = db.query(AdminModel).filter(AdminModel.username == username).first() + if not employee or not verify_password(password, employee.password): + return None + return employee +#创建超级管理员 +@app.post("/admin", response_model=dict) +async def create_admin(admin: AdminCreate, db: Session = Depends(get_db)): + superuser_exists = db.query(AdminModel).filter(AdminModel.is_superuser == True).first() + if superuser_exists: + raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail="username already registered") + new_admin = AdminModel( + name="admin", + username=admin.username, + password=get_password_hash(admin.password), + is_superuser=True, + ) + db.add(new_admin) + db.commit() + db.refresh(new_admin) + return {"message": "hr_admin created successfully"} +@app.post("/", response_model=dict) +async def login_for_access_token(form_data: OAuth2PasswordRequestForm = Depends(), db: Session = Depends(get_db)): + authenticated_employee = authenticate_admin(form_data.username, form_data.password, db) + if not authenticated_employee: + raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="Incorrect usernamel or password") + access_token_expires = timedelta(minutes=ACCESS_TOKEN_EXPIRE_MINUTES) + access_token = create_access_token(data={"sub": authenticated_employee.username}, expires_delta=access_token_expires) + return {"access_token": access_token, "token_type": "bearer"} +def create_access_token(data: dict, expires_delta: Optional[timedelta] = None): + to_encode = data.copy() + if expires_delta: + expire = datetime.utcnow() + expires_delta + else: + expire = datetime.utcnow() + timedelta(minutes=15) + to_encode.update({"exp": expire}) + encoded_jwt = jwt.encode(to_encode, SECRET_KEY, algorithm=ALGORITHM) + + return encoded_jwt +oauth2_scheme = OAuth2PasswordBearer(tokenUrl="/") + +#哈希功能 +pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto") +def get_password_hash(password): + return pwd_context.hash(password) +# 定义手机号码和密码强度的正则表达式 +PHONE_REGEX = r'^1[3-9]\d{9}$' # 中国手机号码的正则表达式 +PASSWORD_REGEX = r'^(?=.*\d)(?=.*[a-zA-Z]).{8,}$' # 至少包含一个数字和一个字母,长度至少8位 +#增加用户 +@router.post("/create", response_model=dict) +async def create(admin: AdminCreate, db: Session = Depends(get_db)): + # 验证手机号码 + if not re.match(PHONE_REGEX, admin.username): + raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail="Invalid phone number") + + # 验证密码强度 + if not re.match(PASSWORD_REGEX, admin.password): + raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail="Password must contain at least one digit and one letter, and be at least 8 characters long") + + existing_username = db.query(AdminModel).filter(AdminModel.username == admin.username).first() + #已经存在用户 + if existing_username: + raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail="username already registered") + #密码哈希 + new_admin = AdminModel( + name=admin.name, + username=admin.username, + password=get_password_hash(admin.password) + ) + db.add(new_admin) + db.commit() + db.refresh(new_admin) + return {"message": "hr_admin created successfully"} + +#删除用户 +@router.delete("/{admin_id}", response_model=dict) +async def delete(admin_id: int, db: Session = Depends(get_db), token: str = Depends(oauth2_scheme)): + # ID查找员工 + admin = db.query(AdminModel).filter(AdminModel.id == admin_id).first() + if not admin: + raise HTTPException(status_code=404, detail="admin not found") + # 删除员工 + db.delete(admin) + db.commit() + return {"message": f"Deleted admin {admin_id}"} +#更新密码用户名 +@router.put("/{user_id}", response_model=AdminSearchAll) # 注意:这里假设AdminSearchAll是你想要返回的模型,如果不是请替换 +async def update(user_id: int, updated_employee: AdminUpdate, db: Session = Depends(get_db), token: str = Depends(oauth2_scheme)): + employee = db.query(AdminModel).filter(AdminModel.id == user_id).first() + if not employee: + raise HTTPException(status_code=404, detail="Employee not found") + + # 检查是否有提供新的密码,并且密码不为空 + if updated_employee.password: + # 对密码进行哈希处理 + hashed_password = get_password_hash(updated_employee.password) + # 更新员工的密码字段 + employee.password = hashed_password + + # 更新其他员工信息(排除未设置的字段) + for key, value in updated_employee.dict(exclude_unset=True, exclude={'password'}).items(): # 如果password已处理,这里排除它 + setattr(employee, key, value) + + db.commit() + db.refresh(employee) + + return employee +#查寻整张表 +@router.get("/search", response_model=list[AdminSearchAll]) +async def search_all(db: Session = Depends(get_db) ,token: str = Depends(oauth2_scheme)): + admin = db.query(AdminModel).all() + return admin +#, token: str = Depends(oauth2_scheme) \ No newline at end of file diff --git a/backend/routers/products.py b/backend/routers/products.py new file mode 100755 index 0000000..48a16ee --- /dev/null +++ b/backend/routers/products.py @@ -0,0 +1,48 @@ +from fastapi import APIRouter, Depends, HTTPException +router = APIRouter() +from sqlalchemy.orm import Session +from fastapi.security import OAuth2PasswordBearer +from ..database.database import get_db +from ..models.products import Products as ProductsModel +from ..schemas.products import ProductsCreate ,ProductsSearchAll,ProductsUpdate +#加token +oauth2_scheme = OAuth2PasswordBearer(tokenUrl="/") +#增加 +@router.post("/create", response_model=dict) +async def create(Products: ProductsCreate, db: Session = Depends(get_db),token: str = Depends(oauth2_scheme)): + new_self = ProductsModel( + name=Products.name, + described=Products.described, + ) + db.add(new_self) + db.commit() + db.refresh(new_self) + return {"message": "hr_Products created successfully"} + +#删除 +@router.delete("/{router_id}", response_model=dict) +async def delete(router_id: int, db: Session = Depends(get_db), token: str = Depends(oauth2_scheme)): + # ID查找员工 + Products = db.query(ProductsModel).filter(ProductsModel.id == router_id).first() + if not Products: + raise HTTPException(status_code=404, detail="Products not found") + # 删除员工 + db.delete(Products) + db.commit() + return {"message": f"Deleted Products {router_id}"} +#更新 +@router.put("/{router_id}", response_model=ProductsSearchAll) # 注意:这里假设ProductsSearchAll是你想要返回的模型,如果不是请替换 +async def update(router_id: int, ProductsUpdatesql: ProductsUpdate, db: Session = Depends(get_db), token: str = Depends(oauth2_scheme)): + sql_id = db.query(ProductsModel).filter(ProductsModel.id == router_id).first() + if not sql_id: + raise HTTPException(status_code=404, detail="Employee not found") + for key, value in ProductsUpdatesql.dict(exclude_unset=True).items(): + setattr(sql_id, key, value) + db.commit() + db.refresh(sql_id) + return sql_id +#查寻整张表 +@router.get("/search", response_model=list[ProductsSearchAll]) +async def search_all(db: Session = Depends(get_db), token: str = Depends(oauth2_scheme)): + Products = db.query(ProductsModel).all() + return Products \ No newline at end of file diff --git a/backend/schemas/__init__.py b/backend/schemas/__init__.py new file mode 100755 index 0000000..e69de29 diff --git a/backend/schemas/__pycache__/__init__.cpython-312.pyc b/backend/schemas/__pycache__/__init__.cpython-312.pyc new file mode 100755 index 0000000..c8ab617 Binary files /dev/null and b/backend/schemas/__pycache__/__init__.cpython-312.pyc differ diff --git a/backend/schemas/__pycache__/admin.cpython-312.pyc b/backend/schemas/__pycache__/admin.cpython-312.pyc new file mode 100755 index 0000000..f27c50a Binary files /dev/null and b/backend/schemas/__pycache__/admin.cpython-312.pyc differ diff --git a/backend/schemas/__pycache__/products.cpython-312.pyc b/backend/schemas/__pycache__/products.cpython-312.pyc new file mode 100755 index 0000000..abcee8d Binary files /dev/null and b/backend/schemas/__pycache__/products.cpython-312.pyc differ diff --git a/backend/schemas/admin.py b/backend/schemas/admin.py new file mode 100755 index 0000000..71ea3de --- /dev/null +++ b/backend/schemas/admin.py @@ -0,0 +1,21 @@ + +from pydantic import BaseModel +# 用于定义数据验证模型,通常用于 API 层。 +# 不直接与数据库交互,而是用于验证请求数据是否符合预期的结构。 +# 支持数据的序列化和反序列化,方便处理 JSON 数据。 +#创建基础模型 +class Admin(BaseModel): + name: str | None = None + username:str + password:str + is_superuser:bool | None = None +#创建 +class AdminCreate(Admin): + pass +#更新 +class AdminUpdate(Admin): + pass +#查询 +class AdminSearchAll(Admin): + id: int + diff --git a/backend/schemas/products.py b/backend/schemas/products.py new file mode 100755 index 0000000..2ea45ae --- /dev/null +++ b/backend/schemas/products.py @@ -0,0 +1,22 @@ + +from pydantic import BaseModel +from typing import Optional + +# 用于定义数据验证模型,通常用于 API 层。 +# 不直接与数据库交互,而是用于验证请求数据是否符合预期的结构。 +# 支持数据的序列化和反序列化,方便处理 JSON 数据。 +#创建基础模型 +class Products(BaseModel): + name: str + described:str +#创建 +class ProductsCreate(Products): + pass +#更新 +class ProductsUpdate(Products): + name: Optional[str] = None # 设置 name 为可选字段 + +#查询 +class ProductsSearchAll(Products): + id: int + diff --git a/backend/vue3README.md b/backend/vue3README.md new file mode 100755 index 0000000..ed3b44c --- /dev/null +++ b/backend/vue3README.md @@ -0,0 +1,25 @@ + +npm install +axios +my-vue-app/ +├── node_modules/ # 通过 npm 或 yarn 安装的项目依赖包 +├── public/ # 存放静态资源和公共资源 +│ ├── favicon.ico # 网站图标 +│ ├── index.html # HTML 模板文件 +│ └── ... # 其他静态资源如图片、字体等 +├── src/ # 源代码目录 +│ ├── App.vue # 根组件 +│ ├── main.js # 应用入口文件 +│ ├── assets/ # 静态资源,如图片、样式文件等 +│ ├── components/ # 全局可复用的组件 +│ ├── views/ # 视图组件 +│ ├── router/ # 路由配置 +│ ├── store/ # Vuex 状态管理 +│ ├── utils/ # 工具函数 +│ └── ... +├── .gitignore # Git 忽略文件配置 +├── package.json # 项目元数据和依赖关系 +├── vue.config.js # Vue CLI 配置文件 +├── README.md # 项目文档 +└── ... \ No newline at end of file diff --git a/vue/.env b/vue/.env new file mode 100644 index 0000000..e69de29 diff --git a/vue/.gitignore b/vue/.gitignore new file mode 100755 index 0000000..8ee54e8 --- /dev/null +++ b/vue/.gitignore @@ -0,0 +1,30 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +.DS_Store +dist +dist-ssr +coverage +*.local + +/cypress/videos/ +/cypress/screenshots/ + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +*.tsbuildinfo diff --git a/vue/.npmignore b/vue/.npmignore new file mode 100755 index 0000000..4c6d41b --- /dev/null +++ b/vue/.npmignore @@ -0,0 +1,5 @@ +node_modules/ +test/ +README.md +CHANGELOG.md +LICENSE diff --git a/vue/.vscode/extensions.json b/vue/.vscode/extensions.json new file mode 100755 index 0000000..a7cea0b --- /dev/null +++ b/vue/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["Vue.volar"] +} diff --git a/vue/README.md b/vue/README.md new file mode 100755 index 0000000..3d5cfa8 --- /dev/null +++ b/vue/README.md @@ -0,0 +1,37 @@ +# vue + +This template should help get you started developing with Vue 3 in Vite. + +## Recommended IDE Setup + +[VSCode](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar) (and disable Vetur). + +## Type Support for `.vue` Imports in TS + +TypeScript cannot handle type information for `.vue` imports by default, so we replace the `tsc` CLI with `vue-tsc` for type checking. In editors, we need [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar) to make the TypeScript language service aware of `.vue` types. + +## Customize configuration + +See [Vite Configuration Reference](https://vitejs.dev/config/). + +## Project Setup + +```sh +npm install +``` + +### Compile and Hot-Reload for Development + +```sh +npm run dev +``` + +### Type-Check, Compile and Minify for Production + +```sh +npm run build +``` +https://www.gzsjfz.top/web#cids=1&action=menu +https://www.gzsjfz.top/web#menu_id=339&cids=1&action=372&model=product.template&view_type=kanban +https://www.gzsjfz.top/web#id=2509&menu_id=339&cids=1&action=372&model=product.template&view_type=form +https://www.gzsjfz.top/web#action=372&model=product.template&view_type=list&menu_id=339&cids=1 \ No newline at end of file diff --git a/vue/env.d.ts b/vue/env.d.ts new file mode 100755 index 0000000..7d0ff9e --- /dev/null +++ b/vue/env.d.ts @@ -0,0 +1 @@ +/// diff --git a/vue/index.html b/vue/index.html new file mode 100755 index 0000000..7217e0b --- /dev/null +++ b/vue/index.html @@ -0,0 +1,23 @@ + + + + + + + 时时6叔 + + +
+ + + + \ No newline at end of file diff --git a/vue/package-lock.json b/vue/package-lock.json new file mode 100755 index 0000000..89f14d3 --- /dev/null +++ b/vue/package-lock.json @@ -0,0 +1,1901 @@ +{ + "name": "vue", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "vue", + "version": "0.0.0", + "dependencies": { + "axios": "^1.7.3", + "element-plus": "^2.8.0", + "pinia": "^2.1.7", + "vue": "^3.4.29", + "vue-router": "^4.3.3" + }, + "devDependencies": { + "@tsconfig/node20": "^20.1.4", + "@types/node": "^20.14.5", + "@vitejs/plugin-vue": "^5.0.5", + "@vue/tsconfig": "^0.5.1", + "npm-run-all2": "^6.2.0", + "typescript": "~5.4.0", + "vite": "^5.3.1", + "vue-tsc": "^2.0.21" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", + "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.25.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.3.tgz", + "integrity": "sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.25.2" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.2.tgz", + "integrity": "sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.24.8", + "@babel/helper-validator-identifier": "^7.24.7", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@ctrl/tinycolor": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz", + "integrity": "sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/@element-plus/icons-vue": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@element-plus/icons-vue/-/icons-vue-2.3.1.tgz", + "integrity": "sha512-XxVUZv48RZAd87ucGS48jPf6pKu0yV5UCg9f4FFwtrYxXOwWuVJo6wOvSLKEoMQKjv8GsX/mhP6UsC1lRwbUWg==", + "license": "MIT", + "peerDependencies": { + "vue": "^3.2.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.7.tgz", + "integrity": "sha512-yDzVT/Lm101nQ5TCVeK65LtdN7Tj4Qpr9RTXJ2vPFLqtLxwOrpoxAHAJI8J3yYWUc40J0BDBheaitK5SJmno2g==", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.7" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.6.10", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.10.tgz", + "integrity": "sha512-fskgCFv8J8OamCmyun8MfjB1Olfn+uZKjOKZ0vhYF3gRmEUXcGOjxWL8bBr7i4kIuPZ2KD2S3EUIOxnjC8kl2A==", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.6.0", + "@floating-ui/utils": "^0.2.7" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.7.tgz", + "integrity": "sha512-X8R8Oj771YRl/w+c1HqAC1szL8zWQRwFvgDwT129k9ACdBoud/+/rX9V0qiMl6LWUdP9voC2nDVZYPMQQsb6eA==", + "license": "MIT" + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "license": "MIT" + }, + "node_modules/@popperjs/core": { + "name": "@sxzz/popperjs-es", + "version": "2.11.7", + "resolved": "https://registry.npmjs.org/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz", + "integrity": "sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.20.0.tgz", + "integrity": "sha512-TSpWzflCc4VGAUJZlPpgAJE1+V60MePDQnBd7PPkpuEmOy8i87aL6tinFGKBFKuEDikYpig72QzdT3QPYIi+oA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.20.0.tgz", + "integrity": "sha512-u00Ro/nok7oGzVuh/FMYfNoGqxU5CPWz1mxV85S2w9LxHR8OoMQBuSk+3BKVIDYgkpeOET5yXkx90OYFc+ytpQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.20.0.tgz", + "integrity": "sha512-uFVfvzvsdGtlSLuL0ZlvPJvl6ZmrH4CBwLGEFPe7hUmf7htGAN+aXo43R/V6LATyxlKVC/m6UsLb7jbG+LG39Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.20.0.tgz", + "integrity": "sha512-xbrMDdlev53vNXexEa6l0LffojxhqDTBeL+VUxuuIXys4x6xyvbKq5XqTXBCEUA8ty8iEJblHvFaWRJTk/icAQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.20.0.tgz", + "integrity": "sha512-jMYvxZwGmoHFBTbr12Xc6wOdc2xA5tF5F2q6t7Rcfab68TT0n+r7dgawD4qhPEvasDsVpQi+MgDzj2faOLsZjA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.20.0.tgz", + "integrity": "sha512-1asSTl4HKuIHIB1GcdFHNNZhxAYEdqML/MW4QmPS4G0ivbEcBr1JKlFLKsIRqjSwOBkdItn3/ZDlyvZ/N6KPlw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.20.0.tgz", + "integrity": "sha512-COBb8Bkx56KldOYJfMf6wKeYJrtJ9vEgBRAOkfw6Ens0tnmzPqvlpjZiLgkhg6cA3DGzCmLmmd319pmHvKWWlQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.20.0.tgz", + "integrity": "sha512-+it+mBSyMslVQa8wSPvBx53fYuZK/oLTu5RJoXogjk6x7Q7sz1GNRsXWjn6SwyJm8E/oMjNVwPhmNdIjwP135Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.20.0.tgz", + "integrity": "sha512-yAMvqhPfGKsAxHN8I4+jE0CpLWD8cv4z7CK7BMmhjDuz606Q2tFKkWRY8bHR9JQXYcoLfopo5TTqzxgPUjUMfw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.20.0.tgz", + "integrity": "sha512-qmuxFpfmi/2SUkAw95TtNq/w/I7Gpjurx609OOOV7U4vhvUhBcftcmXwl3rqAek+ADBwSjIC4IVNLiszoj3dPA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.20.0.tgz", + "integrity": "sha512-I0BtGXddHSHjV1mqTNkgUZLnS3WtsqebAXv11D5BZE/gfw5KoyXSAXVqyJximQXNvNzUo4GKlCK/dIwXlz+jlg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.20.0.tgz", + "integrity": "sha512-y+eoL2I3iphUg9tN9GB6ku1FA8kOfmF4oUEWhztDJ4KXJy1agk/9+pejOuZkNFhRwHAOxMsBPLbXPd6mJiCwew==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.20.0.tgz", + "integrity": "sha512-hM3nhW40kBNYUkZb/r9k2FKK+/MnKglX7UYd4ZUy5DJs8/sMsIbqWK2piZtVGE3kcXVNj3B2IrUYROJMMCikNg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.20.0.tgz", + "integrity": "sha512-psegMvP+Ik/Bg7QRJbv8w8PAytPA7Uo8fpFjXyCRHWm6Nt42L+JtoqH8eDQ5hRP7/XW2UiIriy1Z46jf0Oa1kA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.20.0.tgz", + "integrity": "sha512-GabekH3w4lgAJpVxkk7hUzUf2hICSQO0a/BLFA11/RMxQT92MabKAqyubzDZmMOC/hcJNlc+rrypzNzYl4Dx7A==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.20.0.tgz", + "integrity": "sha512-aJ1EJSuTdGnM6qbVC4B5DSmozPTqIag9fSzXRNNo+humQLG89XpPgdt16Ia56ORD7s+H8Pmyx44uczDQ0yDzpg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@tsconfig/node20": { + "version": "20.1.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node20/-/node20-20.1.4.tgz", + "integrity": "sha512-sqgsT69YFeLWf5NtJ4Xq/xAF8p4ZQHlmGW74Nu2tD4+g5fAsposc4ZfaaPixVu4y01BEiDCWLRDCvDM5JOsRxg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/lodash": { + "version": "4.17.7", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.7.tgz", + "integrity": "sha512-8wTvZawATi/lsmNu10/j2hk1KEP0IvjubqPE3cu1Xz7xfXXt5oCq3SNUz4fMIP4XGF9Ky+Ue2tBA3hcS7LSBlA==", + "license": "MIT" + }, + "node_modules/@types/lodash-es": { + "version": "4.17.12", + "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.12.tgz", + "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==", + "license": "MIT", + "dependencies": { + "@types/lodash": "*" + } + }, + "node_modules/@types/node": { + "version": "20.14.14", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.14.tgz", + "integrity": "sha512-d64f00982fS9YoOgJkAMolK7MN8Iq3TDdVjchbYHdEmjth/DHowx82GnoA+tVUAN+7vxfYUgAzi+JXbKNd2SDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/web-bluetooth": { + "version": "0.0.16", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz", + "integrity": "sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==", + "license": "MIT" + }, + "node_modules/@vitejs/plugin-vue": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.1.2.tgz", + "integrity": "sha512-nY9IwH12qeiJqumTCLJLE7IiNx7HZ39cbHaysEUd+Myvbz9KAqd2yq+U01Kab1R/H1BmiyM2ShTYlNH32Fzo3A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "vite": "^5.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@volar/language-core": { + "version": "2.4.0-alpha.18", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.0-alpha.18.tgz", + "integrity": "sha512-JAYeJvYQQROmVRtSBIczaPjP3DX4QW1fOqW1Ebs0d3Y3EwSNRglz03dSv0Dm61dzd0Yx3WgTW3hndDnTQqgmyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/source-map": "2.4.0-alpha.18" + } + }, + "node_modules/@volar/source-map": { + "version": "2.4.0-alpha.18", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.0-alpha.18.tgz", + "integrity": "sha512-MTeCV9MUwwsH0sNFiZwKtFrrVZUK6p8ioZs3xFzHc2cvDXHWlYN3bChdQtwKX+FY2HG6H3CfAu1pKijolzIQ8g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@volar/typescript": { + "version": "2.4.0-alpha.18", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.0-alpha.18.tgz", + "integrity": "sha512-sXh5Y8sqGUkgxpMWUGvRXggxYHAVxg0Pa1C42lQZuPDrW6vHJPR0VCK8Sr7WJsAW530HuNQT/ZIskmXtxjybMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.0-alpha.18", + "path-browserify": "^1.0.1", + "vscode-uri": "^3.0.8" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.4.36", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.36.tgz", + "integrity": "sha512-qBkndgpwFKdupmOPoiS10i7oFdN7a+4UNDlezD0GlQ1kuA1pNrscg9g12HnB5E8hrWSuEftRsbJhL1HI2zpJhg==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.24.7", + "@vue/shared": "3.4.36", + "entities": "^5.0.0", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.0" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.4.36", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.36.tgz", + "integrity": "sha512-eEIjy4GwwZTFon/Y+WO8tRRNGqylaRlA79T1RLhUpkOzJ7EtZkkb8MurNfkqY6x6Qiu0R7ESspEF7GkPR/4yYg==", + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.4.36", + "@vue/shared": "3.4.36" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.4.36", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.36.tgz", + "integrity": "sha512-rhuHu7qztt/rNH90dXPTzhB7hLQT2OC4s4GrPVqmzVgPY4XBlfWmcWzn4bIPEWNImt0CjO7kfHAf/1UXOtx3vw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.24.7", + "@vue/compiler-core": "3.4.36", + "@vue/compiler-dom": "3.4.36", + "@vue/compiler-ssr": "3.4.36", + "@vue/shared": "3.4.36", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.10", + "postcss": "^8.4.40", + "source-map-js": "^1.2.0" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.4.36", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.36.tgz", + "integrity": "sha512-Wt1zyheF0zVvRJyhY74uxQbnkXV2Le/JPOrAxooR4rFYKC7cFr+cRqW6RU3cM/bsTy7sdZ83IDuy/gLPSfPGng==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.4.36", + "@vue/shared": "3.4.36" + } + }, + "node_modules/@vue/compiler-vue2": { + "version": "2.7.16", + "resolved": "https://registry.npmjs.org/@vue/compiler-vue2/-/compiler-vue2-2.7.16.tgz", + "integrity": "sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==", + "dev": true, + "license": "MIT", + "dependencies": { + "de-indent": "^1.0.2", + "he": "^1.2.0" + } + }, + "node_modules/@vue/devtools-api": { + "version": "6.6.3", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.3.tgz", + "integrity": "sha512-0MiMsFma/HqA6g3KLKn+AGpL1kgKhFWszC9U29NfpWK5LE7bjeXxySWJrOJ77hBz+TBrBQ7o4QJqbPbqbs8rJw==", + "license": "MIT" + }, + "node_modules/@vue/language-core": { + "version": "2.0.29", + "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.0.29.tgz", + "integrity": "sha512-o2qz9JPjhdoVj8D2+9bDXbaI4q2uZTHQA/dbyZT4Bj1FR9viZxDJnLcKVHfxdn6wsOzRgpqIzJEEmSSvgMvDTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "~2.4.0-alpha.18", + "@vue/compiler-dom": "^3.4.0", + "@vue/compiler-vue2": "^2.7.16", + "@vue/shared": "^3.4.0", + "computeds": "^0.0.1", + "minimatch": "^9.0.3", + "muggle-string": "^0.4.1", + "path-browserify": "^1.0.1" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@vue/reactivity": { + "version": "3.4.36", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.36.tgz", + "integrity": "sha512-wN1aoCwSoqrt1yt8wO0gc13QaC+Vk1o6AoSt584YHNnz6TGDhh1NCMUYgAnvp4HEIkLdGsaC1bvu/P+wpoDEXw==", + "license": "MIT", + "dependencies": { + "@vue/shared": "3.4.36" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.4.36", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.36.tgz", + "integrity": "sha512-9+TR14LAVEerZWLOm/N/sG2DVYhrH2bKgFrbH/FVt/Q8Jdw4OtdcGMRC6Tx8VAo0DA1eqAqrZaX0fbOaOxxZ4A==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.4.36", + "@vue/shared": "3.4.36" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.4.36", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.36.tgz", + "integrity": "sha512-2Qe2fKkLxgZBVvHrG0QMNLL4bsx7Ae88pyXebY2WnQYABpOnGYvA+axMbcF9QwM4yxnsv+aELbC0eiNVns7mGw==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.4.36", + "@vue/runtime-core": "3.4.36", + "@vue/shared": "3.4.36", + "csstype": "^3.1.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.4.36", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.36.tgz", + "integrity": "sha512-2XW90Rq8+Y7S1EIsAuubZVLm0gCU8HYb5mRAruFdwfC3XSOU5/YKePz29csFzsch8hXaY5UHh7ZMddmi1XTJEA==", + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.4.36", + "@vue/shared": "3.4.36" + }, + "peerDependencies": { + "vue": "3.4.36" + } + }, + "node_modules/@vue/shared": { + "version": "3.4.36", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.36.tgz", + "integrity": "sha512-fdPLStwl1sDfYuUftBaUVn2pIrVFDASYerZSrlBvVBfylObPA1gtcWJHy5Ox8jLEJ524zBibss488Q3SZtU1uA==", + "license": "MIT" + }, + "node_modules/@vue/tsconfig": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@vue/tsconfig/-/tsconfig-0.5.1.tgz", + "integrity": "sha512-VcZK7MvpjuTPx2w6blwnwZAu5/LgBUtejFOi3pPGQFXQN5Ela03FUtd2Qtg4yWGGissVL0dr6Ro1LfOFh+PCuQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vueuse/core": { + "version": "9.13.0", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-9.13.0.tgz", + "integrity": "sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==", + "license": "MIT", + "dependencies": { + "@types/web-bluetooth": "^0.0.16", + "@vueuse/metadata": "9.13.0", + "@vueuse/shared": "9.13.0", + "vue-demi": "*" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/core/node_modules/vue-demi": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz", + "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/@vueuse/metadata": { + "version": "9.13.0", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-9.13.0.tgz", + "integrity": "sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared": { + "version": "9.13.0", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-9.13.0.tgz", + "integrity": "sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==", + "license": "MIT", + "dependencies": { + "vue-demi": "*" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared/node_modules/vue-demi": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz", + "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/async-validator": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.2.5.tgz", + "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==", + "license": "MIT" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/axios": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.3.tgz", + "integrity": "sha512-Ar7ND9pU99eJ9GpoGQKhKf58GpUOgnzuaB7ueNQ5BMi0p+LZ5oaEnfF999fAArcTIBwXTCHAmGcHOZJaWPq9Nw==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/computeds": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/computeds/-/computeds-0.0.1.tgz", + "integrity": "sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "license": "MIT" + }, + "node_modules/dayjs": { + "version": "1.11.12", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.12.tgz", + "integrity": "sha512-Rt2g+nTbLlDWZTwwrIXjy9MeiZmSDI375FvZs72ngxx8PDC6YXOeR3q5LAuPzjZQxhiWdRKac7RKV+YyQYfYIg==", + "license": "MIT" + }, + "node_modules/de-indent": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", + "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", + "dev": true, + "license": "MIT" + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/element-plus": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/element-plus/-/element-plus-2.8.0.tgz", + "integrity": "sha512-7ngapVlVlQAjocVqD4MUKvKXlBneT9DSDk2mmBOSLRFWNm/HLDT15ozmsvUBfy18sajnyUeSIHTtINE8gfrGMg==", + "license": "MIT", + "dependencies": { + "@ctrl/tinycolor": "^3.4.1", + "@element-plus/icons-vue": "^2.3.1", + "@floating-ui/dom": "^1.0.1", + "@popperjs/core": "npm:@sxzz/popperjs-es@^2.11.7", + "@types/lodash": "^4.14.182", + "@types/lodash-es": "^4.17.6", + "@vueuse/core": "^9.1.0", + "async-validator": "^4.2.5", + "dayjs": "^1.11.3", + "escape-html": "^1.0.3", + "lodash": "^4.17.21", + "lodash-es": "^4.17.21", + "lodash-unified": "^1.0.2", + "memoize-one": "^6.0.0", + "normalize-wheel-es": "^1.2.0" + }, + "peerDependencies": { + "vue": "^3.2.0" + } + }, + "node_modules/entities": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-5.0.0.tgz", + "integrity": "sha512-BeJFvFRJddxobhvEdm5GqHzRV/X+ACeuw0/BuuxsCh1EUZcAIz8+kYmBp/LrQuloy6K1f3a0M7+IhmZ7QnkISA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/follow-redirects": { + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/json-parse-even-better-errors": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz", + "integrity": "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" + }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", + "license": "MIT" + }, + "node_modules/lodash-unified": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/lodash-unified/-/lodash-unified-1.0.3.tgz", + "integrity": "sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==", + "license": "MIT", + "peerDependencies": { + "@types/lodash-es": "*", + "lodash": "*", + "lodash-es": "*" + } + }, + "node_modules/magic-string": { + "version": "0.30.11", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz", + "integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/memoize-one": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", + "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==", + "license": "MIT" + }, + "node_modules/memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", + "dev": true, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/muggle-string": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz", + "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/normalize-wheel-es": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz", + "integrity": "sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==", + "license": "BSD-3-Clause" + }, + "node_modules/npm-normalize-package-bin": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", + "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-run-all2": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/npm-run-all2/-/npm-run-all2-6.2.2.tgz", + "integrity": "sha512-Q+alQAGIW7ZhKcxLt8GcSi3h3ryheD6xnmXahkMRVM5LYmajcUrSITm8h+OPC9RYWMV2GR0Q1ntTUCfxaNoOJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "cross-spawn": "^7.0.3", + "memorystream": "^0.3.1", + "minimatch": "^9.0.0", + "pidtree": "^0.6.0", + "read-package-json-fast": "^3.0.2", + "shell-quote": "^1.7.3" + }, + "bin": { + "npm-run-all": "bin/npm-run-all/index.js", + "npm-run-all2": "bin/npm-run-all/index.js", + "run-p": "bin/run-p/index.js", + "run-s": "bin/run-s/index.js" + }, + "engines": { + "node": "^14.18.0 || ^16.13.0 || >=18.0.0", + "npm": ">= 8" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", + "license": "ISC" + }, + "node_modules/pidtree": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", + "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", + "dev": true, + "license": "MIT", + "bin": { + "pidtree": "bin/pidtree.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/pinia": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/pinia/-/pinia-2.2.1.tgz", + "integrity": "sha512-ltEU3xwiz5ojVMizdP93AHi84Rtfz0+yKd8ud75hr9LVyWX2alxp7vLbY1kFm7MXFmHHr/9B08Xf8Jj6IHTEiQ==", + "license": "MIT", + "dependencies": { + "@vue/devtools-api": "^6.6.3", + "vue-demi": "^0.14.10" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "@vue/composition-api": "^1.4.0", + "typescript": ">=4.4.4", + "vue": "^2.6.14 || ^3.3.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/pinia/node_modules/vue-demi": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz", + "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/postcss": { + "version": "8.4.41", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.41.tgz", + "integrity": "sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.1", + "source-map-js": "^1.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, + "node_modules/read-package-json-fast": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz", + "integrity": "sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==", + "dev": true, + "license": "ISC", + "dependencies": { + "json-parse-even-better-errors": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/rollup": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.20.0.tgz", + "integrity": "sha512-6rbWBChcnSGzIlXeIdNIZTopKYad8ZG8ajhl78lGRLsI2rX8IkaotQhVas2Ma+GPxJav19wrSzvRvuiv0YKzWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.5" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.20.0", + "@rollup/rollup-android-arm64": "4.20.0", + "@rollup/rollup-darwin-arm64": "4.20.0", + "@rollup/rollup-darwin-x64": "4.20.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.20.0", + "@rollup/rollup-linux-arm-musleabihf": "4.20.0", + "@rollup/rollup-linux-arm64-gnu": "4.20.0", + "@rollup/rollup-linux-arm64-musl": "4.20.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.20.0", + "@rollup/rollup-linux-riscv64-gnu": "4.20.0", + "@rollup/rollup-linux-s390x-gnu": "4.20.0", + "@rollup/rollup-linux-x64-gnu": "4.20.0", + "@rollup/rollup-linux-x64-musl": "4.20.0", + "@rollup/rollup-win32-arm64-msvc": "4.20.0", + "@rollup/rollup-win32-ia32-msvc": "4.20.0", + "@rollup/rollup-win32-x64-msvc": "4.20.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/source-map-js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/typescript": { + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", + "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", + "devOptional": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true, + "license": "MIT" + }, + "node_modules/vite": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.0.tgz", + "integrity": "sha512-5xokfMX0PIiwCMCMb9ZJcMyh5wbBun0zUzKib+L65vAZ8GY9ePZMXxFrHbr/Kyll2+LSCY7xtERPpxkBDKngwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.40", + "rollup": "^4.13.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vscode-uri": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.8.tgz", + "integrity": "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/vue": { + "version": "3.4.36", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.36.tgz", + "integrity": "sha512-mIFvbLgjODfx3Iy1SrxOsiPpDb8Bo3EU+87ioimOZzZTOp15IEdAels70IjBOLO3ZFlLW5AhdwY4dWbXVQKYow==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.4.36", + "@vue/compiler-sfc": "3.4.36", + "@vue/runtime-dom": "3.4.36", + "@vue/server-renderer": "3.4.36", + "@vue/shared": "3.4.36" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vue-router": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.4.3.tgz", + "integrity": "sha512-sv6wmNKx2j3aqJQDMxLFzs/u/mjA9Z5LCgy6BE0f7yFWMjrPLnS/sPNn8ARY/FXw6byV18EFutn5lTO6+UsV5A==", + "license": "MIT", + "dependencies": { + "@vue/devtools-api": "^6.6.3" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "vue": "^3.2.0" + } + }, + "node_modules/vue-tsc": { + "version": "2.0.29", + "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-2.0.29.tgz", + "integrity": "sha512-MHhsfyxO3mYShZCGYNziSbc63x7cQ5g9kvijV7dRe1TTXBRLxXyL0FnXWpUF1xII2mJ86mwYpYsUmMwkmerq7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/typescript": "~2.4.0-alpha.18", + "@vue/language-core": "2.0.29", + "semver": "^7.5.4" + }, + "bin": { + "vue-tsc": "bin/vue-tsc.js" + }, + "peerDependencies": { + "typescript": ">=5.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + } + } +} diff --git a/vue/package.json b/vue/package.json new file mode 100755 index 0000000..10e6692 --- /dev/null +++ b/vue/package.json @@ -0,0 +1,30 @@ +{ + "name": "vue", + "version": "0.0.0", + "private": false, + "type": "module", + "scripts": { + "dev": "vite", + "build": "run-p type-check \"build-only {@}\" --", + "preview": "vite preview", + "build-only": "vite build", + "type-check": "vue-tsc --build --force" + }, + "dependencies": { + "axios": "^1.7.3", + "element-plus": "^2.8.0", + "pinia": "^2.1.7", + "vue": "^3.4.29", + "vue-router": "^4.3.3" + }, + "devDependencies": { + "@tsconfig/node20": "^20.1.4", + "@types/node": "^20.14.5", + "@vitejs/plugin-vue": "^5.0.5", + "@vue/tsconfig": "^0.5.1", + "npm-run-all2": "^6.2.0", + "typescript": "~5.4.0", + "vite": "^5.3.1", + "vue-tsc": "^2.0.21" + } +} diff --git a/vue/public/favicon.ico b/vue/public/favicon.ico new file mode 100644 index 0000000..9ed3eac Binary files /dev/null and b/vue/public/favicon.ico differ diff --git a/vue/src/.env b/vue/src/.env new file mode 100644 index 0000000..e69de29 diff --git a/vue/src/App.vue b/vue/src/App.vue new file mode 100755 index 0000000..243a150 --- /dev/null +++ b/vue/src/App.vue @@ -0,0 +1,49 @@ + + + \ No newline at end of file diff --git a/vue/src/assets/6shu.mp4 b/vue/src/assets/6shu.mp4 new file mode 100644 index 0000000..27ae887 Binary files /dev/null and b/vue/src/assets/6shu.mp4 differ diff --git a/vue/src/assets/base.css b/vue/src/assets/base.css new file mode 100755 index 0000000..8816868 --- /dev/null +++ b/vue/src/assets/base.css @@ -0,0 +1,86 @@ +/* color palette from */ +:root { + --vt-c-white: #ffffff; + --vt-c-white-soft: #f8f8f8; + --vt-c-white-mute: #f2f2f2; + + --vt-c-black: #181818; + --vt-c-black-soft: #222222; + --vt-c-black-mute: #282828; + + --vt-c-indigo: #2c3e50; + + --vt-c-divider-light-1: rgba(60, 60, 60, 0.29); + --vt-c-divider-light-2: rgba(60, 60, 60, 0.12); + --vt-c-divider-dark-1: rgba(84, 84, 84, 0.65); + --vt-c-divider-dark-2: rgba(84, 84, 84, 0.48); + + --vt-c-text-light-1: var(--vt-c-indigo); + --vt-c-text-light-2: rgba(60, 60, 60, 0.66); + --vt-c-text-dark-1: var(--vt-c-white); + --vt-c-text-dark-2: rgba(235, 235, 235, 0.64); +} + +/* semantic color variables for this project */ +:root { + --color-background: var(--vt-c-white); + --color-background-soft: var(--vt-c-white-soft); + --color-background-mute: var(--vt-c-white-mute); + + --color-border: var(--vt-c-divider-light-2); + --color-border-hover: var(--vt-c-divider-light-1); + + --color-heading: var(--vt-c-text-light-1); + --color-text: var(--vt-c-text-light-1); + + --section-gap: 160px; +} + +@media (prefers-color-scheme: dark) { + :root { + --color-background: var(--vt-c-black); + --color-background-soft: var(--vt-c-black-soft); + --color-background-mute: var(--vt-c-black-mute); + + --color-border: var(--vt-c-divider-dark-2); + --color-border-hover: var(--vt-c-divider-dark-1); + + --color-heading: var(--vt-c-text-dark-1); + --color-text: var(--vt-c-text-dark-2); + } +} + +*, +*::before, +*::after { + box-sizing: border-box; + margin: 0; + font-weight: normal; +} + +body { + min-height: 100vh; + color: var(--color-text); + background: var(--color-background); + transition: + color 0.5s, + background-color 0.5s; + line-height: 1.6; + font-family: + Inter, + -apple-system, + BlinkMacSystemFont, + 'Segoe UI', + Roboto, + Oxygen, + Ubuntu, + Cantarell, + 'Fira Sans', + 'Droid Sans', + 'Helvetica Neue', + sans-serif; + font-size: 15px; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} diff --git a/vue/src/assets/login.png b/vue/src/assets/login.png new file mode 100644 index 0000000..9ed3eac Binary files /dev/null and b/vue/src/assets/login.png differ diff --git a/vue/src/assets/logo.svg b/vue/src/assets/logo.svg new file mode 100755 index 0000000..7565660 --- /dev/null +++ b/vue/src/assets/logo.svg @@ -0,0 +1 @@ + diff --git a/vue/src/assets/main.css b/vue/src/assets/main.css new file mode 100755 index 0000000..36fb845 --- /dev/null +++ b/vue/src/assets/main.css @@ -0,0 +1,35 @@ +@import './base.css'; + +#app { + max-width: 1280px; + margin: 0 auto; + padding: 2rem; + font-weight: normal; +} + +a, +.green { + text-decoration: none; + color: hsla(160, 100%, 37%, 1); + transition: 0.4s; + padding: 3px; +} + +@media (hover: hover) { + a:hover { + background-color: hsla(160, 100%, 37%, 0.2); + } +} + +@media (min-width: 1024px) { + body { + display: flex; + place-items: center; + } + + #app { + display: grid; + grid-template-columns: 1fr 1fr; + padding: 0 2rem; + } +} diff --git a/vue/src/chishi/login灯.vue b/vue/src/chishi/login灯.vue new file mode 100644 index 0000000..b7b84c2 --- /dev/null +++ b/vue/src/chishi/login灯.vue @@ -0,0 +1,409 @@ + + + \ No newline at end of file diff --git a/vue/src/chishi/文字.vue b/vue/src/chishi/文字.vue new file mode 100644 index 0000000..e69de29 diff --git a/vue/src/chishi/计数器.vue b/vue/src/chishi/计数器.vue new file mode 100644 index 0000000..e69de29 diff --git a/vue/src/components/CeShi.vue b/vue/src/components/CeShi.vue new file mode 100644 index 0000000..a26d2b3 --- /dev/null +++ b/vue/src/components/CeShi.vue @@ -0,0 +1,433 @@ + + diff --git a/vue/src/components/Form.vue b/vue/src/components/Form.vue new file mode 100644 index 0000000..770e0ae --- /dev/null +++ b/vue/src/components/Form.vue @@ -0,0 +1,51 @@ + + + + \ No newline at end of file diff --git a/vue/src/components/HelloWorld.vue b/vue/src/components/HelloWorld.vue new file mode 100755 index 0000000..38d821e --- /dev/null +++ b/vue/src/components/HelloWorld.vue @@ -0,0 +1,41 @@ + + + + + diff --git a/vue/src/components/Home.vue b/vue/src/components/Home.vue new file mode 100644 index 0000000..f626f91 --- /dev/null +++ b/vue/src/components/Home.vue @@ -0,0 +1,49 @@ + + + diff --git a/vue/src/components/Kanban.vue b/vue/src/components/Kanban.vue new file mode 100644 index 0000000..ba13895 --- /dev/null +++ b/vue/src/components/Kanban.vue @@ -0,0 +1,10 @@ + + + \ No newline at end of file diff --git a/vue/src/components/List.vue b/vue/src/components/List.vue new file mode 100644 index 0000000..f807360 --- /dev/null +++ b/vue/src/components/List.vue @@ -0,0 +1,42 @@ + + + \ No newline at end of file diff --git a/vue/src/components/TheWelcome.vue b/vue/src/components/TheWelcome.vue new file mode 100755 index 0000000..49d8f73 --- /dev/null +++ b/vue/src/components/TheWelcome.vue @@ -0,0 +1,88 @@ + + + diff --git a/vue/src/components/WelcomeItem.vue b/vue/src/components/WelcomeItem.vue new file mode 100755 index 0000000..6d7086a --- /dev/null +++ b/vue/src/components/WelcomeItem.vue @@ -0,0 +1,87 @@ + + + diff --git a/vue/src/components/icons/IconCommunity.vue b/vue/src/components/icons/IconCommunity.vue new file mode 100755 index 0000000..2dc8b05 --- /dev/null +++ b/vue/src/components/icons/IconCommunity.vue @@ -0,0 +1,7 @@ + diff --git a/vue/src/components/icons/IconDocumentation.vue b/vue/src/components/icons/IconDocumentation.vue new file mode 100755 index 0000000..6d4791c --- /dev/null +++ b/vue/src/components/icons/IconDocumentation.vue @@ -0,0 +1,7 @@ + diff --git a/vue/src/components/icons/IconEcosystem.vue b/vue/src/components/icons/IconEcosystem.vue new file mode 100755 index 0000000..c3a4f07 --- /dev/null +++ b/vue/src/components/icons/IconEcosystem.vue @@ -0,0 +1,7 @@ + diff --git a/vue/src/components/icons/IconSupport.vue b/vue/src/components/icons/IconSupport.vue new file mode 100755 index 0000000..7452834 --- /dev/null +++ b/vue/src/components/icons/IconSupport.vue @@ -0,0 +1,7 @@ + diff --git a/vue/src/components/icons/IconTooling.vue b/vue/src/components/icons/IconTooling.vue new file mode 100755 index 0000000..660598d --- /dev/null +++ b/vue/src/components/icons/IconTooling.vue @@ -0,0 +1,19 @@ + + diff --git a/vue/src/components/language.vue b/vue/src/components/language.vue new file mode 100644 index 0000000..e69de29 diff --git a/vue/src/main.ts b/vue/src/main.ts new file mode 100755 index 0000000..fb90414 --- /dev/null +++ b/vue/src/main.ts @@ -0,0 +1,44 @@ +import './assets/main.css' +import { createApp } from 'vue' +import { createPinia } from 'pinia' +import axios from 'axios'; +import App from './App.vue' +import router from './router' + +const app = createApp(App) +app.use(createPinia()) +app.use(router) + +// 将环境变量添加到 Vue 应用实例的全局属性 +const baseUrl = 'https://www.gdsfs.top'; +app.config.globalProperties.$baseUrl = baseUrl; +app.config.globalProperties.$getFullUrl = (params)=>{ + return baseUrl + params +}; + +/// 添加请求拦截器 +axios.interceptors.request.use(function (config) { + // 在这里添加 token 到请求头 + const accessToken = localStorage.getItem('accessToken'); + if (accessToken) { + config.headers.Authorization = `Bearer ${accessToken}`; + } + return config; +}, function (error) { + return Promise.reject(error); +}); +// 添加响应拦截器 +axios.interceptors.response.use(function (response) { + return response; +}, function (error) { + // 处理 token 过期的情况 + if (error.response.status === 401 && error.response.data.detail === "Token has expired") { + // 清除本地存储中的 token + localStorage.removeItem('accessToken'); + // 重定向到登录页面 + router.push('/login'); + } + return Promise.reject(error); +}); +const pinia = createPinia(); +app.use(pinia).mount('#app'); diff --git a/vue/src/router/index.ts b/vue/src/router/index.ts new file mode 100755 index 0000000..c0808d2 --- /dev/null +++ b/vue/src/router/index.ts @@ -0,0 +1,63 @@ +import { createRouter, createWebHistory } from 'vue-router'; +import HomeView from '@/components/Home.vue'; +import ListView from '@/components/List.vue'; +import LoginView from '@/views/Login.vue'; +import FormView from '@/components/Form.vue'; +import KanbanView from '@/components/Kanban.vue'; +import CeShiView from '@/components/CeShi.vue'; + +const router = createRouter({ + history: createWebHistory(import.meta.env.BASE_URL), + routes: [ + { + path: '/ceshi', + name: '测试', + component: CeShiView + }, + { + path: '/', + name: '登录', + component: LoginView, + meta: { noNav: true } // 添加元信息 + }, + { + path: '/home', + name: '首页', + component: HomeView + }, + { + path: '/list', + name: '列表', + component: ListView + }, + { + path: '/kanban', + name: '看板', + component: KanbanView + }, + { + path: '/form', + name: '表单', + component: FormView + } + ] +}); +// 全局前置守卫 +router.beforeEach((to, from, next) => { + // 检查是否需要导航组件 + if (to.meta.noNav) { + // 不需要导航组件,直接进入 + next(); + } else { + // 需要导航组件,检查用户是否已登录 + const isLoggedIn = localStorage.getItem('isLoggedIn') === 'true'; // 获取登录状态 + if (!isLoggedIn && to.name !== '登录') { + // 用户未登录,且不是前往登录页面,重定向到登录页面 + next({ name: '登录' }); + } else { + // 用户已登录,或者正在前往登录页面,继续导航 + next(); + } + } +}); +export default router; \ No newline at end of file diff --git a/vue/src/stores/counter.ts b/vue/src/stores/counter.ts new file mode 100755 index 0000000..b6757ba --- /dev/null +++ b/vue/src/stores/counter.ts @@ -0,0 +1,12 @@ +import { ref, computed } from 'vue' +import { defineStore } from 'pinia' + +export const useCounterStore = defineStore('counter', () => { + const count = ref(0) + const doubleCount = computed(() => count.value * 2) + function increment() { + count.value++ + } + + return { count, doubleCount, increment } +}) diff --git a/vue/src/stores/userStore.ts b/vue/src/stores/userStore.ts new file mode 100644 index 0000000..0aa89c3 --- /dev/null +++ b/vue/src/stores/userStore.ts @@ -0,0 +1,31 @@ +// stores/userStore.ts +import { defineStore } from 'pinia'; + +export const useUserStore = defineStore({ + id: 'user', + state: () => ({ + currentUser: null as any, + }), + actions: { + async login(credentials: { username: string; password: string; accessToken: string }) { + try { + // 存储用户信息 + this.currentUser = { + username: credentials.username, + accessToken: credentials.accessToken, + }; + } catch (error) { + throw error; + } + }, + logout() { + this.currentUser = null; + }, + restoreUser() { + // 如果需要从本地存储恢复用户信息,可以在这里实现 + }, + }, + getters: { + currentUserDetails: (state) => state.currentUser, + }, +}); \ No newline at end of file diff --git a/vue/src/views/AboutView.vue b/vue/src/views/AboutView.vue new file mode 100755 index 0000000..756ad2a --- /dev/null +++ b/vue/src/views/AboutView.vue @@ -0,0 +1,15 @@ + + + diff --git a/vue/src/views/HomeView.vue b/vue/src/views/HomeView.vue new file mode 100755 index 0000000..d5c0217 --- /dev/null +++ b/vue/src/views/HomeView.vue @@ -0,0 +1,9 @@ + + + diff --git a/vue/src/views/Login.vue b/vue/src/views/Login.vue new file mode 100644 index 0000000..46cd7d4 --- /dev/null +++ b/vue/src/views/Login.vue @@ -0,0 +1,314 @@ + + + + \ No newline at end of file diff --git a/vue/tsconfig.app.json b/vue/tsconfig.app.json new file mode 100755 index 0000000..e14c754 --- /dev/null +++ b/vue/tsconfig.app.json @@ -0,0 +1,14 @@ +{ + "extends": "@vue/tsconfig/tsconfig.dom.json", + "include": ["env.d.ts", "src/**/*", "src/**/*.vue"], + "exclude": ["src/**/__tests__/*"], + "compilerOptions": { + "composite": true, + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + + "baseUrl": ".", + "paths": { + "@/*": ["./src/*"] + } + } +} diff --git a/vue/tsconfig.json b/vue/tsconfig.json new file mode 100755 index 0000000..66b5e57 --- /dev/null +++ b/vue/tsconfig.json @@ -0,0 +1,11 @@ +{ + "files": [], + "references": [ + { + "path": "./tsconfig.node.json" + }, + { + "path": "./tsconfig.app.json" + } + ] +} diff --git a/vue/tsconfig.node.json b/vue/tsconfig.node.json new file mode 100755 index 0000000..f094063 --- /dev/null +++ b/vue/tsconfig.node.json @@ -0,0 +1,19 @@ +{ + "extends": "@tsconfig/node20/tsconfig.json", + "include": [ + "vite.config.*", + "vitest.config.*", + "cypress.config.*", + "nightwatch.conf.*", + "playwright.config.*" + ], + "compilerOptions": { + "composite": true, + "noEmit": true, + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + + "module": "ESNext", + "moduleResolution": "Bundler", + "types": ["node"] + } +} diff --git a/vue/vite.config.ts b/vue/vite.config.ts new file mode 100755 index 0000000..5c45e1d --- /dev/null +++ b/vue/vite.config.ts @@ -0,0 +1,16 @@ +import { fileURLToPath, URL } from 'node:url' + +import { defineConfig } from 'vite' +import vue from '@vitejs/plugin-vue' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [ + vue(), + ], + resolve: { + alias: { + '@': fileURLToPath(new URL('./src', import.meta.url)) + } + } +}) diff --git a/vue/vite.config.ts.timestamp-1723806088671-9518fc7a28c98.mjs b/vue/vite.config.ts.timestamp-1723806088671-9518fc7a28c98.mjs new file mode 100644 index 0000000..ac22778 --- /dev/null +++ b/vue/vite.config.ts.timestamp-1723806088671-9518fc7a28c98.mjs @@ -0,0 +1,19 @@ +// vite.config.ts +import { fileURLToPath, URL } from "node:url"; +import { defineConfig } from "file:///home/lqs1/app/vue/node_modules/vite/dist/node/index.js"; +import vue from "file:///home/lqs1/app/vue/node_modules/@vitejs/plugin-vue/dist/index.mjs"; +var __vite_injected_original_import_meta_url = "file:///home/lqs1/app/vue/vite.config.ts"; +var vite_config_default = defineConfig({ + plugins: [ + vue() + ], + resolve: { + alias: { + "@": fileURLToPath(new URL("./src", __vite_injected_original_import_meta_url)) + } + } +}); +export { + vite_config_default as default +}; +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsidml0ZS5jb25maWcudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImNvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lID0gXCIvaG9tZS9scXMxL2FwcC92dWVcIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZmlsZW5hbWUgPSBcIi9ob21lL2xxczEvYXBwL3Z1ZS92aXRlLmNvbmZpZy50c1wiO2NvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9pbXBvcnRfbWV0YV91cmwgPSBcImZpbGU6Ly8vaG9tZS9scXMxL2FwcC92dWUvdml0ZS5jb25maWcudHNcIjtpbXBvcnQgeyBmaWxlVVJMVG9QYXRoLCBVUkwgfSBmcm9tICdub2RlOnVybCdcblxuaW1wb3J0IHsgZGVmaW5lQ29uZmlnIH0gZnJvbSAndml0ZSdcbmltcG9ydCB2dWUgZnJvbSAnQHZpdGVqcy9wbHVnaW4tdnVlJ1xuXG4vLyBodHRwczovL3ZpdGVqcy5kZXYvY29uZmlnL1xuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29uZmlnKHtcbiAgcGx1Z2luczogW1xuICAgIHZ1ZSgpLFxuICBdLFxuICByZXNvbHZlOiB7XG4gICAgYWxpYXM6IHtcbiAgICAgICdAJzogZmlsZVVSTFRvUGF0aChuZXcgVVJMKCcuL3NyYycsIGltcG9ydC5tZXRhLnVybCkpXG4gICAgfVxuICB9XG59KVxuIl0sCiAgIm1hcHBpbmdzIjogIjtBQUF3TyxTQUFTLGVBQWUsV0FBVztBQUUzUSxTQUFTLG9CQUFvQjtBQUM3QixPQUFPLFNBQVM7QUFINEgsSUFBTSwyQ0FBMkM7QUFNN0wsSUFBTyxzQkFBUSxhQUFhO0FBQUEsRUFDMUIsU0FBUztBQUFBLElBQ1AsSUFBSTtBQUFBLEVBQ047QUFBQSxFQUNBLFNBQVM7QUFBQSxJQUNQLE9BQU87QUFBQSxNQUNMLEtBQUssY0FBYyxJQUFJLElBQUksU0FBUyx3Q0FBZSxDQUFDO0FBQUEsSUFDdEQ7QUFBQSxFQUNGO0FBQ0YsQ0FBQzsiLAogICJuYW1lcyI6IFtdCn0K