Initial commit
1
.astro/content-assets.mjs
Normal file
@@ -0,0 +1 @@
|
||||
export default new Map();
|
||||
1
.astro/content-modules.mjs
Normal file
@@ -0,0 +1 @@
|
||||
export default new Map();
|
||||
199
.astro/content.d.ts
vendored
Normal file
@@ -0,0 +1,199 @@
|
||||
declare module 'astro:content' {
|
||||
export interface RenderResult {
|
||||
Content: import('astro/runtime/server/index.js').AstroComponentFactory;
|
||||
headings: import('astro').MarkdownHeading[];
|
||||
remarkPluginFrontmatter: Record<string, any>;
|
||||
}
|
||||
interface Render {
|
||||
'.md': Promise<RenderResult>;
|
||||
}
|
||||
|
||||
export interface RenderedContent {
|
||||
html: string;
|
||||
metadata?: {
|
||||
imagePaths: Array<string>;
|
||||
[key: string]: unknown;
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
declare module 'astro:content' {
|
||||
type Flatten<T> = T extends { [K: string]: infer U } ? U : never;
|
||||
|
||||
export type CollectionKey = keyof AnyEntryMap;
|
||||
export type CollectionEntry<C extends CollectionKey> = Flatten<AnyEntryMap[C]>;
|
||||
|
||||
export type ContentCollectionKey = keyof ContentEntryMap;
|
||||
export type DataCollectionKey = keyof DataEntryMap;
|
||||
|
||||
type AllValuesOf<T> = T extends any ? T[keyof T] : never;
|
||||
type ValidContentEntrySlug<C extends keyof ContentEntryMap> = AllValuesOf<
|
||||
ContentEntryMap[C]
|
||||
>['slug'];
|
||||
|
||||
export type ReferenceDataEntry<
|
||||
C extends CollectionKey,
|
||||
E extends keyof DataEntryMap[C] = string,
|
||||
> = {
|
||||
collection: C;
|
||||
id: E;
|
||||
};
|
||||
export type ReferenceContentEntry<
|
||||
C extends keyof ContentEntryMap,
|
||||
E extends ValidContentEntrySlug<C> | (string & {}) = string,
|
||||
> = {
|
||||
collection: C;
|
||||
slug: E;
|
||||
};
|
||||
export type ReferenceLiveEntry<C extends keyof LiveContentConfig['collections']> = {
|
||||
collection: C;
|
||||
id: string;
|
||||
};
|
||||
|
||||
/** @deprecated Use `getEntry` instead. */
|
||||
export function getEntryBySlug<
|
||||
C extends keyof ContentEntryMap,
|
||||
E extends ValidContentEntrySlug<C> | (string & {}),
|
||||
>(
|
||||
collection: C,
|
||||
// Note that this has to accept a regular string too, for SSR
|
||||
entrySlug: E,
|
||||
): E extends ValidContentEntrySlug<C>
|
||||
? Promise<CollectionEntry<C>>
|
||||
: Promise<CollectionEntry<C> | undefined>;
|
||||
|
||||
/** @deprecated Use `getEntry` instead. */
|
||||
export function getDataEntryById<C extends keyof DataEntryMap, E extends keyof DataEntryMap[C]>(
|
||||
collection: C,
|
||||
entryId: E,
|
||||
): Promise<CollectionEntry<C>>;
|
||||
|
||||
export function getCollection<C extends keyof AnyEntryMap, E extends CollectionEntry<C>>(
|
||||
collection: C,
|
||||
filter?: (entry: CollectionEntry<C>) => entry is E,
|
||||
): Promise<E[]>;
|
||||
export function getCollection<C extends keyof AnyEntryMap>(
|
||||
collection: C,
|
||||
filter?: (entry: CollectionEntry<C>) => unknown,
|
||||
): Promise<CollectionEntry<C>[]>;
|
||||
|
||||
export function getLiveCollection<C extends keyof LiveContentConfig['collections']>(
|
||||
collection: C,
|
||||
filter?: LiveLoaderCollectionFilterType<C>,
|
||||
): Promise<
|
||||
import('astro').LiveDataCollectionResult<LiveLoaderDataType<C>, LiveLoaderErrorType<C>>
|
||||
>;
|
||||
|
||||
export function getEntry<
|
||||
C extends keyof ContentEntryMap,
|
||||
E extends ValidContentEntrySlug<C> | (string & {}),
|
||||
>(
|
||||
entry: ReferenceContentEntry<C, E>,
|
||||
): E extends ValidContentEntrySlug<C>
|
||||
? Promise<CollectionEntry<C>>
|
||||
: Promise<CollectionEntry<C> | undefined>;
|
||||
export function getEntry<
|
||||
C extends keyof DataEntryMap,
|
||||
E extends keyof DataEntryMap[C] | (string & {}),
|
||||
>(
|
||||
entry: ReferenceDataEntry<C, E>,
|
||||
): E extends keyof DataEntryMap[C]
|
||||
? Promise<DataEntryMap[C][E]>
|
||||
: Promise<CollectionEntry<C> | undefined>;
|
||||
export function getEntry<
|
||||
C extends keyof ContentEntryMap,
|
||||
E extends ValidContentEntrySlug<C> | (string & {}),
|
||||
>(
|
||||
collection: C,
|
||||
slug: E,
|
||||
): E extends ValidContentEntrySlug<C>
|
||||
? Promise<CollectionEntry<C>>
|
||||
: Promise<CollectionEntry<C> | undefined>;
|
||||
export function getEntry<
|
||||
C extends keyof DataEntryMap,
|
||||
E extends keyof DataEntryMap[C] | (string & {}),
|
||||
>(
|
||||
collection: C,
|
||||
id: E,
|
||||
): E extends keyof DataEntryMap[C]
|
||||
? string extends keyof DataEntryMap[C]
|
||||
? Promise<DataEntryMap[C][E]> | undefined
|
||||
: Promise<DataEntryMap[C][E]>
|
||||
: Promise<CollectionEntry<C> | undefined>;
|
||||
export function getLiveEntry<C extends keyof LiveContentConfig['collections']>(
|
||||
collection: C,
|
||||
filter: string | LiveLoaderEntryFilterType<C>,
|
||||
): Promise<import('astro').LiveDataEntryResult<LiveLoaderDataType<C>, LiveLoaderErrorType<C>>>;
|
||||
|
||||
/** Resolve an array of entry references from the same collection */
|
||||
export function getEntries<C extends keyof ContentEntryMap>(
|
||||
entries: ReferenceContentEntry<C, ValidContentEntrySlug<C>>[],
|
||||
): Promise<CollectionEntry<C>[]>;
|
||||
export function getEntries<C extends keyof DataEntryMap>(
|
||||
entries: ReferenceDataEntry<C, keyof DataEntryMap[C]>[],
|
||||
): Promise<CollectionEntry<C>[]>;
|
||||
|
||||
export function render<C extends keyof AnyEntryMap>(
|
||||
entry: AnyEntryMap[C][string],
|
||||
): Promise<RenderResult>;
|
||||
|
||||
export function reference<C extends keyof AnyEntryMap>(
|
||||
collection: C,
|
||||
): import('astro/zod').ZodEffects<
|
||||
import('astro/zod').ZodString,
|
||||
C extends keyof ContentEntryMap
|
||||
? ReferenceContentEntry<C, ValidContentEntrySlug<C>>
|
||||
: ReferenceDataEntry<C, keyof DataEntryMap[C]>
|
||||
>;
|
||||
// Allow generic `string` to avoid excessive type errors in the config
|
||||
// if `dev` is not running to update as you edit.
|
||||
// Invalid collection names will be caught at build time.
|
||||
export function reference<C extends string>(
|
||||
collection: C,
|
||||
): import('astro/zod').ZodEffects<import('astro/zod').ZodString, never>;
|
||||
|
||||
type ReturnTypeOrOriginal<T> = T extends (...args: any[]) => infer R ? R : T;
|
||||
type InferEntrySchema<C extends keyof AnyEntryMap> = import('astro/zod').infer<
|
||||
ReturnTypeOrOriginal<Required<ContentConfig['collections'][C]>['schema']>
|
||||
>;
|
||||
|
||||
type ContentEntryMap = {
|
||||
|
||||
};
|
||||
|
||||
type DataEntryMap = {
|
||||
|
||||
};
|
||||
|
||||
type AnyEntryMap = ContentEntryMap & DataEntryMap;
|
||||
|
||||
type ExtractLoaderTypes<T> = T extends import('astro/loaders').LiveLoader<
|
||||
infer TData,
|
||||
infer TEntryFilter,
|
||||
infer TCollectionFilter,
|
||||
infer TError
|
||||
>
|
||||
? { data: TData; entryFilter: TEntryFilter; collectionFilter: TCollectionFilter; error: TError }
|
||||
: { data: never; entryFilter: never; collectionFilter: never; error: never };
|
||||
type ExtractDataType<T> = ExtractLoaderTypes<T>['data'];
|
||||
type ExtractEntryFilterType<T> = ExtractLoaderTypes<T>['entryFilter'];
|
||||
type ExtractCollectionFilterType<T> = ExtractLoaderTypes<T>['collectionFilter'];
|
||||
type ExtractErrorType<T> = ExtractLoaderTypes<T>['error'];
|
||||
|
||||
type LiveLoaderDataType<C extends keyof LiveContentConfig['collections']> =
|
||||
LiveContentConfig['collections'][C]['schema'] extends undefined
|
||||
? ExtractDataType<LiveContentConfig['collections'][C]['loader']>
|
||||
: import('astro/zod').infer<
|
||||
Exclude<LiveContentConfig['collections'][C]['schema'], undefined>
|
||||
>;
|
||||
type LiveLoaderEntryFilterType<C extends keyof LiveContentConfig['collections']> =
|
||||
ExtractEntryFilterType<LiveContentConfig['collections'][C]['loader']>;
|
||||
type LiveLoaderCollectionFilterType<C extends keyof LiveContentConfig['collections']> =
|
||||
ExtractCollectionFilterType<LiveContentConfig['collections'][C]['loader']>;
|
||||
type LiveLoaderErrorType<C extends keyof LiveContentConfig['collections']> = ExtractErrorType<
|
||||
LiveContentConfig['collections'][C]['loader']
|
||||
>;
|
||||
|
||||
export type ContentConfig = typeof import("./../src/content.config.mjs");
|
||||
export type LiveContentConfig = never;
|
||||
}
|
||||
1
.astro/data-store.json
Normal file
@@ -0,0 +1 @@
|
||||
[["Map",1,2],"meta::meta",["Map",3,4,5,6],"astro-version","5.17.1","astro-config-digest","{\"root\":{},\"srcDir\":{},\"publicDir\":{},\"outDir\":{},\"cacheDir\":{},\"compressHTML\":true,\"base\":\"/\",\"trailingSlash\":\"ignore\",\"output\":\"static\",\"scopedStyleStrategy\":\"attribute\",\"build\":{\"format\":\"directory\",\"client\":{},\"server\":{},\"assets\":\"_astro\",\"serverEntry\":\"entry.mjs\",\"redirects\":true,\"inlineStylesheets\":\"auto\",\"concurrency\":1},\"server\":{\"open\":false,\"host\":false,\"port\":4321,\"streaming\":true,\"allowedHosts\":[]},\"redirects\":{},\"image\":{\"endpoint\":{\"route\":\"/_image\"},\"service\":{\"entrypoint\":\"astro/assets/services/sharp\",\"config\":{}},\"domains\":[],\"remotePatterns\":[],\"responsiveStyles\":false},\"devToolbar\":{\"enabled\":true},\"markdown\":{\"syntaxHighlight\":{\"type\":\"shiki\",\"excludeLangs\":[\"math\"]},\"shikiConfig\":{\"langs\":[],\"langAlias\":{},\"theme\":\"github-dark\",\"themes\":{},\"wrap\":false,\"transformers\":[]},\"remarkPlugins\":[],\"rehypePlugins\":[],\"remarkRehype\":{},\"gfm\":true,\"smartypants\":true},\"security\":{\"checkOrigin\":true,\"allowedDomains\":[]},\"env\":{\"schema\":{},\"validateSecrets\":false},\"experimental\":{\"clientPrerender\":false,\"contentIntellisense\":false,\"headingIdCompat\":false,\"preserveScriptOrder\":false,\"liveContentCollections\":false,\"csp\":false,\"staticImportMetaEnv\":false,\"chromeDevtoolsWorkspace\":false,\"failOnPrerenderConflict\":false,\"svgo\":false},\"legacy\":{\"collections\":false}}"]
|
||||
5
.astro/settings.json
Normal file
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"_variables": {
|
||||
"lastUpdateCheck": 1770610101158
|
||||
}
|
||||
}
|
||||
2
.astro/types.d.ts
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
/// <reference types="astro/client" />
|
||||
/// <reference path="content.d.ts" />
|
||||
51
.gitignore
vendored
Normal file
@@ -0,0 +1,51 @@
|
||||
# 依赖包
|
||||
node_modules/
|
||||
|
||||
# 环境变量
|
||||
.env
|
||||
.env.local
|
||||
.env.*.local
|
||||
|
||||
# 数据库文件
|
||||
*.sqlite
|
||||
*.sqlite3
|
||||
*.db
|
||||
|
||||
# 日志文件
|
||||
logs/
|
||||
*.log
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
|
||||
# 编辑器目录和文件
|
||||
.vscode/
|
||||
.idea/
|
||||
*.swp
|
||||
*.swo
|
||||
*~
|
||||
.DS_Store
|
||||
|
||||
# 构建输出
|
||||
dist/
|
||||
build/
|
||||
output/
|
||||
|
||||
# 临时文件
|
||||
tmp/
|
||||
temp/
|
||||
*.tmp
|
||||
*.temp
|
||||
|
||||
# 测试覆盖率
|
||||
coverage/
|
||||
.nyc_output/
|
||||
|
||||
# PM2配置
|
||||
pm2.json
|
||||
ecosystem.config.js
|
||||
|
||||
# 备份文件
|
||||
*.bak
|
||||
*.backup
|
||||
*.old
|
||||
188
README.md
Normal file
@@ -0,0 +1,188 @@
|
||||
# 贝凡官网
|
||||
|
||||
浙江贝凡网络科技公司官方网站,提供企业介绍、产品展示、解决方案等信息的现代化网站。
|
||||
|
||||
## 技术栈
|
||||
|
||||
- **框架**:[Astro 5.7.3](https://astro.build) - 现代化的静态站点生成器
|
||||
- **样式**:[Tailwind CSS](https://tailwindcss.com) - 实用优先的 CSS 框架
|
||||
- **包管理器**:[pnpm](https://pnpm.io) - 快速、节省磁盘空间的包管理器
|
||||
|
||||
## 项目结构
|
||||
|
||||
```
|
||||
beifan.cn/
|
||||
├── src/
|
||||
│ ├── layouts/
|
||||
│ │ └── Layout.astro # 主布局组件(包含导航栏、页脚等)
|
||||
│ ├── pages/
|
||||
│ │ ├── index.astro # 首页
|
||||
│ │ └── intro/
|
||||
│ │ ├── qazk/ # 企安智控详情页
|
||||
│ │ ├── hardware/ # 硬件物联详情页
|
||||
│ │ ├── customized-deployment/ # 本地化定制详情页
|
||||
│ │ └── miniapp-manual/ # 小程序手册页
|
||||
│ ├── components/
|
||||
│ │ └── sections/ # 首页各功能区块组件
|
||||
│ │ ├── Hero.astro
|
||||
│ │ ├── Timeline.astro
|
||||
│ │ ├── SaaS.astro
|
||||
│ │ ├── Customization.astro
|
||||
│ │ ├── Policy.astro
|
||||
│ │ ├── AccidentCases.astro
|
||||
│ │ ├── Hardware.astro
|
||||
│ │ ├── AIModel.astro
|
||||
│ │ ├── Honors.astro
|
||||
│ │ ├── Contact.astro
|
||||
│ │ ├── Partnership.astro
|
||||
│ │ └── Footer.astro
|
||||
│ ├── styles/
|
||||
│ │ └── global.css # 全局样式
|
||||
文件├── public/ # 静态资源
|
||||
│ ├── img/ # 图片资源
|
||||
│ ├── js/ # JavaScript 文件
|
||||
│ ├── docs/ # 文档资源
|
||||
│ └── intro/ # Intro 页面的静态资源
|
||||
│ ├── qazk/
|
||||
│ ├── hardware/
|
||||
│ ├── customized-deployment/
|
||||
│ └── miniapp-manual/
|
||||
├── astro.config.mjs # Astro 配置文件
|
||||
├── tailwind.config.mjs # Tailwind CSS 配置文件
|
||||
├── package.json # 项目依赖配置
|
||||
└── pnpm-lock.yaml # pnpm 锁文件
|
||||
```
|
||||
|
||||
## 快速开始
|
||||
|
||||
### 安装依赖
|
||||
|
||||
```bash
|
||||
pnpm install
|
||||
```
|
||||
|
||||
### 开发模式
|
||||
|
||||
启动本地开发服务器:
|
||||
|
||||
```bash
|
||||
pnpm dev
|
||||
```
|
||||
|
||||
访问 http://localhost:4321 查看网站。
|
||||
|
||||
### 构建生产版本
|
||||
|
||||
构建静态站点:
|
||||
|
||||
```bash
|
||||
pnpm build
|
||||
```
|
||||
|
||||
构建产物将输出到 `dist/` 目录。
|
||||
|
||||
### 预览构建结果
|
||||
|
||||
预览生产构建:
|
||||
|
||||
```bash
|
||||
pnpm preview
|
||||
```
|
||||
|
||||
## 功能特性
|
||||
|
||||
- 响应式设计,支持桌面端和移动端
|
||||
- 基于 Astro 的静态站点生成,加载速度快
|
||||
- Tailwind CSS 提供丰富的实用样式类
|
||||
- 模块化组件设计,便于维护和扩展
|
||||
- 支持 Type checking(通过 Astro Check)
|
||||
|
||||
## 站点内容
|
||||
|
||||
### 主页
|
||||
|
||||
- **Hero 区域**:全场景产业数字化转型服务介绍
|
||||
- **公司介绍**:浙江贝凡发展历程时间轴
|
||||
- **核心业务 1 - SaaS化系统**:企安智控智能安全管理解决方案
|
||||
- **核心业务 2 - 本地化定制**:多行业全场景定制服务
|
||||
- **最新政策导向**:安全生产相关政策法规
|
||||
- **典型事故案例**:重大事故案例分析
|
||||
- **核心业务 3 - 硬件物联**:12个物联网应用场景
|
||||
- **AI大模型**:15个AI应用场景
|
||||
- **公司荣誉资质**:企业资质展示
|
||||
- **联系我们**:联系方式展示
|
||||
- **生态合作**:合作伙伴信息
|
||||
- **页脚**:版权信息、ICP备案等
|
||||
|
||||
### Intro 子页面
|
||||
|
||||
- **企安智控**:智能安全管理平台详细介绍
|
||||
- **硬件物联**:27种智能硬件产品展示
|
||||
- **本地化定制**:全场景产业数字化定制方案
|
||||
- **小程序手册**:企安智控小程序使用指南
|
||||
|
||||
## 配置说明
|
||||
|
||||
### Astro 配置
|
||||
|
||||
项目使用了 Astro 的 Tailwind 集成,在 `astro.config.mjs` 中配置:
|
||||
|
||||
```javascript
|
||||
import tailwind from '@astrojs/tailwind';
|
||||
import { defineConfig } from 'astro/config';
|
||||
|
||||
export default defineConfig({
|
||||
integrations: [tailwind()],
|
||||
});
|
||||
```
|
||||
|
||||
### Tailwind 配置
|
||||
|
||||
在 `tailwind.config.mjs` 中扩展了主题颜色:
|
||||
|
||||
```javascript
|
||||
export default {
|
||||
content: ['./src/**/*.{astro,html,js,jsx,md,mdx,svelte,ts,tsx,vue}'],
|
||||
theme: {
|
||||
extend: {
|
||||
colors: {
|
||||
primary: '#165DFF',
|
||||
secondary: '#36D399',
|
||||
dark: '#1E293B',
|
||||
light: '#F8FAFC'
|
||||
},
|
||||
fontFamily: {
|
||||
inter: ['Inter', 'system-ui', 'sans-serif'],
|
||||
},
|
||||
},
|
||||
},
|
||||
plugins: [],
|
||||
}
|
||||
```
|
||||
|
||||
## 部署
|
||||
|
||||
### 静态部署
|
||||
|
||||
项目构建为静态站点,可部署到任何静态托管服务:
|
||||
|
||||
- **Vercel**
|
||||
- **Netlify**
|
||||
- **GitHub Pages**
|
||||
- **Cloudflare Pages**
|
||||
- **阿里云 OSS**
|
||||
- **腾讯云 COS**
|
||||
|
||||
部署时只需将 `dist/` 目录的内容上传到静态托管服务即可。
|
||||
|
||||
## 许可证
|
||||
|
||||
© 2026 浙江贝凡网络科技有限公司. All Rights Reserved.
|
||||
|
||||
- ICP 备案:浙ICP备2025170226号-4
|
||||
- 公安备案:浙公网安备33011002018371号
|
||||
|
||||
## 联系方式
|
||||
|
||||
- 电话:400-998-5710
|
||||
- 网址:https://beifan.cn
|
||||
6
astro.config.mjs
Normal file
@@ -0,0 +1,6 @@
|
||||
import tailwind from '@astrojs/tailwind';
|
||||
import { defineConfig } from 'astro/config';
|
||||
|
||||
export default defineConfig({
|
||||
integrations: [tailwind()],
|
||||
});
|
||||
28
package.json
Normal file
@@ -0,0 +1,28 @@
|
||||
{
|
||||
"name": "贝凡官网",
|
||||
"type": "module",
|
||||
"version": "1.0.0",
|
||||
"packageManager": "pnpm@10.29.2",
|
||||
"scripts": {
|
||||
"dev": "astro dev",
|
||||
"start": "astro dev",
|
||||
"build": "astro check && astro build",
|
||||
"preview": "astro preview",
|
||||
"astro": "astro"
|
||||
},
|
||||
"dependencies": {
|
||||
"astro": "^5.7.3"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@astrojs/check": "^0.9.6",
|
||||
"@astrojs/tailwind": "^6.0.2",
|
||||
"tailwindcss": "^3.4.19",
|
||||
"typescript": "^5.9.3"
|
||||
},
|
||||
"pnpm": {
|
||||
"onlyBuiltDependencies": [
|
||||
"esbuild",
|
||||
"sharp"
|
||||
]
|
||||
}
|
||||
}
|
||||
4316
pnpm-lock.yaml
generated
Normal file
BIN
public/docs/合作申请表.xlsx
Normal file
BIN
public/favicon.ico
Normal file
|
After Width: | Height: | Size: 9.4 KiB |
BIN
public/img/accident-case-1.webp
Normal file
|
After Width: | Height: | Size: 28 KiB |
BIN
public/img/accident-case-2.webp
Normal file
|
After Width: | Height: | Size: 29 KiB |
BIN
public/img/accident-case-3.webp
Normal file
|
After Width: | Height: | Size: 26 KiB |
BIN
public/img/accident-case-4.webp
Normal file
|
After Width: | Height: | Size: 27 KiB |
BIN
public/img/accident-case-5.webp
Normal file
|
After Width: | Height: | Size: 44 KiB |
BIN
public/img/accident-case-6.webp
Normal file
|
After Width: | Height: | Size: 36 KiB |
BIN
public/img/ai-landscape.webp
Normal file
|
After Width: | Height: | Size: 36 KiB |
BIN
public/img/ai-product-1.webp
Normal file
|
After Width: | Height: | Size: 77 KiB |
BIN
public/img/ai-product-10.webp
Normal file
|
After Width: | Height: | Size: 75 KiB |
BIN
public/img/ai-product-11.webp
Normal file
|
After Width: | Height: | Size: 106 KiB |
BIN
public/img/ai-product-12.webp
Normal file
|
After Width: | Height: | Size: 59 KiB |
BIN
public/img/ai-product-13.webp
Normal file
|
After Width: | Height: | Size: 75 KiB |
BIN
public/img/ai-product-14.webp
Normal file
|
After Width: | Height: | Size: 18 KiB |
BIN
public/img/ai-product-15.webp
Normal file
|
After Width: | Height: | Size: 29 KiB |
BIN
public/img/ai-product-16.webp
Normal file
|
After Width: | Height: | Size: 31 KiB |
BIN
public/img/ai-product-2.webp
Normal file
|
After Width: | Height: | Size: 69 KiB |
BIN
public/img/ai-product-3.webp
Normal file
|
After Width: | Height: | Size: 51 KiB |
BIN
public/img/ai-product-4.webp
Normal file
|
After Width: | Height: | Size: 79 KiB |
BIN
public/img/ai-product-5.webp
Normal file
|
After Width: | Height: | Size: 102 KiB |
BIN
public/img/ai-product-6.webp
Normal file
|
After Width: | Height: | Size: 77 KiB |
BIN
public/img/ai-product-7.webp
Normal file
|
After Width: | Height: | Size: 94 KiB |
BIN
public/img/ai-product-8.webp
Normal file
|
After Width: | Height: | Size: 46 KiB |
BIN
public/img/ai-product-9.webp
Normal file
|
After Width: | Height: | Size: 83 KiB |
BIN
public/img/banner.webp
Normal file
|
After Width: | Height: | Size: 103 KiB |
BIN
public/img/bcm-2.webp
Normal file
|
After Width: | Height: | Size: 42 KiB |
BIN
public/img/beian.png
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
BIN
public/img/certificate-1.webp
Normal file
|
After Width: | Height: | Size: 35 KiB |
BIN
public/img/certificate-2.webp
Normal file
|
After Width: | Height: | Size: 35 KiB |
BIN
public/img/certificate-3.webp
Normal file
|
After Width: | Height: | Size: 243 KiB |
BIN
public/img/company-building.jpg
Normal file
|
After Width: | Height: | Size: 85 KiB |
BIN
public/img/company-hangzhou.jpg
Normal file
|
After Width: | Height: | Size: 87 KiB |
BIN
public/img/company-showroom.jpg
Normal file
|
After Width: | Height: | Size: 56 KiB |
BIN
public/img/grid.webp
Normal file
|
After Width: | Height: | Size: 16 KiB |
BIN
public/img/hardware-1.webp
Normal file
|
After Width: | Height: | Size: 163 KiB |
BIN
public/img/hardware-10.webp
Normal file
|
After Width: | Height: | Size: 40 KiB |
BIN
public/img/hardware-2.webp
Normal file
|
After Width: | Height: | Size: 67 KiB |
BIN
public/img/hardware-3.webp
Normal file
|
After Width: | Height: | Size: 50 KiB |
BIN
public/img/hardware-4.webp
Normal file
|
After Width: | Height: | Size: 59 KiB |
BIN
public/img/hardware-5.webp
Normal file
|
After Width: | Height: | Size: 50 KiB |
BIN
public/img/hardware-6.webp
Normal file
|
After Width: | Height: | Size: 56 KiB |
BIN
public/img/hardware-7.webp
Normal file
|
After Width: | Height: | Size: 68 KiB |
BIN
public/img/hardware-8.webp
Normal file
|
After Width: | Height: | Size: 46 KiB |
BIN
public/img/hardware-9.webp
Normal file
|
After Width: | Height: | Size: 113 KiB |
BIN
public/img/hero-banner-1.webp
Normal file
|
After Width: | Height: | Size: 14 KiB |
BIN
public/img/hero-banner-2.webp
Normal file
|
After Width: | Height: | Size: 23 KiB |
BIN
public/img/hero-banner-3.webp
Normal file
|
After Width: | Height: | Size: 61 KiB |
BIN
public/img/hr.webp
Normal file
|
After Width: | Height: | Size: 45 KiB |
BIN
public/img/logo.png
Normal file
|
After Width: | Height: | Size: 46 KiB |
BIN
public/img/official-douyin.jpg
Normal file
|
After Width: | Height: | Size: 103 KiB |
BIN
public/img/official-wechat.jpg
Normal file
|
After Width: | Height: | Size: 150 KiB |
BIN
public/img/official-xiaohongshu.jpg
Normal file
|
After Width: | Height: | Size: 54 KiB |
BIN
public/img/partner-aliyun.webp
Normal file
|
After Width: | Height: | Size: 8.4 KiB |
BIN
public/img/partner-amap.webp
Normal file
|
After Width: | Height: | Size: 6.1 KiB |
BIN
public/img/partner-cmcc.webp
Normal file
|
After Width: | Height: | Size: 10 KiB |
BIN
public/img/partner-ct.webp
Normal file
|
After Width: | Height: | Size: 35 KiB |
BIN
public/img/partner-cu.webp
Normal file
|
After Width: | Height: | Size: 41 KiB |
BIN
public/img/partner-doubao.webp
Normal file
|
After Width: | Height: | Size: 32 KiB |
BIN
public/img/partner-hikvision.webp
Normal file
|
After Width: | Height: | Size: 2.4 KiB |
BIN
public/img/partner-inspur.webp
Normal file
|
After Width: | Height: | Size: 6.5 KiB |
BIN
public/img/partner-tencent.webp
Normal file
|
After Width: | Height: | Size: 31 KiB |
BIN
public/img/partner-zjtd.webp
Normal file
|
After Width: | Height: | Size: 66 KiB |
BIN
public/img/policy-1.webp
Normal file
|
After Width: | Height: | Size: 23 KiB |
BIN
public/img/policy-2.webp
Normal file
|
After Width: | Height: | Size: 21 KiB |
BIN
public/img/policy-3.webp
Normal file
|
After Width: | Height: | Size: 23 KiB |
BIN
public/img/policy-4.webp
Normal file
|
After Width: | Height: | Size: 23 KiB |
BIN
public/img/policy-5.webp
Normal file
|
After Width: | Height: | Size: 23 KiB |
BIN
public/img/policy-6.webp
Normal file
|
After Width: | Height: | Size: 21 KiB |
BIN
public/img/policy-7.webp
Normal file
|
After Width: | Height: | Size: 28 KiB |
BIN
public/img/product-customization-1.webp
Normal file
|
After Width: | Height: | Size: 66 KiB |
BIN
public/img/product-customization-2.webp
Normal file
|
After Width: | Height: | Size: 20 KiB |
BIN
public/img/product-energy-1.webp
Normal file
|
After Width: | Height: | Size: 18 KiB |
BIN
public/img/product-saas-1.webp
Normal file
|
After Width: | Height: | Size: 46 KiB |
BIN
public/img/product-safety-1.webp
Normal file
|
After Width: | Height: | Size: 49 KiB |
BIN
public/img/product-safety-2.webp
Normal file
|
After Width: | Height: | Size: 48 KiB |
BIN
public/img/product-safety-3.webp
Normal file
|
After Width: | Height: | Size: 50 KiB |
BIN
public/img/product-solution-1.webp
Normal file
|
After Width: | Height: | Size: 36 KiB |
BIN
public/img/product-system-1.webp
Normal file
|
After Width: | Height: | Size: 112 KiB |
BIN
public/img/product-system-2.webp
Normal file
|
After Width: | Height: | Size: 55 KiB |
BIN
public/img/qazk-logo.png
Normal file
|
After Width: | Height: | Size: 7.8 KiB |
BIN
public/img/timeline-2019-icon.webp
Normal file
|
After Width: | Height: | Size: 7.8 KiB |
BIN
public/img/timeline-2022-icon.webp
Normal file
|
After Width: | Height: | Size: 4.4 KiB |
BIN
public/img/timeline-2024-icon.webp
Normal file
|
After Width: | Height: | Size: 6.0 KiB |
BIN
public/img/timeline-2025-icon.webp
Normal file
|
After Width: | Height: | Size: 7.8 KiB |
BIN
public/img/timeline-2026-icon.webp
Normal file
|
After Width: | Height: | Size: 9.0 KiB |
BIN
public/img/timeline-ecology-icon.webp
Normal file
|
After Width: | Height: | Size: 14 KiB |
BIN
public/img/timeline-innovation-icon.webp
Normal file
|
After Width: | Height: | Size: 1.3 KiB |
BIN
public/img/timeline-vision-icon.webp
Normal file
|
After Width: | Height: | Size: 10 KiB |