1
0
Преглед на файлове

fix(compiler): 新增菜单管理和角色管理模块

shylock преди 2 години
родител
ревизия
ca536b409a

+ 23 - 0
config/routes.ts

@@ -3,6 +3,7 @@
     path: '/user',
     layout: false,
     routes: [
+      // 登录页面
       {
         name: 'login',
         path: '/user/login',
@@ -13,23 +14,27 @@
       },
     ],
   },
+  // 首页
   {
     path: '/welcome',
     name: '首页',
     icon: 'smile',
     component: './Welcome',
   },
+  // 内容发布
   {
     name: '内容发布',
     icon: 'crown',
     path: '/cms',
     routes: [
+      // 栏目管理
       {
         path: '/cms/columnList',
         name: '栏目管理',
         icon: 'file',
         component: './cms/ColumnList',
       },
+      // 文章管理
       {
         path: '/cms/articleManagement',
         name: '文章管理',
@@ -38,24 +43,42 @@
       },
     ],
   },
+  // 版本管理
   {
     path: '/editionManagement',
     name: '版本管理',
     icon: 'Appstore',
     component: './EditionManagement',
   },
+  // 用户管理
   {
     path: '/UserManagement',
     name: '用户管理',
     icon: 'team',
     component: './setting/UserManagement',
   },
+  // 家列表管理
   {
     path: '/homeList',
     name: '家列表管理',
     icon: 'file',
     component: './home',
   },
+  // 菜单管理
+  {
+    path: '/MenuManagement',
+    name: '菜单管理',
+    icon: 'Appstore',
+    component: './MenuManagement',
+  },
+  // 角色管理
+  {
+    path: 'RoleManagement',
+    name: '角色管理',
+    icon: 'Appstore',
+    component: './RoleManagement',
+  },
+  // 房间列表
   {
     path: '/roomList',
     component: './Home/Room',

+ 1 - 0
package.json

@@ -52,6 +52,7 @@
     "@babel/core": "^7.20.2",
     "@babel/preset-env": "^7.20.2",
     "@umijs/route-utils": "^2.0.0",
+    "@wangeditor/editor": "^5.1.23",
     "@wangeditor/editor-for-react": "^1.0.6",
     "antd": "^4.21.2",
     "classnames": "^2.3.0",

+ 741 - 0
src/components/Icon/IconMap.tsx

@@ -0,0 +1,741 @@
+import {
+  StepBackwardOutlined,
+  StepForwardOutlined,
+  FastBackwardOutlined,
+  FastForwardOutlined,
+  ShrinkOutlined,
+  ArrowsAltOutlined,
+  DownOutlined,
+  UpOutlined,
+  LeftOutlined,
+  RightOutlined,
+  CaretUpOutlined,
+  CaretDownOutlined,
+  CaretLeftOutlined,
+  CaretRightOutlined,
+  UpCircleOutlined,
+  DownCircleOutlined,
+  LeftCircleOutlined,
+  RightCircleOutlined,
+  DoubleRightOutlined,
+  DoubleLeftOutlined,
+  VerticalLeftOutlined,
+  VerticalRightOutlined,
+  VerticalAlignTopOutlined,
+  VerticalAlignMiddleOutlined,
+  VerticalAlignBottomOutlined,
+  ForwardOutlined,
+  BackwardOutlined,
+  RollbackOutlined,
+  EnterOutlined,
+  RetweetOutlined,
+  SwapOutlined,
+  SwapLeftOutlined,
+  SwapRightOutlined,
+  ArrowUpOutlined,
+  ArrowDownOutlined,
+  ArrowLeftOutlined,
+  ArrowRightOutlined,
+  PlayCircleOutlined,
+  UpSquareOutlined,
+  DownSquareOutlined,
+  LeftSquareOutlined,
+  RightSquareOutlined,
+  LoginOutlined,
+  LogoutOutlined,
+  MenuFoldOutlined,
+  MenuUnfoldOutlined,
+  BorderBottomOutlined,
+  BorderHorizontalOutlined,
+  BorderInnerOutlined,
+  BorderOuterOutlined,
+  BorderLeftOutlined,
+  BorderRightOutlined,
+  BorderTopOutlined,
+  BorderVerticleOutlined,
+  PicCenterOutlined,
+  PicLeftOutlined,
+  PicRightOutlined,
+  RadiusBottomleftOutlined,
+  RadiusBottomrightOutlined,
+  RadiusUpleftOutlined,
+  RadiusUprightOutlined,
+  FullscreenOutlined,
+  FullscreenExitOutlined,
+  QuestionOutlined,
+  QuestionCircleOutlined,
+  PlusOutlined,
+  PlusCircleOutlined,
+  PauseOutlined,
+  PauseCircleOutlined,
+  MinusOutlined,
+  MinusCircleOutlined,
+  PlusSquareOutlined,
+  MinusSquareOutlined,
+  InfoOutlined,
+  InfoCircleOutlined,
+  ExclamationOutlined,
+  ExclamationCircleOutlined,
+  CloseOutlined,
+  CloseCircleOutlined,
+  CloseSquareOutlined,
+  CheckOutlined,
+  CheckCircleOutlined,
+  CheckSquareOutlined,
+  ClockCircleOutlined,
+  WarningOutlined,
+  IssuesCloseOutlined,
+  StopOutlined,
+  EditOutlined,
+  FormOutlined,
+  CopyOutlined,
+  ScissorOutlined,
+  DeleteOutlined,
+  SnippetsOutlined,
+  DiffOutlined,
+  HighlightOutlined,
+  AlignCenterOutlined,
+  AlignLeftOutlined,
+  AlignRightOutlined,
+  BgColorsOutlined,
+  BoldOutlined,
+  ItalicOutlined,
+  UnderlineOutlined,
+  StrikethroughOutlined,
+  RedoOutlined,
+  UndoOutlined,
+  ZoomInOutlined,
+  ZoomOutOutlined,
+  FontColorsOutlined,
+  FontSizeOutlined,
+  LineHeightOutlined,
+  DashOutlined,
+  SmallDashOutlined,
+  SortAscendingOutlined,
+  SortDescendingOutlined,
+  DragOutlined,
+  OrderedListOutlined,
+  UnorderedListOutlined,
+  RadiusSettingOutlined,
+  ColumnWidthOutlined,
+  ColumnHeightOutlined,
+  AreaChartOutlined,
+  PieChartOutlined,
+  BarChartOutlined,
+  DotChartOutlined,
+  LineChartOutlined,
+  RadarChartOutlined,
+  HeatMapOutlined,
+  FallOutlined,
+  RiseOutlined,
+  StockOutlined,
+  BoxPlotOutlined,
+  FundOutlined,
+  SlidersOutlined,
+  AndroidOutlined,
+  AppleOutlined,
+  WindowsOutlined,
+  IeOutlined,
+  ChromeOutlined,
+  GithubOutlined,
+  AliwangwangOutlined,
+  DingdingOutlined,
+  WeiboSquareOutlined,
+  WeiboCircleOutlined,
+  TaobaoCircleOutlined,
+  Html5Outlined,
+  WeiboOutlined,
+  TwitterOutlined,
+  WechatOutlined,
+  YoutubeOutlined,
+  AlipayCircleOutlined,
+  TaobaoOutlined,
+  SkypeOutlined,
+  QqOutlined,
+  MediumWorkmarkOutlined,
+  GitlabOutlined,
+  MediumOutlined,
+  LinkedinOutlined,
+  GooglePlusOutlined,
+  DropboxOutlined,
+  FacebookOutlined,
+  CodepenOutlined,
+  CodeSandboxOutlined,
+  AmazonOutlined,
+  GoogleOutlined,
+  CodepenCircleOutlined,
+  AlipayOutlined,
+  AntDesignOutlined,
+  AntCloudOutlined,
+  AliyunOutlined,
+  ZhihuOutlined,
+  SlackOutlined,
+  SlackSquareOutlined,
+  BehanceOutlined,
+  BehanceSquareOutlined,
+  DribbbleOutlined,
+  DribbbleSquareOutlined,
+  InstagramOutlined,
+  YuqueOutlined,
+  AlibabaOutlined,
+  YahooOutlined,
+  RedditOutlined,
+  SketchOutlined,
+  AccountBookOutlined,
+  AlertOutlined,
+  ApiOutlined,
+  AppstoreOutlined,
+  AudioOutlined,
+  BankOutlined,
+  BellOutlined,
+  BookOutlined,
+  BugOutlined,
+  BulbOutlined,
+  CalculatorOutlined,
+  BuildOutlined,
+  CalendarOutlined,
+  CameraOutlined,
+  CarOutlined,
+  CarryOutOutlined,
+  CloudOutlined,
+  CodeOutlined,
+  CompassOutlined,
+  ContactsOutlined,
+  ContainerOutlined,
+  ControlOutlined,
+  CreditCardOutlined,
+  CrownOutlined,
+  CustomerServiceOutlined,
+  DashboardOutlined,
+  DatabaseOutlined,
+  DislikeOutlined,
+  EnvironmentOutlined,
+  ExperimentOutlined,
+  EyeInvisibleOutlined,
+  EyeOutlined,
+  FileAddOutlined,
+  FileExcelOutlined,
+  FileExclamationOutlined,
+  FileImageOutlined,
+  FileMarkdownOutlined,
+  FilePdfOutlined,
+  FilePptOutlined,
+  FileTextOutlined,
+  FileUnknownOutlined,
+  FileWordOutlined,
+  FileZipOutlined,
+  FileOutlined,
+  FilterOutlined,
+  FireOutlined,
+  FlagOutlined,
+  FolderAddOutlined,
+  FolderOutlined,
+  FolderOpenOutlined,
+  FrownOutlined,
+  FunnelPlotOutlined,
+  GiftOutlined,
+  HddOutlined,
+  HeartOutlined,
+  HomeOutlined,
+  HourglassOutlined,
+  IdcardOutlined,
+  InsuranceOutlined,
+  InteractionOutlined,
+  LayoutOutlined,
+  LikeOutlined,
+  LockOutlined,
+  MailOutlined,
+  MedicineBoxOutlined,
+  MehOutlined,
+  MessageOutlined,
+  MobileOutlined,
+  MoneyCollectOutlined,
+  PayCircleOutlined,
+  NotificationOutlined,
+  PhoneOutlined,
+  PictureOutlined,
+  PlaySquareOutlined,
+  PrinterOutlined,
+  ProfileOutlined,
+  ProjectOutlined,
+  PushpinOutlined,
+  PropertySafetyOutlined,
+  ReadOutlined,
+  ReconciliationOutlined,
+  RedEnvelopeOutlined,
+  RestOutlined,
+  RocketOutlined,
+  SafetyCertificateOutlined,
+  SaveOutlined,
+  ScheduleOutlined,
+  SecurityScanOutlined,
+  SettingOutlined,
+  ShopOutlined,
+  ShoppingOutlined,
+  SkinOutlined,
+  SmileOutlined,
+  SoundOutlined,
+  StarOutlined,
+  SwitcherOutlined,
+  TabletOutlined,
+  TagOutlined,
+  TagsOutlined,
+  ToolOutlined,
+  ThunderboltOutlined,
+  TrophyOutlined,
+  UnlockOutlined,
+  UsbOutlined,
+  VideoCameraOutlined,
+  WalletOutlined,
+  ApartmentOutlined,
+  AuditOutlined,
+  BarcodeOutlined,
+  BarsOutlined,
+  BlockOutlined,
+  BorderOutlined,
+  BranchesOutlined,
+  CiOutlined,
+  CloudDownloadOutlined,
+  CloudServerOutlined,
+  CloudSyncOutlined,
+  CloudUploadOutlined,
+  ClusterOutlined,
+  CoffeeOutlined,
+  CopyrightOutlined,
+  DeploymentUnitOutlined,
+  DesktopOutlined,
+  DisconnectOutlined,
+  DollarOutlined,
+  DownloadOutlined,
+  EllipsisOutlined,
+  EuroOutlined,
+  ExceptionOutlined,
+  ExportOutlined,
+  FileDoneOutlined,
+  FileJpgOutlined,
+  FileProtectOutlined,
+  FileSyncOutlined,
+  FileSearchOutlined,
+  ForkOutlined,
+  GatewayOutlined,
+  GlobalOutlined,
+  GoldOutlined,
+  HistoryOutlined,
+  ImportOutlined,
+  InboxOutlined,
+  KeyOutlined,
+  LaptopOutlined,
+  LinkOutlined,
+  LineOutlined,
+  Loading3QuartersOutlined,
+  LoadingOutlined,
+  ManOutlined,
+  MenuOutlined,
+  MonitorOutlined,
+  MoreOutlined,
+  NumberOutlined,
+  PercentageOutlined,
+  PaperClipOutlined,
+  PoundOutlined,
+  PoweroffOutlined,
+  PullRequestOutlined,
+  QrcodeOutlined,
+  ReloadOutlined,
+  SafetyOutlined,
+  RobotOutlined,
+  ScanOutlined,
+  SearchOutlined,
+  SelectOutlined,
+  ShakeOutlined,
+  ShareAltOutlined,
+  ShoppingCartOutlined,
+  SolutionOutlined,
+  SyncOutlined,
+  TableOutlined,
+  TeamOutlined,
+  ToTopOutlined,
+  TrademarkOutlined,
+  TransactionOutlined,
+  UploadOutlined,
+  UserAddOutlined,
+  UserDeleteOutlined,
+  UsergroupAddOutlined,
+  UserOutlined,
+  UsergroupDeleteOutlined,
+  WifiOutlined,
+  WomanOutlined,
+} from '@ant-design/icons';
+
+/**
+ * antd-icon v3 => v4 映射表
+ * @type {any}
+ */
+const IconMap = {
+  'step-backward': StepBackwardOutlined,
+  'step-forward': StepForwardOutlined,
+  'fast-backward': FastBackwardOutlined,
+  'fast-forward': FastForwardOutlined,
+  shrink: ShrinkOutlined,
+  'arrows-alt': ArrowsAltOutlined,
+  down: DownOutlined,
+  up: UpOutlined,
+  left: LeftOutlined,
+  right: RightOutlined,
+  'caret-up': CaretUpOutlined,
+  'caret-down': CaretDownOutlined,
+  'caret-left': CaretLeftOutlined,
+  'caret-right': CaretRightOutlined,
+  'up-circle': UpCircleOutlined,
+  'down-circle': DownCircleOutlined,
+  'left-circle': LeftCircleOutlined,
+  'right-circle': RightCircleOutlined,
+  'double-right': DoubleRightOutlined,
+  'double-left': DoubleLeftOutlined,
+  'vertical-left': VerticalLeftOutlined,
+  'vertical-right': VerticalRightOutlined,
+  'vertical-align-top': VerticalAlignTopOutlined,
+  'vertical-align-middle': VerticalAlignMiddleOutlined,
+  'vertical-align-bottom': VerticalAlignBottomOutlined,
+  forward: ForwardOutlined,
+  backward: BackwardOutlined,
+  rollback: RollbackOutlined,
+  enter: EnterOutlined,
+  retweet: RetweetOutlined,
+  swap: SwapOutlined,
+  'swap-left': SwapLeftOutlined,
+  'swap-right': SwapRightOutlined,
+  'arrow-up': ArrowUpOutlined,
+  'arrow-down': ArrowDownOutlined,
+  'arrow-left': ArrowLeftOutlined,
+  'arrow-right': ArrowRightOutlined,
+  'play-circle': PlayCircleOutlined,
+  'up-square': UpSquareOutlined,
+  'down-square': DownSquareOutlined,
+  'left-square': LeftSquareOutlined,
+  'right-square': RightSquareOutlined,
+  login: LoginOutlined,
+  logout: LogoutOutlined,
+  'menu-fold': MenuFoldOutlined,
+  'menu-unfold': MenuUnfoldOutlined,
+  'border-bottom': BorderBottomOutlined,
+  'border-horizontal': BorderHorizontalOutlined,
+  'border-inner': BorderInnerOutlined,
+  'border-outer': BorderOuterOutlined,
+  'border-left': BorderLeftOutlined,
+  'border-right': BorderRightOutlined,
+  'border-top': BorderTopOutlined,
+  'border-verticle': BorderVerticleOutlined,
+  'pic-center': PicCenterOutlined,
+  'pic-left': PicLeftOutlined,
+  'pic-right': PicRightOutlined,
+  'radius-bottomleft': RadiusBottomleftOutlined,
+  'radius-bottomright': RadiusBottomrightOutlined,
+  'radius-upleft': RadiusUpleftOutlined,
+  'radius-upright': RadiusUprightOutlined,
+  fullscreen: FullscreenOutlined,
+  'fullscreen-exit': FullscreenExitOutlined,
+  question: QuestionOutlined,
+  'question-circle': QuestionCircleOutlined,
+  plus: PlusOutlined,
+  'plus-circle': PlusCircleOutlined,
+  pause: PauseOutlined,
+  'pause-circle': PauseCircleOutlined,
+  minus: MinusOutlined,
+  'minus-circle': MinusCircleOutlined,
+  'plus-square': PlusSquareOutlined,
+  'minus-square': MinusSquareOutlined,
+  info: InfoOutlined,
+  'info-circle': InfoCircleOutlined,
+  exclamation: ExclamationOutlined,
+  'exclamation-circle': ExclamationCircleOutlined,
+  close: CloseOutlined,
+  'close-circle': CloseCircleOutlined,
+  'close-square': CloseSquareOutlined,
+  check: CheckOutlined,
+  'check-circle': CheckCircleOutlined,
+  'check-square': CheckSquareOutlined,
+  'clock-circle': ClockCircleOutlined,
+  warning: WarningOutlined,
+  'issues-close': IssuesCloseOutlined,
+  stop: StopOutlined,
+  edit: EditOutlined,
+  form: FormOutlined,
+  copy: CopyOutlined,
+  scissor: ScissorOutlined,
+  delete: DeleteOutlined,
+  snippets: SnippetsOutlined,
+  diff: DiffOutlined,
+  highlight: HighlightOutlined,
+  'align-center': AlignCenterOutlined,
+  'align-left': AlignLeftOutlined,
+  'align-right': AlignRightOutlined,
+  'bg-colors': BgColorsOutlined,
+  bold: BoldOutlined,
+  italic: ItalicOutlined,
+  underline: UnderlineOutlined,
+  strikethrough: StrikethroughOutlined,
+  redo: RedoOutlined,
+  undo: UndoOutlined,
+  'zoom-in': ZoomInOutlined,
+  'zoom-out': ZoomOutOutlined,
+  'font-colors': FontColorsOutlined,
+  'font-size': FontSizeOutlined,
+  'line-height': LineHeightOutlined,
+  dash: DashOutlined,
+  'small-dash': SmallDashOutlined,
+  'sort-ascending': SortAscendingOutlined,
+  'sort-descending': SortDescendingOutlined,
+  drag: DragOutlined,
+  'ordered-list': OrderedListOutlined,
+  'unordered-list': UnorderedListOutlined,
+  'radius-setting': RadiusSettingOutlined,
+  'column-width': ColumnWidthOutlined,
+  'column-height': ColumnHeightOutlined,
+  'area-chart': AreaChartOutlined,
+  'pie-chart': PieChartOutlined,
+  'bar-chart': BarChartOutlined,
+  'dot-chart': DotChartOutlined,
+  'line-chart': LineChartOutlined,
+  'radar-chart': RadarChartOutlined,
+  'heat-map': HeatMapOutlined,
+  fall: FallOutlined,
+  rise: RiseOutlined,
+  stock: StockOutlined,
+  'box-plot': BoxPlotOutlined,
+  fund: FundOutlined,
+  sliders: SlidersOutlined,
+  android: AndroidOutlined,
+  apple: AppleOutlined,
+  windows: WindowsOutlined,
+  ie: IeOutlined,
+  chrome: ChromeOutlined,
+  github: GithubOutlined,
+  aliwangwang: AliwangwangOutlined,
+  dingding: DingdingOutlined,
+  'weibo-square': WeiboSquareOutlined,
+  'weibo-circle': WeiboCircleOutlined,
+  'taobao-circle': TaobaoCircleOutlined,
+  html5: Html5Outlined,
+  weibo: WeiboOutlined,
+  twitter: TwitterOutlined,
+  wechat: WechatOutlined,
+  youtube: YoutubeOutlined,
+  'alipay-circle': AlipayCircleOutlined,
+  taobao: TaobaoOutlined,
+  skype: SkypeOutlined,
+  qq: QqOutlined,
+  'medium-workmark': MediumWorkmarkOutlined,
+  gitlab: GitlabOutlined,
+  medium: MediumOutlined,
+  linkedin: LinkedinOutlined,
+  'google-plus': GooglePlusOutlined,
+  dropbox: DropboxOutlined,
+  facebook: FacebookOutlined,
+  codepen: CodepenOutlined,
+  'code-sandbox': CodeSandboxOutlined,
+  amazon: AmazonOutlined,
+  google: GoogleOutlined,
+  'codepen-circle': CodepenCircleOutlined,
+  alipay: AlipayOutlined,
+  'ant-design': AntDesignOutlined,
+  'ant-cloud': AntCloudOutlined,
+  aliyun: AliyunOutlined,
+  zhihu: ZhihuOutlined,
+  slack: SlackOutlined,
+  'slack-square': SlackSquareOutlined,
+  behance: BehanceOutlined,
+  'behance-square': BehanceSquareOutlined,
+  dribbble: DribbbleOutlined,
+  'dribbble-square': DribbbleSquareOutlined,
+  instagram: InstagramOutlined,
+  yuque: YuqueOutlined,
+  alibaba: AlibabaOutlined,
+  yahoo: YahooOutlined,
+  reddit: RedditOutlined,
+  sketch: SketchOutlined,
+  'account-book': AccountBookOutlined,
+  alert: AlertOutlined,
+  api: ApiOutlined,
+  appstore: AppstoreOutlined,
+  audio: AudioOutlined,
+  bank: BankOutlined,
+  bell: BellOutlined,
+  book: BookOutlined,
+  bug: BugOutlined,
+  bulb: BulbOutlined,
+  calculator: CalculatorOutlined,
+  build: BuildOutlined,
+  calendar: CalendarOutlined,
+  camera: CameraOutlined,
+  car: CarOutlined,
+  'carry-out': CarryOutOutlined,
+  cloud: CloudOutlined,
+  code: CodeOutlined,
+  compass: CompassOutlined,
+  contacts: ContactsOutlined,
+  container: ContainerOutlined,
+  control: ControlOutlined,
+  'credit-card': CreditCardOutlined,
+  crown: CrownOutlined,
+  'customer-service': CustomerServiceOutlined,
+  dashboard: DashboardOutlined,
+  database: DatabaseOutlined,
+  dislike: DislikeOutlined,
+  environment: EnvironmentOutlined,
+  experiment: ExperimentOutlined,
+  'eye-invisible': EyeInvisibleOutlined,
+  eye: EyeOutlined,
+  'file-add': FileAddOutlined,
+  'file-excel': FileExcelOutlined,
+  'file-exclamation': FileExclamationOutlined,
+  'file-image': FileImageOutlined,
+  'file-markdown': FileMarkdownOutlined,
+  'file-pdf': FilePdfOutlined,
+  'file-ppt': FilePptOutlined,
+  'file-text': FileTextOutlined,
+  'file-unknown': FileUnknownOutlined,
+  'file-word': FileWordOutlined,
+  'file-zip': FileZipOutlined,
+  file: FileOutlined,
+  filter: FilterOutlined,
+  fire: FireOutlined,
+  flag: FlagOutlined,
+  'folder-add': FolderAddOutlined,
+  folder: FolderOutlined,
+  'folder-open': FolderOpenOutlined,
+  frown: FrownOutlined,
+  'funnel-plot': FunnelPlotOutlined,
+  gift: GiftOutlined,
+  hdd: HddOutlined,
+  heart: HeartOutlined,
+  home: HomeOutlined,
+  hourglass: HourglassOutlined,
+  idcard: IdcardOutlined,
+  insurance: InsuranceOutlined,
+  interaction: InteractionOutlined,
+  layout: LayoutOutlined,
+  like: LikeOutlined,
+  lock: LockOutlined,
+  mail: MailOutlined,
+  'medicine-box': MedicineBoxOutlined,
+  meh: MehOutlined,
+  message: MessageOutlined,
+  mobile: MobileOutlined,
+  'money-collect': MoneyCollectOutlined,
+  'pay-circle': PayCircleOutlined,
+  notification: NotificationOutlined,
+  phone: PhoneOutlined,
+  picture: PictureOutlined,
+  'play-square': PlaySquareOutlined,
+  printer: PrinterOutlined,
+  profile: ProfileOutlined,
+  project: ProjectOutlined,
+  pushpin: PushpinOutlined,
+  'property-safety': PropertySafetyOutlined,
+  read: ReadOutlined,
+  reconciliation: ReconciliationOutlined,
+  'red-envelope': RedEnvelopeOutlined,
+  rest: RestOutlined,
+  rocket: RocketOutlined,
+  'safety-certificate': SafetyCertificateOutlined,
+  save: SaveOutlined,
+  schedule: ScheduleOutlined,
+  'security-scan': SecurityScanOutlined,
+  setting: SettingOutlined,
+  shop: ShopOutlined,
+  shopping: ShoppingOutlined,
+  skin: SkinOutlined,
+  smile: SmileOutlined,
+  sound: SoundOutlined,
+  star: StarOutlined,
+  switcher: SwitcherOutlined,
+  tablet: TabletOutlined,
+  tag: TagOutlined,
+  tags: TagsOutlined,
+  tool: ToolOutlined,
+  thunderbolt: ThunderboltOutlined,
+  trophy: TrophyOutlined,
+  unlock: UnlockOutlined,
+  usb: UsbOutlined,
+  'video-camera': VideoCameraOutlined,
+  wallet: WalletOutlined,
+  apartment: ApartmentOutlined,
+  audit: AuditOutlined,
+  barcode: BarcodeOutlined,
+  bars: BarsOutlined,
+  block: BlockOutlined,
+  border: BorderOutlined,
+  branches: BranchesOutlined,
+  ci: CiOutlined,
+  'cloud-download': CloudDownloadOutlined,
+  'cloud-server': CloudServerOutlined,
+  'cloud-sync': CloudSyncOutlined,
+  'cloud-upload': CloudUploadOutlined,
+  cluster: ClusterOutlined,
+  coffee: CoffeeOutlined,
+  copyright: CopyrightOutlined,
+  'deployment-unit': DeploymentUnitOutlined,
+  desktop: DesktopOutlined,
+  disconnect: DisconnectOutlined,
+  dollar: DollarOutlined,
+  download: DownloadOutlined,
+  ellipsis: EllipsisOutlined,
+  euro: EuroOutlined,
+  exception: ExceptionOutlined,
+  export: ExportOutlined,
+  'file-done': FileDoneOutlined,
+  'file-jpg': FileJpgOutlined,
+  'file-protect': FileProtectOutlined,
+  'file-sync': FileSyncOutlined,
+  'file-search': FileSearchOutlined,
+  fork: ForkOutlined,
+  gateway: GatewayOutlined,
+  global: GlobalOutlined,
+  gold: GoldOutlined,
+  history: HistoryOutlined,
+  import: ImportOutlined,
+  inbox: InboxOutlined,
+  key: KeyOutlined,
+  laptop: LaptopOutlined,
+  link: LinkOutlined,
+  line: LineOutlined,
+  'loading-3-quarters': Loading3QuartersOutlined,
+  loading: LoadingOutlined,
+  man: ManOutlined,
+  menu: MenuOutlined,
+  monitor: MonitorOutlined,
+  more: MoreOutlined,
+  number: NumberOutlined,
+  percentage: PercentageOutlined,
+  'paper-clip': PaperClipOutlined,
+  pound: PoundOutlined,
+  poweroff: PoweroffOutlined,
+  'pull-request': PullRequestOutlined,
+  qrcode: QrcodeOutlined,
+  reload: ReloadOutlined,
+  safety: SafetyOutlined,
+  robot: RobotOutlined,
+  scan: ScanOutlined,
+  search: SearchOutlined,
+  select: SelectOutlined,
+  shake: ShakeOutlined,
+  'share-alt': ShareAltOutlined,
+  'shopping-cart': ShoppingCartOutlined,
+  solution: SolutionOutlined,
+  sync: SyncOutlined,
+  table: TableOutlined,
+  team: TeamOutlined,
+  'to-top': ToTopOutlined,
+  trademark: TrademarkOutlined,
+  transaction: TransactionOutlined,
+  upload: UploadOutlined,
+  'user-add': UserAddOutlined,
+  'user-delete': UserDeleteOutlined,
+  'usergroup-add': UsergroupAddOutlined,
+  user: UserOutlined,
+  'usergroup-delete': UsergroupDeleteOutlined,
+  wifi: WifiOutlined,
+  woman: WomanOutlined,
+};
+
+export default IconMap;

+ 18 - 0
src/components/Icon/index.tsx

@@ -0,0 +1,18 @@
+import PropTypes from 'prop-types';
+import IconMap from './IconMap';
+
+/**
+ * 图标兼容组件
+ * @type {any}
+ */
+function Icon({ type, ...otherProps }: any) {
+  const ICON = IconMap[type];
+  if (ICON) return <ICON {...otherProps} />;
+  return null;
+}
+
+Icon.propTypes = {
+  type: PropTypes.string.isRequired,
+};
+
+export default Icon;

+ 7 - 0
src/components/IconSelecter/index.less

@@ -0,0 +1,7 @@
+.iconItem {
+  margin: 8px;
+  font-size: 24px;
+  &:hover {
+    color: #3d38a8;
+  }
+}

+ 53 - 0
src/components/IconSelecter/index.tsx

@@ -0,0 +1,53 @@
+import Icon from '@ant-design/icons';
+import { Modal } from 'antd';
+import React from 'react';
+import IconMap from '@/components/Icon/IconMap';
+import styles from './index.less';
+
+interface dataProps {
+  visible: boolean;
+  onSelected: (item: any) => void;
+}
+
+/**
+ * 图标选择器
+ * @param props
+ * @constructor
+ */
+const IconSelector: React.FC<dataProps> = (props) => {
+  const { visible, onSelected } = props;
+  const iconNames = Object.keys(IconMap);
+
+  /**
+   * 选中图标后
+   */
+  const onIconClick = (item: React.Key | null | undefined) => {
+    onSelected(item);
+  };
+
+  return (
+    <Modal
+      title="图标选择"
+      footer={null}
+      open={visible}
+      width={900}
+      bodyStyle={{ height: 600, overflowY: 'auto' }}
+      onCancel={onSelected}
+    >
+      {iconNames &&
+        iconNames.map((item: any) => {
+          return (
+            <Icon
+              className={styles.iconItem}
+              key={item}
+              component={IconMap[item] as React.ForwardRefExoticComponent<any>}
+              onClick={() => {
+                onIconClick(item);
+              }}
+            />
+          );
+        })}
+    </Modal>
+  );
+};
+export default IconSelector;

+ 218 - 0
src/pages/MenuManagement/edit.tsx

@@ -0,0 +1,218 @@
+import Icon from '@ant-design/icons';
+import { Col, Form, Input, Modal, Radio, Row, Select, TreeSelect } from 'antd';
+import React, { useState } from 'react';
+import IconSelector from '@/components/IconSelecter';
+
+interface editPros {
+  visible: boolean;
+  treeData: any[];
+  editCallback: () => void;
+  params: any;
+}
+
+/**
+ * 菜单管理 - 编辑
+ * @param props
+ * @constructor
+ */
+const Edit: React.FC<editPros> = (props) => {
+  const { params, visible, editCallback, treeData } = props;
+  const [iconSelectorVisible, setIconSelectorVisible] = useState(false);
+  const [form] = Form.useForm();
+  const { getFieldValue, setFieldsValue } = form;
+  const iconType = getFieldValue('icon') || (params ? params.icon : '');
+
+  const menuTypeLabel = (value: any) => {
+    switch (value) {
+      case 1:
+        return ' [系统]';
+      case 2:
+        return ' [通用]';
+      case 3:
+        return ' [企业]';
+      case 4:
+        return ' [项目]';
+      default:
+        return ' [无]';
+    }
+  };
+
+  const onOk = () => {};
+
+  // 取消
+  const onCancel = () => {
+    editCallback();
+  };
+
+  // 打开图标选择框
+  const openIconSelector = () => {
+    setIconSelectorVisible(true);
+  };
+
+  // 上级菜单 树选择
+  const toTreeSelect = (data: any) => {
+    if (!data) {
+      return [];
+    }
+    const newData = [];
+    for (let i = 0; i < data.length; i += 1) {
+      const item = {
+        ...data[i],
+        title: data[i].name + menuTypeLabel(data[i].menu_type),
+        value: data[i].record_id,
+      };
+      if (item.children && item.children.length > 0) {
+        item.children = toTreeSelect(item.children);
+      }
+      newData.push(item);
+    }
+    return newData;
+  };
+
+  // 选中图标后
+  const onIconSelected = (item: any) => {
+    if (item && typeof item === 'string') {
+      setFieldsValue({ icon: item });
+    }
+    setIconSelectorVisible(false);
+  };
+
+  const formItemLayout = {
+    labelCol: {
+      span: 6,
+    },
+    wrapperCol: {
+      span: 18,
+    },
+  };
+
+  const formItemLayout24 = {
+    labelCol: { span: 3 },
+    wrapperCol: { span: 21 },
+  };
+
+  return (
+    <Modal
+      title={`${params ? '编辑' : '新增'}`}
+      open={visible}
+      onOk={onOk}
+      onCancel={onCancel}
+      width={800}
+    >
+      <Form form={form}>
+        <Row>
+          <Col span={12}>
+            <Form.Item
+              {...formItemLayout}
+              name="name"
+              label="菜单名称"
+              rules={[{ required: true, message: '请输入菜单名称' }]}
+              initialValue={params?.name}
+            >
+              <Input placeholder="请输入菜单名称" />
+            </Form.Item>
+          </Col>
+          <Col span={12}>
+            <Form.Item
+              {...formItemLayout}
+              name="parent_id"
+              label="上级菜单"
+              rules={[{ required: true, message: '请选择上级菜单' }]}
+              initialValue={params?.parent_id}
+            >
+              <TreeSelect
+                allowClear
+                showSearch
+                treeNodeFilterProp="title"
+                style={{ width: '100%' }}
+                dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
+                treeData={toTreeSelect(treeData)}
+                placeholder="请选择"
+              />
+            </Form.Item>
+          </Col>
+          <Col span={12}>
+            <Form.Item
+              {...formItemLayout}
+              name="menu_type"
+              label="菜单类型"
+              rules={[{ required: true, message: '请选择菜单类型' }]}
+              initialValue={params?.menu_type}
+            >
+              <Select placeholder="请选择菜单类型">
+                <Select.Option key={1} value={1}>
+                  系统
+                </Select.Option>
+                <Select.Option key={2} value={2}>
+                  通用
+                </Select.Option>
+                <Select.Option key={3} value={3}>
+                  企业
+                </Select.Option>
+                <Select.Option key={4} value={4}>
+                  项目
+                </Select.Option>
+              </Select>
+            </Form.Item>
+          </Col>
+          <Col span={12}>
+            <Form.Item
+              {...formItemLayout}
+              name="sequence"
+              label="排序值"
+              rules={[{ required: true, message: '请输入排序值' }]}
+              initialValue={params?.sequence}
+            >
+              <Input placeholder="请输入排序值" />
+            </Form.Item>
+          </Col>
+          <Col span={12}>
+            <Form.Item
+              {...formItemLayout}
+              name="icon"
+              label="图标"
+              rules={[{ required: true, message: '请选择图标' }]}
+              initialValue={params?.icon}
+            >
+              <Input
+                placeholder="请输入"
+                readOnly
+                onClick={openIconSelector}
+                suffix={iconType ? <Icon type={iconType} /> : null}
+              />
+            </Form.Item>
+          </Col>
+          <Col span={12}>
+            <Form.Item
+              {...formItemLayout}
+              name="hidden"
+              label="状态"
+              rules={[{ required: true, message: '请选择状态' }]}
+              initialValue={params?.hidden}
+            >
+              <Radio.Group>
+                <Radio value={0}>显示</Radio>
+                <Radio value={1}>隐藏</Radio>
+              </Radio.Group>
+            </Form.Item>
+          </Col>
+          <Col span={24}>
+            <Form.Item
+              {...formItemLayout24}
+              name="router"
+              label="访问路由"
+              rules={[{ required: true, message: '请输入访问路由' }]}
+              initialValue={params?.router}
+            >
+              <Input placeholder="请输入访问路由" />
+            </Form.Item>
+          </Col>
+        </Row>
+      </Form>
+      {iconSelectorVisible && (
+        <IconSelector visible={iconSelectorVisible} onSelected={onIconSelected} />
+      )}
+    </Modal>
+  );
+};
+export default Edit;

+ 285 - 0
src/pages/MenuManagement/index.tsx

@@ -0,0 +1,285 @@
+import { PageContainer } from '@ant-design/pro-components';
+import React, { useEffect, useState } from 'react';
+import { Button, Card, Form, Input, Modal, Space, Table } from 'antd';
+import Icon, { PlusCircleOutlined, ReloadOutlined, SearchOutlined } from '@ant-design/icons';
+import type { ColumnsType } from 'antd/es/table';
+import moment from 'moment/moment';
+import Edit from '@/pages/MenuManagement/edit';
+import IconMap from '@/components/Icon/IconMap';
+
+interface DataType {
+  name: string;
+  menu_type: number;
+  sequence: number;
+  hidden: number;
+  icon: string;
+  record_id: string;
+}
+
+/**
+ * 菜单管理
+ * @constructor
+ */
+const MenuManagement: React.FC = () => {
+  const [loading, setLoading] = useState(false);
+  const [searchData, setSearchData] = useState<object | null>({});
+  const [editData, setEditData] = useState(null);
+  const [form] = Form.useForm();
+  const [visible, setVisible] = useState(false);
+  const [pagination, setPagination] = useState({ total: 0, current: 1, pageSize: 10 });
+  const [dataList, setDataList] = useState([]);
+  const [tag] = useState('web');
+
+  const getList = () => {
+    const data: any = [
+      {
+        name: '菜单名称',
+        menu_type: 2,
+        sequence: 20,
+        hidden: 1,
+        icon: 'security-scan',
+        tag: 'web',
+        router: '/editionManagement',
+        creator: 'root',
+        created_at: '2023-01-04T14:31:23.664+08:00',
+        record_id: '1111',
+        parent_id: '1111',
+      },
+    ];
+    setDataList(data);
+    setPagination({ total: 0, current: 1, pageSize: 10 });
+  };
+
+  useEffect(() => {
+    getList();
+  }, []);
+
+  //  分页切换
+  const tableChange = (page: any) => {
+    setLoading(true);
+    const params = {
+      q: 'page',
+      current: page.current,
+      pageSize: page.pageSize,
+      ...searchData,
+    };
+    console.log(params);
+    //   请求接口
+  };
+
+  //  搜索
+  const onFinish = () => {
+    form.validateFields().then((data) => {
+      setLoading(true);
+      setSearchData(data);
+    });
+  };
+  // 重置
+  const onReset = () => {
+    form.resetFields();
+    setLoading(true);
+    setSearchData(null);
+  };
+  // 新增弹框
+  const onAdd = () => {
+    setEditData(null);
+    setVisible(true);
+  };
+  // 打开编辑弹框
+  const toEdit = (data: any) => {
+    setEditData(data);
+    setVisible(true);
+  };
+  // 删除
+  const toDel = (record: any) => {
+    Modal.confirm({
+      title: '删除',
+      content: `确认删除菜单:[${record.name}]`,
+      onOk: () => {
+        //   请求接口
+      },
+    });
+  };
+
+  // 编辑弹框回调
+  const handleEdit = () => {
+    setVisible(false);
+    // 请求接口
+  };
+  const columns: ColumnsType<DataType> = [
+    {
+      title: '序号',
+      align: 'center',
+      key: 'index',
+      render: (_: any, row: any, index: number) => index + 1,
+    },
+    {
+      title: '菜单名称',
+      dataIndex: 'name',
+      key: 'name',
+      width: 250,
+    },
+    {
+      title: '类型',
+      dataIndex: 'menu_type',
+      width: 100,
+      render: (val) => {
+        switch (val) {
+          case 1:
+            return <span style={{ color: '#f50' }}>系统</span>;
+          case 2:
+            return <span style={{ color: '#87d068' }}>通用</span>;
+          case 3:
+            return <span style={{ color: '#3c6bbc' }}>企业</span>;
+          case 4:
+            return <span style={{ color: '#b28317' }}>项目</span>;
+          default:
+            return <span style={{ color: '#590858' }}>无</span>;
+        }
+      },
+    },
+    {
+      title: '排序值',
+      dataIndex: 'sequence',
+      align: 'center',
+      width: 100,
+    },
+    {
+      title: '状态',
+      dataIndex: 'hidden',
+      align: 'center',
+      width: 100,
+      render: (val) =>
+        val === 1 ? (
+          <span style={{ color: '#f50' }}>隐藏</span>
+        ) : (
+          <span style={{ color: '#87d068' }}>显示</span>
+        ),
+    },
+    {
+      title: '图标',
+      dataIndex: 'icon',
+      align: 'center',
+      width: 100,
+      render: (val) => {
+        return tag === 'api' ? (
+          <img src={val} alt="val" style={{ width: 32 }} />
+        ) : (
+          <Icon component={IconMap[val] as React.ForwardRefExoticComponent<any>} />
+        );
+      },
+    },
+    // {
+    //   title: '动作',
+    //   dataIndex: 'actions',
+    //   align: 'center',
+    //   width: 80,
+    //   render: val =>
+    //     val ? (
+    //       <Tooltip title={val.map((item: { name: any; }) => item.name).join(' ')}>
+    //         <span style={{ color: '#87d068' }}>{val.length} 动作</span>
+    //       </Tooltip>
+    //     ) : (
+    //       <span style={{ color: '#d07c63' }}>无动作</span>
+    //     ),
+    // },
+    {
+      title: '菜单标签',
+      dataIndex: 'tag',
+      key: 'tag',
+    },
+    {
+      title: '访问路由',
+      dataIndex: 'router',
+      key: 'router',
+    },
+    {
+      title: '创建者',
+      dataIndex: 'creator',
+      key: 'creator',
+    },
+    {
+      title: '创建时间',
+      dataIndex: 'created_at',
+      key: 'created_at',
+      render: (v) => v && <span>{moment(v).format('YYYY-MM-DD HH:mm')}</span>,
+    },
+    {
+      title: '操作',
+      key: 'action',
+      render: (_, record) => (
+        <Space size="middle">
+          <a
+            onClick={() => {
+              toEdit(record);
+            }}
+          >
+            编辑
+          </a>
+          <a
+            style={{ color: 'red' }}
+            onClick={() => {
+              toDel(record);
+            }}
+          >
+            删除
+          </a>
+        </Space>
+      ),
+    },
+  ];
+  const paginationProps = {
+    showSizeChanger: true,
+    showQuickJumper: true,
+    showTotal: (total: number) => {
+      return <span> 共 {total}条 </span>;
+    },
+    ...pagination,
+  };
+  return (
+    <PageContainer>
+      <div>
+        <Card>
+          <Form form={form} layout="inline" onFinish={onFinish}>
+            <Form.Item name="name" label="菜单名称">
+              <Input placeholder="请输入菜单名称" />
+            </Form.Item>
+            <Form.Item style={{ marginBottom: '10px' }}>
+              <Space>
+                <Button type="primary" htmlType="submit">
+                  <SearchOutlined />
+                  查询
+                </Button>
+                <Button htmlType="button" onClick={onReset}>
+                  <ReloadOutlined />
+                  重置
+                </Button>
+              </Space>
+            </Form.Item>
+          </Form>
+          <Button htmlType="button" type="primary" style={{ margin: '20px 0' }} onClick={onAdd}>
+            <PlusCircleOutlined />
+            新增菜单
+          </Button>
+          <Table
+            columns={columns}
+            dataSource={dataList}
+            rowKey={(record) => record.record_id}
+            pagination={paginationProps}
+            loading={loading}
+            onChange={tableChange}
+          />
+          {visible && (
+            <Edit
+              visible={visible}
+              treeData={dataList}
+              editCallback={handleEdit}
+              params={editData}
+            />
+          )}
+        </Card>
+      </div>
+    </PageContainer>
+  );
+};
+export default MenuManagement;

+ 24 - 0
src/pages/RoleManagement/edit.tsx

@@ -0,0 +1,24 @@
+import React from 'react';
+import { Modal } from 'antd';
+
+interface editPros {
+  visible: boolean;
+  editCallback: () => void;
+  params: any;
+}
+
+const Edit: React.FC<editPros> = (props) => {
+  const { params, visible } = props;
+  const onOk = () => {};
+  const onCancel = () => {};
+  return (
+    <Modal
+      title={`${params ? '编辑' : '新增'}`}
+      open={visible}
+      onOk={onOk}
+      onCancel={onCancel}
+      width={800}
+    />
+  );
+};
+export default Edit;

+ 116 - 0
src/pages/RoleManagement/index.tsx

@@ -0,0 +1,116 @@
+import React, { useState } from 'react';
+import { PageContainer } from '@ant-design/pro-components';
+import { Button, Card, Form, Input, Space, Table } from 'antd';
+import { PlusCircleOutlined, ReloadOutlined, SearchOutlined } from '@ant-design/icons';
+import type { ColumnsType } from 'antd/es/table';
+import moment from 'moment';
+
+interface DataType {
+  name: string;
+  record_id: string;
+}
+
+const RoleManagement: React.FC = () => {
+  const [form] = Form.useForm();
+  const [loading, setLoading] = useState(false);
+  const [searchData] = useState({});
+  const pagination = useState({});
+  const [dataList] = useState([]);
+  const onFinish = () => {};
+  const onReset = () => {};
+  const onAdd = () => {};
+  const tableChange = (page: any) => {
+    setLoading(true);
+    const params = {
+      q: 'page',
+      current: page.current,
+      pageSize: page.pageSize,
+      ...searchData,
+    };
+    console.log(params);
+    //   请求接口
+  };
+  const columns: ColumnsType<DataType> = [
+    {
+      title: '序号',
+      align: 'center',
+      key: 'index',
+      render: (_: any, row: any, index: number) => index + 1,
+    },
+    {
+      title: '角色名称',
+      dataIndex: 'name',
+      key: 'name',
+      width: 250,
+    },
+    {
+      title: '排序值',
+      dataIndex: 'sequence',
+      key: 'sequence',
+      width: 250,
+    },
+    {
+      title: '创建者',
+      dataIndex: 'creator',
+      key: 'creator',
+    },
+    {
+      title: '创建时间',
+      dataIndex: 'created_at',
+      key: 'created_at',
+      render: (v) => v && <span>{moment(v).format('YYYY-MM-DD HH:mm')}</span>,
+    },
+    {
+      title: '备注',
+      dataIndex: 'memo',
+      key: 'memo',
+      width: 250,
+    },
+  ];
+  const paginationProps = {
+    showSizeChanger: true,
+    showQuickJumper: true,
+    showTotal: (total: number) => {
+      return <span> 共 {total}条 </span>;
+    },
+    ...pagination,
+  };
+  return (
+    <PageContainer>
+      <div>
+        <Card>
+          <Form form={form} layout="inline" onFinish={onFinish}>
+            <Form.Item name="name" label="角色名称">
+              <Input placeholder="请输入角色名称" />
+            </Form.Item>
+            <Form.Item style={{ marginBottom: '10px' }}>
+              <Space>
+                <Button type="primary" htmlType="submit">
+                  <SearchOutlined />
+                  查询
+                </Button>
+                <Button htmlType="button" onClick={onReset}>
+                  <ReloadOutlined />
+                  重置
+                </Button>
+              </Space>
+            </Form.Item>
+          </Form>
+          <Button htmlType="button" type="primary" style={{ margin: '20px 0' }} onClick={onAdd}>
+            <PlusCircleOutlined />
+            新增角色
+          </Button>
+          <Table
+            columns={columns}
+            dataSource={dataList}
+            rowKey={(record) => record.record_id}
+            pagination={paginationProps}
+            loading={loading}
+            onChange={tableChange}
+          />
+        </Card>
+      </div>
+    </PageContainer>
+  );
+};
+export default RoleManagement;

+ 10 - 9
src/pages/Welcome.tsx

@@ -1,7 +1,8 @@
 import { PageContainer } from '@ant-design/pro-components';
 import { Card } from 'antd';
 import React from 'react';
-import StatisticIndex from '../pages/statistical/index';
+import styles from './Welcome.less';
+// import StatisticIndex from '../pages/statistical/index';
 
 /**
  * 欢迎首页
@@ -11,14 +12,14 @@ const Welcome: React.FC = () => {
   return (
     <PageContainer>
       <Card>
-        <StatisticIndex />
-        {/*<div style={{ width: '100%' }} className={styles.welcome}>*/}
-        {/*  <img src="/assets/welcome.png" className={styles.img_style} alt="" />*/}
-        {/*  <div className={styles.welcome_text} style={{ marginTop: '10px' }}>*/}
-        {/*    WELCOME*/}
-        {/*  </div>*/}
-        {/*  <div className={styles.welcome_text}>欢迎进入永续绿建管理平台</div>*/}
-        {/*</div>*/}
+        {/*<StatisticIndex />*/}
+        <div style={{ width: '100%' }} className={styles.welcome}>
+          <img src="/assets/welcome.png" className={styles.img_style} alt="" />
+          <div className={styles.welcome_text} style={{ marginTop: '10px' }}>
+            WELCOME
+          </div>
+          <div className={styles.welcome_text}>欢迎进入永续绿建管理平台</div>
+        </div>
       </Card>
     </PageContainer>
   );

+ 2 - 2
src/pages/home/index.tsx

@@ -3,7 +3,7 @@ import { Button, Card, Form, Input, Select, Space, Table } from 'antd';
 import React, { useEffect, useState } from 'react';
 import { ReloadOutlined, SearchOutlined } from '@ant-design/icons';
 import { history } from 'umi';
-import { ColumnsType } from 'antd/es/table';
+import type { ColumnsType } from 'antd/es/table';
 import { queryHomeList } from '@/services/home';
 
 interface DataType {
@@ -84,7 +84,7 @@ const Home: React.FC = () => {
 
   // 跳转到房间
   const toRoom = (record: DataType) => {
-    history.push({ pathname: '/room', state: record.record_id });
+    history.push({ pathname: '/roomList', state: record.record_id });
   };
 
   const columns: ColumnsType<DataType> = [

+ 8 - 2
src/pages/home/room/index.tsx

@@ -2,7 +2,7 @@ import { PageContainer } from '@ant-design/pro-components';
 import React, { useEffect, useState } from 'react';
 import { Button, Card, Form, Input, Select, Space, Table } from 'antd';
 import { ReloadOutlined, SearchOutlined } from '@ant-design/icons';
-import { ColumnsType } from 'antd/es/table';
+import type { ColumnsType } from 'antd/es/table';
 import { history } from 'umi';
 import { queryRoomList } from '@/services/home';
 
@@ -191,7 +191,13 @@ const Room: React.FC = () => {
                 <ReloadOutlined />
                 重置
               </Button>
-              <Button>返回</Button>
+              <Button
+                onClick={() => {
+                  history.goBack();
+                }}
+              >
+                返回
+              </Button>
             </Space>
           </Form.Item>
         </Form>