update
This commit is contained in:
		@@ -2,6 +2,7 @@ import { defineConfig } from 'astro/config';
 | 
			
		||||
import mdx from '@astrojs/mdx';
 | 
			
		||||
import react from '@astrojs/react';
 | 
			
		||||
import sitemap from '@astrojs/sitemap';
 | 
			
		||||
import baseSSL from '@vitejs/plugin-basic-ssl';
 | 
			
		||||
import pkgs from './package.json';
 | 
			
		||||
import tailwindcss from '@tailwindcss/vite';
 | 
			
		||||
const isDev = process.env.NODE_ENV === 'development';
 | 
			
		||||
 
 | 
			
		||||
@@ -3,7 +3,7 @@
 | 
			
		||||
  "version": "0.0.5",
 | 
			
		||||
  "description": "",
 | 
			
		||||
  "main": "index.js",
 | 
			
		||||
  "basename": "/user/home",
 | 
			
		||||
  "basename": "/root/home",
 | 
			
		||||
  "scripts": {
 | 
			
		||||
    "dev": "astro dev",
 | 
			
		||||
    "build": "astro build",
 | 
			
		||||
@@ -20,6 +20,7 @@
 | 
			
		||||
    "@astrojs/react": "^4.4.0",
 | 
			
		||||
    "@astrojs/sitemap": "^3.6.0",
 | 
			
		||||
    "@floating-ui/dom": "^1.7.4",
 | 
			
		||||
    "@kevisual/context": "^0.0.4",
 | 
			
		||||
    "@kevisual/query": "0.0.29",
 | 
			
		||||
    "@kevisual/query-login": "^0.0.6",
 | 
			
		||||
    "@kevisual/registry": "^0.0.1",
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										8
									
								
								pnpm-lock.yaml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										8
									
								
								pnpm-lock.yaml
									
									
									
										generated
									
									
									
								
							@@ -20,6 +20,9 @@ importers:
 | 
			
		||||
      '@floating-ui/dom':
 | 
			
		||||
        specifier: ^1.7.4
 | 
			
		||||
        version: 1.7.4
 | 
			
		||||
      '@kevisual/context':
 | 
			
		||||
        specifier: ^0.0.4
 | 
			
		||||
        version: 0.0.4
 | 
			
		||||
      '@kevisual/query':
 | 
			
		||||
        specifier: 0.0.29
 | 
			
		||||
        version: 0.0.29(ws@8.18.0)(zod@3.25.76)
 | 
			
		||||
@@ -676,6 +679,9 @@ packages:
 | 
			
		||||
  '@kevisual/cache@0.0.2':
 | 
			
		||||
    resolution: {integrity: sha512-2Cl5KF2Gi27uLfhO6CdTMFnRzx9vYnqevAo7d9ab3rOaqTgF8tLeAXglXyRbaWW3WUbHU2XaOb4r98uUsqIQQw==}
 | 
			
		||||
 | 
			
		||||
  '@kevisual/context@0.0.4':
 | 
			
		||||
    resolution: {integrity: sha512-HJeLeZQLU+7tCluSfOyvkgKLs0HjCZrdJlZgEgKRSa8XTwZfMAUt6J7qZTbrZAHBlPtX68EPu/PI8JMCeu3WAQ==}
 | 
			
		||||
 | 
			
		||||
  '@kevisual/query-login@0.0.6':
 | 
			
		||||
    resolution: {integrity: sha512-ZdX+sxeQaM3PV9fZXofMlxFz1RmpYIkoi47exzUgw6DADjEryBAQKRXe2/oL20NsBTV8owqaagRqffAVjq5c5g==}
 | 
			
		||||
    peerDependencies:
 | 
			
		||||
@@ -3294,6 +3300,8 @@ snapshots:
 | 
			
		||||
      - tslib
 | 
			
		||||
      - typescript
 | 
			
		||||
 | 
			
		||||
  '@kevisual/context@0.0.4': {}
 | 
			
		||||
 | 
			
		||||
  '@kevisual/query-login@0.0.6(@kevisual/query@0.0.29(ws@8.18.0)(zod@3.25.76))(rollup@4.52.5)(tslib@2.8.1)(typescript@5.8.3)':
 | 
			
		||||
    dependencies:
 | 
			
		||||
      '@kevisual/cache': 0.0.2(rollup@4.52.5)(tslib@2.8.1)(typescript@5.8.3)
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										13
									
								
								public/test-import.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								public/test-import.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,13 @@
 | 
			
		||||
export const test = () => {
 | 
			
		||||
  return new Date().toDateString();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const app = useContextKey('app')
 | 
			
		||||
 | 
			
		||||
app.route({
 | 
			
		||||
  path: 'test-import',
 | 
			
		||||
  description: 'test dynamic import module',
 | 
			
		||||
}).define(async(ctx)=>{
 | 
			
		||||
 | 
			
		||||
  ctx.body = 'test-import'
 | 
			
		||||
}).addTo(app);
 | 
			
		||||
							
								
								
									
										4
									
								
								src/apps/ai/app.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								src/apps/ai/app.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,4 @@
 | 
			
		||||
import { QueryRouterServer } from '@kevisual/router/browser'
 | 
			
		||||
import { useContextKey } from '@kevisual/context'
 | 
			
		||||
const app = useContextKey('app', new QueryRouterServer())
 | 
			
		||||
export { app }
 | 
			
		||||
							
								
								
									
										6
									
								
								src/apps/ai/index.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								src/apps/ai/index.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
			
		||||
import { app } from './app'
 | 
			
		||||
 | 
			
		||||
import './routes/login'
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
export { app }
 | 
			
		||||
							
								
								
									
										14
									
								
								src/apps/ai/routes/login/index.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								src/apps/ai/routes/login/index.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,14 @@
 | 
			
		||||
import { app } from '../../app'
 | 
			
		||||
 | 
			
		||||
app.route({
 | 
			
		||||
  path: 'login',
 | 
			
		||||
  description: '登录应用,参数 username 是用户名,password 是密码',
 | 
			
		||||
 | 
			
		||||
}).define(async (ctx) => {
 | 
			
		||||
  const { username, password } = ctx.query;
 | 
			
		||||
 | 
			
		||||
  ctx.body = {
 | 
			
		||||
    message: `User ${username} logged in successfully.`,
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
).addTo(app)
 | 
			
		||||
							
								
								
									
										42
									
								
								src/apps/web-command/index.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								src/apps/web-command/index.tsx
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,42 @@
 | 
			
		||||
import { app } from '../ai';
 | 
			
		||||
import { useEffect, useState } from 'react';
 | 
			
		||||
 | 
			
		||||
const getAppRoutes = () => {
 | 
			
		||||
  const appRoutes = app.routes.map((route) => {
 | 
			
		||||
    return {
 | 
			
		||||
      path: route.path,
 | 
			
		||||
      key: route.key,
 | 
			
		||||
      description: route.description,
 | 
			
		||||
      metadata: route.metadata,
 | 
			
		||||
    }
 | 
			
		||||
  });
 | 
			
		||||
  return appRoutes;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const fetchTest = async () => {
 | 
			
		||||
  const url = 'http://localhost:51015/api/router';
 | 
			
		||||
  const response = await fetch(url);
 | 
			
		||||
  const data = await response.json();
 | 
			
		||||
  console.log('Fetch Test Data:', data);
 | 
			
		||||
}
 | 
			
		||||
const dynamicImport = async () => {
 | 
			
		||||
  const module = await import('http://localhost:4321/test-import.js');
 | 
			
		||||
  console.log('Dynamically Imported Module:', module);
 | 
			
		||||
  console.log('Test Function Output:', module.test());
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
export const App = () => {
 | 
			
		||||
  const [appRoutes, setAppRoutes] = useState(getAppRoutes());
 | 
			
		||||
  useEffect(() => {
 | 
			
		||||
    setAppRoutes(getAppRoutes());
 | 
			
		||||
  }, []);
 | 
			
		||||
  return <div>Web Command App
 | 
			
		||||
 | 
			
		||||
    <pre onClick={async () => {
 | 
			
		||||
 | 
			
		||||
      await dynamicImport()
 | 
			
		||||
      setAppRoutes(getAppRoutes());
 | 
			
		||||
    }
 | 
			
		||||
    }>{JSON.stringify(appRoutes, null, 2)}</pre>
 | 
			
		||||
  </div >;
 | 
			
		||||
}
 | 
			
		||||
@@ -1,5 +1,6 @@
 | 
			
		||||
---
 | 
			
		||||
import '../styles/global.css';
 | 
			
		||||
import '../styles/theme.css';
 | 
			
		||||
export interface Props {
 | 
			
		||||
  title?: string;
 | 
			
		||||
  description?: string;
 | 
			
		||||
 
 | 
			
		||||
@@ -9,7 +9,7 @@ const docs = defineCollection({
 | 
			
		||||
    title: z.string().optional(),
 | 
			
		||||
    description: z.string().optional(),
 | 
			
		||||
    // pubDate: z.coerce.date(),
 | 
			
		||||
    // updatedDate: z.coerce.date().optional(),
 | 
			
		||||
    // updatedAt: z.coerce.date().optional(),
 | 
			
		||||
  }),
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,3 +1,10 @@
 | 
			
		||||
---
 | 
			
		||||
title: 'home'
 | 
			
		||||
tags: ['首页', '工作台']
 | 
			
		||||
createdAt: 2025-10-27 18:35
 | 
			
		||||
updatedAt: 2025-10-27 18:35
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
# 首页描述
 | 
			
		||||
 | 
			
		||||
所有的页面的登录入口在当前页面,
 | 
			
		||||
@@ -11,6 +18,5 @@
 | 
			
		||||
- 命令执行
 | 
			
		||||
- 历史记录
 | 
			
		||||
 | 
			
		||||
## 任务管理
 | 
			
		||||
## 使用场景
 | 
			
		||||
 | 
			
		||||
- [ ]  登录功能
 | 
			
		||||
@@ -1,24 +1,47 @@
 | 
			
		||||
---
 | 
			
		||||
import '../styles/global.css';
 | 
			
		||||
import '../styles/theme.css';
 | 
			
		||||
export interface Props {
 | 
			
		||||
  title?: string;
 | 
			
		||||
  description?: string;
 | 
			
		||||
  lang?: string;
 | 
			
		||||
  charset?: string;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const { title = 'Light Code', description = 'A lightweight code editor', lang = 'zh-CN', charset = 'UTF-8' } = Astro.props;
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
<html lang='zh-CN'>
 | 
			
		||||
<!doctype html>
 | 
			
		||||
<html lang={lang}>
 | 
			
		||||
  <head>
 | 
			
		||||
    <meta charset='UTF-8' />
 | 
			
		||||
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
 | 
			
		||||
    <title>AI Pages</title>
 | 
			
		||||
    <style>
 | 
			
		||||
      html,
 | 
			
		||||
      body {
 | 
			
		||||
        width: 100%;
 | 
			
		||||
        min-height: 100vh;
 | 
			
		||||
        margin: 0;
 | 
			
		||||
        padding: 0;
 | 
			
		||||
      }
 | 
			
		||||
    </style>
 | 
			
		||||
    <meta charset={charset} />
 | 
			
		||||
    <meta name='viewport' content='width=device-width, initial-scale=1.0' />
 | 
			
		||||
    <meta name='description' content={description} />
 | 
			
		||||
    <title>{title}</title>
 | 
			
		||||
    <!-- 样式 -->
 | 
			
		||||
    <slot name='head' />
 | 
			
		||||
  </head>
 | 
			
		||||
  <body>
 | 
			
		||||
    <slot />
 | 
			
		||||
 | 
			
		||||
    <!-- 脚本 -->
 | 
			
		||||
    <slot name='scripts' />
 | 
			
		||||
  </body>
 | 
			
		||||
</html>
 | 
			
		||||
 | 
			
		||||
<style>
 | 
			
		||||
  html {
 | 
			
		||||
    font-family: system-ui, sans-serif;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  html,
 | 
			
		||||
  body {
 | 
			
		||||
    margin: 0;
 | 
			
		||||
    padding: 0;
 | 
			
		||||
    min-height: 100vh;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  * {
 | 
			
		||||
    box-sizing: border-box;
 | 
			
		||||
  }
 | 
			
		||||
</style>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,46 +1,10 @@
 | 
			
		||||
---
 | 
			
		||||
console.log('Hello from index.astro');
 | 
			
		||||
import '../styles/global.css';
 | 
			
		||||
import Html from '@/components/html.astro';
 | 
			
		||||
import { App } from '@/apps/web-command';
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
<html lang='en'>
 | 
			
		||||
  <head>
 | 
			
		||||
    <title>Home</title>
 | 
			
		||||
  </head>
 | 
			
		||||
  <body>
 | 
			
		||||
    <h1 onclick="{onClick}">Welcome to my website!</h1>
 | 
			
		||||
    <div class='bg-amber-50 w-20 h-20 rounded-full'></div>
 | 
			
		||||
    <div id='root'></div>
 | 
			
		||||
    <script type='importmap' data-vite-ignore is:inline>
 | 
			
		||||
      {
 | 
			
		||||
        "imports": {
 | 
			
		||||
          "react": "https://esm.sh/react@19.1.0",
 | 
			
		||||
          "react-dom": "https://esm.sh/react-dom@19.1.0/client.js",
 | 
			
		||||
          "react-toastify": "https://esm.sh/react-toastify@11.0.5"
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    </script>
 | 
			
		||||
    <script type='module' data-vite-ignore is:inline>
 | 
			
		||||
      import { Button, message } from 'https://esm.sh/antd?standalone';
 | 
			
		||||
      import React from 'react';
 | 
			
		||||
      import { ToastContainer, toast } from 'react-toastify';
 | 
			
		||||
      import { createRoot } from 'react-dom';
 | 
			
		||||
      setTimeout(() => {
 | 
			
		||||
        toast.loading('Hello from index.astro');
 | 
			
		||||
        window.toast = toast;
 | 
			
		||||
        console.log('message', toast);
 | 
			
		||||
      }, 1000);
 | 
			
		||||
      console.log('Hello from index.astro', Button);
 | 
			
		||||
      const root = document.getElementById('root');
 | 
			
		||||
      const render = createRoot(root);
 | 
			
		||||
      const App = () => {
 | 
			
		||||
        const button = React.createElement(Button, null, 'Hello');
 | 
			
		||||
        const messageEl = React.createElement(ToastContainer, null, 'Hello');
 | 
			
		||||
        const wrapperMessage = React.createElement('div', null, [button, messageEl]);
 | 
			
		||||
        return wrapperMessage;
 | 
			
		||||
      };
 | 
			
		||||
      // render.render(React.createElement(Button, null, 'Hello'), root);
 | 
			
		||||
      render.render(App(), root);
 | 
			
		||||
    </script>
 | 
			
		||||
  </body>
 | 
			
		||||
</html>
 | 
			
		||||
<Html>
 | 
			
		||||
  <main>
 | 
			
		||||
    <App client:only/>
 | 
			
		||||
  </main>
 | 
			
		||||
</Html>
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user