Browse Source

v2.0

web_v2.0
root 1 month ago
parent
commit
3efd27da99
  1. 3
      modify.md
  2. 5
      site/.next/app-build-manifest.json
  3. 2
      site/.next/cache/.tsbuildinfo
  4. BIN
      site/.next/cache/webpack/client-development/1.pack.gz
  5. BIN
      site/.next/cache/webpack/client-development/index.pack.gz
  6. BIN
      site/.next/cache/webpack/client-development/index.pack.gz.old
  7. BIN
      site/.next/cache/webpack/client-production/0.pack
  8. BIN
      site/.next/cache/webpack/client-production/1.pack
  9. BIN
      site/.next/cache/webpack/client-production/2.pack
  10. BIN
      site/.next/cache/webpack/client-production/3.pack
  11. BIN
      site/.next/cache/webpack/client-production/4.pack
  12. BIN
      site/.next/cache/webpack/client-production/index.pack
  13. BIN
      site/.next/cache/webpack/client-production/index.pack.old
  14. BIN
      site/.next/cache/webpack/server-development/0.pack.gz
  15. BIN
      site/.next/cache/webpack/server-development/1.pack.gz
  16. BIN
      site/.next/cache/webpack/server-development/2.pack.gz
  17. BIN
      site/.next/cache/webpack/server-development/index.pack.gz
  18. BIN
      site/.next/cache/webpack/server-development/index.pack.gz.old
  19. BIN
      site/.next/cache/webpack/server-production/0.pack
  20. BIN
      site/.next/cache/webpack/server-production/1.pack
  21. BIN
      site/.next/cache/webpack/server-production/index.pack
  22. BIN
      site/.next/cache/webpack/server-production/index.pack.old
  23. 1
      site/.next/server/app-paths-manifest.json
  24. 302
      site/.next/server/app/[locale]/about/page.js
  25. 1
      site/.next/server/app/[locale]/about/page_client-reference-manifest.js
  26. 4
      site/.next/server/app/[locale]/page.js
  27. 2
      site/.next/server/server-reference-manifest.js
  28. 2
      site/.next/server/server-reference-manifest.json
  29. 2
      site/.next/server/webpack-runtime.js
  30. 28
      site/.next/static/chunks/app/[locale]/about/page.js
  31. 2
      site/.next/static/chunks/app/[locale]/layout.js
  32. 2
      site/.next/static/chunks/webpack.js
  33. 0
      site/.next/static/webpack/3f27768674bcaf8d.webpack.hot-update.json
  34. 1
      site/.next/static/webpack/684d67b4d1c2b42f.webpack.hot-update.json
  35. 2
      site/.next/static/webpack/app/[locale]/layout.3f27768674bcaf8d.hot-update.js
  36. 2
      site/.next/static/webpack/webpack.3f27768674bcaf8d.hot-update.js
  37. 18
      site/.next/static/webpack/webpack.84e8a874d7586a92.hot-update.js
  38. 1
      site/.next/trace
  39. 79
      site/.next/types/app/[locale]/about/page.ts
  40. 8
      site/app/[locale]/about/page.tsx
  41. 2
      site/app/[locale]/page.tsx
  42. 7
      site/data/about.md
  43. 26
      site/lib/data.ts
  44. 188
      产品.md
  45. 6
      关于我们.md

3
modify.md

@ -258,6 +258,9 @@
- 修复:`site/public/products/a2.svg` 的 `xmlns` 写法错误,改为 `http://www.w3.org/2000/svg`,解决“净化器”图片不显示。
## 2025-11-11
- 修复:`getAboutMarkdown` 支持按 `data/<locale>/about.md``data/about.md` → 旧路径依次回退,避免部署后读取失败;关于我们页面与首页传入 `locale`,新增 `site/data/about.md` 包含 Markdown 源。
- 内容迁移:将原位于仓库外层的 `关于我们.md` 复制到 `site/data/about.md`,确保构建打包时内容随项目发布。
- 修复:`site/components/SimpleCarousel.tsx` 新增 `hasIdentifier` 类型守卫,移除多余 `@ts-expect-error`,确保构建通过。
## 2025-10-30

5
site/.next/app-build-manifest.json

@ -20,11 +20,6 @@
"static/chunks/webpack.js",
"static/chunks/main-app.js",
"static/chunks/app/not-found.js"
],
"/[locale]/about/page": [
"static/chunks/webpack.js",
"static/chunks/main-app.js",
"static/chunks/app/[locale]/about/page.js"
]
}
}

2
site/.next/cache/.tsbuildinfo

File diff suppressed because one or more lines are too long

BIN
site/.next/cache/webpack/client-development/1.pack.gz

Binary file not shown.

BIN
site/.next/cache/webpack/client-development/index.pack.gz

Binary file not shown.

BIN
site/.next/cache/webpack/client-development/index.pack.gz.old

Binary file not shown.

BIN
site/.next/cache/webpack/client-production/0.pack

Binary file not shown.

BIN
site/.next/cache/webpack/client-production/1.pack

Binary file not shown.

BIN
site/.next/cache/webpack/client-production/2.pack

Binary file not shown.

BIN
site/.next/cache/webpack/client-production/3.pack

Binary file not shown.

BIN
site/.next/cache/webpack/client-production/4.pack

Binary file not shown.

BIN
site/.next/cache/webpack/client-production/index.pack

Binary file not shown.

BIN
site/.next/cache/webpack/client-production/index.pack.old

Binary file not shown.

BIN
site/.next/cache/webpack/server-development/0.pack.gz

Binary file not shown.

BIN
site/.next/cache/webpack/server-development/1.pack.gz

Binary file not shown.

BIN
site/.next/cache/webpack/server-development/2.pack.gz

Binary file not shown.

BIN
site/.next/cache/webpack/server-development/index.pack.gz

Binary file not shown.

BIN
site/.next/cache/webpack/server-development/index.pack.gz.old

Binary file not shown.

BIN
site/.next/cache/webpack/server-production/0.pack

Binary file not shown.

BIN
site/.next/cache/webpack/server-production/1.pack

Binary file not shown.

BIN
site/.next/cache/webpack/server-production/index.pack

Binary file not shown.

BIN
site/.next/cache/webpack/server-production/index.pack.old

Binary file not shown.

1
site/.next/server/app-paths-manifest.json

@ -1,4 +1,3 @@
{
"/[locale]/about/page": "app/[locale]/about/page.js",
"/[locale]/page": "app/[locale]/page.js"
}

302
site/.next/server/app/[locale]/about/page.js

File diff suppressed because one or more lines are too long

1
site/.next/server/app/[locale]/about/page_client-reference-manifest.js

File diff suppressed because one or more lines are too long

4
site/.next/server/app/[locale]/page.js

File diff suppressed because one or more lines are too long

2
site/.next/server/server-reference-manifest.js

@ -1 +1 @@
self.__RSC_SERVER_MANIFEST="{\n \"node\": {},\n \"edge\": {},\n \"encryptionKey\": \"R0fUgAs26fEH7iNY+jDmPTiSpWNMh57UDodWTP34t8I=\"\n}"
self.__RSC_SERVER_MANIFEST="{\n \"node\": {},\n \"edge\": {},\n \"encryptionKey\": \"KWAnCSrhu/FTC114nk3cStAI7ap0mnEiM8BgsjNWzPw=\"\n}"

2
site/.next/server/server-reference-manifest.json

@ -1,5 +1,5 @@
{
"node": {},
"edge": {},
"encryptionKey": "R0fUgAs26fEH7iNY+jDmPTiSpWNMh57UDodWTP34t8I="
"encryptionKey": "KWAnCSrhu/FTC114nk3cStAI7ap0mnEiM8BgsjNWzPw="
}

2
site/.next/server/webpack-runtime.js

@ -125,7 +125,7 @@
/******/
/******/ /* webpack/runtime/getFullHash */
/******/ (() => {
/******/ __webpack_require__.h = () => ("6fe8cbcf6a50dd90")
/******/ __webpack_require__.h = () => ("0e9a1038c88ace96")
/******/ })();
/******/
/******/ /* webpack/runtime/hasOwnProperty shorthand */

28
site/.next/static/chunks/app/[locale]/about/page.js

@ -1,28 +0,0 @@
/*
* ATTENTION: An "eval-source-map" devtool has been used.
* This devtool is neither made for production nor for readable output files.
* It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools.
* If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
* or disable the default devtool with "devtool: false".
* If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
*/
(self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([["app/[locale]/about/page"],{
/***/ "(app-pages-browser)/./node_modules/next/dist/build/webpack/loaders/next-flight-client-entry-loader.js?server=false!":
/*!*******************************************************************************************************!*\
!*** ./node_modules/next/dist/build/webpack/loaders/next-flight-client-entry-loader.js?server=false! ***!
\*******************************************************************************************************/
/***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) {
/***/ })
},
/******/ function(__webpack_require__) { // webpackRuntimeModules
/******/ var __webpack_exec__ = function(moduleId) { return __webpack_require__(__webpack_require__.s = moduleId); }
/******/ __webpack_require__.O(0, ["main-app"], function() { return __webpack_exec__("(app-pages-browser)/./node_modules/next/dist/build/webpack/loaders/next-flight-client-entry-loader.js?server=false!"); });
/******/ var __webpack_exports__ = __webpack_require__.O();
/******/ _N_E = __webpack_exports__;
/******/ }
]);

2
site/.next/static/chunks/app/[locale]/layout.js

@ -25,7 +25,7 @@ eval(__webpack_require__.ts("Promise.resolve(/*! import() eager */).then(__webpa
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony default export */ __webpack_exports__[\"default\"] = (\"0da70e4067bd\");\nif (true) { module.hot.accept() }\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2FwcC9nbG9iYWxzLmNzcyIsIm1hcHBpbmdzIjoiO0FBQUEsK0RBQWUsY0FBYztBQUM3QixJQUFJLElBQVUsSUFBSSxpQkFBaUIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vYXBwL2dsb2JhbHMuY3NzPzc1OWMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgXCIwZGE3MGU0MDY3YmRcIlxuaWYgKG1vZHVsZS5ob3QpIHsgbW9kdWxlLmhvdC5hY2NlcHQoKSB9XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./app/globals.css\n"));
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony default export */ __webpack_exports__[\"default\"] = (\"f79bdfe3fe5c\");\nif (true) { module.hot.accept() }\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2FwcC9nbG9iYWxzLmNzcyIsIm1hcHBpbmdzIjoiO0FBQUEsK0RBQWUsY0FBYztBQUM3QixJQUFJLElBQVUsSUFBSSxpQkFBaUIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vYXBwL2dsb2JhbHMuY3NzPzc1OWMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgXCJmNzliZGZlM2ZlNWNcIlxuaWYgKG1vZHVsZS5ob3QpIHsgbW9kdWxlLmhvdC5hY2NlcHQoKSB9XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./app/globals.css\n"));
/***/ }),

2
site/.next/static/chunks/webpack.js

@ -192,7 +192,7 @@
/******/
/******/ /* webpack/runtime/getFullHash */
/******/ !function() {
/******/ __webpack_require__.h = function() { return "22863e9e50477b80"; }
/******/ __webpack_require__.h = function() { return "27285168a07e80f4"; }
/******/ }();
/******/
/******/ /* webpack/runtime/global */

0
site/.next/static/webpack/84e8a874d7586a92.webpack.hot-update.json → site/.next/static/webpack/3f27768674bcaf8d.webpack.hot-update.json

1
site/.next/static/webpack/684d67b4d1c2b42f.webpack.hot-update.json

@ -1 +0,0 @@
{"c":["webpack"],"r":[],"m":[]}

2
site/.next/static/webpack/app/[locale]/layout.84e8a874d7586a92.hot-update.js → site/.next/static/webpack/app/[locale]/layout.3f27768674bcaf8d.hot-update.js

@ -15,7 +15,7 @@ self["webpackHotUpdate_N_E"]("app/[locale]/layout",{
\*************************/
/***/ (function(module, __webpack_exports__, __webpack_require__) {
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony default export */ __webpack_exports__[\"default\"] = (\"0da70e4067bd\");\nif (true) { module.hot.accept() }\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2FwcC9nbG9iYWxzLmNzcyIsIm1hcHBpbmdzIjoiO0FBQUEsK0RBQWUsY0FBYztBQUM3QixJQUFJLElBQVUsSUFBSSxpQkFBaUIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vYXBwL2dsb2JhbHMuY3NzPzc1OWMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgXCIwZGE3MGU0MDY3YmRcIlxuaWYgKG1vZHVsZS5ob3QpIHsgbW9kdWxlLmhvdC5hY2NlcHQoKSB9XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./app/globals.css\n"));
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony default export */ __webpack_exports__[\"default\"] = (\"f79bdfe3fe5c\");\nif (true) { module.hot.accept() }\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2FwcC9nbG9iYWxzLmNzcyIsIm1hcHBpbmdzIjoiO0FBQUEsK0RBQWUsY0FBYztBQUM3QixJQUFJLElBQVUsSUFBSSxpQkFBaUIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vYXBwL2dsb2JhbHMuY3NzPzc1OWMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgXCJmNzliZGZlM2ZlNWNcIlxuaWYgKG1vZHVsZS5ob3QpIHsgbW9kdWxlLmhvdC5hY2NlcHQoKSB9XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./app/globals.css\n"));
/***/ })

2
site/.next/static/webpack/webpack.684d67b4d1c2b42f.hot-update.js → site/.next/static/webpack/webpack.3f27768674bcaf8d.hot-update.js

@ -11,7 +11,7 @@ self["webpackHotUpdate_N_E"]("webpack",{},
/******/ function(__webpack_require__) { // webpackRuntimeModules
/******/ /* webpack/runtime/getFullHash */
/******/ !function() {
/******/ __webpack_require__.h = function() { return "22863e9e50477b80"; }
/******/ __webpack_require__.h = function() { return "27285168a07e80f4"; }
/******/ }();
/******/
/******/ }

18
site/.next/static/webpack/webpack.84e8a874d7586a92.hot-update.js

@ -1,18 +0,0 @@
"use strict";
/*
* ATTENTION: An "eval-source-map" devtool has been used.
* This devtool is neither made for production nor for readable output files.
* It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools.
* If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
* or disable the default devtool with "devtool: false".
* If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
*/
self["webpackHotUpdate_N_E"]("webpack",{},
/******/ function(__webpack_require__) { // webpackRuntimeModules
/******/ /* webpack/runtime/getFullHash */
/******/ !function() {
/******/ __webpack_require__.h = function() { return "684d67b4d1c2b42f"; }
/******/ }();
/******/
/******/ }
);

1
site/.next/trace

File diff suppressed because one or more lines are too long

79
site/.next/types/app/[locale]/about/page.ts

@ -1,79 +0,0 @@
// File: D:\Desktop\qa\web\X1_Site\site\app\[locale]\about\page.tsx
import * as entry from '../../../../../app/[locale]/about/page.js'
import type { ResolvingMetadata, ResolvingViewport } from 'next/dist/lib/metadata/types/metadata-interface.js'
type TEntry = typeof import('../../../../../app/[locale]/about/page.js')
// Check that the entry is a valid entry
checkFields<Diff<{
default: Function
config?: {}
generateStaticParams?: Function
revalidate?: RevalidateRange<TEntry> | false
dynamic?: 'auto' | 'force-dynamic' | 'error' | 'force-static'
dynamicParams?: boolean
fetchCache?: 'auto' | 'force-no-store' | 'only-no-store' | 'default-no-store' | 'default-cache' | 'only-cache' | 'force-cache'
preferredRegion?: 'auto' | 'global' | 'home' | string | string[]
runtime?: 'nodejs' | 'experimental-edge' | 'edge'
maxDuration?: number
metadata?: any
generateMetadata?: Function
viewport?: any
generateViewport?: Function
}, TEntry, ''>>()
// Check the prop type of the entry function
checkFields<Diff<PageProps, FirstArg<TEntry['default']>, 'default'>>()
// Check the arguments and return type of the generateMetadata function
if ('generateMetadata' in entry) {
checkFields<Diff<PageProps, FirstArg<MaybeField<TEntry, 'generateMetadata'>>, 'generateMetadata'>>()
checkFields<Diff<ResolvingMetadata, SecondArg<MaybeField<TEntry, 'generateMetadata'>>, 'generateMetadata'>>()
}
// Check the arguments and return type of the generateViewport function
if ('generateViewport' in entry) {
checkFields<Diff<PageProps, FirstArg<MaybeField<TEntry, 'generateViewport'>>, 'generateViewport'>>()
checkFields<Diff<ResolvingViewport, SecondArg<MaybeField<TEntry, 'generateViewport'>>, 'generateViewport'>>()
}
// Check the arguments and return type of the generateStaticParams function
if ('generateStaticParams' in entry) {
checkFields<Diff<{ params: PageParams }, FirstArg<MaybeField<TEntry, 'generateStaticParams'>>, 'generateStaticParams'>>()
checkFields<Diff<{ __tag__: 'generateStaticParams', __return_type__: any[] | Promise<any[]> }, { __tag__: 'generateStaticParams', __return_type__: ReturnType<MaybeField<TEntry, 'generateStaticParams'>> }>>()
}
type PageParams = any
export interface PageProps {
params?: any
searchParams?: any
}
export interface LayoutProps {
children?: React.ReactNode
params?: any
}
// =============
// Utility types
type RevalidateRange<T> = T extends { revalidate: any } ? NonNegative<T['revalidate']> : never
// If T is unknown or any, it will be an empty {} type. Otherwise, it will be the same as Omit<T, keyof Base>.
type OmitWithTag<T, K extends keyof any, _M> = Omit<T, K>
type Diff<Base, T extends Base, Message extends string = ''> = 0 extends (1 & T) ? {} : OmitWithTag<T, keyof Base, Message>
type FirstArg<T extends Function> = T extends (...args: [infer T, any]) => any ? unknown extends T ? any : T : never
type SecondArg<T extends Function> = T extends (...args: [any, infer T]) => any ? unknown extends T ? any : T : never
type MaybeField<T, K extends string> = T extends { [k in K]: infer G } ? G extends Function ? G : never : never
function checkFields<_ extends { [k in keyof any]: never }>() {}
// https://github.com/sindresorhus/type-fest
type Numeric = number | bigint
type Zero = 0 | 0n
type Negative<T extends Numeric> = T extends Zero ? never : `${T}` extends `-${string}` ? T : never
type NonNegative<T extends Numeric> = T extends Zero ? T : Negative<T> extends never ? T : '__invalid_negative_number__'

8
site/app/[locale]/about/page.tsx

@ -4,8 +4,12 @@ import { getAboutMarkdown } from "../../../lib/data";
export const revalidate = 300;
export default function AboutPage() {
const aboutMarkdown = getAboutMarkdown();
export default function AboutPage({
params,
}: {
params: { locale: string };
}) {
const aboutMarkdown = getAboutMarkdown(params.locale);
return (
<main className="flex flex-col gap-0 bg-[#0b1629] text-white">
<AboutMarkdownSection

2
site/app/[locale]/page.tsx

@ -13,7 +13,7 @@ export default function HomePage({ params }: { params: { locale: string } }) {
const floors = getFloors(locale);
const primaryFloor = floors[0];
const solutionsData = getSolutions(locale);
const aboutMarkdown = getAboutMarkdown();
const aboutMarkdown = getAboutMarkdown(locale);
return (
<main className="flex flex-col gap-0">

7
site/data/about.md

@ -0,0 +1,7 @@
AI驱动的城市结构安全科技公司
衡感智能是一家以AI、数字孪生与智能硬件为核心能力的城市结构安全科技公司,构建覆盖“设备—数据—AI—决策”的一体化安全体系,打造城市“结构安全数字底座”,助力城市结构实现全生命周期的安全管理。
我们专注于关键设施的实时监测、风险预警与智能决策,通过多源感知数据与AI模型的融合,帮助管理者提前识别隐患、精准制定处置方案,让城市运行更加安全、高效、可持续。
核心定位:AI赋能结构安全,让城市具备“自我防御力”。

26
site/lib/data.ts

@ -63,14 +63,26 @@ export function getAbout(locale?: string): AboutData {
return readJson<AboutData>(dataPathFor(locale, "about.json"));
}
export function getAboutMarkdown(): string {
try {
const filePath = path.join(process.cwd(), "..", "..", "关于我们.md");
return fs.readFileSync(filePath, "utf-8");
} catch (error) {
console.warn("Failed to load 关于我们.md", error);
return "";
export function getAboutMarkdown(locale?: string): string {
const candidates = [
locale ? path.join("data", locale, "about.md") : undefined,
path.join("data", "about.md"),
path.join("..", "..", "关于我们.md"),
].filter(Boolean) as string[];
for (const relativePath of candidates) {
const filePath = path.join(process.cwd(), relativePath);
if (fs.existsSync(filePath)) {
try {
return fs.readFileSync(filePath, "utf-8");
} catch (error) {
console.warn(`Failed to load ${relativePath}`, error);
}
}
}
console.warn("About markdown not found in any candidate path.");
return "";
}
export function getTech(locale?: string): TechData {

188
产品.md

@ -0,0 +1,188 @@
<div style="width:100%;background:#f5f7fb;">
<div style="max-width:960px;margin:0 auto;padding:48px 24px;text-align:center;">
<p style="color:#118af4;font-size:14px;letter-spacing:4px;text-transform:uppercase;margin-bottom:12px;">Product Portfolio</p>
<h1 style="font-size:32px;color:#0f1f39;margin:0 0 16px;">核心监测终端与智能设备</h1>
<p style="color:#4b5565;line-height:1.7;margin:0 auto;max-width:720px;">
全系列设备覆盖视频、定位、雷达、水文、气象等关键场景,采用<span style="color:#118af4;font-weight:600;">长续航、低功耗、云端同步</span>设计,满足复杂户外与无人值守需求。
</p>
</div>
</div>
<div style="max-width:1100px;margin:-36px auto 0;padding:0 24px 64px;display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:28px;">
<article style="background:#ffffff;border-radius:20px;border:1px solid rgba(17,138,244,0.12);box-shadow:0 18px 42px rgba(17,138,244,0.08);padding:32px;display:flex;gap:28px;align-items:flex-start;">
<div style="flex:1;">
<div style="display:inline-flex;align-items:center;gap:8px;padding:4px 14px;border-radius:999px;background:#e4f2ff;color:#118af4;font-size:12px;font-weight:600;letter-spacing:1px;text-transform:uppercase;">AI Camera</div>
<h2 style="font-size:22px;color:#0f1f39;margin:20px 0 12px;">AI 视频联动监控终端</h2>
<p style="color:#4b5565;line-height:1.7;margin-bottom:16px;">
三年以上续航,搭载太阳能充电板与阴天模式,支持 4G 无线通信与 360° 云台巡航。内置 1080P 全高清成像与红外/全彩/智能三模切换,险情触发后即刻录像上云。
</p>
<ul style="list-style:none;padding:0;margin:0;color:#1f2937;font-size:14px;line-height:1.8;">
<li>· IP66 防护,全天候部署。</li>
<li>· AI 目标识别与事件联动。</li>
<li>· 云台远程控制与巡检预设位。</li>
</ul>
<div style="display:flex;flex-wrap:wrap;gap:12px;margin-top:20px;">
<span style="background:#f0f9ff;color:#118af4;padding:8px 16px;border-radius:999px;font-size:12px;font-weight:600;">3+ 年续航</span>
<span style="background:#f9fafb;color:#4b5565;padding:8px 16px;border-radius:999px;font-size:12px;">全彩夜视</span>
</div>
</div>
<figure style="width:220px;flex-shrink:0;margin:0;">
<img src="X1_Site/site/public/img/图片1.png" alt="AI视频联动监控" style="width:100%;border-radius:16px;border:1px solid rgba(17,138,244,0.18);box-shadow:0 10px 28px rgba(15,31,57,0.12);">
</figure>
</article>
<article style="background:#ffffff;border-radius:20px;border:1px solid rgba(17,138,244,0.12);box-shadow:0 18px 42px rgba(17,138,244,0.08);padding:32px;display:flex;gap:28px;align-items:flex-start;">
<div style="flex:1;">
<div style="display:inline-flex;align-items:center;gap:8px;padding:4px 14px;border-radius:999px;background:#e4f2ff;color:#118af4;font-size:12px;font-weight:600;letter-spacing:1px;text-transform:uppercase;">Weather Station</div>
<h2 style="font-size:22px;color:#0f1f39;margin:20px 0 12px;">自动气象监测仪</h2>
<p style="color:#4b5565;line-height:1.7;margin-bottom:16px;">
高精度监测风向(1°)、风速(±0.1m/s)、温湿度、气压、雨量、土壤温湿等常规气象要素。低静态功耗 <50µA支持多种无线联网并可扩展 RJ45 接入
</p>
<ul style="list-style:none;padding:0;margin:0;color:#1f2937;font-size:14px;line-height:1.8;">
<li>· 全要素组合模块,部署灵活。</li>
<li>· 自适应电源管理,适配离网场景。</li>
<li>· 数据秒级上报,支持边缘缓存。</li>
</ul>
<div style="display:flex;flex-wrap:wrap;gap:12px;margin-top:20px;">
<span style="background:#f0f9ff;color:#118af4;padding:8px 16px;border-radius:999px;font-size:12px;font-weight:600;">±0.1℃ 精度</span>
<span style="background:#f9fafb;color:#4b5565;padding:8px 16px;border-radius:999px;font-size:12px;">多网互联</span>
</div>
</div>
<figure style="width:220px;flex-shrink:0;margin:0;">
<img src="X1_Site/site/public/img/图片2.png" alt="自动气象监测仪" style="width:100%;border-radius:16px;border:1px solid rgba(17,138,244,0.18);box-shadow:0 10px 28px rgba(15,31,57,0.12);">
</figure>
</article>
<article style="background:#ffffff;border-radius:20px;border:1px solid rgba(17,138,244,0.12);box-shadow:0 18px 42px rgba(17,138,244,0.08);padding:32px;display:flex;gap:28px;align-items:flex-start;">
<div style="flex:1;">
<div style="display:inline-flex;align-items:center;gap:8px;padding:4px 14px;border-radius:999px;background:#e4f2ff;color:#118af4;font-size:12px;font-weight:600;letter-spacing:1px;text-transform:uppercase;">GNSS</div>
<h2 style="font-size:22px;color:#0f1f39;margin:20px 0 12px;">北斗 GNSS 监测站</h2>
<p style="color:#4b5565;line-height:1.7;margin-bottom:16px;">
部署于地质与结构形变监测点,结合 GNSS 接收机、天线及环境传感器组成全场景测量站。自检、数据采集与本地缓存一体化设计,消息队列传输支持断点续传。
</p>
<ul style="list-style:none;padding:0;margin:0;color:#1f2937;font-size:14px;line-height:1.8;">
<li>· 毫米级形变监测能力。</li>
<li>· 多星座融合定位,抗遮挡。</li>
<li>· 远程 OTA 升级与设备管理。</li>
</ul>
<div style="display:flex;flex-wrap:wrap;gap:12px;margin-top:20px;">
<span style="background:#f0f9ff;color:#118af4;padding:8px 16px;border-radius:999px;font-size:12px;font-weight:600;">断点续传</span>
<span style="background:#f9fafb;color:#4b5565;padding:8px 16px;border-radius:999px;font-size:12px;">环境联测</span>
</div>
</div>
<figure style="width:220px;flex-shrink:0;margin:0;">
<img src="X1_Site/site/public/img/图片3.png" alt="北斗GNSS监测站" style="width:100%;border-radius:16px;border:1px solid rgba(17,138,244,0.18);box-shadow:0 10px 28px rgba(15,31,57,0.12);">
</figure>
</article>
<article style="background:#ffffff;border-radius:20px;border:1px solid rgba(17,138,244,0.12);box-shadow:0 18px 42px rgba(17,138,244,0.08);padding:32px;display:flex;gap:28px;align-items:flex-start;">
<div style="flex:1;">
<div style="display:inline-flex;align-items:center;gap:8px;padding:4px 14px;border-radius:999px;background:#e4f2ff;color:#118af4;font-size:12px;font-weight:600;letter-spacing:1px;text-transform:uppercase;">Machine Vision</div>
<h2 style="font-size:22px;color:#0f1f39;margin:20px 0 12px;">智能机器视觉位移仪</h2>
<p style="color:#4b5565;line-height:1.7;margin-bottom:16px;">
面向大跨度结构位移监测,支持 30 个靶标,最大测距 400 m(可定制)。AI 算法自动标定转角与距离,无需人工测距调平,Ethernet 通讯,整机防护等级 IP65。
</p>
<ul style="list-style:none;padding:0;margin:0;color:#1f2937;font-size:14px;line-height:1.8;">
<li>· ±0.2℃ 恒温控制,消除温漂。</li>
<li>· 支持竖向/横向位移同步输出。</li>
<li>· 数据可接入第三方平台。</li>
</ul>
<div style="display:flex;flex-wrap:wrap;gap:12px;margin-top:20px;">
<span style="background:#f0f9ff;color:#118af4;padding:8px 16px;border-radius:999px;font-size:12px;font-weight:600;">AI 标定</span>
<span style="background:#f9fafb;color:#4b5565;padding:8px 16px;border-radius:999px;font-size:12px;">IP65 防护</span>
</div>
</div>
<figure style="width:220px;flex-shrink:0;margin:0;">
<img src="X1_Site/site/public/img/图片4.png" alt="智能机器视觉位移仪" style="width:100%;border-radius:16px;border:1px solid rgba(17,138,244,0.18);box-shadow:0 10px 28px rgba(15,31,57,0.12);">
</figure>
</article>
<article style="background:#ffffff;border-radius:20px;border:1px solid rgba(17,138,244,0.12);box-shadow:0 18px 42px rgba(17,138,244,0.08);padding:32px;display:flex;gap:28px;align-items:flex-start;">
<div style="flex:1;">
<div style="display:inline-flex;align-items:center;gap:8px;padding:4px 14px;border-radius:999px;background:#e4f2ff;color:#118af4;font-size:12px;font-weight:600;letter-spacing:1px;text-transform:uppercase;">Audio Alert</div>
<h2 style="font-size:22px;color:#0f1f39;margin:20px 0 12px;">4G 型语音报警装置</h2>
<p style="color:#4b5565;line-height:1.7;margin-bottom:16px;">
支持 DC 9–25V 供电(建议 12V),未工作功耗 0.5W,最大声压 ≥110dB,频率覆盖 20Hz–20kHz。工作温度 -20℃~+80℃,湿度 0–95%RH,适用于极端环境。
</p>
<ul style="list-style:none;padding:0;margin:0;color:#1f2937;font-size:14px;line-height:1.8;">
<li>· 4G 远程下发语音指令。</li>
<li>· 多级告警策略与自检。</li>
<li>· IP65 外壳,屋外稳定运行。</li>
</ul>
<div style="display:flex;flex-wrap:wrap;gap:12px;margin-top:20px;">
<span style="background:#f0f9ff;color:#118af4;padding:8px 16px;border-radius:999px;font-size:12px;font-weight:600;">110dB 声压</span>
<span style="background:#f9fafb;color:#4b5565;padding:8px 16px;border-radius:999px;font-size:12px;">4G 联网</span>
</div>
</div>
<figure style="width:220px;flex-shrink:0;margin:0;">
<img src="X1_Site/site/public/img/图片5.png" alt="4G语音报警装置" style="width:100%;border-radius:16px;border:1px solid rgba(17,138,244,0.18);box-shadow:0 10px 28px rgba(15,31,57,0.12);">
</figure>
</article>
<article style="background:#ffffff;border-radius:20px;border:1px solid rgba(17,138,244,0.12);box-shadow:0 18px 42px rgba(17,138,244,0.08);padding:32px;display:flex;gap:28px;align-items:flex-start;">
<div style="flex:1;">
<div style="display:inline-flex;align-items:center;gap:8px;padding:4px 14px;border-radius:999px;background:#e4f2ff;color:#118af4;font-size:12px;font-weight:600;letter-spacing:1px;text-transform:uppercase;">Doppler Sensor</div>
<h2 style="font-size:22px;color:#0f1f39;margin:20px 0 12px;">多普勒流量流速仪</h2>
<p style="color:#4b5565;line-height:1.7;margin-bottom:16px;">
单向待机电流 65mA/12V、测量 106mA/12V;双向待机 72mA/12V、测量 126mA/12V。流速精度 ±1.0%±1cm/s,水位精度 0.3%±0.5cm,瞬时流量 0–99.99m³,累积流量 0.1–999999m³。
</p>
<ul style="list-style:none;padding:0;margin:0;color:#1f2937;font-size:14px;line-height:1.8;">
<li>· 支持双向测量与多模式采样。</li>
<li>· 防淤堵结构,适配恶劣水域。</li>
<li>· 数据曲线实时可视化。</li>
</ul>
<div style="display:flex;flex-wrap:wrap;gap:12px;margin-top:20px;">
<span style="background:#f0f9ff;color:#118af4;padding:8px 16px;border-radius:999px;font-size:12px;font-weight:600;">±1.0% 精度</span>
<span style="background:#f9fafb;color:#4b5565;padding:8px 16px;border-radius:999px;font-size:12px;">双向采样</span>
</div>
</div>
<figure style="width:220px;flex-shrink:0;margin:0;">
<img src="X1_Site/site/public/img/图片6.png" alt="多普勒流量流速仪" style="width:100%;border-radius:16px;border:1px solid rgba(17,138,244,0.18);box-shadow:0 10px 28px rgba(15,31,57,0.12);">
</figure>
</article>
<article style="background:#ffffff;border-radius:20px;border:1px solid rgba(17,138,244,0.12);box-shadow:0 18px 42px rgba(17,138,244,0.08);padding:32px;display:flex;gap:28px;align-items:flex-start;">
<div style="flex:1;">
<div style="display:inline-flex;align-items:center;gap:8px;padding:4px 14px;border-radius:999px;background:#e4f2ff;color:#118af4;font-size:12px;font-weight:600;letter-spacing:1px;text-transform:uppercase;">Radar Meter</div>
<h2 style="font-size:22px;color:#0f1f39;margin:20px 0 12px;">雷达流量计</h2>
<p style="color:#4b5565;line-height:1.7;margin-bottom:16px;">
低功耗 1.3W,测速频率 24GHz,量程 0.1–20m/s,精度 ±2%,分辨率 0.01m/s。77–79GHz 水位测距,量程 0.15–65m,精度 ±1mm,分辨率 1mm,支持 0–20m 高程安装。
</p>
<ul style="list-style:none;padding:0;margin:0;color:#1f2937;font-size:14px;line-height:1.8;">
<li>· 雷达 + 水位联动,精准识别断面流量。</li>
<li>· 自适应滤波,抗雨雪干扰。</li>
<li>· 适配多种安装支架与角度补偿。</li>
</ul>
<div style="display:flex;flex-wrap:wrap;gap:12px;margin-top:20px;">
<span style="background:#f0f9ff;color:#118af4;padding:8px 16px;border-radius:999px;font-size:12px;font-weight:600;">±1mm 水位</span>
<span style="background:#f9fafb;color:#4b5565;padding:8px 16px;border-radius:999px;font-size:12px;">0.01m/s 分辨率</span>
</div>
</div>
<figure style="width:220px;flex-shrink:0;margin:0;">
<img src="X1_Site/site/public/img/图片7.png" alt="雷达流量计" style="width:100%;border-radius:16px;border:1px solid rgba(17,138,244,0.18);box-shadow:0 10px 28px rgba(15,31,57,0.12);">
</figure>
</article>
<article style="background:#ffffff;border-radius:20px;border:1px solid rgba(17,138,244,0.12);box-shadow:0 18px 42px rgba(17,138,244,0.08);padding:32px;display:flex;gap:28px;align-items:flex-start;">
<div style="flex:1;">
<div style="display:inline-flex;align-items:center;gap:8px;padding:4px 14px;border-radius:999px;background:#e4f2ff;color:#118af4;font-size:12px;font-weight:600;letter-spacing:1px;text-transform:uppercase;">Slope Radar</div>
<h2 style="font-size:22px;color:#0f1f39;margin:20px 0 12px;">边坡位移雷达</h2>
<p style="color:#4b5565;line-height:1.7;margin-bottom:16px;">
最大探测 ≥5km,形变测量精度优于 0.1mm,距离分辨率优于 0.3m,角度分辨率优于 5mrad。支持 360° 方位扫描与 ±30° 俯仰调节,数据 1 次/min 更新。
</p>
<ul style="list-style:none;padding:0;margin:0;color:#1f2937;font-size:14px;line-height:1.8;">
<li>· 广域实时监测滑坡与崩塌征兆。</li>
<li>· 点云可视化,支持三维复现。</li>
<li>· 远程自检与自动巡航策略。</li>
</ul>
<div style="display:flex;flex-wrap:wrap;gap:12px;margin-top:20px;">
<span style="background:#f0f9ff;color:#118af4;padding:8px 16px;border-radius:999px;font-size:12px;font-weight:600;">≥5km 覆盖</span>
<span style="background:#f9fafb;color:#4b5565;padding:8px 16px;border-radius:999px;font-size:12px;">0.1mm 精度</span>
</div>
</div>
<figure style="width:220px;flex-shrink:0;margin:0;">
<img src="X1_Site/site/public/img/图片8.png" alt="边坡位移雷达" style="width:100%;border-radius:16px;border:1px solid rgba(17,138,244,0.18);box-shadow:0 10px 28px rgba(15,31,57,0.12);">
</figure>
</article>
</div>

6
关于我们.md

@ -0,0 +1,6 @@
AI驱动的城市结构安全科技公司
衡感智能是一家以AI、数字孪生与智能硬件为核心能力的城市结构安全科技公司,构建覆盖“设备—数据—AI—决策”的一体化安全体系,打造城市“结构安全数字底座”,助力城市结构实现全生命周期的安全管理。
我们专注于关键设施的实时监测、风险预警与智能决策,通过多源感知数据与AI模型的融合,帮助管理者提前识别隐患、精准制定处置方案,让城市运行更加安全、高效、可持续。
核心定位:AI赋能结构安全,让城市具备“自我防御力”。
Loading…
Cancel
Save