提交 cab82ed3 编写于 作者: L lm83680

add js-export-excel

上级 91b09ebb
......@@ -16,4 +16,5 @@
- add react-spring #动画库 link:https://www.react-spring.dev
- add use-gesture #手势交互 link:https://use-gesture.netlify.app/docs/
- add react-quill #富文本编辑器
- add qrcode.react #二维码生成
\ No newline at end of file
- add qrcode.react #二维码生成
- add js-export-excel #导出excel
# 开发文档
- useConst 性能优于 useState ,前者表示自己是常量且无法修改。
### AlertDialogExample 询问框已封装
```TypeScript
/*
......@@ -32,5 +33,57 @@ className="header-box-extend";
</Box>
//被此元素包裹的内容将出现在头部
```
### 表格属性已配置
```ts
// 表头
const historyColumns = useConst(
{ code: 'apiData', title: '传递参数',align:"center" , tooltip:true, maxW:"240"}
)
// 数据 注意 useConst 是声明常量 如果你可能会修改数据,就使用 useState 代替
const historyData = useConst(
[
{ time: '2023-1-10', apiAddress: '/admin/apis' , apiData:'"title":"hello"'},
{ time: '2022-4-10', apiAddress: '/admin/open' , apiData:'"title":"hello"'},
{ time: '2021-10-10', apiAddress: '/admin/apis/tip' , apiData:''},
]
)
<TableContainer overflow={"hidden"}>
<Table size={"sm"}>
<Thead>
<Tr>
{
historyColumns.map((item: any, index: any) => (
<Th key={index} textAlign={item.align}>{item.title}</Th>
))
}
</Tr>
</Thead>
<Tbody>
{
historyData.map((item: any, index: any) => (
<Tr key={index}>
{
historyColumns.map((tdItem: any, tdIndex: any) => (
<Td key={tdIndex} textAlign={tdItem.align}>
{
tdItem.tooltip ?
<Tooltip label={item[tdItem.code]}>
<Text maxW={(tdItem.maxW || 400) + "px"} textAlign={tdItem.align} className='table-td-text'>{item[tdItem.code]}</Text>
</Tooltip>
:
<Text maxW={(tdItem.maxW || 400) + "px"} textAlign={tdItem.align} className='table-td-text'>{item[tdItem.code]}</Text>
}
</Td>
))
}
</Tr>
))
}
</Tbody>
</Table>
</TableContainer>
```
......@@ -4,7 +4,7 @@
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Vite + React + TS</title>
<title>Hello 西鼠霸王</title>
</head>
<body>
<div id="root"></div>
......
此差异已折叠。
#root{
#root {
min-height: 100vh;
overflow-x: hidden;
background-color: #f9fdff;
}
/* 白色背景下的主要图标颜色 --鱼尾灰 */
.default-icon{
color:#5e616d;
.default-icon {
color: #5e616d;
}
/* 深色背景下的图标颜色 --芡食白*/
.Secondary-icon{
color:#e2e1e4;
.Secondary-icon {
color: #e2e1e4;
}
.header-box-extend{
.header-box-extend {
position: absolute;
top: 0;
left: 200px;
......@@ -20,19 +23,30 @@
gap: 4px;
height: 80px;
opacity: 0;
animation: op 320ms;
animation-fill-mode: forwards;
animation: op 320ms;
animation-fill-mode: forwards;
}
@keyframes op {
0%{
0% {
opacity: 0;
}100%{
}
100% {
opacity: 1;
}
}
.table-td-text {
text-overflow: ellipsis;
/* for Firefox,mozilla */
-moz-text-overflow: ellipsis;
overflow: hidden;
white-space: nowrap;
}
@media screen and (max-width:1200px) {
.header-box-extend{
.header-box-extend {
display: none;
}
}
\ No newline at end of file
......@@ -8,8 +8,7 @@ import { getMenuConfig, getUserRoute } from "../../apis/user"
import layoutChildren from '../../router/layoutChildren';
import create from 'zustand'
import { persist } from "zustand/middleware"
import DeepClone from "../../utils/deepClone";
const dep = new DeepClone();
import dep from "../../utils/deepClone";
const layoutData = layoutChildren.map(item => {
return {
"path": item.path,
......
// 表格导出方法
// https://github.com/kinddde/js-export-excel
/*
ExcelData:{
fileName:"文件名" 非必须
columns:[] 表头 必须
data:[] 数据 必须
}
*/
import { isEmpty } from "./iFunction";
import ExportJsonExcel from "js-export-excel";
// 一个工作簿
export const handleExportCurrentExcel = async (ExcelData: any) => { //ExcelData为后端返回的data数组
if (isEmpty(ExcelData.columns) || isEmpty(ExcelData.data)) {
return console.error("表属性不完整")
};
let option = {
fileName: ExcelData.fileName || "new Excel",
datas: [] as any
};
option.datas = [
{
sheetData: ExcelData.data,
sheetFilter: ExcelData.columns.map((t: { code: string }) => {
return t.code;
}),
sheetHeader: ExcelData.columns.map((t: { title: string }) => {
return t.title;
}),
},
];
var toExcel = new ExportJsonExcel(option); //new
await toExcel.saveExcel(); //保存
return true;
}
/*
ExcelData:{
fileName:"文件名" 非必须
sheets:[
{
sheetName:"工作簿名" 非必须
columns:[] 表头 必须
data:[] 数据 必须
},
{
columns:[] 表头 必须
data:[] 数据 必须
}
]
}
*/
// 多个工作簿
export const handleExportCurrentExceles = async (ExcelData: any) => { //ExcelData为后端返回的data数组
if (isEmpty(ExcelData.columns) || isEmpty(ExcelData.data)) {
return console.error("表属性不完整")
};
let option = {
fileName: ExcelData.fileName || "new Excel",
datas: [] as any
};
option.datas = ExcelData.sheets.map((item: { sheetName: string, columns: Array<any>, data: Array<any> }, index: number) => {
return {
sheetName: item.sheetName || ("sheet" + (index + 1)),
sheetData: item.data,
sheetFilter: item.columns.map((t: { code: string }) => {
return t.code;
}),
sheetHeader: item.columns.map((t: { title: string }) => {
return t.title;
}),
}
})
var toExcel = new ExportJsonExcel(option); //new
await toExcel.saveExcel(); //保存
return true;
}
\ No newline at end of file
......@@ -105,4 +105,4 @@ class DeepClone {
}
}
export default DeepClone;
\ No newline at end of file
export default new DeepClone();
\ No newline at end of file
......@@ -5,13 +5,13 @@ import {
MenuList,
MenuItem
} from '@chakra-ui/react'
import { useState } from "react";
import { useState } from "react";
import { FaPlus, FaAngleDown } from "react-icons/fa";
import { FiChevronRight } from "react-icons/fi";
import store from "../../store";
import AlertDialogExample from "../../components/alert";
import DeepClone from "../../utils/deepClone";
import dep from "../../utils/deepClone";
function SettingMenu() {
const getARoute = store.auth(((state: { isAllRoute: Object }) => state.isAllRoute));
......@@ -42,14 +42,14 @@ function SettingMenu() {
})
}
function delMenuItemCon(index: number) {
const dep = new DeepClone();
let newMenu = dep.deepClone(menu);
newMenu.order_list = newMenu.order_list.concat(menu.menu_list[index].path_list);
newMenu.menu_list.splice(index, 1);
setMenu(newMenu);
}
function setSeq(f: string, index: number) {
const dep = new DeepClone();
let newMenu = dep.deepClone(menu);
switch (f) {
case 'up':
......@@ -63,7 +63,7 @@ function SettingMenu() {
}
}
function setItemSeq(f: string, mIndex: number, index: number) {
const dep = new DeepClone();
let newMenu = dep.deepClone(menu);
switch (f) {
case 'last':
......@@ -77,7 +77,7 @@ function SettingMenu() {
}
}
function setItemIndex(f: string, lIndex: number, pIndex: number, mIndex: number) {
const dep = new DeepClone();
let newMenu = dep.deepClone(menu);
switch (f) {
case 'menuList':
......@@ -95,13 +95,16 @@ function SettingMenu() {
return (
<Box display={"flex"}>
<Box className='header-box-extend'>
<FormControl display='flex' alignItems='center'>
<FormLabel htmlFor='email-alerts' mb='0'>
开启预览?
</FormLabel>
<Switch id='prv-alerts' onChange={() => setShowPrv(!showPrv)} />
<Button colorScheme='blue' ml={8} onClick={save}>保存</Button>
</FormControl>
<Text>开启预览?</Text>
<Switch id='prv-alerts' onChange={() => setShowPrv(!showPrv)} />
<Button colorScheme='facebook' variant='ghost' leftIcon={<FaPlus />} onClick={() => {
let newMenu = dep.deepClone(menu);
newMenu.menu_list.push({ "menu_name": "新目录", "path_list": [] });
setMenu(newMenu);
}} >
添加新目录
</Button>
<Button colorScheme='green' onClick={save}>保存</Button>
</Box>
<AlertDialogExample setting={(res: Function) => setAlertRef(res)} confirm={(callback: any) => callback == "save" ? saveResult() : delMenuItemCon(callback)} />
<Box display={"flex"} justifyContent={"center"} transition={"width 400ms"} overflowX={"hidden"} height="calc(100vh - 80px)" w={showPrv ? "200px" : "0"} flexShrink={0} >
......@@ -140,7 +143,7 @@ function SettingMenu() {
<Input
value={item.menu_name}
onChange={(event) => {
const dep = new DeepClone();
let newMenu = dep.deepClone(menu);
newMenu.menu_list[index].menu_name = event.target.value
setMenu(newMenu);
......@@ -200,16 +203,6 @@ function SettingMenu() {
))
}
</Box>
<Box>
<Button w={"100%"} colorScheme='facebook' variant='ghost' leftIcon={<FaPlus />} onClick={() => {
const dep = new DeepClone();
let newMenu = dep.deepClone(menu);
newMenu.menu_list.push({ "menu_name": "新目录", "path_list": [] });
setMenu(newMenu);
}} >
添加新目录
</Button>
</Box>
</CardBody>
</Card>
</Box>
......
......@@ -10,8 +10,9 @@ import {
Button,
useDisclosure,
Input,
HStack,
Flex,
Tooltip,
useConst,
useToast
} from '@chakra-ui/react'
import {
Text,
......@@ -30,11 +31,45 @@ import {
MenuItem,
} from '@chakra-ui/react'
import { useClipboard } from '@chakra-ui/react'
import { PinInput, PinInputField } from '@chakra-ui/react'
import { useState } from 'react';
import { FaAngleDown } from 'react-icons/fa';
import { handleExportCurrentExcel } from '../../utils/creatExcel';
function System() {
const { isOpen, onOpen, onClose } = useDisclosure()
const toast = useToast();
const { isOpen, onOpen, onClose } = useDisclosure();
const [showUserHistory, setShowUserHistory] = useState(false);
const { onCopy, value, setValue, hasCopied } = useClipboard("");
// 表头
const historyColumns = useConst(
[
{ code: 'time', title: '操作时间' },
{ code: 'apiAddress', title: '接口地址' },
{ code: 'apiData', title: '传递参数', align: "center", tooltip: true, maxW: "240" }
]
)
// 数据
const historyData = useConst(
[
{ time: '2023-1-10', apiAddress: '/admin/apis', apiData: '"title":"hello"' },
{ time: '2022-4-10', apiAddress: '/admin/open', apiData: '"title":"hello"' },
{ time: '2021-10-10', apiAddress: '/admin/apis/tip', apiData: '' },
]
)
function downLoadExcel(){
const options = {
fileName:"excel表格",
columns:historyColumns,
data:historyData
}
handleExportCurrentExcel(options).then(res=>{
toast({
title: '导出成功',
status: "success",
isClosable: true,
})
});
}
return (
<Box>
<Box className='header-box-extend'>
......@@ -43,7 +78,6 @@ function System() {
</Button>
</Box>
<TableContainer>
{/* variant='striped' */}
<Table>
<Thead>
<Tr>
......@@ -57,32 +91,32 @@ function System() {
<Tr>
<Td>inches</Td>
<Td color={"green"}>当前在线 21.200.49.2 (南宁市青秀区)</Td>
<Th>次最高权限</Th>
<Th display={"flex"} gap={4}>
<Td>次最高权限</Td>
<Td display={"flex"} gap={4} justifyContent={"center"}>
<Button size={"xs"} colorScheme={"red"}>停用</Button>
<Button size={"xs"} colorScheme={"green"}>权限管理</Button>
<Button size={"xs"} colorScheme={"blue"}>用户操作记录</Button>
</Th>
<Button size={"xs"} colorScheme={"blue"} onClick={() => setShowUserHistory(true)}>用户操作记录</Button>
</Td>
</Tr>
<Tr>
<Td>feet</Td>
<Td>昨天 21.200.49.2 (南宁市青秀区) </Td>
<Th>普通操作员</Th>
<Th display={"flex"} gap={4}>
<Td>普通操作员</Td>
<Td display={"flex"} gap={4} justifyContent={"center"}>
<Button size={"xs"} colorScheme={"red"}>停用</Button>
<Button size={"xs"} colorScheme={"green"}>权限管理</Button>
<Button size={"xs"} colorScheme={"blue"}>用户操作记录</Button>
</Th>
</Td>
</Tr>
<Tr>
<Td>yards</Td>
<Td>2月14日 21.200.49.2 (南宁市青秀区)</Td>
<Th>仅可读</Th>
<Th display={"flex"} gap={4}>
<Td>仅可读</Td>
<Td display={"flex"} gap={4} justifyContent={"center"}>
<Button size={"xs"} colorScheme={"gray"}>已停用</Button>
<Button size={"xs"} colorScheme={"green"}>权限管理</Button>
<Button size={"xs"} colorScheme={"blue"}>用户操作记录</Button>
</Th>
</Td>
</Tr>
</Tbody>
</Table>
......@@ -91,6 +125,7 @@ function System() {
isOpen={isOpen}
placement='right'
onClose={onClose}
closeOnOverlayClick={false}
>
<DrawerOverlay />
<DrawerContent>
......@@ -98,21 +133,11 @@ function System() {
<DrawerHeader>创建新用户</DrawerHeader>
<DrawerBody>
<Input placeholder='账户名称' />
<Input mt={4} placeholder='手机号码' />
<HStack mt={4}>
<Text>可用性检查</Text>
<PinInput>
<PinInputField />
<PinInputField />
<PinInputField />
<PinInputField />
</PinInput>
</HStack>
<Input mt={4} placeholder='账户密码' />
<Input placeholder='登录用户名' />
<Text fontSize={12} color={"gray.400"}>由大写字母开头并不小于6位。</Text>
<Menu>
<MenuButton mt={4} w={"100%"} as={Button} rightIcon={<FaAngleDown />}>
自定义
(预设权限)自定义
</MenuButton>
<MenuList>
<MenuItem>自定义</MenuItem>
......@@ -121,21 +146,73 @@ function System() {
<MenuItem>仅可读</MenuItem>
</MenuList>
</Menu>
<Flex mt={4}>
<Input
readOnly
value="您的账号创建成功 用户名 adminxxx 临时密码 xkdswe3@1"
mr={2}
/>
<Button onClick={onCopy}>{hasCopied ? "已复制!" : "复制"}</Button>
</Flex>
<Text fontSize={12} color={"gray.400"}>默认为自定义等级,用户无任何操作表权限,可在创建完成后单独对用户设置权限。</Text>
<Box mt={4}>
<Text>您的账号创建成功 用户名 adminxxx 临时密码 xkdswe3@1{value}</Text>
<Button mt={2} onClick={onCopy}>{hasCopied ? "已复制!" : "复制"}</Button>
</Box>
</DrawerBody>
<DrawerFooter>
<Button variant='outline' mr={3} onClick={onClose}>
Cancel
取消
</Button>
<Button colorScheme='blue'>创建</Button>
</DrawerFooter>
</DrawerContent>
</Drawer>
<Drawer
size={"xl"}
isOpen={showUserHistory}
placement='right'
onClose={() => setShowUserHistory(false)}
>
<DrawerOverlay />
<DrawerContent>
<DrawerCloseButton />
<DrawerHeader>用户 Emma 操作记录</DrawerHeader>
<DrawerBody>
<TableContainer overflow={"hidden"}>
<Table size={"md"}>
<Thead>
<Tr>
{
historyColumns.map((item: any, index: any) => (
<Th key={index} textAlign={item.align}>{item.title}</Th>
))
}
</Tr>
</Thead>
<Tbody>
{
historyData.map((item: any, index: any) => (
<Tr key={index}>
{
historyColumns.map((tdItem: any, tdIndex: any) => (
<Td key={tdIndex} textAlign={tdItem.align}>
{
tdItem.tooltip ?
<Tooltip label={item[tdItem.code]}>
<Text maxW={(tdItem.maxW || 400) + "px"} textAlign={tdItem.align} className='table-td-text'>{item[tdItem.code]}</Text>
</Tooltip>
:
<Text maxW={(tdItem.maxW || 400) + "px"} textAlign={tdItem.align} className='table-td-text'>{item[tdItem.code]}</Text>
}
</Td>
))
}
</Tr>
))
}
</Tbody>
</Table>
</TableContainer>
</DrawerBody>
<DrawerFooter>
<Button color={"green.500"} onClick={downLoadExcel}>
导出包含接口参数的Excel表格
</Button>
<Button colorScheme='blue'>Save</Button>
</DrawerFooter>
</DrawerContent>
</Drawer>
......
/// <reference types="vite/client" />
declare module 'js-export-excel' // js 转 ts模块引入
......@@ -2639,6 +2639,19 @@
"resolved" "https://registry.npmmirror.com/acorn/-/acorn-8.8.2.tgz"
"version" "8.8.2"
"adler-32@~1.2.0":
"integrity" "sha512-/vUqU/UY4MVeFsg+SsK6c+/05RZXIHZMGJA+PX5JyWI0ZRcBpupnRuPLU/NXXoFwMYCPCoxIfElM2eS+DUXCqQ=="
"resolved" "https://registry.npmmirror.com/adler-32/-/adler-32-1.2.0.tgz"
"version" "1.2.0"
dependencies:
"exit-on-epipe" "~1.0.1"
"printj" "~1.1.0"
"adler-32@~1.3.0":
"integrity" "sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A=="
"resolved" "https://registry.npmmirror.com/adler-32/-/adler-32-1.3.1.tgz"
"version" "1.3.1"
"anser@^1.4.9":
"integrity" "sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww=="
"resolved" "https://registry.npmmirror.com/anser/-/anser-1.4.10.tgz"
......@@ -2893,6 +2906,11 @@
"inherits" "^2.0.4"
"readable-stream" "^3.4.0"
"blob.js@^1.0.1":
"integrity" "sha512-TkPuWPeCHBbN+LWFg7BlXdSh6stRxwmAbuirKfiiHTMmo/uQfKFQMx2jrxVUkueKRiG+Tc7Os1Zn618Yc0MZpg=="
"resolved" "https://registry.npmmirror.com/blob.js/-/blob.js-1.0.1.tgz"
"version" "1.0.1"
"brace-expansion@^1.1.7":
"integrity" "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA=="
"resolved" "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz"
......@@ -3021,6 +3039,14 @@
"resolved" "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001451.tgz"
"version" "1.0.30001451"
"cfb@^1.1.4":
"integrity" "sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA=="
"resolved" "https://registry.npmmirror.com/cfb/-/cfb-1.2.2.tgz"
"version" "1.2.2"
dependencies:
"adler-32" "~1.3.0"
"crc-32" "~1.2.0"
"chalk@^2.0.0":
"integrity" "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ=="
"resolved" "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz"
......@@ -3138,6 +3164,14 @@
"resolved" "https://registry.npmmirror.com/clone/-/clone-2.1.2.tgz"
"version" "2.1.2"
"codepage@~1.14.0":
"integrity" "sha512-iz3zJLhlrg37/gYRWgEPkaFTtzmnEv1h+r7NgZum2lFElYQPi0/5bnmuDfODHxfp0INEfnRqyfyeIJDbb7ahRw=="
"resolved" "https://registry.npmmirror.com/codepage/-/codepage-1.14.0.tgz"
"version" "1.14.0"
dependencies:
"commander" "~2.14.1"
"exit-on-epipe" "~1.0.1"
"collection-visit@^1.0.0":
"integrity" "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw=="
"resolved" "https://registry.npmmirror.com/collection-visit/-/collection-visit-1.0.0.tgz"
......@@ -3207,6 +3241,16 @@
"resolved" "https://registry.npmmirror.com/commander/-/commander-2.13.0.tgz"
"version" "2.13.0"
"commander@~2.14.1":
"integrity" "sha512-+YR16o3rK53SmWHU3rEM3tPAh2rwb1yPcQX5irVn7mb0gXbwuCCrnkbV5+PBfETdfg1vui07nM6PCG1zndcjQw=="
"resolved" "https://registry.npmmirror.com/commander/-/commander-2.14.1.tgz"
"version" "2.14.1"
"commander@~2.17.1":
"integrity" "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg=="
"resolved" "https://registry.npmmirror.com/commander/-/commander-2.17.1.tgz"
"version" "2.17.1"
"commondir@^1.0.1":
"integrity" "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg=="
"resolved" "https://registry.npmmirror.com/commondir/-/commondir-1.0.1.tgz"
......@@ -3317,6 +3361,11 @@
"path-type" "^4.0.0"
"yaml" "^1.10.0"
"crc-32@~1.2.0":
"integrity" "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ=="
"resolved" "https://registry.npmmirror.com/crc-32/-/crc-32-1.2.2.tgz"
"version" "1.2.2"
"cross-spawn@^6.0.0":
"integrity" "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ=="
"resolved" "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-6.0.5.tgz"
......@@ -3621,6 +3670,11 @@
"signal-exit" "^3.0.0"
"strip-eof" "^1.0.0"
"exit-on-epipe@~1.0.1":
"integrity" "sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw=="
"resolved" "https://registry.npmmirror.com/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz"
"version" "1.0.1"
"expand-brackets@^2.1.4":
"integrity" "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA=="
"resolved" "https://registry.npmmirror.com/expand-brackets/-/expand-brackets-2.1.4.tgz"
......@@ -3680,6 +3734,11 @@
dependencies:
"bser" "2.1.1"
"file-saver@^1.3.3":
"integrity" "sha512-spKHSBQIxxS81N/O21WmuXA2F6wppUCsutpzenOeZzOCCJ5gEfcbqJP983IrpLXzYmXnMUa6J03SubcNPdKrlg=="
"resolved" "https://registry.npmmirror.com/file-saver/-/file-saver-1.3.8.tgz"
"version" "1.3.8"
"fill-range@^4.0.0":
"integrity" "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ=="
"resolved" "https://registry.npmmirror.com/fill-range/-/fill-range-4.0.0.tgz"
......@@ -3778,6 +3837,11 @@
"combined-stream" "^1.0.8"
"mime-types" "^2.1.12"
"frac@~1.1.2":
"integrity" "sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA=="
"resolved" "https://registry.npmmirror.com/frac/-/frac-1.1.2.tgz"
"version" "1.1.2"
"fragment-cache@^0.2.1":
"integrity" "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA=="
"resolved" "https://registry.npmmirror.com/fragment-cache/-/fragment-cache-0.2.1.tgz"
......@@ -4387,6 +4451,16 @@
"@sideway/formula" "^3.0.1"
"@sideway/pinpoint" "^2.0.0"
"js-export-excel@^1.1.4":
"integrity" "sha512-19m7e3Gnn4CRfHXoFrLYj4fFfJ/KpvI7HRRn25p4GXYD+AlTV+1oU24NH6S904Ksi44tSx7futxhouOPAQ22oQ=="
"resolved" "https://registry.npmmirror.com/js-export-excel/-/js-export-excel-1.1.4.tgz"
"version" "1.1.4"
dependencies:
"blob.js" "^1.0.1"
"file-saver" "^1.3.3"
"script-loader" "0.7.2"
"xlsx" "0.16.3"
"js-tokens@^3.0.0 || ^4.0.0", "js-tokens@^4.0.0":
"integrity" "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
"resolved" "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz"
......@@ -4545,11 +4619,6 @@
"resolved" "https://registry.npmmirror.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz"
"version" "4.0.8"
"lodash.isequal@^4.5.0":
"integrity" "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ=="
"resolved" "https://registry.npmmirror.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz"
"version" "4.5.0"
"lodash.mergewith@4.6.2":
"integrity" "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ=="
"resolved" "https://registry.npmmirror.com/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz"
......@@ -5387,6 +5456,11 @@
"ansi-styles" "^5.0.0"
"react-is" "^18.0.0"
"printj@~1.1.0":
"integrity" "sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ=="
"resolved" "https://registry.npmmirror.com/printj/-/printj-1.1.2.tgz"
"version" "1.1.2"
"process-nextick-args@~2.0.0":
"integrity" "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
"resolved" "https://registry.npmmirror.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz"
......@@ -5429,11 +5503,6 @@
"end-of-stream" "^1.1.0"
"once" "^1.3.1"
"qrcode-generator@^1.4.1":
"integrity" "sha512-HM7yY8O2ilqhmULxGMpcHSF1EhJJ9yBj8gvDEuZ6M+KGJ0YY2hKpnXvRD+hZPLrDVck3ExIGhmPtSdcjC+guuw=="
"resolved" "https://registry.npmmirror.com/qrcode-generator/-/qrcode-generator-1.4.4.tgz"
"version" "1.4.4"
"qrcode.react@^3.1.0":
"integrity" "sha512-oyF+Urr3oAMUG/OiOuONL3HXM+53wvuH3mtIWQrYmsXoAq0DkvZp2RYUWFSMFtbdOpuS++9v+WAkzNVkMlNW6Q=="
"resolved" "https://registry.npmmirror.com/qrcode.react/-/qrcode.react-3.1.0.tgz"
......@@ -5465,6 +5534,11 @@
"resolved" "https://registry.npmmirror.com/range-parser/-/range-parser-1.2.1.tgz"
"version" "1.2.1"
"raw-loader@~0.5.1":
"integrity" "sha512-sf7oGoLuaYAScB4VGr0tzetsYlS8EJH6qnTCfQ/WVEa89hALQ4RQfCKt5xCyPQKPDUbVUAIP1QsxAwfAjlDp7Q=="
"resolved" "https://registry.npmmirror.com/raw-loader/-/raw-loader-0.5.1.tgz"
"version" "0.5.1"
"react-clientside-effect@^1.2.6":
"integrity" "sha512-XGGGRQAKY+q25Lz9a/4EPqom7WRjz3z9R2k4jhVKA/puQFH/5Nt27vFZYql4m4NVNdUvX8PS3O7r/Zzm7cjUlg=="
"resolved" "https://registry.npmmirror.com/react-clientside-effect/-/react-clientside-effect-1.2.6.tgz"
......@@ -5480,7 +5554,7 @@
"shell-quote" "^1.6.1"
"ws" "^7"
"react-dom@^16 || ^17 || ^18", "react-dom@^16.8.0 || ^17.0.0 || ^18.0.0", "react-dom@^18.0.0", "react-dom@^18.2.0", "react-dom@>=16.13", "react-dom@>=16.4.1", "react-dom@>=16.8", "react-dom@>=18", "react-dom@>=18.0", "react-dom@16.8.x":
"react-dom@^16 || ^17 || ^18", "react-dom@^16.8.0 || ^17.0.0 || ^18.0.0", "react-dom@^18.0.0", "react-dom@^18.2.0", "react-dom@>=16.13", "react-dom@>=16.8", "react-dom@>=18", "react-dom@>=18.0", "react-dom@16.8.x":
"integrity" "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g=="
"resolved" "https://registry.npmmirror.com/react-dom/-/react-dom-18.2.0.tgz"
"version" "18.2.0"
......@@ -5588,14 +5662,6 @@
"whatwg-fetch" "^3.0.0"
"ws" "^6.2.2"
"react-qrcode-logo@^2.8.0":
"integrity" "sha512-dbEgjsg6C4tK6+oGmCRDlJ7urQAWqybaGBLJtp8Z6ZYvVUP302HBXk/F7VRk54yWTwzlHwig3VK6HMKCha2YFw=="
"resolved" "https://registry.npmmirror.com/react-qrcode-logo/-/react-qrcode-logo-2.8.0.tgz"
"version" "2.8.0"
dependencies:
"lodash.isequal" "^4.5.0"
"qrcode-generator" "^1.4.1"
"react-quill@^2.0.0":
"integrity" "sha512-4qQtv1FtCfLgoD3PXAur5RyxuUbPXQGOHgTlFie3jtxp43mXDtzCKaOgQ3mLyZfi1PUlyjycfivKelFhy13QUg=="
"resolved" "https://registry.npmmirror.com/react-quill/-/react-quill-2.0.0.tgz"
......@@ -5715,7 +5781,7 @@
"resize-observer-polyfill" "^1.5.1"
"scheduler" "0.13.3"
"react@*", "react@^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0", "react@^16 || ^17 || ^18", "react@^16.0.0", "react@^16.0.0 || ^17.0.0 || ^18.0.0", "react@^16.8.0 || >=17.0.0 || >=18.0.0", "react@^16.8.0 || ^17.0.0 || ^18.0.0", "react@^16.9.0 || ^17.0.0 || ^18.0.0", "react@^18.0.0", "react@^18.2.0", "react@>= 16.8.0", "react@>=16.13", "react@>=16.4.1", "react@>=16.8", "react@>=16.8.0", "react@>=17.0", "react@>=18", "react@>=18.0", "react@16.8.x", "react@18.2.0":
"react@*", "react@^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0", "react@^16 || ^17 || ^18", "react@^16.0.0", "react@^16.0.0 || ^17.0.0 || ^18.0.0", "react@^16.8.0 || >=17.0.0 || >=18.0.0", "react@^16.8.0 || ^17.0.0 || ^18.0.0", "react@^16.9.0 || ^17.0.0 || ^18.0.0", "react@^18.0.0", "react@^18.2.0", "react@>= 16.8.0", "react@>=16.13", "react@>=16.8", "react@>=16.8.0", "react@>=17.0", "react@>=18", "react@>=18.0", "react@16.8.x", "react@18.2.0":
"integrity" "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ=="
"resolved" "https://registry.npmmirror.com/react/-/react-18.2.0.tgz"
"version" "18.2.0"
......@@ -5931,7 +5997,7 @@
dependencies:
"ret" "~0.1.10"
"sass@*", "sass@^1.58.0":
"sass@*":
"integrity" "sha512-PiMJcP33DdKtZ/1jSjjqVIKihoDc6yWmYr9K/4r3fVVIEDAluD0q7XZiRKrNJcPK3qkLRF/79DND1H5q1LBjgg=="
"resolved" "https://registry.npmmirror.com/sass/-/sass-1.58.0.tgz"
"version" "1.58.0"
......@@ -5970,6 +6036,13 @@
"loose-envify" "^1.1.0"
"object-assign" "^4.1.1"
"script-loader@0.7.2":
"integrity" "sha512-UMNLEvgOAQuzK8ji8qIscM3GIrRCWN6MmMXGD4SD5l6cSycgGsCo0tX5xRnfQcoghqct0tjHjcykgI1PyBE2aA=="
"resolved" "https://registry.npmmirror.com/script-loader/-/script-loader-0.7.2.tgz"
"version" "0.7.2"
dependencies:
"raw-loader" "~0.5.1"
"semver@^5.5.0":
"integrity" "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
"resolved" "https://registry.npmmirror.com/semver/-/semver-5.7.1.tgz"
......@@ -6178,6 +6251,13 @@
"resolved" "https://registry.npmmirror.com/sprintf-js/-/sprintf-js-1.0.3.tgz"
"version" "1.0.3"
"ssf@~0.11.2":
"integrity" "sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g=="
"resolved" "https://registry.npmmirror.com/ssf/-/ssf-0.11.2.tgz"
"version" "0.11.2"
dependencies:
"frac" "~1.1.2"
"stack-utils@^2.0.3":
"integrity" "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ=="
"resolved" "https://registry.npmmirror.com/stack-utils/-/stack-utils-2.0.6.tgz"
......@@ -6608,6 +6688,16 @@
dependencies:
"isexe" "^2.0.0"
"wmf@~1.0.1":
"integrity" "sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw=="
"resolved" "https://registry.npmmirror.com/wmf/-/wmf-1.0.2.tgz"
"version" "1.0.2"
"word@~0.3.0":
"integrity" "sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA=="
"resolved" "https://registry.npmmirror.com/word/-/word-0.3.0.tgz"
"version" "0.3.0"
"wrap-ansi@^6.2.0":
"integrity" "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA=="
"resolved" "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz"
......@@ -6657,6 +6747,21 @@
"resolved" "https://registry.npmmirror.com/ws/-/ws-7.5.9.tgz"
"version" "7.5.9"
"xlsx@0.16.3":
"integrity" "sha512-LInZ1OK6vpe+Em8XDZ5gDH3WixARwxI7UWc+3chLeafI6gUwECEgL43k4Tjbs1uRfkxpM7wQFy5DLE0hFBRqRw=="
"resolved" "https://registry.npmmirror.com/xlsx/-/xlsx-0.16.3.tgz"
"version" "0.16.3"
dependencies:
"adler-32" "~1.2.0"
"cfb" "^1.1.4"
"codepage" "~1.14.0"
"commander" "~2.17.1"
"crc-32" "~1.2.0"
"exit-on-epipe" "~1.0.1"
"ssf" "~0.11.2"
"wmf" "~1.0.1"
"word" "~0.3.0"
"xtend@~4.0.1":
"integrity" "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="
"resolved" "https://registry.npmmirror.com/xtend/-/xtend-4.0.2.tgz"
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册