From c235b08e0e1f965357b34e0dbd6d8605fd6c68df Mon Sep 17 00:00:00 2001
From: Mr Ke <kelq@hugeinfo.com.cn>
Date: Sat, 16 May 2020 13:46:06 +0800
Subject: [PATCH] 最新消息修改、附件下载

---
 src/index.js                                      |   30 
 src/components/common/NotifyList/index.scss       |   24 +
 src/components/page/DocumentDetailPage/index.jsx  |   11 
 src/components/common/multiSelect/index.jsx       |   27 +
 src/components/page/basicConfig/UserManage.jsx    |  147 +++++++
 src/components/page/basicConfig/UserDetail.jsx    |  439 ++++++++++++++++++++
 src/components/common/HotListTableView/index.scss |    2 
 src/components/common/NotifyList/index.jsx        |   46 +
 src/index.css                                     |   22 +
 report.20200514.164013.12768.0.001.json           |  479 ++++++++++++++++++++++
 10 files changed, 1,202 insertions(+), 25 deletions(-)

diff --git a/report.20200514.164013.12768.0.001.json b/report.20200514.164013.12768.0.001.json
new file mode 100644
index 0000000..2345620
--- /dev/null
+++ b/report.20200514.164013.12768.0.001.json
@@ -0,0 +1,479 @@
+
+{
+  "header": {
+    "event": "Allocation failed - JavaScript heap out of memory",
+    "trigger": "FatalError",
+    "filename": "report.20200514.164013.12768.0.001.json",
+    "dumpEventTime": "2020-05-14T16:40:13Z",
+    "dumpEventTimeStamp": "1589445613571",
+    "processId": 12768,
+    "cwd": "E:\\HugeInfo_Code\\oa",
+    "commandLine": [
+      "node",
+      "E:\\HugeInfo_Code\\oa\\node_modules\\_react-app-rewired@2.1.5@react-app-rewired\\scripts\\start.js"
+    ],
+    "nodejsVersion": "v12.2.0",
+    "wordSize": 64,
+    "arch": "x64",
+    "platform": "win32",
+    "componentVersions": {
+      "node": "12.2.0",
+      "v8": "7.4.288.21-node.17",
+      "uv": "1.28.0",
+      "zlib": "1.2.11",
+      "brotli": "1.0.7",
+      "ares": "1.15.0",
+      "modules": "72",
+      "nghttp2": "1.38.0",
+      "napi": "4",
+      "llhttp": "1.1.3",
+      "http_parser": "2.8.0",
+      "openssl": "1.1.1b",
+      "cldr": "35.1",
+      "icu": "64.2",
+      "tz": "2019a",
+      "unicode": "12.1"
+    },
+    "release": {
+      "name": "node",
+      "headersUrl": "https://nodejs.org/download/release/v12.2.0/node-v12.2.0-headers.tar.gz",
+      "sourceUrl": "https://nodejs.org/download/release/v12.2.0/node-v12.2.0.tar.gz",
+      "libUrl": "https://nodejs.org/download/release/v12.2.0/win-x64/node.lib"
+    },
+    "osName": "Windows_NT",
+    "osRelease": "10.0.18363",
+    "osVersion": "Windows 10 Home China",
+    "osMachine": "x86_64",
+    "host": "LAPTOP-RI7D261L"
+  },
+  "javascriptStack": {
+    "message": "No stack.",
+    "stack": [
+      "Unavailable."
+    ]
+  },
+  "nativeStack": [
+    {
+      "pc": "0x00007ff7eb4e4e09",
+      "symbol": "std::basic_ostream<char,std::char_traits<char> >::operator<<+9161"
+    },
+    {
+      "pc": "0x00007ff7eb4e8764",
+      "symbol": "std::basic_ostream<char,std::char_traits<char> >::operator<<+23844"
+    },
+    {
+      "pc": "0x00007ff7eb4e7785",
+      "symbol": "std::basic_ostream<char,std::char_traits<char> >::operator<<+19781"
+    },
+    {
+      "pc": "0x00007ff7eb5cf9ab",
+      "symbol": "uv_loop_fork+47931"
+    },
+    {
+      "pc": "0x00007ff7eb9071fe",
+      "symbol": "v8::internal::Parser::ReportMessageAt+206"
+    },
+    {
+      "pc": "0x00007ff7eb8db27a",
+      "symbol": "v8::internal::wasm::StreamingDecoder::NotifyCompilationEnded+666"
+    },
+    {
+      "pc": "0x00007ff7eb9716bc",
+      "symbol": "v8::internal::Heap::CreateFillerObjectAt+2972"
+    },
+    {
+      "pc": "0x00007ff7eb97942f",
+      "symbol": "v8::internal::LocalEmbedderHeapTracer::NotifyV8MarkingWorklistWasEmpty+5375"
+    },
+    {
+      "pc": "0x00007ff7eb96faa3",
+      "symbol": "v8::internal::Heap::CollectGarbage+1235"
+    },
+    {
+      "pc": "0x00007ff7eb96e1a4",
+      "symbol": "v8::internal::GCTracer::AddScopeSample+1316"
+    },
+    {
+      "pc": "0x00007ff7eb9aedd3",
+      "symbol": "v8::internal::Factory::NewFillerObject+67"
+    },
+    {
+      "pc": "0x00007ff7ebcd57d6",
+      "symbol": "v8::internal::OptimizingCompileDispatcher::Unblock+116966"
+    },
+    {
+      "pc": "0x00007ff7ec170366",
+      "symbol": "v8::internal::NativesCollection<0>::GetScriptsSource+660214"
+    }
+  ],
+  "javascriptHeap": {
+    "totalMemory": 2155225088,
+    "totalCommittedMemory": 2155225088,
+    "usedMemory": 1854888984,
+    "availableMemory": 78820712,
+    "memoryLimit": 2197815296,
+    "heapSpaces": {
+      "read_only_space": {
+        "memorySize": 524288,
+        "committedMemory": 524288,
+        "capacity": 523976,
+        "used": 31712,
+        "available": 492264
+      },
+      "new_space": {
+        "memorySize": 33554432,
+        "committedMemory": 33554432,
+        "capacity": 16767232,
+        "used": 943080,
+        "available": 15824152
+      },
+      "old_space": {
+        "memorySize": 1975640064,
+        "committedMemory": 1975640064,
+        "capacity": 1717317928,
+        "used": 1714171072,
+        "available": 3146856
+      },
+      "code_space": {
+        "memorySize": 4358144,
+        "committedMemory": 4358144,
+        "capacity": 3402048,
+        "used": 3402048,
+        "available": 0
+      },
+      "map_space": {
+        "memorySize": 7868416,
+        "committedMemory": 7868416,
+        "capacity": 3247280,
+        "used": 3247280,
+        "available": 0
+      },
+      "large_object_space": {
+        "memorySize": 132657152,
+        "committedMemory": 132657152,
+        "capacity": 132543488,
+        "used": 132543488,
+        "available": 0
+      },
+      "code_large_object_space": {
+        "memorySize": 622592,
+        "committedMemory": 622592,
+        "capacity": 550304,
+        "used": 550304,
+        "available": 0
+      },
+      "new_large_object_space": {
+        "memorySize": 0,
+        "committedMemory": 0,
+        "capacity": 16767232,
+        "used": 0,
+        "available": 16767232
+      }
+    }
+  },
+  "resourceUsage": {
+    "userCpuSeconds": 648.609,
+    "kernelCpuSeconds": 263.234,
+    "cpuConsumptionPercent": 3.63255,
+    "maxRss": 2726780928,
+    "pageFaults": {
+      "IORequired": 6475453,
+      "IONotRequired": 0
+    },
+    "fsActivity": {
+      "reads": 15165,
+      "writes": 644
+    }
+  },
+  "libuv": [
+  ],
+  "environmentVariables": {
+    "=C:": "C:\\",
+    "ALLUSERSPROFILE": "C:\\ProgramData",
+    "APPDATA": "C:\\Users\\Mr Ke\\AppData\\Roaming",
+    "AUTHORINFO": "\"Ke Liqin <545800322@qq.com>\"",
+    "BABEL_ENV": "development",
+    "CLASSPATH": ".;C:\\Program Files\\Java\\jdk1.8.0_131\\lib;C:\\Program Files\\Java\\jdk1.8.0_131\\lib\\tools.jar",
+    "COLORTERM": "truecolor",
+    "CommonProgramFiles": "C:\\Program Files\\Common Files",
+    "CommonProgramFiles(x86)": "C:\\Program Files (x86)\\Common Files",
+    "CommonProgramW6432": "C:\\Program Files\\Common Files",
+    "COMPUTERNAME": "LAPTOP-RI7D261L",
+    "ComSpec": "C:\\WINDOWS\\system32\\cmd.exe",
+    "configsetroot": "C:\\WINDOWS\\ConfigSetRoot",
+    "DriverData": "C:\\Windows\\System32\\Drivers\\DriverData",
+    "FPS_BROWSER_APP_PROFILE_STRING": "Internet Explorer",
+    "FPS_BROWSER_USER_PROFILE_STRING": "Default",
+    "HOME": "C:\\Users\\Mr Ke",
+    "HOMEDRIVE": "C:",
+    "HOMEPATH": "\\Users\\Mr Ke",
+    "INIT_CWD": "E:\\HugeInfo_Code\\oa",
+    "JAVA_HOME": "C:\\Program Files\\Java\\jdk1.8.0_131",
+    "LANG": "zh_CN.UTF-8",
+    "LOCALAPPDATA": "C:\\Users\\Mr Ke\\AppData\\Local",
+    "LOGONSERVER": "\\\\LAPTOP-RI7D261L",
+    "NODE": "C:\\Program Files\\nodejs\\node.exe",
+    "NODE_ENV": "development",
+    "NODE_EXE": "C:\\Program Files\\nodejs\\\\node.exe",
+    "NODE_PATH": "",
+    "NPM_CLI_JS": "C:\\Program Files\\nodejs\\\\node_modules\\npm\\bin\\npm-cli.js",
+    "npm_config_access": "",
+    "npm_config_allow_same_version": "",
+    "npm_config_also": "",
+    "npm_config_always_auth": "",
+    "npm_config_argv": "{\"remain\":[],\"cooked\":[\"start\"],\"original\":[\"start\"]}",
+    "npm_config_audit": "true",
+    "npm_config_audit_level": "low",
+    "npm_config_auth_type": "legacy",
+    "npm_config_before": "",
+    "npm_config_bin_links": "true",
+    "npm_config_browser": "",
+    "npm_config_ca": "",
+    "npm_config_cache": "C:\\Users\\Mr Ke\\AppData\\Roaming\\npm-cache",
+    "npm_config_cache_lock_retries": "10",
+    "npm_config_cache_lock_stale": "60000",
+    "npm_config_cache_lock_wait": "10000",
+    "npm_config_cache_max": "Infinity",
+    "npm_config_cache_min": "10",
+    "npm_config_cafile": "",
+    "npm_config_cert": "",
+    "npm_config_cidr": "",
+    "npm_config_color": "true",
+    "npm_config_commit_hooks": "true",
+    "npm_config_depth": "Infinity",
+    "npm_config_description": "true",
+    "npm_config_dev": "",
+    "npm_config_disturl": "https://npm.taobao.org/dist",
+    "npm_config_dry_run": "",
+    "npm_config_editor": "notepad.exe",
+    "npm_config_engine_strict": "",
+    "npm_config_fetch_retries": "2",
+    "npm_config_fetch_retry_factor": "10",
+    "npm_config_fetch_retry_maxtimeout": "60000",
+    "npm_config_fetch_retry_mintimeout": "10000",
+    "npm_config_force": "",
+    "npm_config_git": "git",
+    "npm_config_git_tag_version": "true",
+    "npm_config_global": "",
+    "npm_config_globalconfig": "C:\\Users\\Mr Ke\\AppData\\Roaming\\npm\\etc\\npmrc",
+    "npm_config_globalignorefile": "C:\\Users\\Mr Ke\\AppData\\Roaming\\npm\\etc\\npmignore",
+    "npm_config_global_style": "",
+    "npm_config_group": "",
+    "npm_config_ham_it_up": "",
+    "npm_config_heading": "npm",
+    "npm_config_https_proxy": "",
+    "npm_config_if_present": "",
+    "npm_config_ignore_prepublish": "",
+    "npm_config_ignore_scripts": "",
+    "npm_config_init_author_email": "",
+    "npm_config_init_author_name": "",
+    "npm_config_init_author_url": "",
+    "npm_config_init_license": "ISC",
+    "npm_config_init_module": "C:\\Users\\Mr Ke\\.npm-init.js",
+    "npm_config_init_version": "1.0.0",
+    "npm_config_json": "",
+    "npm_config_key": "",
+    "npm_config_legacy_bundling": "",
+    "npm_config_link": "",
+    "npm_config_local_address": "",
+    "npm_config_loglevel": "notice",
+    "npm_config_logs_max": "10",
+    "npm_config_long": "",
+    "npm_config_maxsockets": "50",
+    "npm_config_message": "%s",
+    "npm_config_metrics_registry": "https://registry.npm.taobao.org/",
+    "npm_config_node_gyp": "C:\\Users\\Mr Ke\\AppData\\Roaming\\nvm\\v12.2.0\\node_modules\\npm\\node_modules\\node-gyp\\bin\\node-gyp.js",
+    "npm_config_node_options": "",
+    "npm_config_node_version": "12.2.0",
+    "npm_config_noproxy": "",
+    "npm_config_offline": "",
+    "npm_config_onload_script": "",
+    "npm_config_only": "",
+    "npm_config_optional": "true",
+    "npm_config_otp": "",
+    "npm_config_package_lock": "true",
+    "npm_config_package_lock_only": "",
+    "npm_config_parseable": "",
+    "npm_config_prefer_offline": "",
+    "npm_config_prefer_online": "",
+    "npm_config_prefix": "C:\\Users\\Mr Ke\\AppData\\Roaming\\npm",
+    "npm_config_preid": "",
+    "npm_config_production": "",
+    "npm_config_progress": "true",
+    "npm_config_proxy": "",
+    "npm_config_read_only": "",
+    "npm_config_rebuild_bundle": "true",
+    "npm_config_registry": "https://registry.npm.taobao.org/",
+    "npm_config_rollback": "true",
+    "npm_config_save": "true",
+    "npm_config_save_bundle": "",
+    "npm_config_save_dev": "",
+    "npm_config_save_exact": "",
+    "npm_config_save_optional": "",
+    "npm_config_save_prefix": "^",
+    "npm_config_save_prod": "",
+    "npm_config_scope": "",
+    "npm_config_scripts_prepend_node_path": "warn-only",
+    "npm_config_script_shell": "",
+    "npm_config_searchexclude": "",
+    "npm_config_searchlimit": "20",
+    "npm_config_searchopts": "",
+    "npm_config_searchstaleness": "900",
+    "npm_config_send_metrics": "",
+    "npm_config_shell": "C:\\WINDOWS\\system32\\cmd.exe",
+    "npm_config_shrinkwrap": "true",
+    "npm_config_sign_git_commit": "",
+    "npm_config_sign_git_tag": "",
+    "npm_config_sso_poll_frequency": "500",
+    "npm_config_sso_type": "oauth",
+    "npm_config_strict_ssl": "true",
+    "npm_config_tag": "latest",
+    "npm_config_tag_version_prefix": "v",
+    "npm_config_timing": "",
+    "npm_config_tmp": "C:\\Users\\MRKE~1\\AppData\\Local\\Temp",
+    "npm_config_umask": "0000",
+    "npm_config_unicode": "",
+    "npm_config_unsafe_perm": "true",
+    "npm_config_update_notifier": "true",
+    "npm_config_usage": "",
+    "npm_config_user": "",
+    "npm_config_userconfig": "C:\\Users\\Mr Ke\\.npmrc",
+    "npm_config_user_agent": "npm/6.9.0 node/v12.2.0 win32 x64",
+    "npm_config_version": "",
+    "npm_config_versions": "",
+    "npm_config_viewer": "browser",
+    "npm_execpath": "C:\\Users\\Mr Ke\\AppData\\Roaming\\nvm\\v12.2.0\\node_modules\\npm\\bin\\npm-cli.js",
+    "npm_lifecycle_event": "start",
+    "npm_lifecycle_script": "react-app-rewired start",
+    "npm_node_execpath": "C:\\Program Files\\nodejs\\node.exe",
+    "npm_package_browserslist_development_0": "ie 8",
+    "npm_package_browserslist_development_1": "last 1 chrome version",
+    "npm_package_browserslist_development_2": "last 1 firefox version",
+    "npm_package_browserslist_development_3": "last 1 safari version",
+    "npm_package_browserslist_production_0": ">0.2%",
+    "npm_package_browserslist_production_1": "not dead",
+    "npm_package_browserslist_production_2": "not op_mini all",
+    "npm_package_dependencies_antd": "^3.26.11",
+    "npm_package_dependencies_axios": "^0.19.2",
+    "npm_package_dependencies_braft_editor": "^2.3.9",
+    "npm_package_dependencies_mocker_api": "^1.9.0",
+    "npm_package_dependencies_node_sass": "^4.13.1",
+    "npm_package_dependencies_react": "^16.12.0",
+    "npm_package_dependencies_react_app_polyfill": "^1.0.6",
+    "npm_package_dependencies_react_dom": "^16.12.0",
+    "npm_package_dependencies_react_router_dom": "^5.1.2",
+    "npm_package_dependencies_react_scripts": "3.4.0",
+    "npm_package_dependencies_sass_loader": "^8.0.2",
+    "npm_package_dependencies_wangeditor": "^3.1.1",
+    "npm_package_dependencies__testing_library_jest_dom": "^4.2.4",
+    "npm_package_dependencies__testing_library_react": "^9.3.2",
+    "npm_package_dependencies__testing_library_user_event": "^7.1.2",
+    "npm_package_description": "This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app).",
+    "npm_package_devDependencies_babel_plugin_import": "^1.13.0",
+    "npm_package_devDependencies_customize_cra": "^0.9.1",
+    "npm_package_devDependencies_es6_promise": "^4.2.8",
+    "npm_package_devDependencies_less": "^3.11.1",
+    "npm_package_devDependencies_less_loader": "^5.0.0",
+    "npm_package_devDependencies_mockjs": "^1.0.1-beta3",
+    "npm_package_devDependencies_moment": "^2.24.0",
+    "npm_package_devDependencies_react_app_rewired": "^2.1.5",
+    "npm_package_devDependencies__babel_plugin_proposal_class_properties": "^7.8.3",
+    "npm_package_eslintConfig_extends": "react-app",
+    "npm_package_gitHead": "fc68f6006949a91fced69951778a7c88859cbb6c",
+    "npm_package_homepage": "http://.",
+    "npm_package_name": "my-app",
+    "npm_package_private": "true",
+    "npm_package_readmeFilename": "README.md",
+    "npm_package_scripts_build": "react-app-rewired build",
+    "npm_package_scripts_eject": "react-app-rewired eject",
+    "npm_package_scripts_mock": "mocker ./mock",
+    "npm_package_scripts_page": "node .pjcode/page",
+    "npm_package_scripts_start": "react-app-rewired start",
+    "npm_package_scripts_test": "react-app-rewired test",
+    "npm_package_scripts_view": "node .pjcode/view",
+    "npm_package_version": "0.1.0",
+    "NPM_PREFIX_NPM_CLI_JS": "C:\\Users\\Mr Ke\\AppData\\Roaming\\npm\\node_modules\\npm\\bin\\npm-cli.js",
+    "NUMBER_OF_PROCESSORS": "8",
+    "NVM_HOME": "C:\\Users\\Mr Ke\\AppData\\Roaming\\nvm",
+    "NVM_SYMLINK": "C:\\Program Files\\nodejs",
+    "OneDrive": "C:\\Users\\Mr Ke\\OneDrive",
+    "OS": "Windows_NT",
+    "Path": "C:\\Users\\Mr Ke\\AppData\\Roaming\\nvm\\v12.2.0\\node_modules\\npm\\node_modules\\npm-lifecycle\\node-gyp-bin;E:\\HugeInfo_Code\\oa\\node_modules\\.bin;C:\\ProgramData\\Oracle\\Java\\javapath;D:\\Program Files\\Git\\cmd;C:\\Windows\\System32;C:\\Program Files (x86)\\Common Files\\Thunder Network\\KanKan\\Codecs;C:\\WINDOWS\\system32;C:\\WINDOWS;C:\\WINDOWS\\System32\\Wbem;C:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0\\;C:\\WINDOWS\\System32\\OpenSSH\\;C:\\Program Files\\NVIDIA Corporation\\NVIDIA NvDLISR;\"C:\\Program Files\\Java\\jdk1.8.0_131\\bin;C:\\Program Files\\Java\\jdk1.8.0_131\\jre\\bin\";C:\\Program Files (x86)\\NVIDIA Corporation\\PhysX\\Common;D:\\Program Files\\Yarn\\bin\\;C:\\Program Files\\TortoiseSVN\\bin;C:\\Users\\Mr Ke\\AppData\\Roaming\\nvm;C:\\Program Files\\nodejs;C:\\Users\\Mr Ke\\AppData\\Local\\Programs\\Python\\Python37\\Scripts\\;C:\\Users\\Mr Ke\\AppData\\Local\\Programs\\Python\\Python37\\;C:\\Users\\Mr Ke\\AppData\\Local\\Microsoft\\WindowsApps;D:\\Program Files\\Microsoft VS Code\\bin;C:\\Users\\Mr Ke\\AppData\\Local\\BypassRuntm;C:\\Users\\Mr Ke\\AppData\\Local\\Microsoft\\WindowsApps;C:\\Users\\Mr Ke\\AppData\\Local\\Yarn\\bin;C:\\Users\\Mr Ke\\AppData\\Roaming\\npm;C:\\Users\\Mr Ke\\AppData\\Roaming\\nvm;C:\\Program Files\\nodejs",
+    "PATHEXT": ".COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JSE;.WSF;.WSH;.MSC;.CPL",
+    "PROCESSOR_ARCHITECTURE": "AMD64",
+    "PROCESSOR_IDENTIFIER": "Intel64 Family 6 Model 158 Stepping 10, GenuineIntel",
+    "PROCESSOR_LEVEL": "6",
+    "PROCESSOR_REVISION": "9e0a",
+    "ProgramData": "C:\\ProgramData",
+    "ProgramFiles": "C:\\Program Files",
+    "ProgramFiles(x86)": "C:\\Program Files (x86)",
+    "ProgramW6432": "C:\\Program Files",
+    "PROMPT": "$P$G",
+    "PSModulePath": "C:\\Users\\Mr Ke\\Documents\\WindowsPowerShell\\Modules;C:\\Program Files\\WindowsPowerShell\\Modules;C:\\WINDOWS\\system32\\WindowsPowerShell\\v1.0\\Modules",
+    "PUBLIC": "C:\\Users\\Public",
+    "REACT_APP_CODER": "liuwh",
+    "REACT_APP_EMAIL": "",
+    "SESSIONNAME": "Console",
+    "SystemDrive": "C:",
+    "SystemRoot": "C:\\WINDOWS",
+    "TEMP": "C:\\Users\\MRKE~1\\AppData\\Local\\Temp",
+    "TERM_PROGRAM": "vscode",
+    "TERM_PROGRAM_VERSION": "1.45.0",
+    "TMP": "C:\\Users\\MRKE~1\\AppData\\Local\\Temp",
+    "USERDOMAIN": "LAPTOP-RI7D261L",
+    "USERDOMAIN_ROAMINGPROFILE": "LAPTOP-RI7D261L",
+    "USERNAME": "Mr Ke",
+    "USERPROFILE": "C:\\Users\\Mr Ke",
+    "WEBPACK_DEV_SERVER": "true",
+    "windir": "C:\\WINDOWS"
+  },
+  "sharedObjects": [
+    "C:\\Program Files\\nodejs\\node.exe",
+    "C:\\WINDOWS\\SYSTEM32\\ntdll.dll",
+    "C:\\WINDOWS\\System32\\KERNEL32.DLL",
+    "C:\\WINDOWS\\System32\\KERNELBASE.dll",
+    "C:\\WINDOWS\\System32\\WS2_32.dll",
+    "C:\\WINDOWS\\System32\\RPCRT4.dll",
+    "C:\\WINDOWS\\System32\\ADVAPI32.dll",
+    "C:\\WINDOWS\\System32\\msvcrt.dll",
+    "C:\\WINDOWS\\System32\\sechost.dll",
+    "C:\\WINDOWS\\System32\\USER32.dll",
+    "C:\\WINDOWS\\SYSTEM32\\dbghelp.dll",
+    "C:\\WINDOWS\\System32\\win32u.dll",
+    "C:\\WINDOWS\\System32\\ucrtbase.dll",
+    "C:\\WINDOWS\\System32\\GDI32.dll",
+    "C:\\WINDOWS\\System32\\gdi32full.dll",
+    "C:\\WINDOWS\\System32\\msvcp_win.dll",
+    "C:\\WINDOWS\\System32\\PSAPI.DLL",
+    "C:\\WINDOWS\\System32\\CRYPT32.dll",
+    "C:\\WINDOWS\\SYSTEM32\\IPHLPAPI.DLL",
+    "C:\\WINDOWS\\System32\\MSASN1.dll",
+    "C:\\WINDOWS\\SYSTEM32\\USERENV.dll",
+    "C:\\WINDOWS\\System32\\bcrypt.dll",
+    "C:\\WINDOWS\\System32\\profapi.dll",
+    "C:\\WINDOWS\\SYSTEM32\\WINMM.dll",
+    "C:\\WINDOWS\\SYSTEM32\\winmmbase.dll",
+    "C:\\WINDOWS\\System32\\cfgmgr32.dll",
+    "C:\\WINDOWS\\System32\\bcryptPrimitives.dll",
+    "C:\\WINDOWS\\System32\\IMM32.DLL",
+    "C:\\WINDOWS\\System32\\powrprof.dll",
+    "C:\\WINDOWS\\System32\\UMPDC.dll",
+    "C:\\WINDOWS\\system32\\uxtheme.dll",
+    "C:\\WINDOWS\\System32\\combase.dll",
+    "C:\\WINDOWS\\system32\\mswsock.dll",
+    "C:\\WINDOWS\\System32\\kernel.appcore.dll",
+    "C:\\WINDOWS\\SYSTEM32\\CRYPTBASE.DLL",
+    "C:\\WINDOWS\\System32\\NSI.dll",
+    "C:\\WINDOWS\\SYSTEM32\\dhcpcsvc6.DLL",
+    "C:\\WINDOWS\\SYSTEM32\\dhcpcsvc.DLL",
+    "C:\\WINDOWS\\SYSTEM32\\DNSAPI.dll",
+    "C:\\WINDOWS\\system32\\napinsp.dll",
+    "C:\\WINDOWS\\system32\\pnrpnsp.dll",
+    "C:\\WINDOWS\\System32\\winrnr.dll",
+    "C:\\WINDOWS\\system32\\NLAapi.dll",
+    "C:\\WINDOWS\\system32\\wshbth.dll",
+    "C:\\Windows\\System32\\rasadhlp.dll",
+    "C:\\WINDOWS\\System32\\fwpuclnt.dll",
+    "\\\\?\\E:\\HugeInfo_Code\\oa\\node_modules\\_node-sass@4.13.1@node-sass\\vendor\\win32-x64-72\\binding.node"
+  ]
+}
\ No newline at end of file
diff --git a/src/components/common/HotListTableView/index.scss b/src/components/common/HotListTableView/index.scss
index 5ae29c9..b4cfc2c 100644
--- a/src/components/common/HotListTableView/index.scss
+++ b/src/components/common/HotListTableView/index.scss
@@ -7,7 +7,7 @@
 /** Happy Coding */
 .hot-list-table-view {
   &-main {
-    margin: 24px 0;
+    margin: 14px 0;
     padding-bottom: 24px;
     background: #fff;
     &-content {
diff --git a/src/components/common/NotifyList/index.jsx b/src/components/common/NotifyList/index.jsx
index 1b707bc..7409e23 100644
--- a/src/components/common/NotifyList/index.jsx
+++ b/src/components/common/NotifyList/index.jsx
@@ -6,7 +6,7 @@
 
 /** 通知列表 */
 import React, { ReactNode, ReactEventHandler, Component } from 'react';
-import { Alert } from 'antd';
+import { Alert, Tooltip } from 'antd';
 import fetch from '../../../api/request';
 
 import './index.scss';
@@ -17,7 +17,7 @@
     this.config = {
     };
     this.state = {
-      content: ''
+      notice: null
     };
   }
 
@@ -25,9 +25,10 @@
     fetch({
       url: `api/document/getNewNotice`
     }).then(res => {
-      if( res ) {
+      if (res) {
         this.setState({
-          content: res.documentTitle || ''
+          notice: res
+          // documentTitle: res.documentTitle || ''
         })
       }
     })
@@ -35,25 +36,52 @@
 
   componentDidMount() { }
 
+  emoveTAG = (str) => {
+    return str.replace(/<[^>]+>/g, "");
+  }
+
   onClick = () => {
     this.props.history.push({ pathname: "/index/workbench/announcement" });
   }
 
+  onMouseOut = () => {
+    this.refs.marquee.start();
+  }
+
+  onMouseOver = () => {
+    this.refs.marquee.stop();
+  }
+
+  linkDetail = (id) => {
+    this.props.history.push({ pathname: `/document/detail/${id}` });
+
+  }
+
+
   renderDom = () => {
-    let { content } = this.state;
+    let { notice } = this.state;
     return <div className="notify-list-main-dom">
-      <span className="notify-list-main-dom-msg">最新通知:{content}</span>
-      <span className="notify-list-main-dom-fuc" onClick={this.onClick}>[查看全部]</span>
+      <div className="notify-list-main-dom-msg">最新通知:
+        <div className="notify-list-main-dom-msg-title" onClick={() => { notice.id && this.linkDetail(notice.id) }}>
+          <marquee onMouseOut={this.onMouseOut} onMouseOver={this.onMouseOver} ref='marquee' style={{ cursor: 'pointer' }}>{notice.documentTitle || ''}</marquee>
+        </div>
+        {
+          notice.documentContent ? <Tooltip placement='topLeft' title={this.emoveTAG(notice.documentContent)} arrowPointAtCenter>
+            <div className="notify-list-main-dom-msg-content" onClick={() => { notice.id && this.linkDetail(notice.id) }}>{this.emoveTAG(notice.documentContent)}</div>
+          </Tooltip> : null
+        }
+      </div>
+      <div className="notify-list-main-dom-fuc" onClick={this.onClick}>[查看全部]</div>
     </div>
   }
 
   render() {
-    let { content } = this.state;
+    let { notice } = this.state;
 
     return (
       <div className="notify-list-main">
         {
-          content &&
+          notice &&
           <Alert
             // message="Warning Text Warning Text Warning TextW arning Text Warning Text Warning TextWarning Text"
             message={this.renderDom()}
diff --git a/src/components/common/NotifyList/index.scss b/src/components/common/NotifyList/index.scss
index a8b6d28..72f7cf7 100644
--- a/src/components/common/NotifyList/index.scss
+++ b/src/components/common/NotifyList/index.scss
@@ -7,7 +7,7 @@
 /** Happy Coding */
 .notify-list {
   &-main {
-    margin: 20px 0;
+    margin: 14px 0;
     & .ant-alert-warning {
       background: #fff9e5 !important;
       border: 0 !important;
@@ -16,16 +16,34 @@
       width: 100%;
       display: flex;
       &-msg {
-        width: 55%;
+        width: 70%;
         overflow: hidden;
         text-overflow: ellipsis;
         white-space: nowrap;
         margin-right: 20px;
+        display: flex;
+        align-items: center;
+        &-title{
+          width: 210px;
+          display: flex;
+          align-items: center;
+        }
+        &-content {
+          flex: 1;
+          overflow: hidden;
+          text-overflow: ellipsis;
+          white-space: nowrap;
+          padding: 0 20px;
+          font-size: 12px;
+          display: flex;
+          align-items: center;
+          cursor: pointer;
+        }
       }
       &-fuc {
         font-family: PingFangSC-Medium;
         font-size: 14px;
-        color: #559DE6;
+        color: #559de6;
         line-height: 22px;
         cursor: pointer;
         letter-spacing: 1px;
diff --git a/src/components/common/multiSelect/index.jsx b/src/components/common/multiSelect/index.jsx
new file mode 100644
index 0000000..04291d3
--- /dev/null
+++ b/src/components/common/multiSelect/index.jsx
@@ -0,0 +1,27 @@
+import React from 'react';
+import { Checkbox, Row, Col } from 'antd';
+
+export default class MultiSelect extends React.Component{
+  
+  onChange=checkedValues => {
+    this.props.onChange(checkedValues);
+  }
+  render(){
+    const {all,own}= this.props;
+    return(
+      <div>
+      {all.length==0
+        ?<div style={{fontSize:16}}>暂无数据</div>
+        :<Checkbox.Group style={{ width: '100%' }} defaultValue={own} onChange={this.onChange}>
+        <Row>
+          {all.map(e=>(
+            <Col span={4} key={e.id}><Checkbox value={e.id}>{e.name}</Checkbox></Col>
+          ))}
+        </Row>
+        </Checkbox.Group>
+      }
+      </div>
+    )
+    
+  }
+}
diff --git a/src/components/page/DocumentDetailPage/index.jsx b/src/components/page/DocumentDetailPage/index.jsx
index 24bc71a..184a6dd 100644
--- a/src/components/page/DocumentDetailPage/index.jsx
+++ b/src/components/page/DocumentDetailPage/index.jsx
@@ -58,7 +58,7 @@
           documentType: res.documentType || 'DT00002'
         },
         loading: false,
-        fileList: res.attachmentList && res.attachmentList.map((a) => ({ ...a, key: a.id, uid: a.id, name: a.fileName + '.' + a.suffix, })) || []
+        fileList: res.attachmentList && res.attachmentList.map((a) => ({ ...a, key: a.id, uid: a.id, name: a.fileName + '.' + a.suffix, status: 'done' })) || []
       });
     });
   }
@@ -136,6 +136,14 @@
       header: {
         Authorization: window.localStorage.getItem('token')
       },
+      showUploadList: {
+        showDownloadIcon: true,
+        showRemoveIcon: false,
+        showPreviewIcon: true
+      },
+      onDownload: (file) => {
+        console.log('file', file)
+      },
       onChange: ({ file, fileList }) => {
         fileList = fileList.slice(-2);
         fileList = fileList.map(file => {
@@ -151,7 +159,6 @@
       onPreview: (file) => {
         window.open(file.url);
       },
-      showUploadList: { showPreviewIcon: true, showDownloadIcon: true, showRemoveIcon: false }
     };
 
     return (
diff --git a/src/components/page/basicConfig/UserDetail.jsx b/src/components/page/basicConfig/UserDetail.jsx
new file mode 100644
index 0000000..9ea3b49
--- /dev/null
+++ b/src/components/page/basicConfig/UserDetail.jsx
@@ -0,0 +1,439 @@
+import React from 'react';
+import { Link } from 'react-router-dom';
+import { Card, Row, Col, Icon, Form, Input, Button, Select, Table, DatePicker, message, Breadcrumb, Spin, Layout, Upload, Modal } from 'antd';
+import MultiSelect from '../../common/multiSelect';
+import Fetch from '../fetch';
+import { saveUser, findGroups, findRoles } from "../fetch/api";
+import ChangePswView from '../component/ChangePswView';
+import { domain } from "../fetch/_";
+console.log(domain)
+
+const FormItem = Form.Item;
+const Option = Select.Option;
+
+class UserDetail extends React.Component {
+  constructor(props) {
+    super(props)
+    this.id = props.match.params.id == 'new' ? '' : props.match.params.id;
+    this.flag = props.match.params.flag == 'Modify' ? '修改' : '新增';
+    this.state = {
+      spinning: true,
+      user: {},
+      account: {},
+      groupIds: [], //组
+      roleIds: [], //角色
+
+      previewVisible: false,
+      previewImage: '',
+      fileList: [],
+
+      roleList: [],
+      ownRoles: [],
+      groupList: [],
+      ownGroups: [],
+      changePswVisible: false,
+      btnLoading: false
+    }
+  }
+  componentWillMount() {
+    let _this = this;
+    findGroups().then(res => {
+      _this.setState({
+        groupList: res.data
+      })
+    });
+    findRoles().then(res => {
+      _this.setState({
+        roleList: res.data
+      })
+    })
+  }
+
+  componentDidMount() {
+    let _this = this;
+    if (_this.id !== '') {
+      Fetch.getUserDetail({ id: _this.id })
+        .then(res => {
+          console.log('detail', res)
+          this.setState({
+            dataSet: res,
+            spinning: false,
+            user: res.user,
+            account: res.account,
+            groupIds: res.groupIds,
+            roleIds: res.roleIds,
+            fileList: (res.user.avatar == null || res.user.avatar == '') ? [] : [{
+              uid: '-1',
+              name: 'xxx.png',
+              status: 'done',
+              url: res.user.avatar
+            }]
+          });
+        });
+    }
+    _this.setState({
+      spinning: false
+    })
+  }
+
+  handleCancel = () => this.setState({ previewVisible: false })
+
+  handlePreview = (file) => {
+    this.setState({
+      previewImage: file.url || file.thumbUrl,
+      previewVisible: true,
+    });
+  }
+
+  handleChange = ({ fileList, file }) => {
+    const { user } = this.state;
+    this.setState({
+      fileList,
+    })
+    if (file.status == 'done') {
+      this.setState({
+        user: {
+          ...user,
+          avatar: file.response.data
+        }
+      })
+    }
+  }
+
+  handleRemove = ({ fileList }) => {
+    const { user } = this.state;
+    this.setState({
+      user: {
+        ...user,
+        avatar: ''
+      },
+      fileList: []
+    })
+  }
+
+  roleChange = checkedValues => {
+    this.setState({ roleIds: checkedValues })
+  }
+  groupChange = checkedValues => {
+    this.setState({ groupIds: checkedValues })
+  }
+
+  onOK = (data) => {
+    console.log('data', data);
+    let _this = this;
+    const { getFieldValue } = _this.props.form;
+    let formData = {
+      accountId: _this.state.account.id,
+      newPassword: data.newPassWord
+    }
+    _this.setState({
+      btnLoading: true
+    })
+    Fetch.getChangePsw(formData).then(res => {
+      console.log('res', res);
+      if (res.code == 0) {
+        message.success("密码修改成功", 2);
+      } else {
+        message.error(res.message, 2);
+      }
+      _this.setState({
+        btnLoading: false,
+        changePswVisible: false
+      })
+    })
+  }
+
+  handleSubmit = (e) => { // 提交表单数据
+    e.preventDefault();
+    let _this = this;
+    _this.props.form.validateFields((err, values) => {
+      if (err) return;
+      _this.setState({ spinning: true });
+      (values.sex == "1" || values.sex == "男") ? values.sex = 1 : values.sex = 2;
+      saveUser({
+        account: {
+          ..._this.state.account,
+          id: _this.state.account.id || '',
+          account: values.account,
+          credential: values.credential,
+        },
+        user: {
+          ..._this.state.user,
+          id: _this.state.user.id,
+          trueName: values.trueName,
+          sex: values.sex,
+          idcard: values.idcard,
+          mobile: values.mobile,
+          email: values.email,
+        },
+        roleIds: _this.state.roleIds,
+        groupIds: _this.state.groupIds
+      }).then(res => {
+        if (res.code === 0) {
+          message.success("保存用户成功", 2, () => {
+            _this.setState({ spinning: false });
+            _this.props.history.push("/baseManage/user")
+          });
+        } else {
+          message.error(res.msg, 2);
+        }
+      })
+    })
+  }
+
+  isMobile = (rule, value, callback) => {
+    const regMobile = /^0?1[3|4|5|8][0-9]\d{8}$/
+    if (!regMobile.test(value)) {
+      if (value == "") {
+        callback();
+        return;
+      } else {
+        callback('手机号码格式不正确');
+        return;
+      }
+    }
+    callback()
+  }
+
+  isIdCard = (rule, value, callback) => {
+
+    const regMobile = /^[1-9]\d{7}((0[1-9])|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$|^[1-9]\d{5}[1-9]\d{3}((0[1-9])|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/;
+    if (!regMobile.test(value)) {
+      if (value == "") {
+        callback();
+        return;
+      } else {
+        callback('身份证号码格式不正确');
+        return;
+      }
+    }
+    callback()
+  }
+
+  render() {
+    const { getFieldDecorator } = this.props.form;
+    const formItemLayout = {
+      labelCol: { xs: { span: 24 }, sm: { span: 10 }, },
+      wrapperCol: { xs: { span: 24 }, sm: { span: 14 }, },
+    };
+    const { user, account, groupIds, roleIds, previewVisible, previewImage, fileList, roleList, groupList, changePswVisible, btnLoading } = this.state;
+    const uploadButton = (
+      <div>
+        <Icon type="plus" />
+        <div className="ant-upload-text">上传头像</div>
+      </div>
+    );
+    return (
+      <Layout className="h-100 page-table">
+        <Breadcrumb className="breadcrumb-style">
+          <Breadcrumb.Item>基础管理</Breadcrumb.Item>
+          <Breadcrumb.Item>用户管理</Breadcrumb.Item>
+          <Breadcrumb.Item>{this.flag}</Breadcrumb.Item>
+        </Breadcrumb>
+        <Spin spinning={this.state.spinning}>
+          <Modal visible={previewVisible} footer={null} onCancel={this.handleCancel}>
+            <img alt="example" style={{ width: '100%' }} src={previewImage} />
+          </Modal>
+          <div style={{ margin: 20 }}>
+            <Form onSubmit={this.handleSubmit}>
+              <div className="border-bottom card-title">
+                <Row style={{ borderStyle: 'solid', borderWidth: 0.01, display: 'flex' }} className="flexbox" align="middle">
+                  <span style={{ fontSize: 16, fontWeight: 650 }} className="flex1 vertical-middle">账号信息</span>
+                  <div style={{ float: 'right' }}>
+                    {/* <Link to="/baseManage/user"><Button type="default">返回</Button></Link>
+                     */}
+                    <Button type="default" onClick={() => {
+                      this.props.history.goBack();
+                    }}>返回</Button>
+                    <Button htmlType="submit" type="primary">确认</Button>
+                  </div>
+                </Row>
+              </div>
+              <Card>
+                <Row>
+                  <Col span={16}>
+                    {
+                      this.flag == '修改' ?
+                        <Row>
+                          <Col span={12}>
+                            <FormItem label={"账号"} {...formItemLayout}>
+                              {/* <Input placeholder="请输入账号" value={account.account || ''} disabled /> */}
+                              {account.account || ''}
+                            </FormItem>
+                          </Col>
+                          <Col span={12}>
+                            <FormItem label={"密码"} {...formItemLayout}>
+                              {/* <Input placeholder="请输入密码" disabled={true} type="password" value={account.credential || ''} disabled /> */}
+                              {/* {account.credential || ''} */}
+                              {'********'}
+                            </FormItem>
+                          </Col>
+                        </Row>
+                        :
+                        <Row>
+                          <Col span={12}>
+                            <FormItem label={"账号"} {...formItemLayout}>
+                              {getFieldDecorator('account', {
+                                rules: [{ required: true, message: '账号必填' }],
+                                initialValue: account.account || ''
+                              })(
+                                <Input placeholder="请输入账号" />
+                              )}</FormItem>
+                          </Col>
+                          <Col span={12}>
+                            <FormItem label={"密码"} {...formItemLayout} hasFeedback>
+                              {getFieldDecorator('credential', {
+                                rules: [{ required: true, message: '密码必填' }],
+                                initialValue: account.credential || ''
+                              })(
+                                <Input.Password placeholder="请输入密码" type="password" />
+                              )}</FormItem>
+                          </Col>
+                        </Row>
+                    }
+                  </Col>
+                  {
+                    this.flag == '修改' &&
+                    <Col span={8}>
+                      <div style={{ marginLeft: '20%' }}>
+                        <Button type="primary" onClick={() => {
+                          this.setState({
+                            changePswVisible: true
+                          })
+                        }}>修改密码</Button>
+                      </div>
+                    </Col>
+                  }
+                </Row>
+              </Card>
+              <div className="border-bottom card-title">
+                <Row style={{ borderStyle: 'solid', borderWidth: 0.01, display: 'flex' }} className="flexbox" align="middle">
+                  <span style={{ fontSize: 16, fontWeight: 650 }} className="flex1 vertical-middle">基础信息</span>
+                </Row>
+              </div>
+              <Card>
+                <Row>
+                  <Col span={16}>
+                    <Row>
+                      <Col span={12}>
+                        <FormItem label={"姓名"} {...formItemLayout}>
+                          {getFieldDecorator('trueName', {
+                            rules: [{ required: true, message: '姓名必填' }],
+                            initialValue: user.trueName || ''
+                          })(
+                            <Input placeholder="请输入姓名" />
+                          )}</FormItem>
+                      </Col>
+                      <Col span={12}>
+                        <FormItem label={"性别"} {...formItemLayout}>
+                          {getFieldDecorator('sex', {
+                            rules: [{ required: true, message: '微信用户名称必填' }],
+                            initialValue: user.sex || undefined
+                          })(
+                            // <Input placeholder="请输入" />
+                            <Select>
+                              <Option value="">请选择</Option>
+                              <Option value={1}>男</Option>
+                              <Option value={2}>女</Option>
+                            </Select>
+                          )}</FormItem>
+                      </Col>
+                    </Row>
+                    <Row>
+                      <Col span={12}>
+                        <FormItem label={"手机号码"} {...formItemLayout}>
+                          {getFieldDecorator('mobile', {
+                            rules: [{
+                              required: true, message: '手机号码必填'
+                            }, {
+                              validator: this.isMobile
+                            }],
+                            initialValue: user.mobile || ''
+                          })(
+                            <Input placeholder="请输入手机号码" />
+                          )}</FormItem>
+                      </Col>
+                      <Col span={12}>
+                        <FormItem label={"电子邮箱"} {...formItemLayout}>
+                          {getFieldDecorator('email', {
+                            rules: [{
+                              type: 'email', message: '电子邮箱格式不正确',
+                            }],
+                            initialValue: user.email || ''
+                          })(
+                            <Input placeholder="请输入电子邮箱" />
+                          )}</FormItem>
+                      </Col>
+                    </Row>
+                    <Row>
+                      <Col span={12}>
+                        <FormItem label={"身份证号码"} {...formItemLayout}>
+                          {getFieldDecorator('idcard', {
+                            rules: [{
+                              required: true, message: '身份证号码必填'
+                            }, {
+                              validator: this.isIdCard
+                            }],
+                            initialValue: user.idcard || ''
+                          })(
+                            <Input placeholder="请输入身份证号码" />
+                          )}</FormItem>
+                      </Col>
+                    </Row>
+                  </Col>
+                  <Col span={8}>
+                    <div style={{ marginLeft: '20%' }}>
+                      <Upload
+                        action={domain + `api/user/uploadAvatar`}
+                        listType="picture-card"
+                        fileList={fileList}
+                        onPreview={this.handlePreview}
+                        onChange={this.handleChange}
+                        onRemove={this.handleRemove}
+                      >
+                        {fileList.length > 0 ? null : uploadButton}
+                      </Upload>
+                      {/* <img style={{height:200,width:200}} src={user.avatar || 'https://ss0.bdstatic.com/94oJfD_bAAcT8t7mm9GUKT-xh_/timg?image&quality=100&size=b4000_4000&sec=1539672841&di=042d8481194441c486945d99dfe79495&src=http://www.qqwangming.org/uploads/71f459727f5055a0/8.jpg'} alt=""/> */}
+                    </div>
+                  </Col>
+                </Row>
+              </Card>
+            </Form>
+            <div className="border-bottom card-title">
+              <Row style={{ borderStyle: 'solid', borderWidth: 0.01, display: 'flex' }} className="flexbox" align="middle">
+                <span style={{ fontSize: 16, fontWeight: 650 }} className="flex1">拥有角色</span>
+                <Link to={{ pathname: "/organizationMgt/roleDetail/new/Add", state: { id: 'new' } }}>
+                  <span style={{ float: 'right', fontSize: 10, fontColor: 'blue' }}>没有角色?点击新建</span>
+                </Link>
+              </Row>
+            </div>
+            <Card>
+              <Row>
+                <MultiSelect key={roleIds ? roleIds.toString() : 'init'} all={roleList} own={roleIds} onChange={this.roleChange} />
+              </Row>
+            </Card>
+            <div className="border-bottom card-title">
+              <Row style={{ borderStyle: 'solid', borderWidth: 0.01, display: 'flex' }} className="flexbox" align="middle">
+                <span style={{ fontSize: 16, fontWeight: 650 }} className="flex1">拥有组</span>
+                <Link to={{ pathname: "/baseManage/groupDetail/new/Add", state: { id: '' } }}>
+                  <span style={{ float: 'right', fontSize: 10, fontColor: 'blue' }}>没有组?点击新建</span>
+                </Link>
+              </Row>
+            </div>
+            <Card>
+              <Row>
+                <MultiSelect key={groupIds ? groupIds.toString() : 'init'} all={groupList} own={groupIds} onChange={this.groupChange} />
+              </Row>
+            </Card>
+          </div>
+        </Spin>
+        {
+          changePswVisible && <ChangePswView onCancel={() => { this.setState({ changePswVisible: false }) }} onOK={this.onOK} btnLoading={btnLoading} />
+        }
+      </Layout>
+    )
+  }
+}
+
+const UserDetailForm = Form.create()(UserDetail);
+export default UserDetailForm;
\ No newline at end of file
diff --git a/src/components/page/basicConfig/UserManage.jsx b/src/components/page/basicConfig/UserManage.jsx
new file mode 100644
index 0000000..4e5a7c5
--- /dev/null
+++ b/src/components/page/basicConfig/UserManage.jsx
@@ -0,0 +1,147 @@
+import React from 'react';
+import { Link } from 'react-router-dom';
+import { Card, Row, Col, Icon, Form, Input, Button, Select, Table, DatePicker, message, Breadcrumb, Layout, Modal, Pagination, Divider } from 'antd';
+import TableView from '../../common/TableView';
+import SearchFormView from '../../common/SearchFormView';
+import moment from 'moment';
+import fetch from '../../../api/request';
+
+const FormItem = Form.Item;
+const Option = Select.Option;
+const confirm = Modal.confirm;
+
+
+class UserManage extends React.Component {
+  constructor(props) {
+    super(props);
+    this.state = {
+      formData: {
+        __key: Date.now(),
+        type: '',
+        title: '',
+        page: 1,
+        size: 10,
+      },
+    };
+  }
+
+  componentDidMount() { }
+
+  setFormData = data => {
+    console.log('form', data);
+    this.setState({
+      formData: data,
+    });
+  }
+
+  render() {
+    const { formData } = this.state;
+    let tableParams = {
+      url: `api/user/query`,
+      formData,
+      key: formData.__key,
+      columns: this.renderColumns(),
+      extraFromData: {
+        type: 'DT00002',
+      },
+      setFormData: this.setFormData
+    }
+
+    return (
+      <div className="usermanage-main margin padding bg-white">
+        <SearchFormView
+          formData={formData}
+          setFormData={this.setFormData}
+          data={[
+            { type: 'input', name: '姓名', label: '姓名', key: 'trueName' },
+            { type: 'input', name: '身份证号码', label: '身份证号码', key: 'idcard' },
+            { type: 'input', name: '手机号码', label: '手机号码', key: 'mobile' },
+            { type: 'input', name: '电子邮箱', label: '电子邮箱', key: 'email' },
+          ]} />
+        <Row type="flex" gutter={20} className="margin-bottom"> 
+          <Col>
+            <Button type="primary">同步微信用户</Button>
+          </Col>
+          <Col>
+            <Button type="primary">新增用户</Button>
+          </Col>
+        </Row>
+        <TableView {...tableParams} />
+      </div>
+    )
+  }
+
+  // 新增用户
+  add = () => {
+    this.props.history.push('/baseManage/userDetail/new/Add')
+  }
+  // 删除用户
+  onDel = (_text, _record) => {
+    // Fetch.userDel({ ids: _text.id }).then(res => {
+    //   if (res.code == 0) {
+    //     message.warning('正在更新列表');
+    //     this.loadData(1, this.state.pageSize);
+    //   }
+    // }, err => {
+    //   message.error(err);
+    // });
+  }
+
+  renderColumns = () => {
+    let obj = this;
+    return [
+      { title: '头像', className: "txt-c", dataIndex: 'avatar', key: 'avatar', render: (text, record) => text ? <img style={{ height: 23, width: 25 }} src={text} /> : <Icon type="user-delete" style={{ fontSize: 20 }} /> },
+      { title: '姓名', className: "txt-c", dataIndex: 'trueName', key: 'trueName' },
+      { title: '身份证', className: "txt-c", dataIndex: 'idcard', key: 'idcard' },
+      { title: '邮箱', className: "txt-c", dataIndex: 'email', key: 'email' },
+      { title: '手机号码', className: "txt-c", dataIndex: 'mobile', key: 'mobile' },
+      { title: '创建时间', className: "txt-c", dataIndex: 'createTime', key: 'createTime', render: (text, record) => text !== "" && text != null ? moment(text).format("YYYY-MM-DD HH:mm") : "" },
+      {
+        title: '操作', className: "txt-c", key: 'operation', render: (text, record) => {
+          return <div>
+            <Link to={{ pathname: "/baseManage/userDetail/" + record.id + '/Modify', query: { id: record.id } }}>修改</Link>
+            <Divider type="vertical" />
+            <a href="javascript:void(0);" onClick={() => this.delete(record.id)}>删除</a>
+          </div>
+        }
+      }
+    ]
+  }
+  delete = (id) => {
+    let _this = this;
+    confirm({
+      title: <span style={{ fontSize: 19 }}>确定要删除该用户吗?</span>,
+      onOk() {
+        // Fetch.userDel({ ids: id }).then(res => {
+        //   if (res.code == 0) {
+        //     message.success("删除成功")
+        //     _this.loadData(1, _this.state.pageSize);
+        //   }
+        // }, err => {
+        //   message.error(err);
+        // });
+      },
+      onCancel() { },
+    });
+  }
+  userSync = () => {
+    let _this = this;
+    this.setState({ loading: true })
+    // syncCpUser().then(res => {
+    //   if (res.code == 0) {
+    //     _this.loadData(1, this.state.pageSize)
+    //     _this.setState({
+    //       loading: false
+    //     });
+    //     message.success("同步成功!");
+    //   } else {
+    //     message.error("操作失败,请联系管理员");
+    //     this.setState({ spinning: false })
+    //   }
+    // })
+  }
+
+}
+
+const UserManageList = Form.create()(UserManage);
+export default UserManageList;
\ No newline at end of file
diff --git a/src/index.css b/src/index.css
index ee83cf1..21dc559 100644
--- a/src/index.css
+++ b/src/index.css
@@ -30,6 +30,28 @@
 .ant-layout-content {
   overflow: auto;
 }
+.ant-table-middle > .ant-table-content > .ant-table-header > table > .ant-table-thead > tr > th, .ant-table-middle > .ant-table-content > .ant-table-body > table > .ant-table-thead > tr > th, .ant-table-middle > .ant-table-content > .ant-table-scroll > .ant-table-header > table > .ant-table-thead > tr > th, .ant-table-middle > .ant-table-content > .ant-table-scroll > .ant-table-body > table > .ant-table-thead > tr > th, .ant-table-middle > .ant-table-content > .ant-table-fixed-left > .ant-table-header > table > .ant-table-thead > tr > th, .ant-table-middle > .ant-table-content > .ant-table-fixed-right > .ant-table-header > table > .ant-table-thead > tr > th, .ant-table-middle > .ant-table-content > .ant-table-fixed-left > .ant-table-body-outer > .ant-table-body-inner > table > .ant-table-thead > tr > th, .ant-table-middle > .ant-table-content > .ant-table-fixed-right > .ant-table-body-outer > .ant-table-body-inner > table > .ant-table-thead > tr > th, .ant-table-middle > .ant-table-content > .ant-table-header > table > .ant-table-tbody > tr > td, .ant-table-middle > .ant-table-content > .ant-table-body > table > .ant-table-tbody > tr > td, .ant-table-middle > .ant-table-content > .ant-table-scroll > .ant-table-header > table > .ant-table-tbody > tr > td, .ant-table-middle > .ant-table-content > .ant-table-scroll > .ant-table-body > table > .ant-table-tbody > tr > td, .ant-table-middle > .ant-table-content > .ant-table-fixed-left > .ant-table-header > table > .ant-table-tbody > tr > td, .ant-table-middle > .ant-table-content > .ant-table-fixed-right > .ant-table-header > table > .ant-table-tbody > tr > td, .ant-table-middle > .ant-table-content > .ant-table-fixed-left > .ant-table-body-outer > .ant-table-body-inner > table > .ant-table-tbody > tr > td, .ant-table-middle > .ant-table-content > .ant-table-fixed-right > .ant-table-body-outer > .ant-table-body-inner > table > .ant-table-tbody > tr > td{
+  padding: 9px 8px !important;
+}
 
+.margin {
+  margin: 20px;
+}
+
+.padding{
+  padding: 20px;
+}
+
+.bg-white{
+  background: #fff;
+}
+
+.ant-divider-horizontal{
+  margin: 20px 0 !important;
+}
+
+.margin-bottom{
+  margin-bottom: 20px;
+}
 
 
diff --git a/src/index.js b/src/index.js
index e9f3628..ffa772b 100644
--- a/src/index.js
+++ b/src/index.js
@@ -20,16 +20,19 @@
 // 引进页面(pages)
 import Index from './pages/Index';
 import Login from './pages/login/login';
-import Workbench from './pages/index/workbench';//首页--工作台
-import System from './pages/index/System';//首页--工作制度
-import Announcement from './pages/index/Announcement';//全部通知
+import Workbench from './pages/index/workbench'; //首页--工作台
+import System from './pages/index/System'; //首页--工作制度
+import Announcement from './pages/index/Announcement'; //全部通知
 
-import DocumentEdit from './pages/document/DocumentEdit';//新建文档
-import DocumentDetail from './pages/document/DocumentDetail';//文档详情
-import BrowseLog from './pages/logManage/browseLog';//浏览日志
-import OperLog from './pages/logManage/operLog';//操作日志
-import Rawler from './pages/logManage/Rawler';//爬虫词条管理
-import Information from './pages/personal/information';//个人信息
+import DocumentEdit from './pages/document/DocumentEdit'; //新建文档
+import DocumentDetail from './pages/document/DocumentDetail'; //文档详情
+import BrowseLog from './pages/logManage/browseLog'; //浏览日志
+import OperLog from './pages/logManage/operLog'; //操作日志
+import Rawler from './pages/logManage/Rawler'; //爬虫词条管理
+import Information from './pages/personal/information'; //个人信息
+
+// 基础平台
+import UserManage from './components/page/basicConfig/UserManage';//用户管理
 
 const { Content } = Layout;
 const history = createHashHistory();
@@ -49,13 +52,19 @@
           </Switch>
           <Content>
             <Switch>
+              {/* 基础平台 */}
+              <Route path="/baseManage/user" component={UserManage} />
+
               {/* 新建文档 */}
               <Route path="/document/create/:id?" component={DocumentEdit} />
               {/* 文档、通知详情 */}
               <Route path="/document/detail/:id" component={DocumentDetail} />
 
               {/* 全部通知 */}
-              <Route path="/index/workbench/announcement" component={Announcement} />
+              <Route
+                path="/index/workbench/announcement"
+                component={Announcement}
+              />
               {/* 规章制度 */}
               <Route path="/index/rules" component={System} />
               {/* 首页 */}
@@ -73,6 +82,7 @@
               {/* 登录页 */}
               <Route path="/login" component={Login} />
               <Route path="/" component={Workbench} />
+
               {/* 路由的页面重定向 */}
               <Redirect to="/" component={Workbench} />
             </Switch>

--
Gitblit v1.8.0