From 29732c7d5ae2b5fa3358f209e20e2f9a0017461d Mon Sep 17 00:00:00 2001 From: wzm Date: Tue, 11 Nov 2025 10:06:36 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=B7=A5=E7=A8=8B=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + config/config.ts | 2 +- config/defaultSettings.ts | 2 +- config/proxy.ts | 2 +- package-lock.json | 5 - src/.umi-production/appData.json | 10 +- src/.umi-production/plugin-layout/Layout.tsx | 2 +- src/.umi/appData.json | 934 ++++++++++--------- src/.umi/core/defineApp.ts | 10 +- src/.umi/core/helmet.ts | 2 +- src/.umi/core/history.ts | 2 +- src/.umi/core/historyIntelli.ts | 2 +- src/.umi/core/plugin.ts | 24 +- src/.umi/core/polyfill.ts | 432 ++++----- src/.umi/core/route.tsx | 37 +- src/.umi/exports.ts | 22 +- src/.umi/plugin-layout/Layout.tsx | 6 +- src/.umi/plugin-layout/rightRender.tsx | 2 +- src/.umi/plugin-layout/types.d.ts | 4 +- src/.umi/plugin-locale/locale.tsx | 8 +- src/.umi/plugin-locale/localeExports.ts | 16 +- src/.umi/plugin-locale/runtimeConfig.d.ts | 2 +- src/.umi/plugin-model/index.tsx | 2 +- src/.umi/plugin-model/model.ts | 6 +- src/.umi/plugin-moment2dayjs/runtime.tsx | 26 +- src/.umi/plugin-request/request.ts | 6 +- src/.umi/testBrowser.tsx | 6 +- src/.umi/umi.ts | 6 +- src/components/JobPortalHeader/index.tsx | 2 +- src/pages/User/Login/index.tsx | 2 +- 30 files changed, 820 insertions(+), 763 deletions(-) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3c3629e --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +node_modules diff --git a/config/config.ts b/config/config.ts index aff5e12..4d3bfe7 100644 --- a/config/config.ts +++ b/config/config.ts @@ -76,7 +76,7 @@ export default defineConfig({ * @name layout 插件 * @doc https://umijs.org/docs/max/layout-menu */ - title: '喀什智慧就业服务系统', + title: '石河子智慧就业服务系统', layout: { locale: false, ...defaultSettings, diff --git a/config/defaultSettings.ts b/config/defaultSettings.ts index eec5d5b..581ed28 100644 --- a/config/defaultSettings.ts +++ b/config/defaultSettings.ts @@ -15,7 +15,7 @@ const Settings: ProLayoutProps & { fixedHeader: false, fixSiderbar: true, colorWeak: false, - title: '喀什智慧就业服务系统', + title: '石河子智慧就业服务系统', pwa: true, logo: 'https://gw.alipayobjects.com/zos/rmsportal/KDpgvguMpGfqaHPjicRK.svg', iconfontUrl: '', diff --git a/config/proxy.ts b/config/proxy.ts index 69c3e9f..515a8b5 100644 --- a/config/proxy.ts +++ b/config/proxy.ts @@ -21,7 +21,7 @@ export default { changeOrigin: true, pathRewrite: { '^/api': '' }, }, - '/profile/avatar/': { + '/profile/avatar/': { target: 'http://ks.zhaopinzao8dian.com/api/ks', changeOrigin: true, }, diff --git a/package-lock.json b/package-lock.json index b54aba5..da72891 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,7 +18,6 @@ "@ant-design/use-emotion-css": "1.0.4", "@testing-library/dom": "^10.4.0", "@umijs/route-utils": "^4.0.1", - "ant-design-pro": "file:", "antd": "^5.21.1", "antd-style": "^3.6.2", "classnames": "^2.5.1", @@ -15649,10 +15648,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/ant-design-pro": { - "resolved": "", - "link": true - }, "node_modules/antd": { "version": "5.27.4", "resolved": "https://registry.npmmirror.com/antd/-/antd-5.27.4.tgz", diff --git a/src/.umi-production/appData.json b/src/.umi-production/appData.json index 4f11090..eedeb6d 100644 --- a/src/.umi-production/appData.json +++ b/src/.umi-production/appData.json @@ -2688,7 +2688,7 @@ "fastRefresh": true, "model": {}, "initialState": {}, - "title": "喀什智慧就业服务系统", + "title": "石河子智慧就业服务系统", "layout": { "locale": false, "navTheme": "light", @@ -2698,7 +2698,7 @@ "fixedHeader": false, "fixSiderbar": true, "colorWeak": false, - "title": "喀什智慧就业服务系统", + "title": "石河子智慧就业服务系统", "pwa": true, "logo": "https://gw.alipayobjects.com/zos/rmsportal/KDpgvguMpGfqaHPjicRK.svg", "iconfontUrl": "", @@ -3878,7 +3878,7 @@ "fastRefresh": true, "model": {}, "initialState": {}, - "title": "喀什智慧就业服务系统", + "title": "石河子智慧就业服务系统", "layout": { "locale": false, "navTheme": "light", @@ -3888,7 +3888,7 @@ "fixedHeader": false, "fixSiderbar": true, "colorWeak": false, - "title": "喀什智慧就业服务系统", + "title": "石河子智慧就业服务系统", "pwa": true, "logo": "https://gw.alipayobjects.com/zos/rmsportal/KDpgvguMpGfqaHPjicRK.svg", "iconfontUrl": "", @@ -3970,7 +3970,7 @@ "parentId": "3", "id": "4", "absPath": "/user/login", - "__content": "import Footer from '@/components/Footer';\r\nimport { getCaptchaImg, login } from '@/services/system/auth';\r\nimport { getFakeCaptcha } from '@/services/ant-design-pro/login';\r\nimport {\r\n AlipayCircleOutlined,\r\n LockOutlined,\r\n MobileOutlined,\r\n TaobaoCircleOutlined,\r\n UserOutlined,\r\n WeiboCircleOutlined,\r\n} from '@ant-design/icons';\r\nimport {\r\n LoginForm,\r\n ProFormCaptcha,\r\n ProFormCheckbox,\r\n ProFormText,\r\n} from '@ant-design/pro-components';\r\nimport { useEmotionCss } from '@ant-design/use-emotion-css';\r\nimport { FormattedMessage, Helmet, history, SelectLang, useIntl, useModel } from '@umijs/max';\r\nimport { Alert, Col, Image, message, Row, Tabs } from 'antd';\r\nimport Settings from '../../../../config/defaultSettings';\r\nimport React, { useEffect, useState } from 'react';\r\nimport { flushSync } from 'react-dom';\r\n// flushSync 允许你强制 React 同步刷新提供的回调中的任何更新。这确保了 DOM 立即更新\r\nimport { clearSessionToken, setSessionToken } from '@/access';\r\nimport logoImg from '@/assets/logo.svg';\r\n\r\nconst ActionIcons = () => {\r\n const langClassName = useEmotionCss(({ token }) => {\r\n return {\r\n marginLeft: '8px',\r\n color: 'rgba(0, 0, 0, 0.2)',\r\n fontSize: '24px',\r\n verticalAlign: 'middle',\r\n cursor: 'pointer',\r\n transition: 'color 0.3s',\r\n '&:hover': {\r\n color: token.colorPrimaryActive,\r\n },\r\n };\r\n });\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nconst Lang = () => {\r\n const langClassName = useEmotionCss(({ token }) => {\r\n return {\r\n width: 42,\r\n height: 42,\r\n lineHeight: '42px',\r\n position: 'fixed',\r\n right: 16,\r\n borderRadius: token.borderRadius,\r\n ':hover': {\r\n backgroundColor: token.colorBgTextHover,\r\n },\r\n };\r\n });\r\n\r\n return (\r\n
\r\n {SelectLang && }\r\n
\r\n );\r\n};\r\n\r\nconst LoginMessage: React.FC<{\r\n content: string;\r\n}> = ({ content }) => {\r\n return (\r\n \r\n );\r\n};\r\n\r\nconst Login: React.FC = () => {\r\n const [userLoginState, setUserLoginState] = useState({ code: 200 });\r\n const [type, setType] = useState('account');\r\n const { initialState, setInitialState } = useModel('@@initialState');\r\n const [captchaCode, setCaptchaCode] = useState('');\r\n const [uuid, setUuid] = useState('');\r\n\r\n const containerClassName = useEmotionCss(() => {\r\n return {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n height: '100vh',\r\n overflow: 'auto',\r\n backgroundImage:\r\n \"url('https://mdn.alipayobjects.com/yuyan_qk0oxh/afts/img/V-_oS6r-i7wAAAAAAAAAAAAAFl94AQBr')\",\r\n backgroundSize: '100% 100%',\r\n };\r\n });\r\n\r\n const intl = useIntl();\r\n\r\n const getCaptchaCode = async () => {\r\n const response = await getCaptchaImg();\r\n const imgdata = `data:image/png;base64,${response.img}`;\r\n setCaptchaCode(imgdata);\r\n setUuid(response.uuid);\r\n };\r\n\r\n const fetchUserInfo = async () => {\r\n const userInfo = await initialState?.fetchUserInfo?.();\r\n if (userInfo) {\r\n if (userInfo?.userType === 2) {\r\n history.push('/job-portal');\r\n } else {\r\n const urlParams = new URL(window.location.href).searchParams;\r\n history.push(urlParams.get('redirect') || '/');\r\n setTimeout(() => history.go(0), 0);\r\n history.push('/account/center');\r\n }\r\n console.log('userInfo', userInfo);\r\n flushSync(() => {\r\n setInitialState((s) => ({\r\n ...s,\r\n currentUser: userInfo,\r\n }));\r\n });\r\n }\r\n };\r\n\r\n const handleSubmit = async (values: API.LoginParams) => {\r\n try {\r\n // 登录\r\n const response = await login({ ...values, uuid });\r\n if (response.code === 200) {\r\n const defaultLoginSuccessMessage = intl.formatMessage({\r\n id: 'pages.login.success',\r\n defaultMessage: '登录成功!',\r\n });\r\n const current = new Date();\r\n const expireTime = current.setTime(current.getTime() + 1000 * 12 * 60 * 60);\r\n setSessionToken(response?.token, response?.token, expireTime);\r\n message.success(defaultLoginSuccessMessage);\r\n await fetchUserInfo();\r\n console.log('login ok');\r\n return;\r\n } else {\r\n message.error(response.msg);\r\n clearSessionToken();\r\n // 如果失败去设置用户错误信息\r\n setUserLoginState({ ...response, type });\r\n getCaptchaCode();\r\n }\r\n } catch (error) {\r\n // message.error(response.msg);\r\n const defaultLoginFailureMessage = intl.formatMessage({\r\n id: 'pages.login.failure',\r\n defaultMessage: '登录失败,请重试!',\r\n });\r\n // console.log(error);\r\n message.error(defaultLoginFailureMessage);\r\n }\r\n };\r\n const { code } = userLoginState;\r\n const loginType = type;\r\n\r\n useEffect(() => {\r\n getCaptchaCode();\r\n }, []);\r\n\r\n return (\r\n
\r\n \r\n \r\n {intl.formatMessage({\r\n id: 'menu.login',\r\n defaultMessage: '登录页',\r\n })}\r\n - {Settings.title}\r\n \r\n \r\n \r\n \r\n }\r\n title=\"喀什智慧就业服务系统\"\r\n // subTitle={intl.formatMessage({ id: 'pages.layouts.userLayout.title' })}\r\n initialValues={{\r\n autoLogin: true,\r\n }}\r\n // actions={[\r\n // ,\r\n // ,\r\n // ]}\r\n onFinish={async (values) => {\r\n await handleSubmit(values as API.LoginParams);\r\n }}\r\n >\r\n \r\n\r\n {/*{code !== 200 && loginType === 'account' && (*/}\r\n {/* */}\r\n {/*)}*/}\r\n {type === 'account' && (\r\n <>\r\n ,\r\n }}\r\n placeholder={intl.formatMessage({\r\n id: 'pages.login.username.placeholder',\r\n defaultMessage: '用户名: admin',\r\n })}\r\n rules={[\r\n {\r\n required: true,\r\n message: (\r\n \r\n ),\r\n },\r\n ]}\r\n />\r\n ,\r\n }}\r\n placeholder={intl.formatMessage({\r\n id: 'pages.login.password.placeholder',\r\n defaultMessage: '密码: admin123',\r\n })}\r\n rules={[\r\n {\r\n required: true,\r\n message: (\r\n \r\n ),\r\n },\r\n ]}\r\n />\r\n \r\n \r\n \r\n ),\r\n },\r\n ]}\r\n />\r\n \r\n \r\n getCaptchaCode()}\r\n />\r\n \r\n \r\n \r\n )}\r\n\r\n {code !== 200 && loginType === 'mobile' && }\r\n {type === 'mobile' && (\r\n <>\r\n ,\r\n }}\r\n name=\"mobile\"\r\n placeholder={intl.formatMessage({\r\n id: 'pages.login.phoneNumber.placeholder',\r\n defaultMessage: '手机号',\r\n })}\r\n rules={[\r\n {\r\n required: true,\r\n message: (\r\n \r\n ),\r\n },\r\n {\r\n pattern: /^1\\d{10}$/,\r\n message: (\r\n \r\n ),\r\n },\r\n ]}\r\n />\r\n ,\r\n }}\r\n captchaProps={{\r\n size: 'large',\r\n }}\r\n placeholder={intl.formatMessage({\r\n id: 'pages.login.captcha.placeholder',\r\n defaultMessage: '请输入验证码',\r\n })}\r\n captchaTextRender={(timing, count) => {\r\n if (timing) {\r\n return `${count} ${intl.formatMessage({\r\n id: 'pages.getCaptchaSecondText',\r\n defaultMessage: '获取验证码',\r\n })}`;\r\n }\r\n return intl.formatMessage({\r\n id: 'pages.login.phoneLogin.getVerificationCode',\r\n defaultMessage: '获取验证码',\r\n });\r\n }}\r\n name=\"captcha\"\r\n rules={[\r\n {\r\n required: true,\r\n message: (\r\n \r\n ),\r\n },\r\n ]}\r\n onGetCaptcha={async (phone) => {\r\n const result = await getFakeCaptcha({\r\n phone,\r\n });\r\n if (!result) {\r\n return;\r\n }\r\n message.success('获取验证码成功!验证码为:1234');\r\n }}\r\n />\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n \r\n \r\n