diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..8ee54e8
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,30 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+.DS_Store
+dist
+dist-ssr
+coverage
+*.local
+
+/cypress/videos/
+/cypress/screenshots/
+
+# Editor directories and files
+.vscode/*
+!.vscode/extensions.json
+.idea
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
+
+*.tsbuildinfo
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..bcdf134
--- /dev/null
+++ b/README.md
@@ -0,0 +1,29 @@
+# hade
+
+This template should help get you started developing with Vue 3 in Vite.
+
+## Recommended IDE Setup
+
+[VSCode](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar) (and disable Vetur).
+
+## Customize configuration
+
+See [Vite Configuration Reference](https://vite.dev/config/).
+
+## Project Setup
+
+```sh
+npm install
+```
+
+### Compile and Hot-Reload for Development
+
+```sh
+npm run dev
+```
+
+### Compile and Minify for Production
+
+```sh
+npm run build
+```
diff --git a/app/http/module/demo/api.go b/app/http/module/demo/api.go
index 75fdeac..4ec8232 100644
--- a/app/http/module/demo/api.go
+++ b/app/http/module/demo/api.go
@@ -18,5 +18,5 @@ func Demo(c *gin.Context) {
log := c.MustMake(contract.LogKey).(contract.Log)
password := configService.GetString("database.mysql.password")
log.Info(c, "ceshiceshi", map[string]interface{}{})
- c.JSON(200, password)
+ c.JSON(200, password+"测123")
}
diff --git a/app/http/route.go b/app/http/route.go
index d14cd0f..763ec5f 100644
--- a/app/http/route.go
+++ b/app/http/route.go
@@ -6,7 +6,8 @@ import (
)
func Routes(core *gin.Engine) {
- core.Static("/dist/", "./dist/")
+ // /路径先去./dist目录下查找文件是否存在,找到使用文件服务提供服务
+ //core.Use(static.Serve("/", static.LocalFile("./dist", false)))
err := demo.Register(core)
if err != nil {
diff --git a/config/development/app.yaml b/config/development/app.yaml
index d6807a7..8f8e61a 100644
--- a/config/development/app.yaml
+++ b/config/development/app.yaml
@@ -4,3 +4,11 @@ swagger_open: true
dev_fresh: 1
+dev: # 调试模式
+ port: 8888 # 调试模式最终监听的端口,默认为8070
+ backend: # 后端调试模式配置
+ refresh_time: 3 # 调试模式后端更新时间,如果文件变更,等待3s才进行一次更新,能让频繁保存变更更为顺畅, 默认1s
+ port: 8890 # 后端监听端口,默认8072
+ monitor_folder: "" # 监听文件夹地址,为空或者不填默认为AppFolder
+ frontend: # 前端调试模式配置
+ port: 8889 # 前端监听端口, 默认8071
\ No newline at end of file
diff --git a/framework/command/app.go b/framework/command/app.go
index 33c7585..97fd854 100644
--- a/framework/command/app.go
+++ b/framework/command/app.go
@@ -12,7 +12,11 @@ import (
"time"
)
+var appAddress = ""
+
func initAppCommand() *cobra.Command {
+ appStartCommand.Flags().StringVar(&appAddress, "address", "", "set app address")
+
appCommand.AddCommand(appStartCommand)
return appCommand
}
@@ -38,10 +42,16 @@ var appStartCommand = &cobra.Command{
// 从kernel服务实例中获取引擎
core := kernelService.HttpEngine()
+ var addr string
+ if appAddress == "" {
+ addr = ":8070"
+ } else {
+ addr = appAddress
+ }
// 创建一个Server服务
server := &http.Server{
Handler: core,
- Addr: ":8888",
+ Addr: addr,
}
// 这个goroutine是启动服务的goroutine
diff --git a/framework/command/build.go b/framework/command/build.go
new file mode 100644
index 0000000..33b6c34
--- /dev/null
+++ b/framework/command/build.go
@@ -0,0 +1,118 @@
+package command
+
+import (
+ "fmt"
+ "github.com/Superdanda/hade/framework/cobra"
+ "log"
+ "os"
+ "os/exec"
+ "path/filepath"
+ "runtime"
+)
+
+func initBuildCommand() *cobra.Command {
+ buildCommand.AddCommand(buildSelfCommand)
+ buildCommand.AddCommand(buildBackendCommand)
+ buildCommand.AddCommand(buildFrontendCommand)
+ buildCommand.AddCommand(buildAllCommand)
+ return buildCommand
+}
+
+var buildSelfCommand = &cobra.Command{
+ Use: "self",
+ Short: "编译hade命令",
+ RunE: func(c *cobra.Command, args []string) error {
+ return goCommand.RunE(c, []string{"build"})
+ },
+}
+
+var buildBackendCommand = &cobra.Command{
+ Use: "backend",
+ Short: "使用go编译后端",
+ RunE: func(c *cobra.Command, args []string) error {
+ path, err := exec.LookPath("go")
+ if err != nil {
+ log.Fatalln("hade go: 请在Path路径中先安装go")
+ }
+
+ // 根据系统设置输出文件名
+ output := "hade"
+ if runtime.GOOS == "windows" {
+ output += ".exe"
+ }
+
+ // 指定输出目录
+ outputDir := filepath.Join(".")
+ err = os.MkdirAll(outputDir, 0755)
+ if err != nil {
+ return fmt.Errorf("无法创建输出目录: %v", err)
+ }
+
+ // 设置工作目录(避免权限问题)
+ tempDir := filepath.Join(outputDir, "go-temp")
+ err = os.MkdirAll(tempDir, 0755)
+ if err != nil {
+ return fmt.Errorf("无法创建临时目录: %v", err)
+ }
+
+ // 构建命令,设置环境变量
+ cmd := exec.Command(path, "build", "-o", filepath.Join(outputDir, output), "./")
+ cmd.Env = append(os.Environ(), "GOTMPDIR="+tempDir) // 设置临时目录
+
+ // 执行编译命令并获取输出
+ out, err := cmd.CombinedOutput()
+ if err != nil {
+ fmt.Println("go build error:")
+ fmt.Println(string(out))
+ fmt.Println("--------------")
+ return err
+ }
+ fmt.Println(string(out))
+ fmt.Println("编译hade成功")
+ return nil
+ },
+}
+
+var buildCommand = &cobra.Command{
+ Use: "build",
+ Short: "编译相关命令",
+ RunE: func(c *cobra.Command, args []string) error {
+ if len(args) == 0 {
+ c.Help()
+ }
+ return nil
+ },
+}
+
+var buildFrontendCommand = &cobra.Command{
+ Use: "frontend",
+ Short: "使用npm编译前端",
+ RunE: func(c *cobra.Command, args []string) error {
+ err := npmCommand.RunE(c, []string{"run", "build"})
+ if err != nil {
+ fmt.Println("============= 前端编译失败 ============")
+ return err
+ }
+ fmt.Println("============= 前端编译成功 ============")
+ return nil
+ },
+}
+
+var buildAllCommand = &cobra.Command{
+ Use: "all",
+ Short: "同时编译前后端",
+ RunE: func(c *cobra.Command, args []string) error {
+ fmt.Println("============= 开始编译前后端 ============")
+ err := buildFrontendCommand.RunE(c, args)
+ if err != nil {
+ return err
+ }
+
+ err = buildBackendCommand.RunE(c, args)
+ if err != nil {
+ return err
+ }
+
+ return nil
+ },
+}
diff --git a/framework/command/dev.go b/framework/command/dev.go
new file mode 100644
index 0000000..904f456
--- /dev/null
+++ b/framework/command/dev.go
@@ -0,0 +1,400 @@
+package command
+
+import (
+ "errors"
+ "fmt"
+ "github.com/Superdanda/hade/framework"
+ "github.com/Superdanda/hade/framework/cobra"
+ "github.com/Superdanda/hade/framework/contract"
+ "github.com/Superdanda/hade/framework/util"
+ "github.com/fsnotify/fsnotify"
+ "net/http"
+ "net/http/httputil"
+ "net/url"
+ "os"
+ "os/exec"
+ "path/filepath"
+ "runtime"
+ "strconv"
+ "syscall"
+ "time"
+)
+
+// devConfig 代表调试模式的配置信息
+type devConfig struct {
+ Port string // 调试模式最终监听的端口,默认为8070
+ Backend struct { // 后端调试模式配置
+ RefreshTime int // 调试模式后端更新时间,如果文件变更,等待3s才进行一次更新,能让频繁保存变更更为顺畅, 默认1s
+ Port string // 后端监听端口, 默认 8072
+ MonitorFolder string // 监听文件夹,默认为AppFolder
+ }
+ Frontend struct { // 前端调试模式配置
+ Port string // 前端启动端口, 默认8071
+ }
+}
+
+// 初始化配置文件
+func initDevConfig(c framework.Container) *devConfig {
+ devConfig := &devConfig{
+ Port: "8087",
+ Backend: struct {
+ RefreshTime int
+ Port string
+ MonitorFolder string
+ }{
+ 1,
+ "8072",
+ "",
+ },
+ Frontend: struct {
+ Port string
+ }{
+ "8071",
+ },
+ }
+ configer := c.MustMake(contract.ConfigKey).(contract.Config)
+ if configer.IsExist("app.dev.port") {
+ devConfig.Port = configer.GetString("app.dev.port")
+ }
+ if configer.IsExist("app.dev.backend.refresh_time") {
+ devConfig.Backend.RefreshTime = configer.GetInt("app.dev.backend.refresh_time")
+ }
+ if configer.IsExist("app.dev.backend.port") {
+ devConfig.Backend.Port = configer.GetString("app.dev.backend.port")
+ }
+ monitorFolder := configer.GetString("app.dev.backend.monitor_folder")
+ if monitorFolder == "" {
+ appService := c.MustMake(contract.AppKey).(contract.App)
+ devConfig.Backend.MonitorFolder = appService.AppFolder()
+ }
+
+ if configer.IsExist("app.dev.frontend.port") {
+ devConfig.Frontend.Port = configer.GetString("app.dev.frontend.port")
+ }
+ return devConfig
+}
+
+// Proxy 代表serve启动的服务器代理
+type Proxy struct {
+ devConfig *devConfig // 配置文件
+ proxyServer *http.Server // proxy的服务
+ backendPid int // 当前的backend服务的pid
+ frontendPid int // 当前的frontend服务的pid
+}
+
+// NewProxy 初始化一个Proxy
+func NewProxy(c framework.Container) *Proxy {
+ devConfig := initDevConfig(c)
+ return &Proxy{
+ devConfig: devConfig,
+ }
+}
+
+func (p *Proxy) newProxyReverseProxy(frontend, backend *url.URL) *httputil.ReverseProxy {
+ if p.frontendPid == 0 && p.backendPid == 0 {
+ fmt.Println("前端和后端服务都不存在")
+ return nil
+ }
+
+ // 后端服务存在
+ if p.frontendPid == 0 && p.backendPid != 0 {
+ return httputil.NewSingleHostReverseProxy(backend)
+ }
+
+ // 前端服务存在
+ if p.backendPid == 0 && p.frontendPid != 0 {
+ return httputil.NewSingleHostReverseProxy(frontend)
+ }
+
+ // 两个都有进程
+ // 方式一: 后端服务的directory
+ directorBackend := func(req *http.Request) {
+ req.URL.Scheme = backend.Scheme
+ req.URL.Host = backend.Host
+ }
+
+ // 方式二:后端服务的directory
+ //directorFrontend := func(req *http.Request) {
+ // req.URL.Scheme = frontend.Scheme
+ // req.URL.Host = frontend.Host
+ //}
+
+ // 定义一个NotFoundErr
+ NotFoundErr := errors.New("response is 404, need to redirect")
+ return &httputil.ReverseProxy{
+ Director: directorBackend, // 先转发到后端服务
+ ModifyResponse: func(response *http.Response) error {
+ // 如果后端服务返回了404,我们返回NotFoundErr 会进入到errorHandler中
+ if response.StatusCode == 404 {
+ return NotFoundErr
+ }
+ return nil
+ },
+ ErrorHandler: func(writer http.ResponseWriter, request *http.Request, err error) {
+ if errors.Is(err, NotFoundErr) {
+ httputil.NewSingleHostReverseProxy(frontend).ServeHTTP(writer, request)
+ }
+ },
+ }
+}
+
+// rebuildBackend 重新编译后端
+func (p *Proxy) rebuildBackend() error {
+ // 重新编译hade
+ fmt.Println("重新编译后端服务")
+ cmdBuild := exec.Command("./hade", "build", "backend")
+ cmdBuild.Stdout = os.Stdout
+ cmdBuild.Stderr = os.Stderr
+ if err := cmdBuild.Start(); err == nil {
+ err = cmdBuild.Wait()
+ if err != nil {
+ return err
+ }
+ }
+ return nil
+}
+
+// restartBackend 启动后端服务
+func (p *Proxy) restartBackend() error {
+
+ // 杀死之前的进程
+ if p.backendPid != 0 {
+ process, _ := os.FindProcess(p.backendPid)
+ if process != nil {
+ if runtime.GOOS == "windows" {
+ process.Kill()
+ } else {
+ err := process.Signal(syscall.SIGTERM)
+ if err != nil {
+ return err
+ }
+ }
+ }
+ p.backendPid = 0
+ }
+
+ // 设置随机端口,真实后端的端口
+ port := p.devConfig.Backend.Port
+ hadeAddress := fmt.Sprintf(":" + port)
+ // 使用命令行启动后端进程
+
+ // 根据系统设置输出文件名
+ execName := "./hade"
+ if runtime.GOOS == "windows" {
+ execName += ".exe"
+ }
+
+ cmd := exec.Command(execName, "app", "start", "--address="+hadeAddress)
+ cmd.Stdout = os.NewFile(0, os.DevNull)
+ cmd.Stderr = os.Stderr
+ fmt.Println("启动后端服务: ", "http://127.0.0.1:"+port)
+ err := cmd.Start()
+ if err != nil {
+ fmt.Println(err)
+ }
+ p.backendPid = cmd.Process.Pid
+ fmt.Println("后端服务pid:", p.backendPid)
+ return nil
+}
+
+// 启动前端服务
+func (p *Proxy) restartFrontend() error {
+ // 启动前端调试模式
+ // 如果已经开启了npm run serve, 什么都不做
+ if p.frontendPid != 0 {
+ return nil
+ }
+
+ // 否则开启npm run serve
+ port := p.devConfig.Frontend.Port
+ path, err := exec.LookPath("npm")
+ if err != nil {
+ return err
+ }
+ cmd := exec.Command(path, "run", "dev", "--", "--port", port, "--host", "127.0.0.1")
+ cmd.Env = os.Environ()
+ cmd.Env = append(cmd.Env, fmt.Sprintf("%s%s", "PORT=", port))
+ cmd.Stdout = os.NewFile(0, os.DevNull)
+ cmd.Stderr = os.Stderr
+
+ // 因为npm run serve 是控制台挂起模式,所以这里使用go routine启动
+ err = cmd.Start()
+ fmt.Println("启动前端服务: ", "http://127.0.0.1:"+port)
+ if err != nil {
+ fmt.Println(err)
+ }
+ p.frontendPid = cmd.Process.Pid
+ fmt.Println("前端服务pid:", p.frontendPid)
+
+ return nil
+}
+
+// 重启后端服务, 如果frontend为nil,则没有包含后端
+func (p *Proxy) startProxy(startFrontend, startBackend bool) error {
+ var backendURL, frontendURL *url.URL
+ var err error
+
+ // 启动后端
+ if startBackend {
+ if err := p.restartBackend(); err != nil {
+ return err
+ }
+ }
+ // 启动前端
+ if startFrontend {
+ if err := p.restartFrontend(); err != nil {
+ return err
+ }
+ }
+
+ // 如果已经启动过proxy了,就不要进行设置了
+ if p.proxyServer != nil {
+ return nil
+ }
+
+ if frontendURL, err = url.Parse(fmt.Sprintf("%s%s", "http://127.0.0.1:", p.devConfig.Frontend.Port)); err != nil {
+ return err
+ }
+
+ if backendURL, err = url.Parse(fmt.Sprintf("%s%s", "http://127.0.0.1:", p.devConfig.Backend.Port)); err != nil {
+ return err
+ }
+
+ // 设置反向代理
+ proxyReverse := p.newProxyReverseProxy(frontendURL, backendURL)
+ p.proxyServer = &http.Server{
+ Addr: "127.0.0.1:" + p.devConfig.Port,
+ Handler: proxyReverse,
+ }
+
+ fmt.Println("代理服务启动:", "http://"+p.proxyServer.Addr)
+ // 启动proxy服务
+ err = p.proxyServer.ListenAndServe()
+ if err != nil {
+ fmt.Println(err)
+ }
+ return nil
+}
+
+// monitorBackend 监听应用文件
+func (p *Proxy) monitorBackend() error {
+ // 监听
+ watcher, err := fsnotify.NewWatcher()
+ if err != nil {
+ return err
+ }
+ defer watcher.Close()
+
+ appFolder := p.devConfig.Backend.MonitorFolder
+ fmt.Println("监控文件夹:", appFolder)
+ filepath.Walk(appFolder, func(path string, info os.FileInfo, err error) error {
+ if info != nil && !info.IsDir() {
+ return nil
+ }
+ if util.IsHiddenDirectory(path) {
+ return nil
+ }
+ return watcher.Add(path)
+ })
+
+ refreshTime := p.devConfig.Backend.RefreshTime
+ t := time.NewTimer(time.Duration(refreshTime) * time.Second)
+ t.Stop()
+ for {
+ select {
+ case <-t.C:
+ fmt.Println("...检测到文件更新,重启服务开始...")
+ if err := p.rebuildBackend(); err != nil {
+ fmt.Println("重新编译失败:", err.Error())
+ } else {
+ if err := p.restartBackend(); err != nil {
+ fmt.Println("重新启动失败:", err.Error())
+ }
+ }
+ fmt.Println("...检测到文件更新,重启服务结束...")
+ t.Stop()
+ case _, ok := <-watcher.Events:
+ if !ok {
+ continue
+ }
+ t.Reset(time.Duration(refreshTime) * time.Second)
+ case err, ok := <-watcher.Errors:
+ if !ok {
+ continue
+ }
+ fmt.Println("监听文件夹错误:", err.Error())
+ t.Reset(time.Duration(refreshTime) * time.Second)
+ }
+ }
+ return nil
+}
+
+// 初始化Dev命令
+func initDevCommand() *cobra.Command {
+ devCommand.AddCommand(devBackendCommand)
+ devCommand.AddCommand(devFrontendCommand)
+ devCommand.AddCommand(devAllCommand)
+ return devCommand
+}
+
+// devCommand 为调试模式的一级命令
+var devCommand = &cobra.Command{
+ Use: "dev",
+ Short: "调试模式",
+ RunE: func(c *cobra.Command, args []string) error {
+ c.Help()
+ return nil
+ },
+}
+
+// devBackendCommand 启动后端调试模式
+var devBackendCommand = &cobra.Command{
+ Use: "backend",
+ Short: "启动后端调试模式",
+ RunE: func(c *cobra.Command, args []string) error {
+ proxy := NewProxy(c.GetContainer())
+ go proxy.monitorBackend()
+ if err := proxy.startProxy(false, true); err != nil {
+ return err
+ }
+ return nil
+ },
+}
+
+// devFrontendCommand 启动前端调试模式
+var devFrontendCommand = &cobra.Command{
+ Use: "frontend",
+ Short: "前端调试模式",
+ RunE: func(c *cobra.Command, args []string) error {
+
+ // 启动前端服务
+ proxy := NewProxy(c.GetContainer())
+ return proxy.startProxy(true, false)
+
+ },
+}
+
+var devAllCommand = &cobra.Command{
+ Use: "all",
+ Short: "同时启动前端和后端调试",
+ RunE: func(c *cobra.Command, args []string) error {
+ proxy := NewProxy(c.GetContainer())
+ go proxy.monitorBackend()
+ if err := proxy.startProxy(true, true); err != nil {
+ return err
+ }
+
+ //记录后端的pid到本地文件
+ container := c.GetContainer()
+ app := container.MustMake(contract.AppKey).(contract.App)
+ storageFolder := app.StorageFolder()
+ pidFile := filepath.Join(storageFolder, "backend.pid")
+ // 将 backendPid 写入文件
+ pid := strconv.Itoa(proxy.backendPid) // 将 pid 转为字符串
+ if err := os.WriteFile(pidFile, []byte(pid), 0666); err != nil {
+ return fmt.Errorf("无法写入 PID 文件: %w", err)
+ }
+
+ return nil
+ },
+}
diff --git a/framework/command/go_cmd.go b/framework/command/go_cmd.go
new file mode 100644
index 0000000..25dafb3
--- /dev/null
+++ b/framework/command/go_cmd.go
@@ -0,0 +1,21 @@
+package command
+
+import (
+ "log"
+ "os/exec"
+
+ "github.com/Superdanda/hade/framework/cobra"
+)
+
+// go just run local go bin
+var goCommand = &cobra.Command{
+ Use: "go",
+ Short: "运行go命令,要求go必须安装",
+ RunE: func(c *cobra.Command, args []string) error {
+ path, err := exec.LookPath("go")
+ if err != nil {
+ log.Fatalln("请在PATH路径中安装go")
+ }
+ return runCommand(path, args)
+ },
+}
diff --git a/framework/command/kernel.go b/framework/command/kernel.go
index bb0470f..cfbac04 100644
--- a/framework/command/kernel.go
+++ b/framework/command/kernel.go
@@ -1,10 +1,28 @@
package command
-import "github.com/Superdanda/hade/framework/cobra"
+import (
+ "fmt"
+ "github.com/Superdanda/hade/framework/cobra"
+ "os"
+ "os/exec"
+)
func AddKernelCommands(root *cobra.Command) {
root.AddCommand(initCronCommand())
// 挂载AppCommand命令
root.AddCommand(initAppCommand())
root.AddCommand(initEnvCommand())
+ root.AddCommand(initBuildCommand())
+ root.AddCommand(initDevCommand())
+}
+
+// 封装通用的命令执行器
+func runCommand(path string, args []string) error {
+ cmd := exec.Command(path, args...)
+ cmd.Stdout = os.Stdout
+ cmd.Stderr = os.Stderr
+ if err := cmd.Run(); err != nil {
+ return fmt.Errorf("命令执行失败: %v", err)
+ }
+ return nil
}
diff --git a/framework/command/npm_cmd.go b/framework/command/npm_cmd.go
new file mode 100644
index 0000000..e765841
--- /dev/null
+++ b/framework/command/npm_cmd.go
@@ -0,0 +1,19 @@
+package command
+
+import (
+ "github.com/Superdanda/hade/framework/cobra"
+ "log"
+ "os/exec"
+)
+
+var npmCommand = &cobra.Command{
+ Use: "npm",
+ Short: "运行npm命令,要求npm必须安装",
+ RunE: func(c *cobra.Command, args []string) error {
+ path, err := exec.LookPath("npm")
+ if err != nil {
+ log.Fatalln("请在PATH路径中安装npm")
+ }
+ return runCommand(path, args)
+ },
+}
diff --git a/framework/contract/app.go b/framework/contract/app.go
index 83ef4f6..004ceff 100644
--- a/framework/contract/app.go
+++ b/framework/contract/app.go
@@ -33,4 +33,6 @@ type App interface {
AppId() string
LoadAppConfig(mapString map[string]string)
+
+ AppFolder() string
}
diff --git a/framework/middleware/static/static.go b/framework/middleware/static/static.go
new file mode 100644
index 0000000..9ccb306
--- /dev/null
+++ b/framework/middleware/static/static.go
@@ -0,0 +1,69 @@
+package static
+
+import (
+ "github.com/Superdanda/hade/framework/gin"
+ "net/http"
+ "os"
+ "path"
+ "strings"
+)
+
+const INDEX = "index.html"
+
+type ServeFileSystem interface {
+ http.FileSystem
+ Exists(prefix string, path string) bool
+}
+
+type localFileSystem struct {
+ http.FileSystem
+ root string
+ indexes bool
+}
+
+func LocalFile(root string, indexes bool) *localFileSystem {
+ return &localFileSystem{
+ FileSystem: gin.Dir(root, indexes),
+ root: root,
+ indexes: indexes,
+ }
+}
+
+func (l *localFileSystem) Exists(prefix string, filepath string) bool {
+ if p := strings.TrimPrefix(filepath, prefix); len(p) < len(filepath) {
+ name := path.Join(l.root, p)
+ stats, err := os.Stat(name)
+ if err != nil {
+ return false
+ }
+ if stats.IsDir() {
+ if !l.indexes {
+ index := path.Join(name, INDEX)
+ _, err := os.Stat(index)
+ if err != nil {
+ return false
+ }
+ }
+ }
+ return true
+ }
+ return false
+}
+
+func ServeRoot(urlPrefix, root string) gin.HandlerFunc {
+ return Serve(urlPrefix, LocalFile(root, false))
+}
+
+// Serve Static returns a middleware handler that serves static files in the given directory.
+func Serve(urlPrefix string, fs ServeFileSystem) gin.HandlerFunc {
+ fileServer := http.FileServer(fs)
+ if urlPrefix != "" {
+ fileServer = http.StripPrefix(urlPrefix, fileServer)
+ }
+ return func(c *gin.Context) {
+ if fs.Exists(urlPrefix, c.Request.URL.Path) {
+ fileServer.ServeHTTP(c.Writer, c.Request)
+ c.Abort()
+ }
+ }
+}
diff --git a/framework/provider/app/service.go b/framework/provider/app/service.go
index 40694e1..e783f73 100644
--- a/framework/provider/app/service.go
+++ b/framework/provider/app/service.go
@@ -88,6 +88,10 @@ func (h HadeApp) ConsoleFolder() string {
return filepath.Join(h.BaseFolder(), "console")
}
+func (h HadeApp) AppFolder() string {
+ return filepath.Join(h.BaseFolder(), "app")
+}
+
func (h HadeApp) AppId() string {
return h.appId
}
diff --git a/hade.exe b/hade.exe
new file mode 100644
index 0000000..99faf22
Binary files /dev/null and b/hade.exe differ
diff --git a/index.html b/index.html
new file mode 100644
index 0000000..99f583a
--- /dev/null
+++ b/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ Vite App
+
+
+
+
+
+
diff --git a/jsconfig.json b/jsconfig.json
new file mode 100644
index 0000000..5a1f2d2
--- /dev/null
+++ b/jsconfig.json
@@ -0,0 +1,8 @@
+{
+ "compilerOptions": {
+ "paths": {
+ "@/*": ["./src/*"]
+ }
+ },
+ "exclude": ["node_modules", "dist"]
+}
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 0000000..905f9e2
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,1084 @@
+{
+ "name": "hade",
+ "version": "0.0.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "hade",
+ "version": "0.0.0",
+ "dependencies": {
+ "pinia": "^2.2.4",
+ "vue": "^3.5.12",
+ "vue-router": "^4.4.5"
+ },
+ "devDependencies": {
+ "@vitejs/plugin-vue": "^5.1.4",
+ "vite": "^5.4.8"
+ }
+ },
+ "node_modules/@babel/helper-string-parser": {
+ "version": "7.25.7",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.25.7.tgz",
+ "integrity": "sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g==",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.25.7",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.7.tgz",
+ "integrity": "sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.25.8",
+ "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.25.8.tgz",
+ "integrity": "sha512-HcttkxzdPucv3nNFmfOOMfFf64KgdJVqm1KaCm25dPGMLElo9nsLvXeJECQg8UzPuBGLyTSA0ZzqCtDSzKTEoQ==",
+ "dependencies": {
+ "@babel/types": "^7.25.8"
+ },
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/types": {
+ "version": "7.25.8",
+ "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.25.8.tgz",
+ "integrity": "sha512-JWtuCu8VQsMladxVz/P4HzHUGCAwpuqacmowgXFs5XjxIgKuNjnLokQzuVjlTvIzODaDmpjT3oxcC48vyk9EWg==",
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.25.7",
+ "@babel/helper-validator-identifier": "^7.25.7",
+ "to-fast-properties": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@esbuild/aix-ppc64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz",
+ "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "aix"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-arm": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz",
+ "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz",
+ "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz",
+ "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/darwin-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz",
+ "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/darwin-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz",
+ "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/freebsd-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz",
+ "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/freebsd-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz",
+ "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-arm": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz",
+ "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz",
+ "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-ia32": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz",
+ "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-loong64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz",
+ "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-mips64el": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz",
+ "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==",
+ "cpu": [
+ "mips64el"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-ppc64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz",
+ "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-riscv64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz",
+ "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-s390x": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz",
+ "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz",
+ "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/netbsd-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz",
+ "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/openbsd-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz",
+ "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/sunos-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz",
+ "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz",
+ "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-ia32": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz",
+ "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz",
+ "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
+ "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ=="
+ },
+ "node_modules/@rollup/rollup-android-arm-eabi": {
+ "version": "4.24.0",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.24.0.tgz",
+ "integrity": "sha512-Q6HJd7Y6xdB48x8ZNVDOqsbh2uByBhgK8PiQgPhwkIw/HC/YX5Ghq2mQY5sRMZWHb3VsFkWooUVOZHKr7DmDIA==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-android-arm64": {
+ "version": "4.24.0",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.24.0.tgz",
+ "integrity": "sha512-ijLnS1qFId8xhKjT81uBHuuJp2lU4x2yxa4ctFPtG+MqEE6+C5f/+X/bStmxapgmwLwiL3ih122xv8kVARNAZA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-arm64": {
+ "version": "4.24.0",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.24.0.tgz",
+ "integrity": "sha512-bIv+X9xeSs1XCk6DVvkO+S/z8/2AMt/2lMqdQbMrmVpgFvXlmde9mLcbQpztXm1tajC3raFDqegsH18HQPMYtA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-x64": {
+ "version": "4.24.0",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.24.0.tgz",
+ "integrity": "sha512-X6/nOwoFN7RT2svEQWUsW/5C/fYMBe4fnLK9DQk4SX4mgVBiTA9h64kjUYPvGQ0F/9xwJ5U5UfTbl6BEjaQdBQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
+ "version": "4.24.0",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.24.0.tgz",
+ "integrity": "sha512-0KXvIJQMOImLCVCz9uvvdPgfyWo93aHHp8ui3FrtOP57svqrF/roSSR5pjqL2hcMp0ljeGlU4q9o/rQaAQ3AYA==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-musleabihf": {
+ "version": "4.24.0",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.24.0.tgz",
+ "integrity": "sha512-it2BW6kKFVh8xk/BnHfakEeoLPv8STIISekpoF+nBgWM4d55CZKc7T4Dx1pEbTnYm/xEKMgy1MNtYuoA8RFIWw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-gnu": {
+ "version": "4.24.0",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.24.0.tgz",
+ "integrity": "sha512-i0xTLXjqap2eRfulFVlSnM5dEbTVque/3Pi4g2y7cxrs7+a9De42z4XxKLYJ7+OhE3IgxvfQM7vQc43bwTgPwA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-musl": {
+ "version": "4.24.0",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.24.0.tgz",
+ "integrity": "sha512-9E6MKUJhDuDh604Qco5yP/3qn3y7SLXYuiC0Rpr89aMScS2UAmK1wHP2b7KAa1nSjWJc/f/Lc0Wl1L47qjiyQw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
+ "version": "4.24.0",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.24.0.tgz",
+ "integrity": "sha512-2XFFPJ2XMEiF5Zi2EBf4h73oR1V/lycirxZxHZNc93SqDN/IWhYYSYj8I9381ikUFXZrz2v7r2tOVk2NBwxrWw==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-gnu": {
+ "version": "4.24.0",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.24.0.tgz",
+ "integrity": "sha512-M3Dg4hlwuntUCdzU7KjYqbbd+BLq3JMAOhCKdBE3TcMGMZbKkDdJ5ivNdehOssMCIokNHFOsv7DO4rlEOfyKpg==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-s390x-gnu": {
+ "version": "4.24.0",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.24.0.tgz",
+ "integrity": "sha512-mjBaoo4ocxJppTorZVKWFpy1bfFj9FeCMJqzlMQGjpNPY9JwQi7OuS1axzNIk0nMX6jSgy6ZURDZ2w0QW6D56g==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-gnu": {
+ "version": "4.24.0",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.24.0.tgz",
+ "integrity": "sha512-ZXFk7M72R0YYFN5q13niV0B7G8/5dcQ9JDp8keJSfr3GoZeXEoMHP/HlvqROA3OMbMdfr19IjCeNAnPUG93b6A==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-musl": {
+ "version": "4.24.0",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.24.0.tgz",
+ "integrity": "sha512-w1i+L7kAXZNdYl+vFvzSZy8Y1arS7vMgIy8wusXJzRrPyof5LAb02KGr1PD2EkRcl73kHulIID0M501lN+vobQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-arm64-msvc": {
+ "version": "4.24.0",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.24.0.tgz",
+ "integrity": "sha512-VXBrnPWgBpVDCVY6XF3LEW0pOU51KbaHhccHw6AS6vBWIC60eqsH19DAeeObl+g8nKAz04QFdl/Cefta0xQtUQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-ia32-msvc": {
+ "version": "4.24.0",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.24.0.tgz",
+ "integrity": "sha512-xrNcGDU0OxVcPTH/8n/ShH4UevZxKIO6HJFK0e15XItZP2UcaiLFd5kiX7hJnqCbSztUF8Qot+JWBC/QXRPYWQ==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-x64-msvc": {
+ "version": "4.24.0",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.24.0.tgz",
+ "integrity": "sha512-fbMkAF7fufku0N2dE5TBXcNlg0pt0cJue4xBRE2Qc5Vqikxr4VCgKj/ht6SMdFcOacVA9rqF70APJ8RN/4vMJw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@types/estree": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.6.tgz",
+ "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==",
+ "dev": true
+ },
+ "node_modules/@vitejs/plugin-vue": {
+ "version": "5.1.4",
+ "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-5.1.4.tgz",
+ "integrity": "sha512-N2XSI2n3sQqp5w7Y/AN/L2XDjBIRGqXko+eDp42sydYSBeJuSm5a1sLf8zakmo8u7tA8NmBgoDLA1HeOESjp9A==",
+ "dev": true,
+ "engines": {
+ "node": "^18.0.0 || >=20.0.0"
+ },
+ "peerDependencies": {
+ "vite": "^5.0.0",
+ "vue": "^3.2.25"
+ }
+ },
+ "node_modules/@vue/compiler-core": {
+ "version": "3.5.12",
+ "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.5.12.tgz",
+ "integrity": "sha512-ISyBTRMmMYagUxhcpyEH0hpXRd/KqDU4ymofPgl2XAkY9ZhQ+h0ovEZJIiPop13UmR/54oA2cgMDjgroRelaEw==",
+ "dependencies": {
+ "@babel/parser": "^7.25.3",
+ "@vue/shared": "3.5.12",
+ "entities": "^4.5.0",
+ "estree-walker": "^2.0.2",
+ "source-map-js": "^1.2.0"
+ }
+ },
+ "node_modules/@vue/compiler-dom": {
+ "version": "3.5.12",
+ "resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.5.12.tgz",
+ "integrity": "sha512-9G6PbJ03uwxLHKQ3P42cMTi85lDRvGLB2rSGOiQqtXELat6uI4n8cNz9yjfVHRPIu+MsK6TE418Giruvgptckg==",
+ "dependencies": {
+ "@vue/compiler-core": "3.5.12",
+ "@vue/shared": "3.5.12"
+ }
+ },
+ "node_modules/@vue/compiler-sfc": {
+ "version": "3.5.12",
+ "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.5.12.tgz",
+ "integrity": "sha512-2k973OGo2JuAa5+ZlekuQJtitI5CgLMOwgl94BzMCsKZCX/xiqzJYzapl4opFogKHqwJk34vfsaKpfEhd1k5nw==",
+ "dependencies": {
+ "@babel/parser": "^7.25.3",
+ "@vue/compiler-core": "3.5.12",
+ "@vue/compiler-dom": "3.5.12",
+ "@vue/compiler-ssr": "3.5.12",
+ "@vue/shared": "3.5.12",
+ "estree-walker": "^2.0.2",
+ "magic-string": "^0.30.11",
+ "postcss": "^8.4.47",
+ "source-map-js": "^1.2.0"
+ }
+ },
+ "node_modules/@vue/compiler-ssr": {
+ "version": "3.5.12",
+ "resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.5.12.tgz",
+ "integrity": "sha512-eLwc7v6bfGBSM7wZOGPmRavSWzNFF6+PdRhE+VFJhNCgHiF8AM7ccoqcv5kBXA2eWUfigD7byekvf/JsOfKvPA==",
+ "dependencies": {
+ "@vue/compiler-dom": "3.5.12",
+ "@vue/shared": "3.5.12"
+ }
+ },
+ "node_modules/@vue/devtools-api": {
+ "version": "6.6.4",
+ "resolved": "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-6.6.4.tgz",
+ "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g=="
+ },
+ "node_modules/@vue/reactivity": {
+ "version": "3.5.12",
+ "resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.5.12.tgz",
+ "integrity": "sha512-UzaN3Da7xnJXdz4Okb/BGbAaomRHc3RdoWqTzlvd9+WBR5m3J39J1fGcHes7U3za0ruYn/iYy/a1euhMEHvTAg==",
+ "dependencies": {
+ "@vue/shared": "3.5.12"
+ }
+ },
+ "node_modules/@vue/runtime-core": {
+ "version": "3.5.12",
+ "resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.5.12.tgz",
+ "integrity": "sha512-hrMUYV6tpocr3TL3Ad8DqxOdpDe4zuQY4HPY3X/VRh+L2myQO8MFXPAMarIOSGNu0bFAjh1yBkMPXZBqCk62Uw==",
+ "dependencies": {
+ "@vue/reactivity": "3.5.12",
+ "@vue/shared": "3.5.12"
+ }
+ },
+ "node_modules/@vue/runtime-dom": {
+ "version": "3.5.12",
+ "resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.5.12.tgz",
+ "integrity": "sha512-q8VFxR9A2MRfBr6/55Q3umyoN7ya836FzRXajPB6/Vvuv0zOPL+qltd9rIMzG/DbRLAIlREmnLsplEF/kotXKA==",
+ "dependencies": {
+ "@vue/reactivity": "3.5.12",
+ "@vue/runtime-core": "3.5.12",
+ "@vue/shared": "3.5.12",
+ "csstype": "^3.1.3"
+ }
+ },
+ "node_modules/@vue/server-renderer": {
+ "version": "3.5.12",
+ "resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.5.12.tgz",
+ "integrity": "sha512-I3QoeDDeEPZm8yR28JtY+rk880Oqmj43hreIBVTicisFTx/Dl7JpG72g/X7YF8hnQD3IFhkky5i2bPonwrTVPg==",
+ "dependencies": {
+ "@vue/compiler-ssr": "3.5.12",
+ "@vue/shared": "3.5.12"
+ },
+ "peerDependencies": {
+ "vue": "3.5.12"
+ }
+ },
+ "node_modules/@vue/shared": {
+ "version": "3.5.12",
+ "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.12.tgz",
+ "integrity": "sha512-L2RPSAwUFbgZH20etwrXyVyCBu9OxRSi8T/38QsvnkJyvq2LufW2lDCOzm7t/U9C1mkhJGWYfCuFBCmIuNivrg=="
+ },
+ "node_modules/csstype": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.1.3.tgz",
+ "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="
+ },
+ "node_modules/entities": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz",
+ "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/esbuild": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.21.5.tgz",
+ "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "optionalDependencies": {
+ "@esbuild/aix-ppc64": "0.21.5",
+ "@esbuild/android-arm": "0.21.5",
+ "@esbuild/android-arm64": "0.21.5",
+ "@esbuild/android-x64": "0.21.5",
+ "@esbuild/darwin-arm64": "0.21.5",
+ "@esbuild/darwin-x64": "0.21.5",
+ "@esbuild/freebsd-arm64": "0.21.5",
+ "@esbuild/freebsd-x64": "0.21.5",
+ "@esbuild/linux-arm": "0.21.5",
+ "@esbuild/linux-arm64": "0.21.5",
+ "@esbuild/linux-ia32": "0.21.5",
+ "@esbuild/linux-loong64": "0.21.5",
+ "@esbuild/linux-mips64el": "0.21.5",
+ "@esbuild/linux-ppc64": "0.21.5",
+ "@esbuild/linux-riscv64": "0.21.5",
+ "@esbuild/linux-s390x": "0.21.5",
+ "@esbuild/linux-x64": "0.21.5",
+ "@esbuild/netbsd-x64": "0.21.5",
+ "@esbuild/openbsd-x64": "0.21.5",
+ "@esbuild/sunos-x64": "0.21.5",
+ "@esbuild/win32-arm64": "0.21.5",
+ "@esbuild/win32-ia32": "0.21.5",
+ "@esbuild/win32-x64": "0.21.5"
+ }
+ },
+ "node_modules/estree-walker": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz",
+ "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/magic-string": {
+ "version": "0.30.12",
+ "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.12.tgz",
+ "integrity": "sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.0"
+ }
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.7",
+ "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.7.tgz",
+ "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/picocolors": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="
+ },
+ "node_modules/pinia": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmmirror.com/pinia/-/pinia-2.2.4.tgz",
+ "integrity": "sha512-K7ZhpMY9iJ9ShTC0cR2+PnxdQRuwVIsXDO/WIEV/RnMC/vmSoKDTKW/exNQYPI+4ij10UjXqdNiEHwn47McANQ==",
+ "dependencies": {
+ "@vue/devtools-api": "^6.6.3",
+ "vue-demi": "^0.14.10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/posva"
+ },
+ "peerDependencies": {
+ "@vue/composition-api": "^1.4.0",
+ "typescript": ">=4.4.4",
+ "vue": "^2.6.14 || ^3.3.0"
+ },
+ "peerDependenciesMeta": {
+ "@vue/composition-api": {
+ "optional": true
+ },
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/pinia/node_modules/vue-demi": {
+ "version": "0.14.10",
+ "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.10.tgz",
+ "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==",
+ "hasInstallScript": true,
+ "bin": {
+ "vue-demi-fix": "bin/vue-demi-fix.js",
+ "vue-demi-switch": "bin/vue-demi-switch.js"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ },
+ "peerDependencies": {
+ "@vue/composition-api": "^1.0.0-rc.1",
+ "vue": "^3.0.0-0 || ^2.6.0"
+ },
+ "peerDependenciesMeta": {
+ "@vue/composition-api": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/postcss": {
+ "version": "8.4.47",
+ "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.4.47.tgz",
+ "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "nanoid": "^3.3.7",
+ "picocolors": "^1.1.0",
+ "source-map-js": "^1.2.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/rollup": {
+ "version": "4.24.0",
+ "resolved": "https://registry.npmmirror.com/rollup/-/rollup-4.24.0.tgz",
+ "integrity": "sha512-DOmrlGSXNk1DM0ljiQA+i+o0rSLhtii1je5wgk60j49d1jHT5YYttBv1iWOnYSTG+fZZESUOSNiAl89SIet+Cg==",
+ "dev": true,
+ "dependencies": {
+ "@types/estree": "1.0.6"
+ },
+ "bin": {
+ "rollup": "dist/bin/rollup"
+ },
+ "engines": {
+ "node": ">=18.0.0",
+ "npm": ">=8.0.0"
+ },
+ "optionalDependencies": {
+ "@rollup/rollup-android-arm-eabi": "4.24.0",
+ "@rollup/rollup-android-arm64": "4.24.0",
+ "@rollup/rollup-darwin-arm64": "4.24.0",
+ "@rollup/rollup-darwin-x64": "4.24.0",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.24.0",
+ "@rollup/rollup-linux-arm-musleabihf": "4.24.0",
+ "@rollup/rollup-linux-arm64-gnu": "4.24.0",
+ "@rollup/rollup-linux-arm64-musl": "4.24.0",
+ "@rollup/rollup-linux-powerpc64le-gnu": "4.24.0",
+ "@rollup/rollup-linux-riscv64-gnu": "4.24.0",
+ "@rollup/rollup-linux-s390x-gnu": "4.24.0",
+ "@rollup/rollup-linux-x64-gnu": "4.24.0",
+ "@rollup/rollup-linux-x64-musl": "4.24.0",
+ "@rollup/rollup-win32-arm64-msvc": "4.24.0",
+ "@rollup/rollup-win32-ia32-msvc": "4.24.0",
+ "@rollup/rollup-win32-x64-msvc": "4.24.0",
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/source-map-js": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.1.tgz",
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/vite": {
+ "version": "5.4.9",
+ "resolved": "https://registry.npmmirror.com/vite/-/vite-5.4.9.tgz",
+ "integrity": "sha512-20OVpJHh0PAM0oSOELa5GaZNWeDjcAvQjGXy2Uyr+Tp+/D2/Hdz6NLgpJLsarPTA2QJ6v8mX2P1ZfbsSKvdMkg==",
+ "dev": true,
+ "dependencies": {
+ "esbuild": "^0.21.3",
+ "postcss": "^8.4.43",
+ "rollup": "^4.20.0"
+ },
+ "bin": {
+ "vite": "bin/vite.js"
+ },
+ "engines": {
+ "node": "^18.0.0 || >=20.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/vitejs/vite?sponsor=1"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.3"
+ },
+ "peerDependencies": {
+ "@types/node": "^18.0.0 || >=20.0.0",
+ "less": "*",
+ "lightningcss": "^1.21.0",
+ "sass": "*",
+ "sass-embedded": "*",
+ "stylus": "*",
+ "sugarss": "*",
+ "terser": "^5.4.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ },
+ "less": {
+ "optional": true
+ },
+ "lightningcss": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "sass-embedded": {
+ "optional": true
+ },
+ "stylus": {
+ "optional": true
+ },
+ "sugarss": {
+ "optional": true
+ },
+ "terser": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vue": {
+ "version": "3.5.12",
+ "resolved": "https://registry.npmmirror.com/vue/-/vue-3.5.12.tgz",
+ "integrity": "sha512-CLVZtXtn2ItBIi/zHZ0Sg1Xkb7+PU32bJJ8Bmy7ts3jxXTcbfsEfBivFYYWz1Hur+lalqGAh65Coin0r+HRUfg==",
+ "dependencies": {
+ "@vue/compiler-dom": "3.5.12",
+ "@vue/compiler-sfc": "3.5.12",
+ "@vue/runtime-dom": "3.5.12",
+ "@vue/server-renderer": "3.5.12",
+ "@vue/shared": "3.5.12"
+ },
+ "peerDependencies": {
+ "typescript": "*"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vue-router": {
+ "version": "4.4.5",
+ "resolved": "https://registry.npmmirror.com/vue-router/-/vue-router-4.4.5.tgz",
+ "integrity": "sha512-4fKZygS8cH1yCyuabAXGUAsyi1b2/o/OKgu/RUb+znIYOxPRxdkytJEx+0wGcpBE1pX6vUgh5jwWOKRGvuA/7Q==",
+ "dependencies": {
+ "@vue/devtools-api": "^6.6.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/posva"
+ },
+ "peerDependencies": {
+ "vue": "^3.2.0"
+ }
+ }
+ }
+}
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..b11e5b4
--- /dev/null
+++ b/package.json
@@ -0,0 +1,20 @@
+{
+ "name": "hade",
+ "version": "0.0.0",
+ "private": true,
+ "type": "module",
+ "scripts": {
+ "dev": "vite",
+ "build": "vite build",
+ "preview": "vite preview"
+ },
+ "dependencies": {
+ "pinia": "^2.2.4",
+ "vue": "^3.5.12",
+ "vue-router": "^4.4.5"
+ },
+ "devDependencies": {
+ "@vitejs/plugin-vue": "^5.1.4",
+ "vite": "^5.4.8"
+ }
+}
diff --git a/public/favicon.ico b/public/favicon.ico
new file mode 100644
index 0000000..df36fcf
Binary files /dev/null and b/public/favicon.ico differ
diff --git a/src/App.vue b/src/App.vue
new file mode 100644
index 0000000..1c0f320
--- /dev/null
+++ b/src/App.vue
@@ -0,0 +1,85 @@
+
+
+
+
+
+
+
+
+
+
+ Home
+ About
+
+
+
+
+
+
+
+
diff --git a/src/assets/base.css b/src/assets/base.css
new file mode 100644
index 0000000..8816868
--- /dev/null
+++ b/src/assets/base.css
@@ -0,0 +1,86 @@
+/* color palette from */
+:root {
+ --vt-c-white: #ffffff;
+ --vt-c-white-soft: #f8f8f8;
+ --vt-c-white-mute: #f2f2f2;
+
+ --vt-c-black: #181818;
+ --vt-c-black-soft: #222222;
+ --vt-c-black-mute: #282828;
+
+ --vt-c-indigo: #2c3e50;
+
+ --vt-c-divider-light-1: rgba(60, 60, 60, 0.29);
+ --vt-c-divider-light-2: rgba(60, 60, 60, 0.12);
+ --vt-c-divider-dark-1: rgba(84, 84, 84, 0.65);
+ --vt-c-divider-dark-2: rgba(84, 84, 84, 0.48);
+
+ --vt-c-text-light-1: var(--vt-c-indigo);
+ --vt-c-text-light-2: rgba(60, 60, 60, 0.66);
+ --vt-c-text-dark-1: var(--vt-c-white);
+ --vt-c-text-dark-2: rgba(235, 235, 235, 0.64);
+}
+
+/* semantic color variables for this project */
+:root {
+ --color-background: var(--vt-c-white);
+ --color-background-soft: var(--vt-c-white-soft);
+ --color-background-mute: var(--vt-c-white-mute);
+
+ --color-border: var(--vt-c-divider-light-2);
+ --color-border-hover: var(--vt-c-divider-light-1);
+
+ --color-heading: var(--vt-c-text-light-1);
+ --color-text: var(--vt-c-text-light-1);
+
+ --section-gap: 160px;
+}
+
+@media (prefers-color-scheme: dark) {
+ :root {
+ --color-background: var(--vt-c-black);
+ --color-background-soft: var(--vt-c-black-soft);
+ --color-background-mute: var(--vt-c-black-mute);
+
+ --color-border: var(--vt-c-divider-dark-2);
+ --color-border-hover: var(--vt-c-divider-dark-1);
+
+ --color-heading: var(--vt-c-text-dark-1);
+ --color-text: var(--vt-c-text-dark-2);
+ }
+}
+
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ font-weight: normal;
+}
+
+body {
+ min-height: 100vh;
+ color: var(--color-text);
+ background: var(--color-background);
+ transition:
+ color 0.5s,
+ background-color 0.5s;
+ line-height: 1.6;
+ font-family:
+ Inter,
+ -apple-system,
+ BlinkMacSystemFont,
+ 'Segoe UI',
+ Roboto,
+ Oxygen,
+ Ubuntu,
+ Cantarell,
+ 'Fira Sans',
+ 'Droid Sans',
+ 'Helvetica Neue',
+ sans-serif;
+ font-size: 15px;
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
diff --git a/src/assets/logo.svg b/src/assets/logo.svg
new file mode 100644
index 0000000..7565660
--- /dev/null
+++ b/src/assets/logo.svg
@@ -0,0 +1 @@
+
diff --git a/src/assets/main.css b/src/assets/main.css
new file mode 100644
index 0000000..36fb845
--- /dev/null
+++ b/src/assets/main.css
@@ -0,0 +1,35 @@
+@import './base.css';
+
+#app {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 2rem;
+ font-weight: normal;
+}
+
+a,
+.green {
+ text-decoration: none;
+ color: hsla(160, 100%, 37%, 1);
+ transition: 0.4s;
+ padding: 3px;
+}
+
+@media (hover: hover) {
+ a:hover {
+ background-color: hsla(160, 100%, 37%, 0.2);
+ }
+}
+
+@media (min-width: 1024px) {
+ body {
+ display: flex;
+ place-items: center;
+ }
+
+ #app {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ padding: 0 2rem;
+ }
+}
diff --git a/src/components/HelloWorld.vue b/src/components/HelloWorld.vue
new file mode 100644
index 0000000..f5f9833
--- /dev/null
+++ b/src/components/HelloWorld.vue
@@ -0,0 +1,44 @@
+
+
+
+
+
{{ msg }}
+
+ You’ve successfully created a project with
+ Vite +
+ Vue 3 .
+
+
+
+
+
diff --git a/src/components/TheWelcome.vue b/src/components/TheWelcome.vue
new file mode 100644
index 0000000..e4d125f
--- /dev/null
+++ b/src/components/TheWelcome.vue
@@ -0,0 +1,88 @@
+
+
+
+
+
+
+
+ Documentation
+
+ Vue’s
+ official documentation
+ provides you with all information you need to get started.
+
+
+
+
+
+
+ Tooling
+
+ This project is served and bundled with
+ Vite . The
+ recommended IDE setup is
+ VSCode +
+ Volar . If
+ you need to test your components and web pages, check out
+ Cypress and
+ Cypress Component Testing .
+
+
+
+ More instructions are available in README.md
.
+
+
+
+
+
+
+ Ecosystem
+
+ Get official tools and libraries for your project:
+ Pinia ,
+ Vue Router ,
+ Vue Test Utils , and
+ Vue Dev Tools . If
+ you need more resources, we suggest paying
+ Awesome Vue
+ a visit.
+
+
+
+
+
+
+ Community
+
+ Got stuck? Ask your question on
+ Vue Land , our official
+ Discord server, or
+ StackOverflow . You should also subscribe to
+ our mailing list and follow
+ the official
+ @vuejs
+ twitter account for latest news in the Vue world.
+
+
+
+
+
+
+ Support Vue
+
+ As an independent project, Vue relies on community backing for its sustainability. You can help
+ us by
+ becoming a sponsor .
+
+
diff --git a/src/components/WelcomeItem.vue b/src/components/WelcomeItem.vue
new file mode 100644
index 0000000..ac366d0
--- /dev/null
+++ b/src/components/WelcomeItem.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
diff --git a/src/components/icons/IconCommunity.vue b/src/components/icons/IconCommunity.vue
new file mode 100644
index 0000000..2dc8b05
--- /dev/null
+++ b/src/components/icons/IconCommunity.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/src/components/icons/IconDocumentation.vue b/src/components/icons/IconDocumentation.vue
new file mode 100644
index 0000000..6d4791c
--- /dev/null
+++ b/src/components/icons/IconDocumentation.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/src/components/icons/IconEcosystem.vue b/src/components/icons/IconEcosystem.vue
new file mode 100644
index 0000000..c3a4f07
--- /dev/null
+++ b/src/components/icons/IconEcosystem.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/src/components/icons/IconSupport.vue b/src/components/icons/IconSupport.vue
new file mode 100644
index 0000000..7452834
--- /dev/null
+++ b/src/components/icons/IconSupport.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/src/components/icons/IconTooling.vue b/src/components/icons/IconTooling.vue
new file mode 100644
index 0000000..660598d
--- /dev/null
+++ b/src/components/icons/IconTooling.vue
@@ -0,0 +1,19 @@
+
+
+
+
+
+
diff --git a/src/main.js b/src/main.js
new file mode 100644
index 0000000..5dcad83
--- /dev/null
+++ b/src/main.js
@@ -0,0 +1,14 @@
+import './assets/main.css'
+
+import { createApp } from 'vue'
+import { createPinia } from 'pinia'
+
+import App from './App.vue'
+import router from './router'
+
+const app = createApp(App)
+
+app.use(createPinia())
+app.use(router)
+
+app.mount('#app')
diff --git a/src/router/index.js b/src/router/index.js
new file mode 100644
index 0000000..a49ae50
--- /dev/null
+++ b/src/router/index.js
@@ -0,0 +1,23 @@
+import { createRouter, createWebHistory } from 'vue-router'
+import HomeView from '../views/HomeView.vue'
+
+const router = createRouter({
+ history: createWebHistory(import.meta.env.BASE_URL),
+ routes: [
+ {
+ path: '/',
+ name: 'home',
+ component: HomeView
+ },
+ {
+ path: '/about',
+ name: 'about',
+ // route level code-splitting
+ // this generates a separate chunk (About.[hash].js) for this route
+ // which is lazy-loaded when the route is visited.
+ component: () => import('../views/AboutView.vue')
+ }
+ ]
+})
+
+export default router
diff --git a/src/stores/counter.js b/src/stores/counter.js
new file mode 100644
index 0000000..b6757ba
--- /dev/null
+++ b/src/stores/counter.js
@@ -0,0 +1,12 @@
+import { ref, computed } from 'vue'
+import { defineStore } from 'pinia'
+
+export const useCounterStore = defineStore('counter', () => {
+ const count = ref(0)
+ const doubleCount = computed(() => count.value * 2)
+ function increment() {
+ count.value++
+ }
+
+ return { count, doubleCount, increment }
+})
diff --git a/src/views/AboutView.vue b/src/views/AboutView.vue
new file mode 100644
index 0000000..756ad2a
--- /dev/null
+++ b/src/views/AboutView.vue
@@ -0,0 +1,15 @@
+
+
+
This is an about page
+
+
+
+
diff --git a/src/views/HomeView.vue b/src/views/HomeView.vue
new file mode 100644
index 0000000..6bb706f
--- /dev/null
+++ b/src/views/HomeView.vue
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
diff --git a/storage/log/coredemo.log.2024-10-22-09-12 b/storage/log/coredemo.log.2024-10-22-09-12
new file mode 100644
index 0000000..2686bdc
--- /dev/null
+++ b/storage/log/coredemo.log.2024-10-22-09-12
@@ -0,0 +1 @@
+[Info] 2024-10-22T09:12:51+08:00 "ceshiceshi" map[]
diff --git a/storage/log/coredemo.log.2024-10-22-10-25 b/storage/log/coredemo.log.2024-10-22-10-25
new file mode 100644
index 0000000..da2eff4
--- /dev/null
+++ b/storage/log/coredemo.log.2024-10-22-10-25
@@ -0,0 +1 @@
+[Info] 2024-10-22T10:25:46+08:00 "ceshiceshi" map[]
diff --git a/storage/log/coredemo.log.2024-10-22-10-26 b/storage/log/coredemo.log.2024-10-22-10-26
new file mode 100644
index 0000000..b40bf7c
--- /dev/null
+++ b/storage/log/coredemo.log.2024-10-22-10-26
@@ -0,0 +1,2 @@
+[Info] 2024-10-22T10:26:03+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T10:26:58+08:00 "ceshiceshi" map[]
diff --git a/storage/log/coredemo.log.2024-10-22-10-27 b/storage/log/coredemo.log.2024-10-22-10-27
new file mode 100644
index 0000000..ce4af7e
--- /dev/null
+++ b/storage/log/coredemo.log.2024-10-22-10-27
@@ -0,0 +1,11 @@
+[Info] 2024-10-22T10:27:00+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T10:27:01+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T10:27:01+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T10:27:02+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T10:27:02+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T10:27:03+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T10:27:04+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T10:27:04+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T10:27:05+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T10:27:05+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T10:27:06+08:00 "ceshiceshi" map[]
diff --git a/storage/log/coredemo.log.2024-10-22-10-41 b/storage/log/coredemo.log.2024-10-22-10-41
new file mode 100644
index 0000000..dc7f0ab
--- /dev/null
+++ b/storage/log/coredemo.log.2024-10-22-10-41
@@ -0,0 +1,2 @@
+[Info] 2024-10-22T10:41:19+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T10:41:33+08:00 "ceshiceshi" map[]
diff --git a/storage/log/coredemo.log.2024-10-22-10-43 b/storage/log/coredemo.log.2024-10-22-10-43
new file mode 100644
index 0000000..f791869
--- /dev/null
+++ b/storage/log/coredemo.log.2024-10-22-10-43
@@ -0,0 +1,2 @@
+[Info] 2024-10-22T10:43:26+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T10:43:27+08:00 "ceshiceshi" map[]
diff --git a/storage/log/coredemo.log.2024-10-22-10-55 b/storage/log/coredemo.log.2024-10-22-10-55
new file mode 100644
index 0000000..46ce1ac
--- /dev/null
+++ b/storage/log/coredemo.log.2024-10-22-10-55
@@ -0,0 +1,2 @@
+[Info] 2024-10-22T10:55:05+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T10:55:23+08:00 "ceshiceshi" map[]
diff --git a/storage/log/coredemo.log.2024-10-22-10-56 b/storage/log/coredemo.log.2024-10-22-10-56
new file mode 100644
index 0000000..331f69b
--- /dev/null
+++ b/storage/log/coredemo.log.2024-10-22-10-56
@@ -0,0 +1,4 @@
+[Info] 2024-10-22T10:56:22+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T10:56:31+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T10:56:33+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T10:56:33+08:00 "ceshiceshi" map[]
diff --git a/storage/log/coredemo.log.2024-10-22-12-40 b/storage/log/coredemo.log.2024-10-22-12-40
new file mode 100644
index 0000000..3930b94
--- /dev/null
+++ b/storage/log/coredemo.log.2024-10-22-12-40
@@ -0,0 +1,6 @@
+[Info] 2024-10-22T12:40:24+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T12:40:25+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T12:40:27+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T12:40:55+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T12:40:56+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T12:40:57+08:00 "ceshiceshi" map[]
diff --git a/storage/log/coredemo.log.2024-10-22-12-41 b/storage/log/coredemo.log.2024-10-22-12-41
new file mode 100644
index 0000000..a8cf67f
--- /dev/null
+++ b/storage/log/coredemo.log.2024-10-22-12-41
@@ -0,0 +1,3 @@
+[Info] 2024-10-22T12:41:39+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T12:41:41+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T12:41:42+08:00 "ceshiceshi" map[]
diff --git a/storage/log/coredemo.log.2024-10-22-12-42 b/storage/log/coredemo.log.2024-10-22-12-42
new file mode 100644
index 0000000..1461698
--- /dev/null
+++ b/storage/log/coredemo.log.2024-10-22-12-42
@@ -0,0 +1,6 @@
+[Info] 2024-10-22T12:42:02+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T12:42:05+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T12:42:09+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T12:42:10+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T12:42:10+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T12:42:11+08:00 "ceshiceshi" map[]
diff --git a/storage/log/coredemo.log.2024-10-22-12-43 b/storage/log/coredemo.log.2024-10-22-12-43
new file mode 100644
index 0000000..d802ef7
--- /dev/null
+++ b/storage/log/coredemo.log.2024-10-22-12-43
@@ -0,0 +1,3 @@
+[Info] 2024-10-22T12:43:03+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T12:43:04+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T12:43:05+08:00 "ceshiceshi" map[]
diff --git a/storage/log/coredemo.log.2024-10-22-12-45 b/storage/log/coredemo.log.2024-10-22-12-45
new file mode 100644
index 0000000..d0846d8
--- /dev/null
+++ b/storage/log/coredemo.log.2024-10-22-12-45
@@ -0,0 +1 @@
+[Info] 2024-10-22T12:45:08+08:00 "ceshiceshi" map[]
diff --git a/storage/log/coredemo.log.2024-10-22-12-52 b/storage/log/coredemo.log.2024-10-22-12-52
new file mode 100644
index 0000000..932307d
--- /dev/null
+++ b/storage/log/coredemo.log.2024-10-22-12-52
@@ -0,0 +1,5 @@
+[Info] 2024-10-22T12:52:16+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T12:52:17+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T12:52:18+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T12:52:19+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T12:52:20+08:00 "ceshiceshi" map[]
diff --git a/storage/log/coredemo.log.2024-10-22-12-53 b/storage/log/coredemo.log.2024-10-22-12-53
new file mode 100644
index 0000000..4eae99d
--- /dev/null
+++ b/storage/log/coredemo.log.2024-10-22-12-53
@@ -0,0 +1,2 @@
+[Info] 2024-10-22T12:53:15+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T12:53:17+08:00 "ceshiceshi" map[]
diff --git a/storage/log/coredemo.log.2024-10-22-12-54 b/storage/log/coredemo.log.2024-10-22-12-54
new file mode 100644
index 0000000..2007216
--- /dev/null
+++ b/storage/log/coredemo.log.2024-10-22-12-54
@@ -0,0 +1,5 @@
+[Info] 2024-10-22T12:54:11+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T12:54:49+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T12:54:50+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T12:54:51+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T12:54:51+08:00 "ceshiceshi" map[]
diff --git a/storage/log/coredemo.log.2024-10-22-12-56 b/storage/log/coredemo.log.2024-10-22-12-56
new file mode 100644
index 0000000..06223d1
--- /dev/null
+++ b/storage/log/coredemo.log.2024-10-22-12-56
@@ -0,0 +1,5 @@
+[Info] 2024-10-22T12:56:47+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T12:56:48+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T12:56:49+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T12:56:51+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T12:56:52+08:00 "ceshiceshi" map[]
diff --git a/storage/log/coredemo.log.2024-10-22-12-57 b/storage/log/coredemo.log.2024-10-22-12-57
new file mode 100644
index 0000000..b3b9c28
--- /dev/null
+++ b/storage/log/coredemo.log.2024-10-22-12-57
@@ -0,0 +1,7 @@
+[Info] 2024-10-22T12:57:12+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T12:57:13+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T12:57:14+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T12:57:15+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T12:57:15+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T12:57:16+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T12:57:17+08:00 "ceshiceshi" map[]
diff --git a/storage/log/coredemo.log.2024-10-22-12-58 b/storage/log/coredemo.log.2024-10-22-12-58
new file mode 100644
index 0000000..4eed4e3
--- /dev/null
+++ b/storage/log/coredemo.log.2024-10-22-12-58
@@ -0,0 +1,4 @@
+[Info] 2024-10-22T12:58:04+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T12:58:05+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T12:58:05+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T12:58:07+08:00 "ceshiceshi" map[]
diff --git a/storage/log/coredemo.log.2024-10-22-13-00 b/storage/log/coredemo.log.2024-10-22-13-00
new file mode 100644
index 0000000..6d72d28
--- /dev/null
+++ b/storage/log/coredemo.log.2024-10-22-13-00
@@ -0,0 +1,2 @@
+[Info] 2024-10-22T13:00:02+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T13:00:05+08:00 "ceshiceshi" map[]
diff --git a/storage/log/coredemo.log.2024-10-22-13-12 b/storage/log/coredemo.log.2024-10-22-13-12
new file mode 100644
index 0000000..edc7791
--- /dev/null
+++ b/storage/log/coredemo.log.2024-10-22-13-12
@@ -0,0 +1,2 @@
+[Info] 2024-10-22T13:12:50+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T13:12:50+08:00 "ceshiceshi" map[]
diff --git a/storage/log/coredemo.log.2024-10-22-14-18 b/storage/log/coredemo.log.2024-10-22-14-18
new file mode 100644
index 0000000..fbfe0f8
--- /dev/null
+++ b/storage/log/coredemo.log.2024-10-22-14-18
@@ -0,0 +1,3 @@
+[Info] 2024-10-22T14:18:21+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T14:18:24+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T14:18:25+08:00 "ceshiceshi" map[]
diff --git a/storage/log/coredemo.log.2024-10-22-14-19 b/storage/log/coredemo.log.2024-10-22-14-19
new file mode 100644
index 0000000..f309be6
--- /dev/null
+++ b/storage/log/coredemo.log.2024-10-22-14-19
@@ -0,0 +1,3 @@
+[Info] 2024-10-22T14:19:03+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T14:19:04+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T14:19:06+08:00 "ceshiceshi" map[]
diff --git a/storage/log/coredemo.log.2024-10-22-14-26 b/storage/log/coredemo.log.2024-10-22-14-26
new file mode 100644
index 0000000..db1b852
--- /dev/null
+++ b/storage/log/coredemo.log.2024-10-22-14-26
@@ -0,0 +1,2 @@
+[Info] 2024-10-22T14:26:04+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T14:26:05+08:00 "ceshiceshi" map[]
diff --git a/storage/log/coredemo.log.2024-10-22-14-27 b/storage/log/coredemo.log.2024-10-22-14-27
new file mode 100644
index 0000000..2deb87d
--- /dev/null
+++ b/storage/log/coredemo.log.2024-10-22-14-27
@@ -0,0 +1,4 @@
+[Info] 2024-10-22T14:27:08+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T14:27:52+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T14:27:52+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T14:27:53+08:00 "ceshiceshi" map[]
diff --git a/storage/log/coredemo.log.2024-10-22-14-39 b/storage/log/coredemo.log.2024-10-22-14-39
new file mode 100644
index 0000000..0b751a2
--- /dev/null
+++ b/storage/log/coredemo.log.2024-10-22-14-39
@@ -0,0 +1,8 @@
+[Info] 2024-10-22T14:39:23+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T14:39:24+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T14:39:25+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T14:39:31+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T14:39:32+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T14:39:32+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T14:39:33+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T14:39:48+08:00 "ceshiceshi" map[]
diff --git a/storage/log/coredemo.log.2024-10-22-14-40 b/storage/log/coredemo.log.2024-10-22-14-40
new file mode 100644
index 0000000..f0ab833
--- /dev/null
+++ b/storage/log/coredemo.log.2024-10-22-14-40
@@ -0,0 +1,2 @@
+[Info] 2024-10-22T14:40:03+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T14:40:39+08:00 "ceshiceshi" map[]
diff --git a/storage/log/coredemo.log.2024-10-22-14-41 b/storage/log/coredemo.log.2024-10-22-14-41
new file mode 100644
index 0000000..d87d238
--- /dev/null
+++ b/storage/log/coredemo.log.2024-10-22-14-41
@@ -0,0 +1,10 @@
+[Info] 2024-10-22T14:41:00+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T14:41:01+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T14:41:02+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T14:41:02+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T14:41:03+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T14:41:03+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T14:41:04+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T14:41:17+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T14:41:19+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T14:41:19+08:00 "ceshiceshi" map[]
diff --git a/storage/log/coredemo.log.2024-10-22-14-43 b/storage/log/coredemo.log.2024-10-22-14-43
new file mode 100644
index 0000000..74e31be
--- /dev/null
+++ b/storage/log/coredemo.log.2024-10-22-14-43
@@ -0,0 +1 @@
+[Info] 2024-10-22T14:43:19+08:00 "ceshiceshi" map[]
diff --git a/storage/log/coredemo.log.2024-10-22-14-49 b/storage/log/coredemo.log.2024-10-22-14-49
new file mode 100644
index 0000000..a080973
--- /dev/null
+++ b/storage/log/coredemo.log.2024-10-22-14-49
@@ -0,0 +1 @@
+[Info] 2024-10-22T14:49:03+08:00 "ceshiceshi" map[]
diff --git a/storage/log/coredemo.log.2024-10-22-14-50 b/storage/log/coredemo.log.2024-10-22-14-50
new file mode 100644
index 0000000..097ffab
--- /dev/null
+++ b/storage/log/coredemo.log.2024-10-22-14-50
@@ -0,0 +1,2 @@
+[Info] 2024-10-22T14:50:54+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T14:50:55+08:00 "ceshiceshi" map[]
diff --git a/storage/log/coredemo.log.2024-10-22-14-52 b/storage/log/coredemo.log.2024-10-22-14-52
new file mode 100644
index 0000000..3b52204
--- /dev/null
+++ b/storage/log/coredemo.log.2024-10-22-14-52
@@ -0,0 +1,6 @@
+[Info] 2024-10-22T14:52:42+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T14:52:43+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T14:52:44+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T14:52:45+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T14:52:53+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T14:52:53+08:00 "ceshiceshi" map[]
diff --git a/storage/log/coredemo.log.2024-10-22-14-53 b/storage/log/coredemo.log.2024-10-22-14-53
new file mode 100644
index 0000000..9d0b01d
--- /dev/null
+++ b/storage/log/coredemo.log.2024-10-22-14-53
@@ -0,0 +1,11 @@
+[Info] 2024-10-22T14:53:27+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T14:53:29+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T14:53:30+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T14:53:30+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T14:53:47+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T14:53:48+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T14:53:48+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T14:53:49+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T14:53:50+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T14:53:51+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T14:53:54+08:00 "ceshiceshi" map[]
diff --git a/storage/log/coredemo.log.2024-10-22-14-54 b/storage/log/coredemo.log.2024-10-22-14-54
new file mode 100644
index 0000000..b9a889a
--- /dev/null
+++ b/storage/log/coredemo.log.2024-10-22-14-54
@@ -0,0 +1,16 @@
+[Info] 2024-10-22T14:54:04+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T14:54:05+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T14:54:06+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T14:54:06+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T14:54:07+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T14:54:10+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T14:54:12+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T14:54:18+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T14:54:19+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T14:54:19+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T14:54:20+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T14:54:20+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T14:54:21+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T14:54:21+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T14:54:22+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T14:54:23+08:00 "ceshiceshi" map[]
diff --git a/storage/log/coredemo.log.2024-10-22-14-56 b/storage/log/coredemo.log.2024-10-22-14-56
new file mode 100644
index 0000000..08a5d3c
--- /dev/null
+++ b/storage/log/coredemo.log.2024-10-22-14-56
@@ -0,0 +1,12 @@
+[Info] 2024-10-22T14:56:22+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T14:56:23+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T14:56:24+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T14:56:25+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T14:56:29+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T14:56:30+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T14:56:30+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T14:56:31+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T14:56:31+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T14:56:31+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T14:56:32+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T14:56:32+08:00 "ceshiceshi" map[]
diff --git a/storage/log/coredemo.log.2024-10-22-14-57 b/storage/log/coredemo.log.2024-10-22-14-57
new file mode 100644
index 0000000..3c37919
--- /dev/null
+++ b/storage/log/coredemo.log.2024-10-22-14-57
@@ -0,0 +1,7 @@
+[Info] 2024-10-22T14:57:14+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T14:57:15+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T14:57:16+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T14:57:17+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T14:57:35+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T14:57:36+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T14:57:36+08:00 "ceshiceshi" map[]
diff --git a/storage/log/coredemo.log.2024-10-22-14-59 b/storage/log/coredemo.log.2024-10-22-14-59
new file mode 100644
index 0000000..d13770a
--- /dev/null
+++ b/storage/log/coredemo.log.2024-10-22-14-59
@@ -0,0 +1,3 @@
+[Info] 2024-10-22T14:59:09+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T14:59:10+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T14:59:10+08:00 "ceshiceshi" map[]
diff --git a/storage/log/coredemo.log.2024-10-22-15-05 b/storage/log/coredemo.log.2024-10-22-15-05
new file mode 100644
index 0000000..86f9178
--- /dev/null
+++ b/storage/log/coredemo.log.2024-10-22-15-05
@@ -0,0 +1,6 @@
+[Info] 2024-10-22T15:05:47+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:05:47+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:05:49+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:05:50+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:05:54+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:05:57+08:00 "ceshiceshi" map[]
diff --git a/storage/log/coredemo.log.2024-10-22-15-06 b/storage/log/coredemo.log.2024-10-22-15-06
new file mode 100644
index 0000000..d1a7717
--- /dev/null
+++ b/storage/log/coredemo.log.2024-10-22-15-06
@@ -0,0 +1,6 @@
+[Info] 2024-10-22T15:06:25+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:06:25+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:06:26+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:06:27+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:06:27+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:06:28+08:00 "ceshiceshi" map[]
diff --git a/storage/log/coredemo.log.2024-10-22-15-08 b/storage/log/coredemo.log.2024-10-22-15-08
new file mode 100644
index 0000000..d73105a
--- /dev/null
+++ b/storage/log/coredemo.log.2024-10-22-15-08
@@ -0,0 +1,5 @@
+[Info] 2024-10-22T15:08:03+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:08:19+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:08:19+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:08:20+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:08:21+08:00 "ceshiceshi" map[]
diff --git a/storage/log/coredemo.log.2024-10-22-15-11 b/storage/log/coredemo.log.2024-10-22-15-11
new file mode 100644
index 0000000..3713864
--- /dev/null
+++ b/storage/log/coredemo.log.2024-10-22-15-11
@@ -0,0 +1,4 @@
+[Info] 2024-10-22T15:11:33+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:11:34+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:11:35+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:11:36+08:00 "ceshiceshi" map[]
diff --git a/storage/log/coredemo.log.2024-10-22-15-13 b/storage/log/coredemo.log.2024-10-22-15-13
new file mode 100644
index 0000000..710e5e4
--- /dev/null
+++ b/storage/log/coredemo.log.2024-10-22-15-13
@@ -0,0 +1,9 @@
+[Info] 2024-10-22T15:13:46+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:13:47+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:13:48+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:13:49+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:13:49+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:13:50+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:13:50+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:13:51+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:13:51+08:00 "ceshiceshi" map[]
diff --git a/storage/log/coredemo.log.2024-10-22-15-15 b/storage/log/coredemo.log.2024-10-22-15-15
new file mode 100644
index 0000000..30e1c6a
--- /dev/null
+++ b/storage/log/coredemo.log.2024-10-22-15-15
@@ -0,0 +1,6 @@
+[Info] 2024-10-22T15:15:37+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:15:39+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:15:40+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:15:41+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:15:41+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:15:42+08:00 "ceshiceshi" map[]
diff --git a/storage/log/coredemo.log.2024-10-22-15-16 b/storage/log/coredemo.log.2024-10-22-15-16
new file mode 100644
index 0000000..4e4997e
--- /dev/null
+++ b/storage/log/coredemo.log.2024-10-22-15-16
@@ -0,0 +1,22 @@
+[Info] 2024-10-22T15:16:23+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:16:27+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:16:27+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:16:28+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:16:31+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:16:31+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:16:32+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:16:32+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:16:33+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:16:34+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:16:34+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:16:35+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:16:35+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:16:36+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:16:36+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:16:37+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:16:37+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:16:38+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:16:38+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:16:39+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:16:39+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:16:58+08:00 "ceshiceshi" map[]
diff --git a/storage/log/coredemo.log.2024-10-22-15-17 b/storage/log/coredemo.log.2024-10-22-15-17
new file mode 100644
index 0000000..9a67c81
--- /dev/null
+++ b/storage/log/coredemo.log.2024-10-22-15-17
@@ -0,0 +1,36 @@
+[Info] 2024-10-22T15:17:08+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:17:09+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:17:09+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:17:10+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:17:11+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:17:15+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:17:18+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:17:19+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:17:19+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:17:20+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:17:21+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:17:21+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:17:22+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:17:22+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:17:23+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:17:23+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:17:24+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:17:24+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:17:25+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:17:25+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:17:26+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:17:27+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:17:27+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:17:28+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:17:29+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:17:30+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:17:30+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:17:31+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:17:31+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:17:32+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:17:32+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:17:33+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:17:33+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:17:34+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:17:34+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:17:35+08:00 "ceshiceshi" map[]
diff --git a/storage/log/coredemo.log.2024-10-22-15-23 b/storage/log/coredemo.log.2024-10-22-15-23
new file mode 100644
index 0000000..2e0a9d4
--- /dev/null
+++ b/storage/log/coredemo.log.2024-10-22-15-23
@@ -0,0 +1,9 @@
+[Info] 2024-10-22T15:23:25+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:23:30+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:23:30+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:23:32+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:23:33+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:23:33+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:23:34+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:23:34+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:23:35+08:00 "ceshiceshi" map[]
diff --git a/storage/log/coredemo.log.2024-10-22-15-24 b/storage/log/coredemo.log.2024-10-22-15-24
new file mode 100644
index 0000000..ec7fdcc
--- /dev/null
+++ b/storage/log/coredemo.log.2024-10-22-15-24
@@ -0,0 +1,8 @@
+[Info] 2024-10-22T15:24:20+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:24:21+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:24:21+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:24:48+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:24:49+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:24:50+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:24:51+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T15:24:51+08:00 "ceshiceshi" map[]
diff --git a/storage/log/coredemo.log.2024-10-22-16-02 b/storage/log/coredemo.log.2024-10-22-16-02
new file mode 100644
index 0000000..edd43a0
--- /dev/null
+++ b/storage/log/coredemo.log.2024-10-22-16-02
@@ -0,0 +1,2 @@
+[Info] 2024-10-22T16:02:38+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T16:02:41+08:00 "ceshiceshi" map[]
diff --git a/storage/log/coredemo.log.2024-10-22-16-06 b/storage/log/coredemo.log.2024-10-22-16-06
new file mode 100644
index 0000000..6be265a
--- /dev/null
+++ b/storage/log/coredemo.log.2024-10-22-16-06
@@ -0,0 +1,6 @@
+[Info] 2024-10-22T16:06:50+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T16:06:51+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T16:06:52+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T16:06:52+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T16:06:53+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T16:06:59+08:00 "ceshiceshi" map[]
diff --git a/storage/log/coredemo.log.2024-10-22-16-07 b/storage/log/coredemo.log.2024-10-22-16-07
new file mode 100644
index 0000000..9e0b2a1
--- /dev/null
+++ b/storage/log/coredemo.log.2024-10-22-16-07
@@ -0,0 +1,8 @@
+[Info] 2024-10-22T16:07:00+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T16:07:00+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T16:07:40+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T16:07:40+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T16:07:41+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T16:07:42+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T16:07:42+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T16:07:43+08:00 "ceshiceshi" map[]
diff --git a/storage/log/coredemo.log.2024-10-22-16-08 b/storage/log/coredemo.log.2024-10-22-16-08
new file mode 100644
index 0000000..3d95aa1
--- /dev/null
+++ b/storage/log/coredemo.log.2024-10-22-16-08
@@ -0,0 +1,10 @@
+[Info] 2024-10-22T16:08:20+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T16:08:22+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T16:08:22+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T16:08:23+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T16:08:23+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T16:08:25+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T16:08:25+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T16:08:26+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T16:08:27+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T16:08:27+08:00 "ceshiceshi" map[]
diff --git a/storage/log/coredemo.log.2024-10-22-16-12 b/storage/log/coredemo.log.2024-10-22-16-12
new file mode 100644
index 0000000..d5af148
--- /dev/null
+++ b/storage/log/coredemo.log.2024-10-22-16-12
@@ -0,0 +1,7 @@
+[Info] 2024-10-22T16:12:29+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T16:12:30+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T16:12:31+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T16:12:32+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T16:12:32+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T16:12:33+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T16:12:54+08:00 "ceshiceshi" map[]
diff --git a/storage/log/coredemo.log.2024-10-22-16-13 b/storage/log/coredemo.log.2024-10-22-16-13
new file mode 100644
index 0000000..8f19dda
--- /dev/null
+++ b/storage/log/coredemo.log.2024-10-22-16-13
@@ -0,0 +1,10 @@
+[Info] 2024-10-22T16:13:05+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T16:13:06+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T16:13:07+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T16:13:07+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T16:13:10+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T16:13:53+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T16:13:53+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T16:13:54+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T16:13:54+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T16:13:55+08:00 "ceshiceshi" map[]
diff --git a/storage/log/coredemo.log.2024-10-22-16-17 b/storage/log/coredemo.log.2024-10-22-16-17
new file mode 100644
index 0000000..4a5d6ad
--- /dev/null
+++ b/storage/log/coredemo.log.2024-10-22-16-17
@@ -0,0 +1,4 @@
+[Info] 2024-10-22T16:17:37+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T16:17:42+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T16:17:42+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T16:17:43+08:00 "ceshiceshi" map[]
diff --git a/storage/log/coredemo.log.2024-10-22-16-18 b/storage/log/coredemo.log.2024-10-22-16-18
new file mode 100644
index 0000000..ba40100
--- /dev/null
+++ b/storage/log/coredemo.log.2024-10-22-16-18
@@ -0,0 +1,3 @@
+[Info] 2024-10-22T16:18:48+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T16:18:50+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T16:18:51+08:00 "ceshiceshi" map[]
diff --git a/storage/log/coredemo.log.2024-10-22-16-24 b/storage/log/coredemo.log.2024-10-22-16-24
new file mode 100644
index 0000000..b652a9b
--- /dev/null
+++ b/storage/log/coredemo.log.2024-10-22-16-24
@@ -0,0 +1,6 @@
+[Info] 2024-10-22T16:24:01+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T16:24:03+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T16:24:04+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T16:24:04+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T16:24:05+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T16:24:05+08:00 "ceshiceshi" map[]
diff --git a/storage/log/coredemo.log.2024-10-22-16-43 b/storage/log/coredemo.log.2024-10-22-16-43
new file mode 100644
index 0000000..9741458
--- /dev/null
+++ b/storage/log/coredemo.log.2024-10-22-16-43
@@ -0,0 +1,7 @@
+[Info] 2024-10-22T16:43:21+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T16:43:22+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T16:43:23+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T16:43:23+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T16:43:24+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T16:43:24+08:00 "ceshiceshi" map[]
+[Info] 2024-10-22T16:43:25+08:00 "ceshiceshi" map[]
diff --git a/vite.config.js b/vite.config.js
new file mode 100644
index 0000000..21d97d5
--- /dev/null
+++ b/vite.config.js
@@ -0,0 +1,16 @@
+import { fileURLToPath, URL } from 'node:url'
+
+import { defineConfig } from 'vite'
+import vue from '@vitejs/plugin-vue'
+
+// https://vite.dev/config/
+export default defineConfig({
+ plugins: [
+ vue(),
+ ],
+ resolve: {
+ alias: {
+ '@': fileURLToPath(new URL('./src', import.meta.url))
+ }
+ }
+})