diff --git a/src/models/Staff.ts b/src/models/Staff.ts index af7dbf5..fea248a 100644 --- a/src/models/Staff.ts +++ b/src/models/Staff.ts @@ -2,6 +2,7 @@ export interface Token { accessToken: string; refreshToken: string; + clientSecret: string; } export interface Staff { diff --git a/src/models/store.ts b/src/models/store.ts index 895a276..03ce5da 100644 --- a/src/models/store.ts +++ b/src/models/store.ts @@ -8,12 +8,13 @@ const tokenSlice = createSlice({ initialState: { accessToken: '', refreshToken: '', + clientSecret: '' }, reducers: { setToken: (state, action: PayloadAction) => { state.accessToken = action.payload.accessToken state.refreshToken = action.payload.refreshToken - console.log('action: '+action) + state.clientSecret = action.payload.clientSecret }, }, }); diff --git a/src/pages/HomeView.tsx b/src/pages/HomeView.tsx index a17f6a4..2f06a39 100644 --- a/src/pages/HomeView.tsx +++ b/src/pages/HomeView.tsx @@ -1,15 +1,94 @@ -import React, {FC, useEffect} from 'react'; +import React, {useState, useEffect} from 'react'; import {UploadOutlined, UserOutlined, VideoCameraOutlined} from '@ant-design/icons'; -import {Layout, Menu, theme, Typography } from 'antd'; -import {useAppSelector} from "../models/hooks"; -import {getToken, store} from "../models/store"; +import {Layout, Menu, theme, Typography, Button, Dropdown, MenuProps} from 'antd'; +import {useAppDispatch, useAppSelector} from "../models/hooks"; +import {getToken, setToken, store} from "../models/store"; import {Link, Outlet, useNavigate} from "react-router-dom"; import Icon from '@ant-design/icons'; import {Logo} from "../assets/icons"; +import axiosInstance from "../utils/axiosInstance"; +import {Department, Staff} from "../models/Staff"; -const { Title } = Typography; +const {Title} = Typography; const {Header, Content, Footer, Sider} = Layout; + + +function HeaderBar(props: any) { + const { + token: {colorBgContainer, colorPrimary}, + } = theme.useToken(); + + const dispatch = useAppDispatch() + const navigate = useNavigate() + + + const onClick: MenuProps['onClick'] = ({key}) => { + switch (key) { + case 'password': + break + case 'logout': + dispatch(setToken({ + accessToken: '', + refreshToken: '', + clientSecret: '' + })) + navigate("/login") + break + } + }; + const items: MenuProps['items'] = [ + { + key: 'password', + label: ( + 修改密码 + ), + }, + { + key: 'logout', + label: ( + 退出登录 + ), + } + ]; + + const departmentToString = (staff:Staff) => { + let result = staff.managingDepartment===null?'':staff.managingDepartment.departmentName+'主管' + for(const department of staff.staffDepartments) + { + result+=' '+department.departmentName + } + return result + } + + return ( +
+ + + +
+ ) +} + function HomeView() { const token = useAppSelector(getToken); const navigate = useNavigate(); @@ -23,35 +102,122 @@ function HomeView() { key: "/reimbursement/mine", //icon: React.createElement(UserOutlined), label: 我的报销, - },{ + }, { key: "/invoice/management", //icon: React.createElement(UserOutlined), label: 发票管理, - },{ + }, { key: "/reimbursement/management", //icon: React.createElement(UserOutlined), label: 报销审批, - },{ + }, { key: "/stat", //icon: React.createElement(UserOutlined), label: 财务统计, }] const { - token: { colorBgContainer, colorPrimary }, + token: {colorBgContainer, colorPrimary}, } = theme.useToken(); + + const [staff, setStaff] = useState({ + staffName: "王司徒", + managingDepartment: { + departmentId: 3, + departmentName: "投影立体角部" + }, + staffDepartments: [] + }) + + const [menuItems, setMenuItems] = useState( + [{ + key: "/invoice/mine", + //icon: React.createElement(UserOutlined), + label: 我的发票 + }, { + key: "/reimbursement/mine", + //icon: React.createElement(UserOutlined), + label: 我的报销, + }] + ) + + const getStaffInfo = () => { + axiosInstance({ + url: 'staff', + method: 'get' + }).then(response => { + console.log(response.data) + setStaff( response.data) + }).catch(function (error) { + console.log(error) + }) + } useEffect(() => { if (token.accessToken === '') { console.log("redirect") navigate("/login") } + getStaffInfo() + if(staff.managingDepartment) + { + if(staff.managingDepartment.departmentName==='财务部') + { + setMenuItems([{ + key: "/invoice/mine", + //icon: React.createElement(UserOutlined), + label: 我的发票 + }, { + key: "/reimbursement/mine", + //icon: React.createElement(UserOutlined), + label: 我的报销, + }, { + key: "/invoice/management", + //icon: React.createElement(UserOutlined), + label: 发票管理, + }, { + key: "/reimbursement/management", + //icon: React.createElement(UserOutlined), + label: 报销审批, + }, { + key: "/stat", + //icon: React.createElement(UserOutlined), + label: 财务统计, + }]) + } + else{ + setMenuItems([{ + key: "/invoice/mine", + //icon: React.createElement(UserOutlined), + label: 我的发票 + }, { + key: "/reimbursement/mine", + //icon: React.createElement(UserOutlined), + label: 我的报销, + }, { + key: "/reimbursement/management", + //icon: React.createElement(UserOutlined), + label: 报销审批, + }]) + } + } + else { + setMenuItems([{ + key: "/invoice/mine", + //icon: React.createElement(UserOutlined), + label: 我的发票 + }, { + key: "/reimbursement/mine", + //icon: React.createElement(UserOutlined), + label: 我的报销, + }]) + } }, []); return ( { @@ -61,20 +227,31 @@ function HomeView() { console.log(collapsed, type); }} > -
+
- 智能财务报销系统 + 智能财务报销系统
-
+ - +
diff --git a/src/pages/Invoice/mine/InvoiceListView.tsx b/src/pages/Invoice/mine/InvoiceListView.tsx index 85e13f1..d3b2983 100644 --- a/src/pages/Invoice/mine/InvoiceListView.tsx +++ b/src/pages/Invoice/mine/InvoiceListView.tsx @@ -1,6 +1,5 @@ import {Card, Dropdown, List,Menu,Input,Button,Radio,Divider} from "antd"; import type { MenuProps } from 'antd'; -import { Icon } from '@ant-design/compatible' import { DownOutlined,UploadOutlined } from '@ant-design/icons'; import React, {ReactElement, JSXElementConstructor, ReactFragment, ReactPortal,useState } from "react"; import {Invoice,InvoiceSearchOption} from "../../../models/Staff" @@ -33,7 +32,20 @@ class InvoiceSearch extends React.Component { //const dispatch = useAppDispatch(); //const navigate = useNavigate(); console.log(baseUrl + 'common/invoice/list?'+this.state.invoiceSearchOption.toString()) - axiosInstance.get(baseUrl + 'common/invoice/list?'+this.state.invoiceSearchOption.toString()).then(function (response) { + let params = this.state.invoiceSearchOption + if(params.invoiceNo==="") params.invoiceNo=null + if(params.invoiceCode==="") params.invoiceCode=null + axiosInstance({ + url: 'common/invoice/list', + method: 'get', + params: params + }).then(response => { + console.log(response.data) + handleSearchData(response.data.records) + }).catch(function (error) { + console.log(error) + }) + /* axiosInstance.get(baseUrl + 'common/invoice/list?'+this.state.invoiceSearchOption.toString()).then(function (response) { console.log(response.data) //console.log(this.state) handleSearchData(response.data.records) @@ -43,7 +55,7 @@ class InvoiceSearch extends React.Component { }).catch(function (error) { console.log(error); //showAlert.value = true - }); + });*/ //console.log(value) //this.props.handleSearchData(value) } diff --git a/src/pages/login/LoginView.tsx b/src/pages/login/LoginView.tsx index 2e93f11..9ee86cf 100644 --- a/src/pages/login/LoginView.tsx +++ b/src/pages/login/LoginView.tsx @@ -22,10 +22,11 @@ function LoginView() { console.log(response.data) dispatch(setToken({ accessToken: response.data.accessToken, - refreshToken: response.data.refreshToken + refreshToken: response.data.refreshToken, + clientSecret: response.data.clientSecret })) //models.commit('setStaff', response.data.data) - navigate('/') + navigate('/invoice/mine') }).catch(function (error) { console.log(error); //showAlert.value = true