hezhijie 1 mesiac pred
commit
8c621a4353
100 zmenil súbory, kde vykonal 5900 pridanie a 0 odobranie
  1. 22 0
      .gitignore
  2. 2 0
      company/.env.development
  3. 2 0
      company/.env.production
  4. 18 0
      company/.gitignore
  5. 48 0
      company/.umirc.ts
  6. 27 0
      company/package.json
  7. 162 0
      company/src/app.tsx
  8. BIN
      company/src/assets/image/home/bottom_bg1.png
  9. BIN
      company/src/assets/image/home/footer_bg.png
  10. BIN
      company/src/assets/image/home/hero_bg.png
  11. BIN
      company/src/assets/image/home/m3_t1_max.png
  12. BIN
      company/src/assets/image/home/m3_t1_small.png
  13. BIN
      company/src/assets/image/home/m3_t2_max.png
  14. BIN
      company/src/assets/image/home/m3_t2_small.png
  15. BIN
      company/src/assets/image/home/m3_t3_max.png
  16. BIN
      company/src/assets/image/home/m3_t3_small.png
  17. BIN
      company/src/assets/image/home/m3_t4_max.png
  18. BIN
      company/src/assets/image/home/m3_t4_small.png
  19. BIN
      company/src/assets/image/home/m3_t5_max.png
  20. BIN
      company/src/assets/image/home/m3_t5_small.png
  21. BIN
      company/src/assets/image/home/m4_t1.png
  22. BIN
      company/src/assets/image/home/value_mission.png
  23. BIN
      company/src/assets/image/home/value_values.png
  24. BIN
      company/src/assets/image/home/value_vision.png
  25. BIN
      company/src/assets/image/logo.ico
  26. BIN
      company/src/assets/image/logo.png
  27. BIN
      company/src/assets/image/logo.webp
  28. BIN
      company/src/assets/image/logo_i.png
  29. BIN
      company/src/assets/image/logo_kailin.png
  30. 7 0
      company/src/config/api.ts
  31. 154 0
      company/src/global.less
  32. 83 0
      company/src/pages/Agreement/index.less
  33. 281 0
      company/src/pages/Agreement/index.tsx
  34. 1049 0
      company/src/pages/Home/index.less
  35. 432 0
      company/src/pages/Home/index.tsx
  36. 104 0
      company/src/pages/Privacy/index.less
  37. 486 0
      company/src/pages/Privacy/index.tsx
  38. 286 0
      company/src/pages/Solution/index.less
  39. 298 0
      company/src/pages/Solution/index.tsx
  40. 3 0
      company/src/services/index.ts
  41. 36 0
      company/src/services/request.ts
  42. 10 0
      company/src/utils/utils.ts
  43. 4 0
      company/tsconfig.json
  44. 2 0
      company/typings.d.ts
  45. 9 0
      retrieval/.env.example
  46. 8 0
      retrieval/.gitignore
  47. 20 0
      retrieval/README.md
  48. 29 0
      retrieval/index.html
  49. 5 0
      retrieval/metadata.json
  50. 36 0
      retrieval/package.json
  51. 6 0
      retrieval/postcss.config.cjs
  52. 214 0
      retrieval/src/App.tsx
  53. 4 0
      retrieval/src/assets.d.ts
  54. BIN
      retrieval/src/assets/images/logo.ico
  55. BIN
      retrieval/src/assets/images/logo_i.png
  56. BIN
      retrieval/src/assets/images/zjy/logo.webp
  57. BIN
      retrieval/src/assets/images/zjy/logo_transparent.png
  58. BIN
      retrieval/src/assets/images/zjy/m3_t11.png
  59. BIN
      retrieval/src/assets/images/zjy/m3_t22.png
  60. BIN
      retrieval/src/assets/images/zjy/m3_t33.png
  61. BIN
      retrieval/src/assets/images/zjy/m3_t44.png
  62. BIN
      retrieval/src/assets/images/zjy/m3_t55.png
  63. 11 0
      retrieval/src/index.css
  64. 25 0
      retrieval/src/main.tsx
  65. 83 0
      retrieval/src/pages/Agreement/index.less
  66. 281 0
      retrieval/src/pages/Agreement/index.tsx
  67. 104 0
      retrieval/src/pages/Privacy/index.less
  68. 486 0
      retrieval/src/pages/Privacy/index.tsx
  69. 343 0
      retrieval/src/pages/Solution/ContactPage.tsx
  70. 285 0
      retrieval/src/pages/zjy/HomePage.tsx
  71. 42 0
      retrieval/src/services/request.ts
  72. 6 0
      retrieval/src/utils/utils.ts
  73. 1 0
      retrieval/src/vite-env.d.ts
  74. 19 0
      retrieval/tailwind.config.cjs
  75. 26 0
      retrieval/tsconfig.json
  76. 22 0
      retrieval/vite.config.ts
  77. 9 0
      saas/.env.example
  78. 8 0
      saas/.gitignore
  79. 20 0
      saas/README.md
  80. 29 0
      saas/index.html
  81. 5 0
      saas/metadata.json
  82. 36 0
      saas/package.json
  83. 6 0
      saas/postcss.config.cjs
  84. 202 0
      saas/src/App.tsx
  85. 4 0
      saas/src/assets.d.ts
  86. BIN
      saas/src/assets/images/klzs/m2_t1.png
  87. BIN
      saas/src/assets/images/klzs/m2_t11.png
  88. BIN
      saas/src/assets/images/klzs/m2_t2.png
  89. BIN
      saas/src/assets/images/klzs/m2_t22.png
  90. BIN
      saas/src/assets/images/klzs/m2_t3.png
  91. BIN
      saas/src/assets/images/klzs/m2_t33.png
  92. BIN
      saas/src/assets/images/klzs/m2_t4.png
  93. BIN
      saas/src/assets/images/klzs/m2_t44.png
  94. BIN
      saas/src/assets/images/klzs/m3_t1.png
  95. BIN
      saas/src/assets/images/klzs/m3_t2.png
  96. BIN
      saas/src/assets/images/klzs/m3_t3.png
  97. BIN
      saas/src/assets/images/klzs/m3_t4.png
  98. BIN
      saas/src/assets/images/logo.ico
  99. BIN
      saas/src/assets/images/logo.png
  100. BIN
      saas/src/assets/images/logo_i.png

+ 22 - 0
.gitignore

@@ -0,0 +1,22 @@
+/company/node_modules
+/retrieval/node_modules
+/saas/node_modules
+/company/.env.local
+/company/.umirc.local.ts
+/company/config/config.local.ts
+/company/src/.umi
+/company/src/.umi-production
+/company/src/.umi-test
+/company/.umi
+/company/.umi-production
+/company/.umi-test
+/dist
+/saas/saas
+/company/home
+/retrieval/price
+/saas/saas
+/.mfsu
+.swc
+yarn.lock
+pnpm-lock.yaml
+package-lock.json

+ 2 - 0
company/.env.development

@@ -0,0 +1,2 @@
+API_HOST="https://retrieveapi.dfwy.tech"
+

+ 2 - 0
company/.env.production

@@ -0,0 +1,2 @@
+API_HOST="https://retrieveapi.findit.ltd"
+

+ 18 - 0
company/.gitignore

@@ -0,0 +1,18 @@
+/node_modules
+/.env.local
+/.umirc.local.ts
+/config/config.local.ts
+/src/.umi
+/src/.umi-production
+/src/.umi-test
+/.umi
+/.umi-production
+/.umi-test
+/dist
+/retrieval
+/website
+/.mfsu
+.swc
+yarn.lock
+pnpm-lock.yaml
+package-lock.json

+ 48 - 0
company/.umirc.ts

@@ -0,0 +1,48 @@
+import { defineConfig } from '@umijs/max';
+
+export default defineConfig({
+  antd: {},
+  title: '大方无隅科技有限公司',
+  metas: [
+    { name: 'keywords', content: '深圳大方无隅科技有限公司,大方无隅科技有限公司,大方无隅' },
+    {
+      name: 'description',
+      content: '深圳大方无隅科技有限公司成立于2016年,专注于为智慧城市、教育、医疗、快消、消费电子数码等行业提供技术解决方案与营销服务。2021年创立“开邻”品牌,专注渠道价格舆情管控、新媒体内容营销和政企客户软件定制化方向。同时,作为企微生态和抖音生态服务商,通过自研SaaS系统,为客户提供一站式数字化营销服务。团队以效率第一的服务宗旨,以精益求精的服务理念,致力于赋能客户AI数字基建与商业价值增长。',
+    },
+  ],
+  define: {
+    'process.env.NODE_ENV': process.env.NODE_ENV,
+    'process.env.API_HOST': process.env.API_HOST,
+  },
+  base: '/',
+  publicPath: '/',
+  outputPath: 'home',
+  layout: false,
+  routes: [
+    {
+      path: '/',
+      redirect: '/home',
+    },
+    {
+      name: '首页',
+      path: '/home',
+      component: './Home',
+    },
+    {
+      name: '获取方案',
+      path: '/solution',
+      component: './Solution',
+    },
+    {
+      name: '隐私政策',
+      path: '/privacy',
+      component: './Privacy',
+    },
+    {
+      name: '用户协议',
+      path: '/agreement',
+      component: './Agreement',
+    },
+  ],
+  npmClient: 'yarn',
+});

+ 27 - 0
company/package.json

@@ -0,0 +1,27 @@
+{
+  "private": true,
+  "name": "official_website",
+  "scripts": {
+    "build": "env-cmd -f .env.development max build",
+    "build:prod": "env-cmd -f .env.production max build",
+    "dev": "max dev",
+    "postinstall": "max setup",
+    "setup": "max setup",
+    "start": "npm run dev"
+  },
+  "dependencies": {
+    "@ant-design/icons": "^6.1.0",
+    "@umijs/max": "^4.6.2",
+    "antd": "^5.4.0",
+    "lucide-react": "^1.7.0",
+    "motion": "^12.38.0",
+    "tailwindcss": "^4.2.2",
+    "umi-request": "^1.4.0"
+  },
+  "devDependencies": {
+    "@types/react": "^18.0.33",
+    "@types/react-dom": "^18.0.11",
+    "env-cmd": "^10.1.0",
+    "typescript": "^5.0.3"
+  }
+}

+ 162 - 0
company/src/app.tsx

@@ -0,0 +1,162 @@
+import React, { useEffect, useState } from "react";
+import { Dropdown } from "antd";
+import type { MenuProps } from "antd";
+import { DownOutlined } from "@ant-design/icons";
+import { history } from "@umijs/max";
+import logoPng from "@/assets/image/logo.ico";
+import logoKailin from "@/assets/image/logo_i.png";
+import { products } from "./utils/utils";
+
+const scrollToHash = (hash: string) => {
+  if (typeof window === "undefined") return;
+  const id = hash.replace(/^#/, "");
+  requestAnimationFrame(() => {
+    const el = document.getElementById(id);
+    el?.scrollIntoView({ behavior: "smooth", block: "start" });
+  });
+};
+
+const AppRoot: React.FC<React.PropsWithChildren> = (props) => {
+  const [pathname, setPathname] = useState(() => history.location.pathname);
+
+  useEffect(() => {
+    const toAbsoluteUrl = (url: string) => {
+      if (/^https?:\/\//.test(url)) return url;
+      const origin = window.location.origin.replace(/\/+$/, "");
+      const p = url.startsWith("/") ? url : `/${url}`;
+      return `${origin}${p}`;
+    };
+
+    const ensureMetaProperty = (property: string) => {
+      let meta = document.querySelector(
+        `meta[property="${property}"]`,
+      ) as HTMLMetaElement | null;
+      if (!meta) {
+        meta = document.createElement("meta");
+        meta.setAttribute("property", property);
+        document.head.appendChild(meta);
+      }
+      return meta;
+    };
+
+    ensureMetaProperty("og:type").content = "website";
+    ensureMetaProperty("og:url").content = window.location.href;
+    ensureMetaProperty("og:image").content = toAbsoluteUrl(logoPng);
+
+    let faviconLink = document.querySelector(
+      'link[rel~="icon"]',
+    ) as HTMLLinkElement | null;
+    if (!faviconLink) {
+      faviconLink = document.createElement("link");
+      faviconLink.rel = "icon";
+      document.head.appendChild(faviconLink);
+    }
+    faviconLink.type = "image/png";
+    faviconLink.href = logoPng;
+
+    let appleTouchIconLink = document.querySelector(
+      'link[rel="apple-touch-icon"]',
+    ) as HTMLLinkElement | null;
+    if (!appleTouchIconLink) {
+      appleTouchIconLink = document.createElement("link");
+      appleTouchIconLink.rel = "apple-touch-icon";
+      document.head.appendChild(appleTouchIconLink);
+    }
+    appleTouchIconLink.href = logoPng;
+  }, []);
+
+  useEffect(() => {
+    const unlisten = history.listen(({ location }) => {
+      setPathname(location.pathname);
+    });
+    return unlisten;
+  }, []);
+
+  useEffect(() => {
+    const { hash } = window.location;
+    if (hash && hash.length > 1) {
+      scrollToHash(hash);
+    }
+  }, [pathname]);
+
+  const hideHeader = pathname === "/privacy" || pathname === "/agreement";
+  const headerHeight = hideHeader ? 0 : 72;
+
+  const productMenuItems: MenuProps["items"] = products.map((product) => ({
+    key: product.name,
+    label: (
+      <a href={product.url} target="_blank" rel="noreferrer">
+        {product.name}
+      </a>
+    ),
+  }));
+
+  const header = hideHeader ? null : (
+    <header className="siteHeader">
+      <div className="siteHeaderInner">
+        <a
+          className="siteHeaderBrand"
+          onClick={() => history.push("/home")}
+        >
+          <img className="siteHeaderLogo" src={logoKailin} alt="开邻智数" />
+          {/* <span className="siteHeaderWordmark">
+            <span className="siteHeaderName">开邻智数</span>
+            <span className="siteHeaderEn">Kirin Intelligent Data</span>
+          </span> */}
+        </a>
+
+        <nav className="siteHeaderNav" aria-label="主导航">
+          <button
+            type="button"
+            className={
+              pathname === "/home"
+                ? "siteHeaderNavLink siteHeaderNavLinkActive"
+                : "siteHeaderNavLink"
+            }
+            onClick={() => history.push("/home")}
+          >
+            首页
+          </button>
+
+          <Dropdown menu={{ items: productMenuItems }} placement="bottom">
+            <button type="button" className="siteHeaderNavLink siteHeaderNavDropdown">
+              产品中心
+              <DownOutlined className="siteHeaderNavCaret" />
+            </button>
+          </Dropdown>
+
+          <button
+            type="button"
+            className={
+              pathname === "/solution"
+                ? "siteHeaderNavLink siteHeaderNavLinkActive"
+                : "siteHeaderNavLink"
+            }
+            onClick={() => history.push("/solution")}
+          >
+            联系我们
+          </button>
+
+          <button
+            type="button"
+            className="siteHeaderCta"
+            onClick={() => history.push("/solution")}
+          >
+            获取方案
+          </button>
+        </nav>
+      </div>
+    </header>
+  );
+
+  return (
+    <>
+      {header}
+      <div style={{ paddingTop: headerHeight }}>{props.children}</div>
+    </>
+  );
+};
+
+export function rootContainer(container: React.ReactNode) {
+  return <AppRoot>{container}</AppRoot>;
+}

BIN
company/src/assets/image/home/bottom_bg1.png


BIN
company/src/assets/image/home/footer_bg.png


BIN
company/src/assets/image/home/hero_bg.png


BIN
company/src/assets/image/home/m3_t1_max.png


BIN
company/src/assets/image/home/m3_t1_small.png


BIN
company/src/assets/image/home/m3_t2_max.png


BIN
company/src/assets/image/home/m3_t2_small.png


BIN
company/src/assets/image/home/m3_t3_max.png


BIN
company/src/assets/image/home/m3_t3_small.png


BIN
company/src/assets/image/home/m3_t4_max.png


BIN
company/src/assets/image/home/m3_t4_small.png


BIN
company/src/assets/image/home/m3_t5_max.png


BIN
company/src/assets/image/home/m3_t5_small.png


BIN
company/src/assets/image/home/m4_t1.png


BIN
company/src/assets/image/home/value_mission.png


BIN
company/src/assets/image/home/value_values.png


BIN
company/src/assets/image/home/value_vision.png


BIN
company/src/assets/image/logo.ico


BIN
company/src/assets/image/logo.png


BIN
company/src/assets/image/logo.webp


BIN
company/src/assets/image/logo_i.png


BIN
company/src/assets/image/logo_kailin.png


+ 7 - 0
company/src/config/api.ts

@@ -0,0 +1,7 @@
+export const getApiBase = (): string => {
+  const isDev = process.env.NODE_ENV === 'development';
+  const origin = isDev ? 'https://retrieveapi.dfwy.tech' : process.env.API_HOST;
+  return String(origin).trim().replace(/\/+$/, '');
+};
+
+export const API_PREFIX = '';

+ 154 - 0
company/src/global.less

@@ -0,0 +1,154 @@
+html,
+body {
+  background: #ffffff;
+}
+
+:root {
+  --theme-color: #002fa7;
+}
+
+.siteHeader {
+  position: fixed;
+  top: 0;
+  left: 0;
+  right: 0;
+  z-index: 1000;
+  height: 72px;
+  background: rgba(2, 6, 23, 0.86);
+  border-bottom: 1px solid rgba(71, 85, 105, 0.42);
+  box-shadow: 0 10px 30px rgba(2, 6, 23, 0.34);
+  backdrop-filter: blur(10px);
+}
+
+.siteHeaderInner {
+  height: 100%;
+  max-width: 1440px;
+  margin: 0 auto;
+  padding: 0 24px;
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  gap: 24px;
+}
+
+.siteHeaderBrand {
+  display: flex;
+  align-items: center;
+  gap: 12px;
+  min-width: 0;
+  background: none;
+  border: 0;
+  padding: 0;
+  cursor: pointer;
+  text-align: left;
+}
+
+.siteHeaderLogo {
+  height: 50px;
+  width: auto;
+  display: block;
+  flex-shrink: 0;
+}
+
+.siteHeaderWordmark {
+  display: flex;
+  flex-direction: column;
+  line-height: 1.15;
+}
+
+.siteHeaderName {
+  font-size: 18px;
+  font-weight: 700;
+  color: rgba(0, 0, 0, 0.88);
+  letter-spacing: 0.5px;
+}
+
+.siteHeaderEn {
+  font-size: 11px;
+  color: rgba(0, 0, 0, 0.45);
+  margin-top: 2px;
+}
+
+.siteHeaderNav {
+  display: flex;
+  align-items: center;
+  gap: 8px;
+  flex-wrap: nowrap;
+  white-space: nowrap;
+  justify-content: flex-end;
+}
+
+.siteHeaderNavLink {
+  background: none;
+  border: 0;
+  padding: 8px 14px;
+  font-size: 15px;
+  color: rgba(203, 213, 225, 0.9);
+  cursor: pointer;
+  border-radius: 6px;
+  transition: color 0.2s, background 0.2s;
+}
+
+.siteHeaderNavLink:hover {
+  color: #ffffff;
+  background: rgba(37, 99, 235, 0.2);
+}
+
+.siteHeaderNavLinkActive {
+  color: #60a5fa;
+  font-weight: 600;
+}
+
+.siteHeaderNavDropdown {
+  display: inline-flex;
+  align-items: center;
+  gap: 4px;
+}
+
+.siteHeaderNavCaret {
+  font-size: 11px;
+  opacity: 0.65;
+}
+
+.siteHeaderCta {
+  margin-left: 8px;
+  padding: 8px 22px;
+  border: 0;
+  border-radius: 999px;
+  font-size: 14px;
+  font-weight: 600;
+  color: #fff;
+  background: #1d4ed8;
+  cursor: pointer;
+  transition: background 0.2s, transform 0.15s;
+}
+
+.siteHeaderCta:hover {
+  background: #2563eb;
+}
+
+.siteHeaderCta:active {
+  transform: scale(0.98);
+}
+
+@media (max-width: 768px) {
+  .siteHeaderInner {
+    padding: 8px 16px;
+    gap: 12px;
+  }
+
+  .siteHeaderNav {
+    gap: 4px;
+  }
+}
+
+@media (max-width: 500px) {
+  .siteHeaderNavLink {
+    display: none;
+  }
+
+  .siteHeaderNav {
+    justify-content: flex-end;
+  }
+}
+

+ 83 - 0
company/src/pages/Agreement/index.less

@@ -0,0 +1,83 @@
+.policyPage {
+  width: 100%;
+  min-width: 500px;
+  background: #ffffff;
+  color: rgba(0, 0, 0, 0.88);
+}
+
+.policyContainer {
+  max-width: 1200px;
+  margin: 0 auto;
+  padding: 24px 24px 0;
+}
+
+.policyTitle {
+  text-align: center;
+  font-size: 22px;
+  font-weight: 700;
+  margin-bottom: 20px;
+}
+
+.policyContent {
+  font-size: 17px;
+  line-height: 1.5;
+  color: rgba(0, 0, 0, 0.82);
+  text-indent: 2em;
+}
+
+.weight {
+  font-weight: 700;
+}
+
+
+.agreement-container {
+  max-width: 1200px;
+  margin: 0 auto;
+  background-color: #fff;
+  padding: 40px 60px;
+  border-radius: 8px;
+  box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
+}
+.main-title {
+  text-align: center;
+  font-size: 28px;
+  margin-bottom: 30px;
+  font-weight: bold;
+}
+.preamble {
+  font-size: 16px;
+  margin-bottom: 40px;
+  text-align: justify;
+}
+.level1-title {
+  font-size: 20px;
+  font-weight: bold;
+  margin: 30px 0 15px 0;
+  color: #222;
+}
+.level2-item {
+  font-size: 16px;
+  margin: 12px 0;
+  text-align: justify;
+  padding-left: 10px;
+}
+.level3-list {
+  list-style: none;
+  margin: 8px 0;
+}
+.level3-list li {
+  margin: 6px 0;
+  text-align: justify;
+}
+.level3-list li::before {
+  content: "1) ";
+  display: inline-block;
+  margin-right: 5px;
+}
+
+
+@media (max-width: 640px) {
+  .policyContainer {
+    padding: 40px 16px 64px;
+  }
+}

+ 281 - 0
company/src/pages/Agreement/index.tsx

@@ -0,0 +1,281 @@
+import React from "react";
+import "./index.less";
+
+const Agreement: React.FC = () => {
+  return (
+    <div className="policyPage">
+      <div className="policyContainer">
+        <div className="policyTitle">用户协议</div>
+      </div>
+      <div className="policyContent">
+        <div className="preamble">
+          本《用户协议》是您(下称“用户”)与深圳大方无隅科技有限公司(下称
+          “大方无隅科技”)之间,关于使用大方无隅科技提供的产品及服务(包括但不限于开邻智数)时所签署的协议。请用户在注册与使用大方无隅科技提供的产品及服务前请务必审慎阅读并充分理解协议中相关条款内容,当用户注册并使用了大方无隅科技的产品或服务,即表示用户已同意协议内容。
+        </div>
+
+        <div className="level1-title">一、重要须知</div>
+        <div className="level2-item">
+          1.1
+          在签署本协议之前,大方无隅科技正式提醒用户:您应认真阅读(未成年人应当在监护人陪同下阅读)、充分理解本《用户协议》中各条款,特别是免除或者限制大方无隅科技责任的免责条款,用户的权利限制条款,约定争议解决方式、司法管辖、法律适用的条款。
+        </div>
+        <div className="level2-item">
+          1.2
+          除非您接受本协议,否则用户无权也无必要继续接受大方无隅科技的服务,可以退出本次注册。用户点击接受并继续使用大方无隅科技的服务,视为用户已完全的接受本协议。
+        </div>
+        <div className="level2-item">
+          1.3
+          本协议在您开始使用大方无隅科技的服务,并注册成为大方无隅科技产品的用户时即产生法律效力,请您慎重考虑是否接受本协议,如不接受本协议的任一条款,请自动退出并不再接受大方无隅科技的任何服务。
+        </div>
+        <div className="level2-item">
+          1.4
+          在您签署本协议之后,此文本可能因国家政策、产品以及履行本协议的环境发生变化而进行修改,我们会将修改后的协议发布在本网站上,若您对修改后的协议有异议的,请立即停止登录、使用大方无隅科技提供的产品及服务,若您登录或继续使用大方无隅科技提供产品,视为认可修改后的协议。
+        </div>
+        <div className="level2-item">
+          1.5
+          用户在使用开邻智数之前,应当告知其员工在注册及使用开邻智数期间,开邻智数可能收集和使用员工个人信息,要求其员工认真阅读开邻隐私政策,并取得其员工对开邻隐私政策的明确同意。开邻智数的用户开始或继续使用我们提供的任一产品或服务时,我们视为用户已经履行上述对员工的告知义务并获取其员工的明确同意。如果后续任何员工向我们提出权利主张认为我们侵害了其个人信息权利,由此造成的责任由客户负责解决,给我们造成的损失由用户负责赔偿。
+        </div>
+
+        <div className="level1-title">二、关于“帐号”及“付费会员”资格</div>
+        <div className="level2-item">
+          2.1
+          大方无隅科技的产品为用户提供了注册通道,用户在认可并接受本协议之后,有权选择未被其他用户使用过的微信账号作为用户的帐号。
+          <ul className="level3-list">
+            <li>用户可通过各种已有和未来新增的渠道注册账号及加入付费会员。</li>
+          </ul>
+        </div>
+        <div className="level2-item">
+          2.2
+          在用户使用具体某种方式加入付费会员时,须阅读并确认相关的用户协议和使用方法。
+        </div>
+        <div className="level2-item">
+          2.3
+          用户通过网络填写并提交注册表,表中所填写的内容与个人资料必须真实有效,否则大方无隅科技有权拒绝其申请或撤销其账号或付费会员资格,并不予任何赔偿或退还会员费。用户的个人资料发生变化,应及时修改相关资料,否则由此造成的会员权力不能全面有效行使的责任由会员自己承担,大方无隅科技有权因此取消其会员资格,并不予任何赔偿或退还会员费。
+        </div>
+        <div className="level2-item">
+          2.4
+          成为付费会员后,会员有权利不接受大方无隅科技的服务,可申请取消会员服务,但不获得任何服务费用的退还。
+        </div>
+        <div className="level2-item">
+          2.5
+          用户在注册了大方无隅科技帐号并不意味获得全部大方无隅科技产品的授权,仅仅是取得了接受大方无隅科技服务的身份,用户在登录相关网页、加载应用、下载安装软件时需要另行签署单个产品的授权协议。
+        </div>
+        <div className="level2-item">
+          2.6
+          大方无隅科技账户仅限于在大方无隅科技网站上注册用户本人使用,禁止赠与、借用、租用、转让或售卖。如果大方无隅科技发现或者有理由怀疑使用者并非帐号初始注册人,则有权在未经通知的情况下,暂停或终止向用户提供服务,并有权注销该帐号,而无需向该帐号使用人承担法律责任,由此带来的包括并不限于用户通讯中断、用户资料和信息等清空等损失由用户自行承担。
+        </div>
+        <div className="level2-item">
+          2.7
+          用户有责任维护个人帐号、密码的安全性与保密性,用户就其帐号及密码项下之一切活动负全部责任,包括用户数据的修改,发表的言论以及其他所有的损失。用户应重视大方无隅科技帐号密码保护。用户如发现他人未经许可使用其帐号或发生其他任何安全漏洞问题时立即通知大方无隅科技。如果用户在使用大方无隅科技服务时违反上述规则而产生任何损失或损害,大方无隅科技不承担任何责任。
+        </div>
+        <div className="level2-item">
+          2.8
+          用户帐号在丢失后,可遵照大方无隅科技的申诉途径及时申诉请求找回帐号。用户应提供能增加帐号安全性的个人密码保护资料。用户可以凭初始注册资料及个人密码保护资料填写申诉单向大方无隅科技申请找回帐号,大方无隅科技的密码找回机制仅负责识别申诉单上所填资料与系统记录资料的正确性,而无法识别申诉人是否系真正帐号有权使用人。对用户因被他人冒名申诉而致的任何损失,大方无隅科技不承担任何责任,用户知晓帐号及密码保管责任在于用户,大方无隅科技并无义务保证帐号丢失或遗忘密码后用户一定能通过申诉找回帐号。
+        </div>
+        <div className="level2-item">
+          2.9
+          用户应保证注册大方无隅科技帐号时填写的身份信息的真实性,任何由于非法、不真实、不准确的用户信息所产生的责任由用户承担。用户应不断根据实际情况更新注册资料,符合及时、详尽、真实、准确的要求。所有原始键入的资料将引用用户的帐号注册资料。如果因用户的注册信息不真实而引起的问题,以及对问题发生所带来的后果,大方无隅科技不负任何责任。如果用户提供的信息不准确、不真实、不合法或者大方无隅科技有理由怀疑为错误、不实或不完整的资料或在个人资料中发布广告、不严肃内容及无关信息,大方无隅科技有权暂停或终止向用户提供服务,注销该帐号,并拒绝用户现在和未来使用大方无隅科技服务之全部或任何部分。因此产生的一切损失由用户自行承担。
+        </div>
+
+        <div className="level1-title">
+          三、用户在使用大方无隅科技产品时,应当遵守相关法律规定
+        </div>
+        <div className="level2-item">
+          3.1
+          用户在使用大方无隅科技产品时,应当遵守《中华人民共和国宪法》、《中华人民共和国刑法》、《中华人民共和国民法典》、《中华人民共和国著作权法》、《中华人民共和国电信条例》、《互联网信息服务管理办法》、《互联网电子公告服务管理规定》、《计算机信息网络国际互联网安全保护管理办法》等相关规定。用户不得利用大方无隅科技服务产品从事违反法律法规、政策以及侵犯他人合法权益的行为,包括但不限于下列行为:
+        </div>
+        <div className="level2-item">
+          3.2
+          利用大方无隅科技服务产品发表、传送、传播、储存反对宪法所确定的基本原则的、危害国家安全、国家统一、社会稳定的、煽动民族仇恨、民族歧视、破坏民族团结的内容,或侮辱诽谤、色情、暴力、引起他人不安及任何违反国家法律法规政策的内容或者设置含有上述内容的网名、角色名。
+        </div>
+        <div className="level2-item">
+          3.3
+          利用大方无隅科技服务发表、传送、传播、储存侵害他人知识产权、商业机密、肖像权、隐私权等合法权利或其他道德上令人反感的内容。
+        </div>
+        <div className="level2-item">
+          3.4 进行任何危害计算机网络安全的行为,包括但不限于:
+          <ul className="level3-list">
+            <li>使用未经许可的数据或进入未经许可的服务器/帐户;</li>
+            <li>
+              未经允许进入公众计算机网络或者他人计算机系统并删除、修改、增加存储信息;
+            </li>
+            <li>
+              未经许可,企图探查、扫描、测试本“软件”系统或网络的弱点或其它实施破坏网络安全的行为;
+            </li>
+            <li>
+              企图干涉、破坏本“软件”系统或网站的正常运行,故意传播恶意程序或病毒以及其他破坏干扰正常网络信息服务的行为;
+            </li>
+            <li>伪造 TCP/IP 数据包名称或部分名称;</li>
+            <li>
+              自行或利用其他软件对大方无隅科技提供产品进行反向破解等违法行为。
+            </li>
+          </ul>
+        </div>
+        <div className="level2-item">
+          3.5
+          进行任何诸如发布广告、推广信息、销售商品的行为,或者进行任何非法的侵害大方无隅科技利益的行为。
+        </div>
+        <div className="level2-item">
+          3.6
+          进行其他任何违法以及侵犯其他个人、公司、社会团体、组织的合法权益的行为或者法律、行政法规、规章、条例以及任何具有法律效力之规范所限制或禁止的其他行为。在任何情况下,如果大方无隅科技有理由认为用户的任何行为,包括但不限于用户的任何言论和其它行为违反或可能违反法律法规、国家政策以及本协议的任何规定,大方无隅科技可在任何时候不经任何事先通知,即有权终止向用户提供服务。
+        </div>
+
+        <div className="level1-title">四、注意事项</div>
+        <div className="level2-item">
+          4.1
+          用户理解并同意大方无隅科技将会尽其商业上的合理努力保障用户在大方无隅科技提供的产品及服务中的数据存储安全,但是,大方无隅科技并不能就此提供完全保证,包括但不限于以下情形:
+          <ul className="level3-list">
+            <li>
+              大方无隅科技不对用户在开邻智数中相关数据的删除或储存失败负责;
+            </li>
+            <li>
+              在使用大方无隅科技的产品及服务期间,用户可根据自己的需要自行备份开邻智数及服务中的相关数据;
+            </li>
+            <li>
+              除非与用户之间另有约定,在用户停止使用开邻智数或服务被终止、取消之日起满
+              30
+              个自然日之后,大方无隅科技可以从服务器上永久地删除用户产生的数据。在上述期限届满之后,大方无隅科技没有义务向用户返还任何数据。
+            </li>
+          </ul>
+        </div>
+        <div className="level2-item">
+          4.2
+          用户在使用大方无隅科技的产品及服务时,须自行承担如下来自大方无隅科技不可掌控的风险内容,包括但不限于:
+          <ul className="level3-list">
+            <li>由于不可抗拒因素可能引起的用户信息丢失、泄漏等风险;</li>
+            <li>
+              用户在使用开邻智数访问第三方网站时,因第三方网站及相关内容所可能导致的风险,由用户自行承担;
+            </li>
+            <li>
+              用户发布的内容被他人转发、分享,因此等传播可能带来的风险和责任;
+            </li>
+            <li>
+              由于网络信号不稳定、网络带宽小等网络原因,所引起的开邻智数登录失败、资料同步不完整、页面打开速度慢等风险。
+            </li>
+          </ul>
+        </div>
+        <div className="level2-item">
+          4.3
+          用户须知,在使用大方无隅科技服务可能存在有来自任何他人的包括威胁性的、诽谤性的、令人反感的或非法的内容或行为或对他人权利的侵犯(包括知识产权)的匿名或冒名的信息的风险,用户须承担以上风险,大方无隅科技对服务不作担保,不论是明确的或隐含的,包括所有有关信息真实性、适当性、适于某一特定用途、所有权和非侵权性的默示担保和条件,对因此导致任何因用户不正当或非法使用服务产生的直接、间接、偶然、特殊及后续的损害,大方无隅科技不承担任何责任。
+        </div>
+        <div className="level2-item">
+          4.4
+          使用大方无隅科技服务必须遵守国家有关法律和政策等,维护国家利益,保护国家安全,并遵守本协议,对于用户违法行为或违反本协议的使用(包括但不限于言论发表、传送等)而引起的一切责任,由用户承担全部责任。
+        </div>
+        <div className="level2-item">
+          4.5
+          大方无隅科技提供的所有信息、资讯、内容和服务均来自互联网,并不代表大方无隅科技的观点,大方无隅科技对其真实性、合法性概不负责,亦不承担任何法律责任。
+        </div>
+        <div className="level2-item">
+          4.6
+          大方无隅科技所提供的产品和服务也属于互联网范畴,也易受到各种安全问题的困扰,包括但不限于:
+          <ul className="level3-list">
+            <li>个人资料被不法分子利用,造成现实生活中的骚扰;</li>
+            <li>哄骗、破译密码;</li>
+            <li>
+              下载安装的其它软件中含有“特洛伊木马”等病毒程序,威胁到个人计算机上信息和数据的安全,继而威胁对本服务的使用;
+            </li>
+            <li>
+              以及其他类网络安全困扰问题
+              对于发生上述情况的,用户应当自行承担责任。
+            </li>
+          </ul>
+        </div>
+        <div className="level2-item">
+          4.7
+          用户须明白,大方无隅科技为了整体运营的需要,有权在公告通知后,在不事先通知用户的情况下修改、中断、中止或终止服务,而无须向用户或第三方负责,大方无隅科技不承担任何赔偿责任。
+        </div>
+        <div className="level2-item">
+          4.8
+          用户应理解,互联网技术存在不稳定性,可能导致政府管制、政策限制、病毒入侵、黑客攻击、服务器系统崩溃或者其他现今技术无法解决的风险发生。由以上原因可能导致大方无隅科技服务中断或帐号信息损失,对此非人为因素引起的用户损失由用户自行承担责任。
+        </div>
+
+        <div className="level1-title">五、知识产权</div>
+        <div className="level2-item">
+          5.1
+          大方无隅科技对其旗下运营的网页、应用、软件等产品和服务享有知识产权,受中国法律的保护。
+        </div>
+        <div className="level2-item">
+          5.2
+          用户不得对大方无隅科技服务涉及的相关网页、应用、软件等产品进行反向工程、反向汇编、反向编译等。
+        </div>
+        <div className="level2-item">
+          5.3
+          用户只能在本《用户协议》以及相应的授权许可协议授权的范围内使用大方无隅科技知识产权,未经授权超范围使用的,构成对大方无隅科技的侵权。
+        </div>
+        <div className="level2-item">
+          5.4
+          用户在使用大方无隅科技产品服务时发表上传的文字、图片、视频、软件以及表演等信息,用户的发表、上传行为是对大方无隅科技服务平台的授权,为非独占性、永久性的授权,该授权可转授权。大方无隅科技可将前述信息在大方无隅科技旗下的所有服务平台上使用,可再次编辑后使用,也可以由大方无隅科技授权给合作方使用。
+        </div>
+        <div className="level2-item">
+          5.5
+          用户应保证,在使用大方无隅科技产品服务时上传的文字、图片、视频、软件以及表演等的信息不侵犯任何第三方知识产权,包括但不限于商标权、著作权等。若用户在使用大方无隅科技产品服务时上传的文字、图片、视频、软件以及表演等的信息中侵犯第三方知识产权,大方无隅科技有权移除该侵权产品,并对此不负任何责任。用户应当负责处理前述第三方的权利主张,承担由此产生的全部费用,包括但不限于侵权赔偿、律师费及其他合理费用,并保证大方无隅科技不会因此而遭受任何损失。
+        </div>
+        <div className="level2-item">
+          5.6
+          任何单位或个人认为通过大方无隅科技提供服务的内容可能涉嫌侵犯其知识产权或信息网络传播权,应该及时向大方无隅科技提出书面权利通知投诉,并提供身份证明、权属证明及详细侵权情况证明。大方无隅科技在收到上述法律文件后,将会依法尽快断开相关链接内容。
+        </div>
+
+        <div className="level1-title">六、隐私保护</div>
+        <div className="level2-item">
+          6.1
+          大方无隅科技非常重视用户的隐私权,用户在享受大方无隅科技提供的产品及服务时可能涉及用户的隐私,因此请用户仔细阅读本隐私保护条款。
+        </div>
+        <div className="level2-item">
+          6.2
+          请用户注意勿在使用大方无隅科技服务中透露自己的各类财产帐户、银行卡、信用卡、第三方支付账户及对应密码等重要信息资料,否则由此带来的任何损失
+          由用户自行承担。
+        </div>
+        <div className="level2-item">
+          6.3
+          用户的帐号、密码属于保密信息,大方无隅科技会努力采取积极的措施保护用户帐号、密码的安全。
+        </div>
+        <div className="level2-item">
+          6.4
+          互联网的开放性以及技术更新速度快,因非大方无隅科技可控制的因素导致用户信息泄漏的,大方无隅科技不承担任何责任。
+        </div>
+        <div className="level2-item">
+          6.5
+          用户在使用大方无隅科技服务时不应将自认为隐私的信息发表、上传至大方无隅科技,也不应将该等信息通过大方无隅科技的服务传播给其他人,由于用户的行为引起的隐私泄漏,由用户自行承担责任。
+        </div>
+
+        <div className="level1-title">七、免责声明</div>
+        <div className="level2-item">
+          7.1
+          用户充分了解并同意:关于产品和服务,大方无隅科技不提供任何种类的明示或暗示担保或条件,包括但不限于商业适售性、特定用途适用性等。用户对账号的使用行为必须自行承担相应风险。
+        </div>
+        <div className="level2-item">
+          7.2
+          用户应对本服务所提供的内容自行加以判断,并承担因使用内容而引起的所有风险,包括因对内容的正确性、完整性或实用性的依赖而产生的风险。是否使用本网站任何文章或资料应由用户自行考虑且自负风险,因任何文章或资料使用而导致的用户微信公众平台账号之任何损失或数据流失等后果,由用户自行承担,大方无隅科技无法且不会对因前述风险而导致的任何损失或损害承担责任。
+        </div>
+        <div className="level2-item">
+          7.3
+          用户自大方无隅科技提供的产品或服务所取得的任何建议或信息,无论是书面或口头形式,除非本协议有明确规定,将不构成本协议以外之任何保证。
+        </div>
+        <div className="level2-item">
+          7.4
+          因用户使用大方无隅科技提供的产品或服务时,可能会调用第三方系统或者通过第三方支持用户的使用或访问,使用或访问的结果由该第三方提供,大方无隅科技不保证通过第三方提供服务及内容的安全性、准确性、有效性及其他不确定的风险,由此若引发的任何争议及损害,与大方无隅科技无关,大方无隅科技不承担任何责任。
+        </div>
+
+        <div className="level1-title">八、其他</div>
+        <div className="level2-item">
+          8.1
+          本协议所定的任何条款的部分或全部无效者,不影响其它条款的效力。本协议的解释、效力及纠纷的解决,适用于中华人民共和国法律。若用户和大方无隅科技之间发生任何纠纷或争议,首先应友好协商解决,协商不成的,用户在此完全同意将纠纷或争议提交大方无隅科技所在地的人民法院管辖。
+        </div>
+        <div className="level2-item">
+          8.2
+          本协议所有条款的标题仅为阅读方便,本身并无实际涵义,不能作为本协议涵义解释的依据。
+        </div>
+        <div className="level2-item">
+          8.3
+          用户使用大方无隅科技产品及服务即视为用户已阅读并同意受本协议的约束。大方无隅科技有权在必要时自行修改或中断软件授权而不需通知用户的权利,用户可登录官网随时了解查阅最新版服务协议。在大方无隅科技修改协议条款后,如果用户不接受修改后的条款,请立即停止使用大方无隅科技提供的产品及服务,用户继续使用大方无隅科技提供的产品及服务将被视为已接受了修改后的协议。
+        </div>
+        <div className="level2-item">
+          8.4
+          本协议版权由大方无隅科技所有,大方无隅科技保留一切解释权利。本文中提及的产品和服务名称有可能为大方无隅科技的注册商标或商标,受法律保护。
+        </div>
+      </div>
+    </div>
+  );
+};
+
+export default Agreement;

+ 1049 - 0
company/src/pages/Home/index.less

@@ -0,0 +1,1049 @@
+.visuallyHidden {
+  position: absolute;
+  width: 1px;
+  height: 1px;
+  padding: 0;
+  margin: -1px;
+  overflow: hidden;
+  clip: rect(0, 0, 0, 0);
+  white-space: nowrap;
+  border: 0;
+}
+
+.homePage {
+  width: 100%;
+  color: rgba(0, 0, 0, 0.88);
+  background: #ffffff;
+}
+
+.homeReveal {
+  opacity: 0;
+  transform: translateY(28px);
+  transition:
+    opacity 0.7s ease,
+    transform 0.7s ease;
+}
+
+.homeReveal.is-visible {
+  opacity: 1;
+  transform: translateY(0);
+}
+
+.homeContainer {
+  max-width: 1440px;
+  margin: 0 auto;
+  padding: 0 24px;
+  box-sizing: border-box;
+}
+
+/* Hero:全景背景图(建筑在右侧);左侧叠层仅轻微提亮以保证正文可读 */
+.homeHero {
+  position: relative;
+  overflow: hidden;
+  box-sizing: border-box;
+  min-height: clamp(360px, 46vh, 600px);
+  background-color: #e8f0ff;
+  background-image: linear-gradient(
+      90deg,
+      rgba(236, 245, 255, 0.72) 0%,
+      rgba(244, 249, 255, 0.28) 48%,
+      rgba(255, 255, 255, 0) 72%
+    ),
+    url("../../assets/image/home/hero_bg.png");
+  background-repeat: no-repeat, no-repeat;
+  background-size: cover, cover;
+  /* 窄屏时 cover 优先裁切左侧,建筑保持在右侧 */
+  background-position: center, right center;
+}
+
+.homeHero::before {
+  content: "";
+  position: absolute;
+  inset: 0;
+  pointer-events: none;
+  background: linear-gradient(
+    120deg,
+    rgba(255, 255, 255, 0) 0%,
+    rgba(255, 255, 255, 0.36) 45%,
+    rgba(255, 255, 255, 0) 70%
+  );
+  transform: translateX(-120%);
+  animation: homeHeroSweep 2s ease-out 0.35s both;
+}
+
+.homeHeroInner {
+  position: relative;
+  z-index: 1;
+  box-sizing: border-box;
+  max-width: 1920px;
+  margin: 0 auto;
+  /* 参考稿:左 185px、上下 177px;随视口用 clamp 缩放 */
+  padding-top: clamp(48px, 9.2vw, 177px);
+  padding-bottom: clamp(48px, 9.2vw, 177px);
+  padding-left: clamp(20px, 9.65vw, 185px);
+  padding-right: max(24px, env(safe-area-inset-right, 0px));
+}
+
+@media (min-width: 1280px) {
+  .homeHeroInner {
+    padding-right: max(
+      env(safe-area-inset-right, 0px),
+      clamp(40px, 3.25vw, 64px)
+    );
+  }
+}
+
+.homeHeroContent {
+  max-width: min(640px, 100%);
+  animation: homeHeroContentIn 0.8s ease-out both;
+}
+
+.homeHeroList {
+  margin: 0;
+  display: flex;
+  flex-direction: column;
+  gap: clamp(14px, 2vw, 18px);
+}
+
+.homeHeroListItem {
+  margin: 0;
+  font-size: clamp(14px, 1.05vw, 16px);
+  line-height: 1.85;
+  color: rgba(0, 0, 0, 0.78);
+  text-align: justify;
+}
+
+@keyframes homeHeroSweep {
+  from {
+    transform: translateX(-120%);
+    opacity: 0;
+  }
+  20% {
+    opacity: 1;
+  }
+  to {
+    transform: translateX(120%);
+    opacity: 0;
+  }
+}
+
+@keyframes homeHeroContentIn {
+  from {
+    opacity: 0;
+    transform: translateY(12px);
+  }
+  to {
+    opacity: 1;
+    transform: translateY(0);
+  }
+}
+
+/* 使命 / 愿景 / 价值观 */
+.homeValueSection {
+  padding: 56px 0 72px;
+  background:
+    linear-gradient(
+      180deg,
+      rgba(243, 242, 249, 0.9) 0%,
+      rgba(244, 248, 255, 0.78) 36%,
+      rgba(255, 255, 255, 0.96) 100%
+    );
+}
+
+.homeValueInner {
+  padding: 0 24px;
+}
+
+.homeValueGrid {
+  display: grid;
+  grid-template-columns: repeat(3, minmax(0, 1fr));
+  gap: 20px;
+}
+
+.homeValueCard {
+  position: relative;
+  min-height: 220px;
+  border-radius: 12px;
+  overflow: hidden;
+  color: #ffffff;
+}
+
+/* 使命 / 愿景 / 价值观:直接展示三张图(无文字文案) */
+.homeValueImageCard {
+  position: relative;
+  min-height: 220px;
+  border-radius: 12px;
+  overflow: hidden;
+  background: rgba(0, 47, 167, 0.06);
+}
+
+.homeValueImage {
+  width: 100%;
+  height: 100%;
+  display: block;
+  object-fit: cover;
+}
+
+.homeValueImageOverlay {
+  position: absolute;
+  inset: 0;
+  z-index: 2;
+  display: flex;
+  flex-direction: column;
+  justify-content: space-between;
+  align-items: center;
+  padding: 22px 18px 20px;
+  text-align: center;
+  color: #ffffff;
+  text-shadow: 0 2px 8px rgba(2, 6, 23, 0.55);
+  pointer-events: none;
+}
+
+.homeValueImageTitle {
+  margin-top: 4px;
+  font-size: clamp(34px, 3.2vw, 56px);
+  font-weight: 700;
+  letter-spacing: 2px;
+  line-height: 1;
+}
+
+.homeValueImageDesc {
+  font-size: clamp(15px, 1.15vw, 24px);
+  font-weight: 700;
+  line-height: 1.25em;
+  height: 2.5em;
+}
+
+.homeValueCard--mission {
+  background: linear-gradient(
+      rgba(15, 35, 70, 0.55),
+      rgba(15, 35, 70, 0.55)
+    ),
+    linear-gradient(135deg, #1a3a6e 0%, #4a7bc8 100%);
+}
+
+.homeValueCard--vision {
+  background: linear-gradient(
+      rgba(40, 30, 20, 0.5),
+      rgba(40, 30, 20, 0.5)
+    ),
+    linear-gradient(135deg, #8b6914 0%, #d4a853 45%, #2a4a7a 100%);
+}
+
+.homeValueCard--values {
+  background: linear-gradient(
+      rgba(20, 20, 25, 0.55),
+      rgba(20, 20, 25, 0.55)
+    ),
+    linear-gradient(135deg, #1f2937 0%, #4b5563 100%);
+}
+
+.homeValueCardInner {
+  position: relative;
+  z-index: 1;
+  height: 100%;
+  padding: 28px 22px 32px;
+  display: flex;
+  flex-direction: column;
+  justify-content: flex-end;
+  text-align: center;
+}
+
+.homeValueTitle {
+  margin: 0 0 12px;
+  font-size: 28px;
+  font-weight: 700;
+  letter-spacing: 4px;
+}
+
+.homeValueDesc {
+  margin: 0;
+  font-size: 15px;
+  line-height: 1.65;
+  opacity: 0.95;
+}
+
+/* 业务与能力 · 深色三栏 */
+.homeBizSection {
+  padding: 72px 0 88px;
+  background: #070d18;
+  color: #e8edf5;
+}
+
+.homeBizInner {
+  padding: 0 24px;
+}
+
+.homeBizHeading {
+  margin: 0;
+  text-align: center;
+  font-size: 30px;
+  font-weight: 700;
+  letter-spacing: 2px;
+  color: #ffffff;
+}
+
+.homeBizSub {
+  margin: 14px auto 0;
+  max-width: 720px;
+  text-align: center;
+  font-size: 15px;
+  line-height: 1.75;
+  color: rgba(232, 237, 245, 0.65);
+}
+
+.homeBizPills {
+  margin-top: 28px;
+  display: flex;
+  flex-wrap: wrap;
+  justify-content: center;
+  gap: 10px;
+}
+
+.homeBizPill {
+  appearance: none;
+  border: 1px solid rgba(120, 160, 220, 0.35);
+  background: rgba(255, 255, 255, 0.04);
+  color: rgba(232, 237, 245, 0.85);
+  padding: 8px 18px;
+  border-radius: 999px;
+  font-size: 14px;
+  cursor: pointer;
+  transition:
+    background 0.2s,
+    border-color 0.2s,
+    color 0.2s;
+}
+
+.homeBizPill:hover {
+  border-color: rgba(160, 190, 255, 0.55);
+  background: rgba(255, 255, 255, 0.08);
+}
+
+.homeBizPillActive {
+  color: #ffffff;
+  border-color: rgba(26, 107, 255, 0.85);
+  background: rgba(26, 107, 255, 0.35);
+  font-weight: 600;
+}
+
+.homeBizLayout {
+  margin-top: 28px;
+  display: grid;
+  grid-template-columns: minmax(0, 1fr) 112px 112px;
+  gap: 16px;
+  align-items: stretch;
+}
+
+.homeBizMain {
+  border-radius: 14px;
+  background: linear-gradient(
+    145deg,
+    rgba(0, 82, 217, 0.12) 0%,
+    rgba(8, 18, 40, 0.95) 55%
+  );
+  border: 1px solid rgba(80, 120, 200, 0.25);
+  overflow: hidden;
+}
+
+.homeBizMainInner {
+  padding: 32px 32px 36px;
+}
+
+.homeBizTag {
+  display: inline-flex;
+  align-items: center;
+  gap: 8px;
+  font-size: 13px;
+  color: rgba(180, 210, 255, 0.95);
+  margin-bottom: 16px;
+}
+
+.homeBizTagIcon {
+  font-size: 16px;
+  opacity: 0.9;
+}
+
+.homeBizTitle {
+  margin: 0;
+  font-size: 26px;
+  font-weight: 700;
+  color: #ffffff;
+  line-height: 1.35;
+}
+
+.homeBizLead {
+  margin: 10px 0 0;
+  font-size: 15px;
+  line-height: 1.65;
+  color: rgba(232, 237, 245, 0.72);
+}
+
+.homeBizList {
+  margin: 22px 0 0;
+  padding-left: 18px;
+  font-size: 15px;
+  line-height: 1.75;
+  color: rgba(232, 237, 245, 0.88);
+}
+
+.homeBizListItem {
+  margin-bottom: 14px;
+}
+
+.homeBizList:last-child .homeBizListItem:last-child {
+  margin-bottom: 0;
+}
+
+.homeBizListLabel {
+  font-weight: 600;
+  color: #ffffff;
+}
+
+.homeBizActions {
+  margin-top: 28px;
+  display: flex;
+  justify-content: flex-end;
+}
+
+.homeBizBtn {
+  display: inline-flex;
+  align-items: center;
+  gap: 8px;
+  padding: 10px 22px;
+  border: 0;
+  border-radius: 8px;
+  font-size: 15px;
+  font-weight: 600;
+  color: #ffffff;
+  background: #1a6bff;
+  cursor: pointer;
+  transition: background 0.2s, transform 0.15s;
+}
+
+.homeBizBtn:hover {
+  background: #3d82ff;
+}
+
+.homeBizBtn:active {
+  transform: scale(0.98);
+}
+
+.homeBizBtnIcon {
+  font-size: 13px;
+}
+
+.homeBizRail {
+  appearance: none;
+  border: 0;
+  border-radius: 12px;
+  cursor: pointer;
+  padding: 16px 12px;
+  color: #ffffff;
+  font-size: 16px;
+  font-weight: 600;
+  writing-mode: vertical-rl;
+  text-orientation: mixed;
+  letter-spacing: 4px;
+  transition: box-shadow 0.2s, transform 0.15s;
+}
+
+.homeBizRail--mid {
+  background: linear-gradient(
+      rgba(0, 0, 0, 0.35),
+      rgba(0, 0, 0, 0.35)
+    ),
+    linear-gradient(180deg, #2a3444 0%, #0f141c 100%);
+  border: 1px solid rgba(120, 140, 180, 0.25);
+}
+
+.homeBizRail--last {
+  background: linear-gradient(
+      rgba(0, 0, 0, 0.35),
+      rgba(0, 0, 0, 0.35)
+    ),
+    linear-gradient(180deg, #0d3d32 0%, #0a1628 100%);
+  border: 1px solid rgba(80, 180, 160, 0.25);
+}
+
+.homeBizRailActive {
+  box-shadow: 0 0 0 2px rgba(26, 107, 255, 0.75);
+}
+
+.homeBizRailText {
+  display: inline-block;
+}
+
+/* 业务与能力:白底 + 可折叠 5 卡片 */
+.homeBizSection {
+  padding: 72px 0 88px;
+  background: #ffffff;
+  color: #111827;
+}
+
+.homeBizHeading {
+  color: #1f2937;
+}
+
+.homeBizSub {
+  color: rgba(31, 41, 55, 0.55);
+}
+
+.homeBizDeck {
+  margin-top: 34px;
+  display: flex;
+  gap: 12px;
+  align-items: stretch;
+  min-height: 420px;
+}
+
+.homeBizCard {
+  position: relative;
+  overflow: hidden;
+  border-radius: 8px;
+  border: 1px solid rgba(30, 64, 175, 0.08);
+  background: linear-gradient(135deg, #0b1f4f 0%, #102a68 100%);
+  cursor: pointer;
+  flex: 0 0 68px;
+  transition:
+    flex-basis 0.45s ease,
+    box-shadow 0.3s ease,
+    transform 0.25s ease;
+  min-height: 420px;
+}
+
+.homeBizCard:hover {
+  transform: translateY(-2px);
+}
+
+.homeBizCardActive {
+  flex: 1 1 auto;
+  box-shadow: 0 14px 34px rgba(15, 23, 42, 0.12);
+}
+
+.homeBizCardBg {
+  position: absolute;
+  inset: 0;
+  width: 100%;
+  height: 100%;
+  object-fit: cover;
+}
+
+.homeBizCardOverlay {
+  position: absolute;
+  inset: 0;
+  background: linear-gradient(
+    90deg,
+    rgba(2, 8, 23, 0.52) 0%,
+    rgba(2, 8, 23, 0.46) 48%,
+    rgba(2, 8, 23, 0.3) 100%
+  );
+}
+
+.homeBizCard:not(.homeBizCardActive) .homeBizCardOverlay {
+  background: rgba(2, 8, 23, 0.14);
+}
+
+.homeBizMainInner {
+  position: relative;
+  z-index: 2;
+  display: flex;
+  flex-direction: column;
+  height: 100%;
+  padding: 28px 34px 28px;
+  animation: bizFadeIn 0.35s ease;
+}
+
+.homeBizTag,
+.homeBizTitle,
+.homeBizLead,
+.homeBizList,
+.homeBizListLabel {
+  color: #ffffff;
+}
+
+.homeBizTag {
+  margin-bottom: 12px;
+  color: rgba(255, 255, 255, 0.9);
+}
+
+.homeBizTitle {
+  font-size: 38px;
+  line-height: 1.2;
+}
+
+.homeBizLead {
+  margin-top: 8px;
+  color: rgba(255, 255, 255, 0.8);
+}
+
+.homeBizList {
+  margin-top: 14px;
+  font-size: 14px;
+  line-height: 1.85;
+}
+
+.homeBizListItem {
+  margin-bottom: 8px;
+}
+
+.homeBizActions {
+  margin-top: auto;
+}
+
+.homeBizBtn {
+  background: #1e40af;
+  border: 1px solid rgba(255, 255, 255, 0.45);
+}
+
+.homeBizBtn:hover {
+  background: #274ac4;
+}
+
+.homeBizRailLabel {
+  position: absolute;
+  inset: 0;
+  z-index: 2;
+  display: none;
+  align-items: center;
+  justify-content: center;
+  color: #ffffff;
+  font-size: 30px;
+  font-weight: 600;
+  letter-spacing: 2px;
+  writing-mode: vertical-rl;
+  text-orientation: mixed;
+  text-shadow: 0 2px 8px rgba(0, 0, 0, 0.4);
+}
+
+@keyframes bizFadeIn {
+  from {
+    opacity: 0;
+    transform: translateX(8px);
+  }
+  to {
+    opacity: 1;
+    transform: translateX(0);
+  }
+}
+
+/* 选择我们的理由 */
+.homeReasonSection {
+  padding: 72px 0 80px;
+  background: #ffffff;
+}
+
+.homeReasonInner {
+  padding: 0 24px;
+}
+
+.homeReasonHeading {
+  margin: 0 0 40px;
+  text-align: center;
+  font-size: 30px;
+  font-weight: 700;
+  color: #111827;
+  letter-spacing: 2px;
+}
+
+.homeReasonGrid {
+  display: grid;
+  grid-template-columns: minmax(0, 1.05fr) minmax(0, 0.95fr);
+  gap: 48px;
+  align-items: start;
+}
+
+.homeReasonIntro {
+  margin: 0 0 22px;
+  font-size: 16px;
+  line-height: 1.85;
+  color: rgba(0, 0, 0, 0.78);
+  text-align: justify;
+}
+
+.homeReasonList {
+  margin: 0;
+  padding: 0;
+  list-style: none;
+}
+
+.homeReasonListItem {
+  margin-bottom: 14px;
+  font-size: 15px;
+  line-height: 1.75;
+  color: rgba(0, 0, 0, 0.78);
+  text-align: justify;
+}
+
+.homeReasonListTitle {
+  font-weight: 700;
+  color: #111827;
+}
+
+.homeReasonCopy {
+  margin-top: 40px;
+}
+
+.homeReasonMedia {
+  min-height: 280px;
+  width: 100%;
+  object-fit: cover;
+}
+
+/* CTA 条 */
+.homeCtaBand {
+  padding: 56px 0 64px;
+  background-color: #0052d9;
+  background-image: url("../../assets/image/home/bottom_bg1.png");
+  background-repeat: no-repeat;
+  background-size: cover;
+  background-position: center;
+  color: #ffffff;
+  text-align: center;
+}
+
+.homeCtaBandInner {
+  padding: 0 24px;
+  max-width: 880px;
+}
+
+.homeCtaBandTitle {
+  margin: 0;
+  font-size: 22px;
+  font-weight: 700;
+  line-height: 1.5;
+}
+
+.homeCtaBandSub {
+  margin: 14px 0 0;
+  font-size: 15px;
+  opacity: 0.95;
+}
+
+.homeCtaBandBtn {
+  margin-top: 28px;
+  padding: 12px 40px;
+  border: 0;
+  border-radius: 999px;
+  font-size: 16px;
+  font-weight: 600;
+  color: #ffffff;
+  background: #0b2a6e;
+  cursor: pointer;
+  transition: background 0.2s, transform 0.15s;
+}
+
+.homeCtaBandBtn:hover {
+  background: #081f52;
+}
+
+.homeCtaBandBtn:active {
+  transform: scale(0.98);
+}
+
+/* 页脚(全景科技城市底图) */
+.homeFooter {
+  position: relative;
+  padding: 56px 0 40px;
+  overflow: hidden;
+  color: rgba(255, 255, 255, 0.88);
+  background-color: #050a14;
+  background-image: linear-gradient(
+      180deg,
+      rgba(5, 12, 28, 0.35) 0%,
+      rgba(5, 12, 28, 0.55) 100%
+    ),
+    url("../../assets/image/home/footer_bg.png");
+  background-repeat: no-repeat;
+  background-size: cover;
+  background-position: center;
+}
+
+.homeFooterInner {
+  position: relative;
+  z-index: 1;
+  display: grid;
+  grid-template-columns: minmax(0, 1.2fr) minmax(0, 0.9fr) minmax(0, 0.9fr);
+  gap: 40px;
+  padding: 0 24px;
+}
+
+.homeFooterCol {
+  display: flex;
+  flex-direction: column;
+  align-items: flex-start;
+  gap: 10px;
+  font-size: 14px;
+  line-height: 1.65;
+}
+
+.homeFooterCompany {
+  font-size: 16px;
+  font-weight: 600;
+  color: #ffffff;
+}
+
+.homeFooterLine {
+  color: rgba(255, 255, 255, 0.75);
+}
+
+.homeFooterIcp {
+  margin-top: 4px;
+  font-size: 13px;
+  color: rgba(255, 255, 255, 0.55);
+  text-decoration: none;
+}
+
+.homeFooterIcp:hover {
+  color: rgba(255, 255, 255, 0.85);
+}
+
+.homeFooterColTitle {
+  font-size: 15px;
+  font-weight: 700;
+  color: #ffffff;
+  margin-bottom: 4px;
+}
+
+.homeFooterLink {
+  color: rgba(255, 255, 255, 0.75);
+  text-decoration: none;
+  background: none;
+  border: 0;
+  padding: 0;
+  font: inherit;
+  cursor: pointer;
+  text-align: left;
+}
+
+.homeFooterLink:hover {
+  color: #ffffff;
+}
+
+.homeFooterLinkButton {
+  display: block;
+}
+
+@media (max-width: 1024px) {
+  .homeReasonCopy {
+    margin-top: 0;
+  }
+
+  .homeHero {
+    min-height: clamp(320px, 42vh, 540px);
+    background-position: center, 82% center;
+  }
+
+  .homeBizLayout {
+    grid-template-columns: 1fr;
+    gap: 12px;
+  }
+
+  .homeBizDeck {
+    min-height: 360px;
+    gap: 10px;
+  }
+
+  .homeBizCard {
+    flex-basis: 56px;
+    min-height: 360px;
+  }
+
+  .homeBizTitle {
+    font-size: 28px;
+  }
+
+  .homeBizRailLabel {
+    font-size: 24px;
+  }
+
+  .homeBizRail {
+    writing-mode: horizontal-tb;
+    letter-spacing: 1px;
+    min-height: 52px;
+  }
+
+  .homeReasonGrid {
+    grid-template-columns: 1fr;
+  }
+
+  .homeFooterInner {
+    grid-template-columns: 1fr;
+    gap: 32px;
+  }
+}
+
+@media (max-width: 640px) {
+  .homeHero {
+    min-height: clamp(280px, 38vh, 480px);
+    background-position: center, 90% center;
+  }
+
+  .homeValueGrid {
+    grid-template-columns: 1fr;
+  }
+
+  .homeFooterInner {
+    padding: 0 16px;
+  }
+
+  .homeBizMainInner {
+    padding: 18px 16px 20px;
+  }
+
+  .homeBizLayout {
+    margin-top: 32px;
+  }
+
+  .homeBizDeck {
+    min-height: 300px;
+    gap: 8px;
+  }
+
+  .homeBizCard {
+    flex-basis: 44px;
+    min-height: 300px;
+  }
+
+  .homeBizTitle {
+    font-size: 22px;
+  }
+
+  .homeBizLead,
+  .homeBizList {
+    font-size: 12px;
+    line-height: 1.65;
+  }
+
+  .homeBizBtn {
+    padding: 8px 14px;
+    font-size: 13px;
+  }
+
+  .homeBizRailLabel {
+    font-size: 18px;
+  }
+}
+
+@media (max-width: 500px) {
+  .homeBizDeck {
+    flex-direction: column;
+    min-height: auto;
+    gap: 10px;
+  }
+
+  .homeBizCard {
+    flex: none;
+    width: 100%;
+    min-height: 72px;
+  }
+
+  .homeBizCardActive {
+    min-height: 280px;
+  }
+
+  .homeBizRailLabel {
+    display: flex;
+    writing-mode: horizontal-tb;
+    text-orientation: mixed;
+    letter-spacing: 1px;
+    font-size: 16px;
+  }
+}
+
+/* Dark style overrides (layout unchanged) */
+.homePage {
+  background: #020617;
+  color: #e2e8f0;
+}
+
+.homeHero {
+  background-color: #0b1220;
+  background-image: linear-gradient(
+      95deg,
+      rgba(2, 6, 23, 0.74) 0%,
+      rgba(2, 6, 23, 0.34) 52%,
+      rgba(2, 6, 23, 0.08) 100%
+    ),
+    url("../../assets/image/home/hero_bg.png");
+}
+
+.homeHeroListItem {
+  color: rgba(226, 232, 240, 0.9);
+}
+
+.homeValueSection {
+  background: linear-gradient(
+    180deg,
+    rgba(15, 23, 42, 0.98) 0%,
+    rgba(10, 19, 38, 0.98) 100%
+  );
+}
+
+.homeValueImageCard {
+  // border: 1px solid rgba(148, 163, 184, 0.2);
+  background: rgba(30, 41, 59, 0.6);
+}
+
+.homeBizSection {
+  background: #030b1a;
+  color: #e2e8f0;
+}
+
+.homeBizHeading {
+  color: #f8fafc;
+}
+
+.homeBizSub {
+  color: rgba(203, 213, 225, 0.78);
+}
+
+.homeBizCard {
+  border-color: rgba(59, 130, 246, 0.28);
+  background: linear-gradient(135deg, #0a1839 0%, #102a68 100%);
+}
+
+.homeBizCardActive {
+  box-shadow: 0 14px 34px rgba(2, 6, 23, 0.58);
+}
+
+.homeReasonSection {
+  background: linear-gradient(180deg, #071126 0%, #050b1a 100%);
+}
+
+.homeReasonHeading {
+  color: #f8fafc;
+}
+
+.homeReasonIntro,
+.homeReasonListItem {
+  color: rgba(226, 232, 240, 0.86);
+}
+
+.homeReasonListTitle {
+  color: #f8fafc;
+}
+
+.homeReasonMedia {
+  border-color: rgba(59, 130, 246, 0.26);
+  box-shadow: 0 16px 38px rgba(2, 6, 23, 0.62);
+}
+
+.homeCtaBand {
+  background-color: #102a68;
+  background-image: linear-gradient(
+      180deg,
+      rgba(2, 6, 23, 0.28) 0%,
+      rgba(2, 6, 23, 0.48) 100%
+    ),
+    url("../../assets/image/home/bottom_bg1.png");
+  background-blend-mode: multiply, normal;
+}
+
+.homeCtaBandBtn {
+  background: #1d4ed8;
+}
+
+.homeCtaBandBtn:hover {
+  background: #2563eb;
+}

+ 432 - 0
company/src/pages/Home/index.tsx

@@ -0,0 +1,432 @@
+import React, { useEffect, useMemo, useState } from "react";
+import { history } from "@umijs/max";
+import "./index.less";
+import { AppstoreOutlined, RightOutlined } from "@ant-design/icons";
+import { products } from "@/utils/utils";
+import valueMissionImg from "@/assets/image/home/value_mission.png";
+import valueVisionImg from "@/assets/image/home/value_vision.png";
+import valueValuesImg from "@/assets/image/home/value_values.png";
+import bizBgCoreMax from "@/assets/image/home/m3_t1_max.png";
+import bizBgPlatformMax from "@/assets/image/home/m3_t2_max.png";
+import bizBgComplianceMax from "@/assets/image/home/m3_t3_max.png";
+import bizBgResearchMax from "@/assets/image/home/m3_t4_max.png";
+import bizBgServiceMax from "@/assets/image/home/m3_t5_max.png";
+import bizBgCoreSmall from "@/assets/image/home/m3_t1_small.png";
+import bizBgPlatformSmall from "@/assets/image/home/m3_t2_small.png";
+import bizBgComplianceSmall from "@/assets/image/home/m3_t3_small.png";
+import bizBgResearchSmall from "@/assets/image/home/m3_t4_small.png";
+import bizBgServiceSmall from "@/assets/image/home/m3_t5_small.png";
+import reasonMediaImg from "@/assets/image/home/m4_t1.png";
+
+type AdvBullet = { label?: string; value: string };
+
+type BizTab = {
+  key: string;
+  tag: string;
+  heading: string;
+  subHeading: string;
+  bullets: AdvBullet[];
+  largeBgImage: string | null;
+  smallBgImage: string;
+};
+
+const Home: React.FC = () => {
+  const companyIntro = useMemo(
+    () =>
+      [
+        "深圳大方无隅科技有限公司成立于2016年,专注于为智慧城市、教育、医疗、快消、消费电子数码等行业提供技术解决方案与营销服务。",
+        "2021年创立“开邻”品牌,专注渠道价格舆情管控、新媒体内容营销和政企客户软件定制化方向。同时,作为企微生态和抖音生态服务商,通过自研SaaS系统,为客户提供一站式数字化营销服务。",
+        "团队以效率第一的服务宗旨,以精益求精的服务理念,致力于赋能客户AI数字基建与商业价值增长。",
+      ],
+    [],
+  );
+
+  const bizTabs: BizTab[] = useMemo(
+    () => [
+      {
+        key: "core",
+        tag: "核心业务",
+        heading: "互联网信息与数据服务",
+        subHeading: "以平台化能力沉淀,提供稳定可靠的技术服务",
+        largeBgImage: bizBgCoreMax,
+        smallBgImage: bizBgCoreSmall,
+        bullets: [
+          {
+            label: "互联网信息服务",
+            value:
+              "围绕信息服务场景提供系统建设、能力集成与持续迭代。",
+          },
+          {
+            label: "互联网数据服务",
+            value:
+              "提供数据采集、治理、分析与可视化能力,支撑业务决策。",
+          },
+          {
+            label: "计算机系统服务",
+            value: "覆盖架构设计、研发交付、运维保障与安全合规。",
+          },
+          {
+            label: "系统集成",
+            value: "支持多系统对接与联动,帮助企业提升数字化效率。",
+          },
+        ],
+      },
+      {
+        key: "platform",
+        tag: "平台产品",
+        heading: "产品与软件著作权",
+        subHeading: "以自研产品与组件化能力支撑多场景落地",
+        largeBgImage: bizBgPlatformMax,
+        smallBgImage: bizBgPlatformSmall,
+        bullets: [
+          {
+            label: "开邻服务平台",
+            value: "面向企业场景的服务与运营平台能力沉淀。",
+          },
+          {
+            label: "推广员分销软件",
+            value: "围绕推广与分销场景提供业务系统支持。",
+          },
+          {
+            label: "软件著作权",
+            value: "多项软件著作权积累,持续迭代与能力复用。",
+          },
+          {
+            label: "可扩展交付",
+            value: "支持按需定制与本地化部署,适配不同业务与合规要求。",
+          },
+        ],
+      },
+      {
+        key: "compliance",
+        tag: "资源合规",
+        heading: "资质与合规能力",
+        subHeading: "重视合规经营,持续完善资质体系",
+        largeBgImage: bizBgComplianceMax,
+        smallBgImage: bizBgComplianceSmall,
+        bullets: [
+          {
+            label: "互联网药品信息服务",
+            value: "具备互联网药品信息服务资格证书等资质。",
+          },
+          {
+            label: "资质管理",
+            value: "规范资质与流程管理,保障服务交付的可持续与可追溯。",
+          },
+          {
+            label: "信息安全",
+            value: "在产品与交付过程中重视安全与隐私保护要求。",
+          },
+        ],
+      },
+      {
+        key: "research",
+        tag: "研发成果",
+        heading: "研发成果与技术沉淀",
+        subHeading: "面向真实问题持续创新,形成方法与成果",
+        largeBgImage: bizBgResearchMax,
+        smallBgImage: bizBgResearchSmall,
+        bullets: [
+          {
+            label: "专利成果",
+            value:
+              "在网页切分、网络地址置信度评估等方向形成相关技术成果与专利沉淀。",
+          },
+          {
+            label: "工程能力",
+            value: "重视可维护性、可扩展性与稳定性,持续提升工程交付质量。",
+          },
+          {
+            label: "持续迭代",
+            value: "以业务价值为导向,快速响应需求并持续迭代优化。",
+          },
+        ],
+      },
+      {
+        key: "service",
+        tag: "服务能力",
+        heading: "服务与合作方式",
+        subHeading: "以客户目标为中心,提供可落地的解决方案",
+        largeBgImage: bizBgServiceMax,
+        smallBgImage: bizBgServiceSmall,
+        bullets: [
+          { label: "技术咨询与规划", value: "需求梳理、架构规划、方案设计与落地建议。" },
+          { label: "系统研发与交付", value: "项目制交付、驻场支持与长期运维服务。" },
+          { label: "本地化部署", value: "按合规要求支持本地化部署与数据治理。" },
+          { label: "共建合作", value: "围绕业务场景共建产品能力,形成长期价值。" },
+        ],
+      },
+    ],
+    [],
+  );
+
+  const [activeBiz, setActiveBiz] = useState(0);
+
+  const chooseIntro =
+    "团队成员40人左右,其中研发团队占一半;核心成员工作经验均超10年,公司平均年龄30+岁,团队有硕士3人,其中2人是技术岗,本科及以上学历超7成。";
+
+  const chooseBullets = useMemo(
+    () => [
+      { title: "品牌背书", desc: "与各大知名企业合作,客户满意度高。" },
+      { title: "合规资质", desc: "重视资质体系与合规要求,保障服务可持续。" },
+      { title: "技术研发", desc: "聚焦真实业务问题,持续研发并形成成果沉淀。" },
+      { title: "服务体系", desc: "支持咨询、交付、运维与本地化部署等合作方式。" },
+    ],
+    [],
+  );
+
+  const scrollToId = (id: string) => {
+    if (typeof document === "undefined") return;
+    const node = document.getElementById(id);
+    node?.scrollIntoView({ behavior: "smooth", block: "start" });
+  };
+
+  useEffect(() => {
+    const sections = Array.from(
+      document.querySelectorAll<HTMLElement>(".homeReveal"),
+    );
+    if (!sections.length) return;
+
+    const observer = new IntersectionObserver(
+      (entries) => {
+        entries.forEach((entry) => {
+          if (!entry.isIntersecting) return;
+          entry.target.classList.add("is-visible");
+          observer.unobserve(entry.target);
+        });
+      },
+      { threshold: 0.16, rootMargin: "0px 0px -8% 0px" },
+    );
+
+    sections.forEach((el) => observer.observe(el));
+    return () => observer.disconnect();
+  }, []);
+
+  return (
+    <div className="homePage">
+      <section className="homeHero" id="about-intro">
+        <div className="homeHeroInner">
+          <div className="homeHeroContent">
+            <div className="homeHeroList">
+              {companyIntro.map((item, idx) => (
+                <p className="homeHeroListItem" key={idx}>
+                  {item}
+                </p>
+              ))}
+            </div>
+          </div>
+        </div>
+      </section>
+
+      <section className="homeValueSection homeReveal">
+        <div className="homeContainer homeValueInner">
+          <div className="homeValueGrid">
+            <article className="homeValueImageCard">
+              <img
+                src={valueMissionImg}
+                alt=""
+                className="homeValueImage"
+                loading="lazy"
+                decoding="async"
+              />
+              <div className="homeValueImageOverlay">
+                <div className="homeValueImageTitle">使命</div>
+                <div className="homeValueImageDesc">做更具价值和效率的服务商</div>
+              </div>
+            </article>
+            <article className="homeValueImageCard">
+              <img
+                src={valueVisionImg}
+                alt=""
+                className="homeValueImage"
+                loading="lazy"
+                decoding="async"
+              />
+              <div className="homeValueImageOverlay">
+                <div className="homeValueImageTitle">愿景</div>
+                <div className="homeValueImageDesc">用服务展现科技与营销价值,助力客户高质量发展</div>
+              </div>
+            </article>
+            <article className="homeValueImageCard">
+              <img
+                src={valueValuesImg}
+                alt=""
+                className="homeValueImage"
+                loading="lazy"
+                decoding="async"
+              />
+              <div className="homeValueImageOverlay">
+                <div className="homeValueImageTitle">价值观</div>
+                <div className="homeValueImageDesc">客户第一、主动思考、说到做到、成长传承</div>
+              </div>
+            </article>
+          </div>
+        </div>
+      </section>
+
+      <section className="homeBizSection homeReveal" aria-labelledby="biz-title">
+        <div className="homeContainer homeBizInner">
+          <h2 id="biz-title" className="homeBizHeading">
+            业务与能力
+          </h2>
+          <p className="homeBizSub">
+            以产品、资质与研发能力为基础,提供可落地的技术服务与解决方案。
+          </p>
+
+          <div className="homeBizDeck" role="tablist" aria-label="业务分类">
+            {bizTabs.map((tab, idx) => {
+              const isActive = idx === activeBiz;
+              const currentBg = isActive ? tab.largeBgImage : tab.smallBgImage;
+              return (
+                <article
+                  key={tab.key}
+                  role="tab"
+                  aria-selected={isActive}
+                  className={isActive ? "homeBizCard homeBizCardActive" : "homeBizCard"}
+                  onClick={() => setActiveBiz(idx)}
+                >
+                  {currentBg ? (
+                    <img
+                      className="homeBizCardBg"
+                      src={currentBg}
+                      alt={tab.tag}
+                      loading="lazy"
+                      decoding="async"
+                    />
+                  ) : null}
+                  <div className="homeBizCardOverlay" />
+                  {isActive ? (
+                    <div className="homeBizMainInner">
+                      <div className="homeBizTag">
+                        <AppstoreOutlined className="homeBizTagIcon" />
+                        <span>{tab.tag}</span>
+                      </div>
+                      <h3 className="homeBizTitle">{tab.heading}</h3>
+                      <p className="homeBizLead">{tab.subHeading}</p>
+                      <ul className="homeBizList">
+                        {tab.bullets.map((b, bulletIdx) => (
+                          <li className="homeBizListItem" key={`${b.label}-${bulletIdx}`}>
+                            {b.label ? (
+                              <span className="homeBizListLabel">
+                                {b.label}
+                                {b.value ? ":" : ""}
+                              </span>
+                            ) : null}
+                            {b.value}
+                          </li>
+                        ))}
+                      </ul>
+                      <div className="homeBizActions">
+                        <button
+                          type="button"
+                          className="homeBizBtn"
+                          onClick={(e) => {
+                            e.stopPropagation();
+                            history.push("/solution");
+                          }}
+                        >
+                          联系我们
+                          <RightOutlined className="homeBizBtnIcon" />
+                        </button>
+                      </div>
+                    </div>
+                  ) : (
+                    <div className="homeBizRailLabel">{tab.tag}</div>
+                  )}
+                </article>
+              );
+            })}
+          </div>
+        </div>
+      </section>
+
+      <section className="homeReasonSection homeReveal" id="reasons" aria-labelledby="reason-title">
+        <div className="homeContainer homeReasonInner">
+          <h2 id="reason-title" className="homeReasonHeading">
+            选择我们的理由
+          </h2>
+          <div className="homeReasonGrid">
+            <div className="homeReasonCopy">
+              <p className="homeReasonIntro">{chooseIntro}</p>
+              <ul className="homeReasonList">
+                {chooseBullets.map((item) => (
+                  <li key={item.title} className="homeReasonListItem">
+                    <span className="homeReasonListTitle">{item.title}:</span>
+                    {item.desc}
+                  </li>
+                ))}
+              </ul>
+            </div>
+            <img
+              className="homeReasonMedia"
+              src={reasonMediaImg}
+              alt="数字化团队能力示意"
+              loading="lazy"
+              decoding="async"
+            />
+          </div>
+        </div>
+      </section>
+
+      <section className="homeCtaBand homeReveal" id="cta">
+        <div className="homeContainer homeCtaBandInner">
+          <h2 className="homeCtaBandTitle">
+            欢迎联系合作,共建有价值的技术与数据能力
+          </h2>
+          <p className="homeCtaBandSub">技术研发 · 数据服务 · 系统交付</p>
+          <button
+            type="button"
+            className="homeCtaBandBtn"
+            onClick={() => history.push("/solution")}
+          >
+            联系我们
+          </button>
+        </div>
+      </section>
+
+      <footer className="homeFooter homeReveal" id="site-footer">
+        <div className="homeContainer homeFooterInner">
+          <div className="homeFooterCol">
+            <div className="homeFooterCompany">深圳大方无隅科技有限公司</div>
+            <div className="homeFooterLine">联系邮箱:bd@dotouch.tech</div>
+            <a
+              className="homeFooterIcp"
+              href="https://beian.miit.gov.cn/"
+              target="_blank"
+              rel="noreferrer"
+            >
+              粤ICP备2024220172号
+            </a>
+          </div>
+          <div className="homeFooterCol">
+            <div className="homeFooterColTitle">产品</div>
+            {products.map((product) => (
+              <a key={product.name} className="homeFooterLink" href={product.url} target="_blank" rel="noreferrer">
+                {product.name}
+              </a>
+            ))}
+          </div>
+          <div className="homeFooterCol">
+            <div className="homeFooterColTitle">关于我们</div>
+            <button
+              type="button"
+              className="homeFooterLink homeFooterLinkButton"
+              onClick={() => scrollToId("about-intro")}
+            >
+              公司简介
+            </button>
+            <button
+              type="button"
+              className="homeFooterLink homeFooterLinkButton"
+              onClick={() => history.push("/solution")}
+            >
+              联系我们
+            </button>
+          </div>
+        </div>
+      </footer>
+    </div>
+  );
+};
+
+export default Home;

+ 104 - 0
company/src/pages/Privacy/index.less

@@ -0,0 +1,104 @@
+.policyPage {
+  width: 100%;
+  background: #ffffff;
+  color: rgba(0, 0, 0, 0.88);
+}
+
+.policyContainer {
+  padding: 48px 24px 72px;
+}
+
+.policyTitleTime {
+  text-align: center;
+  font-size: 14px;
+  font-weight: 400;
+  margin-bottom: 20px;
+}
+
+.policyTitle {
+  text-align: center;
+  font-size: 22px;
+  font-weight: 700;
+  margin-bottom: 20px;
+}
+
+.policyContent {
+  font-size: 14px;
+  line-height: 1.9;
+  color: rgba(0, 0, 0, 0.82);
+}
+
+.policyList {
+  margin: 0;
+  padding-left: 22px;
+}
+
+.policyListItem {
+  margin: 10px 0;
+}
+
+.policyHeading {
+  font-weight: 700;
+}
+
+.policyParagraph {
+  margin: 0;
+}
+
+.main-title {
+  text-align: center;
+  font-size: 28px;
+  margin-bottom: 15px;
+  font-weight: bold;
+}
+.update-time {
+  text-align: center;
+  font-size: 16px;
+  color: #666;
+  margin-bottom: 30px;
+}
+.subtitle {
+  font-size: 20px;
+  font-weight: bold;
+  margin: 35px 0 15px 0;
+  color: #222;
+  border-bottom: 1px solid #eee;
+  padding-bottom: 8px;
+}
+.level1-title {
+  font-size: 18px;
+  font-weight: bold;
+  margin: 25px 0 12px 0;
+  color: #222;
+}
+.level2-item {
+  font-size: 16px;
+  margin: 12px 0;
+  text-align: justify;
+  padding-left: 10px;
+}
+.level3-list {
+  list-style: none;
+  margin: 8px 0;
+}
+.level3-list li {
+  margin: 6px 0;
+  text-align: justify;
+}
+.level3-list li::before {
+  content: "1) ";
+  display: inline-block;
+  margin-right: 5px;
+}
+.tip-clause {
+  font-size: 16px;
+  line-height: 1.8;
+  text-align: justify;
+  margin-bottom: 20px;
+}
+
+@media (max-width: 640px) {
+  .policyContainer {
+    padding: 40px 16px 64px;
+  }
+}

+ 486 - 0
company/src/pages/Privacy/index.tsx

@@ -0,0 +1,486 @@
+import React from "react";
+import "./index.less";
+
+const Privacy: React.FC = () => {
+  return (
+    <div className="policyPage">
+      <div className="policyContainer">
+        <div className="policyTitle">开邻智价云隐私协议</div>
+        <div className="policyTitleTime">
+          【本次更新时间:2025 年 04 月 03 日】
+        </div>
+        <div className="policyTitle">提示条款</div>
+        <div className="policyContent">
+          <div className="tip-clause">
+            欢迎您使用开邻智数(“我们”)产品和服务!您的信任对我们非常重要,我们深知个人信息对您的重要性,我们将严格遵守按法律法规要求,采取相应安全保护措施,尽力保护您的个人信息安全可控。
+            鉴此,我们制定本《隐私保护政策》(下称“本政策”)帮助您充分了解在您使用我们产品
+            和服务的过程中,我们会如何处理您的个人信息以及您可以如何管理您的个人信息,以便您更好地作出适当的选择。
+          </div>
+          <div className="tip-clause">
+            在使用开邻智数前,请您务必仔细阅读并透彻理解本政策,确保您充分理解和同意之后再开始使用。在确认充分理解并同意后使用相关产品或服务。
+            一旦您开始使用我们的各项服务,即表示您
+            已充分理解并同意本政策,如果您不同意本隐私政策的任何内容,建议您立即停止使用我们的产品或服务。
+            如对本政策内容有任何疑问、意见或建议,您可通过客服联系我们。
+          </div>
+          <div className="tip-clause">
+            同时,您在使用开邻智数之前,应当告知您的员工在注册及使用开邻智数期间,开邻智数可能收集和使用员工个人信息,要求其员工认真阅读本隐私政策,并取得其员工对本隐私政策的明确同意。您开始或继续使用我们提供的产品或服务时,我们视为您已经履行上述对员工的告知义务并获取其员工的明确同意。如果后续您的任何员工向我们提出权利主张认为我们侵害了其个人信息权利,由此造成的纠纷和损失应由您负责解决和赔偿。
+          </div>
+
+          <div className="subtitle">第一部分 定义</div>
+          <div className="level2-item">
+            1.1 开邻智数服务提供者:深圳大方无隅科技有限公司
+          </div>
+          <div className="level2-item">
+            1.2
+            “开邻智数”:是一款基于企业微信的数字化运营管理平台,为企业提供智能营销、销售、服务为一体的数字化解决方案。
+          </div>
+          <div className="level2-item">
+            1.3
+            关联公司:指由服务提供者直接或者间接控制、直接或者间接控制服务提供者、与服务提供者共同直接或者间接被控制的第三方主体。
+          </div>
+          <div className="level2-item">
+            1.4 您:在本政策中主要指我们的客户,即委托我们提供技术服务的企业。
+          </div>
+          <div className="level2-item">
+            1.5
+            终端用户:是指使用企业微信及微信平台的自然人或由自然人代表进行前述操作的组织体。
+          </div>
+          <div className="level2-item">
+            1.6
+            数据:是指我们为您提供服务中涉及的数据,在本政策中将根据上下文可能指您主动提供的数据、我们在为您服务过程中产生的数据、第三方向我们提供的经您及您的终端用户合法授权的数据以及公开渠道合法获取的数据,这些数据都将用于优化我们的产品向您提供更优质的服务。
+          </div>
+          <div className="level2-item">
+            1.7
+            Cookie:是指在终端用户访问网站或观看其他网络内容时,由服务器端生成,发送到用户的浏览器内的包含字符串的文本文件。终端用户可以通过浏览器设置是否保存这些文本文件。
+          </div>
+          <div className="level2-item">
+            1.8
+            个人信息:个人信息是以电子或者其他方式记录的与已识别或者可识别的自然人有关的各种信息,不包括匿名化处理后的信息。
+          </div>
+          <div className="level2-item">
+            1.9
+            敏感个人信息:敏感个人信息是一旦泄露或者非法使用,容易导致自然人的人格尊严受到侵害或者人身、财产安全受到危害的个人信息,包括生物识别、宗教信仰、特定身份、医疗健康、金融账户、行踪轨迹信息,以及不满十四周岁未成年人的个人信息。
+          </div>
+          <div className="level2-item">
+            1.10
+            匿名化:是指通过对个人信息的技术处理,使得个人信息主体无法被识别或关联,且处理后的信息不能被复原的过程。个人信息经匿名化处理后所得的信息不属于个人信息。
+          </div>
+          <div className="level2-item">
+            1.11
+            委托处理:是指个人信息处理者将处理个人信息的事务委托给其他组织和个人,双方成立委托合同关系,由受托人在委托范围和目的内为委托人处理个人信息。
+          </div>
+
+          <div className="subtitle">第二部分 隐私保护政策内容</div>
+          <div className="tip-clause">
+            本政策将帮助您了解以下内容:一、本政策适用范围
+            二、我们如何处理个人信息 三、我们如何对外提供个人信息
+            四、我们如何存储您的个人信息 五、我们如何保护您的个人信息
+            六、您的权利 七、如何使用 cookie 及同类技术 八、未成年人权利保护
+            九、数据的跨境转移 十、本隐私协议的改动
+          </div>
+
+          <div className="level1-title">一、本政策适用范围</div>
+          <div className="level2-item">
+            1.1
+            本政策适用于开邻智数在提供产品与服务中,客户、意向客户以及前述各方的员工、代表与代理人提供的的个人信息。
+          </div>
+          <div className="level2-item">
+            1.2 本政策适用于我们通过所有网络平台(如:
+            http://saas.kirin.wiki/以及我们可接达的网站、第三方网络平台、移动应用程序、社交应用等。)
+          </div>
+
+          <div className="level1-title">二、我们如何处理个人信息</div>
+          <div className="level2-item">2.1 我们会在以下场景处理个人信息:</div>
+          <div className="level2-item">
+            2.2 用户注册
+            <ul className="level3-list">
+              <li>
+                当您使用开邻智数时,需要通过企业微信账号与开邻智数建立关联,可能涉及获取您的头像昵称、你本人的手机号码,以及您授权使用开邻智数的企业信息。
+              </li>
+              <li>
+                为了帮助您完成开邻智数相关的配置,您指定且已取得合法授权的个人用户在注册过程中需要填写本人的手机号,以便我们的工作人员联系您进行功能的配置。
+              </li>
+              <li>
+                您也可以为其他人订购产品或服务,您需要提供该实际订购人的前述个人信息。向我们提供该实际订购人的前述个人信息之前,您需确保您已经取得其授权,同意您及我们使用该等个人信息。
+                您可以决定不提供上述信息,或要求删除之前提供的信息。但是,我们将因此无法完成相关交付服务。
+                我们还会使用上述信息向您或实际订购人提供相关的客服服务或开展满意度调查,内部审计、数据分析和研究。
+              </li>
+            </ul>
+          </div>
+          <div className="level2-item">2.3 向您提供产品或服务</div>
+          <div className="level2-item">
+            2.4 您委托我们处理的个人信息
+            <ul className="level3-list">
+              <li>
+                您在使用开邻智数服务期间,委托我们处理个人信息的,您应当保证该等数据来源合法且已获得个人信息主体同意,不存在违法获取、使用、泄露个人信息等情形。您应确保委托处理目的和方式合法合规,如因此违法或者造成我们或第三方损失的,由您自行承担相应责任。同时,若在前述数据在委托我们处理前,已发生数据泄露、损毁、丢失或篡改等数据安全事件,应由您自行承担相应的责任。为进一步保证本款的内容,如我们要求,您应及时提供相关证明、协议或资质证照等。您理解并确认:我们对您提交的证明、协议或资质证照的查阅仅为形式查阅,即使我们进行过查阅,不代表我们有义务或有能力确认您对数据的合法收集、披露或使用,您应自觉保证并遵守在本款的承诺和保证。
+              </li>
+              <li>
+                上述处理情形包括但不限于:您在配置企业时,需通过企业微信扫码授权开邻智数的第三方应用并设置员工可见
+                范围,应用授权范围包括:通讯录基本只读权限、企业客户权限、成员敏感信息权限,可获取可见范围内企业组织架构信息和成员基本信息(userid、姓名、性别、部门
+                ID、职位、关注状态)、可见范围内成员添加客户的基本信息(客户和客户群列表、昵称、备注、标签)、可见范围内成员联系客户数据。
+              </li>
+              <li>
+                因第三方应用和自建应用的接口差异,为了满足企业更多定制化需求和数据打通相关需求,您在使用过程中还需完成开邻自建应用的授权和配置,并设置应用可见范围,开邻智数通过自建应用授权可获取信息:①可见范围内成员信息:userid、成员名称、手机号码、职务信息、性别、邮箱、头像、地址、企业微信对外二维码基本信息;
+                ②可见范围内成员添加的客户信息:userid、名称、头像、unionID、类型、性别、备注、企业、描述、标签;
+              </li>
+              <li>
+                我们的相关工作人员可以使用上述信息与相关成员联系,以便向相关成员介绍我们的产品功能以及其他产品信息。您可以以书面或邮件形式通知我们不允许我们使用上述信息,但如果您这样做,可能会影响您获得、使用、购买我们产品或服务的体验或精准度,或者影响我们产品的正常运行。
+              </li>
+            </ul>
+          </div>
+          <div className="level2-item">
+            2.5 我们在您使用服务过程中处理的个人信息
+            <ul className="level3-list">
+              <li>
+                身份信息:为满足某些使用场景下的功能要求(例如个人名片功能),我们会要求您在使用相关功能前,配置您已取得合法授权的个人用户的身份信息,包括昵称、头像、手机号、邮箱、职位、地址。
+              </li>
+              <li>
+                设备信息:我们会根据您在软件安装及使用中授予的具体权限,接收并记录您已取得合法授权的个人用户所使用的设备相关信息(例如设备型号、操作系统版本、设备设置、唯一设备标识符)、设备所在位置相关信息(例如
+                IP 地址、GPS 位置以及能够提供相关信息的 WLAN
+                接入点、蓝牙和基站)。
+              </li>
+              <li>
+                日志信息:当您使用我们的网站或客户端提供的产品或服务时,我们会自动收集您已取得合法授权的个人用户对我们服务的详细使用情况,作为有关网络日志保存。例如您已取得合法授权的个人用户搜索查询内容、IP
+                地址、浏览器的类型、电信运营商、使用的语言、访问日期和时间及您已取得合法授权的个人用户访问的网页记录。
+              </li>
+              <li>
+                订单信息:为展示您账户的订单信息,我们会收集您已取得合法授权的个人用户在使用我们服务过程中产生的订单信息用于向按照您的要求展示及便于您对订单进行管理。
+              </li>
+              <li>
+                联系方式:与我们联系时,我们可能会保存通信/通话记录和内容或您/您指定且已取得合法授权的个人用户留下的联系方式,以便与您联系或帮助您解决问题,或记录相关问题的处理方案及结果。您或对应个人可以决定不提供上述信息,或要求删除之前提供的信息。但是,如果您这样做,可能会影响您获得、使用、购买我们产品或服务的体验或者精准度,或者会影响我们的网络平台的正常运行。
+              </li>
+              <li>
+                活动页面授权。您在使用由开邻智数提供的 H5
+                页面时,需进行公众号授权,点击允许后开邻智数将获取您已取得合法授权的个人的微信账号的头像、昵称、unionID,以便我们按照您的要求统计参加活动的数据。
+              </li>
+            </ul>
+          </div>
+          <div className="level2-item">
+            2.6 我们通过间接获得方式收集到的个人信息
+            <ul className="level3-list">
+              <li>
+                为确认交易状态及为您提供售后与争议解决服务,我们会通过您基于交易所选择的交易对象、支付机构、物流公司、第三方平台收集与交易进度、服务或产品相关的交易、支付、物流信息,或将上述交易信息提供给上述服务提供者。
+              </li>
+              <li>
+                您可通过开邻智数账号在我们提供的链接入口使用我们关联公司提供的产品或服务,为便于我们基于关联账号共同向您提供一站式服务并便于您统一进行管理,我们在开邻智数集中展示您的信息或推荐您感兴趣的信息。
+              </li>
+              <li>
+                当您通过我们产品或服务使用上述服务时,应当保证该等数据来源合法且已获得个人信息主体同意,不存在违法获取、使用、泄露个人信息等情形。
+              </li>
+              <li>
+                您可以决定不提供上述信息,或要求删除之前提供的信息。但是,如果您这样做,可能会影响您获得、使用、购买我们产品或服务的体验或者精准度,或者会影响我们的网络平台的正常运行。
+              </li>
+            </ul>
+          </div>
+          <div className="level2-item">
+            2.7 为您提供安全保障
+            <ul className="level3-list">
+              <li>
+                为提高您使用我们及我们关联公司、合作伙伴提供服务的安全性,保护您或其他用户或公众的人身财产安全免遭侵害,更好地预防钓鱼网站、欺诈、网络漏洞、计算机病毒、网络攻击、网络侵入等安全风险,更准确地识别违反法律法规或开邻智数相关协议规则的情况,我们可能使用或整合您的会员信息、交易信息、
+                设备信息、有关网络日志以及我们关联公司、合作伙伴取得您授权或依据法律共享的信息,来综合判断您账户及交易风险、进行身份验证、检测及防范安全事件,并依法采取必要的记录、审计、分析、处置措施。
+              </li>
+            </ul>
+          </div>
+          <div className="level2-item">
+            2.8 其他用途
+            <ul className="level3-list">
+              <li>
+                当我们要将信息用于本政策未载明的其他用途时,会事先征求您的同意。
+              </li>
+            </ul>
+          </div>
+          <div className="level2-item">
+            2.9 征得授权同意的例外
+            <ul className="level3-list">
+              <li>与国家安全、国防安全有关的;</li>
+              <li>与公共安全、公共卫生、重大公共利益有关的;</li>
+              <li>与犯罪侦查、起诉、审判和判决执行等有关的;</li>
+              <li>
+                出于维护您或其他个人的生命、财产等重大合法权益但又很难得到您本人同意的;
+              </li>
+              <li>所收集的个人信息是您自行向社会公众公开的;</li>
+              <li>
+                从合法公开披露的信息中收集个人信息的,如合法的新闻报道、政府信息公开等渠道;
+              </li>
+              <li>
+                用于维护所提供的产品或服务的安全稳定运行所必需的,例如发现、处置产品或服务故障;
+              </li>
+              <li>法律法规规定的其他情形。</li>
+            </ul>
+          </div>
+          <div className="level2-item">
+            2.10 重要提示
+            <ul className="level3-list">
+              <li>
+                如所有的企业都可能面临的问题一样,考虑到信息技术、网络空间本身的特点,在某些特殊情况下(例如黑客攻击、电信故障等),尽管我们采取了法律法规等规定的必要的措施,但仍然存在个人信息泄露的风险。
+              </li>
+              <li>
+                除非本隐私政策有其他规定,为了保护您的人身或财产安全,我们特别提示您不要通过公共网络,向我们或任何以我们名义为您提供服务的第三方,提供您的财产状况、健康生理、账户密码或验证码、通信内容等涉及您人身或财产安全的敏感个人信息。
+              </li>
+            </ul>
+          </div>
+
+          <div className="level1-title">三、我们如何对外提供您的个人信息</div>
+          <div className="level2-item">
+            3.1 共享
+            <ul className="level3-list">
+              <li>
+                我们不会与开邻智数服务提供者以外的公司、组织和个人共享您的个人信息,但以下情况除外:
+              </li>
+              <li>
+                在获取同意的情况下共享:获得您的同意后,我们会与其他方共享您的个人信息。
+              </li>
+              <li>
+                在法定情形下的共享:我们可能会根据法律法规规定、诉讼争议解决需要,或按行政、司法机关依法提出的要求,对外共享您的个人信息。
+              </li>
+            </ul>
+          </div>
+          <div className="level2-item">
+            3.2 转让
+            <ul className="level3-list">
+              <li>
+                我们不会将您的个人信息转让给任何公司、组织和个人,但以下情况除外:
+              </li>
+              <li>
+                在获取明确同意的情况下转让:获得您的明确同意后,我们会向其他方转让您的个人信息;
+              </li>
+              <li>
+                在涉及合并、收购或破产清算情形时,如涉及到个人信息转让,我们会要求新的持有您个人信息的公司、组织继续受本政策的约束,否则我们将要求该公司、组织和个人重新向您征求授权同意。
+              </li>
+            </ul>
+          </div>
+          <div className="level2-item">
+            3.3 公开披露
+            <ul className="level3-list">
+              <li>我们仅会在以下情况下,公开披露您的个人信息:</li>
+              <li>获得您明确同意后;</li>
+              <li>
+                基于法律的披露:在法律、法律程序、诉讼或政府主管部门强制性要求的情况下,我们可能会公开披露您的个人信息。
+              </li>
+            </ul>
+          </div>
+          <div className="level2-item">
+            3.4 委托处理
+            <ul className="level3-list">
+              <li>
+                我们可能委托授权合作伙伴处理您的个人信息,以便授权合作伙伴代表我们为您提供某些服务或履行职能。我们仅会出于本政策声明的合法、正当、必要、特定、明确的目的委托其处理您的信息,授权合作伙伴只能接触到其履行职责所需信息,且我们将会通过协议要求其不得将此信息用于其他任何超出委托范围的目的。如果授权合作伙伴将您的信息用于我们未委托的用途,其将单独征得您的同意。
+              </li>
+              <li>
+                目前,我们委托的授权合作伙伴包括供应商、服务提供商和其他合作伙伴。我们将信息委托给支持我们业务的供应商、服务提供商和其他合作伙伴处理,这些支持包括受我们委托提供的技术基础设施服务、分析我们服务的使用方式、提供客户服务、支付便利或进行学术研究和调查。
+              </li>
+            </ul>
+          </div>
+
+          <div className="level1-title">四、我们如何存储您的信息</div>
+          <div className="level2-item">
+            4.1 存储期限
+            <ul className="level3-list">
+              <li>
+                我们只会在达成本政策所述目的所需的期限内保留您的个人信息,除非法律有强制的留存要求。我们判断个人信息的存储期限主要依据以下标准:
+              </li>
+              <li>
+                向您提供服务的目的、维护相应服务及业务记录,以应对您可能的查询或投诉;
+              </li>
+              <li>保证我们为您提供服务的安全和质量;</li>
+              <li>您是否同意更长的留存期间;</li>
+              <li>是否存在关于保留期限的其他特别约定或法律法规规定。</li>
+              <li>
+                在超出保留期间后,我们会根据适用法律的要求删除或匿名化处理您的个人信息。
+              </li>
+            </ul>
+          </div>
+          <div className="level2-item">
+            4.2 存储位置
+            <ul className="level3-list">
+              <li>
+                我们在中华人民共和国境内运营中收集和产生的个人信息,将存储在中国境内。如我们有向境外实体提供您的个人信息的情形,我们将履行法律规定的以下义务:
+              </li>
+              <li>适用的法律有明确规定;</li>
+              <li>获得您的单独同意;</li>
+              <li>您作为一方当事人合同订立和履行所必需的。</li>
+            </ul>
+          </div>
+
+          <div className="level1-title">五、我们如何保护您个人信息</div>
+          <div className="level2-item">
+            5.1
+            为保障您的信息安全,我们努力采取各种符合业界标准的物理、电子和管理方面的安全措施来保护您的个人信息,防止您的个人信息遭到未经授权访问、公开披露、使用、修改、损坏或丢失。我们会采取一切合理可行的措施,保护您的个人信息。例如在您的浏览器与“服务”之间交换数据(如信用卡信息)时采用
+            SSL 加密保护技术;同时对网站本身提供 https
+            安全浏览方式;使用加密技术确保数据的保密性;使用受信赖的保护机制防止数据遭到恶意攻击;部署访问控制机制,确保只有授权人员才可访问个人信息;以及举办安全和隐私保护培训课程,加强员工对于保护个人信息重要性的认识。
+          </div>
+          <div className="level2-item">
+            5.2
+            互联网并非绝对安全的环境,我们强烈建议您通过安全方式,协助我们保证您的账号安全。互联网环境并非百分之百安全,我们将尽力保护您发送给我们的任何信息的安全性。如果我们的物理、技术、或管理防护设施遭到破坏,导致信息被非授权访问、公开披露、
+            篡改、或毁坏,导致您的合法权益受损,我们将承担相应的法律责任。
+          </div>
+          <div className="level2-item">
+            5.3
+            在不幸发生个人信息安全事件后,我们将按照法律法规的要求,及时向您告知:安全事件的基本情况和可能的影响、我们已采取或将要采取的处置措施、您可自主防范和降低风险的建议、对您的补救措施等。我们将及时将事件相关情况以邮件、信函、电话、推送通知等方式告知您,难以逐一告知个人信息主体时,我们会采取合理、有效的方式发布公告。同时,我们还将按照监管部门要求,主动上报个人信息安全事件的处置情况。
+          </div>
+
+          <div className="level1-title">六、您的权利</div>
+          <div className="level2-item">
+            6.1
+            按照中国相关的法律、法规、标准,以及其他国家、地区的通行做法,我们保障您对自己的个人信息行使以下权利:
+          </div>
+          <div className="level2-item">
+            6.2 访问您的个人信息
+            <ul className="level3-list">
+              <li>
+                您有权访问您的个人信息,法律法规规定的例外情况除外。如果您想行使数据访问权,可以通过以下方式自行访问:
+              </li>
+              <li>
+                账户信息——如果您希望访问或编辑您的账户中的个人资料信息和支付信息、更改您的密码、
+                添加安全信息或关闭您的账户,您可以通过访问开邻智数相关网页执行此类操作。
+              </li>
+              <li>
+                订单信息——您可以在开邻智数中查阅您的订单记录、交易记录。如果您无法通过上述链接访问这些个人信息,您可以随时联系我们的客服。我们将尽快回复您的访问请求。
+              </li>
+            </ul>
+          </div>
+          <div className="level2-item">
+            6.3 更正您的个人信息
+            <ul className="level3-list">
+              <li>
+                当您发现我们处理的关于您的个人信息有错误时,您有权要求我们做出更正。您可以通过上述“6.2
+                访问您的个人信息”中罗列的方式提出更正申请。
+              </li>
+            </ul>
+          </div>
+          <div className="level2-item">
+            6.4 删除您的个人信息
+            <ul className="level3-list">
+              <li>在以下情形中,您可以向我们提出删除个人信息的请求:</li>
+              <li>如果我们处理个人信息的行为违反法律法规;</li>
+              <li>如果我们收集、使用您的个人信息,却未征得您的明确同意;</li>
+              <li>如果我们处理个人信息的行为严重违反了与您的约定;</li>
+              <li>如果您不再使用我们的产品或服务,或您主动注销了账号;</li>
+              <li>如果我们永久不再为您提供产品或服务。</li>
+              <li>
+                若我们决定响应您的删除请求,我们还将同时尽可能通知从我们处获得您的个人信息的主体,要求其及时删除,除非法律法规另有规定,或这些主体获得您的独立授权。
+                当您从我们的服务中删除信息后,我们可能不会立即从备份系统中删除相应的信息,但会在备份更新时删除或匿名化处理这些信息。
+              </li>
+            </ul>
+          </div>
+          <div className="level2-item">
+            6.5 改变您授权同意的范围
+            <ul className="level3-list">
+              <li>
+                每个业务功能需要一些基本的个人信息才能得以完成(见本隐私政策第二条)。除此之外,对于额外个人信息的收集和使用,您可以随时给予或收回您的授权同意。
+              </li>
+              <li>
+                您可以随时通过本政策第十条公示的联系方式联系我们,为保障安全,您可能需要提供书面请求,或以其他方式证明您的身份。我们可能会先要求您验证自己的身份,然后再处理您的请求。我们将在
+                30
+                天内回复您的改变授权同意或者不想接受我们给您发送的商业广告的请求。
+              </li>
+              <li>
+                当您收回同意后,我们将不再处理相应的个人信息。但您收回同意的决定,不会影响此前基于您的授权而开展的个人信息处理。
+                对于您合理的请求,我们原则上不收取费用,但对多次革复、超出合理限度的请求,我们将视情收取一定成本费用。对于无端重复、需要过多技术手段(例如,需要开发新系统或从根本上改变现行惯例)、给他人合法权益带来风险或者非常不切实际(例如,涉及备份磁带上存放的信息)的请求,我们可能会予以拒绝。
+              </li>
+            </ul>
+          </div>
+          <div className="level2-item">
+            6.6 在以下情形中,按照法律法规要求,我们将无法响应您的请求:
+            <ul className="level3-list">
+              <li>与我们履行法律法规规定的义务相关的;</li>
+              <li>与国家安全、国防安全直接相关的;</li>
+              <li>与公共安全、公共卫生、亟大公共利益直接相关的;</li>
+              <li>与犯罪侦查、起诉、审判和判决执行等亘接相关的;</li>
+              <li>有充分证据表明您存在主观恶意或滥用权利的;</li>
+              <li>
+                出于维护个您或其他个人的生命、财产等重大合法权益但又很难得到您本人同意的;
+              </li>
+              <li>
+                响应您的请求将导致您或其他个人、组织的合法权益受到严重损害的。
+              </li>
+              <li>涉及商业秘密的。</li>
+            </ul>
+          </div>
+
+          <div className="level1-title">七、如何使用 Cookie 及同类技术</div>
+          <div className="level2-item">
+            7.1 Cookie
+            <ul className="level3-list">
+              <li>
+                Cookie
+                是一份网站可向您的浏览器发送的数据,之后可能以匿名标签的形式存储在您的计算机中,用以识别计算机信息。开邻智数部分页面会使用由开邻智数发送的
+                Cookies或其他技术,以便在您再次访问网站时提供更好的服务。您可以将浏览器设置成在收到
+                Cookies
+                之前通知您,让您有机会决定是否接受。您还可以将浏览器设置成关闭
+                Cookies。不过,如果您这样做,部分网站功能可能无法正常工作。
+              </li>
+            </ul>
+          </div>
+          <div className="level2-item">
+            7.2 网站信标和像素
+            <ul className="level3-list">
+              <li>
+                开邻智数网页可能包含称为“Web
+                信标”的电子图像(有时也称为单像素图像),便于我们统计访问了这些页面的用户数,并且提供联合品牌化服务。Web
+                信标是我们用来编制网站使用情况,相关合并统计数据的工具。Web
+                信标仅收集有限的信息集,包括
+                Cookie编号、页面查看时间与日期,以及 Web 信标所在的页面描述。
+              </li>
+            </ul>
+          </div>
+
+          <div className="level1-title">八、未成年人权利保护</div>
+          <div className="level2-item">
+            8.1
+            我们非常重视未成年人的个人信息保护。我们向企业级客户提供数据技术服务,我们不接受任何未成年人注册成为我们的用户,也不会主动收集未成年人的个人信息。受制于现有技术和业务模式,我们很难主动识别未成年人的信息,如果未成年人的监护人发现存在未经授权而收集未成年人个人信息,监护人可通知我们予以删除,如我们自己发现前述情形,我们也会主动予以删除。
+          </div>
+          <div className="level2-item">
+            8.2
+            如涉及您的平台面向未成年人开放且有可能收集到未成年人个人信息,请您注意:
+            <ul className="level3-list">
+              <li>
+                请您关注未成年人是否是在取得监护人的授权同意之后使用您的服务。
+              </li>
+              <li>
+                对于经父母或其他监护人同意使用我们的产品或服务而收集未成年人信息的情况,我们只会在法律法规允许、父母或其他监护人明确同意或者保护未成年人所必要
+                的情况下根据您的授权委托收集、使用、共享、转让或披露此信息。
+              </li>
+            </ul>
+          </div>
+
+          <div className="level1-title">九、数据的跨境转移</div>
+          <div className="level2-item">
+            9.1
+            我们在中华人民共和国境内运营中收集和产生的数据将按照法律法规规定存储于中国境内,不会向境外转移。
+          </div>
+
+          <div className="level1-title">十、本隐私政策的改动</div>
+          <div className="level2-item">
+            10.1
+            为给您提供更好的服务,我们的业务将不时变化,本隐私政策也将随之调整。我们会通过在我们官网上发出更新版本或以其他方式提醒您相关内容的更新,也请您访问我们以便及时了解最新的隐私政策。在前述情况下,若您继续使用我们的服务,即表示同意接受修改后的本政策并受之约束。
+          </div>
+          <div className="level2-item">
+            10.2
+            未经您明确同意,我们不会削减您按照本隐私政策所应享有的权利。我们会在本页面上发布对本政策所做的任何变更。对于重大变更,我们还会提供更为显著的通知,您可以在开邻智数官网随时查看。
+          </div>
+          <div className="level2-item">
+            10.3 本政策所指的重大变更包括但不限于:
+            <ul className="level3-list">
+              <li>
+                我们的服务模式发生重大变化。如处理个人信息的目的、处理的个人信息类型、个人信息的使用方式等;
+              </li>
+              <li>
+                我们在所有权结构、组织架构等方面发生重大变化。如业务调整、破产并购等引起的所有者变更等;
+              </li>
+              <li>个人信息共享、转让或公开披露的主要对象发生变化;</li>
+              <li>您参与个人信息处理方面的权利及其行使方式发生重大变化;</li>
+              <li>
+                我们负责处理个人信息安全的责任部门、联络方式及投诉渠道发生变化时;
+              </li>
+              <li>
+                个人信息安全影响评估报告表明存在高风险时。我们还会将本政策的旧版本存档,供您查阅。
+              </li>
+            </ul>
+          </div>
+        </div>
+      </div>
+    </div>
+  );
+};
+
+export default Privacy;

+ 286 - 0
company/src/pages/Solution/index.less

@@ -0,0 +1,286 @@
+.solutionPage {
+  width: 100%;
+  min-height: calc(100vh - 72px);
+  box-sizing: border-box;
+  color: #e2e8f0;
+  background: radial-gradient(
+      900px 520px at 18% 26%,
+      rgba(37, 99, 235, 0.2) 0%,
+      rgba(37, 99, 235, 0) 72%
+    ),
+    linear-gradient(180deg, #020617 0%, #0a1428 55%, #020617 100%);
+}
+
+.solutionContainer {
+  box-sizing: border-box;
+  width: 100%;
+  max-width: 1220px;
+  margin: 0 auto;
+  padding: 0 24px;
+  display: grid;
+  grid-template-columns: minmax(360px, 1fr) minmax(520px, 640px);
+  gap: 54px;
+  align-items: center;
+  min-height: calc(100vh - 190px);
+}
+
+.solutionLeft {
+  padding-top: 24px;
+}
+
+.solutionLeftHead {
+  margin-top: -175px;
+  display: flex;
+  flex-direction: column;
+  gap: 14px;
+}
+
+.solutionTitle {
+  margin: 0;
+  color: #ffffff;
+  font-size: clamp(44px, 4.2vw, 64px);
+  font-weight: 800;
+  line-height: 1.08;
+}
+
+.solutionTitleSub {
+  margin-top: 24px;
+  color: #60a5fa;
+  font-size: clamp(26px, 2.45vw, 42px);
+  font-weight: 700;
+  line-height: 1.15;
+  max-width: 520px;
+}
+
+.solutionDesc {
+  margin: 42px 0 0;
+  color: rgba(203, 213, 225, 0.88);
+  line-height: 1.85;
+  font-size: 18px;
+  max-width: 520px;
+}
+
+.solutionFormCard {
+  background: rgba(15, 23, 42, 0.9);
+  border: 1px solid rgba(71, 85, 105, 0.48);
+  border-radius: 16px;
+  padding: 28px 30px 24px;
+  box-shadow: 0 24px 48px rgba(2, 6, 23, 0.5);
+}
+
+.solutionFormHead {
+  margin-bottom: 24px;
+}
+
+.solutionFormTitle {
+  margin: 0;
+  color: #ffffff;
+  font-size: 42px;
+  font-weight: 700;
+}
+
+.solutionForm {
+  display: flex;
+  flex-direction: column;
+  gap: 18px;
+}
+
+.solutionGrid2 {
+  display: grid;
+  grid-template-columns: 1fr 1fr;
+  gap: 16px;
+}
+
+.solutionField {
+  display: flex;
+  flex-direction: column;
+  gap: 8px;
+}
+
+.solutionLabel {
+  font-size: 12px;
+  font-weight: 600;
+  letter-spacing: 0.04em;
+  color: #ffffff;
+}
+
+.solutionFormItem {
+  margin-bottom: 0 !important;
+}
+
+.solutionInput {
+  background: rgba(2, 6, 23, 0.6) !important;
+  border: 1px solid rgba(71, 85, 105, 0.8) !important;
+  color: #f8fafc !important;
+  border-radius: 10px !important;
+  padding: 11px 14px !important;
+  height: 44px;
+}
+
+.solutionInput::placeholder {
+  color: rgba(148, 163, 184, 0.86) !important;
+}
+
+.solutionCodeWrap {
+  position: relative;
+}
+
+.solutionInputCode {
+  padding-right: 112px !important;
+}
+
+.solutionCodeBtn {
+  position: absolute !important;
+  right: 8px !important;
+  top: 8px !important;
+  bottom: 8px !important;
+  padding: 0 12px !important;
+  border-radius: 8px !important;
+  background: #1d4ed8 !important;
+  color: #e2e8f0 !important;
+  font-weight: 700 !important;
+  border: 0 !important;
+}
+
+.solutionCodeBtn:hover {
+  background: #2563eb !important;
+  color: #ffffff !important;
+}
+
+.solutionAgreeRow {
+  padding-top: 4px;
+}
+
+.solutionAgreeItem {
+  margin-bottom: 0 !important;
+}
+
+.solutionAgreeCheckbox :global(.ant-checkbox-inner) {
+  background: rgba(2, 6, 23, 0.72) !important;
+  border-color: rgba(100, 116, 139, 0.95) !important;
+}
+
+.solutionAgreeText {
+  color: #ffffff;
+  font-size: 12px;
+}
+
+.solutionAgreeLink {
+  color: #60a5fa;
+}
+
+.solutionAgreeLink:hover {
+  text-decoration: underline;
+}
+
+.solutionSubmitBtn {
+  width: 100%;
+  border: 0;
+  border-radius: 10px;
+  background: #1d4ed8;
+  color: #ffffff;
+  font-size: 20px;
+  font-weight: 700;
+  padding: 12px 16px;
+  cursor: pointer;
+  transition: all 0.2s ease;
+}
+
+.solutionBottom {
+  border-top: 1px solid rgba(51, 65, 85, 0.55);
+  background: rgba(2, 6, 23, 0.55);
+  margin-top: 18px;
+}
+
+.solutionBottomInner {
+  max-width: 1220px;
+  margin: 0 auto;
+  padding: 14px 24px 16px;
+  color: rgba(148, 163, 184, 0.9);
+  font-size: 12px;
+  display: grid;
+  grid-template-columns: repeat(4, minmax(0, 1fr));
+  text-align: center;
+}
+
+.solutionSubmitBtn:hover {
+  background: #2563eb;
+}
+
+.solutionSubmitBtn:active {
+  transform: scale(0.99);
+}
+
+.solutionSubmitBtn:disabled {
+  opacity: 0.6;
+  cursor: not-allowed;
+}
+
+.solutionForm :global(.ant-form-item-explain-error) {
+  color: #fca5a5;
+}
+
+@media (max-width: 1024px) {
+  .solutionLeftHead {
+    margin-top: 0;
+  }
+
+  .solutionPage {
+    padding-top: 104px;
+  }
+
+  .solutionContainer {
+    grid-template-columns: 1fr;
+    gap: 24px;
+    min-height: auto;
+  }
+
+  .solutionLeft {
+    padding-top: 0;
+  }
+
+  .solutionTitle {
+    font-size: clamp(32px, 9vw, 52px);
+  }
+
+  .solutionTitleSub {
+    font-size: clamp(22px, 6.6vw, 36px);
+  }
+
+  .solutionDesc {
+    font-size: 16px;
+    margin-top: 24px;
+  }
+
+  .solutionBottomInner {
+    grid-template-columns: repeat(2, minmax(0, 1fr));
+    row-gap: 8px;
+  }
+}
+
+@media (max-width: 640px) {
+  .solutionPage {
+    padding: 104px 0 56px;
+  }
+
+  .solutionFormCard {
+    padding: 20px 16px 16px;
+  }
+
+  .solutionContainer {
+    padding: 0 16px;
+  }
+
+  .solutionGrid2 {
+    grid-template-columns: 1fr;
+  }
+
+  .solutionFormTitle {
+    font-size: 34px;
+  }
+
+  .solutionBottomInner {
+    padding: 12px 16px 14px;
+    font-size: 11px;
+  }
+}

+ 298 - 0
company/src/pages/Solution/index.tsx

@@ -0,0 +1,298 @@
+import { motion } from "motion/react";
+import { useEffect, useRef, useState } from "react";
+import { Button, Checkbox, Form, Input, message } from "antd";
+import { apiRequest, type ApiResponse } from "../../services/request";
+import "./index.less";
+
+const sectionReveal = {
+  initial: { opacity: 0, y: 40 },
+  whileInView: { opacity: 1, y: 0 },
+  viewport: { once: true, amount: 0.25 },
+  transition: { duration: 0.7, ease: "easeOut" as const },
+};
+
+export default function ContactPage() {
+  const [form] = Form.useForm();
+  const [messageApi, contextHolder] = message.useMessage();
+  const [sendingCode, setSendingCode] = useState(false);
+  const [countdown, setCountdown] = useState(0);
+  const [submitting, setSubmitting] = useState(false);
+  const [sentJustNow, setSentJustNow] = useState(false);
+  const sentTimerRef = useRef<number | null>(null);
+
+  useEffect(() => {
+    if (countdown <= 0) return;
+    const timer = window.setInterval(() => {
+      setCountdown((prev) => (prev <= 1 ? 0 : prev - 1));
+    }, 1000);
+    return () => window.clearInterval(timer);
+  }, [countdown]);
+
+  useEffect(() => {
+    return () => {
+      if (sentTimerRef.current) window.clearTimeout(sentTimerRef.current);
+    };
+  }, []);
+
+  const isSuccessResponse = (res: ApiResponse) => {
+    if (res?.code === undefined || res?.code === null || res?.code === "")
+      return true;
+    return ["success"].includes(res.code as string);
+  };
+
+  const handleSendCode = async () => {
+    try {
+      const { phone } = await form.validateFields(["phone"]);
+      setSendingCode(true);
+      const res = await apiRequest("/api/website/lead_message/send_code", {
+        method: "POST",
+        data: { phone },
+      });
+      if (!isSuccessResponse(res)) {
+        messageApi.error(res?.msg || "验证码发送失败,请稍后重试");
+        return;
+      }
+      messageApi.success(res?.msg || "验证码发送成功");
+      setSentJustNow(true);
+      if (sentTimerRef.current) window.clearTimeout(sentTimerRef.current);
+      sentTimerRef.current = window.setTimeout(() => {
+        setSentJustNow(false);
+        setCountdown(60);
+      }, 900);
+    } catch {
+      // form 校验失败时不提示额外文案
+    } finally {
+      setSendingCode(false);
+    }
+  };
+
+  const handleSubmit = async (values: {
+    user_name: string;
+    position?: string;
+    phone: string;
+    code: string;
+    company_name: string;
+    privacy: boolean;
+  }) => {
+    try {
+      setSubmitting(true);
+      const { privacy, ...payload } = values;
+      const res = await apiRequest("/api/website/lead_message/add", {
+        method: "POST",
+        data: payload,
+      });
+      if (!isSuccessResponse(res)) {
+        messageApi.error(res?.msg || "提交失败,请稍后重试");
+        return;
+      }
+      messageApi.success(res?.msg || "提交成功");
+      form.resetFields([
+        "user_name",
+        "position",
+        "phone",
+        "code",
+        "company_name",
+        "privacy",
+      ]);
+      setCountdown(0);
+    } finally {
+      setSubmitting(false);
+    }
+  };
+
+  return (
+    <div className="solutionPage">
+      {contextHolder}
+      <div className="solutionContainer">
+        <motion.div
+          className="solutionLeft"
+          {...sectionReveal}
+        >
+          <motion.div
+            initial={{ opacity: 0, y: 20 }}
+            animate={{ opacity: 1, y: 0 }}
+            className="solutionLeftHead"
+          >
+            <h1 className="solutionTitle">
+              联系我们 <br />
+            </h1>
+            <p className="solutionDesc">
+              填写您的信息,专业顾问将在24小时内与您取得联系,为您提供专属的解决方案。
+            </p>
+          </motion.div>
+        </motion.div>
+
+        <motion.div className="solutionRight" {...sectionReveal}>
+          <motion.div
+            initial={{ opacity: 0, y: 16 }}
+            animate={{ opacity: 1, y: 0 }}
+            className="solutionFormCard"
+          >
+            <div className="solutionFormHead">
+              <h2 className="solutionFormTitle">
+                留下您的信息
+              </h2>
+            </div>
+            <Form
+              form={form}
+              layout="vertical"
+              className="solutionForm"
+              onFinish={handleSubmit}
+            >
+              <div className="solutionGrid2">
+                <div className="solutionField">
+                  <label className="solutionLabel">
+                    称呼
+                  </label>
+                  <Form.Item
+                    name="user_name"
+                    className="solutionFormItem"
+                    rules={[{ required: true, message: "请输入称呼" }]}
+                  >
+                    <Input
+                      className="solutionInput"
+                      placeholder="请输入您的姓名"
+                    />
+                  </Form.Item>
+                </div>
+                <div className="solutionField">
+                  <label className="solutionLabel">
+                    部门和职务(可选)
+                  </label>
+                  <Form.Item name="position" className="solutionFormItem">
+                    <Input
+                      className="solutionInput"
+                      placeholder="例如:销售部 总监"
+                    />
+                  </Form.Item>
+                </div>
+              </div>
+              <div className="solutionGrid2">
+                <div className="solutionField">
+                  <label className="solutionLabel">
+                    手机号
+                  </label>
+                  <Form.Item
+                    name="phone"
+                    className="solutionFormItem"
+                    rules={[
+                      { required: true, message: "请输入手机号" },
+                      {
+                        pattern: /^1\d{10}$/,
+                        message: "请输入正确的11位手机号",
+                      },
+                    ]}
+                  >
+                    <Input
+                      className="solutionInput"
+                      placeholder="请输入手机号码"
+                    />
+                  </Form.Item>
+                </div>
+                <div className="solutionField">
+                  <label className="solutionLabel">
+                    验证码
+                  </label>
+                  <div className="solutionCodeWrap">
+                    <Form.Item
+                      name="code"
+                      className="solutionFormItem"
+                      rules={[{ required: true, message: "请输入验证码" }]}
+                    >
+                      <Input
+                        className="solutionInput solutionInputCode"
+                        placeholder="请输入验证码"
+                      />
+                    </Form.Item>
+                    <Button
+                      type="text"
+                      loading={sendingCode}
+                      disabled={sendingCode || sentJustNow || countdown > 0}
+                      onClick={handleSendCode}
+                      className="solutionCodeBtn"
+                    >
+                      {sentJustNow
+                        ? "已发送"
+                        : countdown > 0
+                          ? `${countdown}s`
+                          : "获取验证码"}
+                    </Button>
+                  </div>
+                </div>
+              </div>
+              <div className="solutionField">
+                <label className="solutionLabel">
+                  公司名称
+                </label>
+                <Form.Item
+                  name="company_name"
+                  className="solutionFormItem"
+                  rules={[{ required: true, message: "请输入公司名称" }]}
+                >
+                  <Input
+                    className="solutionInput"
+                    placeholder="请输入您的公司全称"
+                  />
+                </Form.Item>
+              </div>
+              <div className="solutionAgreeRow">
+                <Form.Item
+                  name="privacy"
+                  valuePropName="checked"
+                  className="solutionAgreeItem"
+                  rules={[
+                    {
+                      validator: (_, value) =>
+                        value
+                          ? Promise.resolve()
+                          : Promise.reject(
+                              new Error("请先阅读并同意隐私协议与用户协议"),
+                            ),
+                    },
+                  ]}
+                >
+                  <Checkbox className="solutionAgreeCheckbox">
+                    <span className="solutionAgreeText">
+                      我已阅读并同意
+                      <a
+                        className="solutionAgreeLink"
+                        href="/privacy"
+                        target="_blank"
+                        rel="noreferrer"
+                      >
+                        《隐私协议》
+                      </a>
+                      <a
+                        className="solutionAgreeLink"
+                        href="/agreement"
+                        target="_blank"
+                        rel="noreferrer"
+                      >
+                        《用户协议》
+                      </a>
+                    </span>
+                  </Checkbox>
+                </Form.Item>
+              </div>
+              <button
+                type="submit"
+                disabled={submitting}
+                className="solutionSubmitBtn"
+              >
+                提交信息
+              </button>
+            </Form>
+          </motion.div>
+        </motion.div>
+      </div>
+      <div className="solutionBottom">
+        <div className="solutionBottomInner">
+          <span>开邻智数</span>
+          <span>联系我们</span>
+          <span>产品中心</span>
+          <span>法律条款</span>
+        </div>
+      </div>
+    </div>
+  );
+}

+ 3 - 0
company/src/services/index.ts

@@ -0,0 +1,3 @@
+export { apiRequest } from './request';
+export type { ApiResponse } from './request';
+

+ 36 - 0
company/src/services/request.ts

@@ -0,0 +1,36 @@
+import request from "umi-request";
+import { getApiBase, API_PREFIX } from "../config/api";
+
+export type ApiResponse<T = any> = {
+  code?: string;
+  data?: T;
+  msg?: string;
+  [key: string]: any;
+};
+
+type ApiRequestOptions = {
+  method?: "GET" | "POST" | "PUT" | "DELETE";
+  data?: any;
+  params?: any;
+  headers?: Record<string, string>;
+};
+
+const buildUrl = (path: string) => {
+  if (/^https?:\/\//.test(path)) return path;
+  const base = getApiBase();
+  const p = path.startsWith("/") ? path : `/${path}`;
+  return `${base}${API_PREFIX}${p}`;
+};
+
+export const apiRequest = async <T = any>(
+  path: string,
+  options: ApiRequestOptions = {},
+) => {
+  const url = buildUrl(path);
+  return request<ApiResponse<T>>(url, {
+    method: options.method || "GET",
+    data: options.data,
+    params: options.params,
+    headers: options.headers,
+  });
+};

+ 10 - 0
company/src/utils/utils.ts

@@ -0,0 +1,10 @@
+export const products = [
+  {
+    name: "开邻智数",
+    url: "https://saas.kailin.com.cn",
+  },
+  {
+    name: "开邻智价云",
+    url: "https://price.kailin.com.cn",
+  },
+];

+ 4 - 0
company/tsconfig.json

@@ -0,0 +1,4 @@
+{
+  "extends": "./src/.umi/tsconfig.json"
+}
+

+ 2 - 0
company/typings.d.ts

@@ -0,0 +1,2 @@
+import '@umijs/max/typings';
+

+ 9 - 0
retrieval/.env.example

@@ -0,0 +1,9 @@
+# GEMINI_API_KEY: Required for Gemini AI API calls.
+# AI Studio automatically injects this at runtime from user secrets.
+# Users configure this via the Secrets panel in the AI Studio UI.
+GEMINI_API_KEY="MY_GEMINI_API_KEY"
+
+# APP_URL: The URL where this applet is hosted.
+# AI Studio automatically injects this at runtime with the Cloud Run service URL.
+# Used for self-referential links, OAuth callbacks, and API endpoints.
+APP_URL="MY_APP_URL"

+ 8 - 0
retrieval/.gitignore

@@ -0,0 +1,8 @@
+node_modules/
+build/
+dist/
+coverage/
+.DS_Store
+*.log
+.env*
+!.env.example

+ 20 - 0
retrieval/README.md

@@ -0,0 +1,20 @@
+<div align="center">
+<img width="1200" height="475" alt="GHBanner" src="https://github.com/user-attachments/assets/0aa67016-6eaf-458a-adb2-6e31a0763ed6" />
+</div>
+
+# Run and deploy your AI Studio app
+
+This contains everything you need to run your app locally.
+
+View your app in AI Studio: https://ai.studio/apps/61066f10-c637-416e-bb08-c4dee5e26594
+
+## Run Locally
+
+**Prerequisites:**  Node.js
+
+
+1. Install dependencies:
+   `npm install`
+2. Set the `GEMINI_API_KEY` in [.env.local](.env.local) to your Gemini API key
+3. Run the app:
+   `npm run dev`

+ 29 - 0
retrieval/index.html

@@ -0,0 +1,29 @@
+<!doctype html>
+<html lang="zh-CN">
+  <head>
+    <meta charset="UTF-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+    <meta
+      name="description"
+      content="线上平台价格数据治理,医药品牌工业全链路解决方案。"
+    />
+    <meta property="og:title" content="开邻智价云-渠道价值链守护者" />
+    <meta
+      property="og:description"
+      content="线上平台价格数据治理,医药品牌工业全链路解决方案。"
+    />
+    <meta name="twitter:card" content="summary" />
+    <meta name="twitter:title" content="开邻智价云-渠道价值链守护者" />
+    <meta
+      name="twitter:description"
+      content="线上平台价格数据治理,医药品牌工业全链路解决方案。"
+    />
+    <link rel="icon" type="image/x-icon" href="/src/assets/images/logo.ico" />
+    <title>开邻智价云-渠道价值链守护者</title>
+  </head>
+  <body>
+    <div id="root"></div>
+    <script type="module" src="/src/main.tsx"></script>
+  </body>
+</html>
+

+ 5 - 0
retrieval/metadata.json

@@ -0,0 +1,5 @@
+{
+  "name": "智价云 - 渠道价值链守护者",
+  "description": "线上平台价格数据治理,医药品牌工业全链路解决方案。",
+  "requestFramePermissions": []
+}

+ 36 - 0
retrieval/package.json

@@ -0,0 +1,36 @@
+{
+  "name": "react-example",
+  "private": true,
+  "version": "0.0.0",
+  "type": "module",
+  "scripts": {
+    "dev": "vite --port=3000 --host=0.0.0.0",
+    "build": "vite build",
+    "preview": "vite preview",
+    "clean": "rm -rf dist",
+    "lint": "tsc --noEmit"
+  },
+  "dependencies": {
+    "antd": "^6.3.5",
+    "dotenv": "^17.2.3",
+    "express": "^4.21.2",
+    "less": "^4.6.4",
+    "lucide-react": "^0.546.0",
+    "motion": "^12.23.24",
+    "react": "^19.0.0",
+    "react-dom": "^19.0.0",
+    "react-router-dom": "^6.30.3",
+    "umi-request": "^1.4.0"
+  },
+  "devDependencies": {
+    "@types/express": "^4.17.21",
+    "@types/node": "^22.14.0",
+    "@vitejs/plugin-react": "^4.3.4",
+    "autoprefixer": "^10.4.21",
+    "postcss": "^8.5.3",
+    "tailwindcss": "^3.4.17",
+    "tsx": "^4.21.0",
+    "typescript": "~5.8.2",
+    "vite": "^5.4.14"
+  }
+}

+ 6 - 0
retrieval/postcss.config.cjs

@@ -0,0 +1,6 @@
+module.exports = {
+  plugins: {
+    tailwindcss: {},
+    autoprefixer: {},
+  },
+};

+ 214 - 0
retrieval/src/App.tsx

@@ -0,0 +1,214 @@
+import { useEffect } from "react";
+import { Mail, MapPin } from "lucide-react";
+import { NavLink, Outlet, useLocation, useNavigate } from "react-router-dom";
+import logoImage from "./assets/images/zjy/logo.webp";
+import { products } from "./utils/utils";
+
+const Navbar = () => {
+  const navigate = useNavigate();
+
+  return (
+    <nav className="fixed top-0 w-full z-50 bg-slate-950/70 backdrop-blur-md border-b border-slate-800">
+      <div className="flex justify-between items-center max-w-7xl mx-auto px-6 h-20">
+        <div
+          className="flex items-center gap-3 cursor-pointer font-headline"
+          onClick={() => navigate("/")}
+        >
+          <div
+            style={{
+              width: "7.75rem",
+              height: "2.35rem",
+              borderRadius: "9999px",
+              overflow: "hidden",
+            }}
+            className="w-11 h-11 bg-white rounded-xl flex items-center justify-center"
+          >
+            <img
+              style={{ width: "6.75rem", height: "3rem" }}
+              src={logoImage}
+              alt="智价云 Logo"
+              className="w-7 h-7 object-contain"
+            />
+          </div>
+        </div>
+
+        <div className="hidden md:flex items-center space-x-10">
+          <NavLink
+            to="/"
+            className={({ isActive }) =>
+              `relative inline-flex items-center leading-none font-headline text-sm ${
+                isActive
+                  ? "text-secondary font-bold"
+                  : "text-slate-300 hover:text-white font-medium transition-colors"
+              }`
+            }
+          >
+            {({ isActive }) => (
+              <>
+                首页
+                {isActive && (
+                  <span className="absolute left-0 -bottom-2 h-0.5 w-full bg-secondary rounded-full"></span>
+                )}
+              </>
+            )}
+          </NavLink>
+
+          <div className="relative group">
+            <span className="inline-flex items-center leading-none text-slate-300 hover:text-white transition-colors font-headline text-sm font-medium cursor-default">
+              产品中心
+            </span>
+            <div className="absolute left-1/2 top-full mt-3 -translate-x-1/2 min-w-32 rounded-lg border border-slate-800 bg-slate-900/95 p-1.5 shadow-xl opacity-0 invisible group-hover:opacity-100 group-hover:visible transition-all duration-200">
+              {products.map((product) => (
+                <a
+                  key={product.name}
+                  href={product.url}
+                  target="_blank"
+                  rel="noreferrer"
+                  className="block rounded-md px-3 py-2 text-sm text-slate-200 hover:bg-slate-800 hover:text-white transition-colors"
+                >
+                  {product.name}
+                </a>
+              ))}
+            </div>
+          </div>
+
+          <NavLink
+            to="https://www.kailin.com.cn"
+            target="_blank"
+            rel="noreferrer"
+            className={`relative inline-flex items-center leading-none font-headline text-sm text-slate-300 hover:text-white font-medium transition-colors`}
+          >
+            关于我们
+          </NavLink>
+          <NavLink
+            to="/contact"
+            className={({ isActive }) =>
+              `relative inline-flex items-center leading-none font-headline text-sm ${
+                isActive
+                  ? "text-secondary font-bold"
+                  : "text-slate-300 hover:text-white font-medium transition-colors"
+              }`
+            }
+          >
+            {({ isActive }) => (
+              <>
+                联系我们
+                {isActive && (
+                  <span className="absolute left-0 -bottom-2 h-0.5 w-full bg-secondary rounded-full"></span>
+                )}
+              </>
+            )}
+          </NavLink>
+        </div>
+
+        <button
+          onClick={() => navigate("/contact")}
+          className="bg-blue-600 text-white px-6 py-2.5 rounded-lg font-headline text-sm font-bold hover:bg-blue-500 transition-all active:scale-95"
+        >
+          获取方案
+        </button>
+      </div>
+    </nav>
+  );
+};
+
+const Footer = () => {
+  const navigate = useNavigate();
+
+  return (
+    <footer className="bg-slate-950 border-t border-slate-800 py-16 px-6">
+      <div className="max-w-7xl mx-auto grid grid-cols-1 md:grid-cols-4 gap-12">
+        <div className="space-y-6">
+          <div className="text-xl font-bold text-white font-headline">
+            智价云
+          </div>
+          <p className="text-sm text-slate-400 leading-relaxed">
+            专业的品牌渠道价值链管理方案提供商,助力医药及快消品牌实现数字化转型。
+          </p>
+        </div>
+        <div>
+          <h5 className="font-bold text-slate-200 mb-6 uppercase tracking-widest text-xs">
+            联系我们
+          </h5>
+          <ul className="space-y-4 text-sm text-slate-400">
+            <li className="flex items-center gap-2">
+              <Mail className="w-4 h-4 text-secondary" />
+              bd@dotouch.tech
+            </li>
+            <li className="flex items-start gap-2">
+              <MapPin className="w-4 h-4 text-secondary mt-0.5" />
+              <span>深圳大方无隅科技有限公司</span>
+            </li>
+          </ul>
+        </div>
+        <div>
+          <h5 className="font-bold text-slate-200 mb-6 uppercase tracking-widest text-xs">
+            产品中心
+          </h5>
+          <ul className="space-y-4 text-sm text-slate-400">
+            {products.map((product) => (
+              <li key={product.name}>
+                <a
+                  href={product.url}
+                  target="_blank"
+                  rel="noreferrer"
+                  className="hover:text-secondary transition-colors"
+                >
+                  {product.name}
+                </a>
+              </li>
+            ))}
+          </ul>
+        </div>
+        <div>
+          <h5 className="font-bold text-slate-200 mb-6 uppercase tracking-widest text-xs">
+            法律条款
+          </h5>
+          <ul className="space-y-4 text-sm text-slate-400">
+            <li>
+              <a
+                href="/privacy"
+                target="_blank"
+                rel="noreferrer"
+                className="hover:text-secondary transition-colors"
+              >
+                隐私政策
+              </a>
+            </li>
+            <li>
+              <a
+                href="/agreement"
+                target="_blank"
+                rel="noreferrer"
+                className="hover:text-secondary transition-colors"
+              >
+                用户协议
+              </a>
+            </li>
+          </ul>
+        </div>
+      </div>
+      <div className="max-w-7xl mx-auto mt-16 pt-8 border-t border-slate-800 text-center">
+        <p className="text-sm text-slate-500">© 粤ICP备2024220172号-9</p>
+      </div>
+    </footer>
+  );
+};
+
+export default function App() {
+  const location = useLocation();
+
+  useEffect(() => {
+    window.scrollTo(0, 0);
+  }, [location.pathname]);
+
+  return (
+    <div className="min-h-screen flex flex-col bg-slate-950 text-slate-100">
+      <Navbar />
+      <main className="flex-grow">
+        <Outlet />
+      </main>
+      <Footer />
+    </div>
+  );
+}

+ 4 - 0
retrieval/src/assets.d.ts

@@ -0,0 +1,4 @@
+declare module '*.png' {
+  const src: string;
+  export default src;
+}

BIN
retrieval/src/assets/images/logo.ico


BIN
retrieval/src/assets/images/logo_i.png


BIN
retrieval/src/assets/images/zjy/logo.webp


BIN
retrieval/src/assets/images/zjy/logo_transparent.png


BIN
retrieval/src/assets/images/zjy/m3_t11.png


BIN
retrieval/src/assets/images/zjy/m3_t22.png


BIN
retrieval/src/assets/images/zjy/m3_t33.png


BIN
retrieval/src/assets/images/zjy/m3_t44.png


BIN
retrieval/src/assets/images/zjy/m3_t55.png


+ 11 - 0
retrieval/src/index.css

@@ -0,0 +1,11 @@
+@import url('https://fonts.googleapis.com/css2?family=Manrope:wght@400;500;700;800&family=Inter:wght@300;400;500;600&display=swap');
+
+@tailwind base;
+@tailwind components;
+@tailwind utilities;
+
+@layer base {
+  body {
+    @apply bg-surface text-on-surface font-body;
+  }
+}

+ 25 - 0
retrieval/src/main.tsx

@@ -0,0 +1,25 @@
+import { StrictMode } from "react";
+import { createRoot } from "react-dom/client";
+import { BrowserRouter, Navigate, Route, Routes } from "react-router-dom";
+import App from "./App.tsx";
+import AgreementPage from "./pages/Agreement/index.tsx";
+import PrivacyPage from "./pages/Privacy/index.tsx";
+import ContactPage from "./pages/Solution/ContactPage.tsx";
+import HomePage from "./pages/zjy/HomePage.tsx";
+import "./index.css";
+
+createRoot(document.getElementById('root')!).render(
+  <StrictMode>
+    <BrowserRouter>
+      <Routes>
+        <Route path="/agreement" element={<AgreementPage />} />
+        <Route path="/privacy" element={<PrivacyPage />} />
+        <Route path="/" element={<App />}>
+          <Route index element={<HomePage />} />
+          <Route path="contact" element={<ContactPage />} />
+          <Route path="*" element={<Navigate to="/" replace />} />
+        </Route>
+      </Routes>
+    </BrowserRouter>
+  </StrictMode>,
+);

+ 83 - 0
retrieval/src/pages/Agreement/index.less

@@ -0,0 +1,83 @@
+.policyPage {
+  width: 100%;
+  min-width: 500px;
+  background: #ffffff;
+  color: rgba(0, 0, 0, 0.88);
+}
+
+.policyContainer {
+  max-width: 1200px;
+  margin: 0 auto;
+  padding: 24px 24px 0;
+}
+
+.policyTitle {
+  text-align: center;
+  font-size: 22px;
+  font-weight: 700;
+  margin-bottom: 20px;
+}
+
+.policyContent {
+  font-size: 17px;
+  line-height: 1.5;
+  color: rgba(0, 0, 0, 0.82);
+  text-indent: 2em;
+}
+
+.weight {
+  font-weight: 700;
+}
+
+
+.agreement-container {
+  max-width: 1200px;
+  margin: 0 auto;
+  background-color: #fff;
+  padding: 40px 60px;
+  border-radius: 8px;
+  box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
+}
+.main-title {
+  text-align: center;
+  font-size: 28px;
+  margin-bottom: 30px;
+  font-weight: bold;
+}
+.preamble {
+  font-size: 16px;
+  margin-bottom: 40px;
+  text-align: justify;
+}
+.level1-title {
+  font-size: 20px;
+  font-weight: bold;
+  margin: 30px 0 15px 0;
+  color: #222;
+}
+.level2-item {
+  font-size: 16px;
+  margin: 12px 0;
+  text-align: justify;
+  padding-left: 10px;
+}
+.level3-list {
+  list-style: none;
+  margin: 8px 0;
+}
+.level3-list li {
+  margin: 6px 0;
+  text-align: justify;
+}
+.level3-list li::before {
+  content: "1) ";
+  display: inline-block;
+  margin-right: 5px;
+}
+
+
+@media (max-width: 640px) {
+  .policyContainer {
+    padding: 40px 16px 64px;
+  }
+}

+ 281 - 0
retrieval/src/pages/Agreement/index.tsx

@@ -0,0 +1,281 @@
+import React from "react";
+import "./index.less";
+
+const Agreement: React.FC = () => {
+  return (
+    <div className="policyPage">
+      <div className="policyContainer">
+        <div className="policyTitle">用户协议</div>
+      </div>
+      <div className="policyContent">
+        <div className="preamble">
+          本《用户协议》是您(下称“用户”)与深圳大方无隅科技有限公司(下称
+          “大方无隅科技”)之间,关于使用大方无隅科技提供的产品及服务(包括但不限于开邻智数)时所签署的协议。请用户在注册与使用大方无隅科技提供的产品及服务前请务必审慎阅读并充分理解协议中相关条款内容,当用户注册并使用了大方无隅科技的产品或服务,即表示用户已同意协议内容。
+        </div>
+
+        <div className="level1-title">一、重要须知</div>
+        <div className="level2-item">
+          1.1
+          在签署本协议之前,大方无隅科技正式提醒用户:您应认真阅读(未成年人应当在监护人陪同下阅读)、充分理解本《用户协议》中各条款,特别是免除或者限制大方无隅科技责任的免责条款,用户的权利限制条款,约定争议解决方式、司法管辖、法律适用的条款。
+        </div>
+        <div className="level2-item">
+          1.2
+          除非您接受本协议,否则用户无权也无必要继续接受大方无隅科技的服务,可以退出本次注册。用户点击接受并继续使用大方无隅科技的服务,视为用户已完全的接受本协议。
+        </div>
+        <div className="level2-item">
+          1.3
+          本协议在您开始使用大方无隅科技的服务,并注册成为大方无隅科技产品的用户时即产生法律效力,请您慎重考虑是否接受本协议,如不接受本协议的任一条款,请自动退出并不再接受大方无隅科技的任何服务。
+        </div>
+        <div className="level2-item">
+          1.4
+          在您签署本协议之后,此文本可能因国家政策、产品以及履行本协议的环境发生变化而进行修改,我们会将修改后的协议发布在本网站上,若您对修改后的协议有异议的,请立即停止登录、使用大方无隅科技提供的产品及服务,若您登录或继续使用大方无隅科技提供产品,视为认可修改后的协议。
+        </div>
+        <div className="level2-item">
+          1.5
+          用户在使用开邻智数之前,应当告知其员工在注册及使用开邻智数期间,开邻智数可能收集和使用员工个人信息,要求其员工认真阅读开邻隐私政策,并取得其员工对开邻隐私政策的明确同意。开邻智数的用户开始或继续使用我们提供的任一产品或服务时,我们视为用户已经履行上述对员工的告知义务并获取其员工的明确同意。如果后续任何员工向我们提出权利主张认为我们侵害了其个人信息权利,由此造成的责任由客户负责解决,给我们造成的损失由用户负责赔偿。
+        </div>
+
+        <div className="level1-title">二、关于“帐号”及“付费会员”资格</div>
+        <div className="level2-item">
+          2.1
+          大方无隅科技的产品为用户提供了注册通道,用户在认可并接受本协议之后,有权选择未被其他用户使用过的微信账号作为用户的帐号。
+          <ul className="level3-list">
+            <li>用户可通过各种已有和未来新增的渠道注册账号及加入付费会员。</li>
+          </ul>
+        </div>
+        <div className="level2-item">
+          2.2
+          在用户使用具体某种方式加入付费会员时,须阅读并确认相关的用户协议和使用方法。
+        </div>
+        <div className="level2-item">
+          2.3
+          用户通过网络填写并提交注册表,表中所填写的内容与个人资料必须真实有效,否则大方无隅科技有权拒绝其申请或撤销其账号或付费会员资格,并不予任何赔偿或退还会员费。用户的个人资料发生变化,应及时修改相关资料,否则由此造成的会员权力不能全面有效行使的责任由会员自己承担,大方无隅科技有权因此取消其会员资格,并不予任何赔偿或退还会员费。
+        </div>
+        <div className="level2-item">
+          2.4
+          成为付费会员后,会员有权利不接受大方无隅科技的服务,可申请取消会员服务,但不获得任何服务费用的退还。
+        </div>
+        <div className="level2-item">
+          2.5
+          用户在注册了大方无隅科技帐号并不意味获得全部大方无隅科技产品的授权,仅仅是取得了接受大方无隅科技服务的身份,用户在登录相关网页、加载应用、下载安装软件时需要另行签署单个产品的授权协议。
+        </div>
+        <div className="level2-item">
+          2.6
+          大方无隅科技账户仅限于在大方无隅科技网站上注册用户本人使用,禁止赠与、借用、租用、转让或售卖。如果大方无隅科技发现或者有理由怀疑使用者并非帐号初始注册人,则有权在未经通知的情况下,暂停或终止向用户提供服务,并有权注销该帐号,而无需向该帐号使用人承担法律责任,由此带来的包括并不限于用户通讯中断、用户资料和信息等清空等损失由用户自行承担。
+        </div>
+        <div className="level2-item">
+          2.7
+          用户有责任维护个人帐号、密码的安全性与保密性,用户就其帐号及密码项下之一切活动负全部责任,包括用户数据的修改,发表的言论以及其他所有的损失。用户应重视大方无隅科技帐号密码保护。用户如发现他人未经许可使用其帐号或发生其他任何安全漏洞问题时立即通知大方无隅科技。如果用户在使用大方无隅科技服务时违反上述规则而产生任何损失或损害,大方无隅科技不承担任何责任。
+        </div>
+        <div className="level2-item">
+          2.8
+          用户帐号在丢失后,可遵照大方无隅科技的申诉途径及时申诉请求找回帐号。用户应提供能增加帐号安全性的个人密码保护资料。用户可以凭初始注册资料及个人密码保护资料填写申诉单向大方无隅科技申请找回帐号,大方无隅科技的密码找回机制仅负责识别申诉单上所填资料与系统记录资料的正确性,而无法识别申诉人是否系真正帐号有权使用人。对用户因被他人冒名申诉而致的任何损失,大方无隅科技不承担任何责任,用户知晓帐号及密码保管责任在于用户,大方无隅科技并无义务保证帐号丢失或遗忘密码后用户一定能通过申诉找回帐号。
+        </div>
+        <div className="level2-item">
+          2.9
+          用户应保证注册大方无隅科技帐号时填写的身份信息的真实性,任何由于非法、不真实、不准确的用户信息所产生的责任由用户承担。用户应不断根据实际情况更新注册资料,符合及时、详尽、真实、准确的要求。所有原始键入的资料将引用用户的帐号注册资料。如果因用户的注册信息不真实而引起的问题,以及对问题发生所带来的后果,大方无隅科技不负任何责任。如果用户提供的信息不准确、不真实、不合法或者大方无隅科技有理由怀疑为错误、不实或不完整的资料或在个人资料中发布广告、不严肃内容及无关信息,大方无隅科技有权暂停或终止向用户提供服务,注销该帐号,并拒绝用户现在和未来使用大方无隅科技服务之全部或任何部分。因此产生的一切损失由用户自行承担。
+        </div>
+
+        <div className="level1-title">
+          三、用户在使用大方无隅科技产品时,应当遵守相关法律规定
+        </div>
+        <div className="level2-item">
+          3.1
+          用户在使用大方无隅科技产品时,应当遵守《中华人民共和国宪法》、《中华人民共和国刑法》、《中华人民共和国民法典》、《中华人民共和国著作权法》、《中华人民共和国电信条例》、《互联网信息服务管理办法》、《互联网电子公告服务管理规定》、《计算机信息网络国际互联网安全保护管理办法》等相关规定。用户不得利用大方无隅科技服务产品从事违反法律法规、政策以及侵犯他人合法权益的行为,包括但不限于下列行为:
+        </div>
+        <div className="level2-item">
+          3.2
+          利用大方无隅科技服务产品发表、传送、传播、储存反对宪法所确定的基本原则的、危害国家安全、国家统一、社会稳定的、煽动民族仇恨、民族歧视、破坏民族团结的内容,或侮辱诽谤、色情、暴力、引起他人不安及任何违反国家法律法规政策的内容或者设置含有上述内容的网名、角色名。
+        </div>
+        <div className="level2-item">
+          3.3
+          利用大方无隅科技服务发表、传送、传播、储存侵害他人知识产权、商业机密、肖像权、隐私权等合法权利或其他道德上令人反感的内容。
+        </div>
+        <div className="level2-item">
+          3.4 进行任何危害计算机网络安全的行为,包括但不限于:
+          <ul className="level3-list">
+            <li>使用未经许可的数据或进入未经许可的服务器/帐户;</li>
+            <li>
+              未经允许进入公众计算机网络或者他人计算机系统并删除、修改、增加存储信息;
+            </li>
+            <li>
+              未经许可,企图探查、扫描、测试本“软件”系统或网络的弱点或其它实施破坏网络安全的行为;
+            </li>
+            <li>
+              企图干涉、破坏本“软件”系统或网站的正常运行,故意传播恶意程序或病毒以及其他破坏干扰正常网络信息服务的行为;
+            </li>
+            <li>伪造 TCP/IP 数据包名称或部分名称;</li>
+            <li>
+              自行或利用其他软件对大方无隅科技提供产品进行反向破解等违法行为。
+            </li>
+          </ul>
+        </div>
+        <div className="level2-item">
+          3.5
+          进行任何诸如发布广告、推广信息、销售商品的行为,或者进行任何非法的侵害大方无隅科技利益的行为。
+        </div>
+        <div className="level2-item">
+          3.6
+          进行其他任何违法以及侵犯其他个人、公司、社会团体、组织的合法权益的行为或者法律、行政法规、规章、条例以及任何具有法律效力之规范所限制或禁止的其他行为。在任何情况下,如果大方无隅科技有理由认为用户的任何行为,包括但不限于用户的任何言论和其它行为违反或可能违反法律法规、国家政策以及本协议的任何规定,大方无隅科技可在任何时候不经任何事先通知,即有权终止向用户提供服务。
+        </div>
+
+        <div className="level1-title">四、注意事项</div>
+        <div className="level2-item">
+          4.1
+          用户理解并同意大方无隅科技将会尽其商业上的合理努力保障用户在大方无隅科技提供的产品及服务中的数据存储安全,但是,大方无隅科技并不能就此提供完全保证,包括但不限于以下情形:
+          <ul className="level3-list">
+            <li>
+              大方无隅科技不对用户在开邻智数中相关数据的删除或储存失败负责;
+            </li>
+            <li>
+              在使用大方无隅科技的产品及服务期间,用户可根据自己的需要自行备份开邻智数及服务中的相关数据;
+            </li>
+            <li>
+              除非与用户之间另有约定,在用户停止使用开邻智数或服务被终止、取消之日起满
+              30
+              个自然日之后,大方无隅科技可以从服务器上永久地删除用户产生的数据。在上述期限届满之后,大方无隅科技没有义务向用户返还任何数据。
+            </li>
+          </ul>
+        </div>
+        <div className="level2-item">
+          4.2
+          用户在使用大方无隅科技的产品及服务时,须自行承担如下来自大方无隅科技不可掌控的风险内容,包括但不限于:
+          <ul className="level3-list">
+            <li>由于不可抗拒因素可能引起的用户信息丢失、泄漏等风险;</li>
+            <li>
+              用户在使用开邻智数访问第三方网站时,因第三方网站及相关内容所可能导致的风险,由用户自行承担;
+            </li>
+            <li>
+              用户发布的内容被他人转发、分享,因此等传播可能带来的风险和责任;
+            </li>
+            <li>
+              由于网络信号不稳定、网络带宽小等网络原因,所引起的开邻智数登录失败、资料同步不完整、页面打开速度慢等风险。
+            </li>
+          </ul>
+        </div>
+        <div className="level2-item">
+          4.3
+          用户须知,在使用大方无隅科技服务可能存在有来自任何他人的包括威胁性的、诽谤性的、令人反感的或非法的内容或行为或对他人权利的侵犯(包括知识产权)的匿名或冒名的信息的风险,用户须承担以上风险,大方无隅科技对服务不作担保,不论是明确的或隐含的,包括所有有关信息真实性、适当性、适于某一特定用途、所有权和非侵权性的默示担保和条件,对因此导致任何因用户不正当或非法使用服务产生的直接、间接、偶然、特殊及后续的损害,大方无隅科技不承担任何责任。
+        </div>
+        <div className="level2-item">
+          4.4
+          使用大方无隅科技服务必须遵守国家有关法律和政策等,维护国家利益,保护国家安全,并遵守本协议,对于用户违法行为或违反本协议的使用(包括但不限于言论发表、传送等)而引起的一切责任,由用户承担全部责任。
+        </div>
+        <div className="level2-item">
+          4.5
+          大方无隅科技提供的所有信息、资讯、内容和服务均来自互联网,并不代表大方无隅科技的观点,大方无隅科技对其真实性、合法性概不负责,亦不承担任何法律责任。
+        </div>
+        <div className="level2-item">
+          4.6
+          大方无隅科技所提供的产品和服务也属于互联网范畴,也易受到各种安全问题的困扰,包括但不限于:
+          <ul className="level3-list">
+            <li>个人资料被不法分子利用,造成现实生活中的骚扰;</li>
+            <li>哄骗、破译密码;</li>
+            <li>
+              下载安装的其它软件中含有“特洛伊木马”等病毒程序,威胁到个人计算机上信息和数据的安全,继而威胁对本服务的使用;
+            </li>
+            <li>
+              以及其他类网络安全困扰问题
+              对于发生上述情况的,用户应当自行承担责任。
+            </li>
+          </ul>
+        </div>
+        <div className="level2-item">
+          4.7
+          用户须明白,大方无隅科技为了整体运营的需要,有权在公告通知后,在不事先通知用户的情况下修改、中断、中止或终止服务,而无须向用户或第三方负责,大方无隅科技不承担任何赔偿责任。
+        </div>
+        <div className="level2-item">
+          4.8
+          用户应理解,互联网技术存在不稳定性,可能导致政府管制、政策限制、病毒入侵、黑客攻击、服务器系统崩溃或者其他现今技术无法解决的风险发生。由以上原因可能导致大方无隅科技服务中断或帐号信息损失,对此非人为因素引起的用户损失由用户自行承担责任。
+        </div>
+
+        <div className="level1-title">五、知识产权</div>
+        <div className="level2-item">
+          5.1
+          大方无隅科技对其旗下运营的网页、应用、软件等产品和服务享有知识产权,受中国法律的保护。
+        </div>
+        <div className="level2-item">
+          5.2
+          用户不得对大方无隅科技服务涉及的相关网页、应用、软件等产品进行反向工程、反向汇编、反向编译等。
+        </div>
+        <div className="level2-item">
+          5.3
+          用户只能在本《用户协议》以及相应的授权许可协议授权的范围内使用大方无隅科技知识产权,未经授权超范围使用的,构成对大方无隅科技的侵权。
+        </div>
+        <div className="level2-item">
+          5.4
+          用户在使用大方无隅科技产品服务时发表上传的文字、图片、视频、软件以及表演等信息,用户的发表、上传行为是对大方无隅科技服务平台的授权,为非独占性、永久性的授权,该授权可转授权。大方无隅科技可将前述信息在大方无隅科技旗下的所有服务平台上使用,可再次编辑后使用,也可以由大方无隅科技授权给合作方使用。
+        </div>
+        <div className="level2-item">
+          5.5
+          用户应保证,在使用大方无隅科技产品服务时上传的文字、图片、视频、软件以及表演等的信息不侵犯任何第三方知识产权,包括但不限于商标权、著作权等。若用户在使用大方无隅科技产品服务时上传的文字、图片、视频、软件以及表演等的信息中侵犯第三方知识产权,大方无隅科技有权移除该侵权产品,并对此不负任何责任。用户应当负责处理前述第三方的权利主张,承担由此产生的全部费用,包括但不限于侵权赔偿、律师费及其他合理费用,并保证大方无隅科技不会因此而遭受任何损失。
+        </div>
+        <div className="level2-item">
+          5.6
+          任何单位或个人认为通过大方无隅科技提供服务的内容可能涉嫌侵犯其知识产权或信息网络传播权,应该及时向大方无隅科技提出书面权利通知投诉,并提供身份证明、权属证明及详细侵权情况证明。大方无隅科技在收到上述法律文件后,将会依法尽快断开相关链接内容。
+        </div>
+
+        <div className="level1-title">六、隐私保护</div>
+        <div className="level2-item">
+          6.1
+          大方无隅科技非常重视用户的隐私权,用户在享受大方无隅科技提供的产品及服务时可能涉及用户的隐私,因此请用户仔细阅读本隐私保护条款。
+        </div>
+        <div className="level2-item">
+          6.2
+          请用户注意勿在使用大方无隅科技服务中透露自己的各类财产帐户、银行卡、信用卡、第三方支付账户及对应密码等重要信息资料,否则由此带来的任何损失
+          由用户自行承担。
+        </div>
+        <div className="level2-item">
+          6.3
+          用户的帐号、密码属于保密信息,大方无隅科技会努力采取积极的措施保护用户帐号、密码的安全。
+        </div>
+        <div className="level2-item">
+          6.4
+          互联网的开放性以及技术更新速度快,因非大方无隅科技可控制的因素导致用户信息泄漏的,大方无隅科技不承担任何责任。
+        </div>
+        <div className="level2-item">
+          6.5
+          用户在使用大方无隅科技服务时不应将自认为隐私的信息发表、上传至大方无隅科技,也不应将该等信息通过大方无隅科技的服务传播给其他人,由于用户的行为引起的隐私泄漏,由用户自行承担责任。
+        </div>
+
+        <div className="level1-title">七、免责声明</div>
+        <div className="level2-item">
+          7.1
+          用户充分了解并同意:关于产品和服务,大方无隅科技不提供任何种类的明示或暗示担保或条件,包括但不限于商业适售性、特定用途适用性等。用户对账号的使用行为必须自行承担相应风险。
+        </div>
+        <div className="level2-item">
+          7.2
+          用户应对本服务所提供的内容自行加以判断,并承担因使用内容而引起的所有风险,包括因对内容的正确性、完整性或实用性的依赖而产生的风险。是否使用本网站任何文章或资料应由用户自行考虑且自负风险,因任何文章或资料使用而导致的用户微信公众平台账号之任何损失或数据流失等后果,由用户自行承担,大方无隅科技无法且不会对因前述风险而导致的任何损失或损害承担责任。
+        </div>
+        <div className="level2-item">
+          7.3
+          用户自大方无隅科技提供的产品或服务所取得的任何建议或信息,无论是书面或口头形式,除非本协议有明确规定,将不构成本协议以外之任何保证。
+        </div>
+        <div className="level2-item">
+          7.4
+          因用户使用大方无隅科技提供的产品或服务时,可能会调用第三方系统或者通过第三方支持用户的使用或访问,使用或访问的结果由该第三方提供,大方无隅科技不保证通过第三方提供服务及内容的安全性、准确性、有效性及其他不确定的风险,由此若引发的任何争议及损害,与大方无隅科技无关,大方无隅科技不承担任何责任。
+        </div>
+
+        <div className="level1-title">八、其他</div>
+        <div className="level2-item">
+          8.1
+          本协议所定的任何条款的部分或全部无效者,不影响其它条款的效力。本协议的解释、效力及纠纷的解决,适用于中华人民共和国法律。若用户和大方无隅科技之间发生任何纠纷或争议,首先应友好协商解决,协商不成的,用户在此完全同意将纠纷或争议提交大方无隅科技所在地的人民法院管辖。
+        </div>
+        <div className="level2-item">
+          8.2
+          本协议所有条款的标题仅为阅读方便,本身并无实际涵义,不能作为本协议涵义解释的依据。
+        </div>
+        <div className="level2-item">
+          8.3
+          用户使用大方无隅科技产品及服务即视为用户已阅读并同意受本协议的约束。大方无隅科技有权在必要时自行修改或中断软件授权而不需通知用户的权利,用户可登录官网随时了解查阅最新版服务协议。在大方无隅科技修改协议条款后,如果用户不接受修改后的条款,请立即停止使用大方无隅科技提供的产品及服务,用户继续使用大方无隅科技提供的产品及服务将被视为已接受了修改后的协议。
+        </div>
+        <div className="level2-item">
+          8.4
+          本协议版权由大方无隅科技所有,大方无隅科技保留一切解释权利。本文中提及的产品和服务名称有可能为大方无隅科技的注册商标或商标,受法律保护。
+        </div>
+      </div>
+    </div>
+  );
+};
+
+export default Agreement;

+ 104 - 0
retrieval/src/pages/Privacy/index.less

@@ -0,0 +1,104 @@
+.policyPage {
+  width: 100%;
+  background: #ffffff;
+  color: rgba(0, 0, 0, 0.88);
+}
+
+.policyContainer {
+  padding: 48px 24px 72px;
+}
+
+.policyTitleTime {
+  text-align: center;
+  font-size: 14px;
+  font-weight: 400;
+  margin-bottom: 20px;
+}
+
+.policyTitle {
+  text-align: center;
+  font-size: 22px;
+  font-weight: 700;
+  margin-bottom: 20px;
+}
+
+.policyContent {
+  font-size: 14px;
+  line-height: 1.9;
+  color: rgba(0, 0, 0, 0.82);
+}
+
+.policyList {
+  margin: 0;
+  padding-left: 22px;
+}
+
+.policyListItem {
+  margin: 10px 0;
+}
+
+.policyHeading {
+  font-weight: 700;
+}
+
+.policyParagraph {
+  margin: 0;
+}
+
+.main-title {
+  text-align: center;
+  font-size: 28px;
+  margin-bottom: 15px;
+  font-weight: bold;
+}
+.update-time {
+  text-align: center;
+  font-size: 16px;
+  color: #666;
+  margin-bottom: 30px;
+}
+.subtitle {
+  font-size: 20px;
+  font-weight: bold;
+  margin: 35px 0 15px 0;
+  color: #222;
+  border-bottom: 1px solid #eee;
+  padding-bottom: 8px;
+}
+.level1-title {
+  font-size: 18px;
+  font-weight: bold;
+  margin: 25px 0 12px 0;
+  color: #222;
+}
+.level2-item {
+  font-size: 16px;
+  margin: 12px 0;
+  text-align: justify;
+  padding-left: 10px;
+}
+.level3-list {
+  list-style: none;
+  margin: 8px 0;
+}
+.level3-list li {
+  margin: 6px 0;
+  text-align: justify;
+}
+.level3-list li::before {
+  content: "1) ";
+  display: inline-block;
+  margin-right: 5px;
+}
+.tip-clause {
+  font-size: 16px;
+  line-height: 1.8;
+  text-align: justify;
+  margin-bottom: 20px;
+}
+
+@media (max-width: 640px) {
+  .policyContainer {
+    padding: 40px 16px 64px;
+  }
+}

+ 486 - 0
retrieval/src/pages/Privacy/index.tsx

@@ -0,0 +1,486 @@
+import React from "react";
+import "./index.less";
+
+const Privacy: React.FC = () => {
+  return (
+    <div className="policyPage">
+      <div className="policyContainer">
+        <div className="policyTitle">开邻智价云隐私协议</div>
+        <div className="policyTitleTime">
+          【本次更新时间:2025 年 04 月 03 日】
+        </div>
+        <div className="policyTitle">提示条款</div>
+        <div className="policyContent">
+          <div className="tip-clause">
+            欢迎您使用开邻智数(“我们”)产品和服务!您的信任对我们非常重要,我们深知个人信息对您的重要性,我们将严格遵守按法律法规要求,采取相应安全保护措施,尽力保护您的个人信息安全可控。
+            鉴此,我们制定本《隐私保护政策》(下称“本政策”)帮助您充分了解在您使用我们产品
+            和服务的过程中,我们会如何处理您的个人信息以及您可以如何管理您的个人信息,以便您更好地作出适当的选择。
+          </div>
+          <div className="tip-clause">
+            在使用开邻智数前,请您务必仔细阅读并透彻理解本政策,确保您充分理解和同意之后再开始使用。在确认充分理解并同意后使用相关产品或服务。
+            一旦您开始使用我们的各项服务,即表示您
+            已充分理解并同意本政策,如果您不同意本隐私政策的任何内容,建议您立即停止使用我们的产品或服务。
+            如对本政策内容有任何疑问、意见或建议,您可通过客服联系我们。
+          </div>
+          <div className="tip-clause">
+            同时,您在使用开邻智数之前,应当告知您的员工在注册及使用开邻智数期间,开邻智数可能收集和使用员工个人信息,要求其员工认真阅读本隐私政策,并取得其员工对本隐私政策的明确同意。您开始或继续使用我们提供的产品或服务时,我们视为您已经履行上述对员工的告知义务并获取其员工的明确同意。如果后续您的任何员工向我们提出权利主张认为我们侵害了其个人信息权利,由此造成的纠纷和损失应由您负责解决和赔偿。
+          </div>
+
+          <div className="subtitle">第一部分 定义</div>
+          <div className="level2-item">
+            1.1 开邻智数服务提供者:深圳大方无隅科技有限公司
+          </div>
+          <div className="level2-item">
+            1.2
+            “开邻智数”:是一款基于企业微信的数字化运营管理平台,为企业提供智能营销、销售、服务为一体的数字化解决方案。
+          </div>
+          <div className="level2-item">
+            1.3
+            关联公司:指由服务提供者直接或者间接控制、直接或者间接控制服务提供者、与服务提供者共同直接或者间接被控制的第三方主体。
+          </div>
+          <div className="level2-item">
+            1.4 您:在本政策中主要指我们的客户,即委托我们提供技术服务的企业。
+          </div>
+          <div className="level2-item">
+            1.5
+            终端用户:是指使用企业微信及微信平台的自然人或由自然人代表进行前述操作的组织体。
+          </div>
+          <div className="level2-item">
+            1.6
+            数据:是指我们为您提供服务中涉及的数据,在本政策中将根据上下文可能指您主动提供的数据、我们在为您服务过程中产生的数据、第三方向我们提供的经您及您的终端用户合法授权的数据以及公开渠道合法获取的数据,这些数据都将用于优化我们的产品向您提供更优质的服务。
+          </div>
+          <div className="level2-item">
+            1.7
+            Cookie:是指在终端用户访问网站或观看其他网络内容时,由服务器端生成,发送到用户的浏览器内的包含字符串的文本文件。终端用户可以通过浏览器设置是否保存这些文本文件。
+          </div>
+          <div className="level2-item">
+            1.8
+            个人信息:个人信息是以电子或者其他方式记录的与已识别或者可识别的自然人有关的各种信息,不包括匿名化处理后的信息。
+          </div>
+          <div className="level2-item">
+            1.9
+            敏感个人信息:敏感个人信息是一旦泄露或者非法使用,容易导致自然人的人格尊严受到侵害或者人身、财产安全受到危害的个人信息,包括生物识别、宗教信仰、特定身份、医疗健康、金融账户、行踪轨迹信息,以及不满十四周岁未成年人的个人信息。
+          </div>
+          <div className="level2-item">
+            1.10
+            匿名化:是指通过对个人信息的技术处理,使得个人信息主体无法被识别或关联,且处理后的信息不能被复原的过程。个人信息经匿名化处理后所得的信息不属于个人信息。
+          </div>
+          <div className="level2-item">
+            1.11
+            委托处理:是指个人信息处理者将处理个人信息的事务委托给其他组织和个人,双方成立委托合同关系,由受托人在委托范围和目的内为委托人处理个人信息。
+          </div>
+
+          <div className="subtitle">第二部分 隐私保护政策内容</div>
+          <div className="tip-clause">
+            本政策将帮助您了解以下内容:一、本政策适用范围
+            二、我们如何处理个人信息 三、我们如何对外提供个人信息
+            四、我们如何存储您的个人信息 五、我们如何保护您的个人信息
+            六、您的权利 七、如何使用 cookie 及同类技术 八、未成年人权利保护
+            九、数据的跨境转移 十、本隐私协议的改动
+          </div>
+
+          <div className="level1-title">一、本政策适用范围</div>
+          <div className="level2-item">
+            1.1
+            本政策适用于开邻智数在提供产品与服务中,客户、意向客户以及前述各方的员工、代表与代理人提供的的个人信息。
+          </div>
+          <div className="level2-item">
+            1.2 本政策适用于我们通过所有网络平台(如:
+            http://saas.kirin.wiki/以及我们可接达的网站、第三方网络平台、移动应用程序、社交应用等。)
+          </div>
+
+          <div className="level1-title">二、我们如何处理个人信息</div>
+          <div className="level2-item">2.1 我们会在以下场景处理个人信息:</div>
+          <div className="level2-item">
+            2.2 用户注册
+            <ul className="level3-list">
+              <li>
+                当您使用开邻智数时,需要通过企业微信账号与开邻智数建立关联,可能涉及获取您的头像昵称、你本人的手机号码,以及您授权使用开邻智数的企业信息。
+              </li>
+              <li>
+                为了帮助您完成开邻智数相关的配置,您指定且已取得合法授权的个人用户在注册过程中需要填写本人的手机号,以便我们的工作人员联系您进行功能的配置。
+              </li>
+              <li>
+                您也可以为其他人订购产品或服务,您需要提供该实际订购人的前述个人信息。向我们提供该实际订购人的前述个人信息之前,您需确保您已经取得其授权,同意您及我们使用该等个人信息。
+                您可以决定不提供上述信息,或要求删除之前提供的信息。但是,我们将因此无法完成相关交付服务。
+                我们还会使用上述信息向您或实际订购人提供相关的客服服务或开展满意度调查,内部审计、数据分析和研究。
+              </li>
+            </ul>
+          </div>
+          <div className="level2-item">2.3 向您提供产品或服务</div>
+          <div className="level2-item">
+            2.4 您委托我们处理的个人信息
+            <ul className="level3-list">
+              <li>
+                您在使用开邻智数服务期间,委托我们处理个人信息的,您应当保证该等数据来源合法且已获得个人信息主体同意,不存在违法获取、使用、泄露个人信息等情形。您应确保委托处理目的和方式合法合规,如因此违法或者造成我们或第三方损失的,由您自行承担相应责任。同时,若在前述数据在委托我们处理前,已发生数据泄露、损毁、丢失或篡改等数据安全事件,应由您自行承担相应的责任。为进一步保证本款的内容,如我们要求,您应及时提供相关证明、协议或资质证照等。您理解并确认:我们对您提交的证明、协议或资质证照的查阅仅为形式查阅,即使我们进行过查阅,不代表我们有义务或有能力确认您对数据的合法收集、披露或使用,您应自觉保证并遵守在本款的承诺和保证。
+              </li>
+              <li>
+                上述处理情形包括但不限于:您在配置企业时,需通过企业微信扫码授权开邻智数的第三方应用并设置员工可见
+                范围,应用授权范围包括:通讯录基本只读权限、企业客户权限、成员敏感信息权限,可获取可见范围内企业组织架构信息和成员基本信息(userid、姓名、性别、部门
+                ID、职位、关注状态)、可见范围内成员添加客户的基本信息(客户和客户群列表、昵称、备注、标签)、可见范围内成员联系客户数据。
+              </li>
+              <li>
+                因第三方应用和自建应用的接口差异,为了满足企业更多定制化需求和数据打通相关需求,您在使用过程中还需完成开邻自建应用的授权和配置,并设置应用可见范围,开邻智数通过自建应用授权可获取信息:①可见范围内成员信息:userid、成员名称、手机号码、职务信息、性别、邮箱、头像、地址、企业微信对外二维码基本信息;
+                ②可见范围内成员添加的客户信息:userid、名称、头像、unionID、类型、性别、备注、企业、描述、标签;
+              </li>
+              <li>
+                我们的相关工作人员可以使用上述信息与相关成员联系,以便向相关成员介绍我们的产品功能以及其他产品信息。您可以以书面或邮件形式通知我们不允许我们使用上述信息,但如果您这样做,可能会影响您获得、使用、购买我们产品或服务的体验或精准度,或者影响我们产品的正常运行。
+              </li>
+            </ul>
+          </div>
+          <div className="level2-item">
+            2.5 我们在您使用服务过程中处理的个人信息
+            <ul className="level3-list">
+              <li>
+                身份信息:为满足某些使用场景下的功能要求(例如个人名片功能),我们会要求您在使用相关功能前,配置您已取得合法授权的个人用户的身份信息,包括昵称、头像、手机号、邮箱、职位、地址。
+              </li>
+              <li>
+                设备信息:我们会根据您在软件安装及使用中授予的具体权限,接收并记录您已取得合法授权的个人用户所使用的设备相关信息(例如设备型号、操作系统版本、设备设置、唯一设备标识符)、设备所在位置相关信息(例如
+                IP 地址、GPS 位置以及能够提供相关信息的 WLAN
+                接入点、蓝牙和基站)。
+              </li>
+              <li>
+                日志信息:当您使用我们的网站或客户端提供的产品或服务时,我们会自动收集您已取得合法授权的个人用户对我们服务的详细使用情况,作为有关网络日志保存。例如您已取得合法授权的个人用户搜索查询内容、IP
+                地址、浏览器的类型、电信运营商、使用的语言、访问日期和时间及您已取得合法授权的个人用户访问的网页记录。
+              </li>
+              <li>
+                订单信息:为展示您账户的订单信息,我们会收集您已取得合法授权的个人用户在使用我们服务过程中产生的订单信息用于向按照您的要求展示及便于您对订单进行管理。
+              </li>
+              <li>
+                联系方式:与我们联系时,我们可能会保存通信/通话记录和内容或您/您指定且已取得合法授权的个人用户留下的联系方式,以便与您联系或帮助您解决问题,或记录相关问题的处理方案及结果。您或对应个人可以决定不提供上述信息,或要求删除之前提供的信息。但是,如果您这样做,可能会影响您获得、使用、购买我们产品或服务的体验或者精准度,或者会影响我们的网络平台的正常运行。
+              </li>
+              <li>
+                活动页面授权。您在使用由开邻智数提供的 H5
+                页面时,需进行公众号授权,点击允许后开邻智数将获取您已取得合法授权的个人的微信账号的头像、昵称、unionID,以便我们按照您的要求统计参加活动的数据。
+              </li>
+            </ul>
+          </div>
+          <div className="level2-item">
+            2.6 我们通过间接获得方式收集到的个人信息
+            <ul className="level3-list">
+              <li>
+                为确认交易状态及为您提供售后与争议解决服务,我们会通过您基于交易所选择的交易对象、支付机构、物流公司、第三方平台收集与交易进度、服务或产品相关的交易、支付、物流信息,或将上述交易信息提供给上述服务提供者。
+              </li>
+              <li>
+                您可通过开邻智数账号在我们提供的链接入口使用我们关联公司提供的产品或服务,为便于我们基于关联账号共同向您提供一站式服务并便于您统一进行管理,我们在开邻智数集中展示您的信息或推荐您感兴趣的信息。
+              </li>
+              <li>
+                当您通过我们产品或服务使用上述服务时,应当保证该等数据来源合法且已获得个人信息主体同意,不存在违法获取、使用、泄露个人信息等情形。
+              </li>
+              <li>
+                您可以决定不提供上述信息,或要求删除之前提供的信息。但是,如果您这样做,可能会影响您获得、使用、购买我们产品或服务的体验或者精准度,或者会影响我们的网络平台的正常运行。
+              </li>
+            </ul>
+          </div>
+          <div className="level2-item">
+            2.7 为您提供安全保障
+            <ul className="level3-list">
+              <li>
+                为提高您使用我们及我们关联公司、合作伙伴提供服务的安全性,保护您或其他用户或公众的人身财产安全免遭侵害,更好地预防钓鱼网站、欺诈、网络漏洞、计算机病毒、网络攻击、网络侵入等安全风险,更准确地识别违反法律法规或开邻智数相关协议规则的情况,我们可能使用或整合您的会员信息、交易信息、
+                设备信息、有关网络日志以及我们关联公司、合作伙伴取得您授权或依据法律共享的信息,来综合判断您账户及交易风险、进行身份验证、检测及防范安全事件,并依法采取必要的记录、审计、分析、处置措施。
+              </li>
+            </ul>
+          </div>
+          <div className="level2-item">
+            2.8 其他用途
+            <ul className="level3-list">
+              <li>
+                当我们要将信息用于本政策未载明的其他用途时,会事先征求您的同意。
+              </li>
+            </ul>
+          </div>
+          <div className="level2-item">
+            2.9 征得授权同意的例外
+            <ul className="level3-list">
+              <li>与国家安全、国防安全有关的;</li>
+              <li>与公共安全、公共卫生、重大公共利益有关的;</li>
+              <li>与犯罪侦查、起诉、审判和判决执行等有关的;</li>
+              <li>
+                出于维护您或其他个人的生命、财产等重大合法权益但又很难得到您本人同意的;
+              </li>
+              <li>所收集的个人信息是您自行向社会公众公开的;</li>
+              <li>
+                从合法公开披露的信息中收集个人信息的,如合法的新闻报道、政府信息公开等渠道;
+              </li>
+              <li>
+                用于维护所提供的产品或服务的安全稳定运行所必需的,例如发现、处置产品或服务故障;
+              </li>
+              <li>法律法规规定的其他情形。</li>
+            </ul>
+          </div>
+          <div className="level2-item">
+            2.10 重要提示
+            <ul className="level3-list">
+              <li>
+                如所有的企业都可能面临的问题一样,考虑到信息技术、网络空间本身的特点,在某些特殊情况下(例如黑客攻击、电信故障等),尽管我们采取了法律法规等规定的必要的措施,但仍然存在个人信息泄露的风险。
+              </li>
+              <li>
+                除非本隐私政策有其他规定,为了保护您的人身或财产安全,我们特别提示您不要通过公共网络,向我们或任何以我们名义为您提供服务的第三方,提供您的财产状况、健康生理、账户密码或验证码、通信内容等涉及您人身或财产安全的敏感个人信息。
+              </li>
+            </ul>
+          </div>
+
+          <div className="level1-title">三、我们如何对外提供您的个人信息</div>
+          <div className="level2-item">
+            3.1 共享
+            <ul className="level3-list">
+              <li>
+                我们不会与开邻智数服务提供者以外的公司、组织和个人共享您的个人信息,但以下情况除外:
+              </li>
+              <li>
+                在获取同意的情况下共享:获得您的同意后,我们会与其他方共享您的个人信息。
+              </li>
+              <li>
+                在法定情形下的共享:我们可能会根据法律法规规定、诉讼争议解决需要,或按行政、司法机关依法提出的要求,对外共享您的个人信息。
+              </li>
+            </ul>
+          </div>
+          <div className="level2-item">
+            3.2 转让
+            <ul className="level3-list">
+              <li>
+                我们不会将您的个人信息转让给任何公司、组织和个人,但以下情况除外:
+              </li>
+              <li>
+                在获取明确同意的情况下转让:获得您的明确同意后,我们会向其他方转让您的个人信息;
+              </li>
+              <li>
+                在涉及合并、收购或破产清算情形时,如涉及到个人信息转让,我们会要求新的持有您个人信息的公司、组织继续受本政策的约束,否则我们将要求该公司、组织和个人重新向您征求授权同意。
+              </li>
+            </ul>
+          </div>
+          <div className="level2-item">
+            3.3 公开披露
+            <ul className="level3-list">
+              <li>我们仅会在以下情况下,公开披露您的个人信息:</li>
+              <li>获得您明确同意后;</li>
+              <li>
+                基于法律的披露:在法律、法律程序、诉讼或政府主管部门强制性要求的情况下,我们可能会公开披露您的个人信息。
+              </li>
+            </ul>
+          </div>
+          <div className="level2-item">
+            3.4 委托处理
+            <ul className="level3-list">
+              <li>
+                我们可能委托授权合作伙伴处理您的个人信息,以便授权合作伙伴代表我们为您提供某些服务或履行职能。我们仅会出于本政策声明的合法、正当、必要、特定、明确的目的委托其处理您的信息,授权合作伙伴只能接触到其履行职责所需信息,且我们将会通过协议要求其不得将此信息用于其他任何超出委托范围的目的。如果授权合作伙伴将您的信息用于我们未委托的用途,其将单独征得您的同意。
+              </li>
+              <li>
+                目前,我们委托的授权合作伙伴包括供应商、服务提供商和其他合作伙伴。我们将信息委托给支持我们业务的供应商、服务提供商和其他合作伙伴处理,这些支持包括受我们委托提供的技术基础设施服务、分析我们服务的使用方式、提供客户服务、支付便利或进行学术研究和调查。
+              </li>
+            </ul>
+          </div>
+
+          <div className="level1-title">四、我们如何存储您的信息</div>
+          <div className="level2-item">
+            4.1 存储期限
+            <ul className="level3-list">
+              <li>
+                我们只会在达成本政策所述目的所需的期限内保留您的个人信息,除非法律有强制的留存要求。我们判断个人信息的存储期限主要依据以下标准:
+              </li>
+              <li>
+                向您提供服务的目的、维护相应服务及业务记录,以应对您可能的查询或投诉;
+              </li>
+              <li>保证我们为您提供服务的安全和质量;</li>
+              <li>您是否同意更长的留存期间;</li>
+              <li>是否存在关于保留期限的其他特别约定或法律法规规定。</li>
+              <li>
+                在超出保留期间后,我们会根据适用法律的要求删除或匿名化处理您的个人信息。
+              </li>
+            </ul>
+          </div>
+          <div className="level2-item">
+            4.2 存储位置
+            <ul className="level3-list">
+              <li>
+                我们在中华人民共和国境内运营中收集和产生的个人信息,将存储在中国境内。如我们有向境外实体提供您的个人信息的情形,我们将履行法律规定的以下义务:
+              </li>
+              <li>适用的法律有明确规定;</li>
+              <li>获得您的单独同意;</li>
+              <li>您作为一方当事人合同订立和履行所必需的。</li>
+            </ul>
+          </div>
+
+          <div className="level1-title">五、我们如何保护您个人信息</div>
+          <div className="level2-item">
+            5.1
+            为保障您的信息安全,我们努力采取各种符合业界标准的物理、电子和管理方面的安全措施来保护您的个人信息,防止您的个人信息遭到未经授权访问、公开披露、使用、修改、损坏或丢失。我们会采取一切合理可行的措施,保护您的个人信息。例如在您的浏览器与“服务”之间交换数据(如信用卡信息)时采用
+            SSL 加密保护技术;同时对网站本身提供 https
+            安全浏览方式;使用加密技术确保数据的保密性;使用受信赖的保护机制防止数据遭到恶意攻击;部署访问控制机制,确保只有授权人员才可访问个人信息;以及举办安全和隐私保护培训课程,加强员工对于保护个人信息重要性的认识。
+          </div>
+          <div className="level2-item">
+            5.2
+            互联网并非绝对安全的环境,我们强烈建议您通过安全方式,协助我们保证您的账号安全。互联网环境并非百分之百安全,我们将尽力保护您发送给我们的任何信息的安全性。如果我们的物理、技术、或管理防护设施遭到破坏,导致信息被非授权访问、公开披露、
+            篡改、或毁坏,导致您的合法权益受损,我们将承担相应的法律责任。
+          </div>
+          <div className="level2-item">
+            5.3
+            在不幸发生个人信息安全事件后,我们将按照法律法规的要求,及时向您告知:安全事件的基本情况和可能的影响、我们已采取或将要采取的处置措施、您可自主防范和降低风险的建议、对您的补救措施等。我们将及时将事件相关情况以邮件、信函、电话、推送通知等方式告知您,难以逐一告知个人信息主体时,我们会采取合理、有效的方式发布公告。同时,我们还将按照监管部门要求,主动上报个人信息安全事件的处置情况。
+          </div>
+
+          <div className="level1-title">六、您的权利</div>
+          <div className="level2-item">
+            6.1
+            按照中国相关的法律、法规、标准,以及其他国家、地区的通行做法,我们保障您对自己的个人信息行使以下权利:
+          </div>
+          <div className="level2-item">
+            6.2 访问您的个人信息
+            <ul className="level3-list">
+              <li>
+                您有权访问您的个人信息,法律法规规定的例外情况除外。如果您想行使数据访问权,可以通过以下方式自行访问:
+              </li>
+              <li>
+                账户信息——如果您希望访问或编辑您的账户中的个人资料信息和支付信息、更改您的密码、
+                添加安全信息或关闭您的账户,您可以通过访问开邻智数相关网页执行此类操作。
+              </li>
+              <li>
+                订单信息——您可以在开邻智数中查阅您的订单记录、交易记录。如果您无法通过上述链接访问这些个人信息,您可以随时联系我们的客服。我们将尽快回复您的访问请求。
+              </li>
+            </ul>
+          </div>
+          <div className="level2-item">
+            6.3 更正您的个人信息
+            <ul className="level3-list">
+              <li>
+                当您发现我们处理的关于您的个人信息有错误时,您有权要求我们做出更正。您可以通过上述“6.2
+                访问您的个人信息”中罗列的方式提出更正申请。
+              </li>
+            </ul>
+          </div>
+          <div className="level2-item">
+            6.4 删除您的个人信息
+            <ul className="level3-list">
+              <li>在以下情形中,您可以向我们提出删除个人信息的请求:</li>
+              <li>如果我们处理个人信息的行为违反法律法规;</li>
+              <li>如果我们收集、使用您的个人信息,却未征得您的明确同意;</li>
+              <li>如果我们处理个人信息的行为严重违反了与您的约定;</li>
+              <li>如果您不再使用我们的产品或服务,或您主动注销了账号;</li>
+              <li>如果我们永久不再为您提供产品或服务。</li>
+              <li>
+                若我们决定响应您的删除请求,我们还将同时尽可能通知从我们处获得您的个人信息的主体,要求其及时删除,除非法律法规另有规定,或这些主体获得您的独立授权。
+                当您从我们的服务中删除信息后,我们可能不会立即从备份系统中删除相应的信息,但会在备份更新时删除或匿名化处理这些信息。
+              </li>
+            </ul>
+          </div>
+          <div className="level2-item">
+            6.5 改变您授权同意的范围
+            <ul className="level3-list">
+              <li>
+                每个业务功能需要一些基本的个人信息才能得以完成(见本隐私政策第二条)。除此之外,对于额外个人信息的收集和使用,您可以随时给予或收回您的授权同意。
+              </li>
+              <li>
+                您可以随时通过本政策第十条公示的联系方式联系我们,为保障安全,您可能需要提供书面请求,或以其他方式证明您的身份。我们可能会先要求您验证自己的身份,然后再处理您的请求。我们将在
+                30
+                天内回复您的改变授权同意或者不想接受我们给您发送的商业广告的请求。
+              </li>
+              <li>
+                当您收回同意后,我们将不再处理相应的个人信息。但您收回同意的决定,不会影响此前基于您的授权而开展的个人信息处理。
+                对于您合理的请求,我们原则上不收取费用,但对多次革复、超出合理限度的请求,我们将视情收取一定成本费用。对于无端重复、需要过多技术手段(例如,需要开发新系统或从根本上改变现行惯例)、给他人合法权益带来风险或者非常不切实际(例如,涉及备份磁带上存放的信息)的请求,我们可能会予以拒绝。
+              </li>
+            </ul>
+          </div>
+          <div className="level2-item">
+            6.6 在以下情形中,按照法律法规要求,我们将无法响应您的请求:
+            <ul className="level3-list">
+              <li>与我们履行法律法规规定的义务相关的;</li>
+              <li>与国家安全、国防安全直接相关的;</li>
+              <li>与公共安全、公共卫生、亟大公共利益直接相关的;</li>
+              <li>与犯罪侦查、起诉、审判和判决执行等亘接相关的;</li>
+              <li>有充分证据表明您存在主观恶意或滥用权利的;</li>
+              <li>
+                出于维护个您或其他个人的生命、财产等重大合法权益但又很难得到您本人同意的;
+              </li>
+              <li>
+                响应您的请求将导致您或其他个人、组织的合法权益受到严重损害的。
+              </li>
+              <li>涉及商业秘密的。</li>
+            </ul>
+          </div>
+
+          <div className="level1-title">七、如何使用 Cookie 及同类技术</div>
+          <div className="level2-item">
+            7.1 Cookie
+            <ul className="level3-list">
+              <li>
+                Cookie
+                是一份网站可向您的浏览器发送的数据,之后可能以匿名标签的形式存储在您的计算机中,用以识别计算机信息。开邻智数部分页面会使用由开邻智数发送的
+                Cookies或其他技术,以便在您再次访问网站时提供更好的服务。您可以将浏览器设置成在收到
+                Cookies
+                之前通知您,让您有机会决定是否接受。您还可以将浏览器设置成关闭
+                Cookies。不过,如果您这样做,部分网站功能可能无法正常工作。
+              </li>
+            </ul>
+          </div>
+          <div className="level2-item">
+            7.2 网站信标和像素
+            <ul className="level3-list">
+              <li>
+                开邻智数网页可能包含称为“Web
+                信标”的电子图像(有时也称为单像素图像),便于我们统计访问了这些页面的用户数,并且提供联合品牌化服务。Web
+                信标是我们用来编制网站使用情况,相关合并统计数据的工具。Web
+                信标仅收集有限的信息集,包括
+                Cookie编号、页面查看时间与日期,以及 Web 信标所在的页面描述。
+              </li>
+            </ul>
+          </div>
+
+          <div className="level1-title">八、未成年人权利保护</div>
+          <div className="level2-item">
+            8.1
+            我们非常重视未成年人的个人信息保护。我们向企业级客户提供数据技术服务,我们不接受任何未成年人注册成为我们的用户,也不会主动收集未成年人的个人信息。受制于现有技术和业务模式,我们很难主动识别未成年人的信息,如果未成年人的监护人发现存在未经授权而收集未成年人个人信息,监护人可通知我们予以删除,如我们自己发现前述情形,我们也会主动予以删除。
+          </div>
+          <div className="level2-item">
+            8.2
+            如涉及您的平台面向未成年人开放且有可能收集到未成年人个人信息,请您注意:
+            <ul className="level3-list">
+              <li>
+                请您关注未成年人是否是在取得监护人的授权同意之后使用您的服务。
+              </li>
+              <li>
+                对于经父母或其他监护人同意使用我们的产品或服务而收集未成年人信息的情况,我们只会在法律法规允许、父母或其他监护人明确同意或者保护未成年人所必要
+                的情况下根据您的授权委托收集、使用、共享、转让或披露此信息。
+              </li>
+            </ul>
+          </div>
+
+          <div className="level1-title">九、数据的跨境转移</div>
+          <div className="level2-item">
+            9.1
+            我们在中华人民共和国境内运营中收集和产生的数据将按照法律法规规定存储于中国境内,不会向境外转移。
+          </div>
+
+          <div className="level1-title">十、本隐私政策的改动</div>
+          <div className="level2-item">
+            10.1
+            为给您提供更好的服务,我们的业务将不时变化,本隐私政策也将随之调整。我们会通过在我们官网上发出更新版本或以其他方式提醒您相关内容的更新,也请您访问我们以便及时了解最新的隐私政策。在前述情况下,若您继续使用我们的服务,即表示同意接受修改后的本政策并受之约束。
+          </div>
+          <div className="level2-item">
+            10.2
+            未经您明确同意,我们不会削减您按照本隐私政策所应享有的权利。我们会在本页面上发布对本政策所做的任何变更。对于重大变更,我们还会提供更为显著的通知,您可以在开邻智数官网随时查看。
+          </div>
+          <div className="level2-item">
+            10.3 本政策所指的重大变更包括但不限于:
+            <ul className="level3-list">
+              <li>
+                我们的服务模式发生重大变化。如处理个人信息的目的、处理的个人信息类型、个人信息的使用方式等;
+              </li>
+              <li>
+                我们在所有权结构、组织架构等方面发生重大变化。如业务调整、破产并购等引起的所有者变更等;
+              </li>
+              <li>个人信息共享、转让或公开披露的主要对象发生变化;</li>
+              <li>您参与个人信息处理方面的权利及其行使方式发生重大变化;</li>
+              <li>
+                我们负责处理个人信息安全的责任部门、联络方式及投诉渠道发生变化时;
+              </li>
+              <li>
+                个人信息安全影响评估报告表明存在高风险时。我们还会将本政策的旧版本存档,供您查阅。
+              </li>
+            </ul>
+          </div>
+        </div>
+      </div>
+    </div>
+  );
+};
+
+export default Privacy;

+ 343 - 0
retrieval/src/pages/Solution/ContactPage.tsx

@@ -0,0 +1,343 @@
+import { Globe, Mail, MapPin } from "lucide-react";
+import { motion } from "motion/react";
+import { useEffect, useRef, useState } from "react";
+import { Button, Checkbox, Form, Input, message } from "antd";
+import { apiRequest, type ApiResponse } from "../../services/request";
+
+const sectionReveal = {
+  initial: { opacity: 0, y: 40 },
+  whileInView: { opacity: 1, y: 0 },
+  viewport: { once: true, amount: 0.25 },
+  transition: { duration: 0.7, ease: "easeOut" as const },
+};
+
+export default function ContactPage() {
+  const [form] = Form.useForm();
+  const [messageApi, contextHolder] = message.useMessage();
+  const [sendingCode, setSendingCode] = useState(false);
+  const [countdown, setCountdown] = useState(0);
+  const [submitting, setSubmitting] = useState(false);
+  const [sentJustNow, setSentJustNow] = useState(false);
+  const sentTimerRef = useRef<number | null>(null);
+
+  useEffect(() => {
+    if (countdown <= 0) return;
+    const timer = window.setInterval(() => {
+      setCountdown((prev) => (prev <= 1 ? 0 : prev - 1));
+    }, 1000);
+    return () => window.clearInterval(timer);
+  }, [countdown]);
+
+  useEffect(() => {
+    return () => {
+      if (sentTimerRef.current) window.clearTimeout(sentTimerRef.current);
+    };
+  }, []);
+
+  const isSuccessResponse = (res: ApiResponse) => {
+    if (res?.code === undefined || res?.code === null || res?.code === "")
+      return true;
+    return ["success"].includes(res.code as string);
+  };
+
+  const handleSendCode = async () => {
+    try {
+      const { phone } = await form.validateFields(["phone"]);
+      setSendingCode(true);
+      const res = await apiRequest("/api/website/lead_message/send_code", {
+        method: "POST",
+        data: { phone },
+      });
+      if (!isSuccessResponse(res)) {
+        messageApi.error(res?.msg || "验证码发送失败,请稍后重试");
+        return;
+      }
+      messageApi.success(res?.msg || "验证码发送成功");
+      setSentJustNow(true);
+      if (sentTimerRef.current) window.clearTimeout(sentTimerRef.current);
+      sentTimerRef.current = window.setTimeout(() => {
+        setSentJustNow(false);
+        setCountdown(60);
+      }, 900);
+    } catch {
+      // form 校验失败时不提示额外文案
+    } finally {
+      setSendingCode(false);
+    }
+  };
+
+  const handleSubmit = async (values: {
+    user_name: string;
+    position?: string;
+    phone: string;
+    code: string;
+    company_name: string;
+    privacy: boolean;
+  }) => {
+    try {
+      setSubmitting(true);
+      const { privacy, ...payload } = values;
+      const res = await apiRequest("/api/website/lead_message/add", {
+        method: "POST",
+        data: payload,
+      });
+      if (!isSuccessResponse(res)) {
+        messageApi.error(res?.msg || "提交失败,请稍后重试");
+        return;
+      }
+      messageApi.success(res?.msg || "提交成功");
+      form.resetFields([
+        "user_name",
+        "position",
+        "phone",
+        "code",
+        "company_name",
+        "privacy",
+      ]);
+      setCountdown(0);
+    } finally {
+      setSubmitting(false);
+    }
+  };
+
+  return (
+    <div className="pt-32 pb-24 px-6 max-w-7xl mx-auto text-slate-100">
+      {contextHolder}
+      <div className="grid grid-cols-1 lg:grid-cols-12 gap-12 items-start">
+        <motion.div
+          style={{ marginTop: 82 }}
+          className="lg:col-span-5 space-y-10"
+          {...sectionReveal}
+        >
+          <motion.div
+            initial={{ opacity: 0, y: 20 }}
+            animate={{ opacity: 1, y: 0 }}
+            className="space-y-4"
+          >
+            <h1 className="font-headline text-5xl font-extrabold tracking-tight text-white leading-tight">
+              联系我们 <br />
+              <div style={{ marginTop: 36 }} className="text-secondary">
+                开启渠道价格管控之旅
+              </div>
+            </h1>
+            <p
+              style={{ marginTop: 76 }}
+              className="text-lg text-slate-300 leading-relaxed max-w-md"
+            >
+              填写您的信息,专业顾问将在24小时内与您取得联系,为您提供专属的解决方案。
+            </p>
+          </motion.div>
+
+          {/* <div className="space-y-8">
+            {[
+              // {
+              //   icon: Globe,
+              //   title: "公司名称",
+              //   value: "深圳大方无隅科技有限公司",
+              //   color: "bg-blue-500/15 text-blue-400",
+              // },
+              // {
+              //   icon: MapPin,
+              //   title: "公司地址",
+              //   value: "深圳市龙华区",
+              //   color: "bg-slate-800 text-slate-300",
+              // },
+              {
+                icon: Mail,
+                title: "商务合作",
+                value: "bd@dotouch.tech",
+                color: "bg-slate-800 text-slate-300",
+              },
+            ].map((item, i) => (
+              <div key={i} className="flex items-start gap-6 group">
+                <div
+                  className={`w-14 h-14 rounded-xl ${item.color} flex items-center justify-center shrink-0 transition-transform group-hover:-translate-y-1`}
+                >
+                  <item.icon className="w-7 h-7" />
+                </div>
+                <div>
+                  <h3 className="font-headline font-bold text-white mb-1">{item.title}</h3>
+                  <p className="text-slate-300 font-medium">{item.value}</p>
+                </div>
+              </div>
+            ))}
+          </div> */}
+        </motion.div>
+
+        <motion.div className="lg:col-span-7" {...sectionReveal}>
+          <motion.div
+            initial={{ opacity: 0, y: 16 }}
+            animate={{ opacity: 1, y: 0 }}
+            className="bg-slate-900 rounded-2xl p-8 md:p-12 shadow-xl border border-slate-800"
+          >
+            <div className="mb-10">
+              <h2 className="font-headline text-3xl font-bold text-white mb-2">
+                留下您的信息
+              </h2>
+            </div>
+            <Form
+              form={form}
+              layout="vertical"
+              className="space-y-6"
+              onFinish={handleSubmit}
+            >
+              <div className="grid grid-cols-1 md:grid-cols-2 gap-6">
+                <div className="space-y-2">
+                  <label className="text-xs font-semibold uppercase tracking-wider text-slate-500 ml-1">
+                    称呼
+                  </label>
+                  <Form.Item
+                    name="user_name"
+                    className="!mb-0"
+                    rules={[{ required: true, message: "请输入称呼" }]}
+                  >
+                    <Input
+                      className="!w-full !bg-slate-950 !border !border-slate-800 !rounded-lg !px-4 !py-3 !text-slate-100 placeholder:!text-slate-500"
+                      placeholder="请输入您的姓名"
+                    />
+                  </Form.Item>
+                </div>
+                <div className="space-y-2">
+                  <label className="text-xs font-semibold uppercase tracking-wider text-slate-500 ml-1">
+                    部门和职务(可选)
+                  </label>
+                  <Form.Item name="position" className="!mb-0">
+                    <Input
+                      className="!w-full !bg-slate-950 !border !border-slate-800 !rounded-lg !px-4 !py-3 !text-slate-100 placeholder:!text-slate-500"
+                      placeholder="例如:销售部 总监"
+                    />
+                  </Form.Item>
+                </div>
+              </div>
+              <div className="grid grid-cols-1 md:grid-cols-2 gap-6">
+                <div className="space-y-2">
+                  <label className="text-xs font-semibold uppercase tracking-wider text-slate-500 ml-1">
+                    手机号
+                  </label>
+                  <Form.Item
+                    name="phone"
+                    className="!mb-0"
+                    rules={[
+                      { required: true, message: "请输入手机号" },
+                      {
+                        pattern: /^1\d{10}$/,
+                        message: "请输入正确的11位手机号",
+                      },
+                    ]}
+                  >
+                    <Input
+                      className="!w-full !bg-slate-950 !border !border-slate-800 !rounded-lg !px-4 !py-3 !text-slate-100 placeholder:!text-slate-500"
+                      placeholder="请输入手机号码"
+                    />
+                  </Form.Item>
+                </div>
+                <div className="space-y-2">
+                  <label className="text-xs font-semibold uppercase tracking-wider text-slate-500 ml-1">
+                    验证码
+                  </label>
+                  <div className="relative">
+                    <Form.Item
+                      name="code"
+                      className="!mb-0"
+                      rules={[{ required: true, message: "请输入验证码" }]}
+                    >
+                      <Input
+                        className="!w-full !bg-slate-950 !border !border-slate-800 !rounded-lg !px-4 !py-3 !pr-24 !text-slate-100 placeholder:!text-slate-500"
+                        placeholder="请输入验证码"
+                      />
+                    </Form.Item>
+                    <Button
+                      type="text"
+                      loading={sendingCode}
+                      disabled={sendingCode || sentJustNow || countdown > 0}
+                      onClick={handleSendCode}
+                      className="!absolute !right-2 !top-1.5 !bottom-1.5 !px-3 !text-xs !font-bold !text-blue-300 !bg-slate-800 !rounded-md hover:!bg-secondary hover:!text-white !transition-all"
+                    >
+                      {sentJustNow
+                        ? "已发送"
+                        : countdown > 0
+                          ? `${countdown}s`
+                          : "获取验证码"}
+                    </Button>
+                  </div>
+                </div>
+              </div>
+              <div className="space-y-2">
+                <label className="text-xs font-semibold uppercase tracking-wider text-slate-500 ml-1">
+                  公司名称
+                </label>
+                <Form.Item
+                  name="company_name"
+                  className="!mb-0"
+                  rules={[{ required: true, message: "请输入公司名称" }]}
+                >
+                  <Input
+                    className="!w-full !bg-slate-950 !border !border-slate-800 !rounded-lg !px-4 !py-3 !text-slate-100 placeholder:!text-slate-500"
+                    placeholder="请输入您的公司全称"
+                  />
+                </Form.Item>
+              </div>
+              {/* <div className="space-y-2">
+                <label className="text-xs font-semibold uppercase tracking-wider text-slate-500 ml-1">
+                  具体需求 (可选)
+                </label>
+                <textarea
+                  className="w-full bg-slate-950 border border-slate-800 rounded-lg px-4 py-3 text-slate-100 placeholder:text-slate-500 focus:ring-1 focus:ring-secondary outline-none resize-none"
+                  placeholder="请简述您面临的业务挑战"
+                  rows={3}
+                  name="requirement"
+                ></textarea>
+              </div> */}
+              <div className="flex items-center gap-3 py-2">
+                <Form.Item
+                  name="privacy"
+                  valuePropName="checked"
+                  className="!mb-0"
+                  rules={[
+                    {
+                      validator: (_, value) =>
+                        value
+                          ? Promise.resolve()
+                          : Promise.reject(
+                              new Error("请先阅读并同意隐私协议与用户协议"),
+                            ),
+                    },
+                  ]}
+                >
+                  <Checkbox className="[&_.ant-checkbox-inner]:!bg-slate-900 [&_.ant-checkbox-inner]:!border-slate-600">
+                    <span className="text-xs text-slate-400">
+                      我已阅读并同意
+                      <a
+                        className="text-secondary hover:underline"
+                        href="/privacy"
+                        target="_blank"
+                        rel="noreferrer"
+                      >
+                        《隐私协议》
+                      </a>
+                      <a
+                        className="text-secondary hover:underline"
+                        href="/agreement"
+                        target="_blank"
+                        rel="noreferrer"
+                      >
+                        《用户协议》
+                      </a>
+                    </span>
+                  </Checkbox>
+                </Form.Item>
+              </div>
+              <button
+                type="submit"
+                disabled={submitting}
+                className="w-full bg-primary text-white py-4 rounded-lg font-bold text-lg shadow-lg hover:bg-secondary transition-all active:scale-95 disabled:opacity-60 disabled:cursor-not-allowed"
+              >
+                提交信息
+              </button>
+            </Form>
+          </motion.div>
+        </motion.div>
+      </div>
+    </div>
+  );
+}

+ 285 - 0
retrieval/src/pages/zjy/HomePage.tsx

@@ -0,0 +1,285 @@
+import { useState } from "react";
+import { BellRing, Check, EyeOff, Globe, Lock, UserSearch, Users, Zap } from "lucide-react";
+import { AnimatePresence, motion } from "motion/react";
+import { useNavigate } from "react-router-dom";
+import imageM3T11 from "../../assets/images/zjy/m3_t11.png";
+import imageM3T22 from "../../assets/images/zjy/m3_t22.png";
+import imageM3T33 from "../../assets/images/zjy/m3_t33.png";
+import imageM3T44 from "../../assets/images/zjy/m3_t44.png";
+import imageM3T55 from "../../assets/images/zjy/m3_t55.png";
+
+const sectionReveal = {
+  initial: { opacity: 0, y: 40 },
+  whileInView: { opacity: 1, y: 0 },
+  viewport: { once: true, amount: 0.25 },
+  transition: { duration: 0.7, ease: "easeOut" as const },
+};
+
+const itemReveal = {
+  initial: { opacity: 0, y: 24 },
+  whileInView: { opacity: 1, y: 0 },
+  viewport: { once: true, amount: 0.35 },
+  transition: { duration: 0.55, ease: "easeOut" as const },
+};
+
+export default function HomePage() {
+  const navigate = useNavigate();
+  const [activeTab, setActiveTab] = useState(0);
+  const tabs = ["看的全", "看的准", "看的透", "管的住", "定制化"];
+
+  const tabData = [
+    {
+      title: "全量自动化,动态不缺席",
+      desc: "全平台覆盖,监控无死角",
+      features: [
+        { title: "全平台扫描", desc: "覆盖B端、C端及O端全渠道,7x24小时不间断监测。" },
+        { title: "高频采集", desc: "支持海量账号接入,最高实现T+1频率的数据采集。" },
+        { title: "智能清洗", desc: "自动识别并清洗低价链接,确保数据纯净度。" },
+        { title: "多维看板", desc: "提供多维度的数据可视化看板,实时掌握市场动态。" },
+      ],
+      image: imageM3T11,
+    },
+    {
+      title: "全程可追溯,溯源有妙招",
+      desc: "颗粒度精细,源头可追溯",
+      features: [
+        { title: "精细颗粒度", desc: "数据颗粒度最小可至单品级,精准定位违规源头。" },
+        { title: "主体识别", desc: "准确识别违规店铺的经营主体信息,锁定责任人。" },
+        { title: "技术穿透", desc: "支持技术穿透手段,结合人工溯源,核实店铺主体真实性。" },
+        { title: "证据固化", desc: "记录违规证据,为后续处理提供坚实依据。" },
+      ],
+      image: imageM3T22,
+    },
+    {
+      title: "精准锁定,违规无死角",
+      desc: "精准锁定不手软,违规踪迹全看穿",
+      features: [
+        { title: "SaaS系统", desc: "自研SaaS系统,让违规链接无所遁形。" },
+        { title: "主体识别", desc: "支持本地化部署。" },
+        {
+          title: "海量数据对接",
+          desc: "联动“码上放心平台”提供整套技术解决方案,可对接海量数据,支撑全链路价格数据治理。",
+        },
+      ],
+      image: imageM3T33,
+    },
+    {
+      title: "违规速下架,合规强落地",
+      desc: "多端响应,违规速下架",
+      features: [
+        { title: "实时推送", desc: "多端实时消息推送,1V1触达相关责任人。" },
+        { title: "快速响应", desc: "最高支持T+1推送信息,确保第一时间介入处理。" },
+        { title: "联动下架", desc: "联动品牌方推动B端违规链接下架,形成合力遏制。" },
+        { title: "技术下架", desc: "技术手段实现C端违规链接的快速下架,筑牢合规防线。" },
+      ],
+      image: imageM3T44,
+    },
+    {
+      title: "数据赋能业务,个性化提升品牌价值",
+      desc: "掌行业价格指数,握市场定价先机",
+      features: [
+        {
+          title: "",
+          desc: "以四大核心优势为基础,以大数据、AI人工智能、全链路溯源技术为核心,实时监控行业整体价格动态,精准呈现品类、区域、竞品价格走势,可提供行业产品价格报告等服务。",
+        },
+      ],
+      image: imageM3T55,
+    },
+  ];
+
+  return (
+    <div className="pt-20">
+      <motion.section
+        className="relative overflow-hidden pt-24 pb-32 px-6 bg-slate-950"
+        initial={{ opacity: 0, y: 32, scale: 0.98 }}
+        animate={{ opacity: 1, y: 0, scale: 1 }}
+        transition={{ duration: 0.9, ease: "easeOut" }}
+      >
+        <div className="absolute inset-0 pointer-events-none">
+          <div className="absolute inset-0 bg-[radial-gradient(circle_at_top,rgba(37,99,235,0.18),transparent_45%)]"></div>
+          <div className="absolute inset-0 bg-[linear-gradient(to_bottom,rgba(15,23,42,0),rgba(15,23,42,0.75))]"></div>
+          <div className="absolute left-1/2 top-1/2 h-[120%] w-3 -translate-x-1/2 -translate-y-1/2 rotate-45 bg-blue-500/10 blur-sm rounded-full"></div>
+          <div className="absolute left-1/2 top-1/2 h-[120%] w-3 -translate-x-1/2 -translate-y-1/2 -rotate-45 bg-blue-500/10 blur-sm rounded-full"></div>
+        </div>
+        <div className="max-w-7xl mx-auto">
+          <motion.div
+            initial={{ opacity: 0, y: 24 }}
+            animate={{ opacity: 1, y: 0 }}
+            transition={{ delay: 0.15, duration: 0.7, ease: "easeOut" }}
+            className="relative z-10 max-w-5xl mx-auto space-y-8 text-center"
+          >
+            <div style={{ fontSize: '2em', padding: '20px' }} className="inline-flex items-center gap-2 px-4 py-1.5 rounded-full bg-white/5 border border-white/10 text-blue-200 text-xs font-bold uppercase tracking-widest">
+              开邻智价云
+            </div>
+            <h1 className="text-5xl md:text-7xl font-extrabold font-headline leading-[1.08] tracking-tight text-white">
+              让每一盒药品的价格都尽在掌握 <br />
+            </h1>
+            <p className="text-xl text-slate-300 font-medium max-w-3xl leading-relaxed mx-auto">
+              线上平台价格数据治理,医药品牌工业全链路解决方案。
+            </p>
+            <div className="flex items-center justify-center gap-6 flex-wrap">
+              <button
+                onClick={() => navigate("/contact")}
+                className="bg-blue-600 text-white px-10 py-4 rounded-xl font-bold text-lg hover:shadow-[0_0_30px_rgba(37,99,235,0.45)] transition-all hover:-translate-y-1"
+              >
+                获取方案
+              </button>
+            </div>
+          </motion.div>
+        </div>
+      </motion.section>
+
+      <motion.section className="py-24 bg-slate-900 px-6" {...sectionReveal}>
+        <div className="max-w-7xl mx-auto">
+          <div className="mb-16 text-center">
+            <h2 className="text-3xl font-extrabold font-headline text-white mb-4">行业渠道治理的痛点</h2>
+            <div className="h-1.5 w-20 bg-blue-600 mx-auto rounded-full"></div>
+          </div>
+          <div className="grid grid-cols-1 md:grid-cols-4 gap-8">
+            {[
+              {
+                icon: UserSearch,
+                title: "违规商家锁定难",
+                desc: "海量商户分散在各大电商平台,跨平台追踪身份困难,违规主体难以穿透锁定。",
+              },
+              {
+                icon: Zap,
+                title: "人工效率低",
+                desc: "传统人工采集数据延迟大、覆盖窄,无法满足品牌方对实时价格变动的监控需求。",
+              },
+              {
+                icon: BellRing,
+                title: "链路冗长预警慢",
+                desc: "从发现价格破发到反馈至业务端链路漫长,错失最佳处置窗口期,品牌价值受损。",
+              },
+              {
+                icon: EyeOff,
+                title: "监控局限处置迟",
+                desc: "监控盲区多,且缺乏有效的自动化下架与法律固证手段,合规落地执行力不足。",
+              },
+            ].map((item, i) => (
+              <motion.div
+                key={i}
+                {...itemReveal}
+                whileHover={{ y: -5 }}
+                className="bg-slate-900/70 p-8 rounded-xl shadow-sm border border-slate-800 transition-all"
+              >
+                <div className="w-12 h-12 rounded-lg bg-blue-500/15 flex items-center justify-center text-blue-400 mb-6">
+                  <item.icon className="w-6 h-6" />
+                </div>
+                <h3 className="text-xl font-bold mb-3 font-headline text-white">{item.title}</h3>
+                <p className="text-slate-300 text-sm leading-relaxed">{item.desc}</p>
+              </motion.div>
+            ))}
+          </div>
+        </div>
+      </motion.section>
+
+      <motion.section className="py-32 px-6 bg-slate-950" {...sectionReveal}>
+        <div className="max-w-7xl mx-auto">
+          <div className="flex flex-col md:flex-row items-end justify-between mb-16 gap-6">
+            <h2 className="text-4xl font-extrabold font-headline text-white leading-tight">
+              4+1 服务优势
+              <br />
+              <span className="text-blue-600">全方位守护品牌渠道价值</span>
+            </h2>
+            <div className="flex items-center gap-4 border-b border-slate-800 w-full md:w-auto overflow-x-auto pb-2">
+              {tabs.map((tab, i) => (
+                <button
+                  key={i}
+                  onClick={() => setActiveTab(i)}
+                  className={`px-6 py-2 font-bold whitespace-nowrap transition-all ${
+                    activeTab === i ? "text-blue-600 border-b-2 border-blue-600" : "text-slate-400 hover:text-white"
+                  }`}
+                >
+                  {tab}
+                </button>
+              ))}
+            </div>
+          </div>
+
+          <AnimatePresence mode="wait">
+            <motion.div
+              key={activeTab}
+              initial={{ opacity: 0, y: 10 }}
+              animate={{ opacity: 1, y: 0 }}
+              exit={{ opacity: 0, y: -10 }}
+              transition={{ duration: 0.3 }}
+              className="bg-slate-900 rounded-3xl p-8 md:p-12 border border-slate-800"
+            >
+              <div className="grid grid-cols-1 md:grid-cols-2 gap-16 items-center">
+                <div className="space-y-8">
+                  <div>
+                    <h3 className="text-3xl font-extrabold text-white mb-4 font-headline">{tabData[activeTab].title}</h3>
+                    <p className="text-slate-300 leading-relaxed text-lg">{tabData[activeTab].desc}</p>
+                  </div>
+                  <div className="space-y-4">
+                    {tabData[activeTab].features.map((feature, i) => (
+                      <div key={i} className="flex items-start gap-4">
+                        <div className="w-6 h-6 rounded-full bg-blue-500/15 flex items-center justify-center text-blue-400 mt-1">
+                          <Check className="w-4 h-4" />
+                        </div>
+                        <div>
+                          <p className="font-bold text-slate-100">{feature.title}</p>
+                          <p className="text-sm text-slate-400">{feature.desc}</p>
+                        </div>
+                      </div>
+                    ))}
+                  </div>
+                </div>
+                <div className="relative">
+                  <img
+                    src={tabData[activeTab].image}
+                    alt={tabData[activeTab].title}
+                    className="shadow-xl h-[360px] w-auto max-w-full object-contain mx-auto"
+                    referrerPolicy="no-referrer"
+                  />
+                </div>
+              </div>
+            </motion.div>
+          </AnimatePresence>
+        </div>
+      </motion.section>
+
+      <motion.section className="py-24 bg-slate-900 text-white px-6 border-y border-slate-800" {...sectionReveal}>
+        <div className="max-w-7xl mx-auto">
+          <div className="text-center mb-20">
+            <h2 className="text-4xl font-extrabold font-headline mb-4">为什么选择开邻智价云?</h2>
+            <p className="text-slate-300 text-lg">更智能的数据治理,更高效的渠道管理</p>
+          </div>
+          <div className="grid grid-cols-1 md:grid-cols-4 gap-12">
+            {[
+              { icon: Globe, title: "全域智控", desc: "支持全平台全时段配置的价格舆情监控系统" },
+              { icon: BellRing, title: "预警触达", desc: "多端最高T+1预警通知与1V1消息提醒" },
+              { icon: Users, title: "专业服务", desc: "专属服务团队,及时响应,提供数据服务" },
+              { icon: Lock, title: "数据无忧", desc: "专属技术团队支持个性化开发" },
+            ].map((item, i) => (
+              <motion.div key={i} className="text-center space-y-4" {...itemReveal}>
+                <div className="inline-flex items-center justify-center w-20 h-20 rounded-2xl bg-blue-500/15 text-blue-400 mb-2">
+                  <item.icon className="w-10 h-10" />
+                </div>
+                <h4 className="text-xl font-bold font-headline">{item.title}</h4>
+                <p className="text-slate-300 text-sm">{item.desc}</p>
+              </motion.div>
+            ))}
+          </div>
+        </div>
+      </motion.section>
+
+      <motion.section className="py-24 px-6 text-center bg-slate-950" {...sectionReveal}>
+        <div className="max-w-3xl mx-auto space-y-8">
+          <h2 className="text-4xl font-extrabold font-headline text-white">技术沉淀,只为提供更可靠的解决方案!</h2>
+          <p className="text-xl text-slate-300 font-medium">做更具价值和效率的服务商</p>
+          <div className="flex flex-col md:flex-row items-center justify-center gap-4">
+            <button
+              onClick={() => navigate("/contact")}
+              className="w-full md:w-auto bg-blue-600 text-white px-10 py-4 rounded-lg font-bold hover:bg-blue-500 transition-colors"
+            >
+              联系我们
+            </button>
+          </div>
+        </div>
+      </motion.section>
+    </div>
+  );
+}

+ 42 - 0
retrieval/src/services/request.ts

@@ -0,0 +1,42 @@
+import request from "umi-request";
+export const getApiBase = (): string => {
+  const isDev = process.env.NODE_ENV === "development";
+  const origin = isDev ? "https://retrieveapi.dfwy.tech" : 'https://retrieveapi.findit.ltd';
+  return String(origin).trim().replace(/\/+$/, "");
+};
+
+export const API_PREFIX = "";
+
+export type ApiResponse<T = any> = {
+  code?: string;
+  data?: T;
+  msg?: string;
+  [key: string]: any;
+};
+
+type ApiRequestOptions = {
+  method?: "GET" | "POST" | "PUT" | "DELETE";
+  data?: any;
+  params?: any;
+  headers?: Record<string, string>;
+};
+
+const buildUrl = (path: string) => {
+  if (/^https?:\/\//.test(path)) return path;
+  const base = getApiBase();
+  const p = path.startsWith("/") ? path : `/${path}`;
+  return `${base}${API_PREFIX}${p}`;
+};
+
+export const apiRequest = async <T = any>(
+  path: string,
+  options: ApiRequestOptions = {},
+) => {
+  const url = buildUrl(path);
+  return request<ApiResponse<T>>(url, {
+    method: options.method || "GET",
+    data: options.data,
+    params: options.params,
+    headers: options.headers,
+  });
+};

+ 6 - 0
retrieval/src/utils/utils.ts

@@ -0,0 +1,6 @@
+export const products = [
+  {
+    name: "开邻智数",
+    url: "https://saas.kailin.com.cn",
+  },
+];

+ 1 - 0
retrieval/src/vite-env.d.ts

@@ -0,0 +1 @@
+/// <reference types="vite/client" />

+ 19 - 0
retrieval/tailwind.config.cjs

@@ -0,0 +1,19 @@
+module.exports = {
+  content: ['./index.html', './src/**/*.{js,ts,jsx,tsx}'],
+  theme: {
+    extend: {
+      colors: {
+        primary: '#00327d',
+        secondary: '#005ab7',
+        surface: '#f7f9fb',
+        'on-surface': '#191c1e',
+        'on-surface-variant': '#434653',
+      },
+      fontFamily: {
+        headline: ['Manrope', 'sans-serif'],
+        body: ['Inter', 'sans-serif'],
+      },
+    },
+  },
+  plugins: [],
+};

+ 26 - 0
retrieval/tsconfig.json

@@ -0,0 +1,26 @@
+{
+  "compilerOptions": {
+    "target": "ES2022",
+    "experimentalDecorators": true,
+    "useDefineForClassFields": false,
+    "module": "ESNext",
+    "lib": [
+      "ES2022",
+      "DOM",
+      "DOM.Iterable"
+    ],
+    "skipLibCheck": true,
+    "moduleResolution": "bundler",
+    "isolatedModules": true,
+    "moduleDetection": "force",
+    "allowJs": true,
+    "jsx": "react-jsx",
+    "paths": {
+      "@/*": [
+        "./*"
+      ]
+    },
+    "allowImportingTsExtensions": true,
+    "noEmit": true
+  }
+}

+ 22 - 0
retrieval/vite.config.ts

@@ -0,0 +1,22 @@
+import react from '@vitejs/plugin-react';
+import path from 'path';
+import {defineConfig} from 'vite';
+
+export default defineConfig(() => {
+  return {
+    plugins: [react()],
+    resolve: {
+      alias: {
+        '@': path.resolve(__dirname, '.'),
+      },
+    },
+    server: {
+      // HMR is disabled in AI Studio via DISABLE_HMR env var.
+      // Do not modify—file watching is disabled to prevent flickering during agent edits.
+      hmr: process.env.DISABLE_HMR !== 'true',
+    },
+    build: {
+      outDir: 'price',
+    },
+  };
+});

+ 9 - 0
saas/.env.example

@@ -0,0 +1,9 @@
+# GEMINI_API_KEY: Required for Gemini AI API calls.
+# AI Studio automatically injects this at runtime from user secrets.
+# Users configure this via the Secrets panel in the AI Studio UI.
+GEMINI_API_KEY="MY_GEMINI_API_KEY"
+
+# APP_URL: The URL where this applet is hosted.
+# AI Studio automatically injects this at runtime with the Cloud Run service URL.
+# Used for self-referential links, OAuth callbacks, and API endpoints.
+APP_URL="MY_APP_URL"

+ 8 - 0
saas/.gitignore

@@ -0,0 +1,8 @@
+node_modules/
+build/
+dist/
+coverage/
+.DS_Store
+*.log
+.env*
+!.env.example

+ 20 - 0
saas/README.md

@@ -0,0 +1,20 @@
+<div align="center">
+<img width="1200" height="475" alt="GHBanner" src="https://github.com/user-attachments/assets/0aa67016-6eaf-458a-adb2-6e31a0763ed6" />
+</div>
+
+# Run and deploy your AI Studio app
+
+This contains everything you need to run your app locally.
+
+View your app in AI Studio: https://ai.studio/apps/61066f10-c637-416e-bb08-c4dee5e26594
+
+## Run Locally
+
+**Prerequisites:**  Node.js
+
+
+1. Install dependencies:
+   `npm install`
+2. Set the `GEMINI_API_KEY` in [.env.local](.env.local) to your Gemini API key
+3. Run the app:
+   `npm run dev`

+ 29 - 0
saas/index.html

@@ -0,0 +1,29 @@
+<!doctype html>
+<html lang="zh-CN">
+  <head>
+    <meta charset="UTF-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+    <meta
+      name="description"
+      content="一站式企微生态SCRM私域直播。"
+    />
+    <meta property="og:title" content="开邻智数" />
+    <meta
+      property="og:description"
+      content="一站式企微生态SCRM私域直播。"
+    />
+    <meta name="twitter:card" content="summary" />
+    <meta name="twitter:title" content="开邻智数" />
+    <meta
+      name="twitter:description"
+      content="一站式企微生态SCRM私域直播。"
+    />
+    <link rel="icon" type="image/x-icon" href="/src/assets/images/logo.ico" />
+    <title>开邻智数</title>
+  </head>
+  <body>
+    <div id="root"></div>
+    <script type="module" src="/src/main.tsx"></script>
+  </body>
+</html>
+

+ 5 - 0
saas/metadata.json

@@ -0,0 +1,5 @@
+{
+  "name": "开邻智数",
+  "description": "一站式企微生态SCRM私域直播。",
+  "requestFramePermissions": []
+}

+ 36 - 0
saas/package.json

@@ -0,0 +1,36 @@
+{
+  "name": "react-example",
+  "private": true,
+  "version": "0.0.0",
+  "type": "module",
+  "scripts": {
+    "dev": "vite --port=3000 --host=0.0.0.0",
+    "build": "vite build",
+    "preview": "vite preview",
+    "clean": "rm -rf dist",
+    "lint": "tsc --noEmit"
+  },
+  "dependencies": {
+    "antd": "^6.3.5",
+    "dotenv": "^17.2.3",
+    "express": "^4.21.2",
+    "less": "^4.6.4",
+    "lucide-react": "^0.546.0",
+    "motion": "^12.23.24",
+    "react": "^19.0.0",
+    "react-dom": "^19.0.0",
+    "react-router-dom": "^6.30.3",
+    "umi-request": "^1.4.0"
+  },
+  "devDependencies": {
+    "@types/express": "^4.17.21",
+    "@types/node": "^22.14.0",
+    "@vitejs/plugin-react": "^4.3.4",
+    "autoprefixer": "^10.4.21",
+    "postcss": "^8.5.3",
+    "tailwindcss": "^3.4.17",
+    "tsx": "^4.21.0",
+    "typescript": "~5.8.2",
+    "vite": "^5.4.14"
+  }
+}

+ 6 - 0
saas/postcss.config.cjs

@@ -0,0 +1,6 @@
+module.exports = {
+  plugins: {
+    tailwindcss: {},
+    autoprefixer: {},
+  },
+};

+ 202 - 0
saas/src/App.tsx

@@ -0,0 +1,202 @@
+import { useEffect } from "react";
+import { Mail, MapPin } from "lucide-react";
+import { NavLink, Outlet, useLocation, useNavigate } from "react-router-dom";
+import logoImage from "./assets/images/logo.png";
+import { products } from "./utils/utils";
+
+const Navbar = () => {
+  const navigate = useNavigate();
+
+  return (
+    <nav className="fixed top-0 w-full z-50 bg-slate-950/70 backdrop-blur-md border-b border-slate-800">
+      <div className="flex justify-between items-center max-w-7xl mx-auto px-6 h-20">
+        <div
+          className="flex items-center gap-3 cursor-pointer font-headline"
+          onClick={() => navigate("/")}
+        >
+          <div
+            style={{
+              width: "7.75rem",
+              height: "2.35rem",
+              borderRadius: "9999px",
+              overflow: "hidden",
+            }}
+            className="w-11 h-11 bg-white rounded-xl flex items-center justify-center"
+          >
+            <img
+              style={{ width: "5.5rem", height: "3rem" }}
+              src={logoImage}
+              alt="智价云 Logo"
+              className="w-7 h-7 object-contain"
+            />
+          </div>
+        </div>
+
+        <div className="hidden md:flex items-center space-x-10">
+          <NavLink
+            to="/"
+            className={({ isActive }) =>
+              `relative inline-flex items-center leading-none font-headline text-sm ${
+                isActive
+                  ? "text-secondary font-bold"
+                  : "text-slate-300 hover:text-white font-medium transition-colors"
+              }`
+            }
+          >
+            {({ isActive }) => (
+              <>
+                首页
+                {isActive && (
+                  <span className="absolute left-0 -bottom-2 h-0.5 w-full bg-secondary rounded-full"></span>
+                )}
+              </>
+            )}
+          </NavLink>
+
+          <div className="relative group">
+            <span className="inline-flex items-center leading-none text-slate-300 hover:text-white transition-colors font-headline text-sm font-medium cursor-default">
+              产品中心
+            </span>
+            <div className="absolute left-1/2 top-full mt-3 -translate-x-1/2 min-w-32 rounded-lg border border-slate-800 bg-slate-900/95 p-1.5 shadow-xl opacity-0 invisible group-hover:opacity-100 group-hover:visible transition-all duration-200">
+              {products.map((product) => (
+                <a key={product.name} href={product.url} target="_blank" rel="noreferrer" className="block rounded-md px-3 py-2 text-sm text-slate-200 hover:bg-slate-800 hover:text-white transition-colors">
+                  {product.name}
+                </a>
+              ))}
+            </div>
+          </div>
+          <NavLink
+            to="https://www.kailin.com.cn"
+            target="_blank"
+            rel="noreferrer"
+            className={`relative inline-flex items-center leading-none font-headline text-sm text-slate-300 hover:text-white font-medium transition-colors`}
+          >
+            关于我们
+          </NavLink>
+          <NavLink
+            to="/contact"
+            className={({ isActive }) =>
+              `relative inline-flex items-center leading-none font-headline text-sm ${
+                isActive
+                  ? "text-secondary font-bold"
+                  : "text-slate-300 hover:text-white font-medium transition-colors"
+              }`
+            }
+          >
+            {({ isActive }) => (
+              <>
+                联系我们
+                {isActive && (
+                  <span className="absolute left-0 -bottom-2 h-0.5 w-full bg-secondary rounded-full"></span>
+                )}
+              </>
+            )}
+          </NavLink>
+        </div>
+
+        <button
+          onClick={() => navigate("/contact")}
+          className="bg-blue-600 text-white px-6 py-2.5 rounded-lg font-headline text-sm font-bold hover:bg-blue-500 transition-all active:scale-95"
+        >
+          获取方案
+        </button>
+      </div>
+    </nav>
+  );
+};
+
+const Footer = () => {
+  const navigate = useNavigate();
+
+  return (
+    <footer className="bg-slate-950 border-t border-slate-800 py-16 px-6">
+      <div className="max-w-7xl mx-auto grid grid-cols-1 md:grid-cols-4 gap-12">
+        <div className="space-y-6">
+          <div className="text-xl font-bold text-white font-headline">
+            开邻智数
+          </div>
+          <p className="text-sm text-slate-400 leading-relaxed">
+            一站式企微生态SCRM私域直播
+          </p>
+        </div>
+        <div>
+          <h5 className="font-bold text-slate-200 mb-6 uppercase tracking-widest text-xs">
+            联系我们
+          </h5>
+          <ul className="space-y-4 text-sm text-slate-400">
+            <li className="flex items-center gap-2">
+              <Mail className="w-4 h-4 text-secondary" />
+              bd@dotouch.tech
+            </li>
+            <li className="flex items-start gap-2">
+              <MapPin className="w-4 h-4 text-secondary mt-0.5" />
+              <span>深圳大方无隅科技有限公司</span>
+            </li>
+          </ul>
+        </div>
+        <div>
+          <h5 className="font-bold text-slate-200 mb-6 uppercase tracking-widest text-xs">
+            产品中心
+          </h5>
+          <ul className="space-y-4 text-sm text-slate-400">
+            {products.map((product) => (
+              <li key={product.name}>
+                <a href={product.url} target="_blank" rel="noreferrer" className="hover:text-secondary transition-colors">
+                  {product.name}
+                </a>
+              </li>
+            ))}
+          </ul>
+        </div>
+        <div>
+          <h5 className="font-bold text-slate-200 mb-6 uppercase tracking-widest text-xs">
+            法律条款
+          </h5>
+          <ul className="space-y-4 text-sm text-slate-400">
+            <li>
+              <a
+                href="/privacy"
+                target="_blank"
+                rel="noreferrer"
+                className="hover:text-secondary transition-colors"
+              >
+                隐私政策
+              </a>
+            </li>
+            <li>
+              <a
+                href="/agreement"
+                target="_blank"
+                rel="noreferrer"
+                className="hover:text-secondary transition-colors"
+              >
+                用户协议
+              </a>
+            </li>
+          </ul>
+        </div>
+      </div>
+      <div className="max-w-7xl mx-auto mt-16 pt-8 border-t border-slate-800 text-center">
+        <p className="text-sm text-slate-500">© 粤ICP备2024220172号-9</p>
+      </div>
+    </footer>
+  );
+};
+
+export default function App() {
+  const location = useLocation();
+
+  useEffect(() => {
+    window.scrollTo(0, 0);
+  }, [location.pathname]);
+
+  return (
+    <div className="min-h-screen flex flex-col bg-slate-950 text-slate-100">
+      <Navbar />
+      <main className="flex-grow">
+        <Outlet />
+      </main>
+      <Footer />
+    </div>
+  );
+}

+ 4 - 0
saas/src/assets.d.ts

@@ -0,0 +1,4 @@
+declare module '*.png' {
+  const src: string;
+  export default src;
+}

BIN
saas/src/assets/images/klzs/m2_t1.png


BIN
saas/src/assets/images/klzs/m2_t11.png


BIN
saas/src/assets/images/klzs/m2_t2.png


BIN
saas/src/assets/images/klzs/m2_t22.png


BIN
saas/src/assets/images/klzs/m2_t3.png


BIN
saas/src/assets/images/klzs/m2_t33.png


BIN
saas/src/assets/images/klzs/m2_t4.png


BIN
saas/src/assets/images/klzs/m2_t44.png


BIN
saas/src/assets/images/klzs/m3_t1.png


BIN
saas/src/assets/images/klzs/m3_t2.png


BIN
saas/src/assets/images/klzs/m3_t3.png


BIN
saas/src/assets/images/klzs/m3_t4.png


BIN
saas/src/assets/images/logo.ico


BIN
saas/src/assets/images/logo.png


BIN
saas/src/assets/images/logo_i.png


Niektoré súbory nie sú zobrazené, pretože je v týchto rozdielových dátach zmenené mnoho súborov