From 4b2d0a6e948ed20fcf9b8c97899139585dcb5be8 Mon Sep 17 00:00:00 2001 From: liqi Date: Tue, 29 Jul 2025 12:43:09 +0800 Subject: [PATCH] =?UTF-8?q?=E5=89=8D=E7=AB=AF=E6=A0=B7=E5=BC=8F=E7=AC=AC?= =?UTF-8?q?=E4=B8=80=E7=89=88=E5=B7=B2=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .git_disabled/HEAD | 1 + .git_disabled/config | 13 + .git_disabled/description | 1 + .git_disabled/hooks/applypatch-msg.sample | 15 + .git_disabled/hooks/commit-msg.sample | 24 + .git_disabled/hooks/fsmonitor-watchman.sample | 174 ++ .git_disabled/hooks/post-update.sample | 8 + .git_disabled/hooks/pre-applypatch.sample | 14 + .git_disabled/hooks/pre-commit.sample | 49 + .git_disabled/hooks/pre-merge-commit.sample | 13 + .git_disabled/hooks/pre-push.sample | 53 + .git_disabled/hooks/pre-rebase.sample | 169 ++ .git_disabled/hooks/pre-receive.sample | 24 + .git_disabled/hooks/prepare-commit-msg.sample | 42 + .git_disabled/hooks/push-to-checkout.sample | 78 + .git_disabled/hooks/sendemail-validate.sample | 77 + .git_disabled/hooks/update.sample | 128 ++ .git_disabled/index | Bin 0 -> 1987 bytes .git_disabled/info/exclude | 6 + ...be58682c536bd1c487fe6a86b057a15a1b1c0a.idx | Bin 0 -> 2276 bytes ...e58682c536bd1c487fe6a86b057a15a1b1c0a.pack | Bin 0 -> 30241 bytes ...be58682c536bd1c487fe6a86b057a15a1b1c0a.rev | Bin 0 -> 224 bytes .git_disabled/packed-refs | 2 + .git_disabled/refs/heads/main | 1 + .git_disabled/refs/remotes/origin/HEAD | 1 + .gitignore | 24 + .vscode/extensions.json | 3 + README.md | 214 ++ index.html | 13 + package.json | 31 + pnpm-lock.yaml | 1951 +++++++++++++++++ public/vite.svg | 1 + src/App.vue | 11 + src/api/index.js | 290 +++ src/api/request.js | 75 + src/api/request/upload.js | 10 + src/api/request/user.js | 92 + src/assets/vue.svg | 1 + src/components/EmptyState.vue | 42 + src/layouts/AdminLayout.vue | 251 +++ src/layouts/Footer.vue | 134 ++ src/layouts/Header.vue | 266 +++ src/layouts/MainLayout.vue | 14 + src/main.js | 16 + src/router/index.js | 118 + src/stores/user.js | 87 + src/style.css | 1 + src/views/about/index.vue | 302 +++ src/views/admin/ArticleForm.vue | 533 +++++ src/views/admin/Articles.vue | 618 ++++++ src/views/admin/Dashboard.vue | 286 +++ src/views/admin/News.vue | 539 +++++ src/views/admin/Settings.vue | 427 ++++ src/views/admin/Users.vue | 528 +++++ src/views/articles/detail.vue | 381 ++++ src/views/articles/index.vue | 479 ++++ src/views/auth/Login.vue | 405 ++++ src/views/contact/index.vue | 355 +++ src/views/index/index.vue | 387 ++++ src/views/news/detail.vue | 394 ++++ src/views/news/index.vue | 493 +++++ vite.config.js | 28 + 62 files changed, 10693 insertions(+) create mode 100644 .git_disabled/HEAD create mode 100644 .git_disabled/config create mode 100644 .git_disabled/description create mode 100644 .git_disabled/hooks/applypatch-msg.sample create mode 100644 .git_disabled/hooks/commit-msg.sample create mode 100644 .git_disabled/hooks/fsmonitor-watchman.sample create mode 100644 .git_disabled/hooks/post-update.sample create mode 100644 .git_disabled/hooks/pre-applypatch.sample create mode 100644 .git_disabled/hooks/pre-commit.sample create mode 100644 .git_disabled/hooks/pre-merge-commit.sample create mode 100644 .git_disabled/hooks/pre-push.sample create mode 100644 .git_disabled/hooks/pre-rebase.sample create mode 100644 .git_disabled/hooks/pre-receive.sample create mode 100644 .git_disabled/hooks/prepare-commit-msg.sample create mode 100644 .git_disabled/hooks/push-to-checkout.sample create mode 100644 .git_disabled/hooks/sendemail-validate.sample create mode 100644 .git_disabled/hooks/update.sample create mode 100644 .git_disabled/index create mode 100644 .git_disabled/info/exclude create mode 100644 .git_disabled/objects/pack/pack-ccbe58682c536bd1c487fe6a86b057a15a1b1c0a.idx create mode 100644 .git_disabled/objects/pack/pack-ccbe58682c536bd1c487fe6a86b057a15a1b1c0a.pack create mode 100644 .git_disabled/objects/pack/pack-ccbe58682c536bd1c487fe6a86b057a15a1b1c0a.rev create mode 100644 .git_disabled/packed-refs create mode 100644 .git_disabled/refs/heads/main create mode 100644 .git_disabled/refs/remotes/origin/HEAD create mode 100644 .gitignore create mode 100644 .vscode/extensions.json create mode 100644 README.md create mode 100644 index.html create mode 100644 package.json create mode 100644 pnpm-lock.yaml create mode 100644 public/vite.svg create mode 100644 src/App.vue create mode 100644 src/api/index.js create mode 100644 src/api/request.js create mode 100644 src/api/request/upload.js create mode 100644 src/api/request/user.js create mode 100644 src/assets/vue.svg create mode 100644 src/components/EmptyState.vue create mode 100644 src/layouts/AdminLayout.vue create mode 100644 src/layouts/Footer.vue create mode 100644 src/layouts/Header.vue create mode 100644 src/layouts/MainLayout.vue create mode 100644 src/main.js create mode 100644 src/router/index.js create mode 100644 src/stores/user.js create mode 100644 src/style.css create mode 100644 src/views/about/index.vue create mode 100644 src/views/admin/ArticleForm.vue create mode 100644 src/views/admin/Articles.vue create mode 100644 src/views/admin/Dashboard.vue create mode 100644 src/views/admin/News.vue create mode 100644 src/views/admin/Settings.vue create mode 100644 src/views/admin/Users.vue create mode 100644 src/views/articles/detail.vue create mode 100644 src/views/articles/index.vue create mode 100644 src/views/auth/Login.vue create mode 100644 src/views/contact/index.vue create mode 100644 src/views/index/index.vue create mode 100644 src/views/news/detail.vue create mode 100644 src/views/news/index.vue create mode 100644 vite.config.js diff --git a/.git_disabled/HEAD b/.git_disabled/HEAD new file mode 100644 index 0000000..b870d82 --- /dev/null +++ b/.git_disabled/HEAD @@ -0,0 +1 @@ +ref: refs/heads/main diff --git a/.git_disabled/config b/.git_disabled/config new file mode 100644 index 0000000..ffe7c19 --- /dev/null +++ b/.git_disabled/config @@ -0,0 +1,13 @@ +[core] + repositoryformatversion = 0 + filemode = false + bare = false + logallrefupdates = true + ignorecase = true +[remote "origin"] + url = https://codeup.nailaoyun.cn/lq/vite-tailwindcss.git + fetch = +refs/heads/*:refs/remotes/origin/* +[branch "main"] + remote = origin + merge = refs/heads/main + vscode-merge-base = origin/main diff --git a/.git_disabled/description b/.git_disabled/description new file mode 100644 index 0000000..498b267 --- /dev/null +++ b/.git_disabled/description @@ -0,0 +1 @@ +Unnamed repository; edit this file 'description' to name the repository. diff --git a/.git_disabled/hooks/applypatch-msg.sample b/.git_disabled/hooks/applypatch-msg.sample new file mode 100644 index 0000000..a5d7b84 --- /dev/null +++ b/.git_disabled/hooks/applypatch-msg.sample @@ -0,0 +1,15 @@ +#!/bin/sh +# +# An example hook script to check the commit log message taken by +# applypatch from an e-mail message. +# +# The hook should exit with non-zero status after issuing an +# appropriate message if it wants to stop the commit. The hook is +# allowed to edit the commit message file. +# +# To enable this hook, rename this file to "applypatch-msg". + +. git-sh-setup +commitmsg="$(git rev-parse --git-path hooks/commit-msg)" +test -x "$commitmsg" && exec "$commitmsg" ${1+"$@"} +: diff --git a/.git_disabled/hooks/commit-msg.sample b/.git_disabled/hooks/commit-msg.sample new file mode 100644 index 0000000..b58d118 --- /dev/null +++ b/.git_disabled/hooks/commit-msg.sample @@ -0,0 +1,24 @@ +#!/bin/sh +# +# An example hook script to check the commit log message. +# Called by "git commit" with one argument, the name of the file +# that has the commit message. The hook should exit with non-zero +# status after issuing an appropriate message if it wants to stop the +# commit. The hook is allowed to edit the commit message file. +# +# To enable this hook, rename this file to "commit-msg". + +# Uncomment the below to add a Signed-off-by line to the message. +# Doing this in a hook is a bad idea in general, but the prepare-commit-msg +# hook is more suited to it. +# +# SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') +# grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1" + +# This example catches duplicate Signed-off-by lines. + +test "" = "$(grep '^Signed-off-by: ' "$1" | + sort | uniq -c | sed -e '/^[ ]*1[ ]/d')" || { + echo >&2 Duplicate Signed-off-by lines. + exit 1 +} diff --git a/.git_disabled/hooks/fsmonitor-watchman.sample b/.git_disabled/hooks/fsmonitor-watchman.sample new file mode 100644 index 0000000..23e856f --- /dev/null +++ b/.git_disabled/hooks/fsmonitor-watchman.sample @@ -0,0 +1,174 @@ +#!/usr/bin/perl + +use strict; +use warnings; +use IPC::Open2; + +# An example hook script to integrate Watchman +# (https://facebook.github.io/watchman/) with git to speed up detecting +# new and modified files. +# +# The hook is passed a version (currently 2) and last update token +# formatted as a string and outputs to stdout a new update token and +# all files that have been modified since the update token. Paths must +# be relative to the root of the working tree and separated by a single NUL. +# +# To enable this hook, rename this file to "query-watchman" and set +# 'git config core.fsmonitor .git/hooks/query-watchman' +# +my ($version, $last_update_token) = @ARGV; + +# Uncomment for debugging +# print STDERR "$0 $version $last_update_token\n"; + +# Check the hook interface version +if ($version ne 2) { + die "Unsupported query-fsmonitor hook version '$version'.\n" . + "Falling back to scanning...\n"; +} + +my $git_work_tree = get_working_dir(); + +my $retry = 1; + +my $json_pkg; +eval { + require JSON::XS; + $json_pkg = "JSON::XS"; + 1; +} or do { + require JSON::PP; + $json_pkg = "JSON::PP"; +}; + +launch_watchman(); + +sub launch_watchman { + my $o = watchman_query(); + if (is_work_tree_watched($o)) { + output_result($o->{clock}, @{$o->{files}}); + } +} + +sub output_result { + my ($clockid, @files) = @_; + + # Uncomment for debugging watchman output + # open (my $fh, ">", ".git/watchman-output.out"); + # binmode $fh, ":utf8"; + # print $fh "$clockid\n@files\n"; + # close $fh; + + binmode STDOUT, ":utf8"; + print $clockid; + print "\0"; + local $, = "\0"; + print @files; +} + +sub watchman_clock { + my $response = qx/watchman clock "$git_work_tree"/; + die "Failed to get clock id on '$git_work_tree'.\n" . + "Falling back to scanning...\n" if $? != 0; + + return $json_pkg->new->utf8->decode($response); +} + +sub watchman_query { + my $pid = open2(\*CHLD_OUT, \*CHLD_IN, 'watchman -j --no-pretty') + or die "open2() failed: $!\n" . + "Falling back to scanning...\n"; + + # In the query expression below we're asking for names of files that + # changed since $last_update_token but not from the .git folder. + # + # To accomplish this, we're using the "since" generator to use the + # recency index to select candidate nodes and "fields" to limit the + # output to file names only. Then we're using the "expression" term to + # further constrain the results. + my $last_update_line = ""; + if (substr($last_update_token, 0, 1) eq "c") { + $last_update_token = "\"$last_update_token\""; + $last_update_line = qq[\n"since": $last_update_token,]; + } + my $query = <<" END"; + ["query", "$git_work_tree", {$last_update_line + "fields": ["name"], + "expression": ["not", ["dirname", ".git"]] + }] + END + + # Uncomment for debugging the watchman query + # open (my $fh, ">", ".git/watchman-query.json"); + # print $fh $query; + # close $fh; + + print CHLD_IN $query; + close CHLD_IN; + my $response = do {local $/; }; + + # Uncomment for debugging the watch response + # open ($fh, ">", ".git/watchman-response.json"); + # print $fh $response; + # close $fh; + + die "Watchman: command returned no output.\n" . + "Falling back to scanning...\n" if $response eq ""; + die "Watchman: command returned invalid output: $response\n" . + "Falling back to scanning...\n" unless $response =~ /^\{/; + + return $json_pkg->new->utf8->decode($response); +} + +sub is_work_tree_watched { + my ($output) = @_; + my $error = $output->{error}; + if ($retry > 0 and $error and $error =~ m/unable to resolve root .* directory (.*) is not watched/) { + $retry--; + my $response = qx/watchman watch "$git_work_tree"/; + die "Failed to make watchman watch '$git_work_tree'.\n" . + "Falling back to scanning...\n" if $? != 0; + $output = $json_pkg->new->utf8->decode($response); + $error = $output->{error}; + die "Watchman: $error.\n" . + "Falling back to scanning...\n" if $error; + + # Uncomment for debugging watchman output + # open (my $fh, ">", ".git/watchman-output.out"); + # close $fh; + + # Watchman will always return all files on the first query so + # return the fast "everything is dirty" flag to git and do the + # Watchman query just to get it over with now so we won't pay + # the cost in git to look up each individual file. + my $o = watchman_clock(); + $error = $output->{error}; + + die "Watchman: $error.\n" . + "Falling back to scanning...\n" if $error; + + output_result($o->{clock}, ("/")); + $last_update_token = $o->{clock}; + + eval { launch_watchman() }; + return 0; + } + + die "Watchman: $error.\n" . + "Falling back to scanning...\n" if $error; + + return 1; +} + +sub get_working_dir { + my $working_dir; + if ($^O =~ 'msys' || $^O =~ 'cygwin') { + $working_dir = Win32::GetCwd(); + $working_dir =~ tr/\\/\//; + } else { + require Cwd; + $working_dir = Cwd::cwd(); + } + + return $working_dir; +} diff --git a/.git_disabled/hooks/post-update.sample b/.git_disabled/hooks/post-update.sample new file mode 100644 index 0000000..ec17ec1 --- /dev/null +++ b/.git_disabled/hooks/post-update.sample @@ -0,0 +1,8 @@ +#!/bin/sh +# +# An example hook script to prepare a packed repository for use over +# dumb transports. +# +# To enable this hook, rename this file to "post-update". + +exec git update-server-info diff --git a/.git_disabled/hooks/pre-applypatch.sample b/.git_disabled/hooks/pre-applypatch.sample new file mode 100644 index 0000000..4142082 --- /dev/null +++ b/.git_disabled/hooks/pre-applypatch.sample @@ -0,0 +1,14 @@ +#!/bin/sh +# +# An example hook script to verify what is about to be committed +# by applypatch from an e-mail message. +# +# The hook should exit with non-zero status after issuing an +# appropriate message if it wants to stop the commit. +# +# To enable this hook, rename this file to "pre-applypatch". + +. git-sh-setup +precommit="$(git rev-parse --git-path hooks/pre-commit)" +test -x "$precommit" && exec "$precommit" ${1+"$@"} +: diff --git a/.git_disabled/hooks/pre-commit.sample b/.git_disabled/hooks/pre-commit.sample new file mode 100644 index 0000000..29ed5ee --- /dev/null +++ b/.git_disabled/hooks/pre-commit.sample @@ -0,0 +1,49 @@ +#!/bin/sh +# +# An example hook script to verify what is about to be committed. +# Called by "git commit" with no arguments. The hook should +# exit with non-zero status after issuing an appropriate message if +# it wants to stop the commit. +# +# To enable this hook, rename this file to "pre-commit". + +if git rev-parse --verify HEAD >/dev/null 2>&1 +then + against=HEAD +else + # Initial commit: diff against an empty tree object + against=$(git hash-object -t tree /dev/null) +fi + +# If you want to allow non-ASCII filenames set this variable to true. +allownonascii=$(git config --type=bool hooks.allownonascii) + +# Redirect output to stderr. +exec 1>&2 + +# Cross platform projects tend to avoid non-ASCII filenames; prevent +# them from being added to the repository. We exploit the fact that the +# printable range starts at the space character and ends with tilde. +if [ "$allownonascii" != "true" ] && + # Note that the use of brackets around a tr range is ok here, (it's + # even required, for portability to Solaris 10's /usr/bin/tr), since + # the square bracket bytes happen to fall in the designated range. + test $(git diff-index --cached --name-only --diff-filter=A -z $against | + LC_ALL=C tr -d '[ -~]\0' | wc -c) != 0 +then + cat <<\EOF +Error: Attempt to add a non-ASCII file name. + +This can cause problems if you want to work with people on other platforms. + +To be portable it is advisable to rename the file. + +If you know what you are doing you can disable this check using: + + git config hooks.allownonascii true +EOF + exit 1 +fi + +# If there are whitespace errors, print the offending file names and fail. +exec git diff-index --check --cached $against -- diff --git a/.git_disabled/hooks/pre-merge-commit.sample b/.git_disabled/hooks/pre-merge-commit.sample new file mode 100644 index 0000000..399eab1 --- /dev/null +++ b/.git_disabled/hooks/pre-merge-commit.sample @@ -0,0 +1,13 @@ +#!/bin/sh +# +# An example hook script to verify what is about to be committed. +# Called by "git merge" with no arguments. The hook should +# exit with non-zero status after issuing an appropriate message to +# stderr if it wants to stop the merge commit. +# +# To enable this hook, rename this file to "pre-merge-commit". + +. git-sh-setup +test -x "$GIT_DIR/hooks/pre-commit" && + exec "$GIT_DIR/hooks/pre-commit" +: diff --git a/.git_disabled/hooks/pre-push.sample b/.git_disabled/hooks/pre-push.sample new file mode 100644 index 0000000..4ce688d --- /dev/null +++ b/.git_disabled/hooks/pre-push.sample @@ -0,0 +1,53 @@ +#!/bin/sh + +# An example hook script to verify what is about to be pushed. Called by "git +# push" after it has checked the remote status, but before anything has been +# pushed. If this script exits with a non-zero status nothing will be pushed. +# +# This hook is called with the following parameters: +# +# $1 -- Name of the remote to which the push is being done +# $2 -- URL to which the push is being done +# +# If pushing without using a named remote those arguments will be equal. +# +# Information about the commits which are being pushed is supplied as lines to +# the standard input in the form: +# +# +# +# This sample shows how to prevent push of commits where the log message starts +# with "WIP" (work in progress). + +remote="$1" +url="$2" + +zero=$(git hash-object --stdin &2 "Found WIP commit in $local_ref, not pushing" + exit 1 + fi + fi +done + +exit 0 diff --git a/.git_disabled/hooks/pre-rebase.sample b/.git_disabled/hooks/pre-rebase.sample new file mode 100644 index 0000000..6cbef5c --- /dev/null +++ b/.git_disabled/hooks/pre-rebase.sample @@ -0,0 +1,169 @@ +#!/bin/sh +# +# Copyright (c) 2006, 2008 Junio C Hamano +# +# The "pre-rebase" hook is run just before "git rebase" starts doing +# its job, and can prevent the command from running by exiting with +# non-zero status. +# +# The hook is called with the following parameters: +# +# $1 -- the upstream the series was forked from. +# $2 -- the branch being rebased (or empty when rebasing the current branch). +# +# This sample shows how to prevent topic branches that are already +# merged to 'next' branch from getting rebased, because allowing it +# would result in rebasing already published history. + +publish=next +basebranch="$1" +if test "$#" = 2 +then + topic="refs/heads/$2" +else + topic=`git symbolic-ref HEAD` || + exit 0 ;# we do not interrupt rebasing detached HEAD +fi + +case "$topic" in +refs/heads/??/*) + ;; +*) + exit 0 ;# we do not interrupt others. + ;; +esac + +# Now we are dealing with a topic branch being rebased +# on top of master. Is it OK to rebase it? + +# Does the topic really exist? +git show-ref -q "$topic" || { + echo >&2 "No such branch $topic" + exit 1 +} + +# Is topic fully merged to master? +not_in_master=`git rev-list --pretty=oneline ^master "$topic"` +if test -z "$not_in_master" +then + echo >&2 "$topic is fully merged to master; better remove it." + exit 1 ;# we could allow it, but there is no point. +fi + +# Is topic ever merged to next? If so you should not be rebasing it. +only_next_1=`git rev-list ^master "^$topic" ${publish} | sort` +only_next_2=`git rev-list ^master ${publish} | sort` +if test "$only_next_1" = "$only_next_2" +then + not_in_topic=`git rev-list "^$topic" master` + if test -z "$not_in_topic" + then + echo >&2 "$topic is already up to date with master" + exit 1 ;# we could allow it, but there is no point. + else + exit 0 + fi +else + not_in_next=`git rev-list --pretty=oneline ^${publish} "$topic"` + /usr/bin/perl -e ' + my $topic = $ARGV[0]; + my $msg = "* $topic has commits already merged to public branch:\n"; + my (%not_in_next) = map { + /^([0-9a-f]+) /; + ($1 => 1); + } split(/\n/, $ARGV[1]); + for my $elem (map { + /^([0-9a-f]+) (.*)$/; + [$1 => $2]; + } split(/\n/, $ARGV[2])) { + if (!exists $not_in_next{$elem->[0]}) { + if ($msg) { + print STDERR $msg; + undef $msg; + } + print STDERR " $elem->[1]\n"; + } + } + ' "$topic" "$not_in_next" "$not_in_master" + exit 1 +fi + +<<\DOC_END + +This sample hook safeguards topic branches that have been +published from being rewound. + +The workflow assumed here is: + + * Once a topic branch forks from "master", "master" is never + merged into it again (either directly or indirectly). + + * Once a topic branch is fully cooked and merged into "master", + it is deleted. If you need to build on top of it to correct + earlier mistakes, a new topic branch is created by forking at + the tip of the "master". This is not strictly necessary, but + it makes it easier to keep your history simple. + + * Whenever you need to test or publish your changes to topic + branches, merge them into "next" branch. + +The script, being an example, hardcodes the publish branch name +to be "next", but it is trivial to make it configurable via +$GIT_DIR/config mechanism. + +With this workflow, you would want to know: + +(1) ... if a topic branch has ever been merged to "next". Young + topic branches can have stupid mistakes you would rather + clean up before publishing, and things that have not been + merged into other branches can be easily rebased without + affecting other people. But once it is published, you would + not want to rewind it. + +(2) ... if a topic branch has been fully merged to "master". + Then you can delete it. More importantly, you should not + build on top of it -- other people may already want to + change things related to the topic as patches against your + "master", so if you need further changes, it is better to + fork the topic (perhaps with the same name) afresh from the + tip of "master". + +Let's look at this example: + + o---o---o---o---o---o---o---o---o---o "next" + / / / / + / a---a---b A / / + / / / / + / / c---c---c---c B / + / / / \ / + / / / b---b C \ / + / / / / \ / + ---o---o---o---o---o---o---o---o---o---o---o "master" + + +A, B and C are topic branches. + + * A has one fix since it was merged up to "next". + + * B has finished. It has been fully merged up to "master" and "next", + and is ready to be deleted. + + * C has not merged to "next" at all. + +We would want to allow C to be rebased, refuse A, and encourage +B to be deleted. + +To compute (1): + + git rev-list ^master ^topic next + git rev-list ^master next + + if these match, topic has not merged in next at all. + +To compute (2): + + git rev-list master..topic + + if this is empty, it is fully merged to "master". + +DOC_END diff --git a/.git_disabled/hooks/pre-receive.sample b/.git_disabled/hooks/pre-receive.sample new file mode 100644 index 0000000..a1fd29e --- /dev/null +++ b/.git_disabled/hooks/pre-receive.sample @@ -0,0 +1,24 @@ +#!/bin/sh +# +# An example hook script to make use of push options. +# The example simply echoes all push options that start with 'echoback=' +# and rejects all pushes when the "reject" push option is used. +# +# To enable this hook, rename this file to "pre-receive". + +if test -n "$GIT_PUSH_OPTION_COUNT" +then + i=0 + while test "$i" -lt "$GIT_PUSH_OPTION_COUNT" + do + eval "value=\$GIT_PUSH_OPTION_$i" + case "$value" in + echoback=*) + echo "echo from the pre-receive-hook: ${value#*=}" >&2 + ;; + reject) + exit 1 + esac + i=$((i + 1)) + done +fi diff --git a/.git_disabled/hooks/prepare-commit-msg.sample b/.git_disabled/hooks/prepare-commit-msg.sample new file mode 100644 index 0000000..10fa14c --- /dev/null +++ b/.git_disabled/hooks/prepare-commit-msg.sample @@ -0,0 +1,42 @@ +#!/bin/sh +# +# An example hook script to prepare the commit log message. +# Called by "git commit" with the name of the file that has the +# commit message, followed by the description of the commit +# message's source. The hook's purpose is to edit the commit +# message file. If the hook fails with a non-zero status, +# the commit is aborted. +# +# To enable this hook, rename this file to "prepare-commit-msg". + +# This hook includes three examples. The first one removes the +# "# Please enter the commit message..." help message. +# +# The second includes the output of "git diff --name-status -r" +# into the message, just before the "git status" output. It is +# commented because it doesn't cope with --amend or with squashed +# commits. +# +# The third example adds a Signed-off-by line to the message, that can +# still be edited. This is rarely a good idea. + +COMMIT_MSG_FILE=$1 +COMMIT_SOURCE=$2 +SHA1=$3 + +/usr/bin/perl -i.bak -ne 'print unless(m/^. Please enter the commit message/..m/^#$/)' "$COMMIT_MSG_FILE" + +# case "$COMMIT_SOURCE,$SHA1" in +# ,|template,) +# /usr/bin/perl -i.bak -pe ' +# print "\n" . `git diff --cached --name-status -r` +# if /^#/ && $first++ == 0' "$COMMIT_MSG_FILE" ;; +# *) ;; +# esac + +# SOB=$(git var GIT_COMMITTER_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') +# git interpret-trailers --in-place --trailer "$SOB" "$COMMIT_MSG_FILE" +# if test -z "$COMMIT_SOURCE" +# then +# /usr/bin/perl -i.bak -pe 'print "\n" if !$first_line++' "$COMMIT_MSG_FILE" +# fi diff --git a/.git_disabled/hooks/push-to-checkout.sample b/.git_disabled/hooks/push-to-checkout.sample new file mode 100644 index 0000000..af5a0c0 --- /dev/null +++ b/.git_disabled/hooks/push-to-checkout.sample @@ -0,0 +1,78 @@ +#!/bin/sh + +# An example hook script to update a checked-out tree on a git push. +# +# This hook is invoked by git-receive-pack(1) when it reacts to git +# push and updates reference(s) in its repository, and when the push +# tries to update the branch that is currently checked out and the +# receive.denyCurrentBranch configuration variable is set to +# updateInstead. +# +# By default, such a push is refused if the working tree and the index +# of the remote repository has any difference from the currently +# checked out commit; when both the working tree and the index match +# the current commit, they are updated to match the newly pushed tip +# of the branch. This hook is to be used to override the default +# behaviour; however the code below reimplements the default behaviour +# as a starting point for convenient modification. +# +# The hook receives the commit with which the tip of the current +# branch is going to be updated: +commit=$1 + +# It can exit with a non-zero status to refuse the push (when it does +# so, it must not modify the index or the working tree). +die () { + echo >&2 "$*" + exit 1 +} + +# Or it can make any necessary changes to the working tree and to the +# index to bring them to the desired state when the tip of the current +# branch is updated to the new commit, and exit with a zero status. +# +# For example, the hook can simply run git read-tree -u -m HEAD "$1" +# in order to emulate git fetch that is run in the reverse direction +# with git push, as the two-tree form of git read-tree -u -m is +# essentially the same as git switch or git checkout that switches +# branches while keeping the local changes in the working tree that do +# not interfere with the difference between the branches. + +# The below is a more-or-less exact translation to shell of the C code +# for the default behaviour for git's push-to-checkout hook defined in +# the push_to_deploy() function in builtin/receive-pack.c. +# +# Note that the hook will be executed from the repository directory, +# not from the working tree, so if you want to perform operations on +# the working tree, you will have to adapt your code accordingly, e.g. +# by adding "cd .." or using relative paths. + +if ! git update-index -q --ignore-submodules --refresh +then + die "Up-to-date check failed" +fi + +if ! git diff-files --quiet --ignore-submodules -- +then + die "Working directory has unstaged changes" +fi + +# This is a rough translation of: +# +# head_has_history() ? "HEAD" : EMPTY_TREE_SHA1_HEX +if git cat-file -e HEAD 2>/dev/null +then + head=HEAD +else + head=$(git hash-object -t tree --stdin &2 + exit 1 +} + +unset GIT_DIR GIT_WORK_TREE +cd "$worktree" && + +if grep -q "^diff --git " "$1" +then + validate_patch "$1" +else + validate_cover_letter "$1" +fi && + +if test "$GIT_SENDEMAIL_FILE_COUNTER" = "$GIT_SENDEMAIL_FILE_TOTAL" +then + git config --unset-all sendemail.validateWorktree && + trap 'git worktree remove -ff "$worktree"' EXIT && + validate_series +fi diff --git a/.git_disabled/hooks/update.sample b/.git_disabled/hooks/update.sample new file mode 100644 index 0000000..c4d426b --- /dev/null +++ b/.git_disabled/hooks/update.sample @@ -0,0 +1,128 @@ +#!/bin/sh +# +# An example hook script to block unannotated tags from entering. +# Called by "git receive-pack" with arguments: refname sha1-old sha1-new +# +# To enable this hook, rename this file to "update". +# +# Config +# ------ +# hooks.allowunannotated +# This boolean sets whether unannotated tags will be allowed into the +# repository. By default they won't be. +# hooks.allowdeletetag +# This boolean sets whether deleting tags will be allowed in the +# repository. By default they won't be. +# hooks.allowmodifytag +# This boolean sets whether a tag may be modified after creation. By default +# it won't be. +# hooks.allowdeletebranch +# This boolean sets whether deleting branches will be allowed in the +# repository. By default they won't be. +# hooks.denycreatebranch +# This boolean sets whether remotely creating branches will be denied +# in the repository. By default this is allowed. +# + +# --- Command line +refname="$1" +oldrev="$2" +newrev="$3" + +# --- Safety check +if [ -z "$GIT_DIR" ]; then + echo "Don't run this script from the command line." >&2 + echo " (if you want, you could supply GIT_DIR then run" >&2 + echo " $0 )" >&2 + exit 1 +fi + +if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then + echo "usage: $0 " >&2 + exit 1 +fi + +# --- Config +allowunannotated=$(git config --type=bool hooks.allowunannotated) +allowdeletebranch=$(git config --type=bool hooks.allowdeletebranch) +denycreatebranch=$(git config --type=bool hooks.denycreatebranch) +allowdeletetag=$(git config --type=bool hooks.allowdeletetag) +allowmodifytag=$(git config --type=bool hooks.allowmodifytag) + +# check for no description +projectdesc=$(sed -e '1q' "$GIT_DIR/description") +case "$projectdesc" in +"Unnamed repository"* | "") + echo "*** Project description file hasn't been set" >&2 + exit 1 + ;; +esac + +# --- Check types +# if $newrev is 0000...0000, it's a commit to delete a ref. +zero=$(git hash-object --stdin &2 + echo "*** Use 'git tag [ -a | -s ]' for tags you want to propagate." >&2 + exit 1 + fi + ;; + refs/tags/*,delete) + # delete tag + if [ "$allowdeletetag" != "true" ]; then + echo "*** Deleting a tag is not allowed in this repository" >&2 + exit 1 + fi + ;; + refs/tags/*,tag) + # annotated tag + if [ "$allowmodifytag" != "true" ] && git rev-parse $refname > /dev/null 2>&1 + then + echo "*** Tag '$refname' already exists." >&2 + echo "*** Modifying a tag is not allowed in this repository." >&2 + exit 1 + fi + ;; + refs/heads/*,commit) + # branch + if [ "$oldrev" = "$zero" -a "$denycreatebranch" = "true" ]; then + echo "*** Creating a branch is not allowed in this repository" >&2 + exit 1 + fi + ;; + refs/heads/*,delete) + # delete branch + if [ "$allowdeletebranch" != "true" ]; then + echo "*** Deleting a branch is not allowed in this repository" >&2 + exit 1 + fi + ;; + refs/remotes/*,commit) + # tracking branch + ;; + refs/remotes/*,delete) + # delete tracking branch + if [ "$allowdeletebranch" != "true" ]; then + echo "*** Deleting a tracking branch is not allowed in this repository" >&2 + exit 1 + fi + ;; + *) + # Anything else (is there anything else?) + echo "*** Update hook: unknown type of update to ref $refname of type $newrev_type" >&2 + exit 1 + ;; +esac + +# --- Finished +exit 0 diff --git a/.git_disabled/index b/.git_disabled/index new file mode 100644 index 0000000000000000000000000000000000000000..9f56a9a95b5f5067d5340b040a50865d2a95909f GIT binary patch literal 1987 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

!hq>N{8q$PmyVAVk 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 literal 0 HcmV?d00001 diff --git a/.git_disabled/objects/pack/pack-ccbe58682c536bd1c487fe6a86b057a15a1b1c0a.rev b/.git_disabled/objects/pack/pack-ccbe58682c536bd1c487fe6a86b057a15a1b1c0a.rev new file mode 100644 index 0000000000000000000000000000000000000000..a206ee6d6100ddca32693ebfdbd4aa75226895ce GIT binary patch literal 224 zcmXZP%L)Nu0EXe8aUAFK;U6>3gSZ1rDO(mMDO<5rE`g1WD?qsbH^9n9+1R@j$*bn8 zr?+o7=vhJthb=;rh}vJL3W{(c1wZ}^ppFu}FyTfGO{l0Kju=8{z=;I%2%-Q35= 16.0.0 +- npm >= 8.0.0 + +### 安装依赖 +```bash +cd cms-view-new +npm install +``` + +### 开发模式 +```bash +npm run dev +``` +访问: http://localhost:8890 + +### 生产构建 +```bash +npm run build +``` + +### 预览构建结果 +```bash +npm run preview +``` + +## 页面路由 + +### 前台路由 +- `/` - 首页 +- `/articles` - 技术文章列表 +- `/articles/:id` - 文章详情 +- `/news` - 新闻资讯列表 +- `/news/:id` - 新闻详情 +- `/about` - 关于我们 +- `/contact` - 联系我们 + +### 后台路由 +- `/login` - 登录页面 +- `/admin` - 管理后台首页 +- `/admin/dashboard` - 仪表盘 +- `/admin/articles` - 文章管理 +- `/admin/news` - 新闻管理 +- `/admin/users` - 用户管理 +- `/admin/settings` - 系统设置 + +## 设计特色 + +### 🎨 视觉设计 +- **现代化界面** - 简洁美观的设计风格 +- **深蓝色主题** - 专业的配色方案 +- **渐变效果** - 丰富的视觉层次 +- **卡片布局** - 清晰的信息组织 + +### 🔄 交互体验 +- **流畅动画** - 页面切换和悬停效果 +- **响应式反馈** - 即时的用户操作反馈 +- **加载状态** - 友好的加载提示 +- **错误处理** - 完善的错误提示机制 + +### 📱 移动端优化 +- **触摸友好** - 适合手指操作的按钮大小 +- **滑动菜单** - 移动端专用的导航方式 +- **自适应布局** - 内容自动适配屏幕尺寸 +- **性能优化** - 移动端加载速度优化 + +## 开发说明 + +### 组件开发 +- 使用Vue 3 Composition API +- 遵循单一职责原则 +- 保持组件的可复用性 + +### 样式开发 +- 使用TailwindCSS工具类 +- 保持响应式设计 +- 遵循设计系统规范 + +### 路由管理 +- 使用Vue Router 4 +- 实现路由守卫 +- 支持动态路由 + +## 部署说明 + +### 静态部署 +构建后的`dist`目录可以部署到任何静态文件服务器: +- Nginx +- Apache +- Vercel +- Netlify + +### 服务器配置 +需要配置单页应用的路由重写规则,将所有路由指向`index.html`。 + +## 浏览器支持 + +- Chrome >= 87 +- Firefox >= 78 +- Safari >= 14 +- Edge >= 88 + +## 许可证 + +MIT License + +## 联系方式 + +如有问题或建议,请联系开发团队。 + +## API接口说明 + +### 基础配置 +```javascript +// src/api/index.js +const API_BASE_URL = 'http://localhost:3000/api' +``` + +### 主要接口 +- `GET /articles` - 获取文章列表 +- `GET /articles/:id` - 获取文章详情 +- `POST /articles` - 创建文章 +- `PUT /articles/:id` - 更新文章 +- `DELETE /articles/:id` - 删除文章 +- `GET /news` - 获取新闻列表 +- `GET /categories` - 获取分类列表 +- `POST /auth/login` - 用户登录 +- `GET /auth/profile` - 获取用户信息 + +### 空状态处理 +当列表数据为空时,系统会显示EmptyState组件: +```vue + +``` + +## 更新日志 + +### v1.0.0 (2024-01-16) +- ✅ 完成前台所有页面开发 +- ✅ 完成管理后台功能 +- ✅ 集成cms-api接口 +- ✅ 添加空状态组件 +- ✅ 修复所有语法错误 +- ✅ 完成移动端适配 +- ✅ 优化图片资源加载 + +--- + +© 2024 CMS内容管理系统. 保留所有权利. diff --git a/index.html b/index.html new file mode 100644 index 0000000..8388c4b --- /dev/null +++ b/index.html @@ -0,0 +1,13 @@ + + + + + + + Vite + Vue + + +

+ + + diff --git a/package.json b/package.json new file mode 100644 index 0000000..3c82eaa --- /dev/null +++ b/package.json @@ -0,0 +1,31 @@ +{ + "name": "spa-view", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "preview": "vite preview" + }, + "dependencies": { + "tailwindcss": "^4.1.4", + "vue": "^3.5.13", + "@ant-design-vue/pro-layout": "^3.2.5", + "@ant-design/icons-vue": "^7.0.1", + "@fortawesome/fontawesome-free": "^6.7.2", + "@tailwindcss/vite": "^4.1.4", + "@vueuse/head": "^2.0.0", + "ant-design-vue": "^4.1.1", + "axios": "^1.6.2", + "lucide-vue-next": "^0.507.0", + "pinia": "^2.1.7", + "swiper": "^11.0.5", + "vue-router": "^4.2.5" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^5.2.2", + "sass": "^1.71.0", + "vite": "^6.3.1" + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..fed433b --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,1951 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@ant-design-vue/pro-layout': + specifier: ^3.2.5 + version: 3.2.5(ant-design-vue@4.2.6(vue@3.5.13))(vue@3.5.13) + '@ant-design/icons-vue': + specifier: ^7.0.1 + version: 7.0.1(vue@3.5.13) + '@fortawesome/fontawesome-free': + specifier: ^6.7.2 + version: 6.7.2 + '@tailwindcss/vite': + specifier: ^4.1.4 + version: 4.1.4(vite@6.3.3(jiti@2.4.2)(lightningcss@1.29.2)(sass@1.88.0)) + '@vueuse/head': + specifier: ^2.0.0 + version: 2.0.0(vue@3.5.13) + ant-design-vue: + specifier: ^4.1.1 + version: 4.2.6(vue@3.5.13) + axios: + specifier: ^1.6.2 + version: 1.9.0 + lucide-vue-next: + specifier: ^0.507.0 + version: 0.507.0(vue@3.5.13) + pinia: + specifier: ^2.1.7 + version: 2.3.1(vue@3.5.13) + swiper: + specifier: ^11.0.5 + version: 11.2.6 + tailwindcss: + specifier: ^4.1.4 + version: 4.1.4 + vue: + specifier: ^3.5.13 + version: 3.5.13 + vue-router: + specifier: ^4.2.5 + version: 4.5.1(vue@3.5.13) + devDependencies: + '@vitejs/plugin-vue': + specifier: ^5.2.2 + version: 5.2.3(vite@6.3.3(jiti@2.4.2)(lightningcss@1.29.2)(sass@1.88.0))(vue@3.5.13) + sass: + specifier: ^1.71.0 + version: 1.88.0 + vite: + specifier: ^6.3.1 + version: 6.3.3(jiti@2.4.2)(lightningcss@1.29.2)(sass@1.88.0) + +packages: + + '@ant-design-vue/pro-layout@3.2.5': + resolution: {integrity: sha512-M87KEnnt3h5zLlYXPST4fTGHkuwnJac6xbBGOUTjNjMraOyyO9afx++UNdeOc8gtjtasOBcp9VYGFrGUQyJxVg==} + peerDependencies: + ant-design-vue: '>=3.2.0' + vue: '>=3.2.0' + + '@ant-design/colors@6.0.0': + resolution: {integrity: sha512-qAZRvPzfdWHtfameEGP2Qvuf838NhergR35o+EuVyB5XvSA98xod5r4utvi4TJ3ywmevm290g9nsCG5MryrdWQ==} + + '@ant-design/icons-svg@4.4.2': + resolution: {integrity: sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA==} + + '@ant-design/icons-vue@6.1.0': + resolution: {integrity: sha512-EX6bYm56V+ZrKN7+3MT/ubDkvJ5rK/O2t380WFRflDcVFgsvl3NLH7Wxeau6R8DbrO5jWR6DSTC3B6gYFp77AA==} + peerDependencies: + vue: '>=3.0.3' + + '@ant-design/icons-vue@7.0.1': + resolution: {integrity: sha512-eCqY2unfZK6Fe02AwFlDHLfoyEFreP6rBwAZMIJ1LugmfMiVgwWDYlp1YsRugaPtICYOabV1iWxXdP12u9U43Q==} + peerDependencies: + vue: '>=3.0.3' + + '@babel/helper-string-parser@7.25.9': + resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.25.9': + resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.27.0': + resolution: {integrity: sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/runtime@7.27.1': + resolution: {integrity: sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.27.0': + resolution: {integrity: sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==} + engines: {node: '>=6.9.0'} + + '@ctrl/tinycolor@3.6.1': + resolution: {integrity: sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==} + engines: {node: '>=10'} + + '@emotion/hash@0.9.2': + resolution: {integrity: sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==} + + '@emotion/unitless@0.8.1': + resolution: {integrity: sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==} + + '@esbuild/aix-ppc64@0.25.3': + resolution: {integrity: sha512-W8bFfPA8DowP8l//sxjJLSLkD8iEjMc7cBVyP+u4cEv9sM7mdUCkgsj+t0n/BWPFtv7WWCN5Yzj0N6FJNUUqBQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.25.3': + resolution: {integrity: sha512-XelR6MzjlZuBM4f5z2IQHK6LkK34Cvv6Rj2EntER3lwCBFdg6h2lKbtRjpTTsdEjD/WSe1q8UyPBXP1x3i/wYQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.25.3': + resolution: {integrity: sha512-PuwVXbnP87Tcff5I9ngV0lmiSu40xw1At6i3GsU77U7cjDDB4s0X2cyFuBiDa1SBk9DnvWwnGvVaGBqoFWPb7A==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.25.3': + resolution: {integrity: sha512-ogtTpYHT/g1GWS/zKM0cc/tIebFjm1F9Aw1boQ2Y0eUQ+J89d0jFY//s9ei9jVIlkYi8AfOjiixcLJSGNSOAdQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.25.3': + resolution: {integrity: sha512-eESK5yfPNTqpAmDfFWNsOhmIOaQA59tAcF/EfYvo5/QWQCzXn5iUSOnqt3ra3UdzBv073ykTtmeLJZGt3HhA+w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.25.3': + resolution: {integrity: sha512-Kd8glo7sIZtwOLcPbW0yLpKmBNWMANZhrC1r6K++uDR2zyzb6AeOYtI6udbtabmQpFaxJ8uduXMAo1gs5ozz8A==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.25.3': + resolution: {integrity: sha512-EJiyS70BYybOBpJth3M0KLOus0n+RRMKTYzhYhFeMwp7e/RaajXvP+BWlmEXNk6uk+KAu46j/kaQzr6au+JcIw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.25.3': + resolution: {integrity: sha512-Q+wSjaLpGxYf7zC0kL0nDlhsfuFkoN+EXrx2KSB33RhinWzejOd6AvgmP5JbkgXKmjhmpfgKZq24pneodYqE8Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.25.3': + resolution: {integrity: sha512-xCUgnNYhRD5bb1C1nqrDV1PfkwgbswTTBRbAd8aH5PhYzikdf/ddtsYyMXFfGSsb/6t6QaPSzxtbfAZr9uox4A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.25.3': + resolution: {integrity: sha512-dUOVmAUzuHy2ZOKIHIKHCm58HKzFqd+puLaS424h6I85GlSDRZIA5ycBixb3mFgM0Jdh+ZOSB6KptX30DD8YOQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.25.3': + resolution: {integrity: sha512-yplPOpczHOO4jTYKmuYuANI3WhvIPSVANGcNUeMlxH4twz/TeXuzEP41tGKNGWJjuMhotpGabeFYGAOU2ummBw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.25.3': + resolution: {integrity: sha512-P4BLP5/fjyihmXCELRGrLd793q/lBtKMQl8ARGpDxgzgIKJDRJ/u4r1A/HgpBpKpKZelGct2PGI4T+axcedf6g==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.25.3': + resolution: {integrity: sha512-eRAOV2ODpu6P5divMEMa26RRqb2yUoYsuQQOuFUexUoQndm4MdpXXDBbUoKIc0iPa4aCO7gIhtnYomkn2x+bag==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.25.3': + resolution: {integrity: sha512-ZC4jV2p7VbzTlnl8nZKLcBkfzIf4Yad1SJM4ZMKYnJqZFD4rTI+pBG65u8ev4jk3/MPwY9DvGn50wi3uhdaghg==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.25.3': + resolution: {integrity: sha512-LDDODcFzNtECTrUUbVCs6j9/bDVqy7DDRsuIXJg6so+mFksgwG7ZVnTruYi5V+z3eE5y+BJZw7VvUadkbfg7QA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.25.3': + resolution: {integrity: sha512-s+w/NOY2k0yC2p9SLen+ymflgcpRkvwwa02fqmAwhBRI3SC12uiS10edHHXlVWwfAagYSY5UpmT/zISXPMW3tQ==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.25.3': + resolution: {integrity: sha512-nQHDz4pXjSDC6UfOE1Fw9Q8d6GCAd9KdvMZpfVGWSJztYCarRgSDfOVBY5xwhQXseiyxapkiSJi/5/ja8mRFFA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.3': + resolution: {integrity: sha512-1QaLtOWq0mzK6tzzp0jRN3eccmN3hezey7mhLnzC6oNlJoUJz4nym5ZD7mDnS/LZQgkrhEbEiTn515lPeLpgWA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.3': + resolution: {integrity: sha512-i5Hm68HXHdgv8wkrt+10Bc50zM0/eonPb/a/OFVfB6Qvpiirco5gBA5bz7S2SHuU+Y4LWn/zehzNX14Sp4r27g==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.25.3': + resolution: {integrity: sha512-zGAVApJEYTbOC6H/3QBr2mq3upG/LBEXr85/pTtKiv2IXcgKV0RT0QA/hSXZqSvLEpXeIxah7LczB4lkiYhTAQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.3': + resolution: {integrity: sha512-fpqctI45NnCIDKBH5AXQBsD0NDPbEFczK98hk/aa6HJxbl+UtLkJV2+Bvy5hLSLk3LHmqt0NTkKNso1A9y1a4w==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.25.3': + resolution: {integrity: sha512-ROJhm7d8bk9dMCUZjkS8fgzsPAZEjtRJqCAmVgB0gMrvG7hfmPmz9k1rwO4jSiblFjYmNvbECL9uhaPzONMfgA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.25.3': + resolution: {integrity: sha512-YWcow8peiHpNBiIXHwaswPnAXLsLVygFwCB3A7Bh5jRkIBFWHGmNQ48AlX4xDvQNoMZlPYzjVOQDYEzWCqufMQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.25.3': + resolution: {integrity: sha512-qspTZOIGoXVS4DpNqUYUs9UxVb04khS1Degaw/MnfMe7goQ3lTfQ13Vw4qY/Nj0979BGvMRpAYbs/BAxEvU8ew==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.25.3': + resolution: {integrity: sha512-ICgUR+kPimx0vvRzf+N/7L7tVSQeE3BYY+NhHRHXS1kBuPO7z2+7ea2HbhDyZdTephgvNvKrlDDKUexuCVBVvg==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@fortawesome/fontawesome-free@6.7.2': + resolution: {integrity: sha512-JUOtgFW6k9u4Y+xeIaEiLr3+cjoUPiAuLXoyKOJSia6Duzb7pq+A76P9ZdPDoAoxHdHzq6gE9/jKBGXlZT8FbA==} + engines: {node: '>=6'} + + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + + '@parcel/watcher-android-arm64@2.5.1': + resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [android] + + '@parcel/watcher-darwin-arm64@2.5.1': + resolution: {integrity: sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [darwin] + + '@parcel/watcher-darwin-x64@2.5.1': + resolution: {integrity: sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [darwin] + + '@parcel/watcher-freebsd-x64@2.5.1': + resolution: {integrity: sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [freebsd] + + '@parcel/watcher-linux-arm-glibc@2.5.1': + resolution: {integrity: sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@parcel/watcher-linux-arm-musl@2.5.1': + resolution: {integrity: sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + libc: [musl] + + '@parcel/watcher-linux-arm64-glibc@2.5.1': + resolution: {integrity: sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@parcel/watcher-linux-arm64-musl@2.5.1': + resolution: {integrity: sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@parcel/watcher-linux-x64-glibc@2.5.1': + resolution: {integrity: sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@parcel/watcher-linux-x64-musl@2.5.1': + resolution: {integrity: sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@parcel/watcher-win32-arm64@2.5.1': + resolution: {integrity: sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [win32] + + '@parcel/watcher-win32-ia32@2.5.1': + resolution: {integrity: sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==} + engines: {node: '>= 10.0.0'} + cpu: [ia32] + os: [win32] + + '@parcel/watcher-win32-x64@2.5.1': + resolution: {integrity: sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [win32] + + '@parcel/watcher@2.5.1': + resolution: {integrity: sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==} + engines: {node: '>= 10.0.0'} + + '@rollup/rollup-android-arm-eabi@4.40.0': + resolution: {integrity: sha512-+Fbls/diZ0RDerhE8kyC6hjADCXA1K4yVNlH0EYfd2XjyH0UGgzaQ8MlT0pCXAThfxv3QUAczHaL+qSv1E4/Cg==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.40.0': + resolution: {integrity: sha512-PPA6aEEsTPRz+/4xxAmaoWDqh67N7wFbgFUJGMnanCFs0TV99M0M8QhhaSCks+n6EbQoFvLQgYOGXxlMGQe/6w==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.40.0': + resolution: {integrity: sha512-GwYOcOakYHdfnjjKwqpTGgn5a6cUX7+Ra2HeNj/GdXvO2VJOOXCiYYlRFU4CubFM67EhbmzLOmACKEfvp3J1kQ==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.40.0': + resolution: {integrity: sha512-CoLEGJ+2eheqD9KBSxmma6ld01czS52Iw0e2qMZNpPDlf7Z9mj8xmMemxEucinev4LgHalDPczMyxzbq+Q+EtA==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.40.0': + resolution: {integrity: sha512-r7yGiS4HN/kibvESzmrOB/PxKMhPTlz+FcGvoUIKYoTyGd5toHp48g1uZy1o1xQvybwwpqpe010JrcGG2s5nkg==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.40.0': + resolution: {integrity: sha512-mVDxzlf0oLzV3oZOr0SMJ0lSDd3xC4CmnWJ8Val8isp9jRGl5Dq//LLDSPFrasS7pSm6m5xAcKaw3sHXhBjoRw==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.40.0': + resolution: {integrity: sha512-y/qUMOpJxBMy8xCXD++jeu8t7kzjlOCkoxxajL58G62PJGBZVl/Gwpm7JK9+YvlB701rcQTzjUZ1JgUoPTnoQA==} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm-musleabihf@4.40.0': + resolution: {integrity: sha512-GoCsPibtVdJFPv/BOIvBKO/XmwZLwaNWdyD8TKlXuqp0veo2sHE+A/vpMQ5iSArRUz/uaoj4h5S6Pn0+PdhRjg==} + cpu: [arm] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-arm64-gnu@4.40.0': + resolution: {integrity: sha512-L5ZLphTjjAD9leJzSLI7rr8fNqJMlGDKlazW2tX4IUF9P7R5TMQPElpH82Q7eNIDQnQlAyiNVfRPfP2vM5Avvg==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm64-musl@4.40.0': + resolution: {integrity: sha512-ATZvCRGCDtv1Y4gpDIXsS+wfFeFuLwVxyUBSLawjgXK2tRE6fnsQEkE4csQQYWlBlsFztRzCnBvWVfcae/1qxQ==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-loongarch64-gnu@4.40.0': + resolution: {integrity: sha512-wG9e2XtIhd++QugU5MD9i7OnpaVb08ji3P1y/hNbxrQ3sYEelKJOq1UJ5dXczeo6Hj2rfDEL5GdtkMSVLa/AOg==} + cpu: [loong64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-powerpc64le-gnu@4.40.0': + resolution: {integrity: sha512-vgXfWmj0f3jAUvC7TZSU/m/cOE558ILWDzS7jBhiCAFpY2WEBn5jqgbqvmzlMjtp8KlLcBlXVD2mkTSEQE6Ixw==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-riscv64-gnu@4.40.0': + resolution: {integrity: sha512-uJkYTugqtPZBS3Z136arevt/FsKTF/J9dEMTX/cwR7lsAW4bShzI2R0pJVw+hcBTWF4dxVckYh72Hk3/hWNKvA==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-riscv64-musl@4.40.0': + resolution: {integrity: sha512-rKmSj6EXQRnhSkE22+WvrqOqRtk733x3p5sWpZilhmjnkHkpeCgWsFFo0dGnUGeA+OZjRl3+VYq+HyCOEuwcxQ==} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-s390x-gnu@4.40.0': + resolution: {integrity: sha512-SpnYlAfKPOoVsQqmTFJ0usx0z84bzGOS9anAC0AZ3rdSo3snecihbhFTlJZ8XMwzqAcodjFU4+/SM311dqE5Sw==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-gnu@4.40.0': + resolution: {integrity: sha512-RcDGMtqF9EFN8i2RYN2W+64CdHruJ5rPqrlYw+cgM3uOVPSsnAQps7cpjXe9be/yDp8UC7VLoCoKC8J3Kn2FkQ==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-musl@4.40.0': + resolution: {integrity: sha512-HZvjpiUmSNx5zFgwtQAV1GaGazT2RWvqeDi0hV+AtC8unqqDSsaFjPxfsO6qPtKRRg25SisACWnJ37Yio8ttaw==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rollup/rollup-win32-arm64-msvc@4.40.0': + resolution: {integrity: sha512-UtZQQI5k/b8d7d3i9AZmA/t+Q4tk3hOC0tMOMSq2GlMYOfxbesxG4mJSeDp0EHs30N9bsfwUvs3zF4v/RzOeTQ==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.40.0': + resolution: {integrity: sha512-+m03kvI2f5syIqHXCZLPVYplP8pQch9JHyXKZ3AGMKlg8dCyr2PKHjwRLiW53LTrN/Nc3EqHOKxUxzoSPdKddA==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.40.0': + resolution: {integrity: sha512-lpPE1cLfP5oPzVjKMx10pgBmKELQnFJXHgvtHCtuJWOv8MxqdEIMNtgHgBFf7Ea2/7EuVwa9fodWUfXAlXZLZQ==} + cpu: [x64] + os: [win32] + + '@simonwep/pickr@1.8.2': + resolution: {integrity: sha512-/l5w8BIkrpP6n1xsetx9MWPWlU6OblN5YgZZphxan0Tq4BByTCETL6lyIeY8lagalS2Nbt4F2W034KHLIiunKA==} + + '@tailwindcss/node@4.1.4': + resolution: {integrity: sha512-MT5118zaiO6x6hNA04OWInuAiP1YISXql8Z+/Y8iisV5nuhM8VXlyhRuqc2PEviPszcXI66W44bCIk500Oolhw==} + + '@tailwindcss/oxide-android-arm64@4.1.4': + resolution: {integrity: sha512-xMMAe/SaCN/vHfQYui3fqaBDEXMu22BVwQ33veLc8ep+DNy7CWN52L+TTG9y1K397w9nkzv+Mw+mZWISiqhmlA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + + '@tailwindcss/oxide-darwin-arm64@4.1.4': + resolution: {integrity: sha512-JGRj0SYFuDuAGilWFBlshcexev2hOKfNkoX+0QTksKYq2zgF9VY/vVMq9m8IObYnLna0Xlg+ytCi2FN2rOL0Sg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@tailwindcss/oxide-darwin-x64@4.1.4': + resolution: {integrity: sha512-sdDeLNvs3cYeWsEJ4H1DvjOzaGios4QbBTNLVLVs0XQ0V95bffT3+scptzYGPMjm7xv4+qMhCDrkHwhnUySEzA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@tailwindcss/oxide-freebsd-x64@4.1.4': + resolution: {integrity: sha512-VHxAqxqdghM83HslPhRsNhHo91McsxRJaEnShJOMu8mHmEj9Ig7ToHJtDukkuLWLzLboh2XSjq/0zO6wgvykNA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.4': + resolution: {integrity: sha512-OTU/m/eV4gQKxy9r5acuesqaymyeSCnsx1cFto/I1WhPmi5HDxX1nkzb8KYBiwkHIGg7CTfo/AcGzoXAJBxLfg==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-gnu@4.1.4': + resolution: {integrity: sha512-hKlLNvbmUC6z5g/J4H+Zx7f7w15whSVImokLPmP6ff1QqTVE+TxUM9PGuNsjHvkvlHUtGTdDnOvGNSEUiXI1Ww==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@tailwindcss/oxide-linux-arm64-musl@4.1.4': + resolution: {integrity: sha512-X3As2xhtgPTY/m5edUtddmZ8rCruvBvtxYLMw9OsZdH01L2gS2icsHRwxdU0dMItNfVmrBezueXZCHxVeeb7Aw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@tailwindcss/oxide-linux-x64-gnu@4.1.4': + resolution: {integrity: sha512-2VG4DqhGaDSmYIu6C4ua2vSLXnJsb/C9liej7TuSO04NK+JJJgJucDUgmX6sn7Gw3Cs5ZJ9ZLrnI0QRDOjLfNQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@tailwindcss/oxide-linux-x64-musl@4.1.4': + resolution: {integrity: sha512-v+mxVgH2kmur/X5Mdrz9m7TsoVjbdYQT0b4Z+dr+I4RvreCNXyCFELZL/DO0M1RsidZTrm6O1eMnV6zlgEzTMQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@tailwindcss/oxide-wasm32-wasi@4.1.4': + resolution: {integrity: sha512-2TLe9ir+9esCf6Wm+lLWTMbgklIjiF0pbmDnwmhR9MksVOq+e8aP3TSsXySnBDDvTTVd/vKu1aNttEGj3P6l8Q==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + bundledDependencies: + - '@napi-rs/wasm-runtime' + - '@emnapi/core' + - '@emnapi/runtime' + - '@tybys/wasm-util' + - '@emnapi/wasi-threads' + - tslib + + '@tailwindcss/oxide-win32-arm64-msvc@4.1.4': + resolution: {integrity: sha512-VlnhfilPlO0ltxW9/BgfLI5547PYzqBMPIzRrk4W7uupgCt8z6Trw/tAj6QUtF2om+1MH281Pg+HHUJoLesmng==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@tailwindcss/oxide-win32-x64-msvc@4.1.4': + resolution: {integrity: sha512-+7S63t5zhYjslUGb8NcgLpFXD+Kq1F/zt5Xv5qTv7HaFTG/DHyHD9GA6ieNAxhgyA4IcKa/zy7Xx4Oad2/wuhw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@tailwindcss/oxide@4.1.4': + resolution: {integrity: sha512-p5wOpXyOJx7mKh5MXh5oKk+kqcz8T+bA3z/5VWWeQwFrmuBItGwz8Y2CHk/sJ+dNb9B0nYFfn0rj/cKHZyjahQ==} + engines: {node: '>= 10'} + + '@tailwindcss/vite@4.1.4': + resolution: {integrity: sha512-4UQeMrONbvrsXKXXp/uxmdEN5JIJ9RkH7YVzs6AMxC/KC1+Np7WZBaNIco7TEjlkthqxZbt8pU/ipD+hKjm80A==} + peerDependencies: + vite: ^5.2.0 || ^6 + + '@types/estree@1.0.7': + resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} + + '@unhead/dom@1.11.20': + resolution: {integrity: sha512-jgfGYdOH+xHJF/j8gudjsYu3oIjFyXhCWcgKaw3vQnT616gSqyqnGQGOItL+BQtQZACKNISwIfx5PuOtztMKLA==} + + '@unhead/schema@1.11.20': + resolution: {integrity: sha512-0zWykKAaJdm+/Y7yi/Yds20PrUK7XabLe9c3IRcjnwYmSWY6z0Cr19VIs3ozCj8P+GhR+/TI2mwtGlueCEYouA==} + + '@unhead/shared@1.11.20': + resolution: {integrity: sha512-1MOrBkGgkUXS+sOKz/DBh4U20DNoITlJwpmvSInxEUNhghSNb56S0RnaHRq0iHkhrO/cDgz2zvfdlRpoPLGI3w==} + + '@unhead/ssr@1.11.20': + resolution: {integrity: sha512-j6ehzmdWGAvv0TEZyLE3WBnG1ULnsbKQcLqBDh3fvKS6b3xutcVZB7mjvrVE7ckSZt6WwOtG0ED3NJDS7IjzBA==} + + '@unhead/vue@1.11.20': + resolution: {integrity: sha512-sqQaLbwqY9TvLEGeq8Fd7+F2TIuV3nZ5ihVISHjWpAM3y7DwNWRU7NmT9+yYT+2/jw1Vjwdkv5/HvDnvCLrgmg==} + peerDependencies: + vue: '>=2.7 || >=3' + + '@vitejs/plugin-vue@5.2.3': + resolution: {integrity: sha512-IYSLEQj4LgZZuoVpdSUCw3dIynTWQgPlaRP6iAvMle4My0HdYwr5g5wQAfwOeHQBmYwEkqF70nRpSilr6PoUDg==} + engines: {node: ^18.0.0 || >=20.0.0} + peerDependencies: + vite: ^5.0.0 || ^6.0.0 + vue: ^3.2.25 + + '@vue/compiler-core@3.5.13': + resolution: {integrity: sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==} + + '@vue/compiler-dom@3.5.13': + resolution: {integrity: sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==} + + '@vue/compiler-sfc@3.5.13': + resolution: {integrity: sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==} + + '@vue/compiler-ssr@3.5.13': + resolution: {integrity: sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==} + + '@vue/devtools-api@6.6.4': + resolution: {integrity: sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==} + + '@vue/reactivity@3.5.13': + resolution: {integrity: sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==} + + '@vue/runtime-core@3.5.13': + resolution: {integrity: sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw==} + + '@vue/runtime-dom@3.5.13': + resolution: {integrity: sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog==} + + '@vue/server-renderer@3.5.13': + resolution: {integrity: sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==} + peerDependencies: + vue: 3.5.13 + + '@vue/shared@3.5.13': + resolution: {integrity: sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==} + + '@vueuse/head@2.0.0': + resolution: {integrity: sha512-ykdOxTGs95xjD4WXE4na/umxZea2Itl0GWBILas+O4oqS7eXIods38INvk3XkJKjqMdWPcpCyLX/DioLQxU1KA==} + peerDependencies: + vue: '>=2.7 || >=3' + + ant-design-vue@4.2.6: + resolution: {integrity: sha512-t7eX13Yj3i9+i5g9lqFyYneoIb3OzTvQjq9Tts1i+eiOd3Eva/6GagxBSXM1fOCjqemIu0FYVE1ByZ/38epR3Q==} + engines: {node: '>=12.22.0'} + peerDependencies: + vue: '>=3.2.0' + + array-tree-filter@2.1.0: + resolution: {integrity: sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw==} + + async-validator@4.2.5: + resolution: {integrity: sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + axios@1.9.0: + resolution: {integrity: sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + compute-scroll-into-view@1.0.20: + resolution: {integrity: sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg==} + + core-js@3.42.0: + resolution: {integrity: sha512-Sz4PP4ZA+Rq4II21qkNqOEDTDrCvcANId3xpIgB34NDkWc3UduWj2dqEtN9yZIq8Dk3HyPI33x9sqqU5C8sr0g==} + + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + dayjs@1.11.13: + resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + detect-libc@1.0.3: + resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} + engines: {node: '>=0.10'} + hasBin: true + + detect-libc@2.0.4: + resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==} + engines: {node: '>=8'} + + dom-align@1.12.4: + resolution: {integrity: sha512-R8LUSEay/68zE5c8/3BDxiTEvgb4xZTF0RKmAHfiEVN3klfIpXfi2/QCoiWPccVQ0J/ZGdz9OjzL4uJEP/MRAw==} + + dom-scroll-into-view@2.0.1: + resolution: {integrity: sha512-bvVTQe1lfaUr1oFzZX80ce9KLDlZ3iU+XGNE/bz9HnGdklTieqsbmsLHe+rT2XWqopvL0PckkYqN7ksmm5pe3w==} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + enhanced-resolve@5.18.1: + resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==} + engines: {node: '>=10.13.0'} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + esbuild@0.25.3: + resolution: {integrity: sha512-qKA6Pvai73+M2FtftpNKRxJ78GIjmFXFxd/1DVBqGo/qNhLSfv+G12n9pNoWdytJC8U00TrViOwpjT0zgqQS8Q==} + engines: {node: '>=18'} + hasBin: true + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + fdir@6.4.4: + resolution: {integrity: sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + follow-redirects@1.15.9: + resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + form-data@4.0.2: + resolution: {integrity: sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==} + engines: {node: '>= 6'} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + hookable@5.5.3: + resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} + + immutable@5.1.2: + resolution: {integrity: sha512-qHKXW1q6liAk1Oys6umoaZbDRqjcjgSrbnrifHsfsttza7zcvRAsL7mMV6xWcyhwQy7Xj5v4hhbr6b+iDYwlmQ==} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-plain-object@3.0.1: + resolution: {integrity: sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g==} + engines: {node: '>=0.10.0'} + + jiti@2.4.2: + resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} + hasBin: true + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + lightningcss-darwin-arm64@1.29.2: + resolution: {integrity: sha512-cK/eMabSViKn/PG8U/a7aCorpeKLMlK0bQeNHmdb7qUnBkNPnL+oV5DjJUo0kqWsJUapZsM4jCfYItbqBDvlcA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.29.2: + resolution: {integrity: sha512-j5qYxamyQw4kDXX5hnnCKMf3mLlHvG44f24Qyi2965/Ycz829MYqjrVg2H8BidybHBp9kom4D7DR5VqCKDXS0w==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.29.2: + resolution: {integrity: sha512-wDk7M2tM78Ii8ek9YjnY8MjV5f5JN2qNVO+/0BAGZRvXKtQrBC4/cn4ssQIpKIPP44YXw6gFdpUF+Ps+RGsCwg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.29.2: + resolution: {integrity: sha512-IRUrOrAF2Z+KExdExe3Rz7NSTuuJ2HvCGlMKoquK5pjvo2JY4Rybr+NrKnq0U0hZnx5AnGsuFHjGnNT14w26sg==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.29.2: + resolution: {integrity: sha512-KKCpOlmhdjvUTX/mBuaKemp0oeDIBBLFiU5Fnqxh1/DZ4JPZi4evEH7TKoSBFOSOV3J7iEmmBaw/8dpiUvRKlQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + lightningcss-linux-arm64-musl@1.29.2: + resolution: {integrity: sha512-Q64eM1bPlOOUgxFmoPUefqzY1yV3ctFPE6d/Vt7WzLW4rKTv7MyYNky+FWxRpLkNASTnKQUaiMJ87zNODIrrKQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [musl] + + lightningcss-linux-x64-gnu@1.29.2: + resolution: {integrity: sha512-0v6idDCPG6epLXtBH/RPkHvYx74CVziHo6TMYga8O2EiQApnUPZsbR9nFNrg2cgBzk1AYqEd95TlrsL7nYABQg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [glibc] + + lightningcss-linux-x64-musl@1.29.2: + resolution: {integrity: sha512-rMpz2yawkgGT8RULc5S4WiZopVMOFWjiItBT7aSfDX4NQav6M44rhn5hjtkKzB+wMTRlLLqxkeYEtQ3dd9696w==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [musl] + + lightningcss-win32-arm64-msvc@1.29.2: + resolution: {integrity: sha512-nL7zRW6evGQqYVu/bKGK+zShyz8OVzsCotFgc7judbt6wnB2KbiKKJwBE4SGoDBQ1O94RjW4asrCjQL4i8Fhbw==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.29.2: + resolution: {integrity: sha512-EdIUW3B2vLuHmv7urfzMI/h2fmlnOQBk1xlsDxkN1tCWKjNFjfLhGxYk8C8mzpSfr+A6jFFIi8fU6LbQGsRWjA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.29.2: + resolution: {integrity: sha512-6b6gd/RUXKaw5keVdSEtqFVdzWnU5jMxTUjA2bVcMNPLwSQ08Sv/UodBVtETLCn7k4S1Ibxwh7k68IwLZPgKaA==} + engines: {node: '>= 12.0.0'} + + lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + + lucide-vue-next@0.507.0: + resolution: {integrity: sha512-n0AZRmez4xq5vu5ZOfnrhC5wKBpu5tpwDHA6Ue2+sKyJv3USAPxqIerXLbdYbkHRW1tVZ3U9GE1MACsu6X/Z7Q==} + peerDependencies: + vue: '>=3.0.1' + + magic-string@0.30.17: + resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + nanopop@2.4.2: + resolution: {integrity: sha512-NzOgmMQ+elxxHeIha+OG/Pv3Oc3p4RU2aBhwWwAqDpXrdTbtRylbRLQztLy8dMMwfl6pclznBdfUhccEn9ZIzw==} + + node-addon-api@7.1.1: + resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} + + omit.js@2.0.2: + resolution: {integrity: sha512-hJmu9D+bNB40YpL9jYebQl4lsTW6yEHRTroJzNLqQJYHm7c+NQnJGfZmIWh8S3q3KoaxV1aLhV6B3+0N0/kyJg==} + + packrup@0.1.2: + resolution: {integrity: sha512-ZcKU7zrr5GlonoS9cxxrb5HVswGnyj6jQvwFBa6p5VFw7G71VAHcUKL5wyZSU/ECtPM/9gacWxy2KFQKt1gMNA==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} + + pinia@2.3.1: + resolution: {integrity: sha512-khUlZSwt9xXCaTbbxFYBKDc/bWAGWJjOgvxETwkTN7KRm66EeT1ZdZj6i2ceh9sP2Pzqsbc704r2yngBrxBVug==} + peerDependencies: + typescript: '>=4.4.4' + vue: ^2.7.0 || ^3.5.11 + peerDependenciesMeta: + typescript: + optional: true + + postcss@8.5.3: + resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} + engines: {node: ^10 || ^12 || >=14} + + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} + + resize-observer-polyfill@1.5.1: + resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==} + + rollup@4.40.0: + resolution: {integrity: sha512-Noe455xmA96nnqH5piFtLobsGbCij7Tu+tb3c1vYjNbTkfzGqXqQXG3wJaYXkRZuQ0vEYN4bhwg7QnIrqB5B+w==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + sass@1.88.0: + resolution: {integrity: sha512-sF6TWQqjFvr4JILXzG4ucGOLELkESHL+I5QJhh7CNaE+Yge0SI+ehCatsXhJ7ymU1hAFcIS3/PBpjdIbXoyVbg==} + engines: {node: '>=14.0.0'} + hasBin: true + + scroll-into-view-if-needed@2.2.31: + resolution: {integrity: sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA==} + + shallow-equal@1.2.1: + resolution: {integrity: sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA==} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + stylis@4.3.6: + resolution: {integrity: sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==} + + swiper@11.2.6: + resolution: {integrity: sha512-8aXpYKtjy3DjcbzZfz+/OX/GhcU5h+looA6PbAzHMZT6ESSycSp9nAjPCenczgJyslV+rUGse64LMGpWE3PX9Q==} + engines: {node: '>= 4.7.0'} + + tailwindcss@4.1.4: + resolution: {integrity: sha512-1ZIUqtPITFbv/DxRmDr5/agPqJwF69d24m9qmM1939TJehgY539CtzeZRjbLt5G6fSy/7YqqYsfvoTEw9xUI2A==} + + tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + + throttle-debounce@5.0.2: + resolution: {integrity: sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A==} + engines: {node: '>=12.22'} + + tinyglobby@0.2.13: + resolution: {integrity: sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==} + engines: {node: '>=12.0.0'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + unhead@1.11.20: + resolution: {integrity: sha512-3AsNQC0pjwlLqEYHLjtichGWankK8yqmocReITecmpB1H0aOabeESueyy+8X1gyJx4ftZVwo9hqQ4O3fPWffCA==} + + vite@6.3.3: + resolution: {integrity: sha512-5nXH+QsELbFKhsEfWLkHrvgRpTdGJzqOZ+utSdmPTvwHmvU6ITTm3xx+mRusihkcI8GeC7lCDyn3kDtiki9scw==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + jiti: '>=1.21.0' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vue-demi@0.14.10: + resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==} + engines: {node: '>=12'} + hasBin: true + peerDependencies: + '@vue/composition-api': ^1.0.0-rc.1 + vue: ^3.0.0-0 || ^2.6.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + + vue-router@4.5.1: + resolution: {integrity: sha512-ogAF3P97NPm8fJsE4by9dwSYtDwXIY1nFY9T6DyQnGHd1E2Da94w9JIolpe42LJGIl0DwOHBi8TcRPlPGwbTtw==} + peerDependencies: + vue: ^3.2.0 + + vue-types@3.0.2: + resolution: {integrity: sha512-IwUC0Aq2zwaXqy74h4WCvFCUtoV0iSWr0snWnE9TnU18S66GAQyqQbRf2qfJtUuiFsBf6qp0MEwdonlwznlcrw==} + engines: {node: '>=10.15.0'} + peerDependencies: + vue: ^3.0.0 + + vue@3.5.13: + resolution: {integrity: sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + warning@4.0.3: + resolution: {integrity: sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==} + + zhead@2.2.4: + resolution: {integrity: sha512-8F0OI5dpWIA5IGG5NHUg9staDwz/ZPxZtvGVf01j7vHqSyZ0raHY+78atOVxRqb73AotX22uV1pXt3gYSstGag==} + +snapshots: + + '@ant-design-vue/pro-layout@3.2.5(ant-design-vue@4.2.6(vue@3.5.13))(vue@3.5.13)': + dependencies: + '@ant-design/icons-vue': 6.1.0(vue@3.5.13) + ant-design-vue: 4.2.6(vue@3.5.13) + omit.js: 2.0.2 + vue: 3.5.13 + + '@ant-design/colors@6.0.0': + dependencies: + '@ctrl/tinycolor': 3.6.1 + + '@ant-design/icons-svg@4.4.2': {} + + '@ant-design/icons-vue@6.1.0(vue@3.5.13)': + dependencies: + '@ant-design/colors': 6.0.0 + '@ant-design/icons-svg': 4.4.2 + vue: 3.5.13 + + '@ant-design/icons-vue@7.0.1(vue@3.5.13)': + dependencies: + '@ant-design/colors': 6.0.0 + '@ant-design/icons-svg': 4.4.2 + vue: 3.5.13 + + '@babel/helper-string-parser@7.25.9': {} + + '@babel/helper-validator-identifier@7.25.9': {} + + '@babel/parser@7.27.0': + dependencies: + '@babel/types': 7.27.0 + + '@babel/runtime@7.27.1': {} + + '@babel/types@7.27.0': + dependencies: + '@babel/helper-string-parser': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + + '@ctrl/tinycolor@3.6.1': {} + + '@emotion/hash@0.9.2': {} + + '@emotion/unitless@0.8.1': {} + + '@esbuild/aix-ppc64@0.25.3': + optional: true + + '@esbuild/android-arm64@0.25.3': + optional: true + + '@esbuild/android-arm@0.25.3': + optional: true + + '@esbuild/android-x64@0.25.3': + optional: true + + '@esbuild/darwin-arm64@0.25.3': + optional: true + + '@esbuild/darwin-x64@0.25.3': + optional: true + + '@esbuild/freebsd-arm64@0.25.3': + optional: true + + '@esbuild/freebsd-x64@0.25.3': + optional: true + + '@esbuild/linux-arm64@0.25.3': + optional: true + + '@esbuild/linux-arm@0.25.3': + optional: true + + '@esbuild/linux-ia32@0.25.3': + optional: true + + '@esbuild/linux-loong64@0.25.3': + optional: true + + '@esbuild/linux-mips64el@0.25.3': + optional: true + + '@esbuild/linux-ppc64@0.25.3': + optional: true + + '@esbuild/linux-riscv64@0.25.3': + optional: true + + '@esbuild/linux-s390x@0.25.3': + optional: true + + '@esbuild/linux-x64@0.25.3': + optional: true + + '@esbuild/netbsd-arm64@0.25.3': + optional: true + + '@esbuild/netbsd-x64@0.25.3': + optional: true + + '@esbuild/openbsd-arm64@0.25.3': + optional: true + + '@esbuild/openbsd-x64@0.25.3': + optional: true + + '@esbuild/sunos-x64@0.25.3': + optional: true + + '@esbuild/win32-arm64@0.25.3': + optional: true + + '@esbuild/win32-ia32@0.25.3': + optional: true + + '@esbuild/win32-x64@0.25.3': + optional: true + + '@fortawesome/fontawesome-free@6.7.2': {} + + '@jridgewell/sourcemap-codec@1.5.0': {} + + '@parcel/watcher-android-arm64@2.5.1': + optional: true + + '@parcel/watcher-darwin-arm64@2.5.1': + optional: true + + '@parcel/watcher-darwin-x64@2.5.1': + optional: true + + '@parcel/watcher-freebsd-x64@2.5.1': + optional: true + + '@parcel/watcher-linux-arm-glibc@2.5.1': + optional: true + + '@parcel/watcher-linux-arm-musl@2.5.1': + optional: true + + '@parcel/watcher-linux-arm64-glibc@2.5.1': + optional: true + + '@parcel/watcher-linux-arm64-musl@2.5.1': + optional: true + + '@parcel/watcher-linux-x64-glibc@2.5.1': + optional: true + + '@parcel/watcher-linux-x64-musl@2.5.1': + optional: true + + '@parcel/watcher-win32-arm64@2.5.1': + optional: true + + '@parcel/watcher-win32-ia32@2.5.1': + optional: true + + '@parcel/watcher-win32-x64@2.5.1': + optional: true + + '@parcel/watcher@2.5.1': + dependencies: + detect-libc: 1.0.3 + is-glob: 4.0.3 + micromatch: 4.0.8 + node-addon-api: 7.1.1 + optionalDependencies: + '@parcel/watcher-android-arm64': 2.5.1 + '@parcel/watcher-darwin-arm64': 2.5.1 + '@parcel/watcher-darwin-x64': 2.5.1 + '@parcel/watcher-freebsd-x64': 2.5.1 + '@parcel/watcher-linux-arm-glibc': 2.5.1 + '@parcel/watcher-linux-arm-musl': 2.5.1 + '@parcel/watcher-linux-arm64-glibc': 2.5.1 + '@parcel/watcher-linux-arm64-musl': 2.5.1 + '@parcel/watcher-linux-x64-glibc': 2.5.1 + '@parcel/watcher-linux-x64-musl': 2.5.1 + '@parcel/watcher-win32-arm64': 2.5.1 + '@parcel/watcher-win32-ia32': 2.5.1 + '@parcel/watcher-win32-x64': 2.5.1 + optional: true + + '@rollup/rollup-android-arm-eabi@4.40.0': + optional: true + + '@rollup/rollup-android-arm64@4.40.0': + optional: true + + '@rollup/rollup-darwin-arm64@4.40.0': + optional: true + + '@rollup/rollup-darwin-x64@4.40.0': + optional: true + + '@rollup/rollup-freebsd-arm64@4.40.0': + optional: true + + '@rollup/rollup-freebsd-x64@4.40.0': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.40.0': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.40.0': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.40.0': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.40.0': + optional: true + + '@rollup/rollup-linux-loongarch64-gnu@4.40.0': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.40.0': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.40.0': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.40.0': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.40.0': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.40.0': + optional: true + + '@rollup/rollup-linux-x64-musl@4.40.0': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.40.0': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.40.0': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.40.0': + optional: true + + '@simonwep/pickr@1.8.2': + dependencies: + core-js: 3.42.0 + nanopop: 2.4.2 + + '@tailwindcss/node@4.1.4': + dependencies: + enhanced-resolve: 5.18.1 + jiti: 2.4.2 + lightningcss: 1.29.2 + tailwindcss: 4.1.4 + + '@tailwindcss/oxide-android-arm64@4.1.4': + optional: true + + '@tailwindcss/oxide-darwin-arm64@4.1.4': + optional: true + + '@tailwindcss/oxide-darwin-x64@4.1.4': + optional: true + + '@tailwindcss/oxide-freebsd-x64@4.1.4': + optional: true + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.4': + optional: true + + '@tailwindcss/oxide-linux-arm64-gnu@4.1.4': + optional: true + + '@tailwindcss/oxide-linux-arm64-musl@4.1.4': + optional: true + + '@tailwindcss/oxide-linux-x64-gnu@4.1.4': + optional: true + + '@tailwindcss/oxide-linux-x64-musl@4.1.4': + optional: true + + '@tailwindcss/oxide-wasm32-wasi@4.1.4': + optional: true + + '@tailwindcss/oxide-win32-arm64-msvc@4.1.4': + optional: true + + '@tailwindcss/oxide-win32-x64-msvc@4.1.4': + optional: true + + '@tailwindcss/oxide@4.1.4': + optionalDependencies: + '@tailwindcss/oxide-android-arm64': 4.1.4 + '@tailwindcss/oxide-darwin-arm64': 4.1.4 + '@tailwindcss/oxide-darwin-x64': 4.1.4 + '@tailwindcss/oxide-freebsd-x64': 4.1.4 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.4 + '@tailwindcss/oxide-linux-arm64-gnu': 4.1.4 + '@tailwindcss/oxide-linux-arm64-musl': 4.1.4 + '@tailwindcss/oxide-linux-x64-gnu': 4.1.4 + '@tailwindcss/oxide-linux-x64-musl': 4.1.4 + '@tailwindcss/oxide-wasm32-wasi': 4.1.4 + '@tailwindcss/oxide-win32-arm64-msvc': 4.1.4 + '@tailwindcss/oxide-win32-x64-msvc': 4.1.4 + + '@tailwindcss/vite@4.1.4(vite@6.3.3(jiti@2.4.2)(lightningcss@1.29.2)(sass@1.88.0))': + dependencies: + '@tailwindcss/node': 4.1.4 + '@tailwindcss/oxide': 4.1.4 + tailwindcss: 4.1.4 + vite: 6.3.3(jiti@2.4.2)(lightningcss@1.29.2)(sass@1.88.0) + + '@types/estree@1.0.7': {} + + '@unhead/dom@1.11.20': + dependencies: + '@unhead/schema': 1.11.20 + '@unhead/shared': 1.11.20 + + '@unhead/schema@1.11.20': + dependencies: + hookable: 5.5.3 + zhead: 2.2.4 + + '@unhead/shared@1.11.20': + dependencies: + '@unhead/schema': 1.11.20 + packrup: 0.1.2 + + '@unhead/ssr@1.11.20': + dependencies: + '@unhead/schema': 1.11.20 + '@unhead/shared': 1.11.20 + + '@unhead/vue@1.11.20(vue@3.5.13)': + dependencies: + '@unhead/schema': 1.11.20 + '@unhead/shared': 1.11.20 + hookable: 5.5.3 + unhead: 1.11.20 + vue: 3.5.13 + + '@vitejs/plugin-vue@5.2.3(vite@6.3.3(jiti@2.4.2)(lightningcss@1.29.2)(sass@1.88.0))(vue@3.5.13)': + dependencies: + vite: 6.3.3(jiti@2.4.2)(lightningcss@1.29.2)(sass@1.88.0) + vue: 3.5.13 + + '@vue/compiler-core@3.5.13': + dependencies: + '@babel/parser': 7.27.0 + '@vue/shared': 3.5.13 + entities: 4.5.0 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + + '@vue/compiler-dom@3.5.13': + dependencies: + '@vue/compiler-core': 3.5.13 + '@vue/shared': 3.5.13 + + '@vue/compiler-sfc@3.5.13': + dependencies: + '@babel/parser': 7.27.0 + '@vue/compiler-core': 3.5.13 + '@vue/compiler-dom': 3.5.13 + '@vue/compiler-ssr': 3.5.13 + '@vue/shared': 3.5.13 + estree-walker: 2.0.2 + magic-string: 0.30.17 + postcss: 8.5.3 + source-map-js: 1.2.1 + + '@vue/compiler-ssr@3.5.13': + dependencies: + '@vue/compiler-dom': 3.5.13 + '@vue/shared': 3.5.13 + + '@vue/devtools-api@6.6.4': {} + + '@vue/reactivity@3.5.13': + dependencies: + '@vue/shared': 3.5.13 + + '@vue/runtime-core@3.5.13': + dependencies: + '@vue/reactivity': 3.5.13 + '@vue/shared': 3.5.13 + + '@vue/runtime-dom@3.5.13': + dependencies: + '@vue/reactivity': 3.5.13 + '@vue/runtime-core': 3.5.13 + '@vue/shared': 3.5.13 + csstype: 3.1.3 + + '@vue/server-renderer@3.5.13(vue@3.5.13)': + dependencies: + '@vue/compiler-ssr': 3.5.13 + '@vue/shared': 3.5.13 + vue: 3.5.13 + + '@vue/shared@3.5.13': {} + + '@vueuse/head@2.0.0(vue@3.5.13)': + dependencies: + '@unhead/dom': 1.11.20 + '@unhead/schema': 1.11.20 + '@unhead/ssr': 1.11.20 + '@unhead/vue': 1.11.20(vue@3.5.13) + vue: 3.5.13 + + ant-design-vue@4.2.6(vue@3.5.13): + dependencies: + '@ant-design/colors': 6.0.0 + '@ant-design/icons-vue': 7.0.1(vue@3.5.13) + '@babel/runtime': 7.27.1 + '@ctrl/tinycolor': 3.6.1 + '@emotion/hash': 0.9.2 + '@emotion/unitless': 0.8.1 + '@simonwep/pickr': 1.8.2 + array-tree-filter: 2.1.0 + async-validator: 4.2.5 + csstype: 3.1.3 + dayjs: 1.11.13 + dom-align: 1.12.4 + dom-scroll-into-view: 2.0.1 + lodash: 4.17.21 + lodash-es: 4.17.21 + resize-observer-polyfill: 1.5.1 + scroll-into-view-if-needed: 2.2.31 + shallow-equal: 1.2.1 + stylis: 4.3.6 + throttle-debounce: 5.0.2 + vue: 3.5.13 + vue-types: 3.0.2(vue@3.5.13) + warning: 4.0.3 + + array-tree-filter@2.1.0: {} + + async-validator@4.2.5: {} + + asynckit@0.4.0: {} + + axios@1.9.0: + dependencies: + follow-redirects: 1.15.9 + form-data: 4.0.2 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + optional: true + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + chokidar@4.0.3: + dependencies: + readdirp: 4.1.2 + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + compute-scroll-into-view@1.0.20: {} + + core-js@3.42.0: {} + + csstype@3.1.3: {} + + dayjs@1.11.13: {} + + delayed-stream@1.0.0: {} + + detect-libc@1.0.3: + optional: true + + detect-libc@2.0.4: {} + + dom-align@1.12.4: {} + + dom-scroll-into-view@2.0.1: {} + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + enhanced-resolve@5.18.1: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.1 + + entities@4.5.0: {} + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + esbuild@0.25.3: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.3 + '@esbuild/android-arm': 0.25.3 + '@esbuild/android-arm64': 0.25.3 + '@esbuild/android-x64': 0.25.3 + '@esbuild/darwin-arm64': 0.25.3 + '@esbuild/darwin-x64': 0.25.3 + '@esbuild/freebsd-arm64': 0.25.3 + '@esbuild/freebsd-x64': 0.25.3 + '@esbuild/linux-arm': 0.25.3 + '@esbuild/linux-arm64': 0.25.3 + '@esbuild/linux-ia32': 0.25.3 + '@esbuild/linux-loong64': 0.25.3 + '@esbuild/linux-mips64el': 0.25.3 + '@esbuild/linux-ppc64': 0.25.3 + '@esbuild/linux-riscv64': 0.25.3 + '@esbuild/linux-s390x': 0.25.3 + '@esbuild/linux-x64': 0.25.3 + '@esbuild/netbsd-arm64': 0.25.3 + '@esbuild/netbsd-x64': 0.25.3 + '@esbuild/openbsd-arm64': 0.25.3 + '@esbuild/openbsd-x64': 0.25.3 + '@esbuild/sunos-x64': 0.25.3 + '@esbuild/win32-arm64': 0.25.3 + '@esbuild/win32-ia32': 0.25.3 + '@esbuild/win32-x64': 0.25.3 + + estree-walker@2.0.2: {} + + fdir@6.4.4(picomatch@4.0.2): + optionalDependencies: + picomatch: 4.0.2 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + optional: true + + follow-redirects@1.15.9: {} + + form-data@4.0.2: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + mime-types: 2.1.35 + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + gopd@1.2.0: {} + + graceful-fs@4.2.11: {} + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + hookable@5.5.3: {} + + immutable@5.1.2: {} + + is-extglob@2.1.1: + optional: true + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + optional: true + + is-number@7.0.0: + optional: true + + is-plain-object@3.0.1: {} + + jiti@2.4.2: {} + + js-tokens@4.0.0: {} + + lightningcss-darwin-arm64@1.29.2: + optional: true + + lightningcss-darwin-x64@1.29.2: + optional: true + + lightningcss-freebsd-x64@1.29.2: + optional: true + + lightningcss-linux-arm-gnueabihf@1.29.2: + optional: true + + lightningcss-linux-arm64-gnu@1.29.2: + optional: true + + lightningcss-linux-arm64-musl@1.29.2: + optional: true + + lightningcss-linux-x64-gnu@1.29.2: + optional: true + + lightningcss-linux-x64-musl@1.29.2: + optional: true + + lightningcss-win32-arm64-msvc@1.29.2: + optional: true + + lightningcss-win32-x64-msvc@1.29.2: + optional: true + + lightningcss@1.29.2: + dependencies: + detect-libc: 2.0.4 + optionalDependencies: + lightningcss-darwin-arm64: 1.29.2 + lightningcss-darwin-x64: 1.29.2 + lightningcss-freebsd-x64: 1.29.2 + lightningcss-linux-arm-gnueabihf: 1.29.2 + lightningcss-linux-arm64-gnu: 1.29.2 + lightningcss-linux-arm64-musl: 1.29.2 + lightningcss-linux-x64-gnu: 1.29.2 + lightningcss-linux-x64-musl: 1.29.2 + lightningcss-win32-arm64-msvc: 1.29.2 + lightningcss-win32-x64-msvc: 1.29.2 + + lodash-es@4.17.21: {} + + lodash@4.17.21: {} + + loose-envify@1.4.0: + dependencies: + js-tokens: 4.0.0 + + lucide-vue-next@0.507.0(vue@3.5.13): + dependencies: + vue: 3.5.13 + + magic-string@0.30.17: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + + math-intrinsics@1.1.0: {} + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + optional: true + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + nanoid@3.3.11: {} + + nanopop@2.4.2: {} + + node-addon-api@7.1.1: + optional: true + + omit.js@2.0.2: {} + + packrup@0.1.2: {} + + picocolors@1.1.1: {} + + picomatch@2.3.1: + optional: true + + picomatch@4.0.2: {} + + pinia@2.3.1(vue@3.5.13): + dependencies: + '@vue/devtools-api': 6.6.4 + vue: 3.5.13 + vue-demi: 0.14.10(vue@3.5.13) + transitivePeerDependencies: + - '@vue/composition-api' + + postcss@8.5.3: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + proxy-from-env@1.1.0: {} + + readdirp@4.1.2: {} + + resize-observer-polyfill@1.5.1: {} + + rollup@4.40.0: + dependencies: + '@types/estree': 1.0.7 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.40.0 + '@rollup/rollup-android-arm64': 4.40.0 + '@rollup/rollup-darwin-arm64': 4.40.0 + '@rollup/rollup-darwin-x64': 4.40.0 + '@rollup/rollup-freebsd-arm64': 4.40.0 + '@rollup/rollup-freebsd-x64': 4.40.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.40.0 + '@rollup/rollup-linux-arm-musleabihf': 4.40.0 + '@rollup/rollup-linux-arm64-gnu': 4.40.0 + '@rollup/rollup-linux-arm64-musl': 4.40.0 + '@rollup/rollup-linux-loongarch64-gnu': 4.40.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.40.0 + '@rollup/rollup-linux-riscv64-gnu': 4.40.0 + '@rollup/rollup-linux-riscv64-musl': 4.40.0 + '@rollup/rollup-linux-s390x-gnu': 4.40.0 + '@rollup/rollup-linux-x64-gnu': 4.40.0 + '@rollup/rollup-linux-x64-musl': 4.40.0 + '@rollup/rollup-win32-arm64-msvc': 4.40.0 + '@rollup/rollup-win32-ia32-msvc': 4.40.0 + '@rollup/rollup-win32-x64-msvc': 4.40.0 + fsevents: 2.3.3 + + sass@1.88.0: + dependencies: + chokidar: 4.0.3 + immutable: 5.1.2 + source-map-js: 1.2.1 + optionalDependencies: + '@parcel/watcher': 2.5.1 + + scroll-into-view-if-needed@2.2.31: + dependencies: + compute-scroll-into-view: 1.0.20 + + shallow-equal@1.2.1: {} + + source-map-js@1.2.1: {} + + stylis@4.3.6: {} + + swiper@11.2.6: {} + + tailwindcss@4.1.4: {} + + tapable@2.2.1: {} + + throttle-debounce@5.0.2: {} + + tinyglobby@0.2.13: + dependencies: + fdir: 6.4.4(picomatch@4.0.2) + picomatch: 4.0.2 + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + optional: true + + unhead@1.11.20: + dependencies: + '@unhead/dom': 1.11.20 + '@unhead/schema': 1.11.20 + '@unhead/shared': 1.11.20 + hookable: 5.5.3 + + vite@6.3.3(jiti@2.4.2)(lightningcss@1.29.2)(sass@1.88.0): + dependencies: + esbuild: 0.25.3 + fdir: 6.4.4(picomatch@4.0.2) + picomatch: 4.0.2 + postcss: 8.5.3 + rollup: 4.40.0 + tinyglobby: 0.2.13 + optionalDependencies: + fsevents: 2.3.3 + jiti: 2.4.2 + lightningcss: 1.29.2 + sass: 1.88.0 + + vue-demi@0.14.10(vue@3.5.13): + dependencies: + vue: 3.5.13 + + vue-router@4.5.1(vue@3.5.13): + dependencies: + '@vue/devtools-api': 6.6.4 + vue: 3.5.13 + + vue-types@3.0.2(vue@3.5.13): + dependencies: + is-plain-object: 3.0.1 + vue: 3.5.13 + + vue@3.5.13: + dependencies: + '@vue/compiler-dom': 3.5.13 + '@vue/compiler-sfc': 3.5.13 + '@vue/runtime-dom': 3.5.13 + '@vue/server-renderer': 3.5.13(vue@3.5.13) + '@vue/shared': 3.5.13 + + warning@4.0.3: + dependencies: + loose-envify: 1.4.0 + + zhead@2.2.4: {} diff --git a/public/vite.svg b/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/App.vue b/src/App.vue new file mode 100644 index 0000000..0a3d71e --- /dev/null +++ b/src/App.vue @@ -0,0 +1,11 @@ + + + + + + diff --git a/src/api/index.js b/src/api/index.js new file mode 100644 index 0000000..558d5d0 --- /dev/null +++ b/src/api/index.js @@ -0,0 +1,290 @@ +// API 基础配置 +const API_BASE_URL = 'http://localhost:3000/api' + +// 通用请求函数 +const request = async (url, options = {}) => { + const config = { + headers: { + 'Content-Type': 'application/json', + ...options.headers, + }, + ...options, + } + + try { + const response = await fetch(`${API_BASE_URL}${url}`, config) + + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`) + } + + return await response.json() + } catch (error) { + console.error('API request failed:', error) + // 返回模拟数据以避免错误 + return getMockData(url, options.method || 'GET') + } +} + +// 模拟数据函数 +const getMockData = (url, method) => { + // 文章相关模拟数据 + if (url.includes('/articles')) { + if (method === 'GET' && url.includes('/articles/')) { + const id = url.split('/').pop() + return { + data: { + id: parseInt(id), + title: 'Vue 3 Composition API 深度解析', + summary: '详细介绍Vue 3中Composition API的使用方法和最佳实践', + content: ` +

什么是Composition API

+

Composition API是Vue 3中引入的一套新的API,它提供了一种更灵活的方式来组织组件逻辑。

+ +

主要特性

+
    +
  • 更好的逻辑复用
  • +
  • 更好的类型推导
  • +
  • 更小的生产包体积
  • +
  • 更好的Tree-shaking支持
  • +
+ `, + category: 'technology', + author: '张三', + publishedAt: '2024-01-15', + views: 1250, + image: 'https://images.unsplash.com/photo-1633356122544-f134324a6cee?w=800&h=400&fit=crop', + tags: ['Vue3', 'JavaScript', '前端开发'] + } + } + } else if (method === 'GET') { + return { + data: [ + { + id: 1, + title: 'Vue 3 Composition API 深度解析', + summary: '详细介绍Vue 3中Composition API的使用方法和最佳实践', + category: 'technology', + author: '张三', + publishedAt: '2024-01-15', + views: 1250, + image: 'https://images.unsplash.com/photo-1633356122544-f134324a6cee?w=400&h=200&fit=crop', + tags: ['Vue3', 'JavaScript', '前端开发'] + }, + { + id: 2, + title: 'React Hooks 最佳实践指南', + summary: '从基础到进阶,全面掌握React Hooks的使用技巧', + category: 'technology', + author: '李四', + publishedAt: '2024-01-14', + views: 890, + image: 'https://images.unsplash.com/photo-1555066931-4365d14bab8c?w=400&h=200&fit=crop', + tags: ['React', 'Hooks', '前端开发'] + } + ], + total: 2, + page: 1, + pageSize: 10 + } + } + } + + // 新闻相关模拟数据 + if (url.includes('/news')) { + if (method === 'GET' && url.includes('/news/')) { + const id = url.split('/').pop() + return { + data: { + id: parseInt(id), + title: '公司成功获得ISO9001质量管理体系认证', + summary: '经过严格的审核流程,我们公司正式获得ISO9001质量管理体系认证', + content: ` +

经过为期三个月的严格审核流程,我们公司正式获得了ISO9001质量管理体系认证。这一重要里程碑标志着我们在质量管理方面达到了国际先进水平。

+ +

认证过程

+

ISO9001认证过程包括了文件审核、现场审核等多个环节。审核专家对我们的质量管理体系进行了全面评估。

+ `, + category: 'company', + author: '管理员', + publishedAt: '2024-01-15', + views: 1250, + image: 'https://images.unsplash.com/photo-1560472354-b33ff0c44a43?w=800&h=400&fit=crop', + tags: ['ISO9001', '质量管理', '认证'] + } + } + } else if (method === 'GET') { + return { + data: [ + { + id: 1, + title: '公司成功获得ISO9001质量管理体系认证', + summary: '经过严格的审核流程,我们公司正式获得ISO9001质量管理体系认证', + category: 'company', + author: '管理员', + publishedAt: '2024-01-15', + views: 1250, + image: 'https://images.unsplash.com/photo-1560472354-b33ff0c44a43?w=400&h=200&fit=crop' + }, + { + id: 2, + title: '行业数字化转型趋势分析报告发布', + summary: '我们发布了最新的行业数字化转型趋势分析报告', + category: 'industry', + author: '研究部', + publishedAt: '2024-01-14', + views: 890, + image: 'https://images.unsplash.com/photo-1551288049-bebda4e38f71?w=400&h=200&fit=crop' + } + ], + total: 2, + page: 1, + pageSize: 10 + } + } + } + + return { data: null, message: 'Mock data not found' } +} + +// 文章相关API +export const articlesAPI = { + // 获取文章列表 + getList: (params = {}) => { + const queryString = new URLSearchParams(params).toString() + return request(`/articles?${queryString}`) + }, + + // 获取文章详情 + getDetail: (id) => { + return request(`/articles/${id}`) + }, + + // 创建文章 + create: (data) => { + return request('/articles', { + method: 'POST', + body: JSON.stringify(data), + }) + }, + + // 更新文章 + update: (id, data) => { + return request(`/articles/${id}`, { + method: 'PUT', + body: JSON.stringify(data), + }) + }, + + // 删除文章 + delete: (id) => { + return request(`/articles/${id}`, { + method: 'DELETE', + }) + }, +} + +// 新闻相关API +export const newsAPI = { + // 获取新闻列表 + getList: (params = {}) => { + const queryString = new URLSearchParams(params).toString() + return request(`/news?${queryString}`) + }, + + // 获取新闻详情 + getDetail: (id) => { + return request(`/news/${id}`) + }, + + // 创建新闻 + create: (data) => { + return request('/news', { + method: 'POST', + body: JSON.stringify(data), + }) + }, + + // 更新新闻 + update: (id, data) => { + return request(`/news/${id}`, { + method: 'PUT', + body: JSON.stringify(data), + }) + }, + + // 删除新闻 + delete: (id) => { + return request(`/news/${id}`, { + method: 'DELETE', + }) + }, +} + +// 用户相关API +export const userAPI = { + // 用户登录 + login: (credentials) => { + return request('/auth/login', { + method: 'POST', + body: JSON.stringify(credentials), + }) + }, + + // 用户注册 + register: (userData) => { + return request('/auth/register', { + method: 'POST', + body: JSON.stringify(userData), + }) + }, + + // 获取用户信息 + getProfile: () => { + return request('/user/profile') + }, + + // 更新用户信息 + updateProfile: (data) => { + return request('/user/profile', { + method: 'PUT', + body: JSON.stringify(data), + }) + }, +} + +// 联系表单API +export const contactAPI = { + // 发送联系消息 + sendMessage: (data) => { + return request('/contact', { + method: 'POST', + body: JSON.stringify(data), + }) + }, +} + +// 系统设置API +export const settingsAPI = { + // 获取系统设置 + get: () => { + return request('/settings') + }, + + // 更新系统设置 + update: (data) => { + return request('/settings', { + method: 'PUT', + body: JSON.stringify(data), + }) + }, +} + +// 默认导出 +export default { + articlesAPI, + newsAPI, + userAPI, + contactAPI, + settingsAPI, +} \ No newline at end of file diff --git a/src/api/request.js b/src/api/request.js new file mode 100644 index 0000000..193d05f --- /dev/null +++ b/src/api/request.js @@ -0,0 +1,75 @@ +import axios from 'axios'; +import {message as msg} from "ant-design-vue"; + +// 创建 Axios 实例 +const service = axios.create({ + baseURL: '/api/', // 这里可以设置你的 API 基础地址 + timeout: 5000 // 请求超时时间 +}); + +// 请求拦截器 +service.interceptors.request.use( + config => { + // 从本地存储中获取 token + const token = localStorage.getItem('token'); + if (token) { + // 设置请求头中的 Authorization + config.headers['Authorization'] = `Bearer ${token}`; + } + return config; + }, + error => { + console.log(error); // 打印错误信息 + return Promise.reject(error); + } +); + +// 响应拦截器 +service.interceptors.response.use( + response => { + const {code, result, message} = response.data; + if (code === 0) { + return result; + } else { + if (code === 401) { + msg.error(message).then(r => { + localStorage.removeItem('token'); + localStorage.removeItem('user'); + window.location.href = '/' + msg.destroy() + }) + return; + } + msg.error(message).then(r => { + msg.destroy() + }) + } + }, + error => { + console.log('err' + error); // 打印错误信息 + return Promise.reject(error); + } +); + +// 封装 get 请求 +const get = (url, params = {}) => { + return service.get(url, { params }); +}; + +// 封装 post 请求 +const post = (url, data = {}) => { + return service.post(url, data); +}; + +// 封装上传文件请求 +const upload = (url, file) => { + const formData = new FormData(); + formData.append('file', file); + return service.post(url, formData, { + headers: { + 'Content-Type': 'multipart/form-data' + } + }); +}; + +export { get, post, upload }; \ No newline at end of file diff --git a/src/api/request/upload.js b/src/api/request/upload.js new file mode 100644 index 0000000..f7d7d88 --- /dev/null +++ b/src/api/request/upload.js @@ -0,0 +1,10 @@ +import {upload} from '../request.js' + +const prefix = 'upload' + +export function uploadImageApi(credentials) { + return upload(`${prefix}/image`, credentials) +} +export function uploadVideoApi(credentials) { + return upload(`${prefix}/video`, credentials) +} \ No newline at end of file diff --git a/src/api/request/user.js b/src/api/request/user.js new file mode 100644 index 0000000..54a22dc --- /dev/null +++ b/src/api/request/user.js @@ -0,0 +1,92 @@ +import {get, post} from '../request.js' + +const prefix = 'user' + +/** + * 登录 + * @param credentials + * @returns {Promise>} + */ +export function loginApi(credentials) { + return post('login', credentials) +} +/** + * 注册 + * @param credentials + * @returns {Promise>} + */ +export function registerApi(credentials) { + return post('register', credentials) +} + +/** + * 获取用户列表 + * @param credentials + * @returns {Promise>} + */ +export function userListApi(credentials) { + return get(`${prefix}/list`, credentials) +} + +/** + * 获取当前登录用户信息 + * @param credentials + * @returns {Promise>} + */ +export function userMyInfoApi(credentials) { + return get(`${prefix}/my-info`, credentials) +} + +/** + * 获取用户统计信息 + * @param credentials + * @returns {Promise>} + */ +export function userStatsApi(credentials) { + return get(`${prefix}/user-stats`, credentials) +} + +/** + * 创建用户 + * @param credentials + * @returns {Promise>} + */ +export function createUserApi(credentials) { + return post(`${prefix}/create`, credentials) +} + +/** + * 更新用户 + * @param credentials + * @returns {Promise>} + */ +export function updateUserApi(credentials) { + return post(`${prefix}/update`, credentials) +} + +/** + * 删除用户 + * @param credentials + * @returns {Promise>} + */ +export function deleteUserApi(credentials) { + return post(`${prefix}/delete`, credentials) +} + +/** + * 重置密码 + * @param credentials + * @returns {Promise>} + */ +export function resetPasswordApi(credentials) { + return post(`${prefix}/reset-password`, credentials) +} + +/** + * 重置密码 + * @param credentials + * @returns {Promise>} + */ +export function changePasswordApi(credentials) { + return post(`${prefix}/change-password`, credentials) +} \ No newline at end of file diff --git a/src/assets/vue.svg b/src/assets/vue.svg new file mode 100644 index 0000000..770e9d3 --- /dev/null +++ b/src/assets/vue.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/components/EmptyState.vue b/src/components/EmptyState.vue new file mode 100644 index 0000000..3de48a1 --- /dev/null +++ b/src/components/EmptyState.vue @@ -0,0 +1,42 @@ + + + \ No newline at end of file diff --git a/src/layouts/AdminLayout.vue b/src/layouts/AdminLayout.vue new file mode 100644 index 0000000..c85daee --- /dev/null +++ b/src/layouts/AdminLayout.vue @@ -0,0 +1,251 @@ + + + \ No newline at end of file diff --git a/src/layouts/Footer.vue b/src/layouts/Footer.vue new file mode 100644 index 0000000..831688c --- /dev/null +++ b/src/layouts/Footer.vue @@ -0,0 +1,134 @@ + + + + + \ No newline at end of file diff --git a/src/layouts/Header.vue b/src/layouts/Header.vue new file mode 100644 index 0000000..5450a1f --- /dev/null +++ b/src/layouts/Header.vue @@ -0,0 +1,266 @@ + + + + + \ No newline at end of file diff --git a/src/layouts/MainLayout.vue b/src/layouts/MainLayout.vue new file mode 100644 index 0000000..b46866a --- /dev/null +++ b/src/layouts/MainLayout.vue @@ -0,0 +1,14 @@ + + + \ No newline at end of file diff --git a/src/main.js b/src/main.js new file mode 100644 index 0000000..efadd61 --- /dev/null +++ b/src/main.js @@ -0,0 +1,16 @@ +import { createApp } from 'vue' +import { createPinia } from 'pinia' +import Antd from 'ant-design-vue' +import './style.css' +import App from './App.vue' +// 注册路由 +import router from './router' + +const app = createApp(App) + + +// 注册Ant Design组件 +app.use(createPinia()) +app.use(router) +app.use(Antd) +app.mount('#app') diff --git a/src/router/index.js b/src/router/index.js new file mode 100644 index 0000000..add6aa0 --- /dev/null +++ b/src/router/index.js @@ -0,0 +1,118 @@ +import { createRouter, createWebHistory } from 'vue-router' +import { useUserStore } from '@/stores/user' +import MainLayout from '@/layouts/MainLayout.vue' +import AdminLayout from '@/layouts/AdminLayout.vue' + +// 路由配置 +const routes = [ + { + path: '/', + component: MainLayout, + children: [ + { + path: '', + name: 'Home', + component: () => import('@/views/index/index.vue') + }, + { + path: 'about', + name: 'About', + component: () => import('@/views/about/index.vue') + }, + { + path: 'articles', + name: 'Articles', + component: () => import('@/views/articles/index.vue') + }, + { + path: 'articles/:id', + name: 'ArticleDetail', + component: () => import('@/views/articles/detail.vue') + }, + { + path: 'news', + name: 'News', + component: () => import('@/views/news/index.vue') + }, + { + path: 'news/:id', + name: 'NewsDetail', + component: () => import('@/views/news/detail.vue') + }, + { + path: 'contact', + name: 'Contact', + component: () => import('@/views/contact/index.vue') + } + ] + }, + { + path: '/admin', + component: AdminLayout, + meta: { requiresAuth: true }, + children: [ + { + path: '', + redirect: '/admin/dashboard' + }, + { + path: 'dashboard', + name: 'AdminDashboard', + component: () => import('@/views/admin/Dashboard.vue') + }, + { + path: 'articles', + name: 'AdminArticles', + component: () => import('@/views/admin/Articles.vue') + }, + { + path: 'articles/create', + name: 'CreateArticle', + component: () => import('@/views/admin/ArticleForm.vue') + }, + { + path: 'articles/edit/:id', + name: 'EditArticle', + component: () => import('@/views/admin/ArticleForm.vue') + }, + { + path: 'news', + name: 'AdminNews', + component: () => import('@/views/admin/News.vue') + }, + { + path: 'users', + name: 'AdminUsers', + component: () => import('@/views/admin/Users.vue') + }, + { + path: 'settings', + name: 'AdminSettings', + component: () => import('@/views/admin/Settings.vue') + } + ] + }, + { + path: '/login', + name: 'Login', + component: () => import('@/views/auth/Login.vue') + } +] + +const router = createRouter({ + history: createWebHistory(), + routes, + scrollBehavior(to, from, savedPosition) { + return savedPosition || { top: 0 } + } +}) + +// 路由守卫 +router.beforeEach((to, from) => { + const userStore = useUserStore() + if (to.meta.requiresAuth && !userStore.user) { + return { name: 'Login', query: { redirect: to.fullPath } } + } +}) + +export default router \ No newline at end of file diff --git a/src/stores/user.js b/src/stores/user.js new file mode 100644 index 0000000..5987aad --- /dev/null +++ b/src/stores/user.js @@ -0,0 +1,87 @@ +import { defineStore } from 'pinia' +import { ref, computed } from 'vue' +import {loginApi, registerApi} from "@/api/request/user.js"; +import {message, notification} from "ant-design-vue"; + +export const useUserStore = defineStore('user', () => { + const user = ref(JSON.parse(localStorage.getItem('user') || 'null')) + const modal = ref(localStorage.getItem('authModal') || 'false') + + // 添加初始化状态校验 + const initUser = () => { + const userData = localStorage.getItem('user') + if (!userData) return null + try { + return JSON.parse(userData) + } catch { + localStorage.removeItem('user') + localStorage.removeItem('token') + return null + } + } + + const isAuthenticated = computed(() => !!user.value?.nick_name) + + function login(credentials, functionName) { + console.log(functionName, 'sssssssssssss') + loginApi({ + account: credentials.username, + password: credentials.password, + remember: credentials.remember, + }).then((res) => { + const userData = { + nick_name: res.nick_name, + role_name: res.role_name, + role_value: res.role_value, + } + user.value = userData; + localStorage.setItem('user', JSON.stringify(userData)) + localStorage.setItem('token', res.token) + notification.success({ + message: '登录成功', + description: `欢迎回来${res.nick_name}`, + }) + functionName() + }) + } + function register(credentials, functionName) { + registerApi({ + account: credentials.username, + password: credentials.password, + email: credentials.email, + code: credentials.code, + }).then((res) => { + const userData = { + nick_name: res.nick_name, + role_name: res.role_name, + role_value: res.role_value, + } + user.value = userData; + localStorage.setItem('user', JSON.stringify(userData)) + localStorage.setItem('token', res.token) + message.success('注册成功') + functionName() + }) + } + + function logout() { + user.value = null + localStorage.removeItem('user') + localStorage.removeItem('token') + } + + function setModal(value) { + modal.value = modal.value === 'false' ? 'true' : 'false'; + localStorage.setItem('authModal', value) + } + + return { + modal, + user, + isAuthenticated, + setModal, + login, + register, + logout + } +}) \ No newline at end of file diff --git a/src/style.css b/src/style.css new file mode 100644 index 0000000..a461c50 --- /dev/null +++ b/src/style.css @@ -0,0 +1 @@ +@import "tailwindcss"; \ No newline at end of file diff --git a/src/views/about/index.vue b/src/views/about/index.vue new file mode 100644 index 0000000..cf9f917 --- /dev/null +++ b/src/views/about/index.vue @@ -0,0 +1,302 @@ + + + + + \ No newline at end of file diff --git a/src/views/admin/ArticleForm.vue b/src/views/admin/ArticleForm.vue new file mode 100644 index 0000000..0ef8853 --- /dev/null +++ b/src/views/admin/ArticleForm.vue @@ -0,0 +1,533 @@ + + + + + \ No newline at end of file diff --git a/src/views/admin/Articles.vue b/src/views/admin/Articles.vue new file mode 100644 index 0000000..081a7a1 --- /dev/null +++ b/src/views/admin/Articles.vue @@ -0,0 +1,618 @@ + + + + + \ No newline at end of file diff --git a/src/views/admin/Dashboard.vue b/src/views/admin/Dashboard.vue new file mode 100644 index 0000000..622d02a --- /dev/null +++ b/src/views/admin/Dashboard.vue @@ -0,0 +1,286 @@ + + + + + \ No newline at end of file diff --git a/src/views/admin/News.vue b/src/views/admin/News.vue new file mode 100644 index 0000000..23ed150 --- /dev/null +++ b/src/views/admin/News.vue @@ -0,0 +1,539 @@ + + + + + \ No newline at end of file diff --git a/src/views/admin/Settings.vue b/src/views/admin/Settings.vue new file mode 100644 index 0000000..28440e3 --- /dev/null +++ b/src/views/admin/Settings.vue @@ -0,0 +1,427 @@ + + + + + \ No newline at end of file diff --git a/src/views/admin/Users.vue b/src/views/admin/Users.vue new file mode 100644 index 0000000..c19d73b --- /dev/null +++ b/src/views/admin/Users.vue @@ -0,0 +1,528 @@ + + + + + \ No newline at end of file diff --git a/src/views/articles/detail.vue b/src/views/articles/detail.vue new file mode 100644 index 0000000..9444c3d --- /dev/null +++ b/src/views/articles/detail.vue @@ -0,0 +1,381 @@ + + + + + \ No newline at end of file diff --git a/src/views/articles/index.vue b/src/views/articles/index.vue new file mode 100644 index 0000000..df910a8 --- /dev/null +++ b/src/views/articles/index.vue @@ -0,0 +1,479 @@ + + + + + \ No newline at end of file diff --git a/src/views/auth/Login.vue b/src/views/auth/Login.vue new file mode 100644 index 0000000..b628cfe --- /dev/null +++ b/src/views/auth/Login.vue @@ -0,0 +1,405 @@ + + + + + \ No newline at end of file diff --git a/src/views/contact/index.vue b/src/views/contact/index.vue new file mode 100644 index 0000000..153c6b0 --- /dev/null +++ b/src/views/contact/index.vue @@ -0,0 +1,355 @@ + + + + + \ No newline at end of file diff --git a/src/views/index/index.vue b/src/views/index/index.vue new file mode 100644 index 0000000..a924f97 --- /dev/null +++ b/src/views/index/index.vue @@ -0,0 +1,387 @@ + + + + + \ No newline at end of file diff --git a/src/views/news/detail.vue b/src/views/news/detail.vue new file mode 100644 index 0000000..391c75e --- /dev/null +++ b/src/views/news/detail.vue @@ -0,0 +1,394 @@ + + + + + \ No newline at end of file diff --git a/src/views/news/index.vue b/src/views/news/index.vue new file mode 100644 index 0000000..6ab7758 --- /dev/null +++ b/src/views/news/index.vue @@ -0,0 +1,493 @@ + + + + + \ No newline at end of file diff --git a/vite.config.js b/vite.config.js new file mode 100644 index 0000000..06cd057 --- /dev/null +++ b/vite.config.js @@ -0,0 +1,28 @@ +import {defineConfig} from 'vite' +import vue from '@vitejs/plugin-vue' +import tailwindcss from "@tailwindcss/vite" +import path from 'path' + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [ + vue(), + tailwindcss() + ], + resolve: { + alias: { + '@': path.resolve(__dirname, './src') + } + }, + server: { + port: 18888, + proxy: { + '/api': { + // target: 'http://127.0.0.1:18007/api/', + target: 'http://127.0.0.1:18001/api/', + changeOrigin: true, + rewrite: (path) => path.replace(/^\/api/, '') + } + } + } +})