Ubuntu 3 månader sedan
förälder
incheckning
87d059e6fa
14 ändrade filer med 328 tillägg och 384 borttagningar
  1. 1 4
      package.json
  2. 3 3
      public/index.html
  3. 9 2
      src/AI.js
  4. 1 1
      src/AIService.js
  5. 12 7
      src/App2.js
  6. 23 2
      src/AuthService.js
  7. 1 3
      src/Chart2.js
  8. 1 3
      src/Chart3.js
  9. 7 3
      src/Home2.js
  10. 1 1
      src/Service.js
  11. 268 4
      src/Signin.js
  12. 1 1
      src/SimpleService.js
  13. 0 350
      src/Tree2.css
  14. BIN
      src/weixin.jpg

+ 1 - 4
package.json

@@ -3,7 +3,6 @@
   "version": "0.1.0",
   "private": true,
   "dependencies": {
-    "@ant-design/plots": "^2.6.4",
     "@emotion/react": "11.14.0",
     "@emotion/styled": "11.14.1",
     "@mui/icons-material": "5.18.0",
@@ -18,11 +17,9 @@
     "react": "17.0.2",
     "react-arborist": "^3.4.3",
     "react-dom": "17.0.2",
-    "react-google-charts": "^5.2.1",
     "react-router": "6.30.1",
     "react-router-dom": "6.30.1",
     "react-scripts": "5.0.1",
-    "recharts": "^2.1.9",
     "rsuite": "^5.83.2",
     "serve": "^14.2.4",
     "source-map-explorer": "^2.5.3",
@@ -31,7 +28,7 @@
   },
   "scripts": {
     "start": "GENERATE_SOURCEMAP=false react-scripts start",
-    "build": "react-scripts build",
+    "build": "GENERATE_SOURCEMAP=false react-scripts build",
     "test": "react-scripts test",
     "eject": "react-scripts eject",
     "analyze": "source-map-explorer 'build/static/js/*.js'"

+ 3 - 3
public/index.html

@@ -6,8 +6,8 @@
     <meta name="viewport" content="width=device-width, initial-scale=1" />
     <meta name="theme-color" content="#000000" />
     <meta
-      name="description"
-      content="Web site created using create-react-app"
+      name="懂小造"
+      content="在线工程造价SaaS, 懂你,懂AI的小造同学,让计价触手可及"
     />
     <link rel="apple-touch-icon" href="%PUBLIC_URL%/logo192.png" />
     <!--
@@ -24,7 +24,7 @@
       work correctly both with client-side routing and a non-root public URL.
       Learn how to configure a non-root public URL by running `npm run build`.
     -->
-    <title>小造同学</title>
+    <title>小造</title>
   </head>
   <body>
     <noscript>You need to enable JavaScript to run this app.</noscript>

+ 9 - 2
src/AI.js

@@ -10,6 +10,7 @@ import ArrowDownIcon from '@rsuite/icons/ArrowDown';
 import TextField from '@mui/material/TextField';
 import SearchIcon from '@rsuite/icons/Search';
 
+import Avatar from '@mui/material/Avatar';
 //registerAllModules();
 import { DataGrid, GridActionsCellItem, zhCN as zh_CN} from '@mui/x-data-grid';
 import Box from '@mui/material/Box';
@@ -232,7 +233,11 @@ export default function AI() {
     const itemRef = React.useRef(null);
     const navigate = useNavigate();
     const [detail, setDetail] = React.useState( [
-      {label: "", value : 0}
+      {label: "建筑与装饰工程", value : 0},
+      {label: "仿古建筑", value : 0},
+      {label: "安装工程", value : 0},
+      {label: "市政工程", value : 0},
+      {label: "园林绿化工程", value : 0},
      
      
     ]);
@@ -556,6 +561,7 @@ function FolderArrow({ node }) {
   };
   const handleLogout = () => {
     localStorage.setItem("token", "");
+    AuthService.setProfile('','','');
     AIService.setToken("");
     Service.setToken("");
     SimpleService.setToken("");
@@ -611,6 +617,7 @@ function FolderArrow({ node }) {
           </Box>
           <Box sx={{ display: { xs: 'none', md: 'flex' } }}>
            
+          <Typography sx={{m : "18px"}}>{AuthService.getNickname()}</Typography>
             <IconButton
               size="large"
               edge="end"
@@ -620,7 +627,7 @@ function FolderArrow({ node }) {
               
               color="inherit"
             >
-              <AccountCircle />
+               <Avatar alt={AuthService.getNickname()} src={AuthService.getImg()} />
             </IconButton>
             <Menu
                 id="menu-appbar"

+ 1 - 1
src/AIService.js

@@ -32,7 +32,7 @@ class AIService{
     
     ip() {
         //return "/api"//return "http://127.0.0.1:8000"
-        return "http://127.0.0.1:1313/api"
+        return "http://www.xiaozaotongxue.com/api"
     }
     setToken(token) {
         this.token_ = token;

+ 12 - 7
src/App2.js

@@ -9,6 +9,7 @@ import Autocomplete from '@mui/material/Autocomplete';
 import { debounce } from '@mui/material/utils';
 import throttle from 'lodash/throttle';
 import {Tree as Tree_2} from 'rsuite';
+import {CustomProvider} from 'rsuite';
 import './Tree.css';
 import PropTypes from 'prop-types';
 import Grid from '@mui/material/Grid';
@@ -46,7 +47,8 @@ import AccordionActions from '@mui/material/AccordionActions';
 import AccordionSummary from '@mui/material/AccordionSummary';
 import AccordionDetails from '@mui/material/AccordionDetails';
 import Stack from '@mui/material/Stack';
-import { DataGrid, zhCN , GridToolbarQuickFilter} from '@mui/x-data-grid';
+import { DataGrid, zhCN as zh_CN, GridToolbarQuickFilter} from '@mui/x-data-grid';
+import zhCN from 'rsuite/locales/zh_CN';
 import Backdrop from '@mui/material/Backdrop';
 import CircularProgress from '@mui/material/CircularProgress';
 import Dialog from '@mui/material/Dialog';
@@ -542,7 +544,7 @@ function a11yProps(index) {
        if (bt == 'Default') {
         bt = outlineLabelRef.current;
        } else if (bt == 'Djcs') {
-        bt = 0;//bt = outlineLabelRef.current;
+        bt = '';//bt = outlineLabelRef.current;
        }
        setExpandedQd(false);
        setExpandedDe(true);//1 jianzhu 2 zhuangshi 3 anzhuang 4 shizheng 5 yuanlin 6 guidao 7 xiushantujian 8 xiushananzhuang 9 xiushanjiagu  
@@ -1254,12 +1256,15 @@ function a11yProps(index) {
                      </Select>
                    </FormControl> 
                    <Stack spacing={1}>
+	            <CustomProvider locale={zhCN}>
                     <Tree_2 height="calc(100vh - 560px)" 
+	             searchable
                      onSelect={onSelectDes}
                      value={selectedItems}
                      expandItemValues={expandedItems}
                      data={outlineDes}/>
-                  <div style={{ height: 350 }}>
+	            </CustomProvider>
+                  <div style={{ height: 300 }}>
 
                     <DataGrid
                     sx={{
@@ -1276,7 +1281,7 @@ function a11yProps(index) {
                       hideFooter={true}
                       disableColumnMenu
                       onRowDoubleClick={handleDingEEvent}
-                      localeText={zhCN.components.MuiDataGrid.defaultProps.localeText}
+                      localeText={zh_CN.components.MuiDataGrid.defaultProps.localeText}
                     />
                    </div>
                    </Stack>
@@ -1506,7 +1511,7 @@ function a11yProps(index) {
                       disableDensitySelector
                       slots={{ toolbar: CustomToolbar}}
                       
-                      localeText={zhCN.components.MuiDataGrid.defaultProps.localeText}
+                      localeText={zh_CN.components.MuiDataGrid.defaultProps.localeText}
                      />
                     </div>
                 </Stack>
@@ -1540,7 +1545,7 @@ function a11yProps(index) {
                       disableDensitySelector
                       slots={{ toolbar: CustomToolbar}}
                       
-                      localeText={zhCN.components.MuiDataGrid.defaultProps.localeText}
+                      localeText={zh_CN.components.MuiDataGrid.defaultProps.localeText}
                      />
                     </div>
 
@@ -1575,7 +1580,7 @@ function a11yProps(index) {
                       disableDensitySelector
                       slots={{ toolbar: CustomToolbar}}
                       
-                      localeText={zhCN.components.MuiDataGrid.defaultProps.localeText}
+                      localeText={zh_CN.components.MuiDataGrid.defaultProps.localeText}
                      />
                     </div>
 

+ 23 - 2
src/AuthService.js

@@ -3,7 +3,10 @@ import { v4 as uuidv4 } from 'uuid';
 class AuthService{
     
     constructor() {
-        this.footprint = [];
+        this.openid = localStorage.getItem("openid");
+	this.nickname = localStorage.getItem("nickname");
+	this.headimgurl = localStorage.getItem("img");
+	this.footprint = [];
         this.token_ = localStorage.getItem('token');
         this.cache = [];
         this.memory = [];
@@ -32,11 +35,20 @@ class AuthService{
 
     setToken(token) {
        this.token_ = token;
+    } 
+    setProfile(openid, nickname, img) {
+        this.openid = openid;
+	this.nickname = nickname;
+	this.headimgurl = img;
+	localStorage.setItem("openid", openid);
+	localStorage.setItem("nickname", nickname);
+	localStorage.setItem("img", img);
+
     }
     
     ip() {
         //return "/api"//return "http://127.0.0.1:8000"
-        return "http://127.0.0.1:1313/api"
+        return "http://www.xiaozaotongxue.com/api"
     }
 
     clearCache() {//set qufei will clear cache
@@ -49,6 +61,15 @@ class AuthService{
         this.mem_pointer_djcs = -1;
     }
 
+
+    getNickname() {
+        return this.nickname;
+    }
+
+    getImg() {
+        return this.headimgurl;
+    }
+
    
 
 

+ 1 - 3
src/Chart2.js

@@ -1,8 +1,6 @@
 import * as React from 'react';
 import { useTheme } from '@mui/material/styles';
-import { ResponsiveContainer } from 'recharts';
 import Title from './Title';
-import { Chart as GChart } from "react-google-charts";
 import Box from '@mui/material/Box';
 import Skeleton from '@mui/material/Skeleton';
 
@@ -61,4 +59,4 @@ export default function Chart2({type, click, data}) {
       </ResponsiveChartContainer>
       </ThemeProvider>
   );
-}
+}

+ 1 - 3
src/Chart3.js

@@ -1,8 +1,6 @@
 import * as React from 'react';
 import { useTheme } from '@mui/material/styles';
-import { ResponsiveContainer } from 'recharts';
 import Title from './Title';
-import { Chart as GChart } from "react-google-charts";
 import Box from '@mui/material/Box';
 import Skeleton from '@mui/material/Skeleton';
 import Paper from '@mui/material/Paper';
@@ -120,4 +118,4 @@ export default function Chart3({qingdanshu, callback, selected}) {
                      data={qingdanshu}>{Node}</Tree_2>
     </Box>  
   );
-}
+}

+ 7 - 3
src/Home2.js

@@ -38,6 +38,7 @@ import ListItemIcon from '@mui/material/ListItemIcon';
 import ListItemText from '@mui/material/ListItemText';
 import HomeIcon from '@mui/icons-material/Home';
 import TipsAndUpdatesIcon from '@mui/icons-material/TipsAndUpdates';
+import Avatar from '@mui/material/Avatar';
 
 export default function Home2() {
   const drawerWidth = 240;
@@ -163,8 +164,10 @@ export default function Home2() {
          console.log(event.target.files);
          const fd = new FormData();
          fd.append('file', event.target.files[0]);
+	 setBopen(true);
          SimpleService.uploadFile(fd, navigate).then(x=>{
             console.log("uploaded");
+	    setBopen(false);
             SimpleService.generateFiles2(navigate).then(x=>{
               setDetail(x.map(y=>{return {'id': y[0], 'ID': y[0], '名称': y[1], '创建时间': y[2], '操作': y[0]};}));
             });
@@ -273,6 +276,7 @@ export default function Home2() {
   };
   const handleLogout = () => {
     localStorage.setItem("token", "");
+    AuthService.setProfile('','','');
     AIService.setToken("");
     AuthService.setToken("");
     Service.setToken("");
@@ -291,7 +295,6 @@ export default function Home2() {
         <CssBaseline />
         <AppBar position="fixed" open={open}>
         <Toolbar>
-        
           <IconButton
             color="inherit"
             aria-label="open drawer"
@@ -305,13 +308,14 @@ export default function Home2() {
             ]}
           >
             <MenuIcon />
-          </IconButton>
+	    </IconButton>
           <Typography variant="h6" noWrap component="div">
             工作台
           </Typography>
           <Box sx={{ flexGrow: 1 }} />
           <Box sx={{ display: { xs: 'none', md: 'flex' } }}>
            
+          <Typography sx={{m : "18px"}}>{AuthService.getNickname()}</Typography>
             <IconButton onClick={handleAccountClick}
               size="large"
               edge="end"
@@ -320,7 +324,7 @@ export default function Home2() {
               aria-controls='menu-appbar'
               color="inherit"
             >
-              <AccountCircle />
+               <Avatar alt={AuthService.getNickname()} src={AuthService.getImg()} />
             </IconButton>
               <Menu
                 id="menu-appbar"

+ 1 - 1
src/Service.js

@@ -35,7 +35,7 @@ class Service{
     
     ip() {
         //return "/api"//return "http://127.0.0.1:8000"
-        return "http://127.0.0.1:1313/api"
+        return "http://www.xiaozaotongxue.com/api"
     }
 
     clearCache() {//set qufei will clear cache

+ 268 - 4
src/Signin.js

@@ -4,7 +4,6 @@ import Button from '@mui/material/Button';
 import CssBaseline from '@mui/material/CssBaseline';
 import TextField from '@mui/material/TextField';
 import FormControlLabel from '@mui/material/FormControlLabel';
-import Checkbox from '@mui/material/Checkbox';
 import Link from '@mui/material/Link';
 import Grid from '@mui/material/Grid';
 import Box from '@mui/material/Box';
@@ -18,6 +17,15 @@ import AIService from './AIService';
 import Service from './Service';
 import SimpleService from './SimpleService';
 import {useNavigate, useLocation} from "react-router";
+import logo from './weixin.jpg';
+import Dialog from '@mui/material/Dialog';
+import FormGroup from '@mui/material/FormGroup';
+import Checkbox from '@mui/material/Checkbox';
+import DialogActions from '@mui/material/DialogActions';
+import DialogContent from '@mui/material/DialogContent';
+import DialogContentText from '@mui/material/DialogContentText';
+import DialogTitle from '@mui/material/DialogTitle';
+import Stack from '@mui/material/Stack';
 
 function Copyright(props) {
   return (
@@ -37,6 +45,10 @@ const theme = createTheme();
 
 export default function SignIn() {
   const navigate = useNavigate();
+  const [open, setOpen] = React.useState(false);
+  const [openProtocol, setOpenProtocol] = React.useState(false);
+  const [scroll, setScroll] = React.useState("paper");
+  const [checked, setChecked] = React.useState(false);
 
   let [searchParams] = useSearchParams();
   let code = searchParams.get("code");
@@ -48,6 +60,33 @@ export default function SignIn() {
       password: data.get('password'),
     });
   };
+   const handleChange = (event) => {
+    setChecked(event.target.checked);
+   };
+  const handleClickOpen = () => {
+    setOpen(true);
+  };
+
+  const handleClickOpenProtocol = () => {
+    setOpenProtocol(true);
+    setOpen(false);
+  };
+  const handleClose = () => {
+    setOpen(false);
+  };
+  const handleCloseProtocol = () => {
+    setOpenProtocol(false);
+  };
+  const handleAgree = () => {
+    setOpen(false);
+    setChecked(true);
+  };
+  const handleDisagree = () => {
+    setOpen(false);
+    setChecked(false);
+  };
+
+
   React.useEffect(() => {
     if (code == null) {
       const script = document.createElement('script');
@@ -76,6 +115,7 @@ export default function SignIn() {
           console.log(x);
           localStorage.setItem('token', x['token']);
           AuthService.setToken(x['token']);
+	  AuthService.setProfile(x['openid'], x['nickname'], x['img']);
           AIService.setToken(x['token']);
           Service.setToken(x['token']);
           SimpleService.setToken(x['token']);
@@ -84,6 +124,17 @@ export default function SignIn() {
     }
     }, []);
 
+
+   const descriptionElementRef = React.useRef(null);
+  React.useEffect(() => {
+    if (openProtocol) {
+      const { current : descriptionElement} = descriptionElementRef;
+      if (descriptionElement !== null) {
+        descriptionElement.focus();
+      }
+    }
+  }, [openProtocol]);
+
   return (
     <ThemeProvider theme={theme}>
       <Container component="main" maxWidth="xs">
@@ -99,12 +150,225 @@ export default function SignIn() {
           <Avatar sx={{ m: 1, bgcolor: 'secondary.main' }}>
             <LockOutlinedIcon />
           </Avatar>
-          <Typography component="h1" variant="h5">
+          <Typography component="h1" variant="h5" sx={{m : 4}}>
             微信扫码登录
           </Typography>
-          <div id="login_container">
-        </div>
+           <Box sx={{display: checked ? 'none' : 'block'}}>
+          <Stack>
+          <img src={logo} style={{width: 100, height: 100, margin : "auto"}}/>
+          <Button variant="contained" size="large" sx={{m : 4}} onClick={handleClickOpen}>微信登录</Button>
+          </Stack>
+          </Box>  
+           <Dialog
+           open={open}
+           onClose={handleClose}
+           aria-labelledby="alert-dialog-title"
+           aria-describedby="alert-dialog-description"
+         >
+           <DialogTitle id="alert-dialog-title">
+             {"服务协议与隐私政策"}
+           </DialogTitle>
+           <DialogContent>
+             <DialogContentText id="alert-dialog-description">
+             以下内容将帮助您了解懂小造收集、保存、共享你的个人信息的情况,以及你的相关权利。请你阅读后,点击“同意”开始接受我们的服务。
+             </DialogContentText>
+           </DialogContent>
+           <DialogActions>
+             <Button onClick={handleClickOpenProtocol}>服务协议与隐私政策</Button>
+             <Button onClick={handleDisagree}>不同意</Button>
+             <Button onClick={handleAgree} autoFocus>
+               同意
+             </Button>
+           </DialogActions>
+         </Dialog>
+         <Dialog
+            open={openProtocol}
+            onClose={handleCloseProtocol}
+            scroll={scroll}
+            aria-labelledby="scroll-dialog-title"
+            aria-describedby="scroll-dialog-description"
+          >
+            <DialogTitle id="scroll-dialog-title">服务协议与隐私政策</DialogTitle>
+            <DialogContent dividers={scroll === 'paper'}>
+              <DialogContentText
+                id="scroll-dialog-description"
+                ref={descriptionElementRef}
+                tabIndex={-1}
+              >
+              欢迎您使用懂小造软件及服务!<br />
+              为使用懂小造软件(以下简称“本软件”)及服务,请您务必审慎阅读、充分理解各条款内容,特别是免除或者限制责任的条款、管辖和法律适用的条款,以及开通或使用某项服务的单独协议中的条款等,并选择接受或不接受。 除非您已阅读并接受本协议所有条款,否则您无权下载、安装或使用本软件及相关服务。当您勾选或点击“同意”本协议,或您以任何方式使用本软件及服务的,您的下载、安装、使用、登录等行为即视为您已阅读并同意接受本协议。本协议即在您与我们之间产生法律效力,成为对双方均具有约束力的法律文件。如您不同意本协议,请立即停止注册或使用本软件的服务。<br />
+              如果您未满18周岁,请在法定监护人的陪同下阅读本协议及其他上述协议,并特别注意与未成年人有关的条款。 <br />
+              如果您对本协议或本服务有意见或建议,可通过公众号等方式联系我们,我们将尽快审核所涉问题,并在法律法规规定的期限内回复您的请求。 <br />
+
+
+              一、协议范围 <br />
+              1.1 本协议是您与南通日日升禾科技发展有限公司之间关于您下载、安装、使用、复制本软件并使用相关服务所订立的协议。 <br />
+              1.2 本协议的内容包括但不限于本协议以及与本服务相关的协议、规则、规范,同时还包括南通日日升禾科技发展有限公司可能不断发布的关于本服务的现骨干协议、规则、规范等内容,上 述内容一经正式发布,即构成本协议不可分割的组成部分,与其构成统一整体,您同样应当遵守.  <br />
+
+
+              二、用户个人信息 <br />
+              2.1 保护用户个人信息是懂小造的一项基本原则,懂小造将会采取合理的措施保护用户的个人信息。懂小造将按照本协议及相关《隐私保护指引》的规定收集、使用、储存和分享您的个人信息。本协议与《隐私保护指引》存在冲突的,以本协议为准,本协议对用户个人信息保护相关内容未作明确规定的,应以《隐私保护指引》的内容为准。 <br />
+              2.2 未经您的同意,懂小造不会向南通日日升禾科技发展有限公司以外的任何公司、组织和个人披露您的个人信息,但法律法规另有规定的除外。懂小造将运用各种安全技术和程序,建立完善的管理制度来保护您的个人信息,以免您的个人信息遭受未经授权的访问、使用或披露。 <br />
+              2.3 您同意授权懂小造基于下列原因使用您的个人信息:<br />
+                (1)执行本软件验证服务;<br />
+                (2)执行本软件升级服务;<br />
+                (3)提高您使用本服务的安全性或提供客服支持;<br />
+                (4)因您在注册或开通某项服务、功能时选择或同意,或因您要求懂小造或第三方提供特定服务时,懂小造需要把您的相关信息提供给与此相关联的第三方或其他用户; <br />
+                (5)对您的昵称、头像以及在本软件中的相关操作信息等进行使用,并可通过懂小造服务或懂小造服务中的第三方提供的服务向您本人、其他用户展示。 <br />
+              2.4 懂小造非常重视对未成年人个人信息的保护。若您是未满18周岁的未成年人,在使用本服务前,应事先取得您家长或法定监护人的书面同意后,在法定监护人的监护、指导下使用。 <br />
+
+
+              三、关于本服务 <br />
+              3.1 本服务的内容 <br />
+              本服务是指南通日日升禾科技发展有限公司向用户提供的,方便用户通过不同终端设备开展多人协作的在线工程造价工具(以下简称“本服务”)。 <br />
+              3.2  本服务的许可范围 <br />
+              3.2.1 懂小造给予您一项个人的、不可转让及非排他性的许可,以使用本软件及本服务。您可以为非商业目的在单一终端设备上安装、使用、显示、运行本软件。 <br />
+              3.2.2 您可以为使用本软件及服务的目的,使用移动终端可读形式制作本软件的一个副本,仅用作备份。备份副本必须包含原软件中含有的所有著作权信息。 <br />
+              3.2.3 本条款及本协议其他条款未明示授权的其他一切权利仍由懂小造保留,您在行使这些权利时须另外取得懂小造的书面许可。懂小造如果未行使前述任何权利,并不构成对该权利的放弃。 <br />
+              3.3 本服务使用须知 <br />
+              3.3.1您理解并同意:为了向您提供有效的服务,本软件会利用您电脑或移动终端的处理器和带宽等资源。本软件使用过程中可能产生数据流量的费用,用户需自行向运营商了解相关资费信息,并自行承担相关费用。 <br />
+              3.3.2您在使用本软件某一特定服务时,本服务可以使用您终端设备的相关权限、接口及相关信息等以实现相应的功能。某些服务可能会另有单独的协议、相关业务规则等(以下统称为“单独协议”),您在使用该项服务前请阅读并同意相关的单独协议。 <br />
+              3.3.3您同意懂小造可以在提供本服务的过程中自行或由第三方广告商通过短信、电子邮件或电子信息等多种方式向您发送广告、推广或宣传信息(包括商业与非商业信息)。您同意,对懂小造服务中出现的广告信息,您应审慎判断其真实性和可靠性,除法律明确规定外,您应对依该广告信息进行的交易负责。 <br />
+              3.3.4 您理解并同意懂小造将会尽其商业上的合理努力保障您在本软件及服务中的数据存储安全,但是,懂小造并不能就此提供完全保证,包括但不限于以下情形: <br />
+              3.3.4.1 懂小造不对您在本软件及服务中相关数据的删除或储存失败负责; <br />
+              3.3.4.2 懂小造有权根据实际情况自行决定单个用户在本软件及服务中数据的最长储存期限,并在服务器上为其分配数据最大存储空间等,您可根据自己的需要自行备份本软件及服务中的相关数据: <br />
+              3.3.4.3 您理解并同意,懂小造可以根据自身业务发展需要,对用户的个人存储空间容量(包括免费和收费容量)、容量计算的规则进行调整,为充分保护用户合法权益,调整的通知将提前不少于七日予以公示。如存在超容使用本服务的情形,用户应在懂小造给予的合理期限内,通过付费或自行转移存储内容的方式继续使用本服务。如用户未能及时处理超容存储空间,懂小造有权冻结、删除该账号下的全部内容,因此造成损失的由用户自行承担。 <br />
+              3.3.4.4 如果您停止使用本软件及服务或服务被终止或取消,懂小造可以从服务器上永久地删除您的数据。服务停止、终止或取消后,懂小造没有义务向您返还任何数据。 <br />
+              3.3.5为提升用户体验,懂小造在不断开发新的技术和功能,我们会添加新服务、替换、调整、停止个别已有服务;同时,懂小造可能根据实际运营情况,修改或变更所提供的收费服务、收费标准、收费方式、服务费及服务条款。懂小造在提供服务时,可能现在或日后对部分服务的用户开始收取一定的费用,如用户拒绝支付该等费用,则不能在收费开始后继续使用相关的服务。懂小造会按照相关法律法规的要求,履行通知义务并提供相关客服支持,对此,您有任何疑问,均可通过协议首部联系方式联系我们。 <br />
+              3.3.6您应对本软件及服务中的内容自行加以判断,并须自行承担如下来自懂小造不可掌控的风险,风险内容包括但不限于:<br />
+              3.3.6.1 由于不可抗拒因素可能引起的个人信息丢失、泄漏等风险; <br />
+              3.3.6.2 由于无线网络信号不稳定、无线网络带宽小等原因,所引起的登录失败、资料同步不完整、页面打开速度慢等风险; <br />
+              3.3.6.3 用户与他人协作的内容被他人转发、分享,因此等传播可能带来的风险和责任。 <br />
+              3.4 AI助手服务 <br />
+              3.4.1AI助手服务是懂小造基于跨知识领域和自然语言理解能力、通过产品化的功能和界面,理解用户输入的文字、语音、按键操作等指令并执行任务的模型产品。AI助手服务具体功能将随着用户反馈、技术升级,或相关监管政策的变化不断迭代更新,具体服务以懂小造实际提供的为准。您同意仅在中国大陆地区范围内使用AI助手服务。 <br />
+              3.4.2AI助手服务所依赖的大数据和技术模型由懂小造提供,对于第三方模型技术/服务,懂小造竭力保障与第三方模型合作的稳定性,但懂小造无法完全保证第三方模型能够长期持续稳定的在AI助手服务中向您提供某些特定技术/服务,当懂小造与第三方模型调整合作方式,或与第三方模型合作终止时,您可能无法继续以原有方式使用或继续使用该等第三方模型服务,届时,懂小造会尽量协调第三方模型为您提供解决方案。同时,如您使用AI助手服务遭受的损失系由于第三方模型提供的技术/服务所致,您只能向该第三方模型追索赔偿,懂小造将尽可能的予以协助。 <br />
+              3.4.3您理解并同意,AI助手服务仅“按原样”“按现状”提供,尽管我们已经尽了最大努力,但是由于本服务所依赖的技术本身存在的技术瓶颈和科技客观限制,我们不能对以下事项作出任何保证: <br />
+              (1) 本服务不保证符合您的实际或特定需求或目的;<br />
+              (2) 本服务不保证百分百准确可靠、功能可用、及时、安全、无错误、不受干扰、无中断、持续稳定、不存在任何故障;<br />
+              (3) 本服务所依赖的第三方模型技术/服务及其相关技术,并不能完全和人类一样可以充分理解用户输入的内容,也可能出现无法发现您的输入内容或本服务生成内容中潜在风险和伦理问题; <br />
+              (4) 本服务不保证其生成内容的合法性、真实性、完整性、准确性、及时性及实用性; <br />
+              (5) 本服务生成内容虽已经过人工智能算法自动过滤以及必要的人工复查,但仍不排除其中部分信息具有瑕疵、存在虚假内容或存在不合理、引发用户不适的地方; <br />
+              (6) 本服务生成内容不代表专业建议,不代表懂小造及其关联方的态度、观点或立场,亦不构成懂小造对您的任何建议或意见; <br />
+              (7) 本服务不排除通过提示词恶意诱导等违反本协议的使用方式/目的可能输出的包含与本服务运营主体观点不一致的内容。 <br />
+              (8) 由于人工智能模型的特性,就相同的上传至本服务平台的内容(包括但不限于作为提示词的文本或其他一切用于协助产生人工智能生成内容的提示性内容),本服务可能生成不同的内容结果。 <br />
+              鉴于此,针对本服务生成的内容请您注意甄别并根据您的实际情况做出理性判断。特别是若涉及对您或者相关方可能产生重大影响的情形(例如法律、医疗、金融等相关专业场景或领域),本服务不能替代领域专业人员向您提供解答,相关观点仅供您参考。您根据生成内容所作出的任何判断或者据此作出的后续相关操作行为,其后果均由您自行承担。请审慎理性和依法使用本服务。 <br />
+              3.4.4如果您对外发布或传播AI文档生成的内容,您应当:(1)主动自行核查生成内容的真实性、准确性,避免传播虚假信息;(2)以显著方式标明该生成内容系由人工智能生成,以告知第三方生成内容的来源;(3)禁止发布和传播任何违反本协议使用规范的生成内容。如您将AI助手服务生成的敏感性内容或不理性或有理解歧义的内容进行公开传播,由此产生的法律责任由您自行承担。 <br />
+              3.4.5AI助手服务可能会对不同用户提供相同的生成内容,您理解并同意,您对AI助手生成的内容并不享有任何权利,您无权限制其他用户对相关生成内容的使用。若您在使用AI助手服务的过程中遇到与法律法规相冲突的情形,您可通过本协议文首所列方式联系我们进行反馈,我们会在核实后立刻处理。 <br />
+              3.4.6您理解并同意,您在使用AI助手服务时输入的内容(包括但不限于现有技术及未来技术手段的各类形式内容)不侵犯任何人的合法权益(包括但不限于知识产权、肖像权、名誉权、荣誉权、姓名权、隐私权、个人信息权益等),不涉及任何国家秘密、商业秘密或其他可能会对国家安全、公共利益或者他人合法权利造成不利影响的数据,否则由此产生的侵权风险和责任由您自行承担,懂小造由此遭受的全部损失也同样由您承担。 <br />
+              3.4.7为履行法定合规要求,懂小造有权采取技术手段或人工手段对您使用AI助手服务的行为及信息进行审查,包括但不限于对输入和输出进行审查、建立风险过滤机制、建立违法内容特征库等。对于违规用户,懂小造有权按照本协议第十条的约定进行处理。 <br />
+              3.4.8服务用途限制:AI助手服务仅供您为个人学习、娱乐使用,您不得将AI助手及其一切生成内容作商业化用途。 <br />
+              3.5造价文件库 <br />
+              3.5.1作为懂小造的一个服务功能模块,是通过互联网为您提供在线编辑、分享、发布、下载各类内容的网络信息服务。 <br />
+              3.5.2权利声明 <br />
+              3.5.2.1您应保证对您上传的内容享有合法的著作权或相应授权,同时合法依约使用通过懂小造获得的内容。 <br />
+              3.5.2.2您承诺:您上传的所有内容符合中国法律法规和规范性文件的相关规定,不侵犯任何第三方的合法权利(包括但不限于著作权、商标权、商业秘密、个人隐私等)。如您违反前述保证,懂小造有权在不事先通知您的情况下删除相关内容,暂停或终止向您提供服务,同时按照本协议相关条款和规则采取进一步处理措施。 <br />
+              3.5.2.3如因您上传的内容侵犯了第三方的合法权利,第三方向懂小造发出有效权利通知后,懂小造有权删除相关的内容,同时,若懂小造由此遭受损失的,您应当承担所有赔偿责任。 <br />
+              3.5.2.4懂小造将收集储存造价文件以及定额套用方式等信息,懂小造不会向任何第三方透露相关信息, 该信息仅保留为懂小造合法自用。 <br />
+
+
+              四、软件的获取 <br />
+              4.1 您可以直接从南通日日升禾科技发展有限公司的官方网站上获取本软件,也可以通过官方运营的小程序平台上获取本软件。 <br />
+              4.2 如果您从未经懂小造授权的第三方获取本软件或与本软件名称相同的安装程序,懂小造无法保证该软件能够正常使用,并对因此给您造成的损失不予负责。 <br />
+
+
+              五、软件的安装与卸载 <br />
+              5.1 懂小造可能为不同的终端设备开发了不同的软件版本,您应当根据实际情况选择下载合适的版本进行安装。 <br />
+              5.2 下载安装程序后,您需要按照该程序提示的步骤正确安装。 <br />
+              5.3 为提供更加优质、安全的服务,在本软件安装时懂小造可能推荐您安装其他软件,您可以选择安装或不安装。 <br />
+              5.4 如果您不再需要使用本软件或者需要安装新版软件,可以自行卸载。如果您愿意帮助懂小造改进产品服务,请告知卸载的原因。 <br />
+              
+              
+              六、软件更新 <br />
+              6.1 为了增进用户体验、完善服务内容,懂小造将不断努力开发新的服务,并为您不时提供本软件及相关服务的更新(这些更新可能会采取软件替换、修改、功能强化、版本升级等形式)。 <br />
+              6.2 为了改善用户体验,并保证服务的安全性和功能的一致性,懂小造有权对软件进行更新,或者对软件的部分功能效果进行改变或限制。本软件为您默认开启自动升级功能。 <br />
+              6.3 本软件新版本发布后,旧版软件可能无法使用。懂小造不保证旧版软件继续可用,也不保证相应的客户服务仍能正常提供,请您随时核对并下载最新版本。 <br />
+              
+              
+              七、账号与安全 <br />
+              7.1 您在注册账号或使用本服务的过程中,可能需要填写一些必要的信息。若国家法律法规(本协议中的“法律法规”指用户所属/所处地区、国家现行有效的法律、行政法规、司法解释、地方法规、地方规章、部门规章及其他规范性文件以及对于该等法律法规的不时修改和补充,以及相关政策规定等,下同。)有特殊规定的,您需要填写真实的身份信息(包括但不限于手机号等信息)。若您填写的信息不完整或不真实,则可能无法使用本服务或在使用过程中受到限制。 <br />
+              7.2您可以使用微信号码登录、使用本软件及相关服务。懂小造有权根据产品需要对账号注册以及登录方式进行变更。关于您使用账号的具体规则,请参照并遵守《腾讯微信软件许可及服务协议》。如果您违反前述规则,可能导致您无法登录、使用本软件及相关服务。 <br />
+              7.3您理解并承诺,您所设置的账号不得违反国家法律法规相关规定,您的账号名称、头像和简介等注册信息及其他个人信息中不得出现违法和不良信息,未经他人许可不得用他人名义(包括但不限于冒用他人姓名、名称、字号、头像等足以让人混淆的方式)开设账号,不得恶意注册账号(包括但不限于频繁注册、批量注册账号、利用同一身份注册超过合理数量的账号等行为)。您在账号注册及使用过程中需遵守相关法律法规,不得实施任何侵害国家利益、损害其他公民合法权益、有害社会道德风尚的行为。懂小造有权对您提交的信息进行审核。 <br />
+              7.4 用户有责任妥善保管账号信息、账号密码,用户需要对账号下一切行为承担法律责任。用户同意在任何情况下不向他人透露账号的任何信息。如您怀疑其他人使用您的账号时,请立即通知公司。 <br />
+              7.5您理解并同意:您在使用微信号码登录本软件时,懂小造有权将您的相关的注册信息和您好友的相关信息同步到本软件,这些信息包括但不限于您和您好友的用户名、昵称、备注信息、注册信息、好友关系链、群组信息等。
+              
+              
+              八、知识产权 <br />
+              8.1 南通日日升禾科技发展有限公司是本软件的知识产权权利人。本软件的一切著作权、商标权、专利权、商业秘密等知识产权,以及与本软件相关的所有信息内容(包括但不限于文字、图片、音频、视频、图表、界面设计、版面框架、有关数据或电子文档等)均受中华人民共和国法律法规和相应的国际条约保护,南通日日升禾科技发展有限公司享有上述知识产权。 <br />
+              8.2 未经南通日日升禾科技发展有限公司书面同意,您不得为任何商业或非商业目的自行或许可任何第三方实施、利用、转让上述知识产权,南通日日升禾科技发展有限公司保留追究上述行为法律责任的权利。 <br />
+              8.3未经南通日日升禾科技发展有限公司事先许可,禁止使用任何机器人、蜘蛛、其他自动设备,或手动程序、技术手段来监视或复制懂小造的任何内容。否则,南通日日升禾科技发展有限公司有权依法追究您的法律责任。 <br />
+              8.4您从懂小造中获得的信息或任何内容,未经权利人事先许可,您不得以营利为目的自己或提供给第三方进行使用,如您违反本条款约定,则您应独立承担因此产生的法律后果。 <br />
+              8.5如您认为懂小造中传播的信息或内容或有其他用户发布的内容侵犯了您的合法权益,应事先向懂小造发出“权利通知”,懂小造在收到有效通知后,将根据中国法律法规和规范性文件的规定采取移除相关内容等合理措施。 <br />
+              
+              
+              
+              九、第三方技术或服务 <br />
+              9.1 本软件可能会使用第三方软件或技术(包括本软件可能使用的开源代码和公共领域代码等,下同),这种使用已经获得合法授权。 <br />
+              9.2 本软件如果使用了第三方的软件或技术,南通日日升禾科技发展有限公司将按照相关法规或约定,对相关的协议或其他文件,可能会通过本协议附件、在本软件安装包特定文件夹中打包等形式进行展示,同时它们可能会以“软件使用许可协议”、“授权协议”、“开源代码许可证”或其他形式来表达。前述通过各种形式展现的相关协议或其他文件,均是本协议不可分割的组成部分,与本协议具有同等的法律效力,您应当遵守这些要求。如果您没有遵守这些要求,该第三方或者国家机关可能会对您提起诉讼、罚款或采取其他制裁措施,并要求腾讯给予协助,您应当自行承担法律责任。 <br />
+              9.3 如因本软件使用的第三方软件或技术引发的任何纠纷,应由该第三方负责解决,南通日日升禾科技发展有限公司不承担任何责任。南通日日升禾科技发展有限公司不对第三方软件或技术提供客服支持,若您需要获取支持,请与第三方联系。 <br />
+              
+              
+              十、用户行为规范 <br />
+              10.1 【用户禁止行为】 <br />
+              10.1.1除非法律允许或南通日日升禾科技发展有限公司书面许可,您不得从事下列行为: <br />
+              (1)删除本软件及其副本上关于著作权的信息; <br />
+              (2)对本软件进行反向工程、反向汇编、反向编译,或者以其他方式尝试发现本软件的源代码; <br />
+              (3)对南通日日升禾科技发展有限公司拥有知识产权的内容进行使用、出租、出借、复制、修改、链接、转载、汇编、发表、出版、建立镜像站点等; <br />
+              (4)对本软件或者本软件运行过程中释放到任何终端内存中的数据、软件运行过程中客户端与服务器端的交互数据,以及本软件运行所必需的系统数据,进行复制、修改、增加、删除、挂接运行或创作任何衍生作品,形式包括但不限于使用插件、外挂或非经授权的第三方工具/服务接入本软件和相关系统; <br />
+              (5)通过修改或伪造软件运行中的指令、数据,增加、删减、变动软件的功能或运行效果,或者将用于上述用途的软件、方法进行运营或向公众传播,无论这些行为是否为商业目的; <br />
+              (6)通过非南通日日升禾科技发展有限公司开发、授权的第三方软件、插件、外挂、系统,登录或使用懂小造软件及服务,或制作、发布、传播上述工具; <br />
+              (7)其他未经南通日日升禾科技发展有限公司明示授权的行为。 <br />
+              10.1.2 您在使用本服务时不得利用本服务从事以下行为,包括但不限于: <br />
+              (1)发布、传送、传播、储存危害国家安全统一、社会稳定、违反公序良俗、社会公德以及侮辱、诽谤、淫秽、暴力、赌博的内容; <br />
+              (2)发布、传送、传播、储存侵害他人名誉权、肖像权、隐私权、知识产权、商业秘密等合法权利的内容; <br />
+              (3)虚构事实、隐瞒真相以误导、欺骗他人; <br />
+              (4)发表、传送、传播广告信息及垃圾信息; <br />
+              (5)从事其他违反法律法规、政策及公序良俗、社会公德等的行为; <br />
+              10.2【法律责任】 <br />
+              10.2.1 您理解并同意:若南通日日升禾科技发展有限公司自行发现、收到他人投诉和举报,并经独立判断认定您的行为或发布的内容违反法律法规、本协议和/或发布的其他协议和规则的约定的情形,或根据监管机关依法要求的情况下,懂小造有权随时单方根据相应情形采取以下一项或多项措施(具体措施以及采取措施的时间长短由腾讯根据您的违法、违约情节相应情况确定): <br />
+              (1)对您进行警告。 <br />
+              (2)限制您使用本软件和/或本服务部分或全部功能。 <br />
+              (3)删除、屏蔽相关内容或断开链接。 <br />
+              (4)中止、终止您对相应注册账号的使用(简称“封号”) 。 <br />
+              (5)采取其他合理、合法的措施。 <br />
+              (6)将举报相关内容等必要信息进行保存并向相关部门进行报告、配合调查等。 <br />
+              (7)依法追究您的法律责任。 <br />
+              10.2.2 如果您违反法律法规、本协议和/或其他协议、规则,南通日日升禾科技发展有限公司对您或您使用的本软件和/或本服务采取任何行为或措施后,导致您暂时或永久无法使用本服务,您应自行承担相应后果(包括但不限于资料及相关数据、增值服务、产品或服务等的清空或无法使用等)。由此造成您损失的,您应自行承担。 <br />
+              10.2.3 您应自行对因使用本服务而产生或存储在本服务中的数据(包括但不限于文字、图片、个人资料信息、照片等) ,在本服务之外采取合理、安全的备份。若南通日日升禾科技发展有限公司根据本协议对您采取永久封号等措施的,对于您的与本服务相关的全部数据或您存储在本服务中的全部数据、信息等,南通日日升禾科技发展有限公司有权将该等数据全部予以删除,相应后果您应自行承担。 <br />
+              10.2.4 您导致任何第三方损害的,您应当独立承担责任;南通日日升禾科技发展有限公司因此遭受损失的,您也应当一并赔偿。 <br />
+              10.2.5除非本服务相关界面另有说明,或您与我们另有约定,我们不对由于使用本服务给您引起的任何损害承担责任,包括但不限于直接的、间接的、特殊的、附带的、后果性的或惩罚性的任何性质的损害,无论您是否已经提前告知我们存在损害的可能性。 <br />
+              10.2.6在适用的法律法规最大限度范围内,我们向您赔偿的金额不会超过您为使用我们的服务所支出的服务费用。 <br />
+              10.3 【对自己行为负责】 <br />
+              您充分了解并同意,您必须为自己使用本软件和/或本服务的一切行为负责,包括您创建的文档、您发表的任何内容以及由此产生的任何后果。您应对使用本软件和/或本服务时接触到的内容自行加以判断,包括因对内容的正确性、完整性或实用性的依赖而产生的风险,并承担由此引起的相应风险。南通日日升禾科技发展有限公司在法律允许的范围内不对您因前述风险而导致的任何损失或损害承担责任。 <br />
+              10.4【用户发送、传播的内容与投诉处理】 <br />
+              10.4.1 如果您发送或传播的内容违法违规或侵犯他人权利的,您同意南通日日升禾科技发展有限公司有权进行独立判断并采取删除、屏蔽或断开链接等措施。 <br />
+              10.4.2如您被他人投诉或您投诉他人,南通日日升禾科技发展有限公司有权将争议中相关方的主体、联系方式、投诉相关内容等必要信息提供给相关当事方或相关部门,以便及时解决投诉纠纷,保护各方合法权益。 <br />
+              
+              十一、其他 <br />
+              11.1 您使用本软件即视为您已阅读并同意受本协议的约束。南通日日升禾科技发展有限公司有权在必要时修改本协议条款。您可以在本软件的最新版本中查阅相关协议条款。本协议条款变更后,如果您继续使用本软件,即视为您已接受修改后的协议。 <br />
+              11.2 本协议签订地为中华人民共和国江苏省南通市崇川区。 <br />
+              11.3 本协议的成立、生效、履行、解释及纠纷解决,适用中华人民共和国大陆地区法律(不包括冲突法)。 <br />
+              11.4 若您和南通日日升禾科技发展有限公司之间发生任何纠纷或争议,首先应友好协商解决;协商不成的,您同意将纠纷或争议提交本协议签订地有管辖权的人民法院管辖。 <br />
+              11.5 本协议所有条款的标题仅为阅读方便,本身并无实际涵义,不能作为本协议涵义解释的依据。 <br />
+              11.6 本协议条款无论因何种原因部分无效或不可执行,其余条款仍有效,对双方具有约束力。(正文完) <br />
+              南通日日升禾科技发展有限公司
+
+              </DialogContentText>
+            </DialogContent>
+            <DialogActions>
+              <Button onClick={handleCloseProtocol}>关闭</Button>
+            </DialogActions>
+          </Dialog>
+         <Box id="login_container" sx={{display : checked ? 'block' : 'none'}} />
+        
         </Box>
+	     <Stack direction="row" spacing={0}>
+          <Checkbox checked={checked}
+                 onChange={handleChange}
+                 />
+        <Typography sx={{display: "flex", alignItems: "center", justifyContent: "center"}}>
+        我已阅读并接受懂小造的服务协议和隐私政策
+        </Typography>
+        </Stack>
         <Copyright sx={{ mt: 8, mb: 4 }} />
       </Container>
     </ThemeProvider>

+ 1 - 1
src/SimpleService.js

@@ -36,7 +36,7 @@ class SimpleService{
     
     ip() {
         //return "/api"//return "http://127.0.0.1:8000"
-        return "http://127.0.0.1:1313/api"
+        return "http://www.xiaozaotongxue.com/api"
     }
 
     clearCache() {//set qufei will clear cache

+ 0 - 350
src/Tree2.css

@@ -1,350 +0,0 @@
-:root,
-.rs-theme-light {
-  --rs-gray-0: #fff;
-  --rs-gray-50: #f7f7fa;
-  --rs-gray-200: #e5e5ea;
-  --rs-gray-400: #b6b7b8;
-  --rs-gray-500: #939393;
-  --rs-gray-600: #717273;
-  --rs-gray-700: #575757;
-  --rs-gray-800: #343434;
-  --rs-primary-50: #f2faff;
-  --rs-primary-100: #cce9ff;
-  --rs-primary-200: #a6d7ff;
-  --rs-primary-500: #3498ff;
-  --rs-primary-700: #1976D2;
-  --rs-primary-900: #004299;
-  --rs-text-link: var(--rs-primary-700);
-  --rs-text-primary: var(--rs-gray-800);
-  --rs-text-secondary: var(--rs-gray-600);
-  --rs-bg-overlay: var(--rs-gray-0);
-  --rs-color-focus-ring: rgb(from var(--rs-primary-500) r g b / 25%);
-  --rs-listbox-option-hover-bg: rgb(from var(--rs-primary-100) r g b / 50%);
-  --rs-listbox-option-hover-text: var(--rs-primary-700);
-  --rs-listbox-option-selected-bg: var(--rs-primary-50);
-  --rs-listbox-option-disabled-text: var(--rs-gray-400);
-  --rs-listbox-option-disabled-selected-text: var(--rs-primary-200);
-  --rs-tree-indent-line-color: rgba(0, 0, 0, 0.1);
-}
-@supports not (color: rgb(from white r g b)) {
-  :root,
-  .rs-theme-light {
-    --rs-color-focus-ring: rgba(52, 152, 255, 0.25);
-    --rs-listbox-option-hover-bg: rgba(204, 233, 255, 0.5);
-  }
-}
-.rs-theme-dark {
-  --rs-gray-0: #fff;
-  --rs-gray-50: #e9ebf0;
-  --rs-gray-200: #a4a9b3;
-  --rs-gray-400: #6a6f76;
-  --rs-gray-500: #5c6066;
-  --rs-gray-600: #3c3f43;
-  --rs-gray-700: #292d33;
-  --rs-gray-800: #1a1d24;
-  --rs-primary-50: #f2fcff;
-  --rs-primary-100: #ccf3ff;
-  --rs-primary-200: #a6e9ff;
-  --rs-primary-500: #34c3ff;
-  --rs-primary-700: #169de0;
-  --rs-primary-900: #006199;
-  --rs-text-link: var(--rs-primary-500);
-  --rs-text-primary: var(--rs-gray-50);
-  --rs-text-secondary: var(--rs-gray-200);
-  --rs-bg-overlay: var(--rs-gray-700);
-  --rs-color-focus-ring: 0 0 0 3px rgb(from var(--rs-gray-500) r g b / 25%);
-  --rs-listbox-option-hover-bg: var(--rs-gray-600);
-  --rs-listbox-option-hover-text: currentColor;
-  --rs-listbox-option-selected-bg: rgb(from var(--rs-primary-900) r g b / 20%);
-  --rs-listbox-option-disabled-text: var(--rs-gray-500);
-  --rs-listbox-option-disabled-selected-text: var(--rs-primary-200);
-  --rs-tree-indent-line-color: rgba(255, 255, 255, 0.1);
-}
-@supports not (color: rgb(from white r g b)) {
-  .rs-theme-dark {
-    --rs-color-focus-ring: 0 0 0 3px rgba(52, 195, 255, 0.25);
-    --rs-listbox-option-selected-bg: rgba(0, 97, 153, 0.2);
-  }
-}
-.rs-theme-high-contrast {
-  --rs-gray-0: #fff;
-  --rs-gray-50: #e9ebf0;
-  --rs-gray-200: #a4a9b3;
-  --rs-gray-400: #6a6f76;
-  --rs-gray-500: #5c6066;
-  --rs-gray-600: #3c3f43;
-  --rs-gray-700: #292d33;
-  --rs-gray-800: #1a1d24;
-  --rs-primary-50: #fffef2;
-  --rs-primary-100: #fffbc2;
-  --rs-primary-200: #fffa91;
-  --rs-primary-500: #ffff00;
-  --rs-primary-700: #d9e000;
-  --rs-primary-900: #8f9900;
-  --rs-text-link: var(--rs-primary-500);
-  --rs-text-primary: var(--rs-gray-50);
-  --rs-text-secondary: var(--rs-gray-200);
-  --rs-bg-overlay: var(--rs-gray-800);
-  --rs-color-focus-ring: var(--rs-gray-0);
-  --rs-listbox-option-hover-bg: transparent;
-  --rs-listbox-option-hover-text: var(--rs-primary-500);
-  --rs-listbox-option-selected-bg: transparent;
-  --rs-listbox-option-disabled-text: var(--rs-gray-500);
-  --rs-listbox-option-disabled-selected-text: var(--rs-primary-200);
-  --rs-tree-indent-line-color: rgba(255, 255, 255, 0.1);
-}
-/* stylelint-disable */
-*[class*='rs-'] {
-  -webkit-box-sizing: border-box;
-          box-sizing: border-box;
-}
-*[class*='rs-']::before,
-*[class*='rs-']::after {
-  -webkit-box-sizing: border-box;
-          box-sizing: border-box;
-}
-.rs-picker-subtle .picker-subtle-toggle {
-  position: relative;
-  z-index: 5;
-  padding-right: 32px;
-  display: inline-block;
-}
-.rs-picker-subtle.rs-picker-disabled .picker-subtle-toggle {
-  cursor: not-allowed;
-}
-.rs-picker-subtle.rs-picker-disabled .picker-subtle-toggle:hover,
-.rs-picker-subtle.rs-picker-disabled .picker-subtle-toggle:focus,
-.rs-picker-subtle.rs-picker-disabled .picker-subtle-toggle:active {
-  background: none;
-}
-.rs-picker-subtle.rs-picker-disabled .picker-subtle-toggle:hover::after,
-.rs-picker-subtle.rs-picker-disabled .picker-subtle-toggle:focus::after,
-.rs-picker-subtle.rs-picker-disabled .picker-subtle-toggle:active::after {
-  display: none;
-}
-.rs-tree-node-toggle {
-  cursor: pointer;
-  width: 24px;
-  padding: 4px;
-  display: -webkit-box;
-  display: -ms-flexbox;
-  display: flex;
-  -webkit-box-pack: center;
-      -ms-flex-pack: center;
-          justify-content: center;
-  -webkit-box-align: center;
-      -ms-flex-align: center;
-          align-items: center;
-}
-.rs-tree-node-toggle > .rs-tree-node-toggle-icon {
-  display: inline-block;
-  height: 16px;
-  width: 16px;
-  -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
-}
-.rs-tree-node-toggle > .rs-tree-node-custom-icon,
-.rs-tree-node-toggle > .rs-tree-node-loading-icon {
-  display: -webkit-box;
-  display: -ms-flexbox;
-  display: flex;
-  -webkit-box-align: center;
-      -ms-flex-align: center;
-          align-items: center;
-  font-size: 14px;
-}
-.rs-tree-node-toggle-placeholder {
-  width: 24px;
-  height: 24px;
-}
-/* rtl:begin:ignore */
-[dir='rtl'] .rs-tree-node-toggle {
-  right: 0;
-  padding-right: inherit;
-}
-/* rtl:end:ignore */
-.rs-tree-indent-line {
-  border-left: 1px solid rgba(0, 0, 0, 0.1);
-  border-left: 1px solid var(--rs-tree-indent-line-color);
-  position: absolute;
-  width: 1px;
-  top: -10px;
-  left: 12px;
-  bottom: -4px;
-}
-.rs-tree {
-  height: 100%;
-  -webkit-box-flex: 1;
-      -ms-flex: 1 1 auto;
-          flex: 1 1 auto;
-}
-.rs-tree-drag-preview {
-  position: absolute;
-  top: 0;
-  color: #343434;
-  color: var(--rs-text-primary);
-  background-color: #fff;
-  background-color: var(--rs-bg-overlay);
-  display: inline-block;
-  margin: 0;
-  padding: 8px 12px;
-  border-radius: 6px;
-  -webkit-box-shadow: 0 1px 8px rgba(0, 0, 0, 0.12);
-          box-shadow: 0 1px 8px rgba(0, 0, 0, 0.12);
-  z-index: -1;
-}
-.rs-tree .rs-search-box {
-  padding: 6px;
-}
-.rs-tree .rs-tree-empty {
-  padding: 6px 12px;
-  color: #717273;
-  color: var(--rs-text-secondary);
-}
-.rs-tree-view {
-  max-height: 500px;
-  overflow-y: auto;
-}
-.rs-tree.rs-tree-virtualized .rs-tree-view {
-  overflow: hidden;
-}
-.rs-tree .rs-highlight-mark {
-  padding: 0;
-}
-.rs-tree-group {
-  padding-left: 18px;
-}
-.rs-tree-node {
-  position: relative;
-  font-size: 0;
-  text-align: left;
-  margin: 0 0 4px 0;
-  display: -webkit-box;
-  display: -ms-flexbox;
-  display: flex;
-  -webkit-box-align: center;
-      -ms-flex-align: center;
-          align-items: center;
-}
-.rs-tree-node:focus-visible .rs-tree-node-label {
-  outline: 3px solid rgb(from #3498ff r g b / 25%);
-  outline: 3px solid var(--rs-color-focus-ring);
-}
-.rs-theme-high-contrast .rs-tree-node:focus-visible .rs-tree-node-label {
-  outline-offset: 2px;
-}
-.rs-tree-node-label {
-  position: relative;
-  margin: 1px;
-  cursor: pointer;
-  font-size: 14px;
-  line-height: 22px;
-  padding: 6px;
-  border-radius: 6px;
-}
-.rs-tree-node-label:hover,
-.rs-tree-node-label:focus,
-.rs-tree-node-label.rs-tree-node-label-focus {
-  background-color: rgb(from #cce9ff r g b / 50%);
-  background-color: var(--rs-listbox-option-hover-bg);
-  color: #1976D2;
-  color: var(--rs-listbox-option-hover-text);
-}
-.rs-theme-high-contrast .rs-tree-node-label:hover,
-.rs-theme-high-contrast .rs-tree-node-label:focus,
-.rs-theme-high-contrast .rs-tree-node-label.rs-tree-node-label-focus {
-  outline: 3px solid rgb(from #3498ff r g b / 25%);
-  outline: 3px solid var(--rs-color-focus-ring);
-  outline-offset: -3px;
-  outline-width: 2px;
-  color: #1976D2;
-  color: var(--rs-listbox-option-hover-text);
-  text-decoration: underline;
-}
-.rs-theme-high-contrast .rs-theme-high-contrast .rs-tree-node-label:hover,
-.rs-theme-high-contrast .rs-theme-high-contrast .rs-tree-node-label:focus,
-.rs-theme-high-contrast .rs-theme-high-contrast .rs-tree-node-label.rs-tree-node-label-focus {
-  outline-offset: 2px;
-}
-.rs-tree-node-label::after {
-  content: '';
-  position: absolute;
-  width: 0;
-  height: 0;
-  left: -8px;
-  border-left: 6px solid #1976D2;
-  border-left: 6px solid var(--rs-text-link);
-  border-top: 3px solid transparent;
-  border-bottom: 3px solid transparent;
-  display: none;
-}
-.rs-tree-node-active .rs-tree-node-label {
-  font-weight: bold;
-  color: #1976D2;
-  color: var(--rs-text-link);
-  background-color: #f2faff;
-  background-color: var(--rs-listbox-option-selected-bg);
-}
-.rs-tree-node-drag-over {
-  background-color: rgb(from #cce9ff r g b / 50%);
-  background-color: var(--rs-listbox-option-hover-bg);
-}
-.rs-tree-node-dragging {
-  outline: 1px dashed #3498ff;
-  outline: 1px dashed var(--rs-primary-500);
-}
-.rs-tree-node-drag-over-top.rs-tree-node-label {
-  border-top: 2px solid #1976D2 !important;
-  border-top: 2px solid var(--rs-text-link) !important;
-  border-radius: 0;
-}
-.rs-tree-node-drag-over-top.rs-tree-node-label::after {
-  display: block;
-  top: -4px;
-}
-.rs-tree-node-drag-over-bottom.rs-tree-node-label {
-  border-bottom: 2px solid #1976D2 !important;
-  border-bottom: 2px solid var(--rs-text-link) !important;
-  border-radius: 0;
-}
-.rs-tree-node-drag-over-bottom.rs-tree-node-label::after {
-  display: block;
-  bottom: -4px;
-}
-.rs-tree-node-disabled .rs-tree-node-label {
-  background: none;
-  color: #b6b7b8;
-  color: var(--rs-listbox-option-disabled-text);
-  cursor: not-allowed;
-}
-.rs-tree-node-disabled > .rs-tree-node-label {
-  cursor: not-allowed;
-  color: #b6b7b8;
-  color: var(--rs-listbox-option-disabled-text);
-}
-.rs-tree-node-disabled > .rs-tree-node-label,
-.rs-tree-node-disabled > .rs-tree-node-label:hover {
-  background-color: transparent;
-}
-.rs-tree-node-disabled.rs-tree-node-active > .rs-tree-node-label,
-.rs-tree-node-disabled.rs-tree-node-active > .rs-tree-node-label:hover {
-  color: #a6d7ff;
-  color: var(--rs-listbox-option-disabled-selected-text);
-}
-.rs-tree-node:not(.rs-tree-node-disabled):focus > .rs-tree-node-label {
-  background-color: #f2faff;
-  background-color: var(--rs-listbox-option-selected-bg);
-}
-.rs-tree-node:not(.rs-tree-node-disabled) > .rs-tree-node-label:focus {
-  background-color: #f2faff;
-  background-color: var(--rs-listbox-option-selected-bg);
-}
-.rs-tree-node-children > .rs-tree-group {
-  position: relative;
-  display: none;
-}
-.rs-tree-node-expanded.rs-tree-node-children > .rs-tree-group {
-  display: block;
-}

BIN
src/weixin.jpg