├── .gitignore ├── .gitlab-ci.yml ├── LICENSE ├── README.md ├── client ├── .editorconfig ├── .gitignore ├── Dockerfile ├── README.md ├── build.sh ├── config │ ├── dev.js │ ├── index.js │ ├── prod.js │ └── webstorm.config.js ├── docker │ └── nginx.conf ├── package.json ├── project.config.json ├── src │ ├── Config.js │ ├── Context.js │ ├── app.js │ ├── app.scss │ ├── assets │ │ ├── banner │ │ │ ├── 1.jpg │ │ │ ├── 2.jpg │ │ │ ├── 3.jpg │ │ │ ├── 4.jpg │ │ │ ├── 5.jpg │ │ │ ├── 6.jpg │ │ │ └── 7.jpg │ │ ├── index │ │ │ ├── category │ │ │ │ ├── all@2x.png │ │ │ │ ├── buy@2x.png │ │ │ │ ├── clothes@2x.png │ │ │ │ ├── coupon@2x.png │ │ │ │ ├── fresh@2x.png │ │ │ │ ├── money@2x.png │ │ │ │ ├── recharge@2x.png │ │ │ │ ├── shop@2x.png │ │ │ │ ├── time@2x.png │ │ │ │ └── world@2x.png │ │ │ ├── category@2x.png │ │ │ ├── courtyard │ │ │ │ └── title@2x.png │ │ │ ├── everyday │ │ │ │ └── title@2x.png │ │ │ ├── icon.png │ │ │ ├── newuser │ │ │ │ ├── channel@2x.png │ │ │ │ ├── exclusive@2x.png │ │ │ │ └── package@2x.png │ │ │ ├── searchIcon.png │ │ │ ├── spike │ │ │ │ ├── goods-1@2x.png │ │ │ │ └── more@2x.png │ │ │ ├── up.png │ │ │ └── vLine.png │ │ ├── tabbar │ │ │ ├── category@2x.png │ │ │ ├── categoryUn@2x.png │ │ │ ├── index@2x.png │ │ │ ├── indexUn@2x.png │ │ │ ├── mine@2x.png │ │ │ ├── mineUn@2x.png │ │ │ ├── shopcart@2x.png │ │ │ └── shopcartUn@2x.png │ │ └── token │ │ │ └── login │ │ │ ├── forgetPasswordLeft.png │ │ │ ├── qq.png │ │ │ └── weixin.png │ ├── components │ │ ├── BannerSwiper.js │ │ ├── BannerSwiper.module.scss │ │ ├── Category.js │ │ ├── Category.module.scss │ │ ├── CustomImage.js │ │ ├── FixedHeader.js │ │ ├── FixedHeader.module.scss │ │ ├── GoodsSpike.js │ │ ├── GoodsSpike.module.scss │ │ ├── TabBar.js │ │ ├── TabBar.module.scss │ │ ├── expo │ │ │ ├── OneGrid.js │ │ │ ├── OneGrid.module.scss │ │ │ ├── TwoGrid.js │ │ │ └── TwoGrid.module.scss │ │ └── goods │ │ │ ├── GoodsItem.js │ │ │ └── GoodsItem.module.scss │ ├── index.html │ ├── mock │ │ ├── category │ │ │ └── menu.json │ │ ├── goods.json │ │ ├── goodsList.json │ │ └── index │ │ │ ├── banner.js │ │ │ ├── category.js │ │ │ ├── courtyard.json │ │ │ ├── everyday.json │ │ │ └── mock.json │ ├── models │ │ ├── goods.js │ │ ├── index.js │ │ ├── net.js │ │ └── user.js │ ├── pages │ │ ├── account │ │ │ └── index.js │ │ ├── category │ │ │ ├── index.js │ │ │ ├── index.module.css │ │ │ ├── index.module.css.map │ │ │ └── index.module.scss │ │ ├── forgetPassword │ │ │ ├── index.module.less │ │ │ └── index.tsx │ │ ├── goodsDetail │ │ │ ├── index.module.less │ │ │ └── index.tsx │ │ ├── index │ │ │ ├── goodsMock.json │ │ │ ├── index.js │ │ │ └── index.module.scss │ │ ├── login │ │ │ ├── index.js │ │ │ └── index.module.scss │ │ ├── register │ │ │ ├── index.module.less │ │ │ └── index.tsx │ │ ├── searchGoodsList │ │ │ ├── index.module.less │ │ │ └── index.tsx │ │ └── shopcart │ │ │ ├── index.js │ │ │ └── index.module.scss │ └── utils │ │ ├── RequestImpl.js │ │ ├── action.js │ │ ├── delay.js │ │ ├── dva.js │ │ ├── paramsUtils.js │ │ ├── request.js │ │ └── urlRequest.js └── versionToNew.sh ├── demo-docker ├── README.md └── client-compose.yml ├── manager-new ├── .editorconfig ├── .eslintignore ├── .eslintrc.js ├── .gitignore ├── .prettierignore ├── .prettierrc.js ├── .stylelintrc.js ├── README.md ├── config │ ├── config.ts │ ├── defaultSettings.ts │ ├── plugin.config.ts │ └── themePluginConfig.ts ├── jest-puppeteer.config.js ├── jest.config.js ├── jsconfig.json ├── mock │ ├── notices.ts │ ├── route.ts │ └── user.ts ├── package.json ├── public │ ├── favicon.png │ └── icons │ │ ├── icon-128x128.png │ │ ├── icon-192x192.png │ │ └── icon-512x512.png ├── src │ ├── assets │ │ └── logo.svg │ ├── components │ │ ├── Authorized │ │ │ ├── Authorized.tsx │ │ │ ├── AuthorizedRoute.tsx │ │ │ ├── CheckPermissions.tsx │ │ │ ├── PromiseRender.tsx │ │ │ ├── Secured.tsx │ │ │ ├── index.tsx │ │ │ └── renderAuthorize.ts │ │ ├── GlobalHeader │ │ │ ├── AvatarDropdown.tsx │ │ │ ├── NoticeIconView.tsx │ │ │ ├── RightContent.tsx │ │ │ └── index.less │ │ ├── HeaderDropdown │ │ │ ├── index.less │ │ │ └── index.tsx │ │ ├── HeaderSearch │ │ │ ├── index.less │ │ │ └── index.tsx │ │ ├── NoticeIcon │ │ │ ├── NoticeList.less │ │ │ ├── NoticeList.tsx │ │ │ ├── index.less │ │ │ └── index.tsx │ │ ├── PageLoading │ │ │ └── index.tsx │ │ └── SelectLang │ │ │ ├── index.less │ │ │ └── index.tsx │ ├── e2e │ │ ├── __mocks__ │ │ │ └── antd-pro-merge-less.js │ │ ├── baseLayout.e2e.js │ │ └── topMenu.e2e.js │ ├── global.less │ ├── global.tsx │ ├── layouts │ │ ├── BasicLayout.tsx │ │ ├── BlankLayout.tsx │ │ ├── SecurityLayout.tsx │ │ ├── UserLayout.less │ │ └── UserLayout.tsx │ ├── locales │ │ ├── en-US.ts │ │ ├── en-US │ │ │ ├── component.ts │ │ │ ├── globalHeader.ts │ │ │ ├── menu.ts │ │ │ ├── pwa.ts │ │ │ ├── settingDrawer.ts │ │ │ └── settings.ts │ │ ├── pt-BR.ts │ │ ├── pt-BR │ │ │ ├── component.ts │ │ │ ├── globalHeader.ts │ │ │ ├── menu.ts │ │ │ ├── pwa.ts │ │ │ ├── settingDrawer.ts │ │ │ └── settings.ts │ │ ├── zh-CN.ts │ │ ├── zh-CN │ │ │ ├── component.ts │ │ │ ├── globalHeader.ts │ │ │ ├── menu.ts │ │ │ ├── pwa.ts │ │ │ ├── settingDrawer.ts │ │ │ └── settings.ts │ │ ├── zh-TW.ts │ │ └── zh-TW │ │ │ ├── component.ts │ │ │ ├── globalHeader.ts │ │ │ ├── menu.ts │ │ │ ├── pwa.ts │ │ │ ├── settingDrawer.ts │ │ │ └── settings.ts │ ├── manifest.json │ ├── models │ │ ├── connect.d.ts │ │ ├── global.ts │ │ ├── login.ts │ │ ├── setting.ts │ │ └── user.ts │ ├── pages │ │ ├── 404.tsx │ │ ├── Admin.tsx │ │ ├── Authorized.tsx │ │ ├── EmptyPage │ │ │ ├── ListBasic │ │ │ │ ├── index.less │ │ │ │ └── index.tsx │ │ │ ├── index.less │ │ │ └── index.tsx │ │ ├── Welcome.less │ │ ├── Welcome.tsx │ │ ├── document.ejs │ │ └── user │ │ │ └── login │ │ │ ├── components │ │ │ └── Login │ │ │ │ ├── LoginContext.tsx │ │ │ │ ├── LoginItem.tsx │ │ │ │ ├── LoginSubmit.tsx │ │ │ │ ├── LoginTab.tsx │ │ │ │ ├── index.less │ │ │ │ ├── index.tsx │ │ │ │ └── map.tsx │ │ │ ├── index.tsx │ │ │ ├── locales │ │ │ ├── en-US.ts │ │ │ ├── zh-CN.ts │ │ │ └── zh-TW.ts │ │ │ └── style.less │ ├── service-worker.js │ ├── services │ │ ├── login.ts │ │ └── user.ts │ ├── typings.d.ts │ └── utils │ │ ├── Authorized.ts │ │ ├── authority.test.ts │ │ ├── authority.ts │ │ ├── request.ts │ │ ├── utils.less │ │ ├── utils.test.ts │ │ └── utils.ts ├── tests │ └── run-tests.js └── tsconfig.json ├── manager ├── .dockerignore ├── .editorconfig ├── .eslintignore ├── .eslintrc.js ├── .firebaserc ├── .gitignore ├── .gitpod.yml ├── .prettierignore ├── .prettierrc ├── .stylelintrc.json ├── CODE_OF_CONDUCT.md ├── Dockerfile ├── Dockerfile.dev ├── Dockerfile.hub ├── LICENSE ├── README.md ├── README.ru-RU.md ├── README.zh-CN.md ├── azure-pipelines.yml ├── build.sh ├── config │ ├── config.js │ ├── plugin.config.js │ ├── router.config.js │ └── webstorm.config.js ├── docker │ ├── docker-compose.dev.yml │ ├── docker-compose.yml │ └── nginx.conf ├── firebase.json ├── functions │ ├── index.js │ ├── matchMock.js │ └── package.json ├── jest-puppeteer.config.js ├── jest.config.js ├── jsconfig.json ├── mock │ ├── api.js │ ├── chart.js │ ├── geographic.js │ ├── geographic │ │ ├── city.json │ │ └── province.json │ ├── notices.js │ ├── profile.js │ ├── route.js │ ├── rule.js │ └── user.js ├── netlify.toml ├── package.json ├── public │ ├── favicon.png │ └── icons │ │ ├── icon-128x128.png │ │ ├── icon-192x192.png │ │ └── icon-512x512.png ├── scripts │ ├── generateMock.js │ ├── getPrettierFiles.js │ ├── lint-prettier.js │ └── prettier.js ├── src │ ├── app.js │ ├── assets │ │ └── logo.svg │ ├── components │ │ ├── ActiveChart │ │ │ ├── index.js │ │ │ └── index.less │ │ ├── ArticleListContent │ │ │ ├── index.js │ │ │ └── index.less │ │ ├── Authorized │ │ │ ├── Authorized.js │ │ │ ├── AuthorizedRoute.d.ts │ │ │ ├── AuthorizedRoute.js │ │ │ ├── CheckPermissions.js │ │ │ ├── CheckPermissions.test.js │ │ │ ├── PromiseRender.js │ │ │ ├── Secured.js │ │ │ ├── demo │ │ │ │ ├── AuthorizedArray.md │ │ │ │ ├── AuthorizedFunction.md │ │ │ │ ├── basic.md │ │ │ │ └── secured.md │ │ │ ├── index.d.ts │ │ │ ├── index.js │ │ │ ├── index.md │ │ │ └── renderAuthorize.js │ │ ├── AvatarList │ │ │ ├── AvatarItem.d.ts │ │ │ ├── demo │ │ │ │ ├── maxLength.md │ │ │ │ └── simple.md │ │ │ ├── index.d.ts │ │ │ ├── index.en-US.md │ │ │ ├── index.js │ │ │ ├── index.less │ │ │ ├── index.test.js │ │ │ └── index.zh-CN.md │ │ ├── Charts │ │ │ ├── Bar │ │ │ │ ├── index.d.ts │ │ │ │ └── index.js │ │ │ ├── ChartCard │ │ │ │ ├── index.d.ts │ │ │ │ ├── index.js │ │ │ │ └── index.less │ │ │ ├── Field │ │ │ │ ├── index.d.ts │ │ │ │ ├── index.js │ │ │ │ └── index.less │ │ │ ├── Gauge │ │ │ │ ├── index.d.ts │ │ │ │ └── index.js │ │ │ ├── MiniArea │ │ │ │ ├── index.d.ts │ │ │ │ └── index.js │ │ │ ├── MiniBar │ │ │ │ ├── index.d.ts │ │ │ │ └── index.js │ │ │ ├── MiniProgress │ │ │ │ ├── index.d.ts │ │ │ │ ├── index.js │ │ │ │ └── index.less │ │ │ ├── Pie │ │ │ │ ├── index.d.ts │ │ │ │ ├── index.js │ │ │ │ └── index.less │ │ │ ├── Radar │ │ │ │ ├── index.d.ts │ │ │ │ ├── index.js │ │ │ │ └── index.less │ │ │ ├── TagCloud │ │ │ │ ├── index.d.ts │ │ │ │ ├── index.js │ │ │ │ └── index.less │ │ │ ├── TimelineChart │ │ │ │ ├── index.d.ts │ │ │ │ ├── index.js │ │ │ │ └── index.less │ │ │ ├── WaterWave │ │ │ │ ├── index.d.ts │ │ │ │ ├── index.js │ │ │ │ └── index.less │ │ │ ├── autoHeight.js │ │ │ ├── bizcharts.d.ts │ │ │ ├── bizcharts.js │ │ │ ├── demo │ │ │ │ ├── bar.md │ │ │ │ ├── chart-card.md │ │ │ │ ├── gauge.md │ │ │ │ ├── mini-area.md │ │ │ │ ├── mini-bar.md │ │ │ │ ├── mini-pie.md │ │ │ │ ├── mini-progress.md │ │ │ │ ├── mix.md │ │ │ │ ├── pie.md │ │ │ │ ├── radar.md │ │ │ │ ├── tag-cloud.md │ │ │ │ ├── timeline-chart.md │ │ │ │ └── waterwave.md │ │ │ ├── index.d.ts │ │ │ ├── index.js │ │ │ ├── index.less │ │ │ └── index.md │ │ ├── CountDown │ │ │ ├── demo │ │ │ │ └── simple.md │ │ │ ├── index.d.ts │ │ │ ├── index.en-US.md │ │ │ ├── index.js │ │ │ └── index.zh-CN.md │ │ ├── DescriptionList │ │ │ ├── Description.d.ts │ │ │ ├── Description.js │ │ │ ├── DescriptionList.js │ │ │ ├── demo │ │ │ │ ├── basic.md │ │ │ │ └── vertical.md │ │ │ ├── index.d.ts │ │ │ ├── index.en-US.md │ │ │ ├── index.js │ │ │ ├── index.less │ │ │ ├── index.zh-CN.md │ │ │ └── responsive.js │ │ ├── EditableItem │ │ │ ├── index.js │ │ │ └── index.less │ │ ├── EditableLinkGroup │ │ │ ├── index.js │ │ │ └── index.less │ │ ├── Ellipsis │ │ │ ├── demo │ │ │ │ ├── line.md │ │ │ │ └── number.md │ │ │ ├── index.d.ts │ │ │ ├── index.en-US.md │ │ │ ├── index.js │ │ │ ├── index.less │ │ │ ├── index.test.js │ │ │ └── index.zh-CN.md │ │ ├── Exception │ │ │ ├── demo │ │ │ │ ├── 403.md │ │ │ │ ├── 404.md │ │ │ │ └── 500.md │ │ │ ├── index.d.ts │ │ │ ├── index.en-US.md │ │ │ ├── index.js │ │ │ ├── index.less │ │ │ ├── index.zh-CN.md │ │ │ └── typeConfig.js │ │ ├── FooterToolbar │ │ │ ├── demo │ │ │ │ └── basic.md │ │ │ ├── index.d.ts │ │ │ ├── index.en-US.md │ │ │ ├── index.js │ │ │ ├── index.less │ │ │ └── index.zh-CN.md │ │ ├── GlobalFooter │ │ │ ├── demo │ │ │ │ └── basic.md │ │ │ ├── index.d.ts │ │ │ ├── index.js │ │ │ ├── index.less │ │ │ └── index.md │ │ ├── GlobalHeader │ │ │ ├── RightContent.js │ │ │ ├── index.js │ │ │ └── index.less │ │ ├── HeaderDropdown │ │ │ ├── index.d.ts │ │ │ ├── index.js │ │ │ └── index.less │ │ ├── HeaderSearch │ │ │ ├── demo │ │ │ │ └── basic.md │ │ │ ├── index.d.ts │ │ │ ├── index.en-US.md │ │ │ ├── index.js │ │ │ ├── index.less │ │ │ └── index.zh-CN.md │ │ ├── IconFont │ │ │ └── index.js │ │ ├── Login │ │ │ ├── LoginItem.d.ts │ │ │ ├── LoginItem.js │ │ │ ├── LoginSubmit.js │ │ │ ├── LoginTab.d.ts │ │ │ ├── LoginTab.js │ │ │ ├── demo │ │ │ │ └── basic.md │ │ │ ├── index.d.ts │ │ │ ├── index.en-US.md │ │ │ ├── index.js │ │ │ ├── index.less │ │ │ ├── index.zh-CN.md │ │ │ ├── loginContext.js │ │ │ └── map.js │ │ ├── NoticeIcon │ │ │ ├── NoticeIconTab.d.ts │ │ │ ├── NoticeList.js │ │ │ ├── NoticeList.less │ │ │ ├── demo │ │ │ │ ├── basic.md │ │ │ │ └── popover.md │ │ │ ├── index.d.ts │ │ │ ├── index.en-US.md │ │ │ ├── index.js │ │ │ ├── index.less │ │ │ └── index.zh-CN.md │ │ ├── NumberInfo │ │ │ ├── demo │ │ │ │ └── basic.md │ │ │ ├── index.d.ts │ │ │ ├── index.en-US.md │ │ │ ├── index.js │ │ │ ├── index.less │ │ │ └── index.zh-CN.md │ │ ├── PageHeader │ │ │ ├── breadcrumb.d.ts │ │ │ ├── breadcrumb.js │ │ │ ├── demo │ │ │ │ ├── image.md │ │ │ │ ├── simple.md │ │ │ │ ├── standard.md │ │ │ │ └── structure.md │ │ │ ├── index.d.ts │ │ │ ├── index.js │ │ │ ├── index.less │ │ │ ├── index.md │ │ │ └── index.test.js │ │ ├── PageHeaderWrapper │ │ │ ├── GridContent.js │ │ │ ├── GridContent.less │ │ │ ├── index.js │ │ │ └── index.less │ │ ├── PageLoading │ │ │ └── index.js │ │ ├── Result │ │ │ ├── demo │ │ │ │ ├── classic.md │ │ │ │ ├── error.md │ │ │ │ └── structure.md │ │ │ ├── index.d.ts │ │ │ ├── index.js │ │ │ ├── index.less │ │ │ └── index.md │ │ ├── SelectLang │ │ │ ├── index.js │ │ │ └── index.less │ │ ├── SettingDrawer │ │ │ ├── BlockCheckbox.js │ │ │ ├── ThemeColor.js │ │ │ ├── ThemeColor.less │ │ │ ├── index.js │ │ │ └── index.less │ │ ├── SiderMenu │ │ │ ├── BaseMenu.js │ │ │ ├── SiderMenu.js │ │ │ ├── SiderMenu.test.js │ │ │ ├── SiderMenuUtils.js │ │ │ ├── index.js │ │ │ └── index.less │ │ ├── StandardFormRow │ │ │ ├── index.js │ │ │ └── index.less │ │ ├── StandardTable │ │ │ ├── index.js │ │ │ └── index.less │ │ ├── TagSelect │ │ │ ├── TagSelectOption.d.ts │ │ │ ├── demo │ │ │ │ ├── controlled.md │ │ │ │ ├── expandable.md │ │ │ │ └── simple.md │ │ │ ├── index.d.ts │ │ │ ├── index.js │ │ │ ├── index.less │ │ │ └── index.md │ │ ├── TopNavHeader │ │ │ ├── index.js │ │ │ └── index.less │ │ ├── Trend │ │ │ ├── demo │ │ │ │ ├── basic.md │ │ │ │ └── reverse.md │ │ │ ├── index.d.ts │ │ │ ├── index.js │ │ │ ├── index.less │ │ │ └── index.md │ │ └── _utils │ │ │ ├── pathTools.js │ │ │ └── pathTools.test.js │ ├── defaultSettings.js │ ├── e2e │ │ ├── baseLayout.e2e.js │ │ ├── home.e2e.js │ │ ├── login.e2e.js │ │ ├── topMenu.e2e.js │ │ └── userLayout.e2e.js │ ├── global.js │ ├── global.less │ ├── layouts │ │ ├── BasicLayout.js │ │ ├── BasicLayout.less │ │ ├── BlankLayout.js │ │ ├── Footer.js │ │ ├── Header.js │ │ ├── Header.less │ │ ├── MenuContext.js │ │ ├── UserLayout.js │ │ └── UserLayout.less │ ├── locales │ │ ├── en-US.js │ │ ├── en-US │ │ │ ├── analysis.js │ │ │ ├── component.js │ │ │ ├── exception.js │ │ │ ├── form.js │ │ │ ├── globalHeader.js │ │ │ ├── login.js │ │ │ ├── menu.js │ │ │ ├── monitor.js │ │ │ ├── pwa.js │ │ │ ├── result.js │ │ │ ├── settingDrawer.js │ │ │ └── settings.js │ │ ├── pt-BR.js │ │ ├── pt-BR │ │ │ ├── analysis.js │ │ │ ├── component.js │ │ │ ├── exception.js │ │ │ ├── form.js │ │ │ ├── globalHeader.js │ │ │ ├── login.js │ │ │ ├── menu.js │ │ │ ├── monitor.js │ │ │ ├── pwa.js │ │ │ ├── result.js │ │ │ ├── settingDrawer.js │ │ │ └── settings.js │ │ ├── zh-CN.js │ │ ├── zh-CN │ │ │ ├── analysis.js │ │ │ ├── component.js │ │ │ ├── exception.js │ │ │ ├── form.js │ │ │ ├── globalHeader.js │ │ │ ├── login.js │ │ │ ├── menu.js │ │ │ ├── monitor.js │ │ │ ├── pwa.js │ │ │ ├── result.js │ │ │ ├── settingDrawer.js │ │ │ └── settings.js │ │ ├── zh-TW.js │ │ └── zh-TW │ │ │ ├── analysis.js │ │ │ ├── component.js │ │ │ ├── exception.js │ │ │ ├── form.js │ │ │ ├── globalHeader.js │ │ │ ├── login.js │ │ │ ├── menu.js │ │ │ ├── monitor.js │ │ │ ├── pwa.js │ │ │ ├── result.js │ │ │ ├── settingDrawer.js │ │ │ └── settings.js │ ├── manifest.json │ ├── models │ │ ├── global.js │ │ ├── link.js │ │ ├── list.js │ │ ├── login.js │ │ ├── menu.js │ │ ├── pages.js │ │ ├── pagination.js │ │ ├── permission.js │ │ ├── project.js │ │ ├── scrapyd.js │ │ ├── setting.js │ │ └── user.js │ ├── pages │ │ ├── 404.js │ │ ├── Account │ │ │ ├── Center │ │ │ │ ├── Applications.js │ │ │ │ ├── Articles.js │ │ │ │ ├── Articles.less │ │ │ │ ├── Center.js │ │ │ │ ├── Center.less │ │ │ │ └── Projects.js │ │ │ └── Settings │ │ │ │ ├── BaseView.js │ │ │ │ ├── BaseView.less │ │ │ │ ├── BindingView.js │ │ │ │ ├── GeographicView.js │ │ │ │ ├── GeographicView.less │ │ │ │ ├── Info.js │ │ │ │ ├── Info.less │ │ │ │ ├── NotificationView.js │ │ │ │ ├── PhoneView.js │ │ │ │ ├── PhoneView.less │ │ │ │ ├── SecurityView.js │ │ │ │ └── models │ │ │ │ └── geographic.js │ │ ├── Authorized.js │ │ ├── Dashboard │ │ │ ├── Analysis.js │ │ │ ├── Analysis.less │ │ │ ├── IntroduceRow.js │ │ │ ├── Monitor.js │ │ │ ├── Monitor.less │ │ │ ├── OfflineData.js │ │ │ ├── ProportionSales.js │ │ │ ├── SalesCard.js │ │ │ ├── TopSearch.js │ │ │ ├── Workplace.js │ │ │ ├── Workplace.less │ │ │ └── models │ │ │ │ ├── activities.js │ │ │ │ ├── chart.js │ │ │ │ └── monitor.js │ │ ├── Demo │ │ │ ├── Demo.js │ │ │ └── demoSchema.json │ │ ├── Exception │ │ │ ├── 403.js │ │ │ ├── 404.js │ │ │ ├── 500.js │ │ │ ├── TriggerException.js │ │ │ ├── models │ │ │ │ └── error.js │ │ │ └── style.less │ │ ├── Forms │ │ │ ├── AdvancedForm.js │ │ │ ├── BasicForm.js │ │ │ ├── StepForm │ │ │ │ ├── Step1.js │ │ │ │ ├── Step2.js │ │ │ │ ├── Step3.js │ │ │ │ ├── index.js │ │ │ │ └── style.less │ │ │ ├── TableForm.js │ │ │ ├── models │ │ │ │ └── form.js │ │ │ └── style.less │ │ ├── Goods │ │ │ ├── BrandTableList.js │ │ │ ├── BrandTableList.less │ │ │ ├── CategoryTableList.js │ │ │ ├── CategoryTableList.less │ │ │ ├── Forms │ │ │ │ └── GoodsSaveForm.js │ │ │ ├── GoodsTableList.js │ │ │ ├── GoodsTableList.less │ │ │ └── models │ │ │ │ └── goods.js │ │ ├── Link │ │ │ ├── LinkTableList.js │ │ │ └── LinkTableList.less │ │ ├── List │ │ │ ├── Applications.js │ │ │ ├── Applications.less │ │ │ ├── Articles.js │ │ │ ├── Articles.less │ │ │ ├── BasicList.js │ │ │ ├── BasicList.less │ │ │ ├── CardList.js │ │ │ ├── CardList.less │ │ │ ├── List.js │ │ │ ├── Projects.js │ │ │ ├── Projects.less │ │ │ ├── TableList.js │ │ │ ├── TableList.less │ │ │ └── models │ │ │ │ └── rule.js │ │ ├── Member │ │ │ ├── UserTableList.js │ │ │ └── UserTableList.less │ │ ├── Order │ │ │ ├── OrderTableList.js │ │ │ └── OrderTableList.less │ │ ├── Permission │ │ │ ├── ManagerTableList.js │ │ │ ├── ManagerTableList.less │ │ │ ├── PermissionTableList.js │ │ │ ├── PermissionTableList.less │ │ │ ├── RoleTableList.js │ │ │ └── RoleTableList.less │ │ ├── Profile │ │ │ ├── AdvancedProfile.js │ │ │ ├── AdvancedProfile.less │ │ │ ├── BasicProfile.js │ │ │ ├── BasicProfile.less │ │ │ └── models │ │ │ │ └── profile.js │ │ ├── Recommend │ │ │ ├── TableList.js │ │ │ └── TableList.less │ │ ├── Result │ │ │ ├── Error.js │ │ │ ├── Success.js │ │ │ └── Success.test.js │ │ ├── Scrapyd │ │ │ ├── JobTableList.js │ │ │ ├── JobTableList.less │ │ │ ├── ProjectTableList.js │ │ │ ├── ProjectTableList.less │ │ │ ├── SpiderTableList.js │ │ │ └── SpiderTableList.less │ │ ├── Shop │ │ │ ├── TableList.js │ │ │ └── TableList.less │ │ ├── Spike │ │ │ ├── TableList.js │ │ │ └── TableList.less │ │ ├── Theme │ │ │ ├── TableList.js │ │ │ └── TableList.less │ │ ├── User │ │ │ ├── Login.js │ │ │ ├── Login.less │ │ │ ├── Register.js │ │ │ ├── Register.less │ │ │ ├── RegisterResult.js │ │ │ ├── RegisterResult.less │ │ │ └── models │ │ │ │ └── register.js │ │ ├── VipCard │ │ │ ├── CouponTableList.js │ │ │ ├── CouponTableList.less │ │ │ ├── InterestTableList.js │ │ │ ├── InterestTableList.less │ │ │ ├── TableList.js │ │ │ └── TableList.less │ │ └── document.ejs │ ├── service-worker.js │ ├── services │ │ ├── api.js │ │ ├── error.js │ │ ├── geographic.js │ │ ├── link.js │ │ └── user.js │ └── utils │ │ ├── Authorized.js │ │ ├── Yuan.js │ │ ├── action.js │ │ ├── authority.js │ │ ├── authority.test.js │ │ ├── getPageTitle.js │ │ ├── request.js │ │ ├── utils.js │ │ ├── utils.less │ │ └── utils.test.js ├── tests │ └── run-tests.js ├── tsconfig.json └── tslint.json ├── readmeImg ├── category.jpg ├── index.jpg ├── system.png └── trade.png ├── release └── docker-compose.yml ├── rxjava-api-core ├── .eslintignore ├── .eslintrc ├── .gitignore ├── babel.config.js ├── lib │ ├── AbstractApi.js │ ├── HttpUtils.js │ ├── Request.js │ └── index.js ├── package.json ├── src │ ├── AbstractApi.d.ts │ ├── AbstractApi.js │ ├── HttpUtils.d.ts │ ├── HttpUtils.js │ ├── Request.d.ts │ ├── Request.js │ ├── index.d.ts │ └── index.js └── yarn.lock └── services ├── README.md └── rxjava-service-goods ├── .gitignore ├── README.md ├── build.sh ├── k8s └── rxjava-service-goods.yaml ├── pom.xml └── src ├── assembly ├── bin.xml └── config │ └── release │ ├── Dockerfile │ ├── bootstrap.yml │ └── startup.sh └── main ├── java └── org │ └── rxjava │ └── service │ └── goods │ ├── RxServiceGoodsApplication.java │ ├── RxServiceGoodsMain.java │ ├── admin │ ├── AdminBrandController.java │ ├── AdminCategoryController.java │ └── AdminGoodsController.java │ ├── bus │ └── GoodsBusReceiver.java │ ├── config │ └── GoodsProperties.java │ ├── entity │ ├── Brand.java │ ├── CarouselImg.java │ ├── Category.java │ ├── Content.java │ ├── Goods.java │ ├── Shop.java │ └── Sku.java │ ├── form │ ├── BrandListForm.java │ ├── BrandPageForm.java │ ├── CategoryListForm.java │ ├── CategoryPageForm.java │ ├── GoodsCreateForm.java │ ├── GoodsListForm.java │ ├── GoodsPageForm.java │ ├── ShopListForm.java │ └── SkuListForm.java │ ├── model │ ├── BrandModel.java │ ├── CategoryModel.java │ ├── GoodsDetailModel.java │ ├── GoodsModel.java │ ├── SkuAndGroupModel.java │ └── SkuModel.java │ ├── person │ ├── BrandController.java │ ├── CategoryController.java │ └── GoodsController.java │ ├── repository │ ├── BrandRepository.java │ ├── CategoryRepository.java │ ├── GoodsRepository.java │ ├── ShopRepository.java │ └── SkuRepository.java │ ├── services │ ├── BrandService.java │ ├── CategoryService.java │ └── GoodsService.java │ ├── status │ ├── CategoryStatus.java │ └── GoodsStatus.java │ └── type │ ├── ContentType.java │ ├── ExcessType.java │ ├── GoodsType.java │ ├── ResourceType.java │ └── SexType.java └── resources ├── application.yml └── bootstrap.yml /.gitlab-ci.yml: -------------------------------------------------------------------------------- 1 | stages: 2 | - build 3 | 4 | dev_build: 5 | image: node:latest 6 | tags: 7 | - docker 8 | stage: build 9 | script: 10 | - pwd -------------------------------------------------------------------------------- /client/.editorconfig: -------------------------------------------------------------------------------- 1 | # http://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | indent_style = space 6 | indent_size = 2 7 | charset = utf-8 8 | trim_trailing_whitespace = true 9 | insert_final_newline = true 10 | 11 | [*.md] 12 | trim_trailing_whitespace = false 13 | -------------------------------------------------------------------------------- /client/.gitignore: -------------------------------------------------------------------------------- 1 | dist/ 2 | .temp/ 3 | .rn_temp/ 4 | node_modules/ 5 | .DS_Store 6 | -------------------------------------------------------------------------------- /client/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM nginx:mainline 2 | 3 | RUN echo "Asia/Shanghai" > /etc/timezone 4 | RUN dpkg-reconfigure -f noninteractive tzdata 5 | 6 | COPY dist /usr/share/nginx/html 7 | COPY docker/nginx.conf /etc/nginx/nginx.conf 8 | 9 | #RUN apt update 10 | #RUN apt install wget -y 11 | -------------------------------------------------------------------------------- /client/README.md: -------------------------------------------------------------------------------- 1 | ####鉴于后端微服务模块化后需要过多服务器资源,所有api请求均为mock.json静态数据 2 | -------------------------------------------------------------------------------- /client/build.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | yarn build:h5 3 | 4 | docker build . -t registry.cn-shanghai.aliyuncs.com/taro-mall/client 5 | docker push registry.cn-shanghai.aliyuncs.com/taro-mall/client 6 | -------------------------------------------------------------------------------- /client/config/dev.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | env: { 3 | NODE_ENV: '"development"', 4 | }, 5 | defineConstants: {}, 6 | weapp: {}, 7 | h5: { 8 | devServer: { 9 | host: '0.0.0.0', 10 | port: 10086, 11 | proxy: { 12 | '/api': { 13 | target: 'http://0.0.0.0:8080', 14 | pathRewrite: {'^/api': '/'}, 15 | secure: false, 16 | }, 17 | }, 18 | }, 19 | }, 20 | }; 21 | -------------------------------------------------------------------------------- /client/config/prod.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | env: { 3 | NODE_ENV: '"production"', 4 | }, 5 | defineConstants: {}, 6 | weapp: {}, 7 | h5: { 8 | devServer: { 9 | host: '0.0.0.0', 10 | port: 10086, 11 | proxy: { 12 | '/api': { 13 | target: 'http://0.0.0.0:8080', 14 | pathRewrite: { '^/api': '/' }, 15 | secure: false, 16 | }, 17 | }, 18 | }, 19 | }, 20 | }; 21 | -------------------------------------------------------------------------------- /client/config/webstorm.config.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | const path = require('path'); 3 | 4 | module.exports = { 5 | context: path.resolve(__dirname, './'), 6 | resolve: { 7 | extensions: ['.js', '.vue', '.json','.ts'], 8 | alias: { 9 | '@/assets': path.resolve(__dirname, '..', 'src/assets'), 10 | '@/components': path.resolve(__dirname, '..', 'src/components'), 11 | '@/containers': path.resolve(__dirname, '..', 'src/containers'), 12 | '@/utils': path.resolve(__dirname, '..', 'src/utils'), 13 | '@/mock': path.resolve(__dirname, '..', 'src/mock'), 14 | '@/package': path.resolve(__dirname, '..', 'package.json'), 15 | '@/project': path.resolve(__dirname, '..', 'project.config.json'), 16 | }, 17 | }, 18 | }; 19 | -------------------------------------------------------------------------------- /client/project.config.json: -------------------------------------------------------------------------------- 1 | { 2 | "miniprogramRoot": "dist/", 3 | "projectname": "client", 4 | "description": "客户端", 5 | "appid": "wx9966d711576d2639", 6 | "setting": { 7 | "urlCheck": true, 8 | "es6": false, 9 | "postcss": false, 10 | "minified": false 11 | }, 12 | "compileType": "miniprogram" 13 | } 14 | -------------------------------------------------------------------------------- /client/src/Config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | urlPrefix: 'http://0.0.0.0:10086/api/', 3 | token: '', 4 | }; 5 | -------------------------------------------------------------------------------- /client/src/Context.js: -------------------------------------------------------------------------------- 1 | import { HttpUtils } from 'rxjava-api-core'; 2 | import RequestImpl from './utils/RequestImpl'; 3 | 4 | export default { 5 | init() { 6 | HttpUtils.setFactory(() => new RequestImpl()); 7 | }, 8 | setStore(store) { 9 | this.store = store; 10 | }, 11 | }; 12 | -------------------------------------------------------------------------------- /client/src/app.scss: -------------------------------------------------------------------------------- 1 | html, body { 2 | font-family: PingFang SC, Helvetica Neue, Hiragino Sans GB, Helvetica, Microsoft YaHei, Arial, serif; 3 | font-size: 20px; 4 | } 5 | 6 | //删除按钮外部样式 7 | button{ 8 | outline-width: 0 !important; 9 | } 10 | 11 | .taro_page{ 12 | height: 100%; 13 | } 14 | -------------------------------------------------------------------------------- /client/src/assets/banner/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apersonw/taro-mall/f72bb26a86e32a0c6da5a83911cddd1549f43ec4/client/src/assets/banner/1.jpg -------------------------------------------------------------------------------- /client/src/assets/banner/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apersonw/taro-mall/f72bb26a86e32a0c6da5a83911cddd1549f43ec4/client/src/assets/banner/2.jpg -------------------------------------------------------------------------------- /client/src/assets/banner/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apersonw/taro-mall/f72bb26a86e32a0c6da5a83911cddd1549f43ec4/client/src/assets/banner/3.jpg -------------------------------------------------------------------------------- /client/src/assets/banner/4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apersonw/taro-mall/f72bb26a86e32a0c6da5a83911cddd1549f43ec4/client/src/assets/banner/4.jpg -------------------------------------------------------------------------------- /client/src/assets/banner/5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apersonw/taro-mall/f72bb26a86e32a0c6da5a83911cddd1549f43ec4/client/src/assets/banner/5.jpg -------------------------------------------------------------------------------- /client/src/assets/banner/6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apersonw/taro-mall/f72bb26a86e32a0c6da5a83911cddd1549f43ec4/client/src/assets/banner/6.jpg -------------------------------------------------------------------------------- /client/src/assets/banner/7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apersonw/taro-mall/f72bb26a86e32a0c6da5a83911cddd1549f43ec4/client/src/assets/banner/7.jpg -------------------------------------------------------------------------------- /client/src/assets/index/category/all@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apersonw/taro-mall/f72bb26a86e32a0c6da5a83911cddd1549f43ec4/client/src/assets/index/category/all@2x.png -------------------------------------------------------------------------------- /client/src/assets/index/category/buy@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apersonw/taro-mall/f72bb26a86e32a0c6da5a83911cddd1549f43ec4/client/src/assets/index/category/buy@2x.png -------------------------------------------------------------------------------- /client/src/assets/index/category/clothes@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apersonw/taro-mall/f72bb26a86e32a0c6da5a83911cddd1549f43ec4/client/src/assets/index/category/clothes@2x.png -------------------------------------------------------------------------------- /client/src/assets/index/category/coupon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apersonw/taro-mall/f72bb26a86e32a0c6da5a83911cddd1549f43ec4/client/src/assets/index/category/coupon@2x.png -------------------------------------------------------------------------------- /client/src/assets/index/category/fresh@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apersonw/taro-mall/f72bb26a86e32a0c6da5a83911cddd1549f43ec4/client/src/assets/index/category/fresh@2x.png -------------------------------------------------------------------------------- /client/src/assets/index/category/money@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apersonw/taro-mall/f72bb26a86e32a0c6da5a83911cddd1549f43ec4/client/src/assets/index/category/money@2x.png -------------------------------------------------------------------------------- /client/src/assets/index/category/recharge@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apersonw/taro-mall/f72bb26a86e32a0c6da5a83911cddd1549f43ec4/client/src/assets/index/category/recharge@2x.png -------------------------------------------------------------------------------- /client/src/assets/index/category/shop@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apersonw/taro-mall/f72bb26a86e32a0c6da5a83911cddd1549f43ec4/client/src/assets/index/category/shop@2x.png -------------------------------------------------------------------------------- /client/src/assets/index/category/time@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apersonw/taro-mall/f72bb26a86e32a0c6da5a83911cddd1549f43ec4/client/src/assets/index/category/time@2x.png -------------------------------------------------------------------------------- /client/src/assets/index/category/world@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apersonw/taro-mall/f72bb26a86e32a0c6da5a83911cddd1549f43ec4/client/src/assets/index/category/world@2x.png -------------------------------------------------------------------------------- /client/src/assets/index/category@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apersonw/taro-mall/f72bb26a86e32a0c6da5a83911cddd1549f43ec4/client/src/assets/index/category@2x.png -------------------------------------------------------------------------------- /client/src/assets/index/courtyard/title@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apersonw/taro-mall/f72bb26a86e32a0c6da5a83911cddd1549f43ec4/client/src/assets/index/courtyard/title@2x.png -------------------------------------------------------------------------------- /client/src/assets/index/everyday/title@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apersonw/taro-mall/f72bb26a86e32a0c6da5a83911cddd1549f43ec4/client/src/assets/index/everyday/title@2x.png -------------------------------------------------------------------------------- /client/src/assets/index/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apersonw/taro-mall/f72bb26a86e32a0c6da5a83911cddd1549f43ec4/client/src/assets/index/icon.png -------------------------------------------------------------------------------- /client/src/assets/index/newuser/channel@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apersonw/taro-mall/f72bb26a86e32a0c6da5a83911cddd1549f43ec4/client/src/assets/index/newuser/channel@2x.png -------------------------------------------------------------------------------- /client/src/assets/index/newuser/exclusive@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apersonw/taro-mall/f72bb26a86e32a0c6da5a83911cddd1549f43ec4/client/src/assets/index/newuser/exclusive@2x.png -------------------------------------------------------------------------------- /client/src/assets/index/newuser/package@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apersonw/taro-mall/f72bb26a86e32a0c6da5a83911cddd1549f43ec4/client/src/assets/index/newuser/package@2x.png -------------------------------------------------------------------------------- /client/src/assets/index/searchIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apersonw/taro-mall/f72bb26a86e32a0c6da5a83911cddd1549f43ec4/client/src/assets/index/searchIcon.png -------------------------------------------------------------------------------- /client/src/assets/index/spike/goods-1@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apersonw/taro-mall/f72bb26a86e32a0c6da5a83911cddd1549f43ec4/client/src/assets/index/spike/goods-1@2x.png -------------------------------------------------------------------------------- /client/src/assets/index/spike/more@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apersonw/taro-mall/f72bb26a86e32a0c6da5a83911cddd1549f43ec4/client/src/assets/index/spike/more@2x.png -------------------------------------------------------------------------------- /client/src/assets/index/up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apersonw/taro-mall/f72bb26a86e32a0c6da5a83911cddd1549f43ec4/client/src/assets/index/up.png -------------------------------------------------------------------------------- /client/src/assets/index/vLine.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apersonw/taro-mall/f72bb26a86e32a0c6da5a83911cddd1549f43ec4/client/src/assets/index/vLine.png -------------------------------------------------------------------------------- /client/src/assets/tabbar/category@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apersonw/taro-mall/f72bb26a86e32a0c6da5a83911cddd1549f43ec4/client/src/assets/tabbar/category@2x.png -------------------------------------------------------------------------------- /client/src/assets/tabbar/categoryUn@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apersonw/taro-mall/f72bb26a86e32a0c6da5a83911cddd1549f43ec4/client/src/assets/tabbar/categoryUn@2x.png -------------------------------------------------------------------------------- /client/src/assets/tabbar/index@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apersonw/taro-mall/f72bb26a86e32a0c6da5a83911cddd1549f43ec4/client/src/assets/tabbar/index@2x.png -------------------------------------------------------------------------------- /client/src/assets/tabbar/indexUn@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apersonw/taro-mall/f72bb26a86e32a0c6da5a83911cddd1549f43ec4/client/src/assets/tabbar/indexUn@2x.png -------------------------------------------------------------------------------- /client/src/assets/tabbar/mine@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apersonw/taro-mall/f72bb26a86e32a0c6da5a83911cddd1549f43ec4/client/src/assets/tabbar/mine@2x.png -------------------------------------------------------------------------------- /client/src/assets/tabbar/mineUn@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apersonw/taro-mall/f72bb26a86e32a0c6da5a83911cddd1549f43ec4/client/src/assets/tabbar/mineUn@2x.png -------------------------------------------------------------------------------- /client/src/assets/tabbar/shopcart@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apersonw/taro-mall/f72bb26a86e32a0c6da5a83911cddd1549f43ec4/client/src/assets/tabbar/shopcart@2x.png -------------------------------------------------------------------------------- /client/src/assets/tabbar/shopcartUn@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apersonw/taro-mall/f72bb26a86e32a0c6da5a83911cddd1549f43ec4/client/src/assets/tabbar/shopcartUn@2x.png -------------------------------------------------------------------------------- /client/src/assets/token/login/forgetPasswordLeft.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apersonw/taro-mall/f72bb26a86e32a0c6da5a83911cddd1549f43ec4/client/src/assets/token/login/forgetPasswordLeft.png -------------------------------------------------------------------------------- /client/src/assets/token/login/qq.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apersonw/taro-mall/f72bb26a86e32a0c6da5a83911cddd1549f43ec4/client/src/assets/token/login/qq.png -------------------------------------------------------------------------------- /client/src/assets/token/login/weixin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apersonw/taro-mall/f72bb26a86e32a0c6da5a83911cddd1549f43ec4/client/src/assets/token/login/weixin.png -------------------------------------------------------------------------------- /client/src/components/BannerSwiper.module.scss: -------------------------------------------------------------------------------- 1 | .swiper { 2 | width: 750px; 3 | height: 366px; 4 | display: flex; 5 | 6 | .swiperImg { 7 | width: 100%; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /client/src/components/Category.js: -------------------------------------------------------------------------------- 1 | import Taro, { Component } from '@tarojs/taro'; 2 | import { View } from '@tarojs/components'; 3 | import styles from './Category.module.scss'; 4 | import CustomImage from './CustomImage'; 5 | 6 | class Category extends Component { 7 | render() { 8 | const { items = [] } = this.props; 9 | return ( 10 | 11 | {items.map((item, index) => ( 12 | 13 | 14 | {item.text} 15 | 16 | ))} 17 | 18 | ); 19 | } 20 | } 21 | 22 | export default Category; 23 | -------------------------------------------------------------------------------- /client/src/components/Category.module.scss: -------------------------------------------------------------------------------- 1 | .categoryBox { 2 | display: flex; 3 | flex-direction: row; 4 | justify-content: space-evenly; 5 | align-items: center; 6 | flex-wrap: wrap; 7 | 8 | .categoryItem { 9 | display: flex; 10 | flex-direction: column; 11 | justify-content: center; 12 | align-items: center; 13 | width: 20%; 14 | margin-top: 30px; 15 | 16 | font-family: PingFangSC-Regular, serif; 17 | font-size: 24px; 18 | color: #666666; 19 | 20 | .categoryItemText { 21 | margin-top: 18px; 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /client/src/components/CustomImage.js: -------------------------------------------------------------------------------- 1 | import Taro, { Component } from '@tarojs/taro'; 2 | import { Image } from '@tarojs/components'; 3 | 4 | class CustomImage extends Component { 5 | render() { 6 | let { src, width = 0, height = 0, className, mode = 'scaleToFill', onClick, style } = this.props; 7 | width = width && Taro.pxTransform(width); 8 | height = height && Taro.pxTransform(height); 9 | 10 | if (style == null || typeof style === 'undefined') { 11 | style = ''; 12 | } 13 | return ( 14 | 21 | ); 22 | } 23 | } 24 | 25 | export default CustomImage; 26 | -------------------------------------------------------------------------------- /client/src/components/TabBar.module.scss: -------------------------------------------------------------------------------- 1 | .toolBar { //底部工具条,也即tabBar 2 | box-sizing: border-box; 3 | display: flex; 4 | position: fixed; 5 | left: 0; 6 | bottom: 0; 7 | width: 100%; 8 | height: 90px; 9 | z-index: 1001; 10 | background: #FFFFFF; 11 | border-top: 1px solid #e7e7e7; 12 | border-bottom: 1px solid #f8f8f8; 13 | align-items: center; 14 | overflow: hidden; 15 | } 16 | 17 | .tabBar { 18 | justify-content: space-around; 19 | padding: 10px 0; 20 | 21 | .tabBarImgBox { 22 | background: transparent; 23 | //点击透明效果 24 | &:active{ 25 | opacity: 0.7; 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /client/src/components/expo/OneGrid.module.scss: -------------------------------------------------------------------------------- 1 | .oneGrid { 2 | display: flex; 3 | flex-direction: column; 4 | justify-content: center; 5 | width: 187px; 6 | height: 240px; 7 | 8 | .imgBox { 9 | display: flex; 10 | flex-direction: row; 11 | justify-content: space-around; 12 | } 13 | 14 | .titleBox { 15 | display: flex; 16 | flex-direction: column; 17 | align-items: center; 18 | .title { 19 | font-family: PingFangSC-Regular, serif; 20 | font-size: 32px; 21 | color: #010101; 22 | } 23 | 24 | .subTitle { 25 | font-family: PingFangSC-Regular, serif; 26 | font-size: 24px; 27 | color: #728DFC; 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /client/src/mock/category/menu.json: -------------------------------------------------------------------------------- 1 | [ 2 | "热门推荐", 3 | "手机数码", 4 | "家用电器", 5 | "电脑办公", 6 | "计生情趣", 7 | "美妆护肤", 8 | "个护清洁", 9 | "汽车生活", 10 | "京东超市", 11 | "京东超市", 12 | "京东超市", 13 | "京东超市", 14 | "京东超市", 15 | "京东超市", 16 | "京东超市" 17 | ] 18 | -------------------------------------------------------------------------------- /client/src/mock/goods.json: -------------------------------------------------------------------------------- 1 | { 2 | "_id": "5c9f1ccf56ab24499dedc2b3", 3 | "name": "OPPO K1 光感屏幕指纹 水滴屏拍照 6G+64G 梵星蓝 全网通 移动联通电信4G 双卡双待", 4 | "coverPrice": 159900, 5 | "thumb": { 6 | "url": "https://img13.360buyimg.com/n7/jfs/t27112/273/1423275096/265013/d92b3181/5be3cb5bN334c8048.jpg", 7 | "width": 220, 8 | "height": 220 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /client/src/mock/index/banner.js: -------------------------------------------------------------------------------- 1 | import banner1 from '@/assets/banner/1.jpg'; 2 | import banner2 from '@/assets/banner/2.jpg'; 3 | import banner3 from '@/assets/banner/3.jpg'; 4 | import banner4 from '@/assets/banner/4.jpg'; 5 | import banner5 from '@/assets/banner/5.jpg'; 6 | import banner6 from '@/assets/banner/6.jpg'; 7 | import banner7 from '@/assets/banner/7.jpg'; 8 | 9 | export default [ 10 | banner1, banner2, banner3, banner4, banner5, banner6, banner7, 11 | ]; 12 | -------------------------------------------------------------------------------- /client/src/models/index.js: -------------------------------------------------------------------------------- 1 | import net from "./net"; 2 | import user from "./user"; 3 | import goods from "./goods"; 4 | 5 | export default [ 6 | net, 7 | user, 8 | goods 9 | ]; 10 | -------------------------------------------------------------------------------- /client/src/models/net.js: -------------------------------------------------------------------------------- 1 | import Taro from '@tarojs/taro'; 2 | 3 | function toast(msg) { 4 | Taro.showToast({ 5 | icon: 'none', 6 | title: msg, 7 | }); 8 | } 9 | 10 | export default { 11 | namespace: 'net', 12 | state: {}, 13 | effects: { 14 | * error({payload: e}, {call,}) { 15 | if (e.message === '401') { 16 | yield call(Taro.redirectTo, {url: '/pages/token/login'}); 17 | } else { 18 | //解析传递过来的错误数据信息 19 | toast('服务器错误'); 20 | } 21 | }, 22 | }, 23 | reducers: { 24 | save(state, {payload}) { 25 | return {...state, ...payload}; 26 | }, 27 | }, 28 | }; 29 | -------------------------------------------------------------------------------- /client/src/models/user.js: -------------------------------------------------------------------------------- 1 | import UserApi from 'rxjava-apis-user-client/UserApi'; 2 | import Taro from '@tarojs/taro'; 3 | import Config from '../Config'; 4 | 5 | export default { 6 | namespace: 'user', 7 | state: {}, 8 | effects: { 9 | * fetch(_, {call}) { 10 | yield call(UserApi.getCurrentUser); 11 | }, 12 | * loginByPhoneSms({payload: {phone, sms}}, {call}) { 13 | const data = yield call(UserApi.loginByPhoneSms, {phone, sms}); 14 | Config.token = data; 15 | Taro.setStorageSync('token', data); 16 | yield call(Taro.navigateTo, {url: '/pages/index/index'}); 17 | }, 18 | }, 19 | reducers: { 20 | save(state, {payload}) { 21 | return {...state, ...payload}; 22 | }, 23 | }, 24 | }; 25 | -------------------------------------------------------------------------------- /client/src/pages/account/index.js: -------------------------------------------------------------------------------- 1 | import Taro, { Component } from '@tarojs/taro'; 2 | import { View } from '@tarojs/components'; 3 | import { connect } from '@tarojs/redux'; 4 | import TabBar from '../../components/TabBar'; 5 | 6 | @connect(() => ({})) 7 | class Index extends Component { 8 | 9 | config = { 10 | navigationBarTitleText: '我的', 11 | }; 12 | 13 | render() { 14 | return ( 15 | 16 | 我的页面 17 | 18 | 19 | ); 20 | } 21 | } 22 | 23 | export default Index; 24 | -------------------------------------------------------------------------------- /client/src/pages/category/index.module.css: -------------------------------------------------------------------------------- 1 | .container { 2 | display: flex; 3 | flex-direction: row; 4 | overflow-y: hidden; } 5 | 6 | .firstCategory { 7 | width: 174px; 8 | background-color: #F8F8F8; 9 | height: calc(100vh - 90px); 10 | padding-bottom: 90px; 11 | overflow: hidden; } 12 | .firstCategory .categoryBox { 13 | height: 94px; 14 | line-height: 94px; 15 | text-align: center; 16 | overflow-y: hidden; 17 | font-size: 26px; } 18 | 19 | /*# sourceMappingURL=index.module.css.map */ 20 | -------------------------------------------------------------------------------- /client/src/pages/category/index.module.css.map: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "mappings": "AAAA,UAAW;EACT,OAAO,EAAE,IAAI;EACb,cAAc,EAAE,GAAG;EACnB,UAAU,EAAE,MAAM;;AAGpB,cAAe;EACb,KAAK,EAAE,KAAK;EACZ,gBAAgB,EAAE,OAAO;EACzB,MAAM,EAAE,kBAAkB;EAC1B,cAAc,EAAE,IAAI;EACpB,QAAQ,EAAE,MAAM;EAEhB,2BAAa;IACX,MAAM,EAAE,IAAI;IACZ,WAAW,EAAE,IAAI;IACjB,UAAU,EAAE,MAAM;IAClB,UAAU,EAAE,MAAM;IAClB,SAAS,EAAE,IAAI", 4 | "sources": ["index.module.scss"], 5 | "names": [], 6 | "file": "index.module.css" 7 | } 8 | -------------------------------------------------------------------------------- /client/src/pages/category/index.module.scss: -------------------------------------------------------------------------------- 1 | .container { 2 | display: flex; 3 | flex-direction: row; 4 | overflow-y: hidden; 5 | min-height: 100%; 6 | height: 100%; 7 | } 8 | 9 | .firstCategory { 10 | display: flex; 11 | flex-direction: column; 12 | box-sizing: border-box; 13 | width: 174px; 14 | background-color: #F8F8F8; 15 | min-height: 100%; 16 | height: 100%; 17 | padding-bottom: 90px; 18 | 19 | .categoryBox { 20 | height: 94px; 21 | line-height: 94px; 22 | text-align: center; 23 | font-size: 26px; 24 | } 25 | } 26 | 27 | .contentView{ 28 | display: flex; 29 | flex-direction: column; 30 | box-sizing: border-box; 31 | flex: 1; 32 | padding-bottom: 90px; 33 | } 34 | -------------------------------------------------------------------------------- /client/src/pages/forgetPassword/index.module.less: -------------------------------------------------------------------------------- 1 | .index { 2 | height: 100%; 3 | } -------------------------------------------------------------------------------- /client/src/pages/forgetPassword/index.tsx: -------------------------------------------------------------------------------- 1 | import Taro, {Component} from '@tarojs/taro' 2 | import {View, Button, Input} from '@tarojs/components' 3 | import {connect} from '@tarojs/redux'; 4 | import styles from './index.module.less' 5 | 6 | interface IProps { 7 | dispatch(e: any): void, 8 | } 9 | 10 | /** 11 | * 页面:忘记密码 12 | */ 13 | @connect(({dispatch}) => ({ 14 | dispatch 15 | })) 16 | export default class Index extends Component { 17 | 18 | constructor(props) { 19 | super(props) 20 | } 21 | 22 | render() { 23 | return ( 24 | 25 | 忘记密码页面 26 | 27 | ) 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /client/src/pages/goodsDetail/index.module.less: -------------------------------------------------------------------------------- 1 | .index { 2 | height: 100%; 3 | } -------------------------------------------------------------------------------- /client/src/pages/goodsDetail/index.tsx: -------------------------------------------------------------------------------- 1 | import Taro, {Component} from '@tarojs/taro' 2 | import {View, Button, Input} from '@tarojs/components' 3 | import {connect} from '@tarojs/redux'; 4 | import styles from './index.module.less' 5 | 6 | interface IProps { 7 | dispatch(e: any): void, 8 | } 9 | 10 | /** 11 | * 页面:商品详情 12 | */ 13 | @connect(({dispatch}) => ({ 14 | dispatch 15 | })) 16 | export default class Index extends Component { 17 | 18 | constructor(props) { 19 | super(props) 20 | } 21 | 22 | render() { 23 | return ( 24 | 25 | 商品详情页面 26 | 27 | ) 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /client/src/pages/register/index.module.less: -------------------------------------------------------------------------------- 1 | .index { 2 | height: 100%; 3 | } -------------------------------------------------------------------------------- /client/src/pages/register/index.tsx: -------------------------------------------------------------------------------- 1 | import Taro, {Component} from '@tarojs/taro' 2 | import {View, Button, Input} from '@tarojs/components' 3 | import {connect} from '@tarojs/redux'; 4 | import styles from './index.module.less' 5 | 6 | interface IProps { 7 | dispatch(e: any): void, 8 | } 9 | 10 | /** 11 | * 页面:注册 12 | */ 13 | @connect(({dispatch}) => ({ 14 | dispatch 15 | })) 16 | export default class Index extends Component { 17 | 18 | constructor(props) { 19 | super(props) 20 | } 21 | 22 | render() { 23 | return ( 24 | 25 | 注册页面 26 | 27 | ) 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /client/src/pages/searchGoodsList/index.module.less: -------------------------------------------------------------------------------- 1 | .index { 2 | height: 100%; 3 | } -------------------------------------------------------------------------------- /client/src/pages/searchGoodsList/index.tsx: -------------------------------------------------------------------------------- 1 | import Taro, {Component} from '@tarojs/taro' 2 | import {View} from '@tarojs/components' 3 | import {connect} from '@tarojs/redux'; 4 | import styles from './index.module.less' 5 | 6 | interface IProps { 7 | dispatch(e: any): void, 8 | } 9 | 10 | /** 11 | * 页面:搜索商品列表 12 | */ 13 | @connect(({dispatch}) => ({ 14 | dispatch 15 | })) 16 | export default class Index extends Component { 17 | 18 | constructor(props) { 19 | super(props) 20 | } 21 | 22 | render() { 23 | return ( 24 | 25 | 搜索商品列表页面 26 | 27 | ) 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /client/src/pages/shopcart/index.module.scss: -------------------------------------------------------------------------------- 1 | .container { 2 | background-color: #0a8ddf; 3 | position: relative; 4 | width: 100%; 5 | height: 100%; 6 | overflow: hidden; 7 | } 8 | -------------------------------------------------------------------------------- /client/src/utils/action.js: -------------------------------------------------------------------------------- 1 | const action = (type, payload) => ({ type, payload }); 2 | 3 | export default action; 4 | -------------------------------------------------------------------------------- /client/src/utils/delay.js: -------------------------------------------------------------------------------- 1 | export default function (time) { 2 | return new Promise(function(r){ 3 | setTimeout(r, time) 4 | }); 5 | } -------------------------------------------------------------------------------- /client/src/utils/dva.js: -------------------------------------------------------------------------------- 1 | import { create } from "dva-core"; 2 | import createLoading from "dva-loading"; 3 | 4 | let app; 5 | let store; 6 | let dispatch; 7 | 8 | function createApp(opt) { 9 | app = create(opt); 10 | app.use(createLoading({})); 11 | 12 | if (!global.registered) { 13 | opt.models.forEach(model => app.model(model)); 14 | global.registered = true; 15 | } 16 | app.start(); 17 | store = app._store; 18 | app.getStore = () => store; 19 | 20 | dispatch = store.dispatch; 21 | app.dispatch = dispatch; 22 | return app; 23 | } 24 | 25 | export default { 26 | createApp, 27 | getDispatch() { 28 | return app.dispatch; 29 | } 30 | }; 31 | -------------------------------------------------------------------------------- /client/src/utils/paramsUtils.js: -------------------------------------------------------------------------------- 1 | import omitBy from 'lodash/omitBy'; 2 | 3 | function removeEmpty(params) { 4 | if (!params) { 5 | return; 6 | } 7 | const newParams = JSON.parse(decodeURI(JSON.stringify(params))); 8 | return omitBy(newParams, (v) => !v || v === 'undefined' || v === ''); 9 | } 10 | 11 | export default removeEmpty; 12 | -------------------------------------------------------------------------------- /client/versionToNew.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | taro update self 3 | taro update project 4 | -------------------------------------------------------------------------------- /demo-docker/README.md: -------------------------------------------------------------------------------- 1 | 演示demo说明 -------------------------------------------------------------------------------- /demo-docker/client-compose.yml: -------------------------------------------------------------------------------- 1 | version: "3" 2 | 3 | services: 4 | client: 5 | build: ./client/ 6 | container_name: "client" 7 | depends_on: 8 | - rxjava-service-goods 9 | ports: 10 | - 8000:80 11 | restart: always 12 | rxjava-service-goods: 13 | build: ./services/rxjava-service/service-goods/target/docker-bin/ 14 | container_name: "rxjava-service-goods" 15 | depends_on: 16 | - mongodb 17 | environment: 18 | DB_HOST: mongodb:27017 19 | mongodb: 20 | image: 'registry.cn-shanghai.aliyuncs.com/taro-mall/mongo:3.7.3-jessie' 21 | container_name: "mongodb" 22 | ports: 23 | - 27017:27017 24 | restart: always 25 | -------------------------------------------------------------------------------- /manager-new/.editorconfig: -------------------------------------------------------------------------------- 1 | # http://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | indent_style = space 6 | indent_size = 2 7 | end_of_line = lf 8 | charset = utf-8 9 | trim_trailing_whitespace = true 10 | insert_final_newline = true 11 | 12 | [*.md] 13 | trim_trailing_whitespace = false 14 | 15 | [Makefile] 16 | indent_style = tab 17 | -------------------------------------------------------------------------------- /manager-new/.eslintignore: -------------------------------------------------------------------------------- 1 | /lambda/ 2 | /scripts 3 | /config 4 | .history -------------------------------------------------------------------------------- /manager-new/.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | extends: [require.resolve('@umijs/fabric/dist/eslint')], 3 | globals: { 4 | ANT_DESIGN_PRO_ONLY_DO_NOT_USE_IN_YOUR_PRODUCTION: true, 5 | page: true, 6 | }, 7 | }; 8 | -------------------------------------------------------------------------------- /manager-new/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | **/node_modules 5 | # roadhog-api-doc ignore 6 | /src/utils/request-temp.js 7 | _roadhog-api-doc 8 | 9 | # production 10 | /dist 11 | /.vscode 12 | 13 | # misc 14 | .DS_Store 15 | npm-debug.log* 16 | yarn-error.log 17 | 18 | /coverage 19 | .idea 20 | yarn.lock 21 | package-lock.json 22 | *bak 23 | .vscode 24 | 25 | # visual studio code 26 | .history 27 | *.log 28 | functions/* 29 | .temp/** 30 | 31 | # umi 32 | .umi 33 | .umi-production 34 | 35 | # screenshot 36 | screenshot 37 | .firebase 38 | .eslintcache 39 | 40 | build 41 | -------------------------------------------------------------------------------- /manager-new/.prettierignore: -------------------------------------------------------------------------------- 1 | **/*.svg 2 | package.json 3 | .umi 4 | .umi-production 5 | /dist 6 | .dockerignore 7 | .DS_Store 8 | .eslintignore 9 | *.png 10 | *.toml 11 | docker 12 | .editorconfig 13 | Dockerfile* 14 | .gitignore 15 | .prettierignore 16 | LICENSE 17 | .eslintcache 18 | *.lock 19 | yarn-error.log 20 | .history -------------------------------------------------------------------------------- /manager-new/.prettierrc.js: -------------------------------------------------------------------------------- 1 | const fabric = require('@umijs/fabric'); 2 | 3 | module.exports = { 4 | ...fabric.prettier, 5 | }; 6 | -------------------------------------------------------------------------------- /manager-new/.stylelintrc.js: -------------------------------------------------------------------------------- 1 | const fabric = require('@umijs/fabric'); 2 | 3 | module.exports = { 4 | ...fabric.stylelint, 5 | }; 6 | -------------------------------------------------------------------------------- /manager-new/jest-puppeteer.config.js: -------------------------------------------------------------------------------- 1 | // ps https://github.com/GoogleChrome/puppeteer/issues/3120 2 | module.exports = { 3 | launch: { 4 | args: [ 5 | '--disable-gpu', 6 | '--disable-dev-shm-usage', 7 | '--no-first-run', 8 | '--no-zygote', 9 | '--no-sandbox', 10 | ], 11 | }, 12 | }; 13 | -------------------------------------------------------------------------------- /manager-new/jest.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | testURL: 'http://localhost:8000', 3 | preset: 'jest-puppeteer', 4 | globals: { 5 | ANT_DESIGN_PRO_ONLY_DO_NOT_USE_IN_YOUR_PRODUCTION: false, 6 | localStorage: null, 7 | }, 8 | }; 9 | -------------------------------------------------------------------------------- /manager-new/jsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "emitDecoratorMetadata": true, 4 | "experimentalDecorators": true, 5 | "baseUrl": ".", 6 | "paths": { 7 | "@/*": ["./src/*"] 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /manager-new/mock/route.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | '/api/auth_routes': { 3 | '/form/advanced-form': { authority: ['admin', 'user'] }, 4 | }, 5 | }; 6 | -------------------------------------------------------------------------------- /manager-new/public/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apersonw/taro-mall/f72bb26a86e32a0c6da5a83911cddd1549f43ec4/manager-new/public/favicon.png -------------------------------------------------------------------------------- /manager-new/public/icons/icon-128x128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apersonw/taro-mall/f72bb26a86e32a0c6da5a83911cddd1549f43ec4/manager-new/public/icons/icon-128x128.png -------------------------------------------------------------------------------- /manager-new/public/icons/icon-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apersonw/taro-mall/f72bb26a86e32a0c6da5a83911cddd1549f43ec4/manager-new/public/icons/icon-192x192.png -------------------------------------------------------------------------------- /manager-new/public/icons/icon-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apersonw/taro-mall/f72bb26a86e32a0c6da5a83911cddd1549f43ec4/manager-new/public/icons/icon-512x512.png -------------------------------------------------------------------------------- /manager-new/src/components/Authorized/index.tsx: -------------------------------------------------------------------------------- 1 | import Authorized from './Authorized'; 2 | import Secured from './Secured'; 3 | import check from './CheckPermissions'; 4 | import renderAuthorize from './renderAuthorize'; 5 | 6 | Authorized.Secured = Secured; 7 | Authorized.check = check; 8 | 9 | const RenderAuthorize = renderAuthorize(Authorized); 10 | 11 | export default RenderAuthorize; 12 | -------------------------------------------------------------------------------- /manager-new/src/components/HeaderDropdown/index.less: -------------------------------------------------------------------------------- 1 | @import '~antd/es/style/themes/default.less'; 2 | 3 | .container > * { 4 | background-color: @popover-bg; 5 | border-radius: 4px; 6 | box-shadow: @shadow-1-down; 7 | } 8 | 9 | @media screen and (max-width: @screen-xs) { 10 | .container { 11 | width: 100% !important; 12 | } 13 | .container > * { 14 | border-radius: 0 !important; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /manager-new/src/components/HeaderDropdown/index.tsx: -------------------------------------------------------------------------------- 1 | import { DropDownProps } from 'antd/es/dropdown'; 2 | import { Dropdown } from 'antd'; 3 | import React from 'react'; 4 | import classNames from 'classnames'; 5 | import styles from './index.less'; 6 | 7 | declare type OverlayFunc = () => React.ReactNode; 8 | 9 | export interface HeaderDropdownProps extends DropDownProps { 10 | overlayClassName?: string; 11 | overlay: React.ReactNode | OverlayFunc; 12 | placement?: 'bottomLeft' | 'bottomRight' | 'topLeft' | 'topCenter' | 'topRight' | 'bottomCenter'; 13 | } 14 | 15 | const HeaderDropdown: React.FC = ({ overlayClassName: cls, ...restProps }) => ( 16 | 17 | ); 18 | 19 | export default HeaderDropdown; 20 | -------------------------------------------------------------------------------- /manager-new/src/components/HeaderSearch/index.less: -------------------------------------------------------------------------------- 1 | @import '~antd/es/style/themes/default.less'; 2 | 3 | .headerSearch { 4 | :global(.anticon-search) { 5 | font-size: 16px; 6 | cursor: pointer; 7 | } 8 | .input { 9 | width: 0; 10 | background: transparent; 11 | border-radius: 0; 12 | transition: width 0.3s, margin-left 0.3s; 13 | :global(.ant-select-selection) { 14 | background: transparent; 15 | } 16 | input { 17 | padding-right: 0; 18 | padding-left: 0; 19 | border: 0; 20 | box-shadow: none !important; 21 | } 22 | &, 23 | &:hover, 24 | &:focus { 25 | border-bottom: 1px solid @border-color-base; 26 | } 27 | &.show { 28 | width: 210px; 29 | margin-left: 8px; 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /manager-new/src/components/NoticeIcon/index.less: -------------------------------------------------------------------------------- 1 | @import '~antd/es/style/themes/default.less'; 2 | 3 | .popover { 4 | position: relative; 5 | width: 336px; 6 | } 7 | 8 | .noticeButton { 9 | display: inline-block; 10 | cursor: pointer; 11 | transition: all 0.3s; 12 | } 13 | .icon { 14 | padding: 4px; 15 | vertical-align: middle; 16 | } 17 | 18 | .badge { 19 | font-size: 16px; 20 | } 21 | 22 | .tabs { 23 | :global { 24 | .ant-tabs-nav-scroll { 25 | text-align: center; 26 | } 27 | .ant-tabs-bar { 28 | margin-bottom: 0; 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /manager-new/src/components/PageLoading/index.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { Spin } from 'antd'; 3 | 4 | // loading components from code split 5 | // https://umijs.org/plugin/umi-plugin-react.html#dynamicimport 6 | const PageLoading: React.FC = () => ( 7 |
8 | 9 |
10 | ); 11 | export default PageLoading; 12 | -------------------------------------------------------------------------------- /manager-new/src/components/SelectLang/index.less: -------------------------------------------------------------------------------- 1 | @import '~antd/es/style/themes/default.less'; 2 | 3 | .menu { 4 | :global(.anticon) { 5 | margin-right: 8px; 6 | } 7 | :global(.ant-dropdown-menu-item) { 8 | min-width: 160px; 9 | } 10 | } 11 | 12 | .dropDown { 13 | line-height: @layout-header-height; 14 | vertical-align: top; 15 | cursor: pointer; 16 | > i { 17 | font-size: 16px !important; 18 | transform: none !important; 19 | svg { 20 | position: relative; 21 | top: -1px; 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /manager-new/src/e2e/__mocks__/antd-pro-merge-less.js: -------------------------------------------------------------------------------- 1 | export default undefined; 2 | -------------------------------------------------------------------------------- /manager-new/src/e2e/topMenu.e2e.js: -------------------------------------------------------------------------------- 1 | const BASE_URL = `http://localhost:${process.env.PORT || 8000}`; 2 | 3 | describe('Homepage', () => { 4 | it('topmenu should have footer', async () => { 5 | const params = '?navTheme=light&layout=topmenu'; 6 | await page.goto(`${BASE_URL}${params}`); 7 | await page.waitForSelector('footer', { 8 | timeout: 2000, 9 | }); 10 | const haveFooter = await page.evaluate( 11 | () => document.getElementsByTagName('footer').length > 0, 12 | ); 13 | expect(haveFooter).toBeTruthy(); 14 | }); 15 | }); 16 | -------------------------------------------------------------------------------- /manager-new/src/global.less: -------------------------------------------------------------------------------- 1 | @import '~antd/es/style/themes/default.less'; 2 | 3 | html, 4 | body, 5 | #root { 6 | height: 100%; 7 | } 8 | 9 | .colorWeak { 10 | filter: invert(80%); 11 | } 12 | 13 | .ant-layout { 14 | min-height: 100vh; 15 | } 16 | 17 | canvas { 18 | display: block; 19 | } 20 | 21 | body { 22 | text-rendering: optimizeLegibility; 23 | -webkit-font-smoothing: antialiased; 24 | -moz-osx-font-smoothing: grayscale; 25 | } 26 | 27 | ul, 28 | ol { 29 | list-style: none; 30 | } 31 | 32 | @media (max-width: @screen-xs) { 33 | .ant-table { 34 | width: 100%; 35 | overflow-x: auto; 36 | &-thead > tr, 37 | &-tbody > tr { 38 | > th, 39 | > td { 40 | white-space: pre; 41 | > span { 42 | display: block; 43 | } 44 | } 45 | } 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /manager-new/src/layouts/BlankLayout.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | const Layout: React.FC = ({ children }) =>
{children}
; 4 | 5 | export default Layout; 6 | -------------------------------------------------------------------------------- /manager-new/src/locales/en-US.ts: -------------------------------------------------------------------------------- 1 | import component from './en-US/component'; 2 | import globalHeader from './en-US/globalHeader'; 3 | import menu from './en-US/menu'; 4 | import pwa from './en-US/pwa'; 5 | import settingDrawer from './en-US/settingDrawer'; 6 | import settings from './en-US/settings'; 7 | 8 | export default { 9 | 'navBar.lang': 'Languages', 10 | 'layout.user.link.help': 'Help', 11 | 'layout.user.link.privacy': 'Privacy', 12 | 'layout.user.link.terms': 'Terms', 13 | 'app.preview.down.block': 'Download this page to your local project', 14 | 'app.welcome.link.fetch-blocks': 'Get all block', 15 | 'app.welcome.link.block-list': 'Quickly build standard, pages based on `block` development', 16 | ...globalHeader, 17 | ...menu, 18 | ...settingDrawer, 19 | ...settings, 20 | ...pwa, 21 | ...component, 22 | }; 23 | -------------------------------------------------------------------------------- /manager-new/src/locales/en-US/component.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | 'component.tagSelect.expand': 'Expand', 3 | 'component.tagSelect.collapse': 'Collapse', 4 | 'component.tagSelect.all': 'All', 5 | }; 6 | -------------------------------------------------------------------------------- /manager-new/src/locales/en-US/pwa.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | 'app.pwa.offline': 'You are offline now', 3 | 'app.pwa.serviceworker.updated': 'New content is available', 4 | 'app.pwa.serviceworker.updated.hint': 'Please press the "Refresh" button to reload current page', 5 | 'app.pwa.serviceworker.updated.ok': 'Refresh', 6 | }; 7 | -------------------------------------------------------------------------------- /manager-new/src/locales/pt-BR.ts: -------------------------------------------------------------------------------- 1 | import component from './pt-BR/component'; 2 | import globalHeader from './pt-BR/globalHeader'; 3 | import menu from './pt-BR/menu'; 4 | import pwa from './pt-BR/pwa'; 5 | import settingDrawer from './pt-BR/settingDrawer'; 6 | import settings from './pt-BR/settings'; 7 | 8 | export default { 9 | 'navBar.lang': 'Idiomas', 10 | 'layout.user.link.help': 'ajuda', 11 | 'layout.user.link.privacy': 'política de privacidade', 12 | 'layout.user.link.terms': 'termos de serviços', 13 | 'app.preview.down.block': 'Download this page to your local project', 14 | ...globalHeader, 15 | ...menu, 16 | ...settingDrawer, 17 | ...settings, 18 | ...pwa, 19 | ...component, 20 | }; 21 | -------------------------------------------------------------------------------- /manager-new/src/locales/pt-BR/component.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | 'component.tagSelect.expand': 'Expandir', 3 | 'component.tagSelect.collapse': 'Diminuir', 4 | 'component.tagSelect.all': 'Todas', 5 | }; 6 | -------------------------------------------------------------------------------- /manager-new/src/locales/pt-BR/pwa.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | 'app.pwa.offline': 'Você está offline agora', 3 | 'app.pwa.serviceworker.updated': 'Novo conteúdo está disponível', 4 | 'app.pwa.serviceworker.updated.hint': 5 | 'Por favor, pressione o botão "Atualizar" para recarregar a página atual', 6 | 'app.pwa.serviceworker.updated.ok': 'Atualizar', 7 | }; 8 | -------------------------------------------------------------------------------- /manager-new/src/locales/zh-CN.ts: -------------------------------------------------------------------------------- 1 | import component from './zh-CN/component'; 2 | import globalHeader from './zh-CN/globalHeader'; 3 | import menu from './zh-CN/menu'; 4 | import pwa from './zh-CN/pwa'; 5 | import settingDrawer from './zh-CN/settingDrawer'; 6 | import settings from './zh-CN/settings'; 7 | 8 | export default { 9 | 'navBar.lang': '语言', 10 | 'layout.user.link.help': '帮助', 11 | 'layout.user.link.privacy': '隐私', 12 | 'layout.user.link.terms': '条款', 13 | 'app.preview.down.block': '下载此页面到本地项目', 14 | 'app.welcome.link.fetch-blocks': '获取全部区块', 15 | 'app.welcome.link.block-list': '基于 block 开发,快速构建标准页面', 16 | ...globalHeader, 17 | ...menu, 18 | ...settingDrawer, 19 | ...settings, 20 | ...pwa, 21 | ...component, 22 | }; 23 | -------------------------------------------------------------------------------- /manager-new/src/locales/zh-CN/component.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | 'component.tagSelect.expand': '展开', 3 | 'component.tagSelect.collapse': '收起', 4 | 'component.tagSelect.all': '全部', 5 | }; 6 | -------------------------------------------------------------------------------- /manager-new/src/locales/zh-CN/globalHeader.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | 'component.globalHeader.search': '站内搜索', 3 | 'component.globalHeader.search.example1': '搜索提示一', 4 | 'component.globalHeader.search.example2': '搜索提示二', 5 | 'component.globalHeader.search.example3': '搜索提示三', 6 | 'component.globalHeader.help': '使用文档', 7 | 'component.globalHeader.notification': '通知', 8 | 'component.globalHeader.notification.empty': '你已查看所有通知', 9 | 'component.globalHeader.message': '消息', 10 | 'component.globalHeader.message.empty': '您已读完所有消息', 11 | 'component.globalHeader.event': '待办', 12 | 'component.globalHeader.event.empty': '你已完成所有待办', 13 | 'component.noticeIcon.clear': '清空', 14 | 'component.noticeIcon.cleared': '清空了', 15 | 'component.noticeIcon.empty': '暂无数据', 16 | 'component.noticeIcon.view-more': '查看更多', 17 | }; 18 | -------------------------------------------------------------------------------- /manager-new/src/locales/zh-CN/pwa.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | 'app.pwa.offline': '当前处于离线状态', 3 | 'app.pwa.serviceworker.updated': '有新内容', 4 | 'app.pwa.serviceworker.updated.hint': '请点击“刷新”按钮或者手动刷新页面', 5 | 'app.pwa.serviceworker.updated.ok': '刷新', 6 | }; 7 | -------------------------------------------------------------------------------- /manager-new/src/locales/zh-TW.ts: -------------------------------------------------------------------------------- 1 | import component from './zh-TW/component'; 2 | import globalHeader from './zh-TW/globalHeader'; 3 | import menu from './zh-TW/menu'; 4 | import pwa from './zh-TW/pwa'; 5 | import settingDrawer from './zh-TW/settingDrawer'; 6 | import settings from './zh-TW/settings'; 7 | 8 | export default { 9 | 'navBar.lang': '語言', 10 | 'layout.user.link.help': '幫助', 11 | 'layout.user.link.privacy': '隱私', 12 | 'layout.user.link.terms': '條款', 13 | 'app.preview.down.block': '下載此頁面到本地項目', 14 | ...globalHeader, 15 | ...menu, 16 | ...settingDrawer, 17 | ...settings, 18 | ...pwa, 19 | ...component, 20 | }; 21 | -------------------------------------------------------------------------------- /manager-new/src/locales/zh-TW/component.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | 'component.tagSelect.expand': '展開', 3 | 'component.tagSelect.collapse': '收起', 4 | 'component.tagSelect.all': '全部', 5 | }; 6 | -------------------------------------------------------------------------------- /manager-new/src/locales/zh-TW/globalHeader.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | 'component.globalHeader.search': '站內搜索', 3 | 'component.globalHeader.search.example1': '搜索提示壹', 4 | 'component.globalHeader.search.example2': '搜索提示二', 5 | 'component.globalHeader.search.example3': '搜索提示三', 6 | 'component.globalHeader.help': '使用手冊', 7 | 'component.globalHeader.notification': '通知', 8 | 'component.globalHeader.notification.empty': '妳已查看所有通知', 9 | 'component.globalHeader.message': '消息', 10 | 'component.globalHeader.message.empty': '您已讀完所有消息', 11 | 'component.globalHeader.event': '待辦', 12 | 'component.globalHeader.event.empty': '妳已完成所有待辦', 13 | 'component.noticeIcon.clear': '清空', 14 | 'component.noticeIcon.cleared': '清空了', 15 | 'component.noticeIcon.empty': '暫無資料', 16 | 'component.noticeIcon.view-more': '查看更多', 17 | }; 18 | -------------------------------------------------------------------------------- /manager-new/src/locales/zh-TW/pwa.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | 'app.pwa.offline': '當前處於離線狀態', 3 | 'app.pwa.serviceworker.updated': '有新內容', 4 | 'app.pwa.serviceworker.updated.hint': '請點擊“刷新”按鈕或者手動刷新頁面', 5 | 'app.pwa.serviceworker.updated.ok': '刷新', 6 | }; 7 | -------------------------------------------------------------------------------- /manager-new/src/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Ant Design Pro", 3 | "short_name": "Ant Design Pro", 4 | "display": "standalone", 5 | "start_url": "./?utm_source=homescreen", 6 | "theme_color": "#002140", 7 | "background_color": "#001529", 8 | "icons": [ 9 | { 10 | "src": "icons/icon-192x192.png", 11 | "sizes": "192x192" 12 | }, 13 | { 14 | "src": "icons/icon-128x128.png", 15 | "sizes": "128x128" 16 | }, 17 | { 18 | "src": "icons/icon-512x512.png", 19 | "sizes": "512x512" 20 | } 21 | ] 22 | } 23 | -------------------------------------------------------------------------------- /manager-new/src/pages/404.tsx: -------------------------------------------------------------------------------- 1 | import { Button, Result } from 'antd'; 2 | import React from 'react'; 3 | import router from 'umi/router'; 4 | 5 | // 这里应该使用 antd 的 404 result 组件, 6 | // 但是还没发布,先来个简单的。 7 | 8 | const NoFoundPage: React.FC<{}> = () => ( 9 | router.push('/')}> 15 | Back Home 16 | 17 | } 18 | > 19 | ); 20 | 21 | export default NoFoundPage; 22 | -------------------------------------------------------------------------------- /manager-new/src/pages/EmptyPage/ListBasic/index.less: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apersonw/taro-mall/f72bb26a86e32a0c6da5a83911cddd1549f43ec4/manager-new/src/pages/EmptyPage/ListBasic/index.less -------------------------------------------------------------------------------- /manager-new/src/pages/EmptyPage/index.less: -------------------------------------------------------------------------------- 1 | @import '~antd/es/style/themes/default.less'; 2 | 3 | .main { 4 | width: 100%; 5 | background: @component-background; 6 | } 7 | -------------------------------------------------------------------------------- /manager-new/src/pages/EmptyPage/index.tsx: -------------------------------------------------------------------------------- 1 | import { PageHeaderWrapper } from '@ant-design/pro-layout'; 2 | import React, { useState, useEffect } from 'react'; 3 | import { Spin } from 'antd'; 4 | import styles from './index.less'; 5 | import ListBasic from './ListBasic'; 6 | export default () => { 7 | const [loading, setLoading] = useState(true); 8 | useEffect(() => { 9 | setTimeout(() => { 10 | setLoading(false); 11 | }, 3000); 12 | }, []); 13 | return ( 14 | 15 | 16 |
22 | 23 |
24 |
25 | ); 26 | }; 27 | -------------------------------------------------------------------------------- /manager-new/src/pages/Welcome.less: -------------------------------------------------------------------------------- 1 | @import '~antd/lib/style/themes/default.less'; 2 | 3 | .pre { 4 | margin: 12px 0; 5 | padding: 12px 20px; 6 | background: @input-bg; 7 | box-shadow: @card-shadow; 8 | } 9 | -------------------------------------------------------------------------------- /manager-new/src/pages/user/login/components/Login/LoginContext.tsx: -------------------------------------------------------------------------------- 1 | import { createContext } from 'react'; 2 | 3 | export interface LoginContextProps { 4 | tabUtil?: { 5 | addTab: (id: string) => void; 6 | removeTab: (id: string) => void; 7 | }; 8 | updateActive?: (activeItem: { [key: string]: string } | string) => void; 9 | } 10 | 11 | const LoginContext: React.Context = createContext({}); 12 | 13 | export default LoginContext; 14 | -------------------------------------------------------------------------------- /manager-new/src/pages/user/login/components/Login/LoginSubmit.tsx: -------------------------------------------------------------------------------- 1 | import { Button, Form } from 'antd'; 2 | 3 | import { ButtonProps } from 'antd/es/button'; 4 | import React from 'react'; 5 | import classNames from 'classnames'; 6 | import styles from './index.less'; 7 | 8 | const FormItem = Form.Item; 9 | 10 | interface LoginSubmitProps extends ButtonProps { 11 | className?: string; 12 | } 13 | 14 | const LoginSubmit: React.FC = ({ className, ...rest }) => { 15 | const clsString = classNames(styles.submit, className); 16 | return ( 17 | 18 | 23 | 24 | 25 | ); 26 | ReactDOM.render( 27 | 28 | , mountNode); 29 | ```` 30 | -------------------------------------------------------------------------------- /manager/src/components/Exception/demo/404.md: -------------------------------------------------------------------------------- 1 | --- 2 | order: 0 3 | title: 4 | zh-CN: 404 页面 5 | en-US: 404 Page 6 | --- 7 | 8 | ## zh-CN 9 | 10 | 404 页面。 11 | 12 | ## en-US 13 | 14 | 404 page. 15 | 16 | ````jsx 17 | import Exception from 'ant-design-pro/lib/Exception'; 18 | 19 | ReactDOM.render( 20 | 21 | , mountNode); 22 | ```` 23 | -------------------------------------------------------------------------------- /manager/src/components/Exception/demo/500.md: -------------------------------------------------------------------------------- 1 | --- 2 | order: 1 3 | title: 4 | zh-CN: 500 页面 5 | en-US: 500 Page 6 | --- 7 | 8 | ## zh-CN 9 | 10 | 500 页面。 11 | 12 | ## en-US 13 | 14 | 500 page. 15 | 16 | ````jsx 17 | import Exception from 'ant-design-pro/lib/Exception'; 18 | 19 | ReactDOM.render( 20 | 21 | , mountNode); 22 | ```` 23 | -------------------------------------------------------------------------------- /manager/src/components/Exception/index.d.ts: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | export interface IExceptionProps { 3 | type?: '403' | '404' | '500'; 4 | title?: React.ReactNode; 5 | desc?: React.ReactNode; 6 | img?: string; 7 | actions?: React.ReactNode; 8 | linkElement?: string | React.ComponentType; 9 | style?: React.CSSProperties; 10 | className?: string; 11 | backText?: React.ReactNode; 12 | redirect?: string; 13 | } 14 | 15 | export default class Exception extends React.Component {} 16 | -------------------------------------------------------------------------------- /manager/src/components/Exception/index.zh-CN.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Exception 3 | subtitle: 异常 4 | cols: 1 5 | order: 5 6 | --- 7 | 8 | 异常页用于对页面特定的异常状态进行反馈。通常,它包含对错误状态的阐述,并向用户提供建议或操作,避免用户感到迷失和困惑。 9 | 10 | ## API 11 | 12 | | 参数 | 说明| 类型 | 默认值 | 13 | |-------------|------------------------------------------|-------------|-------| 14 | | backText| 默认的返回按钮文本 | ReactNode| back to home | 15 | | type| 页面类型,若配置,则自带对应类型默认的 `title`,`desc`,`img`,此默认设置可以被 `title`,`desc`,`img` 覆盖 | Enum {'403', '404', '500'} | - | 16 | | title | 标题 | ReactNode| -| 17 | | desc| 补充描述| ReactNode| -| 18 | | img | 背景图片地址 | string| -| 19 | | actions | 建议操作,配置此属性时默认的『返回首页』按钮不生效| ReactNode| -| 20 | | linkElement | 定义链接的元素 | string\|ReactElement | 'a' | 21 | | redirect | 返回按钮的跳转地址 | string | '/' 22 | -------------------------------------------------------------------------------- /manager/src/components/Exception/typeConfig.js: -------------------------------------------------------------------------------- 1 | const config = { 2 | 403: { 3 | img: 'https://gw.alipayobjects.com/zos/rmsportal/wZcnGqRDyhPOEYFcZDnb.svg', 4 | title: '403', 5 | desc: '抱歉,你无权访问该页面', 6 | }, 7 | 404: { 8 | img: 'https://gw.alipayobjects.com/zos/rmsportal/KpnpchXsobRgLElEozzI.svg', 9 | title: '404', 10 | desc: '抱歉,你访问的页面不存在', 11 | }, 12 | 500: { 13 | img: 'https://gw.alipayobjects.com/zos/rmsportal/RVRUAYdCGeYNBWoKiIwB.svg', 14 | title: '500', 15 | desc: '抱歉,服务器出错了', 16 | }, 17 | }; 18 | 19 | export default config; 20 | -------------------------------------------------------------------------------- /manager/src/components/FooterToolbar/index.d.ts: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | export interface IFooterToolbarProps { 3 | extra: React.ReactNode; 4 | style?: React.CSSProperties; 5 | } 6 | 7 | export default class FooterToolbar extends React.Component {} 8 | -------------------------------------------------------------------------------- /manager/src/components/FooterToolbar/index.en-US.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: FooterToolbar 3 | cols: 1 4 | order: 6 5 | --- 6 | 7 | A toolbar fixed at the bottom. 8 | 9 | ## Usage 10 | 11 | It is fixed at the bottom of the content area and does not move along with the scroll bar, which is usually used for data collection and submission for long pages. 12 | 13 | ## API 14 | 15 | Property | Description | Type | Default 16 | ---------|-------------|------|-------- 17 | children | toolbar content, align to the right | ReactNode | - 18 | extra | extra information, align to the left | ReactNode | - -------------------------------------------------------------------------------- /manager/src/components/FooterToolbar/index.less: -------------------------------------------------------------------------------- 1 | @import '~antd/lib/style/themes/default.less'; 2 | 3 | .toolbar { 4 | position: fixed; 5 | right: 0; 6 | bottom: 0; 7 | z-index: 9; 8 | width: 100%; 9 | height: 56px; 10 | padding: 0 24px; 11 | line-height: 56px; 12 | background: #fff; 13 | border-top: 1px solid @border-color-split; 14 | box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.03); 15 | 16 | &::after { 17 | display: block; 18 | clear: both; 19 | content: ''; 20 | } 21 | 22 | .left { 23 | float: left; 24 | } 25 | 26 | .right { 27 | float: right; 28 | } 29 | 30 | button + button { 31 | margin-left: 8px; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /manager/src/components/FooterToolbar/index.zh-CN.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: FooterToolbar 3 | subtitle: 底部工具栏 4 | cols: 1 5 | order: 6 6 | --- 7 | 8 | 固定在底部的工具栏。 9 | 10 | ## 何时使用 11 | 12 | 固定在内容区域的底部,不随滚动条移动,常用于长页面的数据搜集和提交工作。 13 | 14 | ## API 15 | 16 | 参数 | 说明 | 类型 | 默认值 17 | ----|------|-----|------ 18 | children | 工具栏内容,向右对齐 | ReactNode | - 19 | extra | 额外信息,向左对齐 | ReactNode | - 20 | -------------------------------------------------------------------------------- /manager/src/components/GlobalFooter/index.d.ts: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | export interface IGlobalFooterProps { 3 | links?: Array<{ 4 | key?: string; 5 | title: React.ReactNode; 6 | href: string; 7 | blankTarget?: boolean; 8 | }>; 9 | copyright?: React.ReactNode; 10 | style?: React.CSSProperties; 11 | } 12 | 13 | export default class GlobalFooter extends React.Component {} 14 | -------------------------------------------------------------------------------- /manager/src/components/GlobalFooter/index.less: -------------------------------------------------------------------------------- 1 | @import '~antd/lib/style/themes/default.less'; 2 | 3 | .globalFooter { 4 | margin: 48px 0 24px 0; 5 | padding: 0 16px; 6 | text-align: center; 7 | 8 | .links { 9 | margin-bottom: 8px; 10 | 11 | a { 12 | color: @text-color-secondary; 13 | transition: all 0.3s; 14 | 15 | &:not(:last-child) { 16 | margin-right: 40px; 17 | } 18 | 19 | &:hover { 20 | color: @text-color; 21 | } 22 | } 23 | } 24 | 25 | .copyright { 26 | color: @text-color-secondary; 27 | font-size: @font-size-base; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /manager/src/components/GlobalFooter/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: GlobalFooter 3 | subtitle: 全局页脚 4 | cols: 1 5 | order: 7 6 | --- 7 | 8 | 页脚属于全局导航的一部分,作为对顶部导航的补充,通过传递数据控制展示内容。 9 | 10 | ## API 11 | 12 | 参数 | 说明 | 类型 | 默认值 13 | ----|------|-----|------ 14 | links | 链接数据 | array<{ title: ReactNode, href: string, blankTarget?: boolean }> | - 15 | copyright | 版权信息 | ReactNode | - 16 | -------------------------------------------------------------------------------- /manager/src/components/HeaderDropdown/index.d.ts: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | import { DropDownProps } from 'antd/lib/dropdown'; 3 | 4 | export interface IHeaderDropdownProps extends DropDownProps { 5 | overlayClassName?: string; 6 | } 7 | 8 | export default class HeaderDropdown extends React.Component {} 9 | -------------------------------------------------------------------------------- /manager/src/components/HeaderDropdown/index.js: -------------------------------------------------------------------------------- 1 | import React, { PureComponent } from 'react'; 2 | import { Dropdown } from 'antd'; 3 | import classNames from 'classnames'; 4 | import styles from './index.less'; 5 | 6 | export default class HeaderDropdown extends PureComponent { 7 | render() { 8 | const { overlayClassName, ...props } = this.props; 9 | return ( 10 | 11 | ); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /manager/src/components/HeaderDropdown/index.less: -------------------------------------------------------------------------------- 1 | @import '~antd/lib/style/themes/default.less'; 2 | 3 | .container > * { 4 | background-color: #fff; 5 | border-radius: 4px; 6 | box-shadow: @shadow-1-down; 7 | } 8 | 9 | @media screen and (max-width: @screen-xs) { 10 | .container { 11 | width: 100% !important; 12 | } 13 | .container > * { 14 | border-radius: 0 !important; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /manager/src/components/HeaderSearch/demo/basic.md: -------------------------------------------------------------------------------- 1 | --- 2 | order: 0 3 | title: 全局搜索 4 | --- 5 | 6 | 通常放置在导航工具条右侧。(点击搜索图标预览效果) 7 | 8 | ````jsx 9 | import HeaderSearch from 'ant-design-pro/lib/HeaderSearch'; 10 | 11 | ReactDOM.render( 12 |
22 | { 26 | console.log('input', value); // eslint-disable-line 27 | }} 28 | onPressEnter={(value) => { 29 | console.log('enter', value); // eslint-disable-line 30 | }} 31 | /> 32 |
33 | , mountNode); 34 | ```` 35 | -------------------------------------------------------------------------------- /manager/src/components/HeaderSearch/index.d.ts: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | export interface IHeaderSearchProps { 3 | placeholder?: string; 4 | dataSource?: string[]; 5 | defaultOpen?: boolean; 6 | open?: boolean; 7 | onSearch?: (value: string) => void; 8 | onChange?: (value: string) => void; 9 | onVisibleChange?: (visible: boolean) => void; 10 | onPressEnter?: (value: string) => void; 11 | style?: React.CSSProperties; 12 | className?: string; 13 | } 14 | 15 | export default class HeaderSearch extends React.Component {} 16 | -------------------------------------------------------------------------------- /manager/src/components/HeaderSearch/index.less: -------------------------------------------------------------------------------- 1 | @import '~antd/lib/style/themes/default.less'; 2 | 3 | .headerSearch { 4 | :global(.anticon-search) { 5 | font-size: 16px; 6 | cursor: pointer; 7 | } 8 | .input { 9 | width: 0; 10 | background: transparent; 11 | border-radius: 0; 12 | transition: width 0.3s, margin-left 0.3s; 13 | :global(.ant-select-selection) { 14 | background: transparent; 15 | } 16 | input { 17 | padding-right: 0; 18 | padding-left: 0; 19 | border: 0; 20 | box-shadow: none !important; 21 | } 22 | &, 23 | &:hover, 24 | &:focus { 25 | border-bottom: 1px solid @border-color-base; 26 | } 27 | &.show { 28 | width: 210px; 29 | margin-left: 8px; 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /manager/src/components/HeaderSearch/index.zh-CN.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: HeaderSearch 3 | subtitle: 顶部搜索框 4 | cols: 1 5 | order: 8 6 | --- 7 | 8 | 通常作为全局搜索的入口,放置在导航工具条右侧。 9 | 10 | ## API 11 | 12 | 参数 | 说明 | 类型 | 默认值 13 | ----|------|-----|------ 14 | placeholder | 占位文字 | string | - 15 | dataSource | 当前提示内容列表 | string[] | - 16 | onSearch | 搜索补全项的时候调用 | function(value) | - 17 | onChange | 选中 option,或 input 的 value 变化时,调用此函数 | function(value) | - 18 | onSelect | 被选中时调用,参数为选中项的 value 值 | function(value) | - 19 | onPressEnter | 按下回车时的回调 | function(value) | - 20 | onVisibleChange | 显示或隐藏文本框的回调 | function(value) |- 21 | defaultOpen | 输入框首次显示是否显示 | boolean | false 22 | open | 控制输入框是否显示 | boolean |false -------------------------------------------------------------------------------- /manager/src/components/IconFont/index.js: -------------------------------------------------------------------------------- 1 | import { Icon } from 'antd'; 2 | import { iconfontUrl as scriptUrl } from '../../defaultSettings'; 3 | 4 | // 使用: 5 | // import IconFont from '@/components/IconFont'; 6 | // 7 | export default Icon.createFromIconfontCN({ scriptUrl }); 8 | -------------------------------------------------------------------------------- /manager/src/components/Login/LoginItem.d.ts: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | export interface ILoginItemProps { 3 | name?: string; 4 | rules?: any[]; 5 | style?: React.CSSProperties; 6 | onGetCaptcha?: () => void; 7 | placeholder?: string; 8 | buttonText?: React.ReactNode; 9 | } 10 | 11 | export default class LoginItem extends React.Component {} 12 | -------------------------------------------------------------------------------- /manager/src/components/Login/LoginSubmit.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import classNames from 'classnames'; 3 | import { Button, Form } from 'antd'; 4 | import styles from './index.less'; 5 | 6 | const FormItem = Form.Item; 7 | 8 | const LoginSubmit = ({ className, ...rest }) => { 9 | const clsString = classNames(styles.submit, className); 10 | return ( 11 | 12 |