mirror of
https://github.com/zuiidea/antd-admin.git
synced 2026-10-20 17:38:33 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d03787a871 | ||
|
|
0949a298c9 | ||
|
|
94c8e2168f | ||
|
|
358134f417 | ||
|
|
7483572b1d | ||
|
|
d1ce8e0739 | ||
|
|
f230429ddd | ||
|
|
78c3b6d597 | ||
|
|
cdbc2782ff | ||
|
|
108aca99b9 | ||
|
|
7dd5dfb1bf | ||
|
|
ee7a0fffc2 | ||
|
|
6999871860 | ||
|
|
6742207c77 | ||
|
|
d71c29ee2e | ||
|
|
6917d6b89a | ||
|
|
c3f369f0b3 | ||
|
|
01abc5ca38 | ||
|
|
08a348090c | ||
|
|
63b1ecf79f | ||
|
|
efe7e74375 | ||
|
|
6d552d22d9 |
@@ -58,6 +58,11 @@ export default {
|
||||
include: ['dva', 'dva/router', 'dva/saga', 'dva/fetch', 'antd/es'],
|
||||
},
|
||||
hardSource: /* isMac */ process.platform === 'darwin',
|
||||
pwa: {
|
||||
manifestOptions: {
|
||||
srcPath: 'manifest.json'
|
||||
},
|
||||
}
|
||||
},
|
||||
],
|
||||
],
|
||||
|
||||
@@ -0,0 +1,86 @@
|
||||
# API configuration
|
||||
|
||||
## Why
|
||||
|
||||
In the use of `redux` or `dva` projects, we often write functions like the following `service` layer to make the code structure clearer, but it is easy to see that we will write a lot of similar code in `antd -admin@5.0`, using the more concise configuration method to achieve the same function.
|
||||
|
||||
```javascript
|
||||
Export async function login(data) {
|
||||
Return request({
|
||||
Url: '/api/v1/user/login',
|
||||
Method: 'post',
|
||||
Data,
|
||||
})
|
||||
}
|
||||
```
|
||||
|
||||
## Configuration and use
|
||||
|
||||
In the `src/services/api.js` file, you will see the following configuration object, the object's key is used to call the function name, the object's value is the requested `url`, the default request method is `GET`, The format of the value of the other request mode object is `'method url'`.
|
||||
|
||||
```javascript
|
||||
Export default {
|
||||
...
|
||||
queryUser: '/user/:id',
|
||||
queryUserList: '/users',
|
||||
updateUser: 'Patch /user/:id',
|
||||
createUser: 'POST /user/:id',
|
||||
removeUser: 'DELETE /user/:id',
|
||||
removeUserList: 'POST /users/delete',
|
||||
...
|
||||
}
|
||||
```
|
||||
|
||||
Used in other files
|
||||
|
||||
```javascript
|
||||
Import { queryUser } from 'api'
|
||||
|
||||
// in the general file
|
||||
...
|
||||
queryUser(option).then(data => console.log(data))
|
||||
...
|
||||
|
||||
/ / Model file
|
||||
...
|
||||
Yield call(queryUser, option)
|
||||
...
|
||||
```
|
||||
|
||||
## Method to realize
|
||||
|
||||
Refer to the `src/services/index.js` file to traverse the api configuration. Each property returns the corresponding encapsulated request function.
|
||||
|
||||
```javascript
|
||||
Import request from 'utils/request'
|
||||
Import { apiPrefix } from 'utils/config'
|
||||
|
||||
Import api from './api'
|
||||
|
||||
Const gen = params => {
|
||||
Let url = apiPrefix + params
|
||||
Let method = 'GET'
|
||||
|
||||
Const paramsArray = params.split(' ')
|
||||
If (paramsArray.length === 2) {
|
||||
Method = paramsArray[0]
|
||||
Url = apiPrefix + paramsArray[1]
|
||||
}
|
||||
|
||||
Return function(data) {
|
||||
Return request({
|
||||
Url,
|
||||
Data,
|
||||
Method,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
Const APIFunction = {}
|
||||
For (const key in api) {
|
||||
APIFunction[key] = gen(api[key])
|
||||
}
|
||||
|
||||
Module.exports = APIFunction
|
||||
|
||||
```
|
||||
File diff suppressed because one or more lines are too long
|
After Width: | Height: | Size: 194 KiB |
File diff suppressed because one or more lines are too long
|
After Width: | Height: | Size: 118 KiB |
File diff suppressed because one or more lines are too long
|
After Width: | Height: | Size: 199 KiB |
File diff suppressed because one or more lines are too long
|
After Width: | Height: | Size: 124 KiB |
@@ -2,6 +2,10 @@
|
||||
- [Quick Start](getting-started.md)
|
||||
- Customization
|
||||
- [Configuration](configuration.md)
|
||||
- [API Configuration](API-configuration.md)
|
||||
- [I18n](i18n.md)
|
||||
- [Layout](layout.md)
|
||||
- [Request](request.md)
|
||||
- Guide
|
||||
- [Deploy](deploy.md)
|
||||
- [Change Log](change-log.md)
|
||||
|
||||
+10
-10
@@ -12,7 +12,7 @@ You can do some custom configuration in `/src/utils/config.js`:
|
||||
|
||||
- Type: `String`
|
||||
|
||||
Configure the copyright notice to apply to the login page, at the bottom of the `Primay` layout.
|
||||
Configure the copyright notice to apply to the login page, at the bottom of the `Primary` layout.
|
||||
|
||||
## logoPath
|
||||
|
||||
@@ -24,7 +24,7 @@ You can do some custom configuration in `/src/utils/config.js`:
|
||||
|
||||
- Type: `String`
|
||||
|
||||
Configure the prefix of the interface in the project. The interface related documents can be viewed [API configuration]()
|
||||
Configure the prefix of the interface in the project. The interface related documents can be viewed [API configuration](API-configuration.md)
|
||||
|
||||
## fixedHeader
|
||||
|
||||
@@ -39,25 +39,25 @@ You can do some custom configuration in `/src/utils/config.js`:
|
||||
Configuration? Which routes use which layout, unspecified route uses the default layout `Public`, the project currently has `Primary` and `Public` layouts,
|
||||
The default configuration is as follows:
|
||||
|
||||
```js
|
||||
```javascript
|
||||
layouts: [
|
||||
{
|
||||
name: 'primary',
|
||||
include: [/.*/],
|
||||
exlude: [/(\/(en|zh))*\/login/],
|
||||
exclude: [/(\/(en|zh))*\/login/],
|
||||
},
|
||||
],
|
||||
```
|
||||
|
||||
The object properties for each layout are as follows:
|
||||
|
||||
- `name` - The name of the layout;
|
||||
- `name` - The name of the layout;
|
||||
|
||||
- `include` - Specifies a list of routing rules that use this layout, which can be a regular expression or a string;
|
||||
|
||||
- `exlude` - Specifies a list of routing rules that do not use this layout, which can be a regular expression or a string.
|
||||
- `exclude` - Specifies a list of routing rules that do not use this layout, which can be a regular expression or a string.
|
||||
|
||||
> Note: `exlude` takes precedence over `include`, and the layout behind it has a higher priority than the previous layout. The development process may need to be combined with the layout in the `src/layouts` directory. For details, see [Using Layout]().
|
||||
> Note: `exclude` takes precedence over `include`, and the layout previous it has a higher priority than the behind layout. The development process may need to be combined with the layout in the `src/layouts` directory. For details, see [Using Layout](./layout.md).
|
||||
|
||||
## i18n
|
||||
|
||||
@@ -65,7 +65,7 @@ You can do some custom configuration in `/src/utils/config.js`:
|
||||
|
||||
Configure internationalization, the default configuration is as follows:
|
||||
|
||||
```js
|
||||
```javascript
|
||||
i18n: {
|
||||
languages: [
|
||||
{
|
||||
@@ -91,9 +91,9 @@ You can do some custom configuration in `/src/utils/config.js`:
|
||||
|
||||
- `key` - The `key` of the language is applied to the page url to distinguish the language, and also corresponds to the language package folder name in the `src/locales` directory;
|
||||
|
||||
- `title` - The name of the language, at the bottom of the login page, at the top of the `Primay` layout, the language switch is displayed;
|
||||
- `title` - The name of the language, at the bottom of the login page, at the top of the `Primary` layout, the language switch is displayed;
|
||||
|
||||
- `flag` - The path of the flag icon of the language, the language switching display at the top of the `Primay` layout.
|
||||
- `flag` - The path of the flag icon of the language, the language switching display at the top of the `Primary` layout.
|
||||
|
||||
### i18n.defaultLanguage
|
||||
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
|
||||
After the development is completed and verified in the development environment, it needs to be deployed to our users.
|
||||
|
||||

|
||||
|
||||
## Build
|
||||
|
||||
First execute the following command,
|
||||
|
||||
@@ -0,0 +1,75 @@
|
||||
# globalization
|
||||
|
||||
## Add language
|
||||
|
||||
Take Japanese as an example.
|
||||
|
||||

|
||||
|
||||
1. Add a language pack local file, `ja` is the Japanese language code, and a list of languages that support translation [有道智云](http://ai.youdao.com/docs/doc-trans-api.s#p05), the `src/locales/ja/messages.json` file will be generated after running the following command.
|
||||
|
||||
```bash
|
||||
npm run add-locale ja
|
||||
```
|
||||
|
||||
2. Extract the fields in the code that need to be translated, ie `<Trans>?message</Trans>`, `` i18n.t`message `` in the `message` field, run the following command after `src/locales/ja /messages.json` will appear after the extracted field configuration.
|
||||
|
||||
```bash
|
||||
npm run extract
|
||||
```
|
||||
|
||||
You will see the following information:
|
||||
|
||||
```bash
|
||||
Catalog statistics:
|
||||
┌─────────────┬─────────────┬─────────┐
|
||||
│ Language │ Total count │ Missing │
|
||||
├─────────────┼─────────────┼─────────┤
|
||||
│ en (source) │ 52 │ - │
|
||||
│ ja │ 52 │ 52 │
|
||||
│ zh │ 52 │ 0 │
|
||||
└─────────────┴─────────────┴─────────┘
|
||||
```
|
||||
|
||||
3. At the same time, we have added the relevant configuration in `src/utils/config.js`.
|
||||
|
||||
```javascript
|
||||
{
|
||||
...
|
||||
i18n: {
|
||||
languages: [
|
||||
...
|
||||
{
|
||||
key:'ja',
|
||||
title: '日本語',
|
||||
flag: '/japanese.svg',
|
||||
},
|
||||
],
|
||||
},
|
||||
}
|
||||
```
|
||||
|
||||
> Routing related effects, after the configuration `npm run start` takes effect after restart.
|
||||
|
||||
4. Use the built-in commands for automatic translation. You will see the translated configuration in `src/locales/ja/messages.json`.
|
||||
|
||||
```bash
|
||||
npm run trans:only
|
||||
```
|
||||
|
||||
You will see the following information:
|
||||
|
||||
```bash
|
||||
start: en -> ja
|
||||
...
|
||||
youdao: en -> ja: Unpublished -> 未発表
|
||||
youdao: en -> ja: Update -> 更新
|
||||
youdao: en -> ja: Update User -> ユーザーの更新
|
||||
youdao: en -> ja: Username -> 名
|
||||
...
|
||||
All translations have been completed.
|
||||
```
|
||||
|
||||
> `npm run trans` will execute `npm run extract` and `npm run trans:only` in order.
|
||||
|
||||
5. Finally, you can adjust the inaccurate fields in `src/locales/ja/messages.json`. Start the development mode `npm run start`, open [http://localhost:7000/ja/login](http://localhost:7000/ja/login) and you will see the Japanese version of the app.
|
||||
@@ -0,0 +1,60 @@
|
||||
# Layout
|
||||
|
||||
## Add a new layout
|
||||
|
||||
Take a new layout named `secondary` as an example to make the route starting with `seconday` use this layout.
|
||||
|
||||
1. Add related configuration in `src/utils/config.js`. For details, please refer to [layouts](/configuration?id=layouts).
|
||||
|
||||
```javascript
|
||||
layouts: [
|
||||
{
|
||||
name: 'primary',
|
||||
include: [/.*/],
|
||||
exlude: [/(\/(en|zh))*\/login/, /(\/(en|zh))*\/seconday\/(.*)/],
|
||||
},
|
||||
{
|
||||
name: 'secondary',
|
||||
include: [/(\/(en|zh))*\/seconday\/(.*)/],
|
||||
},
|
||||
],
|
||||
```
|
||||
|
||||
2. Add the `secondary` layout component to the `src/layouts/BaseLayout.js` file.
|
||||
|
||||
```javascript
|
||||
import SecondaryLayout from './SecondaryLayout'
|
||||
|
||||
const LayoutMap = {
|
||||
Primary: PrimaryLayout,
|
||||
Public: PublicLayout,
|
||||
Secondary: SecondaryLayout,
|
||||
}
|
||||
```
|
||||
|
||||
3. Add the `SecondaryLayout.js` file to the `src/layouts/` directory.
|
||||
|
||||
```javascript
|
||||
import React from 'react'
|
||||
|
||||
export default ({ children }) => {
|
||||
Return (
|
||||
<div>
|
||||
<h1>Seconday</h1>
|
||||
{children}
|
||||
</div>
|
||||
)
|
||||
}
|
||||
```
|
||||
|
||||
4. Add a `seconday/index.js` file to the `src/pages/` directory.
|
||||
|
||||
```javascript
|
||||
import React from 'react'
|
||||
|
||||
export default ({ children }) => {
|
||||
Return <div>Seconday page Content</div>
|
||||
}
|
||||
```
|
||||
|
||||
5. Finally, start the development mode `npm run start`, open [http://localhost:7000/seconday/](http://localhost:7000/seconday/) and you will see the page for the `seconday` layout.
|
||||
@@ -0,0 +1,22 @@
|
||||
# HTTP request
|
||||
|
||||
this project use axios for http service, file located in src/utils/request.js
|
||||
|
||||
## Custom Header
|
||||
|
||||
As for privilege access or modify cookie, you could add header param by yourself
|
||||
|
||||
```
|
||||
axios.defaults.headers.common['Authorization'] = 'token'
|
||||
```
|
||||
|
||||
Or
|
||||
|
||||
```
|
||||
axios.interceptors.request.use(function (config) {
|
||||
config.headers.token = window.localStorage.getItem('token');
|
||||
return config;
|
||||
}, function (error) {
|
||||
return Promise.reject(error);
|
||||
});
|
||||
```
|
||||
@@ -0,0 +1,86 @@
|
||||
# 接口配置
|
||||
|
||||
## 为什么
|
||||
|
||||
在使用了`redux`或者`dva`项目中,我们经常会写类似下面的`service`层的函数,使代码结构更清晰,但是很容易看出,我们会写很多相似的代码,在`antd-admin@5.0`中,使用了更加简洁的配置方式实现了相同的功能。
|
||||
|
||||
```javascript
|
||||
export async function login(data) {
|
||||
return request({
|
||||
url: '/api/v1/user/login',
|
||||
method: 'post',
|
||||
data,
|
||||
})
|
||||
}
|
||||
```
|
||||
|
||||
## 配置和使用
|
||||
|
||||
在`src/services/api.js`文件中,你会看到如下配置对象,对象的键用于调用时的函数名称,对象的值为请求的`url`,默认请求方式为`GET`,如果是其他请求方式对象的值的格式则为`'method url'`。
|
||||
|
||||
```javascript
|
||||
export default {
|
||||
...
|
||||
queryUser: '/user/:id',
|
||||
queryUserList: '/users',
|
||||
updateUser: 'Patch /user/:id',
|
||||
createUser: 'POST /user/:id',
|
||||
removeUser: 'DELETE /user/:id',
|
||||
removeUserList: 'POST /users/delete',
|
||||
...
|
||||
}
|
||||
```
|
||||
|
||||
在其他文件中使用
|
||||
|
||||
```javascript
|
||||
import { queryUser } from 'api'
|
||||
|
||||
// 一般文件中
|
||||
...
|
||||
queryUser(option).then(data => console.log(data))
|
||||
...
|
||||
|
||||
// model文件中
|
||||
...
|
||||
yield call(queryUser, option)
|
||||
...
|
||||
```
|
||||
|
||||
## 实现方式
|
||||
|
||||
参考`src/services/index.js`文件,对api配置进行遍历,每个属性都返回对应的封装后的request函数。
|
||||
|
||||
```javascript
|
||||
import request from 'utils/request'
|
||||
import { apiPrefix } from 'utils/config'
|
||||
|
||||
import api from './api'
|
||||
|
||||
const gen = params => {
|
||||
let url = apiPrefix + params
|
||||
let method = 'GET'
|
||||
|
||||
const paramsArray = params.split(' ')
|
||||
if (paramsArray.length === 2) {
|
||||
method = paramsArray[0]
|
||||
url = apiPrefix + paramsArray[1]
|
||||
}
|
||||
|
||||
return function(data) {
|
||||
return request({
|
||||
url,
|
||||
data,
|
||||
method,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
const APIFunction = {}
|
||||
for (const key in api) {
|
||||
APIFunction[key] = gen(api[key])
|
||||
}
|
||||
|
||||
module.exports = APIFunction
|
||||
|
||||
```
|
||||
@@ -2,6 +2,10 @@
|
||||
- [快速上手](zh-cn/getting-started.md)
|
||||
- 定制化
|
||||
- [配置项](zh-cn/configuration.md)
|
||||
- [接口配置](zh-cn/API-configuration.md)
|
||||
- [国际化](zh-cn/i18n.md)
|
||||
- [布局](zh-cn/layout.md)
|
||||
- [http 请求](zh-cn/request.md)
|
||||
- 指南
|
||||
- [部署](zh-cn/deploy.md)
|
||||
- [更新日志](zh-cn/change-log.md)
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
|
||||
- 类型: `String`
|
||||
|
||||
配置项目中接口的前缀,接口相关文档可查看 [接口配置化]()
|
||||
配置项目中接口的前缀,接口相关文档可查看 [接口配置](API-configuration.md)
|
||||
|
||||
## fixedHeader
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
配置哪些路由使用哪种布局,未指定路由使用默认布局 `Public`,项目中目前有 `Primary` 和 `Public` 两种布局,
|
||||
默认配置如下:
|
||||
|
||||
```js
|
||||
```javascript
|
||||
layouts: [
|
||||
{
|
||||
name: 'primary',
|
||||
@@ -57,7 +57,7 @@
|
||||
|
||||
- `exlude` - 指定不使用该布局的路由规则列表,规则可为正则表达式或者字符串。
|
||||
|
||||
> 注意:`exlude` 优先级高于 `include`,后面的布局优先级高于前面的布局。开发过程中可能需要结合`src/layouts`目录下的布局使用,具体方法可查看 [使用布局]()。
|
||||
> 注意:`exlude` 优先级高于 `include`,前面的布局优先级高于后面的布局。开发过程中可能需要结合`src/layouts`目录下的布局使用,具体方法可查看 [使用布局](./layout.md)。
|
||||
|
||||
## i18n
|
||||
|
||||
@@ -65,7 +65,7 @@
|
||||
|
||||
配置国际化,默认配置如下:
|
||||
|
||||
```js
|
||||
```javascript
|
||||
i18n: {
|
||||
languages: [
|
||||
{
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
|
||||
完成开发并且在开发环境验证之后,就需要部署给我们的用户了。
|
||||
|
||||

|
||||
|
||||
## 构建
|
||||
|
||||
先执行下面的命令,
|
||||
|
||||
@@ -0,0 +1,75 @@
|
||||
# 国际化
|
||||
|
||||
## 新增应用语言
|
||||
|
||||
以新增日语为例。
|
||||
|
||||

|
||||
|
||||
1. 添加语言包本地文件,`ja` 为日语的语言代码,支持翻译的语言列表参考 [有道智云](http://ai.youdao.com/docs/doc-trans-api.s#p05),运行下面命令后会生成 `src/locales/ja/messages.json` 文件。
|
||||
|
||||
```bash
|
||||
npm run add-locale ja
|
||||
```
|
||||
|
||||
2. 提取代码中需要翻译的字段,即 `<Trans>message</Trans>`、`` i18n.t`message `` 中 `message` 字段,运行下面命令后 `src/locales/ja/messages.json` 将会出现提取后的字段配置。
|
||||
|
||||
```bash
|
||||
npm run extract
|
||||
```
|
||||
|
||||
你将看到如下信息:
|
||||
|
||||
```bash
|
||||
Catalog statistics:
|
||||
┌─────────────┬─────────────┬─────────┐
|
||||
│ Language │ Total count │ Missing │
|
||||
├─────────────┼─────────────┼─────────┤
|
||||
│ en (source) │ 52 │ - │
|
||||
│ ja │ 52 │ 52 │
|
||||
│ zh │ 52 │ 0 │
|
||||
└─────────────┴─────────────┴─────────┘
|
||||
```
|
||||
|
||||
3. 与此同时,我们在 `src/utils/config.js` 新增相关配置。
|
||||
|
||||
```javascript
|
||||
{
|
||||
...
|
||||
i18n: {
|
||||
languages: [
|
||||
...
|
||||
{
|
||||
key:'ja',
|
||||
title: '日本語',
|
||||
flag: '/japanese.svg',
|
||||
},
|
||||
],
|
||||
},
|
||||
}
|
||||
```
|
||||
|
||||
> 路由相关效果,配置后 `npm run start` 重启后生效。
|
||||
|
||||
4. 使用内置的命令进行自动翻译,在 `src/locales/ja/messages.json` 中将会看到翻译后的配置。
|
||||
|
||||
```bash
|
||||
npm run trans:only
|
||||
```
|
||||
|
||||
你将看到如下信息:
|
||||
|
||||
```bash
|
||||
start: en -> ja
|
||||
...
|
||||
youdao: en -> ja: Unpublished -> 未発表
|
||||
youdao: en -> ja: Update -> 更新
|
||||
youdao: en -> ja: Update User -> ユーザーの更新
|
||||
youdao: en -> ja: Username -> 名
|
||||
...
|
||||
All translations have been completed.
|
||||
```
|
||||
|
||||
> `npm run trans` 将会依次执行 `npm run extract` 和 `npm run trans:only`
|
||||
|
||||
5. 最后,可以在 `src/locales/ja/messages.json` 中对翻译不准确的的字段进行调整。启动开发模式 `npm run start`,打开 [http://localhost:7000/ja/login](http://localhost:7000/ja/login),你将看到日语版本的应用。
|
||||
@@ -0,0 +1,60 @@
|
||||
# 布局
|
||||
|
||||
## 新增布局
|
||||
|
||||
以新增名为 `secondary` 的布局为例,使以 `seconday` 开头的路由都使用该布局。
|
||||
|
||||
1. 在 `src/utils/config.js` 新增相关配置,参数详细请查看 [layouts](/zh-cn/configuration?id=layouts)。
|
||||
|
||||
```javascript
|
||||
layouts: [
|
||||
{
|
||||
name: 'primary',
|
||||
include: [/.*/],
|
||||
exlude: [/(\/(en|zh))*\/login/, /(\/(en|zh))*\/seconday\/(.*)/],
|
||||
},
|
||||
{
|
||||
name: 'secondary',
|
||||
include: [/(\/(en|zh))*\/seconday\/(.*)/],
|
||||
},
|
||||
],
|
||||
```
|
||||
|
||||
2. 在`src/layouts/BaseLayout.js` 文件中新增 `secondary` 布局组件。
|
||||
|
||||
```javascript
|
||||
import SecondaryLayout from './SecondaryLayout'
|
||||
|
||||
const LayoutMap = {
|
||||
primary: PrimaryLayout,
|
||||
public: PublicLayout,
|
||||
secondary: SecondaryLayout,
|
||||
}
|
||||
```
|
||||
|
||||
3. 在`src/layouts/` 目录中新增 `SecondaryLayout.js` 文件。
|
||||
|
||||
```javascript
|
||||
import React from 'react'
|
||||
|
||||
export default ({ children }) => {
|
||||
return (
|
||||
<div>
|
||||
<h1>Seconday</h1>
|
||||
{children}
|
||||
</div>
|
||||
)
|
||||
}
|
||||
```
|
||||
|
||||
4. 在`src/pages/` 目录中新增 `seconday/index.js` 文件。
|
||||
|
||||
```javascript
|
||||
import React from 'react'
|
||||
|
||||
export default ({ children }) => {
|
||||
return <div>Seconday page Content</div>
|
||||
}
|
||||
```
|
||||
|
||||
5. 最后,启动开发模式 `npm run start`,打开 [http://localhost:7000/seconday/](http://localhost:7000/seconday/),你将看到 `seconday` 布局的页面。
|
||||
@@ -0,0 +1,24 @@
|
||||
# HTTP请求
|
||||
|
||||
本项目使用了axios提供http请求服务,文件在src/utils/request.js
|
||||
|
||||
## 自定义Header
|
||||
|
||||
为了提供鉴权、修改cookie等服务,可以手动修改Header
|
||||
|
||||
```
|
||||
axios.defaults.headers.common['Authorization'] = 'token'
|
||||
```
|
||||
|
||||
或者
|
||||
|
||||
```
|
||||
// 添加请求拦截器
|
||||
axios.interceptors.request.use(function (config) {
|
||||
// 在发送请求之前做些什么
|
||||
config.headers.token = window.localStorage.getItem('token');
|
||||
return config;
|
||||
}, function (error) {
|
||||
return Promise.reject(error);
|
||||
});
|
||||
```
|
||||
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"name": "Antd-Admin",
|
||||
"start_url": ".",
|
||||
"display": "standalone",
|
||||
"background_color": "#fff",
|
||||
"description": "A front-end solution for enterprise applications built upon Ant Design and UmiJS",
|
||||
"icons": [
|
||||
{
|
||||
"src": "logo.svg",
|
||||
"sizes": "72x72 96x96 128x128 144x144 152x152 192x192 384x384 512x512"
|
||||
}
|
||||
]
|
||||
}
|
||||
+19
-19
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "antd-admin",
|
||||
"version": "5.0.0-beta",
|
||||
"version": "5.0.1",
|
||||
"private": true,
|
||||
"description": "An admin dashboard application demo built upon Ant Design and UmiJS",
|
||||
"dependencies": {
|
||||
"@lingui/react": "^2.7.0",
|
||||
"ant-design-pro": "^2.1.0",
|
||||
"antd": "^3.10.0",
|
||||
"@lingui/react": "^2.7.1",
|
||||
"ant-design-pro": "^2.1.1",
|
||||
"antd": "^3.10.7",
|
||||
"axios": "^0.18.0",
|
||||
"babel-core": "7.0.0-bridge.0",
|
||||
"classnames": "^2.2.6",
|
||||
@@ -28,46 +28,46 @@
|
||||
"path-to-regexp": "^2.4.0",
|
||||
"prop-types": "^15.6.2",
|
||||
"qs": "^6.5.2",
|
||||
"rc-tween-one": "^2.2.8",
|
||||
"rc-tween-one": "^2.2.17",
|
||||
"react-adsense": "^0.0.6",
|
||||
"react-countup": "^4.0.0-alpha.6",
|
||||
"react-draft-wysiwyg": "^1.12.13",
|
||||
"react-helmet": "^5.2.0",
|
||||
"react-highcharts": "^16.0.2",
|
||||
"react-perfect-scrollbar": "^1.4.0",
|
||||
"recharts": "^1.3.0",
|
||||
"react-perfect-scrollbar": "^1.4.2",
|
||||
"recharts": "^1.3.6",
|
||||
"store": "^2.0.12"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@lingui/babel-preset-react": "^2.7.0",
|
||||
"@lingui/cli": "^2.7.0",
|
||||
"@lingui/loader": "^2.7.0",
|
||||
"@lingui/babel-preset-react": "^2.7.1",
|
||||
"@lingui/cli": "^2.7.1",
|
||||
"@lingui/loader": "^2.7.1",
|
||||
"babel-eslint": "^10.0.1",
|
||||
"babel-plugin-dev-expression": "^0.2.1",
|
||||
"babel-plugin-import": "^1.10.0",
|
||||
"babel-plugin-macros": "^2.4.2",
|
||||
"babel-plugin-module-resolver": "^3.1.1",
|
||||
"cross-env": "^5.2.0",
|
||||
"eslint": "^5.7.0",
|
||||
"eslint-config-react-app": "^3.0.4",
|
||||
"eslint": "^5.9.0",
|
||||
"eslint-config-react-app": "^3.0.5",
|
||||
"eslint-plugin-flowtype": "^3.0.0",
|
||||
"eslint-plugin-import": "^2.6.0",
|
||||
"eslint-plugin-jsx-a11y": "^6.1.1",
|
||||
"eslint-plugin-react": "^7.1.0",
|
||||
"husky": "^1.1.1",
|
||||
"husky": "^1.1.4",
|
||||
"less-vars-to-js": "^1.3.0",
|
||||
"lint-staged": "^7.3.0",
|
||||
"lint-staged": "^8.0.4",
|
||||
"mockjs": "^1.0.1-beta3",
|
||||
"module": "^1.2.5",
|
||||
"prettier": "^1.14.3",
|
||||
"stylelint": "^9.6.0",
|
||||
"prettier": "^1.15.2",
|
||||
"stylelint": "^9.8.0",
|
||||
"stylelint-config-prettier": "^4.0.0",
|
||||
"stylelint-config-standard": "^18.2.0",
|
||||
"umi": "^2.2.1",
|
||||
"umi-plugin-react": "^1.2.0"
|
||||
"umi": "^2.2.8",
|
||||
"umi-plugin-react": "^1.2.3"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"puppeteer": "^1.9.0"
|
||||
"puppeteer": "^1.10.0"
|
||||
},
|
||||
"lint-staged": {
|
||||
"src/**/*.js": [
|
||||
|
||||
+15
-3
@@ -56,9 +56,21 @@ const transform = async ({ from, to, locales, outputPath }) => {
|
||||
let res = key
|
||||
let way = 'youdao'
|
||||
if (key.indexOf('/') !== 0) {
|
||||
res = await youdao({
|
||||
q: key,
|
||||
})
|
||||
const reg = '{([^{}]*)}'
|
||||
const tasks = key
|
||||
.match(new RegExp(`${reg}|((?<=(${reg}|^)).*?(?=(${reg}|$)))`, 'g'))
|
||||
.map(item => {
|
||||
if (new RegExp(reg).test(item)) {
|
||||
return Promise.resolve(item)
|
||||
}
|
||||
return youdao({
|
||||
q: item,
|
||||
from,
|
||||
to,
|
||||
})
|
||||
})
|
||||
|
||||
res = (await Promise.all(tasks)).join('')
|
||||
} else {
|
||||
res = `/${to + key}`
|
||||
way = 'link'
|
||||
|
||||
@@ -26,13 +26,7 @@ class List extends PureComponent {
|
||||
}
|
||||
|
||||
render() {
|
||||
const {
|
||||
handleMenuClick,
|
||||
onDeleteItem,
|
||||
onEditItem,
|
||||
i18n,
|
||||
...tableProps
|
||||
} = this.props
|
||||
const { onDeleteItem, onEditItem, i18n, ...tableProps } = this.props
|
||||
|
||||
const columns = [
|
||||
{
|
||||
@@ -92,7 +86,7 @@ class List extends PureComponent {
|
||||
render: (text, record) => {
|
||||
return (
|
||||
<DropOption
|
||||
onMenuClick={e => handleMenuClick(record, e)}
|
||||
onMenuClick={e => this.handleMenuClick(record, e)}
|
||||
menuOptions={[
|
||||
{ key: '1', name: i18n.t`Update` },
|
||||
{ key: '2', name: i18n.t`Delete` },
|
||||
|
||||
+2
-4
@@ -1,4 +1,4 @@
|
||||
const api = {
|
||||
export default {
|
||||
queryRouteList: '/routes',
|
||||
|
||||
queryUserInfo: '/user',
|
||||
@@ -8,7 +8,7 @@ const api = {
|
||||
queryUser: '/user/:id',
|
||||
queryUserList: '/users',
|
||||
updateUser: 'Patch /user/:id',
|
||||
createUser: 'POST /user/:id',
|
||||
createUser: 'POST /user',
|
||||
removeUser: 'DELETE /user/:id',
|
||||
removeUserList: 'POST /users/delete',
|
||||
|
||||
@@ -16,5 +16,3 @@ const api = {
|
||||
|
||||
queryDashboard: '/dashboard',
|
||||
}
|
||||
|
||||
export default api
|
||||
|
||||
+2
-3
@@ -246,9 +246,8 @@ export function getLocale() {
|
||||
export function setLocale(language) {
|
||||
if (getLocale() !== language) {
|
||||
umiRouter.push({
|
||||
pathname: `/${language}${deLangPrefix(window.location.pathname)}${
|
||||
window.location.search
|
||||
}`,
|
||||
pathname: `/${language}${deLangPrefix(window.location.pathname)}`,
|
||||
search: window.location.search,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user