Procházet zdrojové kódy

feat(config): update config

Lind před 4 roky
rodič
revize
d86f65dff2

+ 0 - 0
Rule.md


+ 4 - 3
config/proxy.ts

@@ -8,10 +8,11 @@
  */
 export default {
   dev: {
-    '/api/': {
-      target: 'https://preview.pro.ant.design',
+    '/jetlinks': {
+      ws: 'ws://demo.jetlinks.cn/jetlinks',
+      target: 'http://demo.jetlinks.cn/jetlinks',
       changeOrigin: true,
-      pathRewrite: { '^': '' },
+      pathRewrite: { '^/jetlinks': '' },
     },
   },
   test: {

+ 99 - 14
config/routes.ts

@@ -16,35 +16,120 @@
     ],
   },
   {
-    path: '/welcome',
-    name: 'welcome',
+    path: '/analysis',
+    name: 'analysis',
     icon: 'smile',
     component: './Welcome',
   },
   {
-    path: '/admin',
-    name: 'admin',
+    path: '/system',
+    name: 'system',
     icon: 'crown',
-    access: 'canAdmin',
-    component: './Admin',
     routes: [
       {
-        path: '/admin/sub-page',
-        name: 'sub-page',
+        path: '/system/user',
+        name: 'user',
         icon: 'smile',
-        component: './Welcome',
+        component: './system/User',
+      },
+      {
+        path: '/system/role',
+        name: 'role',
+        icon: 'smile',
+        component: './system/Role',
+      },
+      {
+        path: '/system/permission',
+        name: 'permission',
+        icon: 'smile',
+        component: './system/Permission',
+      },
+      {
+        path: '/system/org',
+        name: 'org',
+        icon: 'smile',
+        component: './system/Org',
+      },
+      {
+        path: '/system/open-api',
+        name: 'open-api',
+        icon: 'smile',
+        component: './system/OpenAPI',
+      },
+      {
+        path: '/system/tenant',
+        name: 'tenant',
+        icon: 'smile',
+        component: './system/Tenant',
       },
     ],
   },
   {
-    name: 'list.table-list',
-    icon: 'table',
-    path: '/list',
-    component: './TableList',
+    path: '/device',
+    name: 'device',
+    icon: 'crown',
+    routes: [
+      {
+        path: '/device/product',
+        name: 'product',
+        icon: 'smile',
+        component: './device/Product',
+      },
+      {
+        hideInMenu: true,
+        path: '/device/product/detail/:id',
+        name: 'product-detail',
+        icon: 'smile',
+        component: './device/Product/Detail',
+      },
+      {
+        path: '/device/instance',
+        name: 'instance',
+        icon: 'smile',
+        component: './device/Instance',
+      },
+      {
+        path: '/device/command',
+        name: 'command',
+        icon: 'smile',
+        component: './device/Command',
+      },
+      {
+        path: '/device/firmware',
+        name: 'firmware',
+        icon: 'smile',
+        component: './device/firmware',
+      },
+      {
+        path: '/device/alarm',
+        name: 'alarm',
+        icon: 'smile',
+        component: './device/alarm',
+      },
+    ],
+  },
+  {
+    path: 'log',
+    name: 'log',
+    icon: 'crown',
+    routes: [
+      {
+        path: '/log/access',
+        name: 'access',
+        icon: 'smile',
+        component: './log/Access',
+      },
+      {
+        path: '/log/system',
+        name: 'system',
+        icon: 'smile',
+        component: './log/System',
+      },
+    ],
   },
   {
     path: '/',
-    redirect: '/welcome',
+    redirect: '/analysis',
   },
   {
     component: './404',

+ 11 - 0
package.json

@@ -59,9 +59,19 @@
     "@ant-design/pro-form": "^1.18.3",
     "@ant-design/pro-layout": "^6.15.3",
     "@ant-design/pro-table": "^2.30.8",
+    "@ant-design/pro-list": "^1.10.8",
+    "@dabeng/react-orgchart": "^1.0.0",
+    "@formily/antd": "2.0.0-beta.77",
+    "@formily/core": "2.0.0-beta.77",
+    "@formily/json-schema": "2.0.0-beta.77",
+    "@formily/react": "2.0.0-beta.77",
+    "@formily/reactive": "2.0.0-beta.77",
+    "@formily/reactive-react": "2.0.0-beta.77",
+    "@formily/shared": "2.0.0-beta.77",
     "@umijs/route-utils": "^1.0.36",
     "antd": "^4.14.0",
     "classnames": "^2.2.6",
+    "jetlinks-store": "^0.0.3",
     "lodash": "^4.17.11",
     "moment": "^2.25.3",
     "omit.js": "^2.0.2",
@@ -69,6 +79,7 @@
     "react-dev-inspector": "^1.1.1",
     "react-dom": "^17.0.0",
     "react-helmet-async": "^1.0.4",
+    "rxjs": "^7.2.0",
     "umi": "^3.5.0",
     "umi-serve": "^1.9.10"
   },

+ 11 - 0
src/pages/Analysis/index.tsx

@@ -0,0 +1,11 @@
+import { PageContainer } from '@ant-design/pro-layout';
+import { Card } from 'antd';
+
+const Analysis = () => {
+  return (
+    <PageContainer>
+      <Card>统计分析</Card>
+    </PageContainer>
+  );
+};
+export default Analysis;

+ 1 - 0
src/pages/Welcome.tsx

@@ -14,6 +14,7 @@ const CodePreview: React.FC = ({ children }) => (
 
 export default (): React.ReactNode => {
   const intl = useIntl();
+
   return (
     <PageContainer>
       <Card>

+ 155 - 0
src/pages/system/Tenant/index.tsx

@@ -0,0 +1,155 @@
+import { PageContainer } from '@ant-design/pro-layout';
+import type { ProColumns, ActionType } from '@ant-design/pro-table';
+import type { TenantDetail } from '@/pages/system/Tenant/typings';
+import type { TenantItem } from '@/pages/system/Tenant/typings';
+import BaseCrud from '@/components/BaseCrud';
+import { useRef } from 'react';
+import { Avatar, Menu, message, Popconfirm, Tooltip } from 'antd';
+import Service from '@/pages/system/Tenant/service';
+import { CurdModel } from '@/components/BaseCrud/model';
+import {
+  CloseCircleOutlined,
+  EditOutlined,
+  KeyOutlined,
+  PlayCircleOutlined,
+} from '@ant-design/icons';
+import { useIntl } from '@@/plugin-locale/localeExports';
+
+const menu = (
+  <Menu>
+    <Menu.Item key="1">1st item</Menu.Item>
+    <Menu.Item key="2">2nd item</Menu.Item>
+    <Menu.Item key="3">3rd item</Menu.Item>
+  </Menu>
+);
+const service = new Service('tenant');
+const Tenant = () => {
+  const intl = useIntl();
+  const actionRef = useRef<ActionType>();
+  const columns: ProColumns<TenantItem>[] = [
+    {
+      dataIndex: 'index',
+      valueType: 'indexBorder',
+      width: 48,
+    },
+    {
+      dataIndex: 'tenant',
+      title: '头像',
+      align: 'center',
+      search: false,
+      renderText: (text: TenantDetail) => <Avatar src={text.photo} />,
+    },
+    {
+      dataIndex: 'tenant',
+      title: '名称',
+      align: 'center',
+      renderText: (text: TenantDetail) => text.name,
+    },
+    {
+      dataIndex: 'members',
+      title: '成员数',
+      align: 'center',
+    },
+    {
+      dataIndex: 'tenant',
+      title: '状态',
+      align: 'center',
+      renderText: (text: TenantDetail) => text.state.text,
+      valueType: 'select',
+      hideInForm: true,
+      onFilter: true,
+      valueEnum: [
+        {
+          text: '全部',
+          status: 'Default',
+        },
+        {
+          text: '正常',
+          status: '1',
+        },
+        {
+          text: '禁用',
+          status: '0',
+        },
+      ],
+    },
+    {
+      title: intl.formatMessage({
+        id: 'pages.data.option',
+        defaultMessage: '操作',
+      }),
+      valueType: 'option',
+      align: 'center',
+      width: 200,
+      render: (text, record) => [
+        <a key="editable" onClick={() => CurdModel.update(record)}>
+          <Tooltip
+            title={intl.formatMessage({
+              id: 'pages.data.option.edit',
+              defaultMessage: '编辑',
+            })}
+          >
+            <EditOutlined />
+          </Tooltip>
+        </a>,
+        <a onClick={() => console.log('授权')}>
+          <Tooltip
+            title={intl.formatMessage({
+              id: 'pages.data.option.authorize',
+              defaultMessage: '授权',
+            })}
+          >
+            <KeyOutlined />
+          </Tooltip>
+        </a>,
+        <a href={record.tenant.id} target="_blank" rel="noopener noreferrer" key="view">
+          <Popconfirm
+            title={intl.formatMessage({
+              id: 'pages.data.option.disable.tips',
+              defaultMessage: '确认禁用?',
+            })}
+            onConfirm={async () => {
+              await service.update({
+                tenant: {
+                  id: record.tenant.id,
+                  state: record.tenant?.state.value ? 0 : 1,
+                },
+              });
+              message.success(
+                intl.formatMessage({
+                  id: 'pages.data.option.success',
+                  defaultMessage: '操作成功!',
+                }),
+              );
+              actionRef.current?.reload();
+            }}
+          >
+            <Tooltip
+              title={intl.formatMessage({
+                id: `pages.data.option.${record.tenant?.state.value ? 'disable' : 'enable'}`,
+                defaultMessage: record.tenant?.state?.value ? '禁用' : '启用',
+              })}
+            >
+              {record.tenant?.state.value ? <CloseCircleOutlined /> : <PlayCircleOutlined />}
+            </Tooltip>
+          </Popconfirm>
+        </a>,
+      ],
+    },
+  ];
+
+  return (
+    <PageContainer>
+      <BaseCrud<TenantItem>
+        request={(params = {}) => service.queryDetail(params)}
+        columns={columns}
+        service={service}
+        title="租户列表"
+        schema={{}}
+        menu={menu}
+        actionRef={actionRef}
+      />
+    </PageContainer>
+  );
+};
+export default Tenant;

+ 14 - 0
src/pages/system/Tenant/service.ts

@@ -0,0 +1,14 @@
+import type { TenantItem } from '@/pages/system/Tenant/typings';
+import BaseService from '@/utils/BaseService';
+import { request } from 'umi';
+
+class Service extends BaseService<TenantItem> {
+  queryDetail = (params: any) => {
+    return request(`/jetlinks/tenant/detail/_query`, {
+      method: 'GET',
+      params,
+    });
+  };
+}
+
+export default Service;

+ 15 - 0
src/pages/system/Tenant/typings.d.ts

@@ -0,0 +1,15 @@
+export type TenantDetail = {
+  id: string;
+  name: string;
+  type: string;
+  state: any;
+  members: number;
+  photo: string;
+  createTime: number;
+  description: string;
+};
+
+export type TenantItem = {
+  members: number;
+  tenant: Partial<TenantDetail>;
+};

+ 2 - 0
src/typings.d.ts

@@ -22,3 +22,5 @@ declare module 'bizcharts-plugin-slider';
 declare let ANT_DESIGN_PRO_ONLY_DO_NOT_USE_IN_YOUR_PRODUCTION: 'site' | undefined;
 
 declare const REACT_APP_ENV: 'test' | 'dev' | 'pre' | false;
+
+declare module '@dabeng/react-orgchart';

+ 5 - 0
src/utils/token.ts

@@ -0,0 +1,5 @@
+const Token = {
+  set: (token: string) => localStorage.setItem('X-Access-Token', token),
+  get: () => localStorage.getItem('X-Access-Token'),
+};
+export default Token;

+ 13 - 0
src/utils/typings.d.ts

@@ -0,0 +1,13 @@
+export type Response<T> = {
+  message: 'success' | 'error';
+  result:
+    | {
+        pageIndex: number;
+        pageSize: number;
+        total: number;
+        data: T[];
+      }
+    | Record<string, any>;
+  status: number;
+  timestamp: number;
+};