From 7d025b74eef5f925c9de25af6b0894092a22cd0c Mon Sep 17 00:00:00 2001 From: xixi <123@qq.com> Date: Mon, 12 Aug 2024 14:43:58 +0800 Subject: [PATCH] =?UTF-8?q?=E9=82=80=E8=AF=B7=E7=A0=81=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/CapitalModal/CapitalModal.tsx | 326 ++++++++++++++++++ src/components/RecordModal/RecordModal.tsx | 248 +++++++++++++ src/components/ai/AiHelper.tsx | 42 ++- src/components/balance/BalanceHead.tsx | 101 +++++- src/components/balance/balance-head.css | 62 +++- .../invoice/order/InvoiceOrderList.tsx | 1 + .../order/InvoiceOrderSelectedList.tsx | 2 + src/components/list/ListProj.tsx | 22 +- src/components/myOrder/MyOrder.tsx | 176 ++++++++++ src/components/myOrder/myorder.css | 0 src/layout/head/Head.tsx | 315 ++++++++++++++++- src/layout/head/head.css | 191 +++++++++- src/route/CopyrightGgoods/CopyrightGgoods.tsx | 46 +-- src/route/ProductRelease/ProductRelease.tsx | 25 +- src/route/SearchList/SearchList.tsx | 12 +- src/route/TradingGoods/TradingGoods.tsx | 10 +- .../TransactionOrder/TransactionOrder.tsx | 12 +- src/route/index/Index.tsx | 11 +- src/route/proj/edit/ProjConfigLoginpage.tsx | 18 +- src/route/proj/edit/ProjEditStep1.tsx | 20 +- src/static/capita.png | Bin 0 -> 2238 bytes src/static/inv.png | Bin 0 -> 2249 bytes src/static/record.png | Bin 0 -> 2608 bytes src/store/index.ts | 42 +-- 24 files changed, 1548 insertions(+), 134 deletions(-) create mode 100644 src/components/CapitalModal/CapitalModal.tsx create mode 100644 src/components/RecordModal/RecordModal.tsx create mode 100644 src/components/myOrder/MyOrder.tsx create mode 100644 src/components/myOrder/myorder.css create mode 100644 src/static/capita.png create mode 100644 src/static/inv.png create mode 100644 src/static/record.png diff --git a/src/components/CapitalModal/CapitalModal.tsx b/src/components/CapitalModal/CapitalModal.tsx new file mode 100644 index 0000000..4ba76e4 --- /dev/null +++ b/src/components/CapitalModal/CapitalModal.tsx @@ -0,0 +1,326 @@ +import { useEffect, useState } from 'react' +import { get } from '../../util/AjaxUtils' +import useMessage from "antd/es/message/useMessage"; +import { Table, Tag, Spin, Input, DatePicker, Button, Tooltip } from 'antd'; +import { SearchOutlined, ClearOutlined } from '@ant-design/icons'; +import type { TableProps, DatePickerProps } from 'antd'; +// import dayjs, { } from 'dayjs'; +import locale from 'antd/es/date-picker/locale/zh_CN'; + +export default function CapitalModal() { + // const dateFormat = 'YYYY年MM月DD日'; + const [messageApi, messageContext] = useMessage(); + const [isLoading, setIsLoading] = useState(false) + const [page, setPage] = useState(1); + const [total, setTotal] = useState(0); + const [newkeywords, setnewkeywords] = useState('')//临时过度 + const [keywords, setkeywords] = useState('') + const [newstartTime, setnewstartTime] = useState()//临时过度 + const [showStartTime,setShowStartTime] = useState() + const [startTime, setstartTime] = useState() + const [newendTime, setnewendTime] = useState() //临时过度 + const [showEndTime,setShowEndTime] = useState() + const [endTime, setendTime] = useState() + const [tableData, setTableData] = useState() + + // 更改开始日期 + const startTimeChange: DatePickerProps['onChange'] = (date,dateString) => { + // const time = dayjs(date).format(dateFormat) + setShowStartTime(date) + setnewstartTime(dateString) + + + }; + const endTimeChange: DatePickerProps['onChange'] = (date,dateString) => { + // console.log(date, dateString); + setShowEndTime(date) + setnewendTime(dateString) + // dayjs(formInfo.getFieldValue('projDevCompleteDate')).format(dateFormat), + // console.log('日期', dayjs(date).format(dateFormat)); + + }; + // 点击搜索 + const onSearch = () => { + console.log(newstartTime); + + + setPage(1) + setkeywords(newkeywords) + setstartTime(newstartTime) + setnewendTime(newendTime) + get({ + messageApi, + url: '/api/account/listpage-item/self', + config: { + // dayjs(data.projDevCompleteDate, 'YYYY-MM-DD') + params: { + + keywords: newkeywords ? newkeywords : '', + startTime: newstartTime ? newstartTime: '', + endTime: newendTime ? newendTime : '', + page: 1, + rows: 10 + } + }, + onBefore() { + setIsLoading(true); + }, + onSuccess(data: any) { + console.log(page); + + setTableData(data.data.rows) + // console.log(data.data); + setTotal(data.data.total) + + }, + onFinally() { + setIsLoading(false); + } + }) + } + // 初始化搜索条件及分页 + const init = () => { + setShowEndTime(undefined) + setShowStartTime(undefined) + setPage(1) + setkeywords('') + setnewkeywords('') + setstartTime('') + setnewstartTime('') + setendTime('') + setnewendTime('') + get({ + messageApi, + url: '/api/account/listpage-item/self', + config: { + params: { + keywords: '', + startTime: '', + endTime: '', + page: 1, + rows: 10 + } + }, + onBefore() { + setIsLoading(true); + }, + onSuccess(data: any) { + setTableData(data.data.rows) + // console.log(data.data); + setTotal(data.data.total) + + }, + onFinally() { + setIsLoading(false); + } + }) + } + + + const getData = () => { + get({ + messageApi, + url: '/api/account/listpage-item/self', + config: { + // dayjs(date).format(dateFormat) + params: { + keywords: keywords ? keywords : '', + startTime: startTime ? startTime : '', + endTime: endTime ? endTime : '', + page: page, + rows: 10 + } + }, + onBefore() { + setIsLoading(true); + }, + onSuccess(data: any) { + setTableData(data.data.rows) + console.log(data.data); + setTotal(data.data.total) + + }, + onFinally() { + setIsLoading(false); + } + }) + } + useEffect(() => { + getData() + }, [page]) + interface DataType { + index?: number; + type: number; + // 交易前金额 + accountBeforeMoneyDouble: string; + // 交易金额 + accountMoneyDouble: string; + // 余额 + accountAfterMoneyDouble: string; + // 关联订单编号 + orderId: string; + // 关联订单类型 + orderType: string; + // 交易时间 + gmtCreate: string; + // 描述 + description: string; + } + + const columns: TableProps['columns'] = [ + { + title: () =>
序号
, + dataIndex: 'index', + width: 70, // 设置宽度 + key: 'index', + render: (text, record, index) => (page - 1) * 10 + index + 1, + }, + { + title:
类型
, + key: 'type', + width: 100, // 设置宽度 + dataIndex: 'type', + render: (text) => { + const tagProps = + text === 1 ? { color: '#f50', label: '充值' } : + text === 2 ? { color: '#2db7f5', label: '支出' } : + text === 3 ? { color: '#87d068', label: '提现' } : + text === 4 ? { color: '#108ee9', label: '系统扣款' } : + text === 5 ? { color: '#10e98f', label: '订单收入' } : + { color: '#d9d9d9', label: '未知' }; // 默认值 + return {tagProps.label}; + } + , + }, + { + title:
交易前金额
, + width: 120, + dataIndex: 'accountBeforeMoneyDouble', + key: 'accountBeforeMoneyDouble', + render:(text) => ( +
{text}
+ ) + }, + { + title:
交易金额
, + width: 120, + dataIndex: 'accountMoneyDouble', + key: 'accountMoneyDouble', + render:(text) => ( +
{text}
+ ) + }, + { + title:
交易后余额
, + width: 120, + dataIndex: 'accountAfterMoneyDouble', + key: 'accountAfterMoneyDouble', + render:(text) => ( +
{text}
+ ) + }, + { + title:
关联订单编号
, + dataIndex: 'orderId', + // fixed: 'right', + width: 300, + key: 'orderId', + }, + { + title:
关联订单类型
, + dataIndex: 'orderType', + key: 'orderType', + width: 160, + }, + { + title:
交易时间
, + dataIndex: 'gmtCreate', + key: 'gmtCreate', + }, + { + title:
描述
, + dataIndex: 'description', + key: 'description', + ellipsis: { + showTitle: false, + }, + render: (text) => { + return {text} + } + }, + ]; + + return ( +
+ {messageContext} + +
+ { + setnewkeywords(e.target.value) + }} + style={{ width: 198, height: 36, marginRight: 12 }} + > + + + + +
+ { + setPage(currentPage); + }, + showSizeChanger: false, + current: page + + } + } + scroll={{ y: 500 }} + bordered + key="dataTable" rowKey="orderId" + /> + {/*
+ { + setPage(page) + }} /> +
*/} + + + ) +} diff --git a/src/components/RecordModal/RecordModal.tsx b/src/components/RecordModal/RecordModal.tsx new file mode 100644 index 0000000..79cf93b --- /dev/null +++ b/src/components/RecordModal/RecordModal.tsx @@ -0,0 +1,248 @@ +import { useEffect, useState } from 'react' +import { get } from '../../util/AjaxUtils' +import useMessage from "antd/es/message/useMessage"; +import { Table, Spin, DatePicker, Button,Tooltip } from 'antd'; +import { SearchOutlined, ClearOutlined } from '@ant-design/icons'; +import type { TableProps, DatePickerProps } from 'antd'; +// import dayjs, { } from 'dayjs'; +import locale from 'antd/es/date-picker/locale/zh_CN'; + +export default function RecordModal() { + // const dateFormat = 'YYYY年MM月DD日'; + const [messageApi, messageContext] = useMessage(); + const [isLoading, setIsLoading] = useState(false) + const [page, setPage] = useState(1); + const [total, setTotal] = useState(0); + const [newstartTime, setnewstartTime] = useState()//临时过度 + const [showStartTime, setShowStartTime] = useState() + const [startTime, setstartTime] = useState() + const [newendTime, setnewendTime] = useState() //临时过度 + const [showEndTime, setShowEndTime] = useState() + const [endTime, setendTime] = useState() + const [tableData, setTableData] = useState() + + // 更改开始日期 + const startTimeChange: DatePickerProps['onChange'] = (date, dateString) => { + // const time = dayjs(date).format(dateFormat) + setShowStartTime(date) + setnewstartTime(dateString) + + + }; + const endTimeChange: DatePickerProps['onChange'] = (date, dateString) => { + // console.log(date, dateString); + setShowEndTime(date) + setnewendTime(dateString) + // dayjs(formInfo.getFieldValue('projDevCompleteDate')).format(dateFormat), + // console.log('日期', dayjs(date).format(dateFormat)); + + }; + // 点击搜索 + const onSearch = () => { + console.log(newstartTime); + setPage(1) + setstartTime(newstartTime) + setnewendTime(newendTime) + get({ + messageApi, + url: '/api/payment/split/listpage/self', + config: { + // dayjs(data.projDevCompleteDate, 'YYYY-MM-DD') + params: { + startTime: newstartTime ? newstartTime : '', + endTime: newendTime ? newendTime : '', + page: 1, + rows: 10 + } + }, + onBefore() { + setIsLoading(true); + }, + onSuccess(data: any) { + console.log(page); + + setTableData(data.data.rows) + // console.log(data.data); + setTotal(data.data.total) + + }, + onFinally() { + setIsLoading(false); + } + }) + } + // 初始化搜索条件及分页 + const init = () => { + setShowEndTime(undefined) + setShowStartTime(undefined) + setPage(1) + setstartTime('') + setnewstartTime('') + setendTime('') + setnewendTime('') + get({ + messageApi, + url: '/api/payment/split/listpage/self', + config: { + params: { + startTime: '', + endTime: '', + page: 1, + rows: 10 + } + }, + onBefore() { + setIsLoading(true); + }, + onSuccess(data: any) { + setTableData(data.data.rows) + // console.log(data.data); + setTotal(data.data.total) + + }, + onFinally() { + setIsLoading(false); + } + }) + } + + + const getData = () => { + get({ + messageApi, + url: '/api/payment/split/listpage/self', + config: { + // dayjs(date).format(dateFormat) + params: { + startTime: startTime ? startTime : '', + endTime: endTime ? endTime : '', + page: page, + rows: 10 + } + }, + onBefore() { + setIsLoading(true); + }, + onSuccess(data: any) { + setTableData(data.data.rows) + console.log(data.data); + setTotal(data.data.total) + + }, + onFinally() { + setIsLoading(false); + } + }) + } + useEffect(() => { + getData() + }, [page]) + interface DataType { + index?: number; + // 金额 + amount: number; + // 备注 + notes: string + } + + const columns: TableProps['columns'] = [ + { + title: () =>
序号
, + dataIndex: 'index', + width: 70, // 设置宽度 + key: 'index', + render: (text, record, index) => (page - 1) * 10 + index + 1, + }, + { + title:
金额
, + width: 120, + dataIndex: 'amount', + key: 'amount', + render:(text) => ( +
{text}
+ ) + }, + { + title:
备注
, + + dataIndex: 'notes', + key: 'notes', + ellipsis: { + showTitle: false, + }, + render: (text) => { + return {text} + } + }, + + ]; + + return ( +
+ {messageContext} + +
+ + + + +
+
{ + setPage(currentPage); + }, + showSizeChanger: false, + current: page + + } + } + scroll={{ y: 500 }} + bordered + key="dataTable" rowKey="paymentSplitId" + /> + {/*
+ { + setPage(page) + }} /> +
*/} + + + ) +} diff --git a/src/components/ai/AiHelper.tsx b/src/components/ai/AiHelper.tsx index 3a2a097..367a2e4 100644 --- a/src/components/ai/AiHelper.tsx +++ b/src/components/ai/AiHelper.tsx @@ -619,13 +619,13 @@ export default function AiHelper(props: PropsType) { const imgSrc = `${Axios.defaults?.baseURL}/route/file/v2/download/true/${item.previewImgs}`; return (
{ setloginpageId(item.loginpageId) put({ messageApi, url: `/api/proj/update-loginpage-id/proj-id/${props.projId}/loginpage-id/${item.loginpageId}`, - + onSuccess() { messageApi.open({ @@ -646,14 +646,14 @@ export default function AiHelper(props: PropsType) { + style={{ borderRadius: 15 }} />
{/*
{props.title ? props.title : '标题'}
*/}
- - + + ) }) @@ -662,12 +662,14 @@ export default function AiHelper(props: PropsType) {
{/* defaultCurrent: 默认当前页数 total:数据总数 defaultPageSize:'页面显示几条' */} - { - // console.log(page); - // setPage(page) - setloginpageArray([]) - getlistLoginpage(page) - }} /> + { + // console.log(page); + // setPage(page) + setloginpageArray([]) + getlistLoginpage(page) + }} />
@@ -679,7 +681,7 @@ export default function AiHelper(props: PropsType) { const imgSrc = `${Axios.defaults?.baseURL}/route/file/v2/download/true/${item.previewImgs}`; return (
{ // setSelectedId(item.codeTypePageId) // setSelectedImg(item.previewImgs) @@ -705,7 +707,7 @@ export default function AiHelper(props: PropsType) {
+ preview={false} width={265} height={135} style={{ borderRadius: 15 }} />
@@ -719,12 +721,14 @@ export default function AiHelper(props: PropsType) {
{/* defaultCurrent: 默认当前页数 total:数据总数 defaultPageSize:'页面显示几条' */} - { - console.log(page); - // setPage(page) - setpageImgArray([]) - getPageImgData(page) - }} /> + { + console.log(page); + // setPage(page) + setpageImgArray([]) + getPageImgData(page) + }} />
diff --git a/src/components/balance/BalanceHead.tsx b/src/components/balance/BalanceHead.tsx index 88cd821..d854fa8 100644 --- a/src/components/balance/BalanceHead.tsx +++ b/src/components/balance/BalanceHead.tsx @@ -1,20 +1,107 @@ import './balance-head.css' -import {useContext} from "react"; -import {GlobalContext} from "../../context/GlobalContext.ts"; +import { useContext, useState } from "react"; +import { GlobalContext } from "../../context/GlobalContext.ts"; +import { Modal } from 'antd'; import moneyImg from '../../static/head/money.png' +import CapitalModal from '../CapitalModal/CapitalModal.tsx'; +import RecordModal from '../RecordModal/RecordModal.tsx' +import capitalImg from '../../static/capita.png' +import recordImg from '../../static/record.png' export default function BalanceHead() { const globalContext = useContext(GlobalContext); + // const [isLoading, setIsLoading] = useState(false) + // const [moneyModal, setMoneyModal] = useState(false) + // 资金流水弹窗 + const [capitalModal, setCapitalModal] = useState(false) + // 分账记录弹窗 + const [recordModal, setRecordModal] = useState(false) - return ( -
+ return ( +
余额
- +
{ // console.log('查看余额') - }}>¥{globalContext.user.balance}
-
+ // setMoneyModal(true) + }}>¥{globalContext.user.balance} +
+
+
+
+
{ + setCapitalModal(true) + }}> + +
+ 资金流水 +
+
+
+
{ + setRecordModal(true) + }}> + +
+ 分账记录 +
+
+
+
+
+ {/* { + setMoneyModal(false) + + }}> +
{ + setCapitalModal(true) + }}>资金流水
+
{ + setRecordModal(true) + }}>分账记录
+
*/} + { + setCapitalModal(false) + + }}> + + + + + { + setRecordModal(false) + + }}> + + + + + ) } \ No newline at end of file diff --git a/src/components/balance/balance-head.css b/src/components/balance/balance-head.css index 79a5025..d8f4f8f 100644 --- a/src/components/balance/balance-head.css +++ b/src/components/balance/balance-head.css @@ -7,7 +7,8 @@ display: flex; } -.balance-head .label img{ + +.balance-head .label img { width: 17px; height: 19px; margin-right: 5px; @@ -17,4 +18,63 @@ font-size: 18px; color: #f78e4c; margin-top: 8px; + cursor: pointer; + /* background-color: pink; */ + position: relative; +} + +.moneyModal { + display: none; + background-color: #ffffff; + position: absolute; + width: 120px; + height: 100px; + left: -50px; + top: 40px; + /* border: 1px solid red; */ + box-shadow: 0px 5px 6px 5px rgba(0, 0, 0, 0.03); + /* border-radius: 10px; */ + /* font-size: 22px; */ + cursor: default; +} + +.moneyModal-box { + width: 120px; + height: 100px; + display: flex; + flex-direction: column; + justify-content: space-evenly; + align-items: center; + position: relative; +} +.moneyModal-triangle{ + position: absolute; + top: -10px; + /* left: calc(50% - 5px); */ + left: 110px; + width: 0; + height: 0; + border-left: 10px solid transparent; + border-right: 0px solid transparent; + border-bottom: 10px solid #ffffff; /* 87px 是一个正三角形的高度 */ +} +.balance-head .balance:hover .moneyModal { + /* cursor: pointer */ + display: block; +} + +.moneyModal-title { + cursor: pointer; + display: flex; + font-size: 16px; + color: #333333; + font-weight: 400; +} +.transparentBox{ + background-color: transparent; + /* background-color: pink; */ + position: absolute; + width: 100px; + height: 20px; + /* left: -50px; */ } \ No newline at end of file diff --git a/src/components/invoice/order/InvoiceOrderList.tsx b/src/components/invoice/order/InvoiceOrderList.tsx index 43a301a..95aa765 100644 --- a/src/components/invoice/order/InvoiceOrderList.tsx +++ b/src/components/invoice/order/InvoiceOrderList.tsx @@ -170,6 +170,7 @@ export default function InvoiceInfoList(props: ListProps) { { pageSize: 20, total: total, + showSizeChanger: false, onChange: (currentPage) => { setPage(currentPage); } diff --git a/src/components/invoice/order/InvoiceOrderSelectedList.tsx b/src/components/invoice/order/InvoiceOrderSelectedList.tsx index 2943bac..0b16f22 100644 --- a/src/components/invoice/order/InvoiceOrderSelectedList.tsx +++ b/src/components/invoice/order/InvoiceOrderSelectedList.tsx @@ -152,9 +152,11 @@ export default function InvoiceInfoSelectedList(props: ListProps) { { pageSize: 20, total: total, + showSizeChanger: false, onChange: (currentPage) => { setPage(currentPage); } + } } scroll={{y: 500}} bordered key="dataTable" rowKey="orderId"/> diff --git a/src/components/list/ListProj.tsx b/src/components/list/ListProj.tsx index 193edc3..2fee054 100644 --- a/src/components/list/ListProj.tsx +++ b/src/components/list/ListProj.tsx @@ -41,6 +41,7 @@ export default function ListProj() { const [messageApi, contextHolder] = message.useMessage(); const [page, setPage] = useState(1); + // const [pageSize,setPageSize] = useState(10) const [showPage, setShowPage] = useState(true); const [total, setTotal] = useState(0); @@ -75,7 +76,7 @@ export default function ListProj() { onSuccess({ data }) { // console.log('数据', data); // console.log('得到数据'); - + setPage(data.page); setTotal(data.total); setProjs(data.rows); @@ -118,11 +119,11 @@ export default function ListProj() { } }) } - useEffect(()=>{ + useEffect(() => { getTag() // console.log('这啥啊',indexListContext.categoryChangeCount); // console.log('这啥啊2',indexListContext.category) - },[]) + }, []) // 更新数据 // const upreqData = () => { // get>({ @@ -200,8 +201,8 @@ export default function ListProj() { setTimeout(() => { setShowPage(true) }, 0); - - + + }, [indexListContext.status, keywords, type, chargeAdditionals, tagDataId, authorId]) useEffect(() => { @@ -214,7 +215,7 @@ export default function ListProj() { // alert(1) // console.log('什么玩意',indexListContext.categoryChangeCount); // console.log('什么玩意',indexListContext.category); - + }, [indexListContext.categoryChangeCount, indexListContext.category]) // const renderStatus = () => { @@ -242,7 +243,14 @@ export default function ListProj() { {/* defaultCurrent: 默认当前页数 total:数据总数 */} {showPage ? { reqData(page); - }} /> : null} + }} + showSizeChanger={false} // 隐藏每页条数选择器 + // onShowSizeChange={(current, size) => { + // // 处理每页条数的变化 + // setPageSize(size); + // reqData(current, size); + // }} + /> : null} diff --git a/src/components/myOrder/MyOrder.tsx b/src/components/myOrder/MyOrder.tsx new file mode 100644 index 0000000..15a4fb3 --- /dev/null +++ b/src/components/myOrder/MyOrder.tsx @@ -0,0 +1,176 @@ +import React from 'react' +import { Table, TableProps, Tooltip, Spin } from "antd"; +import { useEffect, useState } from "react"; +import useMessage from "antd/es/message/useMessage"; +import { get } from "../../util/AjaxUtils"; +import './myorder.css' +type IListPage = { + page: number; + total: number; + rows: T[] +} +type DetailDataType = { + productType: string; + quantity: number; + unitPrice: number; + notes: string; + productDescription: string; +} +type DataType = { + orderId: string; + orderNo: string; + totalAmount: number; + detail: DetailDataType; + orderStatus: string; + gmtCreate: string; +} +export default function MyOrder() { + const [messageApi, messageContext] = useMessage(); + const [isLoading, setIsLoading] = useState(false) + const [page, setPage] = useState(1); + const [total, setTotal] = useState(0); + const [dataArray, setDataArray] = useState([]); + const getData = () => { + get>({ + messageApi, + url: '/api/order/listpage/complete/no-invoiced/self', + config: { + params: { + page: page, + rows: 20 + } + }, + onBefore() { + setIsLoading(true); + }, + onSuccess({ data }) { + // console.log(data); + + setPage(data.page); + setTotal(data.total); + setDataArray(data.rows); + }, + onFinally() { + setIsLoading(false); + } + }) + } + const columns: TableProps['columns'] = [ + { + title: '订单号', + dataIndex: 'orderNo', + align: 'center', + width: 250, + fixed: 'left' + }, + { + title: '总金额', + dataIndex: 'totalAmount', + align: 'center', + width: 100, + fixed: 'left', + render: (value) => { + return (value / 100).toFixed(2) + } + }, + { + title: '订单状态', + dataIndex: 'orderStatus', + align: 'center', + width: 100, + render: (value) => { + if (value === 'COMPLETE') { + return '完成'; + } + if (value === 'CHARGEBACK') { + return '已退款'; + } + } + }, + { + title: '创建时间', + dataIndex: 'gmtCreate', + align: 'center', + width: 180 + }, + { + title: '产品类型', + dataIndex: 'detail.productType', + align: 'center', + width: 100, + render: (_value, record) => { + if (record.detail.productType === 'PROJ') { + return '项目创建' + } + if (record.detail.productType === 'AGENT') { + return '项目代理' + } + return record.detail.productType + } + }, + { + title: '数量', + dataIndex: 'detail.quantity', + align: 'center', + width: 100, + render: (_value, record) => { + return record.detail.quantity + } + }, + { + title: '单价', + dataIndex: 'detail.unitPrice', + align: 'center', + width: 100, + render: (_value, record) => { + return (record.detail.unitPrice / 100).toFixed(2) + } + }, + { + title: '订单备注', + dataIndex: 'detail.notes', + align: 'center', + width: 120, + render: (_value, record) => { + return record.detail.notes + } + }, + { + title: '描述', + dataIndex: 'detail.productDescription', + align: 'center', + width: 200, + ellipsis: { + showTitle: false, + }, + render: (_value, record) => { + return {record.detail.productDescription} + } + }, + ] + // useEffect(() => { + // getData(); + // }, []); + useEffect(() => { + getData(); + }, [page]); + return ( +
+ {messageContext} + +
{ + setPage(currentPage); + }, + showSizeChanger:false + } + } + scroll={{ y: 500 }} bordered key="dataTable" rowKey="orderId" />; + + + ) +} diff --git a/src/components/myOrder/myorder.css b/src/components/myOrder/myorder.css new file mode 100644 index 0000000..e69de29 diff --git a/src/layout/head/Head.tsx b/src/layout/head/Head.tsx index 8a4c686..b09a922 100644 --- a/src/layout/head/Head.tsx +++ b/src/layout/head/Head.tsx @@ -2,10 +2,10 @@ import './head.css' import { useDispatch } from 'react-redux' import BalanceHead from '../../components/balance/BalanceHead.tsx'; import RechargeHead from '../../components/recharge/RechargeHead.tsx'; -import { Dropdown, MenuProps, message, Modal, Space, Spin } from "antd"; -import { DownOutlined, UserOutlined, KeyOutlined, LogoutOutlined, AccountBookOutlined, MenuFoldOutlined, UsergroupAddOutlined } from "@ant-design/icons"; +import { Dropdown, MenuProps, message, Modal, Space, Spin, Input } from "antd"; +import { DownOutlined, UserOutlined, KeyOutlined, LogoutOutlined, AccountBookOutlined, ContainerOutlined, MenuFoldOutlined, UsergroupAddOutlined } from "@ant-design/icons"; import { useContext, useEffect, useState } from "react"; -import { put,get} from "../../util/AjaxUtils.ts"; +import { put, get, post } from "../../util/AjaxUtils.ts"; import { GlobalContext, GlobalDispatchContext, reloadUser } from "../../context/GlobalContext.ts"; import UserEdit from "../../components/user/UserEdit.tsx"; import PasswordChange from "../../components/password/PasswordChange.tsx"; @@ -17,11 +17,144 @@ import { reMenuActive } from '../../util/cache'; // import BelongPeople from '../../components/BelongPeople/BelongPeople.tsx' import BelongPeople from '../../components/BelongPeople/BelongPeople.tsx' import ContactPeople from '../../components/ContactPeople/ContactPeople.tsx' - +import inv from '../../static/inv.png' +import MyOrder from '../../components/myOrder/MyOrder.tsx' export default function Head() { + // 邀请码弹窗 + const [invitationModal, setinvitationModal] = useState(false) + // 解除绑定邀请码弹窗 + // const [relieveModal, setRelieveModal] = useState(false) + // 申请的邀请码 + const [invNum, setInvNum] = useState('') + // 输入的邀请码 + const [inInvNum, setInInvNum] = useState('') + // 已绑定的邀请码 + const [bindingInvNum, setBindingInvNum] = useState('') + // 邀请码申请状态 + const [icStatus, setIcStatus] = useState('') + // 邀请码返利比例 + const [icRebateRatio, seticRebateRatio] = useState('') + // 获取邀请码申请状态 + const getIcStatus = () => { + get({ + messageApi, + url: '/api/ic/apply/get/self', + onSuccess({ data }) { + console.log(data); + if (data) { + setIcStatus(data.applyStatus) + } + } + }) + } + // 获取邀请码信息 + const getIc = () => { + get({ + messageApi, + url: '/api/ic/get/self', + onSuccess({ data }) { + console.log(data); + setInvNum(data.ic) + setBindingInvNum(data.relationIc) + seticRebateRatio(data.icRebateRatio) + if (data.ic == '') { + getIcStatus() + } + } + }) + } + // 绑定邀请码 + const putIc = () => { + put({ + messageApi, + url: `/api/ic/update-relation-ic`, + body: { + value: inInvNum + }, + onBefore() { + + }, + onSuccess() { + // messageApi.success('保存成功,点击编辑按钮可继续修改项目简介'); + // console.log(data); + getIc() + }, + onFinally() { + + } + }) + } + // 确定输入的邀请码事件 + const postInvNum = () => { + if (!inInvNum) { + messageApi.open({ + type: 'error', + content: '请输入邀请码' + }) + } else { + // setBindingInvNum(inInvNum) + // messageApi.open({ + // type: 'success', + // content: '已绑定邀请码' + // }) + putIc() + } + } + // 点击获取邀请码 + const getInvNum = () => { + post({ + messageApi, + url: `/api/ic/apply/apply`, + onBefore() { + + }, + onSuccess() { + messageApi.success('已申请') + getIcStatus() + }, + onFinally() { + + } + }) + // setInvNum('RSDNQ5H7') + } + // 复制邀请码 + const copyInvNum = () => { + // navigator.clipboard.writeText(invNum) + // messageApi.open({ + // type: 'success', + // content: '已复制到剪切板' + // }) + // 创建一个临时的 input 元素 + const tempInput = document.createElement('input'); + document.body.appendChild(tempInput); + tempInput.value = invNum; + + // 选中 input 中的内容 + tempInput.select(); + tempInput.setSelectionRange(0, 99999); // 对于移动设备的支持 + + // 执行复制操作 + try { + document.execCommand('copy'); + messageApi.open({ + type: 'success', + content: '已复制到剪切板' + }) + } catch (err) { + messageApi.open({ + type: 'error', + content: '复制失败,请手动复制' + }) + } + + // 移除临时的 input 元素 + document.body.removeChild(tempInput); + } + const dispath = useDispatch() - // 更新所属者表格储存至redux - const upBelongArray = () => { + // 更新所属者表格储存至redux + const upBelongArray = () => { get({ messageApi, url: `/api/proj-owner/list/self`, @@ -50,6 +183,8 @@ export default function Head() { const [isSelfModalOpen, setIsSelfModalOpen] = useState(false); const [isPasswordModalOpen, setIsPasswordModalOpen] = useState(false); const [isInvoiceModalOpen, setIsInvoiceModalOpen] = useState(false); + // 我的订单弹窗 + const [myorderModal, setMyorderModal] = useState(false) // 所属者弹窗 const [belongModal, setBelongModal] = useState(false) const [belongPeopleInfo, setBelongPeopleInfo] = useState({ @@ -109,7 +244,7 @@ export default function Head() { // // console.log('所属者表格', data.data); // // setBelongPeopleArray(data.data) // console.log('查看结果',data.data != belongArray); - + // // if (data.data == belongArray) { // // window.location.reload(); // // } @@ -119,7 +254,7 @@ export default function Head() { // } // }) // } - + useEffect(() => { // getLength() reloadUser(messageApi, globalDispatchContext).then((data) => { @@ -128,7 +263,9 @@ export default function Head() { } }); }, [globalContext.user]); - + // useEffect(()=>{ + // getIc() + // },[]) const items: MenuProps['items'] = [ { key: 'userinfo', @@ -166,6 +303,19 @@ export default function Head() { setIsInvoiceModalOpen(true); } }, + { + key: 'myorder', + label: ( +
+ {/* */} + + 我的订单 +
+ ), + onClick: () => { + setMyorderModal(true) + } + }, { key: 'belong', label: ( @@ -190,6 +340,7 @@ export default function Head() { setContactModal(true) } }, + { key: 'logout', label: ( @@ -220,6 +371,12 @@ export default function Head() { {/*
*/}
+
{ + setinvitationModal(true) + getIc() + }}> + 邀请码 +
{ window.open('https://www.aimzhu.com/operator/route/agreementportal/view?agreementId=c0c5683a-bef3-40c3-8395-900a362ea234&title=系统操作流程') }}> @@ -364,6 +521,146 @@ export default function Head() { { setContactModal(false) }} setConcatPeopleInfo={setConcatPeopleInfo} concatPeopleInfo={concatPeopleInfo} setConcatValue={setConcatValue}> + { + // getNewLength() + setinvitationModal(false) + setInvNum('') + + }}> +
+
+
+ 我的邀请码 +
+
+
{ + getInvNum() + }} style={{ display: invNum || icStatus ? 'none' : 'block' }}> + 点击申请 +
+
+ 正在申请中 +
+
+
+
申请失败!
+
{ + getInvNum() + }}>重新申请
+
+ +
+
+
+
+ {invNum} +
+
{ + copyInvNum() + }}> + 复制 +
+
+
+
+ {/*
*/} +
+
+ {icRebateRatio ? `邀请码分享给他人,即可获得${icRebateRatio}%佣金` : '邀请码分享给他人,即可获得佣金'} + {/* 邀请码分享给他人,即可获得{icRebateRatio}%佣金 */} + +
+ {/*
+ 失败的原因可能是XXXXXX导致,如有疑问请您咨询客服人员 +
*/} +
+ {/*
*/} +
+
+
+
+ 他人邀请码 +
+
+
+
+ { + setInInvNum(e.target.value) + }} /> +
{ + postInvNum() + }}> + +
+
+
+
+
+
+
+ {bindingInvNum} +
+ {/*
{ + setRelieveModal(true) + }}> + 解绑 +
*/} +
+
+
+
+
+
+ {bindingInvNum ? '已绑定邀请码' : '输入他人的邀请码,即可获得相应优惠'} +
+ + +
+
+
+ {/* { + setBindingInvNum('') + setInInvNum('') + setRelieveModal(false) + }} + onCancel={() => { + setRelieveModal(false) + + }}> +
+ 确定解绑当前邀请码吗? +
+
*/} + { + // setBindingInvNum('') + // setInInvNum('') + // setRelieveModal(false) + // }} + width={1500} + onCancel={() => { + setMyorderModal(false) + + }}> + + {contextHolder} {modalHolder} diff --git a/src/layout/head/head.css b/src/layout/head/head.css index 7046c09..a3ca903 100644 --- a/src/layout/head/head.css +++ b/src/layout/head/head.css @@ -1,4 +1,3 @@ - .head { width: 100vw; height: 69px; @@ -23,7 +22,8 @@ position: relative; } -.head-nav{ + +.head-nav { margin-right: 50px; color: #f78e4c; font-size: 16px; @@ -90,4 +90,191 @@ } */ .ant-dropdown .dropdown-item .title { margin-left: 5px; +} + +.invitationButton { + width: 81px; + height: 36px; + background: linear-gradient(79deg, #FFB020 0%, #FF6508 100%); + border-radius: 27px; + text-align: center; + line-height: 36px; + font-weight: 300; + font-size: 16px; + color: #FFFFFF; + margin-right: 20px; + cursor: pointer; +} + +.invitation-box { + width: 530px; + height: 175px; + background: #F9F9F9; + margin-top: 16px; + border: 1px solid #EEEEEE; +} + +.invBox-top { + display: flex; + align-items: center; + height: 118px; + /* background-color: skyblue; */ +} + +.invBox-title { + /* height: 118px; */ + width: 165px; + /* background-color: pink; */ + font-weight: bold; + font-size: 24px; + color: #454545; + text-align: center; + /* line-height: 118px; */ +} + +.invBox-line { + width: 1px; + height: 22px; + background: #626262; +} + +.invBox-btn { + width: 362px; + /* height: 118px; */ + /* background-color: #fcc19d; */ + font-weight: 400; + font-size: 24px; + color: #009C1D; + text-decoration-line: underline; + text-align: center; + line-height: 118px; + cursor: pointer; + +} + +.invBox-btnTwo { + width: 362px; + height: 118px; + /* background-color: #fcc19d; */ + font-weight: 400; + font-size: 24px; + color: #009C1D; + text-decoration-line: underline; + text-align: center; + line-height: 118px; +} + +.invBox-btnthree { + width: 362px; + height: 118px; + /* background-color: #fcc19d; */ +} + +.invBox-Num { + width: 362px; + height: 118px; + /* background-color: #fcc19d; */ +} + +.invNum-box { + width: 362px; + height: 118px; + display: flex; + align-items: center; + justify-content: space-evenly; +} + +.invNum { + font-weight: bold; + font-size: 36px; + /* color: #454545; */ + /* background-color: skyblue; */ + color: #1677FF; + background: linear-gradient(81deg, #000000 0%, #FFAA1E 0%, #FF6E0B 99.0234375%); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; +} + + + +.copyBtn { + font-size: 16px; + color: #FF9F08; + line-height: 24px; + text-decoration-line: underline; + cursor: pointer; +} + +.invBox-bot { + /* background-color: pink; */ + display: flex; + align-items: center; + justify-content: center; + font-weight: 400; + font-size: 18px; + height: 57px; + color: #818181; +} + +.invBox-tips { + width: 350px; + /* background-color: pink; */ + display: flex; + align-items: center; + justify-content: center; + text-align: center; +} + +.invBox-input { + width: 362px; + height: 118px; + /* background-color: #fcc19d; */ + +} + +.invInput { + width: 362px; + height: 118px; + display: flex; + align-items: center; + justify-content: space-evenly; +} + +.invImg { + width: 31px; + height: 30px; + /* background-color: pink; */ + cursor: pointer; +} + +.relieveBtn { + font-weight: 400; + font-size: 18px; + color: #366B77; + text-decoration-line: underline; + cursor: pointer; +} + +.errorBox { + width: 362px; + height: 118px; + align-items: center; + justify-content: space-evenly; + display: flex; + +} + +.errorBox-title { + font-weight: 400; + font-size: 24px; + color: #E21414; + text-decoration-line: underline; +} + +.errorBox-btn { + font-weight: 400; + font-size: 18px; + color: #535353; + text-decoration-line: underline; + cursor: pointer; } \ No newline at end of file diff --git a/src/route/CopyrightGgoods/CopyrightGgoods.tsx b/src/route/CopyrightGgoods/CopyrightGgoods.tsx index e209d48..9280b5e 100644 --- a/src/route/CopyrightGgoods/CopyrightGgoods.tsx +++ b/src/route/CopyrightGgoods/CopyrightGgoods.tsx @@ -2,7 +2,7 @@ import './copyrightG-goods.css' import { Select, DatePicker, Button, Table, // message, - Space, Empty, Pagination, InputNumber + Space, Empty, Pagination, InputNumber } from 'antd'; import type { InputNumberProps } from 'antd'; // import type { TableColumnsType } from 'antd'; @@ -15,20 +15,20 @@ export default function CopyrightGgoods() { const height = window.innerHeight - 180; // const [messageApi, contextHolder] = message.useMessage(); const dateFormat = 'YYYY年MM月DD日'; - const [minPrice,setMinPrice] = useState() //最低价格 - const [maxPrice,setMaxPrice] = useState() //最高价格 - const [date ,setDate] = useState() //获取时间 - const [sort,setSort] = useState() //排序 - const [language,setLanguage] = useState() //开发语言 - const [type,setType] = useState() //软著类型 - const [page,setPage] = useState(1) //分页 + const [minPrice, setMinPrice] = useState() //最低价格 + const [maxPrice, setMaxPrice] = useState() //最高价格 + const [date, setDate] = useState() //获取时间 + const [sort, setSort] = useState() //排序 + const [language, setLanguage] = useState() //开发语言 + const [type, setType] = useState() //软著类型 + const [page, setPage] = useState(1) //分页 // 更改最低价格 const minPriceChange: InputNumberProps['onChange'] = (value) => { console.log('changed', value); setMinPrice(value) }; - // 更改最高价格 - const maxPriceChange: InputNumberProps['onChange'] = (value) => { + // 更改最高价格 + const maxPriceChange: InputNumberProps['onChange'] = (value) => { console.log('changed', value); setMaxPrice(value) }; @@ -55,8 +55,8 @@ export default function CopyrightGgoods() { // 点击搜索 const onSearch = () => { setPage(1) - console.log(minPrice,maxPrice,date,sort,language,type); - + console.log(minPrice, maxPrice, date, sort, language, type); + } // 初始化搜索条件 const init = () => { @@ -191,14 +191,14 @@ export default function CopyrightGgoods() { onChange={minPriceChange} /> 至 - } onClick={onSearch} - > + > 搜索
@@ -330,10 +330,12 @@ export default function CopyrightGgoods() {
{/* defaultCurrent: 默认当前页数 total:数据总数 defaultPageSize:'页面显示几条' */}
- { - console.log(page) - setPage(page) - }} /> + { + console.log(page) + setPage(page) + }} />
)} diff --git a/src/route/ProductRelease/ProductRelease.tsx b/src/route/ProductRelease/ProductRelease.tsx index fd32df8..08850f9 100644 --- a/src/route/ProductRelease/ProductRelease.tsx +++ b/src/route/ProductRelease/ProductRelease.tsx @@ -21,10 +21,11 @@ export default function ProductRelease() { const [date, setDate] = useState() // 日期 const [language, setLanguage] = useState() // 开发者语言 const [type, setType] = useState() //软著类型 - const [page,setPage] = useState(1) // 分页 + const [page, setPage] = useState(1) // 分页 const [editModalOpen, setEditModalOpen] = useState(false) // 控制编辑弹窗 const [delModalOpen, setDelModalOpen] = useState(false) // 控制删除弹窗 const [sellModalOpen, setSellModalOpen] = useState(false) // 控制出售弹窗 + // 更改所属人类型 const belongTypeChange = (value: string) => { console.log(`selected ${value}`); @@ -64,7 +65,7 @@ export default function ProductRelease() { console.log(dayjs(date).format(dateFormat)); } } - + // 点击清除 const clearKeyWords = () => { init() @@ -90,7 +91,7 @@ export default function ProductRelease() { console.log('关闭', item.order); } } - + // 点击编辑 const edit = (item: any) => { console.log(item.order); @@ -168,11 +169,11 @@ export default function ProductRelease() { }, ]; - - useEffect(()=>{ - - },[]) + useEffect(() => { + + + }, []) return ( @@ -335,10 +336,12 @@ export default function ProductRelease() { {/* defaultCurrent: 默认当前页数 total:数据总数 defaultPageSize:'页面显示几条' */}
- { - // console.log(page) - setPage(page) - }} /> + { + // console.log(page) + setPage(page) + }} />
diff --git a/src/route/SearchList/SearchList.tsx b/src/route/SearchList/SearchList.tsx index cab9b5c..a6bb28d 100644 --- a/src/route/SearchList/SearchList.tsx +++ b/src/route/SearchList/SearchList.tsx @@ -18,9 +18,9 @@ export default function SearchList() { const [total, setTotal] = useState(0); // const [keywords, setKeywords] = useState(''); const [messageApi, contextHolder] = message.useMessage(); - const {state} = useLocation() + const { state } = useLocation() // console.log(state); - + const reqData = (currentPage: number) => { get>({ messageApi: messageApi, @@ -85,9 +85,11 @@ export default function SearchList() { {renderList()}
- { - setPage(page); - }} /> + { + setPage(page); + }} />
diff --git a/src/route/TradingGoods/TradingGoods.tsx b/src/route/TradingGoods/TradingGoods.tsx index cca31b1..06907ee 100644 --- a/src/route/TradingGoods/TradingGoods.tsx +++ b/src/route/TradingGoods/TradingGoods.tsx @@ -214,10 +214,12 @@ export default function TradingGoods() { {/* defaultCurrent: 默认当前页数 total:数据总数 defaultPageSize:'页面显示几条' */}
- { - console.log(page) - setPage(page) - }} /> + { + console.log(page) + setPage(page) + }} />
)} diff --git a/src/route/TransactionOrder/TransactionOrder.tsx b/src/route/TransactionOrder/TransactionOrder.tsx index 3cb86a9..00e4308 100644 --- a/src/route/TransactionOrder/TransactionOrder.tsx +++ b/src/route/TransactionOrder/TransactionOrder.tsx @@ -3,7 +3,7 @@ import './transaction-order.css' import { Select, DatePicker, Button, Table, // message, - Space, Empty, Pagination,Modal + Space, Empty, Pagination, Modal } from 'antd'; import dayjs, { } from 'dayjs'; // import type { TableColumnsType } from 'antd'; @@ -276,10 +276,12 @@ export default function TransactionOrder() { {/* defaultCurrent: 默认当前页数 total:数据总数 defaultPageSize:'页面显示几条' */}
- { - console.log(page) - setPage(page) - }} /> + { + console.log(page) + setPage(page) + }} />
)} diff --git a/src/route/index/Index.tsx b/src/route/index/Index.tsx index 48873f4..44a2c3a 100644 --- a/src/route/index/Index.tsx +++ b/src/route/index/Index.tsx @@ -484,7 +484,7 @@ export default function Index() { // authorId: '' // } // }) - + // } else { // nav('/home', { // state: { @@ -509,7 +509,7 @@ export default function Index() { // } // console.log('type',type); // console.log('chargeAdditionals',chargeAdditionals); - + }, [type, chargeAdditionals, keywords, tagDataId, authorId]); const handleSearch = (value: string) => { @@ -630,6 +630,7 @@ export default function Index() { */}
diff --git a/src/route/proj/edit/ProjConfigLoginpage.tsx b/src/route/proj/edit/ProjConfigLoginpage.tsx index 2c03131..574a366 100644 --- a/src/route/proj/edit/ProjConfigLoginpage.tsx +++ b/src/route/proj/edit/ProjConfigLoginpage.tsx @@ -570,7 +570,7 @@ export default function ProjConfigLoginpage(props: any) { }}> {/* src={`${Axios.defaults?.baseURL}/route/file/v2/download/true/${previewImgs}`} */} - +
@@ -664,7 +664,7 @@ export default function ProjConfigLoginpage(props: any) { // const imgSrc = `${Axios.defaults?.baseURL}/route/file/v2/download/true/${item.previewImgs}`; return (
{ setModalId(item.loginpageId) setModalImg(item.previewImgs) @@ -687,12 +687,14 @@ export default function ProjConfigLoginpage(props: any) {
{/* defaultCurrent: 默认当前页数 total:数据总数 defaultPageSize:'页面显示几条' */} - { - // console.log(page); - // setPage(page) - setloginpageArray([]) - getlistLoginpage(page) - }} /> + { + // console.log(page); + // setPage(page) + setloginpageArray([]) + getlistLoginpage(page) + }} />
diff --git a/src/route/proj/edit/ProjEditStep1.tsx b/src/route/proj/edit/ProjEditStep1.tsx index 66b89da..33e47c7 100644 --- a/src/route/proj/edit/ProjEditStep1.tsx +++ b/src/route/proj/edit/ProjEditStep1.tsx @@ -1,8 +1,8 @@ import './proj-edit-step.css'; -import { Col, Flex, message, Modal, Row, Spin, Pagination, Image } from "antd"; +import { Col, Flex, message, Modal, Row, Spin, Pagination, Image } from "antd"; import { useParams } from "react-router-dom"; import { useEffect, useState } from "react"; -import { get, put,downloadUrl } from "../../../util/AjaxUtils.ts"; +import { get, put, downloadUrl } from "../../../util/AjaxUtils.ts"; import { Button, Form, Input } from 'antd'; import { AxiosResponse, } from "axios"; import { errorImage } from "../../../util/CommonUtil.ts"; @@ -327,7 +327,7 @@ export default function ProjEditStep1(props: any) { // const imgSrc = `${Axios.defaults?.baseURL}/route/file/v2/download/true/${item.previewImgs}`; return (
{ setSelectedId(item.codeTypePageId) setSelectedImg(item.previewImgs) @@ -352,12 +352,14 @@ export default function ProjEditStep1(props: any) {
{/* defaultCurrent: 默认当前页数 total:数据总数 defaultPageSize:'页面显示几条' */} - { - // console.log(page); - setpage(page) - setpageImgArray([]) - getPageImgData(page) - }} /> + { + // console.log(page); + setpage(page) + setpageImgArray([]) + getPageImgData(page) + }} />
diff --git a/src/static/capita.png b/src/static/capita.png new file mode 100644 index 0000000000000000000000000000000000000000..ba841883779b0d14bbcf96de12e1ce562165c67d GIT binary patch literal 2238 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 XtnimiL{MJ-00000NkvXXu0mjfW*;f; literal 0 HcmV?d00001 diff --git a/src/static/record.png b/src/static/record.png new file mode 100644 index 0000000000000000000000000000000000000000..52023e0878280eaad867fa81f0b6a1ea4138100b GIT binary patch literal 2608 zcmV-03eWY4P)Px;>PbXFRA@u(TFY`A#}Uk|o}I-4SOO$LLVQZ1r3jgluDv1csRATx5{te!+eW7e`)+&^rpe4BYZoH*;*Nt1?VHl zuM9KE89(C!7G3;)CUh70HHu-r$DMEUU&_N2Oc~vF489wo8pt_=riYp2te=s>GP3x6 zv(|gcU!yzB_qg+I{TGxqKv0NXct)D)f~G0u!%T9<&$y@+IPW*Ry{G&GI>UUA+ka{N zj6e-0qD&5}x@a@Wzet^L@HlD3gaj=oV7sBWaQ$nvhXS_u-Q+cz0{UP#6EpZEqs=>U z)1V8(OmfE0xP)b7xZm9EEevfj{T(@024NOWu(j8mvaEYk$Ugm_2_EABJG$HY8zx$v z`iG$1CH#Xkw#G2ik7u!C!2X1KE31D*v(F))ALh$v{LK3Sw)7n)n`QnXLip)XU?Teh z+XnP1Fxo%D<02#U^3_D)pn76Eq-uwzJbPeH+ak3<`GyE*flw_Vj0uphSVUwtkww20 ziEBsl=h*`TZ4HX|73<5f2r&!g;hi1XZmLr#Ak@GT#bf}lLAYb`*>km6;*nAOF_%{5 zjJ@0|_RnHGi`5f@-ydbo8z?z1;`Wg=bM_WLH;|8*JT z?2+7Y_r$Q1e++!=Jq!YYW{nf7iu16TZ94Es(t4H05_wKhu^caWD1#7LCFx*30ohdt zZk&5mtirwVVeWb^qqEfM#GV{VVF(#mL~oFsSLAJ@&zx)UsKPz8N?8k@2-R!RYxDyd zAo##yRk#m+0kVtd9_|OBmnmx{Scxf~KHR^)9f4`HUgx0a;bWs4 zuR20WPN-67HlF3Ie97*K5FDt}HFbpDqY`sMdB3^We=>9heRN0P7Vax{4?GsUii*a4 zc0X=Zv{&ptP!lR`&WRhAsMVoS0YkhulIAfAFv!+vk!-EU;-onuG+bF;s+%d8oltUd-OuYVoVoR2htsfC=n?dO;-y@`?oW4FHpboBpQ=XMj00De$66 zQ~M{ek9sfTuqp781YEGd?lrg(sj#-o9>z<(MXZ;)!Mb>xzNpHl6m{Bl_Hc$<$6!a7BhxmRN7grLQm+xLCu zyP36bOW7xoF2AW-7zWq?rmceUo-x}T3D~IN{iNrs00jQPB0NY(P|-gZaOZ6$kPDBU zyqDOinSV*~`iXOkT?&sG;>P&`OC^tSJ(7=e(`tn=6YVZZRfJ;O2kWW87gf$A{6~%x7(|anxIeVWL4QCJR^Lwv@EB`D@mDp z_fcd)W6R;&BzNWPR~7t0?*KsN?58TA?cL|smeGB)#Vp(f{OT#Oy!Ltu^^%@v3@h$s zR|pq}x&f35&J$=m|=#s%hL)u0%#>34ND_epZ) z)YO*6Y{AUeN{daz>@zYRk8-2zXyS|15~)YsT7O|~;cb-aEf%YitZYjb2e)K=U;B8& zVh)%|V*6D^EG-sgZ+W6VIVJgBcYJ(Qz!?Qs(mM(MV8I?u`Q8S8dxDSYk7(@H^N$ch zYOWu@OI7U-*Iayx5Vw-NZRv_qYS+d?J>|nIJ80#WNZsXVR@+S1^wwLbH;URFA^Qnj zbK?lGgTA;H75J~2PIu{`=sb25({+fQUi}t5e16gqN!B9pG-Q0xXmwsJPl2giA7+Qm z-BOtu+o3G-t&$VqWP7q%X1Zy_$B+;1OAa|wO_r2tGk?-&@%Yl$*gkmmII!sVtx z_VuY7ZW=Xp*oUeBK&@D*g-{RM=|)dK^S9r*N{xpw$U7C^gKDWC>KVHkt=)I8TjX^b z=Tk9isydo)?BpB>J&?A7vPI-rPDk*t{&5`GH?WOMn6B0H>lW>1G+x;kF+&O%a`epD zPJ&CKMX60o8$s%3)u7E&!Ee-#qA#WD*>ca^F*9pI>bn{d)8$`lVj04SM%t3@&(xak$JD8SG{ - const nstate:any = JSON.parse(JSON.stringify(state)) - if(action.type=="numadd"){ - nstate.num++ - // console.log('123'); - } - if(action.type=='new'){ - nstate.shuju.val = action.val - console.log(nstate.shuju.val); - } +const reducer = (state = baseState, action: any) => { + const nstate: any = JSON.parse(JSON.stringify(state)) + // if (action.type == "numadd") { + // nstate.num++ + // // console.log('123'); + // } + // if (action.type == 'new') { + // nstate.shuju.val = action.val + // console.log(nstate.shuju.val); + // } // redux 要求 state必须深拷贝一次 才能返回 - if(action.type == 'uparray'){ + if (action.type == 'uparray') { nstate.belongArray = action.val } return nstate