Merge remote-tracking branch 'upstream/develop' into develop

pull/1513/head
Pan-YuJie 2 years ago
commit 53b430b97e

BIN
.DS_Store vendored

Binary file not shown.

@ -296,5 +296,21 @@
"homepage.introduction.thirdPartDesc": { "homepage.introduction.thirdPartDesc": {
"message": "支持自定义时长线程池运行数据采集存储,同时也支持 Prometheus、InfluxDB 等采集监控,通过 Grafana 或内置监控页面提供可视化大屏监控运行指标", "message": "支持自定义时长线程池运行数据采集存储,同时也支持 Prometheus、InfluxDB 等采集监控,通过 Grafana 或内置监控页面提供可视化大屏监控运行指标",
"description": "the desc for the third introduction part" "description": "the desc for the third introduction part"
},
"companyPage.title": {
"message": "谁在使用 Hippo4j ?",
"description": "the title for the company page"
},
"companyPage.descriptionText": {
"message": "非常感谢大家对 Hippo4j 的关注和支持,这是我们前进最大的动力。",
"description": "the description for the company page"
},
"companyPage.questionText": {
"message": "正在使用Hippo4j ?",
"description": "the text for the company question"
},
"companyPage.linkText": {
"message": "点击进行登记",
"description": "the text for the company page link"
} }
} }

@ -0,0 +1,101 @@
import React from "react";
import Layout from "@theme/Layout";
import companyData from "@site/static/json/company_logo.json";
import useBaseUrl from "@docusaurus/useBaseUrl";
import Translate from "@docusaurus/Translate";
function CompanyCards({ companies }) {
return (
<div className="grid sm:grid-cols-2 grid-cols-1 md:px-16 md:grid-cols-3 lg:grid-cols-5 gap-4 mb-16 lg:px-2 px-10">
{companies.map((company) => (
<div
onClick={() => window.open(company.url)}
key={company.url}
className="bg-white rounded-lg overflow-hidden shadow-sm transform cursor-pointer transition-all duration-500 hover:scale-110"
style={{ border: "1px solid #E5E7EB" }}
>
<div className="flex dark:text-black items-center justify-center h-28">
<div
className="h-24 w-24 object-contain"
style={{ position: "relative" }}
>
<img
src={useBaseUrl(company.logo)}
alt={`${company.name}`}
className="h-24 w-24 object-contain"
onError={(e) => {
e.target.style.display = "none"; // Hide the image if it fails to load
e.target.nextSibling.style.display = "flex"; // Show the alt text
}}
/>
<div
className="flex items-center justify-center absolute inset-0 text-center"
style={{
display: "none", // Hide the alt text by default
}}
>
{company.name}
</div>
</div>
</div>
</div>
))}
</div>
);
}
export default function OurUsers() {
return (
<Layout title="OurUsers" description="companies using our product">
<div className="max-w-screen-lg mx-auto dark:text-white">
{/* text description*/}
<div className="max-w-screen-sm sm:mx-auto mx-10 text-center my-8 ">
<div className="text-center mt-8">
<h2 className="text-3xl font-bold mb-4">
<Translate
id="companyPage.title"
description="the title for the company page"
>
Who is using Hippo4j?
</Translate>
</h2>
<div
className="mx-auto h-1 bg-gradient-to-r from-green-400 to-blue-500 mb-4"
style={{ width: "30%" }}
></div>
</div>
<div className="flex flex-col items-center mx-auto">
<p className="text-lg mb-2 max-w-1/2" style={{ lineHeight: "1.5" }}>
<Translate
id="companyPage.descriptionText"
description="the description for the company page"
>
Thank you very much for your attention and support to Hippo4j.
This is our greatest motivation to move forward.
</Translate>{" "}
</p>
<p className="text-lg mb-4 max-w-1/2" style={{ lineHeight: "1.5" }}>
<Translate
id="companyPage.questionText"
description="the text for the company question"
>
Are you using Hippo4j?
</Translate>{" "}
<a
href="https://github.com/opengoofy/hippo4j/issues/13"
className="text-blue-500 hover:text-blue-700 font-bold"
>
<Translate
id="companyPage.linkText"
description="the text for the company page link"
>
Click to register
</Translate>
</a>
</p>
</div>
</div>
{/* company logo display */}
<CompanyCards companies={companyData} className="ml-0" />
</div>
</Layout>
);
}

@ -86,4 +86,12 @@ public interface BootstrapPropertiesInterface {
default Map<String, String> getEtcd() { default Map<String, String> getEtcd() {
return null; return null;
} }
/**
* Get apollo.
*/
default Map<String, String> getApollo(){
return null;
}
} }

BIN
threadpool/.DS_Store vendored

Binary file not shown.

@ -1,5 +0,0 @@
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"
echo "pre-commit";
npm run lint;

@ -39,11 +39,8 @@ module.exports = {
}, },
}, },
devServer: { devServer: {
// 本地服务的端口号
port: 3001, port: 3001,
// 本地服务的响应头设置
headers: { headers: {
// 允许跨域
'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Origin': '*',
}, },
}, },

File diff suppressed because it is too large Load Diff

@ -6,7 +6,9 @@
"@testing-library/jest-dom": "^5.16.5", "@testing-library/jest-dom": "^5.16.5",
"@testing-library/react": "^13.4.0", "@testing-library/react": "^13.4.0",
"@testing-library/user-event": "^13.5.0", "@testing-library/user-event": "^13.5.0",
"ahooks": "^3.7.8",
"antd": "^5.4.7", "antd": "^5.4.7",
"axios": "^1.5.0",
"react": "^18.2.0", "react": "^18.2.0",
"react-dom": "^18.2.0", "react-dom": "^18.2.0",
"react-router-dom": "^6.11.1", "react-router-dom": "^6.11.1",
@ -18,8 +20,7 @@
"build": "craco build", "build": "craco build",
"test": "react-scripts test", "test": "react-scripts test",
"eject": "react-scripts eject", "eject": "react-scripts eject",
"lint": "eslint -c .eslintrc.js src --ext .ts,.tsx,.js,.jsx --fix", "lint": "eslint -c .eslintrc.js src --ext .ts,.tsx,.js,.jsx --fix"
"prepare": "husky install"
}, },
"eslintConfig": { "eslintConfig": {
"extends": [ "extends": [
@ -41,6 +42,7 @@
}, },
"devDependencies": { "devDependencies": {
"@craco/craco": "^7.1.0", "@craco/craco": "^7.1.0",
"@types/http-errors": "^2.0.1",
"@types/jest": "^27.5.2", "@types/jest": "^27.5.2",
"@types/node": "^16.18.26", "@types/node": "^16.18.26",
"@types/react": "^18.2.6", "@types/react": "^18.2.6",

@ -0,0 +1,128 @@
import request from "../axios/request"
export function userLogin(data) {
return request('post', '/hippo4j/v1/cs/auth/login', data)
}
export function getInfo() {
return request('get', '/hippo4j/v1/cs/user/info')
}
export function logout() {
return request('post', '/hippo4j/v1/cs/user/logout')
}
function islogin({commit}, userInfo) {
const {username, password} = userInfo
return new Promise((resolve, reject) => {
let key = genKey()
let encodePassword = encrypt(password, key)
key = key.split("").reverse().join("")
login({username: username.trim(), password: encodePassword, tag: key, rememberMe: 1})
.then((response) => {
const {data} = response
const {roles} = response
commit('SET_TOKEN', data)
localStorage.setItem('roles', JSON.stringify(roles))
localStorage.setItem('USER_ROLE', roles[0])
setToken(data)
resolve()
})
.catch((error) => {
// alert('登录失败')
reject(error)
})
})
}
// get user info
function getInfo({commit, state}) {
return new Promise((resolve, reject) => {
const data = {}
data.roles = JSON.parse(localStorage.getItem('roles'))
commit('SET_ROLES', data.roles)
resolve(data)
})
}
// user logout
function logout({commit, state}) {
// return new Promise((resolve, reject) => {
// logout(state.token).then(() => {
// commit('SET_TOKEN', '')
// commit('SET_ROLES', [])
// removeToken()
// resetRouter()
// resolve()
// }).catch(error => {
// reject(error)
// })
// })
return new Promise((resolve) => {
commit('SET_TOKEN', '')
commit('SET_ROLES', [])
removeToken()
resetRouter()
resolve()
})
}
// remove token
function resetToken({commit}) {
return new Promise((resolve) => {
commit('SET_TOKEN', '')
commit('SET_ROLES', [])
removeToken()
resolve()
})
}
// dynamically modify permissions
function changeRoles({commit, dispatch}, role) {
return new Promise(async (resolve) => {
const token = role + '-token'
commit('SET_TOKEN', token)
setToken(token)
const {roles} = await dispatch('getInfo')
resetRouter()
// generate accessible routes map based on roles
const accessRoutes = await dispatch('permission/generateRoutes', roles, {root: true})
// dynamically add accessible routes
router.addRoutes(accessRoutes)
// reset visited views and cached views
dispatch('tagsView/delAllViews', null, {root: true})
resolve()
})
}
const mutations = {
SET_TOKEN: (state, token) => {
state.token = token
},
SET_INTRODUCTION: (state, introduction) => {
state.introduction = introduction
},
SET_NAME: (state, name) => {
state.name = name
},
SET_AVATAR: (state, avatar) => {
state.avatar = avatar
},
SET_ROLES: (state, roles) => {
state.roles = roles
},
}
export default {
userLogin,
getInfo,
logout,
}

@ -1,7 +1,33 @@
import LayoutCom from './components/layout-com'; import LayoutCom from './components/layout-com';
import { Routes, Route } from 'react-router-dom';
import routeList from './route';
import Login from '@/page/login';
import { AppstoreOutlined, MailOutlined } from '@ant-design/icons';
function App() { const sideMenuList = [
return <LayoutCom></LayoutCom>; {
} label: <a href="/about">about</a>,
key: 'mail',
icon: <MailOutlined />,
},
{
label: <a href="/home"></a>,
key: 'app',
icon: <AppstoreOutlined />,
},
];
const App = () => {
return (
<LayoutCom sideMenuList={sideMenuList} isSider={false}>
<Routes>
<Route path="/Login" Component={Login}></Route>
{routeList.map(item => (
<Route key={item.path} path={item.path} Component={item.component} />
))}
</Routes>
</LayoutCom>
);
};
export default App; export default App;

@ -0,0 +1,4 @@
const devBaseUrl = 'http://console.hippo4j.cn:6691/hippo4j/v1/cs'
const proBaseUrl = 'http://console.hippo4j.cn:6691/hippo4j/v1/cs '
export const BASE_URL = process.env.NODE_ENV === 'development' ? devBaseUrl : proBaseUrl
export const TIMEOUT = 5000

@ -0,0 +1,192 @@
import axios from 'axios';
import { BASE_URL, TIMEOUT } from './config';
const instance = axios.create({
baseURL: BASE_URL,
timeout: TIMEOUT,
});
instance.interceptors.request.use(
config => {
config.data = JSON.stringify(config.data);
config.headers = {
'Content-Type': 'application/json',
}
return config
}, err => {
return Promise.reject(err)
}
);
instance.interceptors.response.use(
res => {
if (res.code === 'A000004') {
removeToken()
resetRouter()
alert(res.message)
document.location.href = 'index.html'
} else if (res.code !== '20000' && res.code !== '0' && res.code !== '200') {
Message({
message: res.message || 'Error',
type: 'error',
duration: 5 * 1000
})
// 50008: Illegal token; 50012: Other clients logged in; 50014: Token expired;
if (res.code === '50008' || res.code === '50012' || res.code === '50014') {
// to re-login
MessageBox.confirm('You have been logged out, you can cancel to stay on this page, or log in again', 'Confirm logout', {
confirmButtonText: 'Re-Login',
cancelButtonText: 'Cancel',
type: 'warning'
}).then(() => {
store.dispatch('user/resetToken').then(() => {
location.reload()
})
})
}
console.log(res)
return Promise.reject(new Error(res.message || 'Error'))
} else {
const { data } = response
const { code } = data
// 状态码为0||200表示api成功
if (code === '0') {
const { data: res } = data
return res
} else if (code === '200') {
return data
} else {
// 返回数据
return res
}
}
return response
}, err => {
console.log('err' + err) // for debug
Message({
message: error.message,
type: 'error',
duration: 5 * 1000
})
return Promise.reject(err)
}
);
/**
* 封装get
* @param {String} url
* @param {String} param
* @returns
*/
export function get(url, param = {}) {
return new Promise(
(resolve, reject) => {
axios.get(url, {
params: param
}).then((response) => {
console.log("get error: url, params, state",url, params, response.data)
resolve(response.data)
}).catch(err => {
msg(err)
reject(err)
})
}
);
}
/**
*
* 封装post
* @param {String} url
* @param {Object} param
* @returns {Promise}
*/
export function post(url, param) {
return new Promise(
(resolve, reject) => {
axios.post(url, param).then(response => {
resolve(response.data)
}, err => {
reject(err)
})
}
);
}
export default function (fecth, url, param) {
return new Promise(
(resolve, reject) => {
switch(fecth) {
case "get":
console.log("a get request, url:", url)
get(url, param)
.then(response => {
resolve(response)
}).catch(err => {
console.log("GET request error, err:", err)
reject(err)
})
break
case "post":
post(url, param)
.then(response => {
resolve(response)
}).catch(err => {
console.log("POST request error, err:", err)
reject(err)
})
break
default:
break
}
}
);
}
function msg(err) {
if (err && err.response) {
switch (err.response.status) {
case 400:
alert(err.response.data.error.details);
break;
case 401:
alert("未授权,请登录");
break;
case 403:
alert("拒绝访问");
break;
case 404:
alert("请求地址出错");
break;
case 408:
alert("请求超时");
break;
case 500:
alert("服务器内部错误");
break;
case 501:
alert("服务未实现");
break;
case 502:
alert("网关错误");
break;
case 503:
alert("服务不可用");
break;
case 504:
alert("网关超时");
break;
case 505:
alert("HTTP版本不受支持");
break;
default:
}
}
}

@ -0,0 +1,25 @@
"use strict";
exports.__esModule = true;
var react_1 = require("react");
var styled_components_1 = require("styled-components");
var antd_1 = require("antd");
var useThemeMode_1 = require("@/hooks/useThemeMode");
var index_module_less_1 = require("./index.module.less");
var Header = antd_1.Layout.Header, Sider = antd_1.Layout.Sider, Content = antd_1.Layout.Content;
var LayoutCom = function (props) {
var sideMenuList = props.sideMenuList, children = props.children, _a = props.isSider, isSider = _a === void 0 ? true : _a;
var myThemes = react_1.useContext(styled_components_1.ThemeContext);
var _b = react_1.useState('mail'), current = _b[0], setCurrent = _b[1];
var onClick = function (e) {
setCurrent(e.key);
};
var setIsDark = useThemeMode_1["default"]()[0];
return (React.createElement("main", { className: index_module_less_1["default"].container, style: { backgroundColor: myThemes.backgroundColor.bg1 } },
React.createElement(Header, { className: index_module_less_1["default"].header, style: { backgroundColor: myThemes.backgroundColor.bg2 } },
React.createElement(antd_1.Button, { onClick: function () { return setIsDark(function (pre) { return !pre; }); } }, "\u5207\u6362\u4E3B\u9898")),
React.createElement(antd_1.Layout, { style: { backgroundColor: myThemes.backgroundColor.bg1, height: 'calc(100vh - 64px)' } },
isSider && (React.createElement(Sider, { className: index_module_less_1["default"].sider, style: { backgroundColor: myThemes.backgroundColor.bg1 } },
React.createElement(antd_1.Menu, { onClick: onClick, selectedKeys: [current], mode: "inline", items: sideMenuList }))),
React.createElement(Content, { className: index_module_less_1["default"].content }, children))));
};
exports["default"] = LayoutCom;

@ -1,19 +1,18 @@
.container { .container {
width: 100vw; width: 100vw;
height: 100vh; height: 100vh;
background-color: #eee;
color: #fff;
.header { .header {
height: 48px; height: 48px;
box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.01), 0 3px 6px 3px rgba(0, 0, 0, 0.01), 0 2px 6px 0 rgba(0, 0, 0, 0.03); box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.01), 0 3px 6px 3px rgba(0, 0, 0, 0.01), 0 2px 6px 0 rgba(0, 0, 0, 0.03);
} }
.sider { .sider {
height: calc(100vh - 48px); height: calc(100vh - 48px);
display: flex; padding-top: 24px;
flex-direction: column;
justify-content: center;
} }
.content { .content {
margin: 24px; margin: 10px 10px 0px;
border-radius: 12px 12px 0 0;
min-height: 100%;
flex: 1;
} }
} }

@ -1,118 +1,37 @@
import React, { useEffect, useState, useContext } from 'react'; import { useState, useContext, ReactNode } from 'react';
import { DefaultTheme, ThemeContext } from 'styled-components'; import { DefaultTheme, ThemeContext } from 'styled-components';
import { Layout, Button, Menu } from 'antd';
import { Layout, Button, Menu, Table } from 'antd'; import useThemeMode from '@/hooks/useThemeMode';
import { Routes, Route, Link } from 'react-router-dom'; import { IMenuList } from '@/typings';
import Home from '@/page/home';
import About from '@/page/about';
import Login from '@/page/login';
import style from './index.module.less'; import style from './index.module.less';
import TableBox from '../table';
import Search from '@/page/search';
import { AppstoreOutlined, MailOutlined, SettingOutlined } from '@ant-design/icons';
import { THEME_NAME, MyThemeContext } from '@/context/themeContext';
const { Header, Sider, Content } = Layout; const { Header, Sider, Content } = Layout;
interface ThemeProps { interface ILayoutCom {
children: React.ReactNode; children?: ReactNode;
sideMenuList: IMenuList[];
isSider?: boolean;
} }
const LayoutCom = (props: ILayoutCom) => {
const items = [ const { sideMenuList, children, isSider = true } = props;
{
label: <a href="/about">Navigation One</a>,
key: 'mail',
icon: <MailOutlined />,
},
{
label: 'Navigation Two',
key: 'app',
icon: <AppstoreOutlined />,
disabled: true,
},
{
label: <a href="/about">Navigation One</a>,
key: 'app',
icon: <AppstoreOutlined />,
},
{
label: 'Navigation Three - Submenu',
key: 'SubMenu',
icon: <SettingOutlined />,
children: [
{
type: 'group',
label: 'Item 1',
children: [
{
label: 'Option 1',
key: 'setting:1',
},
{
label: 'Option 2',
key: 'setting:2',
},
],
},
{
type: 'group',
label: 'Item 2',
children: [
{
label: 'Option 3',
key: 'setting:3',
},
{
label: 'Option 4',
key: 'setting:4',
},
],
},
],
},
{
label: (
<a href="https://ant.design" target="_blank" rel="noopener noreferrer">
Navigation Four - Link
</a>
),
key: 'alipay',
},
];
const LayoutCom = () => {
const myThemes: DefaultTheme = useContext<any>(ThemeContext); const myThemes: DefaultTheme = useContext<any>(ThemeContext);
const { themeName, setThemeName } = useContext<any>(MyThemeContext);
const [current, setCurrent] = useState('mail'); const [current, setCurrent] = useState('mail');
const onClick = (e: any) => { const onClick = (e: any) => {
console.log('click ', e);
setCurrent(e.key); setCurrent(e.key);
}; };
const [isDark, setIsDark] = useState(false); const [setIsDark] = useThemeMode();
useEffect(() => {
isDark ? setThemeName(THEME_NAME.DARK) : setThemeName(THEME_NAME.DEFAULT);
}, [isDark, setThemeName]);
return ( return (
<main className={style.container} style={{ backgroundColor: myThemes.backgroundColor.bg1 }}> <main className={style.container} style={{ backgroundColor: myThemes.backgroundColor.bg1 }}>
<Header className={style.header} style={{ backgroundColor: myThemes.backgroundColor.bg1 }}> <Header className={style.header} style={{ backgroundColor: myThemes.backgroundColor.bg2 }}>
<Button onClick={() => setIsDark(pre => !pre)}></Button> <Button onClick={() => setIsDark(pre => !pre)}></Button>
</Header> </Header>
<Layout> <Layout style={{ backgroundColor: myThemes.backgroundColor.bg1, height: 'calc(100vh - 64px)' }}>
<Sider className={style.sider} style={{ backgroundColor: myThemes.backgroundColor.bg1 }}> {isSider && (
<Menu onClick={onClick} selectedKeys={[current]} mode="inline" items={items} /> <Sider className={style.sider} style={{ backgroundColor: myThemes.backgroundColor.bg1 }}>
</Sider> <Menu onClick={onClick} selectedKeys={[current]} mode="inline" items={sideMenuList} />
<Content className={style.content}> </Sider>
<Routes> )}
<Route path="/Search" Component={Search}></Route> <Content className={style.content}>{children}</Content>
<Route path="/Table" Component={TableBox}></Route>
<Route path="/Login" Component={Login}></Route>
<Route path="/home" Component={Home}></Route>
<Route path="/about" Component={About}></Route>
</Routes>
</Content>
</Layout> </Layout>
</main> </main>
); );

@ -0,0 +1,26 @@
"use strict";
exports.__esModule = true;
var layout_com_1 = require("./components/layout-com");
var react_router_dom_1 = require("react-router-dom");
var route_1 = require("./route");
var login_1 = require("@/page/login");
var icons_1 = require("@ant-design/icons");
var sideMenuList = [
{
label: React.createElement("a", { href: "/about" }, "about"),
key: 'mail',
icon: React.createElement(icons_1.MailOutlined, null)
},
{
label: React.createElement("a", { href: "/home" }, "\u4E3B\u9875"),
key: 'app',
icon: React.createElement(icons_1.AppstoreOutlined, null)
},
];
var App = function () {
return (React.createElement(layout_com_1["default"], { sideMenuList: sideMenuList, isSider: false },
React.createElement(react_router_dom_1.Routes, null,
React.createElement(react_router_dom_1.Route, { path: "/Login", Component: login_1["default"] }),
route_1["default"].map(function (item) { return (React.createElement(react_router_dom_1.Route, { key: item.path, path: item.path, Component: item.component })); }))));
};
exports["default"] = App;

@ -0,0 +1,16 @@
import { useContext, useEffect } from 'react';
import { useLocalStorageState } from 'ahooks';
import { MyThemeContext, THEME_NAME } from '@/context/themeContext';
const useThemeMode = () => {
const [isDark, setIsDark] = useLocalStorageState<boolean>('current-mode', { defaultValue: false });
const { setThemeName } = useContext<any>(MyThemeContext);
useEffect(() => {
isDark ? setThemeName(THEME_NAME.DARK) : setThemeName(THEME_NAME.DEFAULT);
}, [isDark, setThemeName]);
return [setIsDark];
};
export default useThemeMode;

@ -1,19 +1,3 @@
.container { body {
width: 100vw; background-color: #ebebf2;
height: 100vh;
background-color: #eee;
color: #fff;
.header {
height: 48px;
box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.01), 0 3px 6px 3px rgba(0, 0, 0, 0.01), 0 2px 6px 0 rgba(0, 0, 0, 0.03);
}
.sider {
height: calc(100vh - 48px);
display: flex;
flex-direction: column;
justify-content: center;
}
.content {
margin: 24px;
}
} }

@ -11,9 +11,9 @@ const root = ReactDOM.createRoot(document.getElementById('root') as HTMLElement)
root.render( root.render(
<React.StrictMode> <React.StrictMode>
<BrowserRouter> <BrowserRouter>
{/* 全局配置主体context */} {/* theme context */}
<ThemeStore> <ThemeStore>
{/* 提供主体色配置 */} {/* theme config context */}
<ThemeComponent> <ThemeComponent>
<App /> <App />
</ThemeComponent> </ThemeComponent>

@ -0,0 +1,11 @@
import { IRouterList } from '@/typings';
import About from '.';
const routerList: IRouterList[] = [
{
path: '/about',
component: About,
},
];
export default routerList;

@ -0,0 +1,5 @@
import Home from './index';
import { IRouterList } from '@/typings';
const routerList: IRouterList[] = [{ path: '/home', component: Home }];
export default routerList;

@ -0,0 +1,63 @@
"use strict";
exports.__esModule = true;
var antd_1 = require("antd");
var user_1 = require("../../API/user");
var Login = function (props) {
var data = {
passwordType: 'password',
capsTooltip: false,
loading: false,
showDialog: false,
redirect: undefined,
otherQuery: {},
loginForm: {
username: '',
password: ''
}
};
var validatePassword = function (_, value) {
if (value.length < 6) {
return Promise.reject(new Error('The password can not be less than 6 digits'));
}
else if (value.length > 72) {
return Promise.reject(new Error('The password can not be greater than 72 digits'));
}
return Promise.resolve();
};
var form = antd_1.Form.useForm()[0];
var onFinish = function () {
var loginParams = {
username: form.getFieldValue('username'),
password: form.getFieldValue('password'),
// username: 'baoxinyi_admin',
// password: 'baoxinyi_admin',
rememberMe: 1
};
data.loginForm.username = form.getFieldValue('username');
console.log('loginParams: ', loginParams);
data.loading = true;
user_1["default"](loginParams)
.then(function (resolve) {
console.log(resolve);
//登录成功后将当前登录用户写入cookie
// this.$cookie.set('userName', this.loginForm.username)
// console.log('success submit.')
// this.$router.push({ path: this.redirect || '/', query: this.otherQuery })
data.loading = false;
})["catch"](function (e) {
console.log('login error.', e);
data.loading = false;
});
};
return (React.createElement("div", { className: "login-container" },
React.createElement(antd_1.Form, { name: "loginForm", form: form, onFinish: onFinish, style: { maxWidth: 600 } },
React.createElement("div", { className: "title-container" },
React.createElement("h3", { className: "title" }, "\u4F60\u597D\u5440")),
React.createElement(antd_1.Form.Item, { name: "username", label: "\u7528\u6237\u540D", rules: [{ required: true, message: 'Username is required' }] },
React.createElement(antd_1.Input, { placeholder: "\u7528\u6237\u540D" })),
React.createElement(antd_1.Form.Item, { name: "password", label: "\u5BC6\u7801", rules: [{ validator: validatePassword }, { required: true, message: 'Street is required' }] },
React.createElement(antd_1.Input, { placeholder: "\u5BC6\u7801" })),
React.createElement(antd_1.Form.Item, { name: "submit" },
React.createElement(antd_1.Button, { type: "primary", htmlType: "submit", className: "login-button" }, "\u767B\u5F55")))));
};
exports["default"] = Login;

@ -1,7 +1,7 @@
import { Form, Input, Button } from 'antd'; import { Form, Input, Button } from 'antd'
import userLogin from '../../API/user'
const Login = () => { const Login = (props: any) => {
const [form] = Form.useForm();
const data = { const data = {
passwordType: 'password', passwordType: 'password',
capsTooltip: false, capsTooltip: false,
@ -13,40 +13,47 @@ const Login = () => {
username: '', username: '',
password: '', password: '',
}, },
loginRules: { // loginRules: {
// username: [{ required: true, trigger: 'blur', validator: validateUsername }], // // username: [{ required: true, trigger: 'blur', validator: validateUsername }],
// password: [{ required: true, trigger: 'blur', validator: this.validatePassword }], // // password: [{ required: true, trigger: 'blur', validator: this.validatePassword }],
}, // },
}; };
const validatePassword = (rule: any, value: string | any[], callback: (arg0: Error | undefined) => void) => { const validatePassword = (_: any, value: any) => {
if (value.length < 6) { if (value.length < 6) {
callback(new Error('The password can not be less than 6 digits')); return Promise.reject(new Error('The password can not be less than 6 digits'))
} else if (value.length > 72) { } else if (value.length > 72) {
callback(new Error('The password can not be greater than 72 digits')); return Promise.reject(new Error('The password can not be greater than 72 digits'))
} else {
// callback();
} }
return Promise.resolve()
}; };
const [form] = Form.useForm()
const onFinish = () => { const onFinish = () => {
let loginParams = { let loginParams = {
username: form.getFieldValue('username'), username: form.getFieldValue('username'),
password: form.getFieldValue('password'), password: form.getFieldValue('password'),
// username: 'baoxinyi_admin',
// password: 'baoxinyi_admin',
rememberMe: 1, rememberMe: 1,
};
data.loginForm.username = form.getFieldValue('username');
console.log('hhhhhh', loginParams);
};
const showPwd = () => {
if (data.passwordType === 'password') {
data.passwordType = '';
} else {
data.passwordType = 'password';
} }
// $nextTick(() => { data.loginForm.username = form.getFieldValue('username')
// $refs.password.focus(); console.log('loginParams: ', loginParams)
// });
data.loading = true
userLogin(loginParams)
.then((resolve: any) => {
console.log(resolve)
//登录成功后将当前登录用户写入cookie
// this.$cookie.set('userName', this.loginForm.username)
// console.log('success submit.')
// this.$router.push({ path: this.redirect || '/', query: this.otherQuery })
data.loading = false
})
.catch((e: any) => {
console.log('login error.',e)
data.loading = false
})
}; };
return ( return (
<div className="login-container"> <div className="login-container">
@ -58,7 +65,7 @@ const Login = () => {
<Form.Item name="username" label="用户名" rules={[{ required: true, message: 'Username is required' }]}> <Form.Item name="username" label="用户名" rules={[{ required: true, message: 'Username is required' }]}>
<Input placeholder="用户名" /> <Input placeholder="用户名" />
</Form.Item> </Form.Item>
<Form.Item name="password" label="密码" rules={[{ required: true, message: 'Street is required' }]}> <Form.Item name="password" label="密码" rules={[{validator: validatePassword}, {required: true, message: 'Street is required'}]}>
<Input placeholder="密码" /> <Input placeholder="密码" />
</Form.Item> </Form.Item>
<Form.Item name="submit"> <Form.Item name="submit">

@ -1,88 +1,2 @@
/// <reference types="react-scripts" /> /// <reference types="react-scripts" />
declare module '*.less'; declare module '*.less';
// import { DefaultTheme } from 'styled-components'
// export const lightDefaultTheme: DefaultTheme = {
// primary: "#3495EE",
// baseColor: {
// // 前两个是固定的,用于,有颜色按钮 字体颜色等固定不会变的颜色值
// bc1: "#fff",
// bc2: "#000000",
// bc3: "#ED2D00",
// bc4: "#10CC55",
// bc5: "#3094f1",
// },
// fontColor: {
// fc1: "#333",
// fc2: "#000",
// fc3: "#666",
// fc4: '#D2E0F4',
// fc5: "#000000",
// fc6: "#FFFFFF",
// },
// borderColor: {
// bl1: "#E2E2E2",
// bl2: "#d8dbe2",
// bl3: "#B5BDCE",
// },
// backgroundColor: {
// bg1: "#FFFFFF",
// bg2: "#EEEFF4",
// // title的及表格头部背景极
// bg3: "#EDEDED",
// bg5: "#F8F8F8",
// bg4: "#F6F6F6",
// bg6: "rgba(0, 0, 0, 0.70)",
// },
// hoverColor: {
// hc1: 'rgba(24, 144, 255, 0)',
// // 表格的hover及选 中
// hc2: '#F5F8FA'
// }
// }
// export const darkDefaultTheme: DefaultTheme = {
// primary: "#177DDC",
// baseColor: {
// bc1: "#fff",
// bc2: "#000000",
// bc3: "#FF3D3D",
// bc4: "#10CC55",
// bc5: "#3094f1",
// // 固定为白色,有颜色按钮文字颜色 fixedcolor
// },
// fontColor: {
// fc1: "#ffffff",
// fc2: "#B4B6B8",
// fc3: "#555555",
// fc4: '#666666',
// fc5: "#FFFFFF",
// fc6: "#FFFFFF",
// },
// borderColor: {
// bl1: "#6A6A6A",
// bl2: "#4A4B51",
// bl3: "#424242",
// },
// backgroundColor: {
// // 大面积色
// bg1: "#1C1D21",
// // tab顶部颜色
// bg2: "#323337",
// // title 颜色
// bg3: "#2A2B2E",
// bg5: "#4A4B51",
// // 菜单选中
// bg4: "#0F3C66",
// // 锁定背景色
// bg6: "rgba(255, 255, 255, 0.70)",
// // bg3: "rgba(255, 255, 255, 0.70)",
// // bg4: "rgba(250, 250, 250, 1)",
// },
// hoverColor: {
// hc1: 'rgba(24, 144, 255, 0)',
// hc2: '#2A2B2E'
// }
// }

@ -1,5 +1,6 @@
import React from 'react'; import { IRouterList } from '@/typings';
import homeRouter from '@/page/home/router';
import aboutRouter from '@/page/about/router';
const Fc = () => { const routerList: IRouterList[] = [...homeRouter, ...aboutRouter];
return <div>hhh</div>; export default routerList;
};

@ -0,0 +1,12 @@
const proxy = require('http-proxy-middleware')
module.exports = function(app){
app.use(
proxy.createProxyMiddleware('/hippo4j/v1/cs',{
target:'http://console.hippo4j.cn:6691/hippo4j/v1/cs',
changeOrigin:true,
secure: false,
pathRewrite:{'^/hippo4j/v1/cs': ''}
}),
)
}

@ -0,0 +1,11 @@
import { createStore} from 'redux';
import reducer from './reducer'
const initState = { money: 0 };
const store = createStore(
reducer,
initState,
);
export default store;

@ -28,6 +28,15 @@ export const darkAlgorithm = {
paddingContentHorizontalLG: 0, paddingContentHorizontalLG: 0,
paddingMD: 0, paddingMD: 0,
}, },
Menu: {
itemBg: darkDefaultTheme.backgroundColor.bg1,
activeBarWidth: 0,
activeBarHeight: 0,
activeBarBorderWidth: 0,
subMenuItemBorderRadius: 8,
horizontalItemBorderRadius: 8,
itemBorderRadius: 8,
},
}, },
algorithm: theme.darkAlgorithm, algorithm: theme.darkAlgorithm,
}; };

@ -29,6 +29,15 @@ export const defaultAlgorithm = {
paddingContentHorizontalLG: 0, paddingContentHorizontalLG: 0,
paddingMD: 0, paddingMD: 0,
}, },
Menu: {
itemBg: lightDefaultTheme.backgroundColor.bg1,
activeBarWidth: 0,
activeBarHeight: 0,
activeBarBorderWidth: 0,
subMenuItemBorderRadius: 8,
horizontalItemBorderRadius: 8,
itemBorderRadius: 8,
},
}, },
algorithm: theme.defaultAlgorithm, algorithm: theme.defaultAlgorithm,
}; };

@ -2,7 +2,6 @@ import { DefaultTheme } from 'styled-components';
export const lightDefaultTheme: DefaultTheme = { export const lightDefaultTheme: DefaultTheme = {
primary: '#0d68a8', primary: '#0d68a8',
baseColor: { baseColor: {
// 前两个是固定的,用于,有颜色按钮 字体颜色等固定不会变的颜色值 // 前两个是固定的,用于,有颜色按钮 字体颜色等固定不会变的颜色值
bc1: '#fff', bc1: '#fff',
@ -25,8 +24,10 @@ export const lightDefaultTheme: DefaultTheme = {
bl3: '#B5BDCE', bl3: '#B5BDCE',
}, },
backgroundColor: { backgroundColor: {
bg1: '#FFFFFF', // main bgc
bg2: '#EEEFF4', bg1: '#ebebf2',
// app or head bgc
bg2: '#fff',
// title的及表格头部背景极 // title的及表格头部背景极
bg3: '#EDEDED', bg3: '#EDEDED',
bg5: '#F8F8F8', bg5: '#F8F8F8',

@ -0,0 +1,13 @@
import { ReactNode } from 'react';
import React from 'react';
export type IRouterList = {
path: string;
component: () => React.JSX.Element;
};
export type IMenuList = {
label: string | ReactNode;
key: string;
icon?: ReactNode;
};

File diff suppressed because it is too large Load Diff

@ -25,7 +25,7 @@
<span>{{ temp.role }}</span> <span>{{ temp.role }}</span>
</el-form-item> </el-form-item>
<el-form-item :label="$t('report.tenants')" label-width="120px"> <el-form-item :label="$t('report.tenants')" label-width="120px">
<span></span> <span>{{ temp.tempResources }}</span>
</el-form-item> </el-form-item>
<el-form-item :label="$t('common.createTime')" label-width="120px"> <el-form-item :label="$t('common.createTime')" label-width="120px">
<span> {{ temp.gmtCreate }}</span> <span> {{ temp.gmtCreate }}</span>

@ -174,6 +174,7 @@ export default {
password: '', password: '',
permission: '', permission: '',
resources: [], resources: [],
tempResources: [],
}, },
resetTemp() { resetTemp() {
this.temp = { this.temp = {
@ -183,6 +184,7 @@ export default {
password: '', password: '',
permission: '', permission: '',
resources: [], resources: [],
tempResources: [],
} }
}, },
}; };
@ -229,6 +231,14 @@ export default {
createData() { createData() {
this.$refs['dataForm'].validate((valid) => { this.$refs['dataForm'].validate((valid) => {
if (valid) { if (valid) {
let resources = [];
for (let i = 0; i < this.temp.tempResources.length; i++) {
resources.push({
resource: this.temp.tempResources[i],
action: 'rw',
});
}
this.temp.resources = resources;
user.createUser(this.temp).then(() => { user.createUser(this.temp).then(() => {
this.fetchData(); this.fetchData();
this.dialogFormVisible = false; this.dialogFormVisible = false;

@ -105,6 +105,16 @@ public class BeforeCheckConfiguration {
"Please check whether the [spring.dynamic.thread-pool.etcd.key] configuration is empty or an empty string."); "Please check whether the [spring.dynamic.thread-pool.etcd.key] configuration is empty or an empty string.");
} }
} }
Map<String, String> apollo = properties.getApollo();
if (MapUtil.isNotEmpty(apollo)) {
String namespace = apollo.get("namespace");
if (StringUtil.isBlank(namespace)) {
throw new ConfigEmptyException(
"Web server failed to start. The dynamic thread pool apollo namespace is empty.",
"Please check whether the [spring.dynamic.thread-pool.apollo.namespace] configuration is empty or an empty string.");
}
}
break; break;
} }
default: default:

Loading…
Cancel
Save