diff --git a/src/main.jsx b/src/main.jsx
index 38a7f0c..01c1118 100644
--- a/src/main.jsx
+++ b/src/main.jsx
@@ -2,23 +2,22 @@ import React from 'react';
import ReactDOM from 'react-dom/client';
import { configure } from 'mobx';
import { createBrowserRouter, RouterProvider } from 'react-router-dom';
-import { AuthContext } from '@/stores/AuthContext';
-import { ThemeContext } from '@/stores/ThemeContext';
-import ConversationProvider from '@/views/Conversations/ConversationProvider';
-import Auth from '@/stores/Auth';
-import App from '@/views/App';
-import Standlone from '@/views/Standlone';
-import OrderFollow from '@/views/OrderFollow';
-import ChatHistory from '@/views/ChatHistory';
-import SalesManagement from '@/views/SalesManagement';
-import DingdingQRCode from '@/views/DingdingQRCode';
-import DingdingCallbak from '@/views/DingdingCallbak';
-import AccountProfile from '@/views/AccountProfile';
-import ErrorPage from '@/views/ErrorPage';
+import { AuthContext } from '@/stores/AuthContext'
+import { ThemeContext } from '@/stores/ThemeContext'
+import ConversationProvider from '@/views/Conversations/ConversationProvider'
+import Auth from '@/stores/Auth'
+import App from '@/views/App'
+import Standlone from '@/views/Standlone'
+import OrderFollow from '@/views/OrderFollow'
+import ChatHistory from '@/views/ChatHistory'
+import SalesManagement from '@/views/SalesManagement'
+import DingdingQRCode from '@/views/DingdingQRCode'
+import AccountProfile from '@/views/AccountProfile'
+import ErrorPage from '@/views/ErrorPage'
-import Conversations from '@/views/Conversations/ChatWindow';
-// import Conversations from '@/views/Conversations/ChatApp';
-import '@/assets/index.css';
+import Conversations from '@/views/Conversations/ChatWindow'
+// import Conversations from '@/views/Conversations/ChatApp'
+import '@/assets/index.css'
configure({
useProxies: 'ifavailable',
@@ -48,7 +47,6 @@ const router = createBrowserRouter([
element: ,
children: [
{ path: 'dingding/qrcode', element: },
- { path: 'dingding/callback', element: },
],
},
]);
diff --git a/src/views/AccountProfile.jsx b/src/views/AccountProfile.jsx
index 1a4421b..e7b3637 100644
--- a/src/views/AccountProfile.jsx
+++ b/src/views/AccountProfile.jsx
@@ -22,10 +22,10 @@ function AccountProfile() {
- 骆梅玉
- +86-15878301602
- christyluo@hainatravel.com
- 海纳业务组-GH事业部群-GH销售
+ {loginUser.username}
+ {loginUser.accountName}
+ {loginUser.stateCode} {loginUser.mobile}
+ {loginUser.email}
diff --git a/src/views/App.jsx b/src/views/App.jsx
index e0086ff..4bb5dc4 100644
--- a/src/views/App.jsx
+++ b/src/views/App.jsx
@@ -15,7 +15,7 @@ import { isEmpty } from '@/utils/commons';
const { Header, Footer, Content } = Layout
const { Title } = Typography
-// SecurityApp
+// AuthApp
function App() {
const { colorPrimary, borderRadius } = useThemeContext()
diff --git a/src/views/DingdingCallbak.jsx b/src/views/DingdingCallbak.jsx
deleted file mode 100644
index 7ca7491..0000000
--- a/src/views/DingdingCallbak.jsx
+++ /dev/null
@@ -1,56 +0,0 @@
-import React, { useEffect } from 'react'
-import { useParams, useNavigate } from 'react-router-dom'
-import { Card, Typography, Flex, Result, Button } from 'antd'
-import { useRequest } from 'ahooks'
-
-const { Title } = Typography
-const { Meta } = Card
-
-import { useAuthContext } from '@/stores/AuthContext'
-
-function DingdingCallbak() {
-
- const navigate = useNavigate()
- const params = new URLSearchParams(window.location.search)
- const code = params.get('code')
- const state = params.get('state')
-
- console.info('code: ' + code)
- console.info('state: ' + state)
-
- const { loginUser, permissionList } = useAuthContext()
- console.info('loginUser: ')
- console.info(loginUser)
- console.info('permissionList: ')
- console.info(permissionList)
-
-
- // const { data, error, loading } = useRequest(() => {
- // return new Promise((resolve) => {
- // setTimeout(() => {
- // resolve('use Request data...');
- // }, 1000);
- // });
- // });
- setTimeout(() => {
- loginUser.userId = 999
- loginUser.openId = '987654321'
- navigate('/s/account/profile')
- }, 1000);
-
- useEffect(() => {
- }, [])
-
- return (
-
- 正在获取你的权限,请稍等
-
-
- )
-}
-
-export default DingdingCallbak;
\ No newline at end of file
diff --git a/src/views/DingdingQRCode.jsx b/src/views/DingdingQRCode.jsx
index 34584e3..3c091a4 100644
--- a/src/views/DingdingQRCode.jsx
+++ b/src/views/DingdingQRCode.jsx
@@ -1,15 +1,21 @@
-import { Card, Flex, Typography } from 'antd'
-import React, { useEffect } from 'react'
+import { Result, Spin, Flex, Typography } from 'antd'
+import React, { useEffect, useState } from 'react'
+import { useNavigate } from 'react-router-dom'
+
+import { useAuthContext } from '@/stores/AuthContext'
const { Title } = Typography
-const { Meta } = Card
// 钉钉扫码开发文档:https://open.dingtalk.com/document/orgapp/tutorial-obtaining-user-personal-information#title-qpi-0qv-anm
function DingdingQRCode() {
+ const navigate = useNavigate()
+ const { loginUser } = useAuthContext()
+ const [loginStatus, setLoginStatus] = useState(0)
+
useEffect(() => {
- import('https://g.alicdn.com/dingding/h5-dingtalk-login/0.21.0/ddlogin.js').then((module) => {
+ import('https://g.alicdn.com/dingding/h5-dingtalk-login/0.21.0/ddlogin.js').then(() => {
window.DTFrameLogin(
{
id: 'qrCodeContainer',
@@ -17,34 +23,76 @@ function DingdingQRCode() {
height: 300,
},
{
- redirect_uri: encodeURIComponent('https://sales.mycht.cn/dingding/callback'),
+ redirect_uri: encodeURIComponent('https://sales.mycht.cn/p/dingding/callback'),
client_id: 'dingwgdx6emlxr3fcrg8',
scope: 'openid',
response_type: 'code',
- state: 'state1111',
+ state: 'global-sales',
prompt: 'consent',
},
(loginResult) => {
- const { redirectUrl, authCode, state } = loginResult
- // 这里可以直接进行重定向
- window.location.href = redirectUrl
- // 也可以在不跳转页面的情况下,使用code进行授权
- console.log(authCode)
+ const { authCode } = loginResult
+ console.log(loginResult)
+ setLoginStatus(200)
+
+ fetch(`https://p9axztuwd7x8a7.mycht.cn/dingtalk/dingtalkwork/WhatsAppAuth?authCode=${authCode}`)
+ .then(response => response.json())
+ .then(json => {
+ // {"errcode":0,"errmsg":"ok","result":{"nick":"廖一军","unionId":"j7cuUCplZe1ZiiqjQNUUmFwiEiE","avatarUrl":"https://static-legacy.dingtalk.com/media/lALPBDDrhXr716HNAoDNAoA_640_640.png","openId":"iioljiPmZ4RPoOYpkFiSn7IKAiEiE","mobile":"18777396951","stateCode":"86","email":"lyj@hainatravel.com","opisn":"383"}}
+ if (json.errcode === 0) {
+ loginUser.userId = json.result.opisn
+ loginUser.accountName = json.result.opisn
+ loginUser.username = json.result.nick
+ loginUser.avatarUrl = json.result.avatarUrl
+ loginUser.stateCode = json.result.stateCode
+ loginUser.mobile = json.result.mobile
+ loginUser.email = json.result.email
+ loginUser.openId = json.result.openId
+ navigate('/account/profile')
+ } else {
+ setLoginStatus(403)
+ }
+ })
},
(errorMsg) => {
- // 这里一般需要展示登录失败的具体原因
- alert(`Login Error: ${errorMsg}`)
+ setLoginStatus(403)
+ console.error(`Login Error: ${errorMsg}`)
},
)
})
}, [])
- return (
-
- 使用钉钉扫码
-
-
- )
+ if (loginStatus === 200) {
+ return (
+
+
+ ]}
+ />
+
+ )
+ } else if (loginStatus === 403) {
+ return (
+
+
+
+ )
+ } else {
+ return (
+
+ 使用钉钉扫码
+
+
+ )
+ }
}
export default DingdingQRCode
\ No newline at end of file
diff --git a/src/views/OrderFollow.jsx b/src/views/OrderFollow.jsx
index 624cf9d..6fdd417 100644
--- a/src/views/OrderFollow.jsx
+++ b/src/views/OrderFollow.jsx
@@ -1,8 +1,8 @@
import { useNavigate } from 'react-router-dom'
import { memo, useMemo, useCallback, useEffect, useState } from 'react'
import {
- Row, Col, Divider, Table, Card, Button, Input,
- Space, Segmented, Radio, Select, Flex, Spin, Form, Switch, DatePicker, List, Avatar
+ Row, Badge, Divider, Table, Card, Button, Input,
+ Space, Tag, Radio, Select, Flex, Spin, Form, Switch, DatePicker, List, Avatar
} from 'antd'
import {
StarFilled, ZoomInOutlined, StarOutlined, BarsOutlined, AppstoreOutlined, SearchOutlined
@@ -83,29 +83,11 @@ const columns = [
title: '订单号',
dataIndex: 'orderNumber',
key: 'orderNumber',
- width: 300,
- render: (text, record, inde) => {
- return (
-
- {text}
-
-
- )
+ width: 222,
+ render: (text, record, index) => {
+ if (index === 1) return {text}重点
+ else if (index === 2) return {text}潜力
+ else return {text}休眠
}
},
{
@@ -116,6 +98,13 @@ const columns = [
return (
{text}
+
)
}
@@ -125,42 +114,11 @@ const columns = [
dataIndex: 'orderStatus',
key: 'orderStatus',
width: 120,
- render: (text, record, inde) => {
- return (
-
- )
+ render: (text, record, index) => {
+ if (index === 1) return text + '(一催)'
+ else if (index === 2) return text + '(二催)'
+ else if (index === 3) return text + '(三催)'
+ else return text
}
},
{
@@ -181,11 +139,10 @@ const columns = [
},
]
-const AdvanceSearchForm = memo(function AdvanceSearch({ onSubmit }) {
+const AdvanceSearchForm = memo(function ({ onSubmit }) {
const [form] = Form.useForm()
- console.info('AdvanceSearch: ')
function handleSubmit(values) {
- onSubmit(values);
+ onSubmit?.(values)
}
return (
+ )
+})
-function SalesManagement() {
+const SalesTable = function({formValues}) {
+ console.info('SalesTable')
+ console.info(formValues)
- const keywordProps = useFormInput('')
- const countryList = useGetJson(`https://p9axztuwd7x8a7.mycht.cn/service-InfoSys/InfoSys/GetCountryList`)
- console.info(countryList)
+ const isMounted = useRef(false)
+
+ const [salesData, setSalesData] = useState([])
+ const [loading, setLoading] = useState(false)
useEffect(() => {
+ console.info('SalesTable.useEffect')
+ console.info(isMounted)
+ setLoading(true)
+ // setSalesData([]) // 可改为设置加载状态
+ setTimeout(() => {
+ const randomData = dataSource.map(data => {
+ data.important = Math.floor(Math.random() * (100 - 2 + 1) + 2)
+ return data
+ })
+ setSalesData([...randomData])
+ setLoading(false)
+ }, 1000)
+ isMounted.current = true
+ }, [formValues])
+
+ const columns = [
+ {
+ title: '顾问',
+ dataIndex: 'travelAdvisor',
+ key: 'travelAdvisor',
+ },
+ {
+ title: '重点订单',
+ dataIndex: 'important',
+ key: 'important',
+ },
+ {
+ title: '潜力客户',
+ dataIndex: 'star',
+ key: 'star',
+ },
+ {
+ title: '成型',
+ dataIndex: 'ing',
+ key: 'ing',
+ },
+ ]
+ return (
+
+ )
+}
+
+function SalesManagement() {
+
+ const [formValues, setFormValues] = useState({})
+
+ const handleSubmit = useCallback((values) => {
+ setFormValues({...values})
}, [])
-
+
return (
-
-
-
-
-
-
-
-
-
-
- } onClick={() => {console.info(keywordProps.value)}}>OK
- }>导入联系人
-
-
-
+ <>
+
-
-
-
-
+
+ >
)
}
diff --git a/vite.config.js b/vite.config.js
index 505e794..a5b5f14 100644
--- a/vite.config.js
+++ b/vite.config.js
@@ -17,29 +17,18 @@ export default defineConfig({
sourcemap: true,
manifest: true,
chunkSizeWarningLimit: 555,
- rollupOptions: {
- output: {
- manualChunks(id) {
- // if (id.includes('antd')) {
- // console.info('chunk: ' + id)
- // return 'antd-component'
- // } else if (id.includes('rc-')) {
- // return 'rc-component'
- // } else if (id.includes('ant-design')) {
- // return 'ant-design'
- // } else {
- // // console.info('chunk: ' + id)
- // }
- if (id.includes('node_modules')) {
- return id.toString().split('node_modules/')[1].split('/')[0].toString();
- }
- },
- chunkFileNames: (chunkInfo) => {
- const facadeModuleId = chunkInfo.facadeModuleId ? chunkInfo.facadeModuleId.split('/') : [];
- // const fileName = facadeModuleId[facadeModuleId.length - 2] || '[name]';
- return `assets/[name].[hash].js`;
- }
- }
- }
+ // rollupOptions: {
+ // output: {
+ // manualChunks(id) {
+ // if (id.includes('node_modules')) {
+ // return id.toString().split('node_modules/')[1].split('/')[0].toString();
+ // }
+ // },
+ // chunkFileNames: (chunkInfo) => {
+ // const facadeModuleId = chunkInfo.facadeModuleId ? chunkInfo.facadeModuleId.split('/') : [];
+ // return `assets/[name].[hash].js`;
+ // }
+ // }
+ // }
}
})