From c0d8f33f66ad658236245f74007e7b46c3b9cfe6 Mon Sep 17 00:00:00 2001 From: yikai Date: Tue, 19 Sep 2023 23:40:27 +0800 Subject: [PATCH] feat: login --- node_modules/.yarn-integrity | 16 + node_modules/js-cookie/LICENSE | 21 ++ node_modules/js-cookie/README.md | 305 ++++++++++++++++++ node_modules/js-cookie/dist/js.cookie.js | 147 +++++++++ node_modules/js-cookie/dist/js.cookie.min.js | 2 + node_modules/js-cookie/dist/js.cookie.min.mjs | 2 + node_modules/js-cookie/dist/js.cookie.mjs | 134 ++++++++ node_modules/js-cookie/index.js | 1 + node_modules/js-cookie/package.json | 71 ++++ threadpool/console-new/.eslintrc.js | 2 + threadpool/console-new/.prettierignore | 3 +- threadpool/console-new/craco.config.js | 22 +- threadpool/console-new/package.json | 2 + threadpool/console-new/src/App.tsx | 5 +- .../src/components/header/index.module.less | 2 +- .../src/components/header/index.tsx | 33 +- .../components/layout-com/index.module.less | 6 +- .../src/components/layout-com/index.tsx | 31 +- .../src/components/theme-com/index.tsx | 4 +- .../console-new/src/config/i18n/index.ts | 2 +- threadpool/console-new/src/context/index.tsx | 31 +- threadpool/console-new/src/hooks/index.ts | 1 - .../console-new/src/hooks/useThemeMode.ts | 14 - .../console-new/src/page/home/index.tsx | 7 - .../src/page/login/index.module.less | 37 +++ .../console-new/src/page/login/index.tsx | 141 +++++++- .../console-new/src/page/login/router.ts | 6 + .../console-new/src/page/login/service.ts | 13 + threadpool/console-new/src/react-app-env.d.ts | 1 + threadpool/console-new/src/route/index.tsx | 3 +- threadpool/console-new/src/typings/index.ts | 17 + .../console-new/src/utils/common/index.ts | 44 ++- .../console-new/src/utils/request/index.ts | 5 +- threadpool/console-new/yarn.lock | 2 +- 34 files changed, 1038 insertions(+), 95 deletions(-) create mode 100644 node_modules/.yarn-integrity create mode 100644 node_modules/js-cookie/LICENSE create mode 100644 node_modules/js-cookie/README.md create mode 100644 node_modules/js-cookie/dist/js.cookie.js create mode 100644 node_modules/js-cookie/dist/js.cookie.min.js create mode 100644 node_modules/js-cookie/dist/js.cookie.min.mjs create mode 100644 node_modules/js-cookie/dist/js.cookie.mjs create mode 100644 node_modules/js-cookie/index.js create mode 100644 node_modules/js-cookie/package.json delete mode 100644 threadpool/console-new/src/hooks/useThemeMode.ts create mode 100644 threadpool/console-new/src/page/login/index.module.less create mode 100644 threadpool/console-new/src/page/login/router.ts create mode 100644 threadpool/console-new/src/page/login/service.ts diff --git a/node_modules/.yarn-integrity b/node_modules/.yarn-integrity new file mode 100644 index 00000000..3113f6c5 --- /dev/null +++ b/node_modules/.yarn-integrity @@ -0,0 +1,16 @@ +{ + "systemParams": "darwin-arm64-93", + "modulesFolders": [ + "node_modules" + ], + "flags": [], + "linkedModules": [], + "topLevelPatterns": [ + "js-cookie@^3.0.5" + ], + "lockfileEntries": { + "js-cookie@^3.0.5": "https://registry.npmmirror.com/js-cookie/-/js-cookie-3.0.5.tgz#0b7e2fd0c01552c58ba86e0841f94dc2557dcdbc" + }, + "files": [], + "artifacts": {} +} \ No newline at end of file diff --git a/node_modules/js-cookie/LICENSE b/node_modules/js-cookie/LICENSE new file mode 100644 index 00000000..3c581cad --- /dev/null +++ b/node_modules/js-cookie/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2018 Copyright 2018 Klaus Hartl, Fagner Brack, GitHub Contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/node_modules/js-cookie/README.md b/node_modules/js-cookie/README.md new file mode 100644 index 00000000..e397e514 --- /dev/null +++ b/node_modules/js-cookie/README.md @@ -0,0 +1,305 @@ +

+ +

+ +# JavaScript Cookie [![CI](https://github.com/js-cookie/js-cookie/actions/workflows/ci.yml/badge.svg)](https://github.com/js-cookie/js-cookie/actions/workflows/ci.yml) [![BrowserStack](https://github.com/js-cookie/js-cookie/actions/workflows/browserstack.yml/badge.svg)](https://github.com/js-cookie/js-cookie/actions/workflows/browserstack.yml) [![JavaScript Style Guide](https://img.shields.io/badge/code_style-standard-brightgreen.svg)](https://standardjs.com) [![Code Climate](https://codeclimate.com/github/js-cookie/js-cookie.svg)](https://codeclimate.com/github/js-cookie/js-cookie) [![npm](https://img.shields.io/github/package-json/v/js-cookie/js-cookie)](https://www.npmjs.com/package/js-cookie) [![size](https://img.shields.io/bundlephobia/minzip/js-cookie/3)](https://www.npmjs.com/package/js-cookie) [![jsDelivr Hits](https://data.jsdelivr.com/v1/package/npm/js-cookie/badge?style=rounded)](https://www.jsdelivr.com/package/npm/js-cookie) + +A simple, lightweight JavaScript API for handling cookies + +- Works in [all](https://www.browserstack.com/automate/public-build/b3VDaHAxVDg0NDdCRmtUOWg0SlQzK2NsRVhWTjlDQS9qdGJoak1GMzJiVT0tLVhwZHNvdGRoY284YVRrRnI3eU1JTnc9PQ==--5e88ffb3ca116001d7ef2cfb97a4128ac31174c2) browsers +- Accepts [any](#encoding) character +- [Heavily](test) tested +- No dependency +- Supports ES modules +- Supports AMD/CommonJS +- [RFC 6265](https://tools.ietf.org/html/rfc6265) compliant +- Useful [Wiki](https://github.com/js-cookie/js-cookie/wiki) +- Enable [custom encoding/decoding](#converters) +- **< 800 bytes** gzipped! + +**👉👉 If you're viewing this at https://github.com/js-cookie/js-cookie, you're reading the documentation for the main branch. +[View documentation for the latest release.](https://github.com/js-cookie/js-cookie/tree/latest#readme) 👈👈** + +## Installation + +### NPM + +JavaScript Cookie supports [npm](https://www.npmjs.com/package/js-cookie) under the name `js-cookie`. + +```bash +npm i js-cookie +``` + +The npm package has a `module` field pointing to an ES module variant of the library, mainly to provide support for ES module aware bundlers, whereas its `browser` field points to an UMD module for full backward compatibility. + +_Not all browsers support ES modules natively yet_. For this reason the npm package/release provides both the ES and UMD module variant and you may want to include the ES module along with the UMD fallback to account for this: + +### CDN + +Alternatively, include js-cookie via [jsDelivr CDN](https://www.jsdelivr.com/package/npm/js-cookie). + +## Basic Usage + +Create a cookie, valid across the entire site: + +```javascript +Cookies.set('name', 'value') +``` + +Create a cookie that expires 7 days from now, valid across the entire site: + +```javascript +Cookies.set('name', 'value', { expires: 7 }) +``` + +Create an expiring cookie, valid to the path of the current page: + +```javascript +Cookies.set('name', 'value', { expires: 7, path: '' }) +``` + +Read cookie: + +```javascript +Cookies.get('name') // => 'value' +Cookies.get('nothing') // => undefined +``` + +Read all visible cookies: + +```javascript +Cookies.get() // => { name: 'value' } +``` + +_Note: It is not possible to read a particular cookie by passing one of the cookie attributes (which may or may not +have been used when writing the cookie in question):_ + +```javascript +Cookies.get('foo', { domain: 'sub.example.com' }) // `domain` won't have any effect...! +``` + +The cookie with the name `foo` will only be available on `.get()` if it's visible from where the +code is called; the domain and/or path attribute will not have an effect when reading. + +Delete cookie: + +```javascript +Cookies.remove('name') +``` + +Delete a cookie valid to the path of the current page: + +```javascript +Cookies.set('name', 'value', { path: '' }) +Cookies.remove('name') // fail! +Cookies.remove('name', { path: '' }) // removed! +``` + +_IMPORTANT! When deleting a cookie and you're not relying on the [default attributes](#cookie-attributes), you must pass the exact same path and domain attributes that were used to set the cookie:_ + +```javascript +Cookies.remove('name', { path: '', domain: '.yourdomain.com' }) +``` + +_Note: Removing a nonexistent cookie neither raises any exception nor returns any value._ + +## Namespace conflicts + +If there is any danger of a conflict with the namespace `Cookies`, the `noConflict` method will allow you to define a new namespace and preserve the original one. This is especially useful when running the script on third party sites e.g. as part of a widget or SDK. + +```javascript +// Assign the js-cookie api to a different variable and restore the original "window.Cookies" +var Cookies2 = Cookies.noConflict() +Cookies2.set('name', 'value') +``` + +_Note: The `.noConflict` method is not necessary when using AMD or CommonJS, thus it is not exposed in those environments._ + +## Encoding + +This project is [RFC 6265](http://tools.ietf.org/html/rfc6265#section-4.1.1) compliant. All special characters that are not allowed in the cookie-name or cookie-value are encoded with each one's UTF-8 Hex equivalent using [percent-encoding](http://en.wikipedia.org/wiki/Percent-encoding). +The only character in cookie-name or cookie-value that is allowed and still encoded is the percent `%` character, it is escaped in order to interpret percent input as literal. +Please note that the default encoding/decoding strategy is meant to be interoperable [only between cookies that are read/written by js-cookie](https://github.com/js-cookie/js-cookie/pull/200#discussion_r63270778). To override the default encoding/decoding strategy you need to use a [converter](#converters). + +_Note: According to [RFC 6265](https://tools.ietf.org/html/rfc6265#section-6.1), your cookies may get deleted if they are too big or there are too many cookies in the same domain, [more details here](https://github.com/js-cookie/js-cookie/wiki/Frequently-Asked-Questions#why-are-my-cookies-being-deleted)._ + +## Cookie Attributes + +Cookie attribute defaults can be set globally by creating an instance of the api via `withAttributes()`, or individually for each call to `Cookies.set(...)` by passing a plain object as the last argument. Per-call attributes override the default attributes. + +### expires + +Define when the cookie will be removed. Value must be a [`Number`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number) which will be interpreted as days from time of creation or a [`Date`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date) instance. If omitted, the cookie becomes a session cookie. + +To create a cookie that expires in less than a day, you can check the [FAQ on the Wiki](https://github.com/js-cookie/js-cookie/wiki/Frequently-Asked-Questions#expire-cookies-in-less-than-a-day). + +**Default:** Cookie is removed when the user closes the browser. + +**Examples:** + +```javascript +Cookies.set('name', 'value', { expires: 365 }) +Cookies.get('name') // => 'value' +Cookies.remove('name') +``` + +### path + +A [`String`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String) indicating the path where the cookie is visible. + +**Default:** `/` + +**Examples:** + +```javascript +Cookies.set('name', 'value', { path: '' }) +Cookies.get('name') // => 'value' +Cookies.remove('name', { path: '' }) +``` + +**Note regarding Internet Explorer:** + +> Due to an obscure bug in the underlying WinINET InternetGetCookie implementation, IE’s document.cookie will not return a cookie if it was set with a path attribute containing a filename. + +(From [Internet Explorer Cookie Internals (FAQ)](http://blogs.msdn.com/b/ieinternals/archive/2009/08/20/wininet-ie-cookie-internals-faq.aspx)) + +This means one cannot set a path using `window.location.pathname` in case such pathname contains a filename like so: `/check.html` (or at least, such cookie cannot be read correctly). + +In fact, you should never allow untrusted input to set the cookie attributes or you might be exposed to a [XSS attack](https://github.com/js-cookie/js-cookie/issues/396). + +### domain + +A [`String`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String) indicating a valid domain where the cookie should be visible. The cookie will also be visible to all subdomains. + +**Default:** Cookie is visible only to the domain or subdomain of the page where the cookie was created, except for Internet Explorer (see below). + +**Examples:** + +Assuming a cookie that is being created on `site.com`: + +```javascript +Cookies.set('name', 'value', { domain: 'subdomain.site.com' }) +Cookies.get('name') // => undefined (need to read at 'subdomain.site.com') +``` + +**Note regarding Internet Explorer default behavior:** + +> Q3: If I don’t specify a DOMAIN attribute (for) a cookie, IE sends it to all nested subdomains anyway? +> A: Yes, a cookie set on example.com will be sent to sub2.sub1.example.com. +> Internet Explorer differs from other browsers in this regard. + +(From [Internet Explorer Cookie Internals (FAQ)](http://blogs.msdn.com/b/ieinternals/archive/2009/08/20/wininet-ie-cookie-internals-faq.aspx)) + +This means that if you omit the `domain` attribute, it will be visible for a subdomain in IE. + +### secure + +Either `true` or `false`, indicating if the cookie transmission requires a secure protocol (https). + +**Default:** No secure protocol requirement. + +**Examples:** + +```javascript +Cookies.set('name', 'value', { secure: true }) +Cookies.get('name') // => 'value' +Cookies.remove('name') +``` + +### sameSite + +A [`String`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String), allowing to control whether the browser is sending a cookie along with cross-site requests. + +Default: not set. + +**Note that more recent browsers are making "Lax" the default value even without specifiying anything here.** + +**Examples:** + +```javascript +Cookies.set('name', 'value', { sameSite: 'strict' }) +Cookies.get('name') // => 'value' +Cookies.remove('name') +``` + +### Setting up defaults + +```javascript +const api = Cookies.withAttributes({ path: '/', domain: '.example.com' }) +``` + +## Converters + +### Read + +Create a new instance of the api that overrides the default decoding implementation. All get methods that rely in a proper decoding to work, such as `Cookies.get()` and `Cookies.get('name')`, will run the given converter for each cookie. The returned value will be used as the cookie value. + +Example from reading one of the cookies that can only be decoded using the `escape` function: + +```javascript +document.cookie = 'escaped=%u5317' +document.cookie = 'default=%E5%8C%97' +var cookies = Cookies.withConverter({ + read: function (value, name) { + if (name === 'escaped') { + return unescape(value) + } + // Fall back to default for all other cookies + return Cookies.converter.read(value, name) + } +}) +cookies.get('escaped') // 北 +cookies.get('default') // 北 +cookies.get() // { escaped: '北', default: '北' } +``` + +### Write + +Create a new instance of the api that overrides the default encoding implementation: + +```javascript +Cookies.withConverter({ + write: function (value, name) { + return value.toUpperCase() + } +}) +``` + +## TypeScript declarations + +```bash +npm i @types/js-cookie +``` + +## Server-side integration + +Check out the [Servers Docs](SERVER_SIDE.md) + +## Contributing + +Check out the [Contributing Guidelines](CONTRIBUTING.md) + +## Security + +For vulnerability reports, send an e-mail to `js-cookie at googlegroups dot com` + +## Releasing + +Releasing should be done via the `Release` GitHub Actions workflow, so that published packages on npmjs.com have package provenance. + +GitHub releases are created as a draft and need to be published manually! +(This is so we are able to craft suitable release notes before publishing.) + +## Supporters + +

+ +

+ +Many thanks to [BrowserStack](https://www.browserstack.com/) for providing unlimited browser testing free of cost. + +## Authors + +- [Klaus Hartl](https://github.com/carhartl) +- [Fagner Brack](https://github.com/FagnerMartinsBrack) +- And awesome [contributors](https://github.com/js-cookie/js-cookie/graphs/contributors) diff --git a/node_modules/js-cookie/dist/js.cookie.js b/node_modules/js-cookie/dist/js.cookie.js new file mode 100644 index 00000000..373bef76 --- /dev/null +++ b/node_modules/js-cookie/dist/js.cookie.js @@ -0,0 +1,147 @@ +/*! js-cookie v3.0.5 | MIT */ +; +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = typeof globalThis !== 'undefined' ? globalThis : global || self, (function () { + var current = global.Cookies; + var exports = global.Cookies = factory(); + exports.noConflict = function () { global.Cookies = current; return exports; }; + })()); +})(this, (function () { 'use strict'; + + /* eslint-disable no-var */ + function assign (target) { + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i]; + for (var key in source) { + target[key] = source[key]; + } + } + return target + } + /* eslint-enable no-var */ + + /* eslint-disable no-var */ + var defaultConverter = { + read: function (value) { + if (value[0] === '"') { + value = value.slice(1, -1); + } + return value.replace(/(%[\dA-F]{2})+/gi, decodeURIComponent) + }, + write: function (value) { + return encodeURIComponent(value).replace( + /%(2[346BF]|3[AC-F]|40|5[BDE]|60|7[BCD])/g, + decodeURIComponent + ) + } + }; + /* eslint-enable no-var */ + + /* eslint-disable no-var */ + + function init (converter, defaultAttributes) { + function set (name, value, attributes) { + if (typeof document === 'undefined') { + return + } + + attributes = assign({}, defaultAttributes, attributes); + + if (typeof attributes.expires === 'number') { + attributes.expires = new Date(Date.now() + attributes.expires * 864e5); + } + if (attributes.expires) { + attributes.expires = attributes.expires.toUTCString(); + } + + name = encodeURIComponent(name) + .replace(/%(2[346B]|5E|60|7C)/g, decodeURIComponent) + .replace(/[()]/g, escape); + + var stringifiedAttributes = ''; + for (var attributeName in attributes) { + if (!attributes[attributeName]) { + continue + } + + stringifiedAttributes += '; ' + attributeName; + + if (attributes[attributeName] === true) { + continue + } + + // Considers RFC 6265 section 5.2: + // ... + // 3. If the remaining unparsed-attributes contains a %x3B (";") + // character: + // Consume the characters of the unparsed-attributes up to, + // not including, the first %x3B (";") character. + // ... + stringifiedAttributes += '=' + attributes[attributeName].split(';')[0]; + } + + return (document.cookie = + name + '=' + converter.write(value, name) + stringifiedAttributes) + } + + function get (name) { + if (typeof document === 'undefined' || (arguments.length && !name)) { + return + } + + // To prevent the for loop in the first place assign an empty array + // in case there are no cookies at all. + var cookies = document.cookie ? document.cookie.split('; ') : []; + var jar = {}; + for (var i = 0; i < cookies.length; i++) { + var parts = cookies[i].split('='); + var value = parts.slice(1).join('='); + + try { + var found = decodeURIComponent(parts[0]); + jar[found] = converter.read(value, found); + + if (name === found) { + break + } + } catch (e) {} + } + + return name ? jar[name] : jar + } + + return Object.create( + { + set, + get, + remove: function (name, attributes) { + set( + name, + '', + assign({}, attributes, { + expires: -1 + }) + ); + }, + withAttributes: function (attributes) { + return init(this.converter, assign({}, this.attributes, attributes)) + }, + withConverter: function (converter) { + return init(assign({}, this.converter, converter), this.attributes) + } + }, + { + attributes: { value: Object.freeze(defaultAttributes) }, + converter: { value: Object.freeze(converter) } + } + ) + } + + var api = init(defaultConverter, { path: '/' }); + /* eslint-enable no-var */ + + return api; + +})); diff --git a/node_modules/js-cookie/dist/js.cookie.min.js b/node_modules/js-cookie/dist/js.cookie.min.js new file mode 100644 index 00000000..962d48d0 --- /dev/null +++ b/node_modules/js-cookie/dist/js.cookie.min.js @@ -0,0 +1,2 @@ +/*! js-cookie v3.0.5 | MIT */ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self,function(){var n=e.Cookies,o=e.Cookies=t();o.noConflict=function(){return e.Cookies=n,o}}())}(this,(function(){"use strict";function e(e){for(var t=1;t=14" + } +} diff --git a/threadpool/console-new/.eslintrc.js b/threadpool/console-new/.eslintrc.js index 38eb2edf..92c71e51 100644 --- a/threadpool/console-new/.eslintrc.js +++ b/threadpool/console-new/.eslintrc.js @@ -26,5 +26,7 @@ module.exports = { '@typescript-eslint/no-explicit-any': 0, '@typescript-eslint/no-non-null-assertion': 0, '@typescript-eslint/no-var-requires': 0, + 'import/no-anonymous-default-export': 0, + 'jsx-a11y/anchor-is-valid': 0, }, }; diff --git a/threadpool/console-new/.prettierignore b/threadpool/console-new/.prettierignore index 353efa09..473d9c18 100644 --- a/threadpool/console-new/.prettierignore +++ b/threadpool/console-new/.prettierignore @@ -1,3 +1,4 @@ /.git node_modules -build \ No newline at end of file +build +src/lib/* \ No newline at end of file diff --git a/threadpool/console-new/craco.config.js b/threadpool/console-new/craco.config.js index 5ad94a67..f06ec6af 100644 --- a/threadpool/console-new/craco.config.js +++ b/threadpool/console-new/craco.config.js @@ -1,4 +1,3 @@ -// craco.config.js const CracoLessPlugin = require('craco-less'); const lessModuleRegex = /\.module\.less$/; const path = require('path'); @@ -33,20 +32,29 @@ module.exports = { }, }, ], - // style: { - // modules: { - // localIdentName: '[local]_[hash:base64:5]', // 可以自定义你的类名生成规则 - // }, - // }, webpack: { alias: { '@': resolve('src'), }, }, devServer: { - port: 3001, + port: 3000, headers: { 'Access-Control-Allow-Origin': '*', }, + proxy: { + '/hippo4j/v1/cs': { + target: 'http://console.hippo4j.cn:6691/hippo4j/v1/cs', + pathRewrite: { '^/hippo4j/v1/cs': '' }, + changeOrigin: true, + secure: false, + onProxyReq: proxyReq => { + console.log(`Proxying request to: ${proxyReq.path}`); + }, + onProxyRes: proxyRes => { + console.log(`Received response with status: ${proxyRes.statusCode}`); + }, + }, + }, }, }; diff --git a/threadpool/console-new/package.json b/threadpool/console-new/package.json index 353e4cf1..a3668743 100644 --- a/threadpool/console-new/package.json +++ b/threadpool/console-new/package.json @@ -10,6 +10,7 @@ "@testing-library/user-event": "^13.5.0", "ahooks": "^3.7.8", "antd": "^5.4.7", + "classnames": "^2.3.2", "dayjs": "^1.11.9", "i18next": "^23.5.1", "i18next-browser-languagedetector": "^7.1.0", @@ -66,6 +67,7 @@ "eslint-plugin-jsx-a11y": "^6.7.1", "eslint-plugin-prettier": "^4.2.1", "eslint-plugin-react": "^7.32.2", + "http-proxy-middleware": "^2.0.6", "husky": "^8.0.0", "less-loader": "^11.1.0", "lint-staged": "^13.2.2", diff --git a/threadpool/console-new/src/App.tsx b/threadpool/console-new/src/App.tsx index d03544f5..3dba11da 100644 --- a/threadpool/console-new/src/App.tsx +++ b/threadpool/console-new/src/App.tsx @@ -1,8 +1,6 @@ import LayoutCom from './components/layout-com'; import { Routes, Route, Link } from 'react-router-dom'; - import routeList from './route'; -import Login from '@/page/login'; import { MenuProps } from 'antd'; import { useTran } from './hooks'; import { STR_MAP } from './config/i18n/locales/constants'; @@ -23,9 +21,8 @@ const App = () => { ]; return ( - + - {routeList.map(item => ( ))} diff --git a/threadpool/console-new/src/components/header/index.module.less b/threadpool/console-new/src/components/header/index.module.less index e4cf7f42..07c850e0 100644 --- a/threadpool/console-new/src/components/header/index.module.less +++ b/threadpool/console-new/src/components/header/index.module.less @@ -5,7 +5,7 @@ .logo { display: flex; flex-direction: column; - width: 200px; + width: 50px; img { flex: 1; object-fit: contain; diff --git a/threadpool/console-new/src/components/header/index.tsx b/threadpool/console-new/src/components/header/index.tsx index dddb3252..fdea38d5 100644 --- a/threadpool/console-new/src/components/header/index.tsx +++ b/threadpool/console-new/src/components/header/index.tsx @@ -2,13 +2,16 @@ import React, { useContext } from 'react'; import style from './index.module.less'; import { UserOutlined } from '@ant-design/icons'; import { Avatar, Button, Col, Dropdown, Row, Switch } from 'antd'; -import { useThemeMode } from '@/hooks'; import { MyContext } from '@/context'; import IconFont from '@/components/icon'; +import { LANG_NAME, MyStoreValues, THEME_NAME } from '@/typings'; +import { useNavigate } from 'react-router-dom'; const HeaderChild = () => { - const { isDark, setIsDark } = useThemeMode(); - const { lang, setLang } = useContext(MyContext); + const { lang, themeName, setLang, setThemeName } = useContext(MyContext); + const navigate = useNavigate(); + // console.log('setLang:::', setLang); + // setLang && setLang(LANG_NAME.EN); const items = [ { @@ -29,18 +32,14 @@ const HeaderChild = () => { }, { key: '3', - label: ( - - 登出 - - ), + label: navigate('/login')}>登出, }, ]; return (
-
- +
navigate('/home')}> +
@@ -51,18 +50,10 @@ const HeaderChild = () => { - {/* { - lang === 'zh' ? setLang('en') : setLang('zh'); - }} - style={{ cursor: 'pointer' }} - > - {lang === 'zh' ? 'zh' : 'en'} - */} +
+ + + + + + ), + [form, loading, handleLogin] + ); + + const items: TabsProps['items'] = [ + { + key: TABS_KEY.LOGIN, + label: '账号密码登陆', + children: formNode, + }, + { + key: TABS_KEY.PHONE, + label: '手机号登陆', + children: formNode, + }, + ]; + return ( +
+
+
+
+ +
+ 全球最好用的线程池管理工具 +
+ +
+
+
+ ); }; export default Login; diff --git a/threadpool/console-new/src/page/login/router.ts b/threadpool/console-new/src/page/login/router.ts new file mode 100644 index 00000000..143acaaf --- /dev/null +++ b/threadpool/console-new/src/page/login/router.ts @@ -0,0 +1,6 @@ +import { IRouterList } from '@/typings'; +import Login from '.'; + +const routerList: IRouterList[] = [{ path: '/login', component: Login }]; + +export default routerList; diff --git a/threadpool/console-new/src/page/login/service.ts b/threadpool/console-new/src/page/login/service.ts new file mode 100644 index 00000000..0e9c9426 --- /dev/null +++ b/threadpool/console-new/src/page/login/service.ts @@ -0,0 +1,13 @@ +import request from '@/utils'; + +const fetchLogin = async (body: any) => { + const { data } = await request<{ data: string; roles: string[] }>('/hippo4j/v1/cs/auth/login', { + method: 'POST', + body, + }); + return data; +}; + +export default { + fetchLogin, +}; diff --git a/threadpool/console-new/src/react-app-env.d.ts b/threadpool/console-new/src/react-app-env.d.ts index bb172a71..6ab136be 100644 --- a/threadpool/console-new/src/react-app-env.d.ts +++ b/threadpool/console-new/src/react-app-env.d.ts @@ -1,2 +1,3 @@ /// declare module '*.less'; +declare module 'crypto-browserify' {} diff --git a/threadpool/console-new/src/route/index.tsx b/threadpool/console-new/src/route/index.tsx index 8f0f3c93..ef982b89 100644 --- a/threadpool/console-new/src/route/index.tsx +++ b/threadpool/console-new/src/route/index.tsx @@ -3,6 +3,7 @@ import homeRouter from '@/page/home/router'; import aboutRouter from '@/page/about/router'; import ThreadPoolRouter from '@/page/thread-pool/router'; import tenantRouter from '@/page/tenant/router'; +import LoginRouter from '@/page/login/router'; -const routerList: IRouterList[] = [...homeRouter, ...aboutRouter, ...tenantRouter, ...ThreadPoolRouter]; +const routerList: IRouterList[] = [...homeRouter, ...aboutRouter, ...tenantRouter, ...ThreadPoolRouter, ...LoginRouter]; export default routerList; diff --git a/threadpool/console-new/src/typings/index.ts b/threadpool/console-new/src/typings/index.ts index 6c1f658c..d7610df2 100644 --- a/threadpool/console-new/src/typings/index.ts +++ b/threadpool/console-new/src/typings/index.ts @@ -1,6 +1,16 @@ import { ReactNode } from 'react'; import React from 'react'; +export enum THEME_NAME { + DEFAULT = 'default', + DARK = 'dark', +} + +export enum LANG_NAME { + ZH = 'zh', + EN = 'en', +} + export type IRouterList = { path: string; component: () => React.JSX.Element; @@ -11,3 +21,10 @@ export type IMenuList = { key: string; icon?: ReactNode; }; + +export interface MyStoreValues { + themeName?: THEME_NAME | undefined; + lang?: LANG_NAME; + setThemeName?: (name: THEME_NAME) => void; + setLang?: (lang: LANG_NAME) => void; +} diff --git a/threadpool/console-new/src/utils/common/index.ts b/threadpool/console-new/src/utils/common/index.ts index 8085a28c..f4bcc58a 100644 --- a/threadpool/console-new/src/utils/common/index.ts +++ b/threadpool/console-new/src/utils/common/index.ts @@ -1,4 +1,42 @@ +import Cookie from 'js-cookie'; +// import { Buffer } from 'buffer'; +// import crypto from 'crypto-browserify'; + +// /** +// * generate key +// * @returns {string} key(length 16) +// */ +// export function genKey() { +// let chars = 'abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'; +// let result = ''; +// for (let i = 16; i > 0; --i) result += chars[Math.floor(Math.random() * chars.length)]; +// return result; +// } +// /** +// * encode message +// * @param msg message +// * @param key key +// * @returns {string} encoded message +// */ +// export function encrypt(msg: string, key: string) { +// try { +// let pwd = Buffer.from(key); +// let iv = (crypto as any).randomBytes(12); +// let cipher = (crypto as any).createCipheriv('aes-128-gcm', pwd, iv); +// let enc = cipher.update(msg, 'utf8', 'base64'); +// enc += cipher.final('base64'); +// let tags = cipher.getAuthTag(); +// enc = Buffer.from(enc, 'base64') as any; +// let totalLength = iv.length + enc.length + tags.length; +// let bufferMsg = Buffer.concat([iv, enc as any, tags], totalLength); +// return bufferMsg.toString('base64'); +// } catch (e) { +// console.log('Encrypt is error', e); +// return null; +// } +// } // is plain object +const TokenKey = 'Admin-Token'; const isPlainObject = (obj: { [key: string]: any }): boolean => { let proto, Ctor; if (!obj || typeof obj !== 'object') return false; @@ -8,4 +46,8 @@ const isPlainObject = (obj: { [key: string]: any }): boolean => { return typeof Ctor === 'function' && Ctor === Object; // insure is new by Object or {} }; -export { isPlainObject }; +const setToken = (token: string) => { + Cookie.set(TokenKey, token); +}; + +export { isPlainObject, setToken }; diff --git a/threadpool/console-new/src/utils/request/index.ts b/threadpool/console-new/src/utils/request/index.ts index 22a2a2c6..68c3011c 100644 --- a/threadpool/console-new/src/utils/request/index.ts +++ b/threadpool/console-new/src/utils/request/index.ts @@ -32,7 +32,7 @@ type Response = { code?: string | number; }; -let baseURL = 'http://127.0.0.1:9999'; +let baseURL = ''; const inital: RequestOptions = { method: 'GET', @@ -40,6 +40,8 @@ const inital: RequestOptions = { body: null, headers: { 'Content-Type': 'application/json', + Authorization: + 'Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxMCxiYW94aW55aV91c2VyIiwiaXNzIjoiYWRtaW4iLCJleHAiOjE2OTU3MzAwNzYsImlhdCI6MTY5NTEyNTI3Niwicm9sIjoiUk9MRV9VU0VSIn0.4cWyhllP7u-aoRAIHs3nMggsgl4-LUCVBas8WE0FJYIe-YNS0wGf1_0RJq3TUGw00KmSaSRPKdoPgRTFqEphZA', }, credentials: true, responseType: 'JSON', @@ -115,6 +117,7 @@ function request(url: string, config: RequestOptions): Promise> { } return fetch(url, config as any).then(function onfulfilled(response) { let { status, statusText } = response; + console.log('status:::', status, response); if (status >= 200 && status < 400) { let result; switch (responseType) { diff --git a/threadpool/console-new/yarn.lock b/threadpool/console-new/yarn.lock index dcdbc5fb..1ee03b49 100644 --- a/threadpool/console-new/yarn.lock +++ b/threadpool/console-new/yarn.lock @@ -5711,7 +5711,7 @@ http-proxy-agent@^4.0.1: agent-base "6" debug "4" -http-proxy-middleware@^2.0.3: +http-proxy-middleware@^2.0.3, http-proxy-middleware@^2.0.6: version "2.0.6" resolved "https://registry.npmmirror.com/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz#e1a4dd6979572c7ab5a4e4b55095d1f32a74963f" integrity sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==