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