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