Browse Source

档案管理

release_0.0.4^2^2
LUCAS 3 years ago
parent
commit
50cb0e63c7
  1. 25
      api/app/lib/controllers/file/index.js
  2. 3
      api/log/development.log
  3. 8
      web/client/src/components/Upload/index.js
  4. 6
      web/client/src/sections/fillion/actions/file.js
  5. 94
      web/client/src/sections/fillion/components/file/functionMenu.js
  6. 43
      web/client/src/sections/fillion/components/file/menu.less
  7. 5
      web/client/src/sections/fillion/components/file/uploadModal.js
  8. 202
      web/client/src/sections/fillion/components/fileTable.js
  9. 19
      web/client/src/sections/fillion/components/protable.less
  10. 6
      web/log/development.txt
  11. 25
      web/package-lock.json
  12. 3
      web/package.json

25
api/app/lib/controllers/file/index.js

@ -59,30 +59,13 @@ async function delFileDir(ctx, next) {
let rslt = [], fileDirIds = []; let rslt = [], fileDirIds = [];
try { try {
const { type, id } = ctx.query, // type == parent / child const { id } = ctx.query, // type == parent / child
models = ctx.fs.dc.models; models = ctx.fs.dc.models;
const transaction = await ctx.fs.dc.orm.transaction(); const transaction = await ctx.fs.dc.orm.transaction();
if (type == 'parent') { await models.FileRoad.destroy({ where: { rId: id }, transaction })
let fileTypes = await models.FileType.findAll({ where: { rId: id } }); await models.Files.destroy({ where: { roadId: id }, transaction })
if (fileTypes && fileTypes.length) {
fileDirIds = fileTypes.map(item => item.fId);
}
if (fileDirIds && fileDirIds.length) {
await models.Files.destroy({
where: {
fId: { $in: fileDirIds }
},
transaction
})
}
await models.FileType.destroy({ where: { rId: id }, transaction })
await models.FileRoad.destroy({ where: { rId: id }, transaction })
} else {
await models.Files.destroy({ where: { fId: id }, transaction })
await models.FileType.destroy({ where: { fId: id }, transaction })
}
await transaction.commit(); await transaction.commit();
error = null; error = null;

3
api/log/development.log

@ -10656,3 +10656,6 @@ headers: {}
2022-07-28 18:34:55.231 - error: path: /publicity, error: TypeError: values.map is not a function 2022-07-28 18:34:55.231 - error: path: /publicity, error: TypeError: values.map is not a function
2022-07-28 18:35:45.669 - error: path: /publicity, error: TypeError: values.map is not a function 2022-07-28 18:35:45.669 - error: path: /publicity, error: TypeError: values.map is not a function
2022-07-28 18:37:40.324 - error: path: /publicity, error: TypeError: values.map is not a function 2022-07-28 18:37:40.324 - error: path: /publicity, error: TypeError: values.map is not a function
2022-07-28 21:48:22.652 - debug: [FS-LOGGER] Init.
2022-07-28 21:48:22.760 - info: [FS-ATTACHMENT] Inject attachment mw into router.
2022-07-28 21:48:22.760 - info: [FS-AUTH] Inject auth and api mv into router.

8
web/client/src/components/Upload/index.js

@ -54,7 +54,7 @@ class Uploads extends Component {
componentWillReceiveProps(np) { componentWillReceiveProps(np) {
const { dispatch, value: thisEditData, onChange } = this.props; const { dispatch, value: thisEditData, onChange } = this.props;
const { value: nextEditData } = np; const { value: nextEditData, clearFileList } = np;
const setFileList = () => { const setFileList = () => {
let defaultFileList = []; let defaultFileList = [];
@ -92,6 +92,12 @@ class Uploads extends Component {
} }
} }
} }
if (clearFileList) {
this.setState({
fileList: []
});
}
// else{ // else{
// this.setState({ // this.setState({
// fileList:[], // fileList:[],

6
web/client/src/sections/fillion/actions/file.js

@ -51,14 +51,14 @@ export function updateFileDir(query) {
} }
// query : {typeId, userId, userName, startDate, endDate, fileSize, fileName, fileUrl, fileExt} // data : {typeId, userId, userName, startDate, endDate, fileSize, fileName, fileUrl, fileExt}
export function uploadFile(query) { export function uploadFile(data) {
return dispatch => basicAction({ return dispatch => basicAction({
type: 'post', type: 'post',
dispatch: dispatch, dispatch: dispatch,
actionType: 'UPLOAD_FILE', actionType: 'UPLOAD_FILE',
url: ApiTable.uploadFile, url: ApiTable.uploadFile,
query, data,
msg: { error: '上传文件失败' }, msg: { error: '上传文件失败' },
reducer: { name: 'uploadFile' } reducer: { name: 'uploadFile' }
}); });

94
web/client/src/sections/fillion/components/file/functionMenu.js

@ -0,0 +1,94 @@
import React, { useEffect } from 'react';
import PropTypes from 'prop-types';
import { delFileDir, queryFileDir, updateFileDir, } from '../../actions/file';
import './menu.less'
import { message, Modal } from 'antd';
import { ExclamationCircleOutlined } from '@ant-design/icons'
const { confirm } = Modal;
const FunctionMenu = props => {
const { dispatch, onDelDir, selectRoad } = props;
useEffect(() => {
const box = document.getElementById('tree-box');
if (box)
box.oncontextmenu = function (e) {
//取消默认的浏览器自带右键 很重要!!
e.preventDefault();
//获取我们自定义的右键菜单
var menu = document.querySelector("#rihgt-click-menu");
//根据事件对象中鼠标点击的位置,进行定位
menu.style.left = e.clientX + 'px';
menu.style.top = e.clientY + 'px';
//改变自定义菜单的高宽,让它显示出来
menu.style.display = 'block';
}
//关闭右键菜单,很简单
window.onclick = function (e) {
//用户触发click事件就可以关闭了,因为绑定在window上,按事件冒泡处理,不会影响菜单的功能
document.querySelector('#rihgt-click-menu') ? document.querySelector('#rihgt-click-menu').style.display = 'none' : ''
}
}, [true])
const onDeleteDir = () => {
if (selectRoad) {
const id = selectRoad
dispatch(delFileDir({ id })).then(res => {
const { type } = res;
if (type == 'DEL_FILE_DIR_SUCCESS') {
dispatch(queryFileDir());
message.success('删除成功')
} else {
message.error('删除失败')
}
});
}
}
const showDeleteConfirm = () => {
confirm({
title: `是否确认删除该道路?`,
icon: <ExclamationCircleOutlined />,
// content: 'Some descriptions',
okText: '是',
okType: 'danger',
cancelText: '否',
onOk() {
onDeleteDir();
},
onCancel() {
},
});
}
const refreshFileDir = () => {
dispatch(queryFileDir());
}
return (
<div id="rihgt-click-menu">
<div class="context_item">
<div class="inner_item" onClick={showDeleteConfirm}>
<i class="glyphicon glyphicon-file"></i>
</div>
</div>
<div class="context_item">
<div class="inner_item" onClick={refreshFileDir}>
<i class="glyphicon glyphicon-file"></i>
</div>
</div>
</div>
)
}
FunctionMenu.propTypes = {}
export default FunctionMenu

43
web/client/src/sections/fillion/components/file/menu.less

@ -0,0 +1,43 @@
#rihgt-click-menu {
display: none;
font-size: 1.1em;
position: fixed;
width: 200px;
height: auto;
padding: 5px 0px;
border-radius: 5px;
top: 10;
left: 10;
background-color: #fff;
box-shadow: 0 12px 15px 0 rgba(0, 0, 0, 0.24);
color: #333;
z-index: 999;
}
#rihgt-click-menu .context_item {
height: 32px;
line-height: 32px;
cursor: pointer;
text-overflow: ellipsis;
overflow: hidden;
white-space: nowrap;
}
#rihgt-click-menu .context_item:hover {
background-color: #ddd;
}
#rihgt-click-menu .context_item .inner_item {
margin: 0px 10px;
}
#rihgt-click-menu .context_item .inner_item i {
margin: 0 5px 0 0;
font-weight: bold;
}
#rihgt-click-menu .context_hr {
height: 1px;
border-top: 1px solid #bbb;
margin: 3px 10px;
}

5
web/client/src/sections/fillion/components/file/uploadModal.js

@ -32,8 +32,9 @@ const UploadModal = props => {
maxFilesNum={1} maxFilesNum={1}
maxFileSize={10} maxFileSize={10}
onChange={onFileUploaded} onChange={onFileUploaded}
// value clearFileList={isVisible}
// onStateChange // value
// onStateChange
/> />
</Row> </Row>
</Modal> </Modal>

202
web/client/src/sections/fillion/components/fileTable.js

@ -1,32 +1,40 @@
import { connect } from 'react-redux'; import { connect } from 'react-redux';
import './protable.less' import './protable.less'
import { Card, Button, Popconfirm, Badge, Col, Row, DatePicker, Input, Modal, Spin, Image, message, Popover } from 'antd'; import { Card, Button, Row, DatePicker, Input, Modal, message, Image } from 'antd';
import ProTable from '@ant-design/pro-table'; import ProTable from '@ant-design/pro-table';
import { getFileList, createFileDir, queryFileDir } from '../actions/file'; import { getFileList, createFileDir, queryFileDir, uploadFile, deleteFile } from '../actions/file';
import { ExclamationCircleOutlined } from '@ant-design/icons';
import React, { useEffect, useState } from 'react'; import React, { useEffect, useState } from 'react';
import { httpDel } from '@peace/utils' import { httpDel } from '@peace/utils'
import { PinyinHelper } from '@peace/utils'; import { PinyinHelper } from '@peace/utils';
import RoadModal from './file/roadModal'; import RoadModal from './file/roadModal';
import Pdfh5 from "pdfh5";
import "pdfh5/css/pdfh5.css";
import FunctionMenu from './file/functionMenu';
const { confirm } = Modal;
// @ts-ignore // @ts-ignore
import UploadModal from './file/uploadModal'; import UploadModal from './file/uploadModal';
var pdfh5 = null;
const DetailList = (props) => { const DetailList = (props) => {
const { fileList, loading, dispatch, handleOpen, handelRefresh, onPageChange } = props; const { fileList, loading, dispatch, handelRefresh, onPageChange } = props;
const [visible, setVisible] = useState(false) const [imgSrc, setImgSrc] = useState({ imageView: false, imgSrc: '' })
const [selectRecord, setSelectRecord] = useState(); const [pdfView, setPdfView] = useState({ showPDF: false, pdfName: '', pdfurl: '' })
const checkDetail = (record) => { var tyApiRoot = localStorage.getItem('tyApiRoot')
// dispatch(getReportDetail(record.id))
} useEffect(() => {
if (pdfView.showPDF) {
pdfh5 = new Pdfh5("#pdf-loader", {
pdfurl: pdfView.pdfurl
})
}
}, [pdfView])
const handleRemove = (record) => { const handleRemove = (record, filePath) => {
let url = 'report/{reportId}';
const actionType = "DEL_REPORT_RECORD";
const msg = {}
if (record) { if (record) {
url = url.replace('{reportId}', record.id) dispatch(deleteFile(record.id)).then(res => {
httpDel(dispatch, { url, actionType, msg }).then(res => { if (res.type == 'DELETE_FILE_SUCCESS') {
if (res.success) {
message.success("文件删除成功"); message.success("文件删除成功");
handelRefresh() handelRefresh()
} else { } else {
@ -34,6 +42,30 @@ const DetailList = (props) => {
} }
}) })
} }
let url = `${tyApiRoot}/attachments`, msg = {};
const actionType = "DEL_FILE_RECORD";
if (filePath) {
httpDel(dispatch, { url, actionType, msg, query: { src: filePath } })
}
}
const overviewPDF = (record, filePath) => {
setPdfView({ showPDF: true, pdfName: record.fileName, pdfurl: filePath })
}
const showDeleteConfirm = (record, filePath) => {
confirm({
title: '是否确认删除该文件?',
icon: <ExclamationCircleOutlined />,
// content: 'Some descriptions',
okText: '是',
okType: 'danger',
cancelText: '否',
onOk() {
handleRemove(record, filePath);
},
onCancel() {
},
});
} }
const columns = [ const columns = [
@ -93,30 +125,36 @@ const DetailList = (props) => {
valueType: 'option', valueType: 'option',
align: 'center', align: 'center',
render: (text, record) => { render: (text, record) => {
return [ const regEx = /\bhttps?:\/\/[^:\/]+/ig;
<Button const path = record.fileUrl;
onClick={() => { checkDetail(record); handleOpen(); }} const filename = path.substr(path.lastIndexOf("/") + 1);
style={{ marginRight: 10 }}>查看</Button>, const filePath = path.replace(regEx, "");
<Popover const filePath_ = `${tyApiRoot}/attachments?src=${filePath}&filename=${filename}`;
content={[
<div style={{ width: '100%', height: 30 }}> return <span>
<Button onClick={() => setVisible(false)} style={{ float: "right" }} ></Button> {/* {<a style={{ color: '#333398' }} href={fpath}>下载</a>} */}
<Button type="primary" onClick={() => handleRemove(record)} style={{ marginRight: 8, float: "right" }} ></Button> {<a style={{ color: '#333398' }} onClick={() => {
</div> window.open(filePath_);
]} }} >下载</a>}
visible={selectRecord == record.id && visible} <span className="ant-divider" />
trigger="click" <a style={{ color: '#333398' }} onClick={() => { showDeleteConfirm(record, filePath) }}>删除</a>
onClick={() => setSelectRecord(record.id)} {
title="是否删除该记录?" ['.png', '.jpg'].some(item => item == record.fileExt) ?
onVisibleChange={(newVisible) => setVisible(newVisible)} [<span className="ant-divider" />,
> <a style={{ color: '#333398' }} onClick={() => { setImgSrc({ imageView: true, imgSrc: path }) }}>预览</a>]
<Button>删除</Button> : ''
</Popover> }
] {
} ['.pdf'].some(item => item == record.fileExt) ?
[<span className="ant-divider" />,
<a style={{ color: '#333398' }} onClick={() => overviewPDF(record, path)}>预览</a>]
: ''
}
</span>
},
}, },
]; ];
return ( return [
<ProTable <ProTable
columns={columns} columns={columns}
dataSource={fileList?.list || []} dataSource={fileList?.list || []}
@ -133,8 +171,33 @@ const DetailList = (props) => {
rowKey="key" rowKey="key"
toolBarRender={false} toolBarRender={false}
search={false} search={false}
/> />,
); <Image
width={200}
style={{ display: 'none' }}
src={imgSrc.imgSrc}
preview={{
visible: imgSrc.imageView,
src: imgSrc.imgSrc,
onVisibleChange: value => {
setImgSrc({ imageView: value, imgSrc: '' });
},
}}
/>,
<Modal
visible={pdfView.showPDF}
footer={null}
title={pdfView.pdfName}
width={860}
onCancel={() => {
pdfh5 = null;
setPdfView({ showPDF: false, pdfName: '', pdfurl: '' });
}}
>
<div id="pdf-loader" style={{ width: 830, height: 600, overflowY: 'hidden' }} />
</Modal>
];
}; };
@ -143,7 +206,7 @@ const RoadNameList = (props) => {
const [filterRoad, setFilterRoad] = useState([]); const [filterRoad, setFilterRoad] = useState([]);
const [addVisible, setAddVisible] = useState(false); const [addVisible, setAddVisible] = useState(false);
const [selectRoad, setSelectRoad] = useState(); const [selectRoad, setSelectRoad] = useState();
const { onChange, record, roads, loading, queryData, dispatch } = props; const { onChange, roads, loading, queryData, dispatch } = props;
const columns = [ const columns = [
{ {
title: '道路名称', title: '道路名称',
@ -154,6 +217,13 @@ const RoadNameList = (props) => {
]; ];
useEffect(() => {
if (roads && roads instanceof Array) {
setSelectRoad(roads[0].rId)
onChange(roads[0]);
}
}, [roads])
useEffect(() => { useEffect(() => {
if (roads) { if (roads) {
setFilterRoad(roads) setFilterRoad(roads)
@ -184,8 +254,12 @@ const RoadNameList = (props) => {
} }
const onDelDir = () => {
}
return ( return (
<div className='spilce'> <div id="tree-box" className='spilce'>
<ProTable <ProTable
columns={columns} columns={columns}
dataSource={filterRoad} dataSource={filterRoad}
@ -220,6 +294,12 @@ const RoadNameList = (props) => {
onSubmit={createRoadDir} onSubmit={createRoadDir}
onCancel={() => { setAddVisible(false) }} onCancel={() => { setAddVisible(false) }}
/> />
<FunctionMenu
selectRoad={selectRoad}
dispatch={dispatch}
onDelDir={onDelDir}
/>
</div> </div>
); );
@ -228,10 +308,8 @@ const RoadNameList = (props) => {
const FileTable = (props) => { const FileTable = (props) => {
const { roads, fileList, dispatch, fileListLoading, roadsLoading } = props; const { roads, fileList, dispatch, fileListLoading, roadsLoading, user } = props;
const [record, setRecord] = useState(); const [record, setRecord] = useState();
const [dateRange, setDateRange] = useState();
const [detailVisible, setDetailVisible] = useState(false)
const [activeTabKey1, setActiveTabKey1] = useState('1'); const [activeTabKey1, setActiveTabKey1] = useState('1');
const [uploadVisible, setUploadVisible] = useState(false); const [uploadVisible, setUploadVisible] = useState(false);
const { RangePicker } = DatePicker; const { RangePicker } = DatePicker;
@ -246,7 +324,7 @@ const FileTable = (props) => {
if (record) { if (record) {
queryData(); queryData();
} }
}, [record, dateRange]) }, [record])
const queryData = () => { const queryData = () => {
const { rId } = record; const { rId } = record;
@ -265,14 +343,7 @@ const FileTable = (props) => {
}, [activeTabKey1, record]) }, [activeTabKey1, record])
const handelRefresh = () => { const handelRefresh = () => {
queryData()
}
const handleClose = () => {
setDetailVisible(false)
}
const handleOpen = () => {
setDetailVisible(true)
} }
const tabList = [ const tabList = [
@ -304,8 +375,22 @@ const FileTable = (props) => {
} }
setRecord(target); setRecord(target);
} }
const hanleUpload = () => { const hanleUpload = (fileList) => {
let fileUrl, fileExt, fileName, fileSize;
if (fileList && fileList instanceof Array) {
const file = fileList[0];
fileName = file.name;
fileExt = fileName.substr(fileName.lastIndexOf('.'));
fileUrl = file.url;
fileSize = file.size;
dispatch(uploadFile({ typeId: activeTabKey1, userId: user.id, fileSize, fileName, fileUrl, fileExt, roadId: record.rId })).then(res => {
if (res.type == 'UPLOAD_FILE_SUCCESS') {
message.success('文件新增成功');
setUploadVisible(false);
queryData();
}
});
}
} }
return ( return (
@ -331,13 +416,13 @@ const FileTable = (props) => {
<Button onClick={() => { setUploadVisible(true) }} type="primary" style={{ width: 160, marginBottom: 8 }} >上传</Button> <Button onClick={() => { setUploadVisible(true) }} type="primary" style={{ width: 160, marginBottom: 8 }} >上传</Button>
</Row> </Row>
<Card style={{ flex: 1 }}> <Card style={{ flex: 1 }}>
<DetailList fileList={fileList} record={record} loading={fileListLoading} dispatch={dispatch} handleOpen={handleOpen} handelRefresh={handelRefresh} onPageChange={onPageChange} /> <DetailList fileList={fileList} record={record} loading={fileListLoading} dispatch={dispatch} handelRefresh={handelRefresh} onPageChange={onPageChange} />
</Card> </Card>
</Card> </Card>
<UploadModal <UploadModal
isVisible={uploadVisible} isVisible={uploadVisible}
onCancel={() => { setUploadVisible(false) }} onCancel={() => { setUploadVisible(false) }}
onConfirm={hanleUpload} onSubmit={hanleUpload}
/> />
</div> </div>
@ -345,12 +430,13 @@ const FileTable = (props) => {
}; };
function mapStateToProps(state) { function mapStateToProps(state) {
const { fileDirs, fileList } = state; const { fileDirs, fileList, auth } = state;
return { return {
roads: fileDirs.data, roads: fileDirs.data,
roadsLoading: fileDirs.isRequesting, roadsLoading: fileDirs.isRequesting,
fileList: fileList.data, fileList: fileList.data,
fileListLoading: fileList.isRequesting, fileListLoading: fileList.isRequesting,
user: auth.user,
}; };
} }
export default connect(mapStateToProps)(FileTable); export default connect(mapStateToProps)(FileTable);

19
web/client/src/sections/fillion/components/protable.less

@ -9,22 +9,19 @@
} }
.list-row-actived{ .list-row-actived {
background-color: #7cafc6; background-color: #7cafc6;
font-weight: 600; font-weight: 600;
} }
// .spilce { .ant-divider {
// .split-row-select-active { width: 0px;
// background-color: #7cafc6; height: 8px;
// font-weight: 600; border-left: 1px solid gray;
// } margin: 0px 8px;
opacity: 0.8;
// th { }
// display: none;
// }
// }
.card-protable { .card-protable {
display: flex; display: flex;

6
web/log/development.txt

@ -30712,3 +30712,9 @@
2022-07-28 16:51:10.270 - debug: [FS-LOGGER] Init. 2022-07-28 16:51:10.270 - debug: [FS-LOGGER] Init.
2022-07-28 16:51:11.180 - info: [Router] Inject api: attachment/index 2022-07-28 16:51:11.180 - info: [Router] Inject api: attachment/index
>>>>>>> c5a4c8a87b2e23e891d4276a9cca953058b78bd7 >>>>>>> c5a4c8a87b2e23e891d4276a9cca953058b78bd7
2022-07-28 19:02:55.701 - debug: [FS-LOGGER] Init.
2022-07-28 19:02:55.796 - info: [Router] Inject api: attachment/index
2022-07-28 19:04:01.860 - debug: [FS-LOGGER] Init.
2022-07-28 19:04:01.936 - info: [Router] Inject api: attachment/index
2022-07-28 20:47:45.618 - debug: [FS-LOGGER] Init.
2022-07-28 20:47:45.710 - info: [Router] Inject api: attachment/index

25
web/package-lock.json

@ -324,7 +324,7 @@
"@antv/g-svg": { "@antv/g-svg": {
"version": "0.5.6", "version": "0.5.6",
"resolved": "http://npm.anxinyun.cn/@antv%2fg-svg/-/g-svg-0.5.6.tgz", "resolved": "http://npm.anxinyun.cn/@antv%2fg-svg/-/g-svg-0.5.6.tgz",
"integrity": "sha512-Xve1EUGk4HMbl2nq4ozR4QLh6GyoZ8Xw/+9kHYI4B5P2lIUQU95MuRsaLFfW5NNpZDx85ZeH97tqEmC9L96E7A==", "integrity": "sha1-cLL6mAxDGzmtPFtLU+NqHWCVfWU=",
"requires": { "requires": {
"@antv/g-base": "^0.5.3", "@antv/g-base": "^0.5.3",
"@antv/g-math": "^0.1.6", "@antv/g-math": "^0.1.6",
@ -1921,7 +1921,7 @@
}, },
"@peace/utils": { "@peace/utils": {
"version": "0.0.51", "version": "0.0.51",
"resolved": "http://npm.anxinyun.cn/@peace%2futils/-/utils-0.0.51.tgz", "resolved": "http://npm.anxinyun.cn:443/@peace%2futils/-/utils-0.0.51.tgz",
"integrity": "sha512-+HeDYNCf4Cid2nWEIQxED2avueBgXL4AgY7SVngubfCS6qI2TKjyPuTrtDGHTvojuLQe5BlEiKMxIuiAMQmTag==", "integrity": "sha512-+HeDYNCf4Cid2nWEIQxED2avueBgXL4AgY7SVngubfCS6qI2TKjyPuTrtDGHTvojuLQe5BlEiKMxIuiAMQmTag==",
"requires": { "requires": {
"immutable": "^4.0.0-rc.12", "immutable": "^4.0.0-rc.12",
@ -4203,7 +4203,7 @@
"connect-history-api-fallback": { "connect-history-api-fallback": {
"version": "1.6.0", "version": "1.6.0",
"resolved": "http://npm.anxinyun.cn/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", "resolved": "http://npm.anxinyun.cn/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz",
"integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==" "integrity": "sha1-izIIk1kwjRERFdgcrT/Oq4iPl7w="
}, },
"connected-react-router": { "connected-react-router": {
"version": "6.9.3", "version": "6.9.3",
@ -4625,7 +4625,7 @@
"define-property": { "define-property": {
"version": "2.0.2", "version": "2.0.2",
"resolved": "http://npm.anxinyun.cn/define-property/-/define-property-2.0.2.tgz", "resolved": "http://npm.anxinyun.cn/define-property/-/define-property-2.0.2.tgz",
"integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", "integrity": "sha1-1Flono1lS6d+AqgX+HENcCyxbp0=",
"requires": { "requires": {
"is-descriptor": "^1.0.2", "is-descriptor": "^1.0.2",
"isobject": "^3.0.1" "isobject": "^3.0.1"
@ -6178,7 +6178,7 @@
"he": { "he": {
"version": "1.2.0", "version": "1.2.0",
"resolved": "http://npm.anxinyun.cn/he/-/he-1.2.0.tgz", "resolved": "http://npm.anxinyun.cn/he/-/he-1.2.0.tgz",
"integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "integrity": "sha1-hK5l+n6vsWX922FWauFLrwVmTw8=",
"dev": true "dev": true
}, },
"history": { "history": {
@ -6924,7 +6924,7 @@
"js-tokens": { "js-tokens": {
"version": "4.0.0", "version": "4.0.0",
"resolved": "http://npm.anxinyun.cn/js-tokens/-/js-tokens-4.0.0.tgz", "resolved": "http://npm.anxinyun.cn/js-tokens/-/js-tokens-4.0.0.tgz",
"integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" "integrity": "sha1-GSA/tZmR35jjoocFDUZHzerzJJk="
}, },
"jsbn": { "jsbn": {
"version": "0.1.1", "version": "0.1.1",
@ -7286,7 +7286,7 @@
"koa-static": { "koa-static": {
"version": "1.5.3", "version": "1.5.3",
"resolved": "http://npm.anxinyun.cn/koa-static/-/koa-static-1.5.3.tgz", "resolved": "http://npm.anxinyun.cn/koa-static/-/koa-static-1.5.3.tgz",
"integrity": "sha512-FmfSFJOrtWGZ/Ae5Q7xeM+ck1IdofNEvIQhdPLvGHyTjilhYmFGoyRN1+BAbTknWnDoRRyHsGGq0FMRDTcCb1w==", "integrity": "sha1-29IUbu5xeA3/0xLyPMSnYui839I=",
"requires": { "requires": {
"debug": "^3.2.5", "debug": "^3.2.5",
"koa-send": "~2.0.1" "koa-send": "~2.0.1"
@ -8359,6 +8359,11 @@
"through": "~2.3" "through": "~2.3"
} }
}, },
"pdfh5": {
"version": "1.4.2",
"resolved": "http://npm.anxinyun.cn:443/pdfh5/-/pdfh5-1.4.2.tgz",
"integrity": "sha512-1BL8HIx/EEZowRPBgas7/WokbGEv1gxKNRmmHSimG113178mKxIBH4pxWBc0tj6d25Sy+EwnlQwv9cUUmQa42w=="
},
"perfect-scrollbar": { "perfect-scrollbar": {
"version": "1.5.5", "version": "1.5.5",
"resolved": "http://npm.anxinyun.cn/perfect-scrollbar/-/perfect-scrollbar-1.5.5.tgz", "resolved": "http://npm.anxinyun.cn/perfect-scrollbar/-/perfect-scrollbar-1.5.5.tgz",
@ -10518,7 +10523,7 @@
"source-map-resolve": { "source-map-resolve": {
"version": "0.5.3", "version": "0.5.3",
"resolved": "http://npm.anxinyun.cn/source-map-resolve/-/source-map-resolve-0.5.3.tgz", "resolved": "http://npm.anxinyun.cn/source-map-resolve/-/source-map-resolve-0.5.3.tgz",
"integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", "integrity": "sha1-GQhmvs51U+H48mei7oLGBrVQmho=",
"requires": { "requires": {
"atob": "^2.1.2", "atob": "^2.1.2",
"decode-uri-component": "^0.2.0", "decode-uri-component": "^0.2.0",
@ -11101,7 +11106,7 @@
"type-is": { "type-is": {
"version": "1.6.18", "version": "1.6.18",
"resolved": "http://npm.anxinyun.cn/type-is/-/type-is-1.6.18.tgz", "resolved": "http://npm.anxinyun.cn/type-is/-/type-is-1.6.18.tgz",
"integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "integrity": "sha1-TlUs0F3wlGfcvE73Od6J8s83wTE=",
"requires": { "requires": {
"media-typer": "0.3.0", "media-typer": "0.3.0",
"mime-types": "~2.1.24" "mime-types": "~2.1.24"
@ -11341,7 +11346,7 @@
"use": { "use": {
"version": "3.1.1", "version": "3.1.1",
"resolved": "http://npm.anxinyun.cn/use/-/use-3.1.1.tgz", "resolved": "http://npm.anxinyun.cn/use/-/use-3.1.1.tgz",
"integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" "integrity": "sha1-1QyMrHmhn7wg8pEfVuuXP04QBw8="
}, },
"use-json-comparison": { "use-json-comparison": {
"version": "1.0.6", "version": "1.0.6",

3
web/package.json

@ -6,7 +6,7 @@
"scripts": { "scripts": {
"test": "mocha", "test": "mocha",
"start": "cross-env NODE_ENV=development npm run start-params", "start": "cross-env NODE_ENV=development npm run start-params",
"start-params": "node server -p 5000 -u http://10.8.30.7:14000 --qndmn http://rfkimpwbb.hn-bkt.clouddn.com", "start-params": "node server -p 5000 -u http://localhost:4000 --qndmn http://rfkimpwbb.hn-bkt.clouddn.com",
"deploy": "export NODE_ENV=production&&npm run color && npm run build && node server", "deploy": "export NODE_ENV=production&&npm run color && npm run build && node server",
"build-dev": "export NODE_ENV=development&&webpack --config webpack.config.js", "build-dev": "export NODE_ENV=development&&webpack --config webpack.config.js",
"build": "export NODE_ENV=production&&webpack --config webpack.config.prod.js", "build": "export NODE_ENV=production&&webpack --config webpack.config.prod.js",
@ -92,6 +92,7 @@
"swiper": "^8.3.1", "swiper": "^8.3.1",
"uuid": "^8.3.1", "uuid": "^8.3.1",
"webpack-dev-server": "^3.11.2", "webpack-dev-server": "^3.11.2",
"pdfh5": "^1.4.2",
"xlsx": "^0.16.9" "xlsx": "^0.16.9"
} }
} }

Loading…
Cancel
Save