Skip to content

Commit 829260b

Browse files
authored
Merge branch 'main' into issue-chaincode-apporve-frontend
2 parents 64f1710 + 1e54e05 commit 829260b

File tree

6 files changed

+114
-55
lines changed

6 files changed

+114
-55
lines changed

src/dashboard/config/config.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@ export default {
1111
antd: {},
1212
locale: {
1313
default: 'en-US',
14-
antd: false,
15-
title: false,
16-
baseNavigator: true,
14+
antd: true,
15+
title: true,
16+
baseNavigator: false,
1717
baseSeparator: '-',
1818
},
1919
pwa: false,

src/dashboard/src/components/SelectLang/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import styles from './index.less';
99
class SelectLang extends PureComponent {
1010
changeLang = ({ key }) => {
1111
setLocale(key);
12+
localStorage.setItem('umi_locale', key);
1213
};
1314

1415
render() {

src/dashboard/src/layouts/BasicLayout.js

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
/*
22
SPDX-License-Identifier: Apache-2.0
33
*/
4-
import React from 'react';
4+
import React, { Component } from 'react';
55
import { Layout } from 'antd';
66
import DocumentTitle from 'react-document-title';
7-
import { connect } from 'umi';
7+
import { connect, setLocale, getLocale } from 'umi';
88
import { ContainerQuery } from 'react-container-query';
99
import classNames from 'classnames';
1010
import Media from 'react-media';
@@ -46,7 +46,7 @@ const query = {
4646
},
4747
};
4848

49-
class BasicLayout extends React.Component {
49+
class BasicLayout extends Component {
5050
componentDidMount() {
5151
const {
5252
dispatch,
@@ -62,6 +62,17 @@ class BasicLayout extends React.Component {
6262
type: 'menu/getMenuData',
6363
payload: { routes, path, authority },
6464
});
65+
66+
// Initialize language from localStorage or default to English
67+
const savedLocale = localStorage.getItem('umi_locale');
68+
const currentLocale = getLocale();
69+
70+
if (savedLocale && savedLocale !== currentLocale) {
71+
setLocale(savedLocale);
72+
} else if (!savedLocale) {
73+
setLocale('en-US');
74+
localStorage.setItem('umi_locale', 'en-US');
75+
}
6576
}
6677

6778
getContext() {

src/dashboard/src/locales/en-US.js

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,29 @@ export default {
2626
'app.forms.basic.title': 'Basic form',
2727
'app.forms.basic.description':
2828
'Form pages are used to collect or verify information to users, and basic forms are common in scenarios where there are fewer data items.',
29+
30+
// Error messages
31+
'error.request.200': 'Server successfully returned requested data.',
32+
'error.request.201': 'Created or modified data successfully.',
33+
'error.request.202': 'A request has entered the background queue.',
34+
'error.request.204': 'Data deleted successfully.',
35+
'error.request.400': 'Bad request, server did not create or modify data.',
36+
'error.request.401': 'User does not have permission (token, username, password error).',
37+
'error.request.403': 'User is authorized but access is forbidden.',
38+
'error.request.404': 'Request made to non-existent record, server did not operate.',
39+
'error.request.406': 'Requested format not available.',
40+
'error.request.410': 'Requested resource permanently deleted and will not be available again.',
41+
'error.request.422': 'Validation error occurred while creating an object.',
42+
'error.request.500': 'Server error, please check server.',
43+
'error.request.502': 'Gateway error.',
44+
'error.request.503': 'Service unavailable, server temporarily overloaded or maintaining.',
45+
'error.request.504': 'Gateway timeout.',
46+
'error.network': 'Network error, please check your connection.',
47+
'error.login.invalidCredentials': 'Invalid username or password.',
48+
'error.login.expired': 'Not logged in or session expired. Please log in again.',
49+
'error.register.duplicate': 'Email address or organization name already exists.',
50+
'error.request.generic': 'Request error: {status}',
51+
2952
...exception,
3053
...globalHeader,
3154
...login,

src/dashboard/src/locales/zh-CN.js

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,29 @@ export default {
2626
'app.forms.basic.title': '基础表单',
2727
'app.forms.basic.description':
2828
'表单页用于向用户收集或验证信息,基础表单常见于数据项较少的表单场景。',
29+
30+
// Error messages
31+
'error.request.200': '服务器成功返回请求的数据。',
32+
'error.request.201': '新建或修改数据成功。',
33+
'error.request.202': '一个请求已经进入后台排队(异步任务)。',
34+
'error.request.204': '删除数据成功。',
35+
'error.request.400': '发出的请求有错误,服务器没有进行新建或修改数据的操作。',
36+
'error.request.401': '用户没有权限(令牌、用户名、密码错误)。',
37+
'error.request.403': '用户得到授权,但是访问是被禁止的。',
38+
'error.request.404': '发出的请求针对的是不存在的记录,服务器没有进行操作。',
39+
'error.request.406': '请求的格式不可得。',
40+
'error.request.410': '请求的资源被永久删除,且不会再得到的。',
41+
'error.request.422': '当创建一个对象时,发生一个验证错误。',
42+
'error.request.500': '服务器发生错误,请检查服务器。',
43+
'error.request.502': '网关错误。',
44+
'error.request.503': '服务不可用,服务器暂时过载或维护。',
45+
'error.request.504': '网关超时。',
46+
'error.network': '网络错误,请检查您的网络连接。',
47+
'error.login.invalidCredentials': '用户名或密码错误。',
48+
'error.login.expired': '未登录或登录已过期,请重新登录。',
49+
'error.register.duplicate': '邮箱地址或组织名已存在。',
50+
'error.request.generic': '请求错误:{status}',
51+
2952
...exception,
3053
...globalHeader,
3154
...login,

src/dashboard/src/utils/request.js

Lines changed: 50 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1,61 +1,49 @@
1-
import React from 'react';
21
import { extend } from 'umi-request';
32
import { notification } from 'antd';
4-
import { history } from 'umi';
3+
import { history, formatMessage } from 'umi';
54
import { stringify } from 'qs';
65

7-
const codeMessage = {
8-
200: '服务器成功返回请求的数据。',
9-
201: '新建或修改数据成功。',
10-
202: '一个请求已经进入后台排队(异步任务)。',
11-
204: '删除数据成功。',
12-
400: '发出的请求有错误,服务器没有进行新建或修改数据的操作。',
13-
401: '用户没有权限(令牌、用户名、密码错误)。',
14-
403: '用户得到授权,但是访问是被禁止的。',
15-
404: '发出的请求针对的是不存在的记录,服务器没有进行操作。',
16-
406: '请求的格式不可得。',
17-
410: '请求的资源被永久删除,且不会再得到的。',
18-
422: '当创建一个对象时,发生一个验证错误。',
19-
500: '服务器发生错误,请检查服务器。',
20-
502: '网关错误。',
21-
503: '服务不可用,服务器暂时过载或维护。',
22-
504: '网关超时。',
23-
};
24-
256
/**
26-
* 异常处理程序
7+
* Error handler
278
*/
289
const errorHandler = error => {
2910
const { response, data } = error;
30-
const errortext = (
31-
<>
32-
{codeMessage[response.status] || response.statusText} <br />
33-
{data && data.msg && Array.isArray(data.msg) && data.msg.length > 0 && data.msg[0]}
34-
</>
35-
);
11+
12+
if (!response) {
13+
notification.error({
14+
message: formatMessage({
15+
id: 'error.network',
16+
defaultMessage: 'Network Error',
17+
}),
18+
});
19+
return;
20+
}
21+
3622
const { status, url } = response;
37-
let verifyUserFail = false;
3823

24+
// Handle specific error cases
3925
if (status === 400) {
4026
const api = url.split('/').pop();
41-
4227
if (api === 'login') {
4328
notification.error({
44-
message: '用户名或密码错误。',
29+
message: formatMessage({
30+
id: 'error.login.invalidCredentials',
31+
defaultMessage: 'Invalid username or password.',
32+
}),
33+
description: url,
4534
});
4635
return;
4736
}
48-
49-
if (api === 'token-verify') {
50-
verifyUserFail = true;
51-
}
5237
}
5338

54-
if (status === 401 || verifyUserFail) {
39+
if (status === 401) {
5540
notification.error({
56-
message: '未登录或登录已过期,请重新登录。',
41+
message: formatMessage({
42+
id: 'error.login.expired',
43+
defaultMessage: 'Not logged in or session expired. Please log in again.',
44+
}),
45+
description: url,
5746
});
58-
5947
history.replace({
6048
pathname: '/user/login',
6149
search: stringify({
@@ -69,26 +57,41 @@ const errorHandler = error => {
6957
const api = url.split('/').pop();
7058
if (api === 'register') {
7159
notification.error({
72-
message: '邮箱地址或组织名已存在。',
60+
message: formatMessage({
61+
id: 'error.register.duplicate',
62+
defaultMessage: 'Email address or organization name already exists.',
63+
}),
64+
description: url,
7365
});
7466
return;
7567
}
7668
}
7769

70+
// Generic error handling
71+
const errorMessage = formatMessage({
72+
id: `error.request.${status}`,
73+
defaultMessage: `Request error (${status})`,
74+
});
75+
76+
const detailMessage =
77+
data?.detail ||
78+
data?.msg ||
79+
formatMessage({
80+
id: 'error.request.generic',
81+
defaultMessage: 'An error occurred while processing your request.',
82+
});
83+
7884
notification.error({
79-
message: `请求错误 ${status}: ${url}`,
80-
description: errortext,
85+
message: errorMessage,
86+
description: `${url}\n${detailMessage}`,
8187
});
82-
// environment should not be used
88+
89+
// Handle navigation for specific error codes
8390
if (status === 403) {
8491
history.push('/exception/403');
85-
return;
86-
}
87-
if (status <= 504 && status >= 500) {
92+
} else if (status >= 500 && status <= 504) {
8893
history.push('/exception/500');
89-
return;
90-
}
91-
if (status >= 404 && status < 422) {
94+
} else if (status >= 404 && status < 422) {
9295
history.push('/exception/404');
9396
}
9497
};
@@ -101,11 +104,9 @@ const request = extend({
101104
request.interceptors.request.use(async (url, options) => {
102105
const token = window.localStorage.getItem('cello-token');
103106
if (url.indexOf('api/v1/login') < 0 && url.indexOf('api/v1/register') < 0 && token) {
104-
// 如果有token 就走token逻辑
105107
const headers = {
106108
Authorization: `JWT ${token}`,
107109
};
108-
109110
return {
110111
url,
111112
options: { ...options, headers },

0 commit comments

Comments
 (0)