@jiangood/open-admin 2.2.5 → 2.2.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -13,7 +13,6 @@
13
13
  "antd-img-crop": "^4.23.0",
14
14
  "axios": "^1.13.2",
15
15
  "dayjs": "^1.11.13",
16
- "jsencrypt": "^3.5.4",
17
16
  "lodash": "^4.17.23",
18
17
  "qs": "^6.14.0",
19
18
  "react": "^19.0.0",
@@ -37,5 +36,5 @@
37
36
  "dev": "umi dev",
38
37
  "build": "umi build"
39
38
  },
40
- "version": "2.2.5"
41
- }
39
+ "version": "2.2.7"
40
+ }
@@ -15,7 +15,6 @@
15
15
  "antd-img-crop": "^4.23.0",
16
16
  "axios": "^1.13.2",
17
17
  "dayjs": "^1.11.13",
18
- "jsencrypt": "^3.5.4",
19
18
  "lodash": "^4.17.23",
20
19
  "qs": "^6.14.0",
21
20
  "react": "^19.0.0",
@@ -39,7 +38,7 @@
39
38
  "dev": "umi dev",
40
39
  "build": "umi build"
41
40
  },
42
- "version": "2.2.5"
41
+ "version": "2.2.7"
43
42
  },
44
43
  "pkgPath": "/home/runner/work/open-admin/open-admin/web/package.json",
45
44
  "plugins": {
@@ -82,7 +81,7 @@
82
81
  0
83
82
  ]
84
83
  },
85
- "register": 3
84
+ "register": 2
86
85
  },
87
86
  "enableBy": "register"
88
87
  },
@@ -96,7 +95,7 @@
96
95
  "time": {
97
96
  "hooks": {
98
97
  "onStart": [
99
- 0
98
+ 1
100
99
  ]
101
100
  },
102
101
  "register": 2
@@ -143,10 +142,10 @@
143
142
  "time": {
144
143
  "hooks": {
145
144
  "modifyAppData": [
146
- 59
145
+ 57
147
146
  ]
148
147
  },
149
- "register": 23
148
+ "register": 22
150
149
  },
151
150
  "enableBy": "register"
152
151
  },
@@ -1078,7 +1077,7 @@
1078
1077
  "config": {},
1079
1078
  "time": {
1080
1079
  "hooks": {},
1081
- "register": 1
1080
+ "register": 0
1082
1081
  },
1083
1082
  "enableBy": "config"
1084
1083
  },
@@ -1092,10 +1091,10 @@
1092
1091
  "time": {
1093
1092
  "hooks": {
1094
1093
  "onStart": [
1095
- 1
1094
+ 0
1096
1095
  ]
1097
1096
  },
1098
- "register": 0
1097
+ "register": 1
1099
1098
  },
1100
1099
  "enableBy": "register"
1101
1100
  },
@@ -1121,7 +1120,7 @@
1121
1120
  "config": {},
1122
1121
  "time": {
1123
1122
  "hooks": {},
1124
- "register": 100
1123
+ "register": 96
1125
1124
  },
1126
1125
  "enableBy": "register"
1127
1126
  },
@@ -1134,7 +1133,7 @@
1134
1133
  "config": {},
1135
1134
  "time": {
1136
1135
  "hooks": {},
1137
- "register": 28
1136
+ "register": 27
1138
1137
  },
1139
1138
  "enableBy": "config"
1140
1139
  },
@@ -1147,7 +1146,7 @@
1147
1146
  "config": {},
1148
1147
  "time": {
1149
1148
  "hooks": {},
1150
- "register": 9
1149
+ "register": 8
1151
1150
  },
1152
1151
  "enableBy": "config"
1153
1152
  },
@@ -1161,10 +1160,10 @@
1161
1160
  "time": {
1162
1161
  "hooks": {
1163
1162
  "modifyAppData": [
1164
- 1
1163
+ 0
1165
1164
  ]
1166
1165
  },
1167
- "register": 0
1166
+ "register": 1
1168
1167
  },
1169
1168
  "enableBy": "register"
1170
1169
  },
@@ -1177,7 +1176,7 @@
1177
1176
  "config": {},
1178
1177
  "time": {
1179
1178
  "hooks": {},
1180
- "register": 1
1179
+ "register": 0
1181
1180
  },
1182
1181
  "enableBy": "register"
1183
1182
  },
@@ -1190,7 +1189,7 @@
1190
1189
  "config": {},
1191
1190
  "time": {
1192
1191
  "hooks": {},
1193
- "register": 1
1192
+ "register": 2
1194
1193
  },
1195
1194
  "enableBy": "config"
1196
1195
  },
@@ -1203,7 +1202,7 @@
1203
1202
  "config": {},
1204
1203
  "time": {
1205
1204
  "hooks": {},
1206
- "register": 31
1205
+ "register": 30
1207
1206
  }
1208
1207
  },
1209
1208
  "./node_modules/@umijs/preset-umi/dist/features/mpa/mpa": {
@@ -1450,7 +1449,7 @@
1450
1449
  "config": {},
1451
1450
  "time": {
1452
1451
  "hooks": {},
1453
- "register": 4
1452
+ "register": 3
1454
1453
  }
1455
1454
  },
1456
1455
  "./node_modules/@umijs/preset-umi/dist/features/monorepo/redirect": {
@@ -1462,7 +1461,7 @@
1462
1461
  "config": {},
1463
1462
  "time": {
1464
1463
  "hooks": {},
1465
- "register": 21
1464
+ "register": 22
1466
1465
  },
1467
1466
  "enableBy": "config"
1468
1467
  },
@@ -1475,7 +1474,7 @@
1475
1474
  "config": {},
1476
1475
  "time": {
1477
1476
  "hooks": {},
1478
- "register": 0
1477
+ "register": 1
1479
1478
  }
1480
1479
  },
1481
1480
  "./node_modules/@umijs/preset-umi/dist/features/clickToComponent/clickToComponent": {
@@ -1615,7 +1614,7 @@
1615
1614
  "config": {},
1616
1615
  "time": {
1617
1616
  "hooks": {},
1618
- "register": 1
1617
+ "register": 2
1619
1618
  },
1620
1619
  "enableBy": "config"
1621
1620
  },
@@ -1641,7 +1640,7 @@
1641
1640
  "config": {},
1642
1641
  "time": {
1643
1642
  "hooks": {},
1644
- "register": 4
1643
+ "register": 3
1645
1644
  },
1646
1645
  "enableBy": "register"
1647
1646
  },
@@ -1654,7 +1653,7 @@
1654
1653
  "config": {},
1655
1654
  "time": {
1656
1655
  "hooks": {},
1657
- "register": 44
1656
+ "register": 43
1658
1657
  },
1659
1658
  "enableBy": "register"
1660
1659
  },
@@ -1667,7 +1666,7 @@
1667
1666
  "config": {},
1668
1667
  "time": {
1669
1668
  "hooks": {},
1670
- "register": 17
1669
+ "register": 16
1671
1670
  }
1672
1671
  },
1673
1672
  "./node_modules/@umijs/preset-umi/dist/commands/help": {
@@ -1705,7 +1704,7 @@
1705
1704
  "config": {},
1706
1705
  "time": {
1707
1706
  "hooks": {},
1708
- "register": 0
1707
+ "register": 1
1709
1708
  },
1710
1709
  "enableBy": "register"
1711
1710
  },
@@ -1718,7 +1717,7 @@
1718
1717
  "config": {},
1719
1718
  "time": {
1720
1719
  "hooks": {},
1721
- "register": 1
1720
+ "register": 0
1722
1721
  },
1723
1722
  "enableBy": "register"
1724
1723
  },
@@ -1731,7 +1730,7 @@
1731
1730
  "config": {},
1732
1731
  "time": {
1733
1732
  "hooks": {},
1734
- "register": 0
1733
+ "register": 1
1735
1734
  },
1736
1735
  "enableBy": "register"
1737
1736
  },
@@ -1744,7 +1743,7 @@
1744
1743
  "config": {},
1745
1744
  "time": {
1746
1745
  "hooks": {},
1747
- "register": 2
1746
+ "register": 1
1748
1747
  },
1749
1748
  "enableBy": "register"
1750
1749
  },
@@ -1770,7 +1769,7 @@
1770
1769
  "config": {},
1771
1770
  "time": {
1772
1771
  "hooks": {},
1773
- "register": 1
1772
+ "register": 0
1774
1773
  },
1775
1774
  "enableBy": "register"
1776
1775
  },
@@ -1822,7 +1821,7 @@
1822
1821
  "config": {},
1823
1822
  "time": {
1824
1823
  "hooks": {},
1825
- "register": 0
1824
+ "register": 1
1826
1825
  },
1827
1826
  "enableBy": "register"
1828
1827
  },
@@ -1835,7 +1834,7 @@
1835
1834
  "config": {},
1836
1835
  "time": {
1837
1836
  "hooks": {},
1838
- "register": 1
1837
+ "register": 0
1839
1838
  },
1840
1839
  "enableBy": "register"
1841
1840
  },
@@ -1913,7 +1912,7 @@
1913
1912
  "config": {},
1914
1913
  "time": {
1915
1914
  "hooks": {},
1916
- "register": 22
1915
+ "register": 21
1917
1916
  },
1918
1917
  "enableBy": "register"
1919
1918
  },
@@ -1939,7 +1938,7 @@
1939
1938
  "config": {},
1940
1939
  "time": {
1941
1940
  "hooks": {},
1942
- "register": 1
1941
+ "register": 2
1943
1942
  },
1944
1943
  "enableBy": "register"
1945
1944
  },
@@ -1952,7 +1951,7 @@
1952
1951
  "config": {},
1953
1952
  "time": {
1954
1953
  "hooks": {},
1955
- "register": 1
1954
+ "register": 0
1956
1955
  },
1957
1956
  "enableBy": "register"
1958
1957
  },
@@ -2206,7 +2205,7 @@
2206
2205
  "parentId": "@@/global-layout",
2207
2206
  "file": "login.jsx",
2208
2207
  "absPath": "/login",
2209
- "__content": "import React from 'react';\nimport {Button, Form, Input, message, Space} from 'antd';\nimport {LockOutlined, SafetyCertificateOutlined, UserOutlined, WarningOutlined} from '@ant-design/icons';\nimport {JSEncrypt} from \"jsencrypt\";\nimport {history} from 'umi';\nimport {EventBusUtils, HttpUtils, PageUtils, MessageUtils, SysUtils} from \"../framework/utils\";\n\nimport \"./login.less\"\n\nfunction getRedirect() {\n let redirect = PageUtils.currentParams()['redirect'];\n if (redirect) {\n redirect = decodeURIComponent(redirect)\n } else {\n redirect = '/'\n }\n return redirect;\n}\n\nfunction postLogin(values) {\n return new Promise((resolve, reject) => {\n HttpUtils.post('/admin/auth/login', values).then(rs => {\n EventBusUtils.emit('loginSuccess')\n history.push(getRedirect())\n resolve(rs)\n }).catch(e => {\n console.error('[Login] 登录失败:', e);\n reject(e)\n })\n })\n}\n\nexport default class extends React.Component {\n\n state = {\n logging: false,\n siteInfo: {},\n random: Math.random()\n }\n\n async componentDidMount() {\n const siteInfo = SysUtils.getSiteInfo()\n if (siteInfo && siteInfo.rsaPublicKey) {\n this.setState({siteInfo})\n return\n }\n // localStorage 中无站点信息,从服务端重新加载\n try {\n const rs = await HttpUtils.get('/admin/public/site-info')\n SysUtils.setSiteInfo(rs)\n this.setState({siteInfo: rs})\n } catch (e) {\n console.error('[Login] 加载站点信息失败:', e);\n message.error('加载站点信息失败,请刷新页面重试')\n }\n }\n\n submit = values => {\n this.setState({logging: true})\n\n const pubkey = this.state.siteInfo.rsaPublicKey;\n if (!pubkey) {\n message.error(\"未获取密钥,请刷新浏览器再试\")\n this.setState({logging: false})\n return\n }\n const crypt = new JSEncrypt();\n crypt.setPublicKey(pubkey);\n values.password = crypt.encrypt(values.password)\n\n postLogin(values).finally(() => {\n this.setState({logging: false})\n })\n }\n\n render() {\n const {siteInfo} = this.state\n\n const pageStyle = {\n backgroundImage: `url(\"${SysUtils.contextPath('/admin/public/login_bg.jpg')}\")`\n }\n if (siteInfo.loginBackground) {\n const url = SysUtils.contextPath('/admin/sysFile/preview/' + siteInfo.loginBackground);\n pageStyle.backgroundImage = 'url(\"' + url + '\")'\n }\n\n return (\n <section className='login-page' style={pageStyle}>\n <div className=\"login-content\">\n <h1>{siteInfo.title}</h1>\n {this.getForm(siteInfo)}\n {this.renderFormBottom()}\n </div>\n </section>\n );\n }\n\n getForm = siteInfo => {\n const form = (\n <Form\n name=\"normal_login\"\n className=\"login-form\"\n initialValues={{remember: true}}\n onFinish={this.submit}\n requiredMark={false}\n colon={false}\n >\n <Form.Item name=\"username\" rules={[{required: true, message: '请输入用户名!'}]}>\n <Input size='large' prefix={<UserOutlined/>} placeholder=\"用户名\" autoComplete=\"off\"/>\n </Form.Item>\n <Form.Item name=\"password\" rules={[{required: true, message: '请输入密码!'}]}>\n <Input autoComplete=\"off\" prefix={<LockOutlined/>} type=\"password\" placeholder=\"密码\"\n size='large'\n />\n </Form.Item>\n\n {siteInfo.captcha && (\n <Form.Item name='captchaCode' rules={[{required: true}]}>\n <Space style={{alignItems: 'center'}}>\n <Input size='large' placeholder='验证码' prefix={<SafetyCertificateOutlined/>}/>\n <img height={36} width={100}\n src={SysUtils.contextPath(\"/admin/auth/captcha-image?_random=\" + this.state.random)}\n onClick={() => this.setState({random: Math.random()})}/>\n </Space>\n </Form.Item>\n )}\n\n <Form.Item style={{marginTop: 10}}>\n <Button loading={this.state.logging} type=\"primary\" htmlType=\"submit\"\n block size='large'>\n 登录\n </Button>\n </Form.Item>\n </Form>\n );\n\n if (this.props.formRender) {\n return this.props.formRender(form);\n }\n return form;\n };\n\n renderFormBottom() {\n const siteInfo = this.state.siteInfo;\n if (siteInfo.loginBoxBottomTip) {\n return (\n <div style={{color: 'white', marginTop: 50, fontSize: '14px', textAlign: 'center'}}>\n <WarningOutlined/> {siteInfo.loginBoxBottomTip}\n </div>\n )\n }\n }\n}\n",
2208
+ "__content": "import React from 'react';\nimport {Button, Form, Input, message, Space} from 'antd';\nimport {LockOutlined, SafetyCertificateOutlined, UserOutlined, WarningOutlined} from '@ant-design/icons';\nimport {history} from 'umi';\nimport {EventBusUtils, HttpUtils, PageUtils, MessageUtils, SysUtils} from \"../framework/utils\";\n\nimport \"./login.less\"\n\nfunction getRedirect() {\n let redirect = PageUtils.currentParams()['redirect'];\n if (redirect) {\n redirect = decodeURIComponent(redirect)\n } else {\n redirect = '/'\n }\n return redirect;\n}\n\nfunction postLogin(values) {\n return new Promise((resolve, reject) => {\n HttpUtils.post('/admin/auth/login', values).then(rs => {\n EventBusUtils.emit('loginSuccess')\n history.push(getRedirect())\n resolve(rs)\n }).catch(e => {\n console.error('[Login] 登录失败:', e);\n reject(e)\n })\n })\n}\n\nfunction encodePassword(pwd) {\n const chars = [];\n for (let i = 0; i < pwd.length; i++)\n chars.push(pwd.charCodeAt(i) + i + 2);\n return btoa(String.fromCharCode(...chars));\n}\n\nexport default class extends React.Component {\n\n state = {\n logging: false,\n siteInfo: {},\n random: Math.random()\n }\n\n async componentDidMount() {\n const siteInfo = SysUtils.getSiteInfo()\n if (siteInfo && siteInfo.title) {\n this.setState({siteInfo})\n return\n }\n // localStorage 中无站点信息,从服务端重新加载\n try {\n const rs = await HttpUtils.get('/admin/public/site-info')\n SysUtils.setSiteInfo(rs)\n this.setState({siteInfo: rs})\n } catch (e) {\n console.error('[Login] 加载站点信息失败:', e);\n message.error('加载站点信息失败,请刷新页面重试')\n }\n }\n\n submit = values => {\n this.setState({logging: true})\n values.password = encodePassword(values.password)\n postLogin(values).finally(() => {\n this.setState({logging: false})\n })\n }\n\n render() {\n const {siteInfo} = this.state\n\n const pageStyle = {\n backgroundImage: `url(\"${SysUtils.contextPath('/admin/public/login_bg.jpg')}\")`\n }\n if (siteInfo.loginBackground) {\n const url = SysUtils.contextPath('/admin/sysFile/preview/' + siteInfo.loginBackground);\n pageStyle.backgroundImage = 'url(\"' + url + '\")'\n }\n\n return (\n <section className='login-page' style={pageStyle}>\n <div className=\"login-content\">\n <h1>{siteInfo.title}</h1>\n {this.getForm(siteInfo)}\n {this.renderFormBottom()}\n </div>\n </section>\n );\n }\n\n getForm = siteInfo => {\n const form = (\n <Form\n name=\"normal_login\"\n className=\"login-form\"\n initialValues={{remember: true}}\n onFinish={this.submit}\n requiredMark={false}\n colon={false}\n >\n <Form.Item name=\"username\" rules={[{required: true, message: '请输入用户名!'}]}>\n <Input size='large' prefix={<UserOutlined/>} placeholder=\"用户名\" autoComplete=\"off\"/>\n </Form.Item>\n <Form.Item name=\"password\" rules={[{required: true, message: '请输入密码!'}]}>\n <Input autoComplete=\"off\" prefix={<LockOutlined/>} type=\"password\" placeholder=\"密码\"\n size='large'\n />\n </Form.Item>\n\n {siteInfo.captcha && (\n <Form.Item name='captchaCode' rules={[{required: true}]}>\n <Space style={{alignItems: 'center'}}>\n <Input size='large' placeholder='验证码' prefix={<SafetyCertificateOutlined/>}/>\n <img height={36} width={100}\n src={SysUtils.contextPath(\"/admin/auth/captcha-image?_random=\" + this.state.random)}\n onClick={() => this.setState({random: Math.random()})}/>\n </Space>\n </Form.Item>\n )}\n\n <Form.Item style={{marginTop: 10}}>\n <Button loading={this.state.logging} type=\"primary\" htmlType=\"submit\"\n block size='large'>\n 登录\n </Button>\n </Form.Item>\n </Form>\n );\n\n if (this.props.formRender) {\n return this.props.formRender(form);\n }\n return form;\n };\n\n renderFormBottom() {\n const siteInfo = this.state.siteInfo;\n if (siteInfo.loginBoxBottomTip) {\n return (\n <div style={{color: 'white', marginTop: 50, fontSize: '14px', textAlign: 'center'}}>\n <WarningOutlined/> {siteInfo.loginBoxBottomTip}\n </div>\n )\n }\n }\n}\n",
2210
2209
  "__isJSFile": true,
2211
2210
  "__absFile": "/home/runner/work/open-admin/open-admin/web/src/pages/login.jsx"
2212
2211
  },
@@ -81,9 +81,9 @@ export default class extends React.Component {
81
81
  if (!activeTopMenuKey && topMenus.length > 0) {
82
82
  activeTopMenuKey = topMenus[0].key;
83
83
  sideMenus = topMenus[0].children || [];
84
- if (!currentMenuKey && sideMenus.length > 0) {
84
+ if (!currentMenuKey && sideMenus.length > 0 && (pathname === '' || pathname === '/')) {
85
85
  currentMenuKey = sideMenus[0].key;
86
- if (sideMenus[0].path) {
86
+ if (sideMenus[0].path && (pathname === '' || pathname === '/')) {
87
87
  history.push(sideMenus[0].path);
88
88
  }
89
89
  }
@@ -117,8 +117,8 @@ export default class extends React.Component {
117
117
  if (leafRootNodes.length > 0) {
118
118
  const defaultGroup = {
119
119
  key: '_default_group',
120
- label: '默认',
121
- title: '默',
120
+ label: '业务模块',
121
+ title: '业',
122
122
  icon: <NamedIcon name="AppstoreOutlined" style={{fontSize: 12}}/>,
123
123
  children: leafRootNodes,
124
124
  type: 'directory',
@@ -1,7 +1,6 @@
1
1
  import React from 'react';
2
2
  import {Button, Form, Input, message, Space} from 'antd';
3
3
  import {LockOutlined, SafetyCertificateOutlined, UserOutlined, WarningOutlined} from '@ant-design/icons';
4
- import {JSEncrypt} from "jsencrypt";
5
4
  import {history} from 'umi';
6
5
  import {EventBusUtils, HttpUtils, PageUtils, MessageUtils, SysUtils} from "../framework/utils";
7
6
 
@@ -30,6 +29,13 @@ function postLogin(values) {
30
29
  })
31
30
  }
32
31
 
32
+ function encodePassword(pwd) {
33
+ const chars = [];
34
+ for (let i = 0; i < pwd.length; i++)
35
+ chars.push(pwd.charCodeAt(i) + i + 2);
36
+ return btoa(String.fromCharCode(...chars));
37
+ }
38
+
33
39
  export default class extends React.Component {
34
40
 
35
41
  state = {
@@ -40,7 +46,7 @@ export default class extends React.Component {
40
46
 
41
47
  async componentDidMount() {
42
48
  const siteInfo = SysUtils.getSiteInfo()
43
- if (siteInfo && siteInfo.rsaPublicKey) {
49
+ if (siteInfo && siteInfo.title) {
44
50
  this.setState({siteInfo})
45
51
  return
46
52
  }
@@ -57,17 +63,7 @@ export default class extends React.Component {
57
63
 
58
64
  submit = values => {
59
65
  this.setState({logging: true})
60
-
61
- const pubkey = this.state.siteInfo.rsaPublicKey;
62
- if (!pubkey) {
63
- message.error("未获取密钥,请刷新浏览器再试")
64
- this.setState({logging: false})
65
- return
66
- }
67
- const crypt = new JSEncrypt();
68
- crypt.setPublicKey(pubkey);
69
- values.password = crypt.encrypt(values.password)
70
-
66
+ values.password = encodePassword(values.password)
71
67
  postLogin(values).finally(() => {
72
68
  this.setState({logging: false})
73
69
  })