diff --git a/api/app/lib/controllers/file/index.js b/api/app/lib/controllers/file/index.js
index 270447e9..8870da3e 100644
--- a/api/app/lib/controllers/file/index.js
+++ b/api/app/lib/controllers/file/index.js
@@ -59,30 +59,13 @@ async function delFileDir(ctx, next) {
     let rslt = [], fileDirIds = [];
 
     try {
-        const { type, id } = ctx.query, // type == parent / child
+        const { id } = ctx.query, // type == parent / child
             models = ctx.fs.dc.models;
         const transaction = await ctx.fs.dc.orm.transaction();
 
-        if (type == 'parent') {
-            let fileTypes = await models.FileType.findAll({ where: { rId: id } });
-            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 models.FileRoad.destroy({ where: { rId: id }, transaction })
+        await models.Files.destroy({ where: { roadId: id }, transaction })
+
         await transaction.commit();
 
         error = null;
diff --git a/api/log/development.log b/api/log/development.log
index 2542724b..58b473fe 100644
--- a/api/log/development.log
+++ b/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: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 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.
diff --git a/web/client/src/components/Upload/index.js b/web/client/src/components/Upload/index.js
index eac0a27a..0bd3af10 100644
--- a/web/client/src/components/Upload/index.js
+++ b/web/client/src/components/Upload/index.js
@@ -54,7 +54,7 @@ class Uploads extends Component {
 
     componentWillReceiveProps(np) {
         const { dispatch, value: thisEditData, onChange } = this.props;
-        const { value: nextEditData } = np;
+        const { value: nextEditData, clearFileList } = np;
 
         const setFileList = () => {
             let defaultFileList = [];
@@ -92,6 +92,12 @@ class Uploads extends Component {
                 }
             }
         }
+
+        if (clearFileList) {
+            this.setState({
+                fileList: []
+            });
+        }
         // else{
         //     this.setState({
         //         fileList:[],
diff --git a/web/client/src/sections/fillion/actions/file.js b/web/client/src/sections/fillion/actions/file.js
index e453a967..2b6adc7f 100644
--- a/web/client/src/sections/fillion/actions/file.js
+++ b/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}
-export function uploadFile(query) {
+// data : {typeId, userId, userName, startDate, endDate, fileSize, fileName, fileUrl, fileExt}
+export function uploadFile(data) {
     return dispatch => basicAction({
         type: 'post',
         dispatch: dispatch,
         actionType: 'UPLOAD_FILE',
         url: ApiTable.uploadFile,
-        query,
+        data,
         msg: { error: '上传文件失败' },
         reducer: { name: 'uploadFile' }
     });
diff --git a/web/client/src/sections/fillion/components/file/functionMenu.js b/web/client/src/sections/fillion/components/file/functionMenu.js
new file mode 100644
index 00000000..b4211d18
--- /dev/null
+++ b/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: ,
+            // content: 'Some descriptions',
+            okText: '是',
+            okType: 'danger',
+            cancelText: '否',
+            onOk() {
+                onDeleteDir();
+            },
+            onCancel() {
+            },
+        });
+    }
+
+    const refreshFileDir = () => {
+        dispatch(queryFileDir());
+    }
+
+    return (
+        
+
+    )
+}
+
+FunctionMenu.propTypes = {}
+
+export default FunctionMenu
\ No newline at end of file
diff --git a/web/client/src/sections/fillion/components/file/menu.less b/web/client/src/sections/fillion/components/file/menu.less
new file mode 100644
index 00000000..c143c3b8
--- /dev/null
+++ b/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;
+}
\ No newline at end of file
diff --git a/web/client/src/sections/fillion/components/file/uploadModal.js b/web/client/src/sections/fillion/components/file/uploadModal.js
index e57a0026..b14b5b49 100644
--- a/web/client/src/sections/fillion/components/file/uploadModal.js
+++ b/web/client/src/sections/fillion/components/file/uploadModal.js
@@ -32,8 +32,9 @@ const UploadModal = props => {
                     maxFilesNum={1}
                     maxFileSize={10}
                     onChange={onFileUploaded}
-                    // value
-                    // onStateChange
+                    clearFileList={isVisible}
+                // value
+                // onStateChange
                 />
             
         
diff --git a/web/client/src/sections/fillion/components/fileTable.js b/web/client/src/sections/fillion/components/fileTable.js
index 4052e40a..a0fecdcd 100644
--- a/web/client/src/sections/fillion/components/fileTable.js
+++ b/web/client/src/sections/fillion/components/fileTable.js
@@ -1,32 +1,40 @@
 import { connect } from 'react-redux';
 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 { 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 { httpDel } from '@peace/utils'
 import { PinyinHelper } from '@peace/utils';
 import RoadModal from './file/roadModal';
+import Pdfh5 from "pdfh5";
+import "pdfh5/css/pdfh5.css";
+import FunctionMenu from './file/functionMenu';
+const { confirm } = Modal;
 
 // @ts-ignore
 import UploadModal from './file/uploadModal';
 
+var pdfh5 = null;
 const DetailList = (props) => {
-    const { fileList, loading, dispatch, handleOpen, handelRefresh, onPageChange } = props;
-    const [visible, setVisible] = useState(false)
-    const [selectRecord, setSelectRecord] = useState();
-    const checkDetail = (record) => {
-        // dispatch(getReportDetail(record.id))
-    }
+    const { fileList, loading, dispatch, handelRefresh, onPageChange } = props;
+    const [imgSrc, setImgSrc] = useState({ imageView: false, imgSrc: '' })
+    const [pdfView, setPdfView] = useState({ showPDF: false, pdfName: '', pdfurl: '' })
+    var tyApiRoot = localStorage.getItem('tyApiRoot')
+
+    useEffect(() => {
+        if (pdfView.showPDF) {
+            pdfh5 = new Pdfh5("#pdf-loader", {
+                pdfurl: pdfView.pdfurl
+            })
+        }
+    }, [pdfView])
 
-    const handleRemove = (record) => {
-        let url = 'report/{reportId}';
-        const actionType = "DEL_REPORT_RECORD";
-        const msg = {}
+    const handleRemove = (record, filePath) => {
         if (record) {
-            url = url.replace('{reportId}', record.id)
-            httpDel(dispatch, { url, actionType, msg }).then(res => {
-                if (res.success) {
+            dispatch(deleteFile(record.id)).then(res => {
+                if (res.type == 'DELETE_FILE_SUCCESS') {
                     message.success("文件删除成功");
                     handelRefresh()
                 } 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: ,
+            // content: 'Some descriptions',
+            okText: '是',
+            okType: 'danger',
+            cancelText: '否',
+            onOk() {
+                handleRemove(record, filePath);
+            },
+            onCancel() {
+            },
+        });
     }
 
     const columns = [
@@ -93,30 +125,36 @@ const DetailList = (props) => {
             valueType: 'option',
             align: 'center',
             render: (text, record) => {
-                return [
-                    ,
-                    
-                                
-                                
-                            
-                        ]}
-                        visible={selectRecord == record.id && visible}
-                        trigger="click"
-                        onClick={() => setSelectRecord(record.id)}
-                        title="是否删除该记录?"
-                        onVisibleChange={(newVisible) => setVisible(newVisible)}
-                    >
-                        
-                    
-                ]
-            }
+                const regEx = /\bhttps?:\/\/[^:\/]+/ig;
+                const path = record.fileUrl;
+                const filename = path.substr(path.lastIndexOf("/") + 1);
+                const filePath = path.replace(regEx, "");
+                const filePath_ = `${tyApiRoot}/attachments?src=${filePath}&filename=${filename}`;
+
+                return 
+                    {/* {下载} */}
+                    { {
+                        window.open(filePath_);
+                    }} >下载}
+                    
+                     { showDeleteConfirm(record, filePath) }}>删除
+                    {
+                        ['.png', '.jpg'].some(item => item == record.fileExt) ?
+                            [,
+                             { setImgSrc({ imageView: true, imgSrc: path }) }}>预览]
+                            : ''
+                    }
+                    {
+                        ['.pdf'].some(item => item == record.fileExt) ?
+                            [,
+                             overviewPDF(record, path)}>预览]
+                            : ''
+                    }
+                
+            },
         },
     ];
-    return (
+    return [
          {
             rowKey="key"
             toolBarRender={false}
             search={false}
-        />
-    );
+        />,
+         {
+                    setImgSrc({ imageView: value, imgSrc: '' });
+                },
+            }}
+        />,
+         {
+                pdfh5 = null;
+                setPdfView({ showPDF: false, pdfName: '', pdfurl: '' });
+            }}
+        >
+            
+        
+
+    ];
 };
 
 
@@ -143,7 +206,7 @@ const RoadNameList = (props) => {
     const [filterRoad, setFilterRoad] = useState([]);
     const [addVisible, setAddVisible] = useState(false);
     const [selectRoad, setSelectRoad] = useState();
-    const { onChange, record, roads, loading, queryData, dispatch } = props;
+    const { onChange, roads, loading, queryData, dispatch } = props;
     const columns = [
         {
             title: '道路名称',
@@ -154,6 +217,13 @@ const RoadNameList = (props) => {
 
     ];
 
+    useEffect(() => {
+        if (roads && roads instanceof Array) {
+            setSelectRoad(roads[0].rId)
+            onChange(roads[0]);
+        }
+    }, [roads])
+
     useEffect(() => {
         if (roads) {
             setFilterRoad(roads)
@@ -184,8 +254,12 @@ const RoadNameList = (props) => {
 
     }
 
+    const onDelDir = () => {
+
+    }
+
     return (
-        
+        
              {
                 onSubmit={createRoadDir}
                 onCancel={() => { setAddVisible(false) }}
             />
+
+            
          
 
     );
@@ -228,10 +308,8 @@ const RoadNameList = (props) => {
 
 
 const FileTable = (props) => {
-    const { roads, fileList, dispatch, fileListLoading, roadsLoading } = props;
+    const { roads, fileList, dispatch, fileListLoading, roadsLoading, user } = props;
     const [record, setRecord] = useState();
-    const [dateRange, setDateRange] = useState();
-    const [detailVisible, setDetailVisible] = useState(false)
     const [activeTabKey1, setActiveTabKey1] = useState('1');
     const [uploadVisible, setUploadVisible] = useState(false);
     const { RangePicker } = DatePicker;
@@ -246,7 +324,7 @@ const FileTable = (props) => {
         if (record) {
             queryData();
         }
-    }, [record, dateRange])
+    }, [record])
 
     const queryData = () => {
         const { rId } = record;
@@ -265,14 +343,7 @@ const FileTable = (props) => {
     }, [activeTabKey1, record])
 
     const handelRefresh = () => {
-
-    }
-
-    const handleClose = () => {
-        setDetailVisible(false)
-    }
-    const handleOpen = () => {
-        setDetailVisible(true)
+        queryData()
     }
 
     const tabList = [
@@ -304,8 +375,22 @@ const FileTable = (props) => {
         }
         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 (
@@ -331,13 +416,13 @@ const FileTable = (props) => {
                     
                 
                 
-                    
+                    
                 
             
              { setUploadVisible(false) }}
-                onConfirm={hanleUpload}
+                onSubmit={hanleUpload}
             />
          
 
@@ -345,12 +430,13 @@ const FileTable = (props) => {
 };
 
 function mapStateToProps(state) {
-    const { fileDirs, fileList } = state;
+    const { fileDirs, fileList, auth } = state;
     return {
         roads: fileDirs.data,
         roadsLoading: fileDirs.isRequesting,
         fileList: fileList.data,
         fileListLoading: fileList.isRequesting,
+        user: auth.user,
     };
 }
 export default connect(mapStateToProps)(FileTable);
\ No newline at end of file
diff --git a/web/client/src/sections/fillion/components/protable.less b/web/client/src/sections/fillion/components/protable.less
index f788725f..6d66a5df 100644
--- a/web/client/src/sections/fillion/components/protable.less
+++ b/web/client/src/sections/fillion/components/protable.less
@@ -9,22 +9,19 @@
 
 }
 
-.list-row-actived{
+.list-row-actived {
   background-color: #7cafc6;
   font-weight: 600;
 }
 
 
-// .spilce {
-//   .split-row-select-active {
-//     background-color: #7cafc6;
-//     font-weight: 600;
-//   }
-
-//   th {
-//     display: none;
-//   }
-// }
+.ant-divider {
+  width: 0px;
+  height: 8px;
+  border-left: 1px solid gray;
+  margin: 0px 8px;
+  opacity: 0.8;
+}
 
 .card-protable {
   display: flex;
diff --git a/web/log/development.txt b/web/log/development.txt
index 9b421be3..2bae49ab 100644
--- a/web/log/development.txt
+++ b/web/log/development.txt
@@ -30712,3 +30712,9 @@
 2022-07-28 16:51:10.270 - [34mdebug[39m: [FS-LOGGER] Init.
 2022-07-28 16:51:11.180 - [32minfo[39m: [Router] Inject api: attachment/index
 >>>>>>> c5a4c8a87b2e23e891d4276a9cca953058b78bd7
+2022-07-28 19:02:55.701 - [34mdebug[39m: [FS-LOGGER] Init.
+2022-07-28 19:02:55.796 - [32minfo[39m: [Router] Inject api: attachment/index
+2022-07-28 19:04:01.860 - [34mdebug[39m: [FS-LOGGER] Init.
+2022-07-28 19:04:01.936 - [32minfo[39m: [Router] Inject api: attachment/index
+2022-07-28 20:47:45.618 - [34mdebug[39m: [FS-LOGGER] Init.
+2022-07-28 20:47:45.710 - [32minfo[39m: [Router] Inject api: attachment/index
diff --git a/web/package-lock.json b/web/package-lock.json
index 25c2bba8..588c99ee 100644
--- a/web/package-lock.json
+++ b/web/package-lock.json
@@ -324,7 +324,7 @@
     "@antv/g-svg": {
       "version": "0.5.6",
       "resolved": "http://npm.anxinyun.cn/@antv%2fg-svg/-/g-svg-0.5.6.tgz",
-      "integrity": "sha512-Xve1EUGk4HMbl2nq4ozR4QLh6GyoZ8Xw/+9kHYI4B5P2lIUQU95MuRsaLFfW5NNpZDx85ZeH97tqEmC9L96E7A==",
+      "integrity": "sha1-cLL6mAxDGzmtPFtLU+NqHWCVfWU=",
       "requires": {
         "@antv/g-base": "^0.5.3",
         "@antv/g-math": "^0.1.6",
@@ -1921,7 +1921,7 @@
     },
     "@peace/utils": {
       "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==",
       "requires": {
         "immutable": "^4.0.0-rc.12",
@@ -4203,7 +4203,7 @@
     "connect-history-api-fallback": {
       "version": "1.6.0",
       "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": {
       "version": "6.9.3",
@@ -4625,7 +4625,7 @@
     "define-property": {
       "version": "2.0.2",
       "resolved": "http://npm.anxinyun.cn/define-property/-/define-property-2.0.2.tgz",
-      "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
+      "integrity": "sha1-1Flono1lS6d+AqgX+HENcCyxbp0=",
       "requires": {
         "is-descriptor": "^1.0.2",
         "isobject": "^3.0.1"
@@ -6178,7 +6178,7 @@
     "he": {
       "version": "1.2.0",
       "resolved": "http://npm.anxinyun.cn/he/-/he-1.2.0.tgz",
-      "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
+      "integrity": "sha1-hK5l+n6vsWX922FWauFLrwVmTw8=",
       "dev": true
     },
     "history": {
@@ -6924,7 +6924,7 @@
     "js-tokens": {
       "version": "4.0.0",
       "resolved": "http://npm.anxinyun.cn/js-tokens/-/js-tokens-4.0.0.tgz",
-      "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
+      "integrity": "sha1-GSA/tZmR35jjoocFDUZHzerzJJk="
     },
     "jsbn": {
       "version": "0.1.1",
@@ -7286,7 +7286,7 @@
     "koa-static": {
       "version": "1.5.3",
       "resolved": "http://npm.anxinyun.cn/koa-static/-/koa-static-1.5.3.tgz",
-      "integrity": "sha512-FmfSFJOrtWGZ/Ae5Q7xeM+ck1IdofNEvIQhdPLvGHyTjilhYmFGoyRN1+BAbTknWnDoRRyHsGGq0FMRDTcCb1w==",
+      "integrity": "sha1-29IUbu5xeA3/0xLyPMSnYui839I=",
       "requires": {
         "debug": "^3.2.5",
         "koa-send": "~2.0.1"
@@ -8359,6 +8359,11 @@
         "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": {
       "version": "1.5.5",
       "resolved": "http://npm.anxinyun.cn/perfect-scrollbar/-/perfect-scrollbar-1.5.5.tgz",
@@ -10518,7 +10523,7 @@
     "source-map-resolve": {
       "version": "0.5.3",
       "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": {
         "atob": "^2.1.2",
         "decode-uri-component": "^0.2.0",
@@ -11101,7 +11106,7 @@
     "type-is": {
       "version": "1.6.18",
       "resolved": "http://npm.anxinyun.cn/type-is/-/type-is-1.6.18.tgz",
-      "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
+      "integrity": "sha1-TlUs0F3wlGfcvE73Od6J8s83wTE=",
       "requires": {
         "media-typer": "0.3.0",
         "mime-types": "~2.1.24"
@@ -11341,7 +11346,7 @@
     "use": {
       "version": "3.1.1",
       "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": {
       "version": "1.0.6",
diff --git a/web/package.json b/web/package.json
index 3f139646..073500da 100644
--- a/web/package.json
+++ b/web/package.json
@@ -6,7 +6,7 @@
   "scripts": {
     "test": "mocha",
     "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",
     "build-dev": "export NODE_ENV=development&&webpack --config webpack.config.js",
     "build": "export NODE_ENV=production&&webpack --config webpack.config.prod.js",
@@ -92,6 +92,7 @@
     "swiper": "^8.3.1",
     "uuid": "^8.3.1",
     "webpack-dev-server": "^3.11.2",
+    "pdfh5": "^1.4.2",
     "xlsx": "^0.16.9"
   }
 }