Commit c52300a7 authored by wangchunxiang's avatar wangchunxiang

Initial commit

parents
Pipeline #2076 canceled with stages
File added
{
"plugins": [
["import", {
"libraryName": "antd",
"style": true
}]
]
}
# http://editorconfig.org
root = true
[*]
indent_style = space
indent_size = 2
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
[*.md]
trim_trailing_whitespace = false
APP_HOST_URL='http://testonlinenightclub.srccwl.com/api'
env=dev
APP_HOST_URL='https://m-b.ahgcloud.com'
AMS_API_URL_01='https://m-b.ahgcloud.com'
AMS_API_URL_02='https://m-b.ahgcloud.com'
env=prod
# 忽略目录
build/
tests/
demo/
# node 覆盖率文件
coverage/
# 忽略文件
**/*-min.js
**/*.min.js
{
"root": true,
"parser": "babel-eslint",
"parserOptions": {
"ecmaVersion": 6,
"ecmaFeatures": {
"jsx": true,
"experimentalObjectRestSpread": true
}
},
"env": {
"browser": true,
"mocha": true
},
"plugins": ["react", "babel"],
"rules": {
"react/prefer-stateless-function": 0,
"no-console": 0,
"no-use-before-define": 0,
"jsx-a11y/label-has-for": 0,
"jsx-a11y/no-static-element-interactions": 0,
"jsx-a11y/anchor-has-content": 0,
"jsx-a11y/click-events-have-key-events": 0,
"jsx-a11y/anchor-is-valid": 0,
"react/no-array-index-key": 0,
"func-names": 0,
"arrow-body-style": 0,
"react/sort-comp": 0,
"react/prop-types": 0,
"react/jsx-first-prop-new-line": 0,
"react/jsx-filename-extension": [
1,
{
"extensions": [".js", ".jsx"]
}
],
"import/extensions": 0,
"import/no-unresolved": 0,
"import/no-extraneous-dependencies": 0,
"prefer-destructuring": 0,
"no-param-reassign": 0,
"no-return-assign": 0,
"max-len": 0,
"consistent-return": 0,
"no-redeclare": 0,
"react/require-extension": 0,
"react/no-danger": 0,
"function-paren-newline": 0,
"object-curly-newline": 0,
"no-restricted-globals": 0,
"global-require": 0
}
}
node_modules/
.env
\ No newline at end of file
<component name="InspectionProjectProfileManager">
<profile version="1.0">
<option name="myName" value="Project Default" />
<inspection_tool class="Eslint" enabled="true" level="ERROR" enabled_by_default="true" />
</profile>
</component>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<module type="WEB_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$" />
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="JavaScriptSettings">
<option name="languageLevel" value="JSX" />
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/manager.ahg.aimhighsdk.com.iml" filepath="$PROJECT_DIR$/.idea/manager.ahg.aimhighsdk.com.iml" />
</modules>
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ChangeListManager">
<list default="true" id="bd823e3c-e3bc-43cc-ba9d-87924f37cdb4" name="Default" comment="">
<change beforePath="$PROJECT_DIR$/.env.dev" beforeDir="false" afterPath="$PROJECT_DIR$/.env.dev" afterDir="false" />
</list>
<option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
<option name="TRACKING_ENABLED" value="true" />
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
<option name="LAST_RESOLUTION" value="IGNORE" />
</component>
<component name="FileEditorManager">
<leaf SIDE_TABS_SIZE_LIMIT_KEY="300">
<file leaf-file-name=".env.dev" pinned="false" current-in-tab="true">
<entry file="file://$PROJECT_DIR$/.env.dev">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="104">
<caret line="4" lean-forward="true" selection-start-line="4" selection-end-line="4" />
</state>
</provider>
</entry>
</file>
<file leaf-file-name=".env" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/.env">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="32">
<caret line="2" column="56" selection-start-line="2" selection-start-column="56" selection-end-line="2" selection-end-column="56" />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="index.html" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/public/index.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="176">
<caret line="11" column="7" selection-start-line="11" selection-start-column="7" selection-end-line="11" selection-end-column="7" />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="index.js" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/node_modules/dotenv-webpack/dist/index.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="2416">
<caret line="151" column="39" selection-start-line="151" selection-start-column="39" selection-end-line="151" selection-end-column="39" />
</state>
</provider>
</entry>
</file>
<file leaf-file-name=".gitignore" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/.gitignore">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="16">
<caret line="1" column="4" selection-start-line="1" selection-start-column="4" selection-end-line="1" selection-end-column="4" />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="package.json" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/package.json">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="1024">
<caret line="64" column="28" lean-forward="true" selection-start-line="64" selection-start-column="28" selection-end-line="64" selection-end-column="28" />
</state>
</provider>
</entry>
</file>
</leaf>
</component>
<component name="FindInProjectRecents">
<findStrings>
<find>env.</find>
<find>env.dev</find>
</findStrings>
</component>
<component name="Git.Settings">
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
</component>
<component name="IdeDocumentHistory">
<option name="CHANGED_PATHS">
<list>
<option value="$PROJECT_DIR$/.env" />
<option value="$PROJECT_DIR$/.gitignore" />
<option value="$PROJECT_DIR$/.env.dev" />
</list>
</option>
</component>
<component name="JsBuildToolGruntFileManager" detection-done="true" sorting="DEFINITION_ORDER" />
<component name="JsBuildToolPackageJson" detection-done="true" sorting="DEFINITION_ORDER">
<package-json value="$PROJECT_DIR$/package.json" />
</component>
<component name="JsGulpfileManager">
<detection-done>true</detection-done>
<sorting>DEFINITION_ORDER</sorting>
</component>
<component name="NodeModulesDirectoryManager">
<handled-path value="$PROJECT_DIR$/node_modules" />
</component>
<component name="ProjectFrameBounds" extendedState="6">
<option name="x" value="12" />
<option name="y" value="17" />
<option name="width" value="1940" />
<option name="height" value="1056" />
</component>
<component name="ProjectView">
<navigator proportions="" version="1">
<foldersAlwaysOnTop value="true" />
</navigator>
<panes>
<pane id="ProjectPane">
<subPane>
<expand>
<path>
<item name="manager.ahg.aimhighsdk.com" type="b2602c69:ProjectViewProjectNode" />
<item name="manager.ahg.aimhighsdk.com" type="2a2b976b:PhpTreeStructureProvider$1" />
</path>
</expand>
<select />
</subPane>
</pane>
<pane id="Scope" />
</panes>
</component>
<component name="PropertiesComponent">
<property name="WebServerToolWindowFactoryState" value="false" />
<property name="node.js.detected.package.eslint" value="true" />
<property name="node.js.path.for.package.eslint" value="project" />
<property name="node.js.selected.package.eslint" value="D:\soft\phpstudy_pro\WWW\manager.ahg.aimhighsdk.com\node_modules\eslint" />
<property name="nodejs_interpreter_path.stuck_in_default_project" value="undefined stuck path" />
<property name="nodejs_npm_path_reset_for_default_project" value="true" />
<property name="nodejs_package_manager_path" value="npm" />
</component>
<component name="RecentsManager">
<key name="CopyFile.RECENT_KEYS">
<recent name="D:\soft\phpstudy_pro\WWW\manager.ahg.aimhighsdk.com" />
</key>
</component>
<component name="RunDashboard">
<option name="ruleStates">
<list>
<RuleState>
<option name="name" value="ConfigurationTypeDashboardGroupingRule" />
</RuleState>
<RuleState>
<option name="name" value="StatusDashboardGroupingRule" />
</RuleState>
</list>
</option>
</component>
<component name="SvnConfiguration">
<configuration />
</component>
<component name="TaskManager">
<task active="true" id="Default" summary="Default task">
<changelist id="bd823e3c-e3bc-43cc-ba9d-87924f37cdb4" name="Default" comment="" />
<created>1594891609174</created>
<option name="number" value="Default" />
<option name="presentableId" value="Default" />
<updated>1594891609174</updated>
<workItem from="1594891610389" duration="1341000" />
<workItem from="1594950243717" duration="108000" />
<workItem from="1594977976633" duration="131000" />
<workItem from="1595295233517" duration="1021000" />
<workItem from="1595388463906" duration="386000" />
</task>
<servers />
</component>
<component name="TimeTrackingManager">
<option name="totallyTimeSpent" value="3610000" />
</component>
<component name="ToolWindowManager">
<frame x="-8" y="-8" width="1936" height="1056" extended-state="6" />
<editor active="true" />
<layout>
<window_info anchor="bottom" id="TODO" order="6" />
<window_info anchor="bottom" id="Event Log" order="7" side_tool="true" />
<window_info anchor="bottom" id="Database Changes" order="7" show_stripe_button="false" />
<window_info anchor="bottom" id="Version Control" order="7" />
<window_info id="npm" order="2" side_tool="true" />
<window_info anchor="bottom" id="Run" order="2" />
<window_info anchor="bottom" id="Terminal" order="7" />
<window_info active="true" content_ui="combo" id="Project" order="0" visible="true" weight="0.12864584" />
<window_info anchor="bottom" id="Docker" order="7" show_stripe_button="false" />
<window_info anchor="right" id="Database" order="3" />
<window_info anchor="bottom" id="Find" order="1" />
<window_info id="Structure" order="1" side_tool="true" weight="0.25" />
<window_info id="Favorites" order="2" side_tool="true" />
<window_info anchor="bottom" id="Debug" order="3" weight="0.4" />
<window_info anchor="right" content_ui="combo" id="Hierarchy" order="2" weight="0.25" />
<window_info anchor="bottom" id="Inspection" order="5" weight="0.4" />
<window_info anchor="right" id="Commander" internal_type="SLIDING" order="0" type="SLIDING" weight="0.4" />
<window_info anchor="right" id="Ant Build" order="1" weight="0.25" />
<window_info anchor="bottom" id="Message" order="0" />
<window_info anchor="bottom" id="Cvs" order="4" weight="0.25" />
</layout>
</component>
<component name="TypeScriptGeneratedFilesManager">
<option name="version" value="1" />
</component>
<component name="VcsContentAnnotationSettings">
<option name="myLimit" value="2678400000" />
</component>
<component name="editorHistoryManager">
<entry file="file://$PROJECT_DIR$/.env.dev">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="64">
<caret line="4" selection-start-line="4" selection-end-line="4" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/.env">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="32">
<caret line="2" column="56" selection-start-line="2" selection-start-column="56" selection-end-line="2" selection-end-column="56" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/public/index.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="176">
<caret line="11" column="7" lean-forward="true" selection-start-line="11" selection-start-column="7" selection-end-line="11" selection-end-column="7" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/node_modules/dotenv-webpack/dist/index.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="2416">
<caret line="151" column="39" selection-start-line="151" selection-start-column="39" selection-end-line="151" selection-end-column="39" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/.gitignore">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="16">
<caret line="1" column="4" selection-start-line="1" selection-start-column="4" selection-end-line="1" selection-end-column="4" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/package.json">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="1024">
<caret line="64" column="28" lean-forward="true" selection-start-line="64" selection-start-column="28" selection-end-line="64" selection-end-column="28" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/.env.dev">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="64">
<caret line="4" lean-forward="true" selection-start-line="4" selection-end-line="4" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/public/index.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="176">
<caret line="11" column="7" selection-start-line="11" selection-start-column="7" selection-end-line="11" selection-end-column="7" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/node_modules/dotenv-webpack/dist/index.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="2416">
<caret line="151" column="39" selection-start-line="151" selection-start-column="39" selection-end-line="151" selection-end-column="39" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/.gitignore">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="16">
<caret line="1" column="4" selection-start-line="1" selection-start-column="4" selection-end-line="1" selection-end-column="4" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/package.json">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="1136">
<caret line="71" column="27" selection-start-line="71" selection-start-column="16" selection-end-line="71" selection-end-column="27" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/.env">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="32">
<caret line="2" column="56" lean-forward="true" selection-start-line="2" selection-start-column="56" selection-end-line="2" selection-end-column="56" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/.env.dev">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="16">
<caret line="1" column="40" lean-forward="true" selection-start-line="1" selection-start-column="40" selection-end-line="1" selection-end-column="40" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/.env">
<provider selected="true" editor-type-id="text-editor">
<state>
<caret selection-end-line="3" selection-end-column="4" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/public/index.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="176">
<caret line="11" column="7" selection-start-line="11" selection-start-column="7" selection-end-line="11" selection-end-column="7" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/node_modules/dotenv-webpack/dist/index.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="2416">
<caret line="151" column="39" selection-start-line="151" selection-start-column="39" selection-end-line="151" selection-end-column="39" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/.gitignore">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="16">
<caret line="1" column="4" selection-start-line="1" selection-start-column="4" selection-end-line="1" selection-end-column="4" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/package.json">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="1136">
<caret line="71" column="27" selection-start-line="71" selection-start-column="16" selection-end-line="71" selection-end-column="27" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/.env.dev">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="64">
<caret line="4" selection-start-line="4" selection-end-line="4" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/.env">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="64">
<caret line="4" selection-start-line="4" selection-end-line="4" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/node_modules/dotenv-webpack/dist/index.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="2416">
<caret line="151" column="39" selection-start-line="151" selection-start-column="39" selection-end-line="151" selection-end-column="39" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/.gitignore">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="16">
<caret line="1" column="4" selection-start-line="1" selection-start-column="4" selection-end-line="1" selection-end-column="4" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/package.json">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="1136">
<caret line="71" column="27" selection-start-line="71" selection-start-column="16" selection-end-line="71" selection-end-column="27" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/public/index.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="176">
<caret line="11" column="7" selection-start-line="11" selection-start-column="7" selection-end-line="11" selection-end-column="7" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/.env.dev">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="64">
<caret line="4" selection-start-line="4" selection-end-line="4" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/.env">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="64">
<caret line="4" selection-start-line="4" selection-end-line="4" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/node_modules/dotenv-webpack/dist/index.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="2416">
<caret line="151" column="39" selection-start-line="151" selection-start-column="39" selection-end-line="151" selection-end-column="39" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/.gitignore">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="16">
<caret line="1" column="4" selection-start-line="1" selection-start-column="4" selection-end-line="1" selection-end-column="4" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/package.json">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="1136">
<caret line="71" column="27" selection-start-line="71" selection-start-column="16" selection-end-line="71" selection-end-column="27" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/public/index.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="176">
<caret line="11" column="7" lean-forward="true" selection-start-line="11" selection-start-column="7" selection-end-line="11" selection-end-column="7" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/.env.dev">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="64">
<caret line="4" lean-forward="true" selection-start-line="4" selection-end-line="4" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/.env.dev">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="32">
<caret line="2" column="59" lean-forward="true" selection-start-line="2" selection-start-column="59" selection-end-line="2" selection-end-column="59" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/.gitignore">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="16">
<caret line="1" column="4" selection-start-line="1" selection-start-column="4" selection-end-line="1" selection-end-column="4" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/.env">
<provider selected="true" editor-type-id="text-editor">
<state>
<caret selection-end-line="3" selection-end-column="4" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/.env.dev">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="16">
<caret line="1" column="40" lean-forward="true" selection-start-line="1" selection-start-column="40" selection-end-line="1" selection-end-column="40" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/.env.dev">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="64">
<caret line="4" lean-forward="true" selection-start-line="4" selection-end-line="4" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/.env.dev">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="32">
<caret line="2" column="59" lean-forward="true" selection-start-line="2" selection-start-column="59" selection-end-line="2" selection-end-column="59" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/node_modules/dotenv-webpack/dist/index.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="2416">
<caret line="151" column="39" selection-start-line="151" selection-start-column="39" selection-end-line="151" selection-end-column="39" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/public/index.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="176">
<caret line="11" column="7" selection-start-line="11" selection-start-column="7" selection-end-line="11" selection-end-column="7" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/.gitignore">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="16">
<caret line="1" column="4" selection-start-line="1" selection-start-column="4" selection-end-line="1" selection-end-column="4" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/package.json">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="1024">
<caret line="64" column="28" lean-forward="true" selection-start-line="64" selection-start-column="28" selection-end-line="64" selection-end-column="28" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/.env">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="32">
<caret line="2" column="56" selection-start-line="2" selection-start-column="56" selection-end-line="2" selection-end-column="56" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/.env.dev">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="104">
<caret line="4" lean-forward="true" selection-start-line="4" selection-end-line="4" />
</state>
</provider>
</entry>
</component>
</project>
\ No newline at end of file
const path = require('path');
const Dotenv = require('dotenv-webpack');
const build_env = process.env.build_env ? process.env.build_env : 'dev';
module.exports = context => {
const { webpack } = context;
return {
mode: process.env.NODE_ENV,
devtool: 'source-map',
entry: {
index: './src/index.js'
},
resolve: {
alias: {
'@': path.resolve(__dirname, './src')
}
},
plugins: [
new Dotenv({
path: `.env.${build_env}`, // load this now instead of the ones in '.env'
safe: false, // load '.env.example' to verify the '.env' variables are all set. Can also be a string to a different file.
systemvars: true, // load all the predefined 'process.env' variables which will trump anything local per dotenv specs.
silent: false // hide any errors
})
],
output: {
path: path.resolve('release'),
filename: process.env.NODE_ENV === 'development' ? '[name].js' : '[name].[contenthash].js'
},
optimization: {
splitChunks: {
chunks: 'all'
}
}
};
};
# ice-scaffold-lite
## 使用
- 启动调试服务: `npm run start`
- 构建 release: `npm run buildProd`
## 目录结构
- react-router @4.x 默认采用 hashHistory 的单页应用
- 入口文件: `src/index.js`
- 导航配置: `src/menuConfig.js`
- 路由配置: `src/routerConfig.js`
- 路由入口: `src/router.jsx`
- 布局文件: `src/layouts`
- 通用组件: `src/components`
- 页面文件: `src/pages`
This source diff could not be displayed because it is too large. You can view the blob instead.
{
"name": "@icedesign/lite-scaffold",
"version": "1.0.0",
"files": [
"src/",
"src/assets",
"build/",
"public/",
"tests/",
"_gitignore",
".editorconfig",
".eslintignore",
".eslintrc"
],
"dependencies": {
"@alifd/next": "^1.13.2",
"@alifd/theme-ice-orange": "^0.1.2",
"@ice/store": "^0.3.0",
"@icedesign/container": "^1.x",
"@icedesign/data-binder": "^1.0.0",
"ali-oss": "^6.1.0",
"antd": "^3.23.2",
"axios": "^0.18.0",
"base-64": "^0.1.0",
"bizcharts": "latest",
"classnames": "^2.2.6",
"cross-env": "^5.2.0",
"dotenv-webpack": "^1.7.0",
"enquire-js": "^0.1.2",
"js-export-excel": "^1.1.4",
"less": "2.7.3",
"marine": "^1.0.16",
"moment": "^2.24.0",
"node-sass": "^4.14.1",
"path": "^0.12.7",
"prop-types": "^15.5.8",
"react": "^16.4.1",
"react-cookie": "^3.0.8",
"react-document-title": "^2.0.3",
"react-dom": "^16.4.1",
"react-router-dom": "^4.3.1",
"reactjs-localstorage": "0.0.7"
},
"devDependencies": {
"babel-eslint": "^8.0.3",
"eslint": "^4.13.1",
"eslint-config-airbnb": "^16.1.0",
"eslint-plugin-babel": "^4.1.1",
"eslint-plugin-import": "^2.8.0",
"eslint-plugin-jsx-a11y": "^6.0.3",
"eslint-plugin-react": "^7.5.1",
"ice-scripts": "^1.8.7",
"jest": "^24.4.0"
},
"scripts": {
"start": "ice dev",
"lint": "eslint . --ext '.js,.jsx' --fix",
"test": "jest",
"build": "ice build",
"buildProd": "ice build --mode prod",
"preinstall": "npx npm-force-resolutions"
},
"resolutions": {
"graceful-fs": "4.2.3"
},
"publishConfig": {
"access": "public"
},
"buildConfig": {
"entry": "src/index.js",
"localization": false,
"output": {
"publicPath": "./"
}
},
"scaffoldConfig": {
"builder": "ice-scripts",
"name": "ice-design-lite",
"title": "ICE Design Lite",
"categories": [
"基础模板"
],
"screenshot": "https://img.alicdn.com/tfs/TB1CjPVw4naK1RjSZFBXXcW7VXa-2872-1580.png"
},
"engines": {
"node": ">=8.0.0"
},
"title": "ams-portal"
}
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta http-equiv="x-ua-compatible" content="ie=edge,chrome=1">
<meta name="viewport" content="width=device-width">
<title>夜店后台管理</title>
</head>
<body>
<div id="ice-container"></div>
</body>
</html>
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
<!--
2013-9-30: Created.
-->
<svg>
<metadata>
Created by iconfont
</metadata>
<defs>
<font id="iconfont" horiz-adv-x="1024" >
<font-face
font-family="iconfont"
font-weight="500"
font-stretch="normal"
units-per-em="1024"
ascent="896"
descent="-128"
/>
<missing-glyph />
<glyph glyph-name="shiyongbangzhuiconx" unicode="&#58924;" d="M512-128A512 512 0 1 0 512 896a512 512 0 0 0 0-1024z m7.964444 796.444444c-55.808 0-99.555556-16.384-131.185777-50.062222C357.148444 585.671111 341.333333 541.127111 341.333333 484.067556h79.075556c0 34.417778 6.826667 60.984889 20.366222 79.701333 15.075556 22.698667 39.936 33.621333 73.841778 33.621333 27.136 0 48.981333-7.793778 64.056889-23.438222 14.336-15.644444 21.845333-36.750222 21.845333-64.056889 0-20.366222-7.509333-39.082667-21.048889-57.059555l-12.856889-14.848c-46.648889-43.008-75.320889-75.036444-85.105777-96.881778-10.581333-20.366222-15.075556-45.340444-15.075556-74.24v-13.312h80.611556v13.312c0 18.773333 3.754667 35.896889 12.060444 51.541333 6.769778 14.051556 17.294222 28.16 31.630222 40.618667 35.441778 32.085333 56.490667 52.337778 63.317334 60.984889 18.773333 25.031111 28.615111 57.059556 28.615111 95.345777 0 46.876444-15.075556 84.366222-45.226667 111.729778C607.288889 655.132444 568.149333 668.444444 519.964444 668.444444z m-13.653333-457.159111a52.337778 52.337778 0 0 1-39.139555-15.587555c-10.581333-10.183111-15.815111-23.495111-15.815112-39.879111 0-15.644444 5.233778-28.899556 15.815112-39.822223A53.020444 53.020444 0 0 1 506.311111 99.555556a55.466667 55.466667 0 0 1 39.139556 15.644444 56.433778 56.433778 0 0 1 16.611555 40.618667c0 16.384-5.290667 29.696-15.815111 39.822222-10.581333 10.979556-24.120889 15.644444-39.936 15.644444z" horiz-adv-x="1024" />
<glyph glyph-name="tishiiconx" unicode="&#58943;" d="M512 384m-448 0a448 448 0 1 1 896 0 448 448 0 1 1-896 0ZM448 704h128.128L544 255.68h-64L448 704z m63.616-512c18.112 0 33.856-5.952 46.208-17.792 11.52-11.904 18.176-27.136 18.176-45.76 0-18.688-6.592-34.752-18.176-46.656a66.048 66.048 0 0 0-46.208-17.792 60.16 60.16 0 0 0-44.608 18.624C453.76 94.528 448 109.76 448 128.448c0 18.624 5.76 33.92 19.008 45.76A59.52 59.52 0 0 0 511.616 192z" horiz-adv-x="1024" />
<glyph glyph-name="jinggaoiconx" unicode="&#58944;" d="M512 384m-512 0a512 512 0 1 1 1024 0 512 512 0 1 1-1024 0ZM438.848 749.696h146.432L548.48 237.44H475.52l-36.608 512.32z m72.704-585.152c20.736 0 38.656-6.784 52.8-20.288 13.248-13.568 20.8-31.04 20.8-52.352 0-21.312-7.552-39.68-20.8-53.248a75.52 75.52 0 0 0-52.8-20.352c-20.8 0-37.76 7.68-51.008 21.312-15.104 13.568-21.696 30.976-21.696 52.288 0 21.312 6.592 38.784 21.76 52.352 13.184 13.504 30.144 20.288 50.944 20.288z" horiz-adv-x="1024" />
<glyph glyph-name="xinzengx" unicode="&#58947;" d="M976.337455 432.779636H555.008V847.872A47.848727 47.848727 0 0 1 507.345455 896a47.848727 47.848727 0 0 1-47.569455-48.128v-415.092364H47.662545A47.848727 47.848727 0 0 1 0 384.651636c0-26.624 21.317818-48.128 47.662545-48.128h412.113455v-416.395636c0-26.624 21.224727-48.128 47.569455-48.128a47.848727 47.848727 0 0 1 47.662545 48.128V336.523636h421.329455A47.848727 47.848727 0 0 1 1024 384.651636a47.848727 47.848727 0 0 1-47.662545 48.128z" horiz-adv-x="1024" />
<glyph glyph-name="shangchuantupianICONx" unicode="&#58949;" d="M864-32v197.76a32 32 0 1 0 64 0V-64a32 32 0 0 0-32-32H128a32 32 0 0 0-32 32v229.76a32 32 0 1 0 64 0v-197.76h704zM486.4 842.624a32 32 0 0 0 46.336-44.16L247.168 499.392a32 32 0 1 0-46.272 44.16L486.4 842.688z m57.152-665.28a32 32 0 1 0-64-0.192l-1.92 643.264a32 32 0 0 0 54.912 22.4l290.432-299.52a32 32 0 1 0-45.952-44.608l-235.2 242.56 1.728-563.904z" horiz-adv-x="1024" />
<glyph glyph-name="ceshiyonghux" unicode="&#58963;" d="M0.064 592.64C0.064 651.2 34.88 704 88.576 727.04L454.336 884.096a146.24 146.24 0 0 0 115.456 0L935.104 727.04a146.24 146.24 0 0 0 88.512-134.4v-415.744c0-58.368-34.688-111.104-88.256-134.208l-365.248-158.016c-37.056-16-79.04-16-116.096 0l-365.696 157.952A146.24 146.24 0 0 0 0.064 177.024V592.64z m232.576-122.688c7.808 0 13.696 1.92 17.6 5.76A20.352 20.352 0 0 1 256.064 490.88a20.8 20.8 0 0 1-5.76 15.296C246.464 510.016 240.576 512 232.64 512H87.168c-7.488 0-13.248-1.92-17.152-5.696A20.352 20.352 0 0 1 64.064 490.88c0-6.272 1.92-11.328 5.76-15.168 3.712-3.84 9.6-5.76 17.344-5.76h49.92v-182.848c0-10.432 2.176-18.24 6.4-23.36A20.48 20.48 0 0 1 160.064 256c6.656 0 12.16 2.56 16.32 7.68 4.224 5.056 6.336 12.864 6.336 23.424V469.952h49.92z m229.12 2.048c7.36 0 12.8 1.856 16.448 5.504a19.904 19.904 0 0 1 5.376 14.592 19.712 19.712 0 0 1-5.376 14.4C474.624 510.144 469.12 512 461.696 512H339.264a35.52 35.52 0 0 1-16.128-3.2 19.648 19.648 0 0 1-9.344-10.304 47.616 47.616 0 0 1-2.944-18.304v-192.384c0-11.2 2.24-19.264 6.656-24.32 4.416-4.992 11.648-7.488 21.76-7.488h126.08c7.296 0 12.8 1.92 16.512 5.696a20.224 20.224 0 0 1 5.568 14.72 20.672 20.672 0 0 1-5.568 15.104c-3.712 3.84-9.216 5.696-16.448 5.696H357.184V370.048h96.256c7.168 0 12.48 1.792 15.936 5.504a19.968 19.968 0 0 1 5.12 14.208 19.2 19.2 0 0 1-5.184 14.08c-3.52 3.52-8.768 5.312-15.872 5.312H357.184v62.848h104.512z m262.336-137.472c0 12.48-2.048 23.04-6.144 31.68a57.92 57.92 0 0 1-17.216 21.312 103.68 103.68 0 0 1-26.688 14.4 328.32 328.32 0 0 1-35.136 10.816 529.984 529.984 0 0 0-22.144 6.4 66.816 66.816 0 0 0-13.312 6.08 32.32 32.32 0 0 0-10.24 9.28 21.952 21.952 0 0 0-3.84 12.8c0 8 3.712 14.848 11.072 20.544a46.08 46.08 0 0 0 28.928 8.512c12.928 0 22.336-2.56 28.16-7.808 5.824-5.248 10.88-12.544 14.976-21.888a58.24 58.24 0 0 1 8.96-14.08c2.816-2.88 6.848-4.352 12.16-4.352a18.112 18.112 0 0 1 14.592 7.168 24.832 24.832 0 0 1 5.888 16.128 48.32 48.32 0 0 1-4.736 20.096 62.08 62.08 0 0 1-14.784 19.712 75.584 75.584 0 0 1-25.6 15.04A105.792 105.792 0 0 1 632.512 512c-17.6 0-32.896-2.816-45.888-8.512a65.92 65.92 0 0 1-29.888-24.448 65.152 65.152 0 0 1-10.24-36.288c0-14.272 3.2-26.24 9.728-35.84 6.464-9.6 15.296-17.28 26.368-22.848 11.136-5.568 24.896-10.432 41.344-14.592 12.288-3.008 22.144-5.888 29.44-8.576a44.416 44.416 0 0 0 17.984-11.776c4.608-5.12 6.976-11.776 6.976-20.032a32 32 0 0 0-12.928-25.92 51.776 51.776 0 0 0-33.472-10.368 49.472 49.472 0 0 0-24.256 5.12 39.296 39.296 0 0 0-14.272 13.12 103.552 103.552 0 0 0-9.472 19.776 40.384 40.384 0 0 1-8.64 15.04 16.896 16.896 0 0 1-12.48 5.056 19.2 19.2 0 0 1-14.912-6.528 22.528 22.528 0 0 1-5.824-15.616c0-10.432 3.2-21.248 9.728-32.32s14.976-19.968 25.408-26.624c14.72-9.216 33.28-13.824 55.936-13.824 18.88 0 35.2 3.392 48.896 10.112a72.704 72.704 0 0 1 42.048 68.416z m212.544 135.424c7.808 0 13.696 1.92 17.6 5.76A20.352 20.352 0 0 1 960.064 490.88a20.8 20.8 0 0 1-5.76 15.296c-3.84 3.84-9.728 5.824-17.664 5.824h-145.472c-7.488 0-13.248-1.92-17.152-5.696A20.352 20.352 0 0 1 768.064 490.88c0-6.272 1.92-11.328 5.76-15.168 3.712-3.84 9.6-5.76 17.344-5.76h49.92v-182.848c0-10.432 2.176-18.24 6.4-23.36A20.48 20.48 0 0 1 864.064 256c6.656 0 12.16 2.56 16.32 7.68 4.224 5.056 6.336 12.864 6.336 23.424V469.952h49.92z" horiz-adv-x="1024" />
<glyph glyph-name="yingyongpeizhix" unicode="&#58964;" d="M68.266667 827.733333h273.066666a68.266667 68.266667 0 0 0 68.266667-68.266666v-273.066667a68.266667 68.266667 0 0 0-68.266667-68.266667H68.266667a68.266667 68.266667 0 0 0-68.266667 68.266667V759.466667a68.266667 68.266667 0 0 0 68.266667 68.266666z m0-546.133333h273.066666a68.266667 68.266667 0 0 0 68.266667-68.266667v-273.066666a68.266667 68.266667 0 0 0-68.266667-68.266667H68.266667a68.266667 68.266667 0 0 0-68.266667 68.266667v273.066666a68.266667 68.266667 0 0 0 68.266667 68.266667zM799.197867 864.324267l193.1264-193.1264a68.266667 68.266667 0 0 0 0-96.529067l-193.1264-193.1264a68.266667 68.266667 0 0 0-96.529067 0L509.5424 574.6688a68.266667 68.266667 0 0 0 0 96.529067L702.6688 864.324267a68.266667 68.266667 0 0 0 96.529067 0zM614.4 281.6h273.066667a68.266667 68.266667 0 0 0 68.266666-68.266667v-273.066666a68.266667 68.266667 0 0 0-68.266666-68.266667H614.4a68.266667 68.266667 0 0 0-68.266667 68.266667v273.066666a68.266667 68.266667 0 0 0 68.266667 68.266667z" horiz-adv-x="1024" />
<glyph glyph-name="dingdanguanlix" unicode="&#58965;" d="M569.514667 686.933333h639.488a101.12 101.12 0 0 1 0 202.24H569.514667a101.12 101.12 0 1 1 0-202.24zM275.2 889.173333H153.941333a101.12 101.12 0 1 1 0-202.24h121.258667a101.12 101.12 0 1 1 0 202.24z m933.802667-404.48H569.514667a101.12 101.12 0 1 1 0-202.24h639.488a101.12 101.12 0 0 1 0 202.24z m-933.802667 0H153.941333a101.12 101.12 0 1 1 0-202.24h121.258667a101.12 101.12 0 1 1 0 202.24z m933.802667-404.48H569.514667a101.12 101.12 0 0 1 0-202.24h639.488a101.12 101.12 0 1 1 0 202.24z m-933.802667 0H153.941333a101.12 101.12 0 0 1 0-202.24h121.258667a101.12 101.12 0 1 1 0 202.24z" horiz-adv-x="1365" />
<glyph glyph-name="kaiguanx" unicode="&#58966;" d="M42.688 128a213.376 213.376 0 0 0 213.248 213.312h512.128a213.376 213.376 0 0 0 0-426.688H255.936A213.44 213.44 0 0 0 42.688 128zM256 42.688a85.312 85.312 0 1 1 0 170.624 85.312 85.312 0 0 1 0-170.624zM42.688 640A213.376 213.376 0 0 0 255.936 853.312h512.128a213.376 213.376 0 0 0 0-426.688H255.936A213.44 213.44 0 0 0 42.688 640zM768 554.688a85.312 85.312 0 1 1 0 170.624 85.312 85.312 0 0 1 0-170.624z" horiz-adv-x="1024" />
<glyph glyph-name="zhanghuguanlix" unicode="&#58967;" d="M960-128v151.68c0 167.616-100.288 303.424-224 303.424h-448c-123.712 0-224-135.808-224-303.36V-128M288 668.416a227.584 224 90 1 1 448 0 227.584 224 90 1 1-448 0Z" horiz-adv-x="1024" />
<glyph glyph-name="yonghuguanlix" unicode="&#58968;" d="M921.6-40.209067v112.64c0 146.2272-77.0048 271.086933-183.978667 303.445334H955.733333c113.117867 0 204.8-124.245333 204.8-277.435734v-138.6496h-238.933333zM627.780267 521.693867A277.2992 277.2992 0 0 1 682.666667 687.9232c0 62.395733-20.48 119.944533-54.8864 166.229333A201.796267 201.796267 0 0 0 750.933333 896c113.117867 0 204.8-93.115733 204.8-208.0768 0-114.8928-91.682133-208.008533-204.8-208.008533a201.796267 201.796267 0 0 0-123.153066 41.7792zM819.2-66.218667v138.717867C819.2 225.621333 727.517867 349.866667 614.4 349.866667H204.8c-113.117867 0-204.8-124.245333-204.8-277.367467v-138.717867M204.8 687.9232a208.0768 204.8 90 1 1 409.6 0 208.0768 204.8 90 1 1-409.6 0Z" horiz-adv-x="1160" />
<glyph glyph-name="iCONx" unicode="&#58969;" d="M512 384m-512 0a512 512 0 1 1 1024 0 512 512 0 1 1-1024 0ZM356.386133 608.426667a271.5648 271.5648 0 0 0 106.973867 44.305066l11.776 58.88A17.066667 17.066667 0 0 0 491.861333 725.333333h40.277334a17.066667 17.066667 0 0 0 16.725333-13.7216l11.776-58.88a271.5648 271.5648 0 0 0 106.973867-44.305066l49.9712 33.314133a17.066667 17.066667 0 0 0 21.504-2.1504l28.501333-28.4672a17.066667 17.066667 0 0 0 2.1504-21.538133l-33.314133-49.9712a271.5648 271.5648 0 0 0 44.305066-106.973867l58.88-11.776a17.066667 17.066667 0 0 0 13.7216-16.725333v-40.277334a17.066667 17.066667 0 0 0-13.7216-16.725333l-58.88-11.776a271.5648 271.5648 0 0 0-44.305066-106.973867l33.314133-49.9712a17.066667 17.066667 0 0 0-2.1504-21.504l-28.4672-28.501333a17.066667 17.066667 0 0 0-21.538133-2.1504l-49.9712 33.314133a271.5648 271.5648 0 0 0-106.973867-44.305066l-11.776-58.88a17.066667 17.066667 0 0 0-16.725333-13.7216h-40.277334a17.066667 17.066667 0 0 0-16.725333 13.7216l-11.776 58.88a271.5648 271.5648 0 0 0-106.973867 44.305066l-49.9712-33.314133a17.066667 17.066667 0 0 0-21.504 2.1504l-28.501333 28.4672a17.066667 17.066667 0 0 0-2.1504 21.538133l33.314133 49.9712a271.5648 271.5648 0 0 0-44.305066 106.973867l-58.88 11.776A17.066667 17.066667 0 0 0 170.666667 363.861333v40.277334a17.066667 17.066667 0 0 0 13.7216 16.725333l58.88 11.776a271.5648 271.5648 0 0 0 44.305066 106.973867L254.293333 589.585067a17.066667 17.066667 0 0 0 2.1504 21.504l28.4672 28.501333a17.066667 17.066667 0 0 0 21.538134 2.1504l49.9712-33.314133zM512 554.666667c-95.402667 0-170.666667-76.458667-170.666667-170.666667 0-94.8224 76.458667-170.666667 170.666667-170.666667 91.9552 0 168.379733 76.458667 170.666667 170.666667 0 95.402667-75.844267 170.666667-170.666667 170.666667zM414.037333 414.173867c8.021333-17.851733 25.941333-30.173867 46.762667-30.173867 27.579733 0 50.517333 22.9376 51.2 51.2a50.858667 50.858667 0 0 1-30.139733 46.762667c9.489067 2.901333 19.626667 4.437333 30.139733 4.437333 56.900267 0 102.4-45.1584 102.4-102.4-1.365333-56.558933-47.240533-102.4-102.4-102.4-56.558933 0-102.4 45.499733-102.4 102.4 0 10.513067 1.570133 20.650667 4.437333 30.173867z" horiz-adv-x="1024" />
</font>
</defs></svg>
/*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,footer,header,nav,section{display:block}h1{font-size:2em;margin:.67em 0}figcaption,figure,main{display:block}figure{margin:1em 40px}hr{-webkit-box-sizing:content-box;box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent;-webkit-text-decoration-skip:objects}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:inherit;font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}img{border-style:none}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details,menu{display:block}summary{display:list-item}canvas{display:inline-block}[hidden],template{display:none}*,:after,:before{-webkit-box-sizing:border-box;box-sizing:border-box}ol,ul{list-style:none;margin:0;padding:0}li{margin-left:0}hr{border:solid #dcdee3;border-width:1px 0 0}a{text-decoration:none}a:link,a:visited{color:#f50}a:active,a:hover{color:#f60}a:active{text-decoration:underline}@font-face{font-family:Roboto;src:url(//i.alicdn.com/artascope-font/20160419204543/font/roboto-thin.eot);src:url(//i.alicdn.com/artascope-font/20160419204543/font/roboto-thin.eot#iefix) format("embedded-opentype"),url(//i.alicdn.com/artascope-font/20160419204543/font/roboto-thin.woff2) format("woff2"),url(//i.alicdn.com/artascope-font/20160419204543/font/roboto-thin.woff) format("woff"),url(//i.alicdn.com/artascope-font/20160419204543/font/roboto-thin.ttf) format("truetype");font-weight:200}@font-face{font-family:Roboto;src:url(//i.alicdn.com/artascope-font/20160419204543/font/roboto-light.eot);src:url(//i.alicdn.com/artascope-font/20160419204543/font/roboto-light.eot#iefix) format("embedded-opentype"),url(//i.alicdn.com/artascope-font/20160419204543/font/roboto-light.woff2) format("woff2"),url(//i.alicdn.com/artascope-font/20160419204543/font/roboto-light.woff) format("woff"),url(//i.alicdn.com/artascope-font/20160419204543/font/roboto-light.ttf) format("truetype");font-weight:300}@font-face{font-family:Roboto;src:url(//i.alicdn.com/artascope-font/20160419204543/font/roboto-regular.eot);src:url(//i.alicdn.com/artascope-font/20160419204543/font/roboto-regular.eot#iefix) format("embedded-opentype"),url(//i.alicdn.com/artascope-font/20160419204543/font/roboto-regular.woff2) format("woff2"),url(//i.alicdn.com/artascope-font/20160419204543/font/roboto-regular.woff) format("woff"),url(//i.alicdn.com/artascope-font/20160419204543/font/roboto-regular.ttf) format("truetype");font-weight:400}@font-face{font-family:Roboto;src:url(//i.alicdn.com/artascope-font/20160419204543/font/roboto-medium.eot);src:url(//i.alicdn.com/artascope-font/20160419204543/font/roboto-medium.eot#iefix) format("embedded-opentype"),url(//i.alicdn.com/artascope-font/20160419204543/font/roboto-medium.woff2) format("woff2"),url(//i.alicdn.com/artascope-font/20160419204543/font/roboto-medium.woff) format("woff"),url(//i.alicdn.com/artascope-font/20160419204543/font/roboto-medium.ttf) format("truetype");font-weight:500}@font-face{font-family:Roboto;src:url(//i.alicdn.com/artascope-font/20160419204543/font/roboto-bold.eot);src:url(//i.alicdn.com/artascope-font/20160419204543/font/roboto-bold.eot#iefix) format("embedded-opentype"),url(//i.alicdn.com/artascope-font/20160419204543/font/roboto-bold.woff2) format("woff2"),url(//i.alicdn.com/artascope-font/20160419204543/font/roboto-bold.woff) format("woff"),url(//i.alicdn.com/artascope-font/20160419204543/font/roboto-bold.ttf) format("truetype");font-weight:700}html{font-size:100%}body{font-family:Roboto,Helvetica Neue,Helvetica,Tahoma,Arial,PingFang SC,Microsoft YaHei;font-size:12px;line-height:1.28571;color:#333}button,input,optgroup,select,textarea{font-family:inherit}h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{font-weight:inherit}h1{margin-bottom:12px;font-size:24px;line-height:36px}h1,h2{font-weight:500}h2{margin-bottom:10px;font-size:20px;line-height:30px}h3,h4{margin-bottom:8px;font-size:16px}h3,h4,h5{font-weight:400;line-height:24px}h5{margin-bottom:6px;font-size:14px}h6{margin-bottom:7px;font-weight:500}h6,p{font-size:12px;line-height:20px}p{margin-bottom:6px;font-weight:400}strong{font-weight:500}small{font-size:75%}.next-icon[dir=rtl]:before{-webkit-transform:rotateY(180deg);transform:rotateY(180deg)}@font-face{font-family:NextIcon;src:url(//at.alicdn.com/t/font_1034723_4lh4tnqfgc4.eot);src:url(//at.alicdn.com/t/font_1034723_4lh4tnqfgc4.eot#iefix) format("embedded-opentype"),url(//at.alicdn.com/t/font_1034723_4lh4tnqfgc4.woff) format("woff"),url(//at.alicdn.com/t/font_1034723_4lh4tnqfgc4.ttf) format("truetype"),url(//at.alicdn.com/t/font_1034723_4lh4tnqfgc4.svg#NextIcon) format("svg")}.next-icon{display:inline-block;font-family:NextIcon;font-style:normal;font-weight:400;text-transform:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.next-icon:before{display:inline-block;vertical-align:middle;text-align:center}.next-icon-smile:before{content:"\E65F"}.next-icon-cry:before{content:"\E65D"}.next-icon-success:before{content:"\E60A"}.next-icon-warning:before{content:"\E60B"}.next-icon-prompt:before{content:"\E60C"}.next-icon-error:before{content:"\E60D"}.next-icon-help:before{content:"\E673"}.next-icon-clock:before{content:"\E621"}.next-icon-success-filling:before{content:"\E63A"}.next-icon-delete-filling:before{content:"\E623"}.next-icon-favorites-filling:before{content:"\E60E"}.next-icon-add:before{content:"\E655"}.next-icon-minus:before{content:"\E601"}.next-icon-arrow-up:before{content:"\E625"}.next-icon-arrow-down:before{content:"\E63D"}.next-icon-arrow-left:before{content:"\E61D"}.next-icon-arrow-right:before{content:"\E619"}.next-icon-arrow-double-left:before{content:"\E659"}.next-icon-arrow-double-right:before{content:"\E65E"}.next-icon-switch:before{content:"\E6B3"}.next-icon-sorting:before{content:"\E634"}.next-icon-descending:before{content:"\E61F"}.next-icon-ascending:before{content:"\E61E"}.next-icon-select:before{content:"\E632"}.next-icon-semi-select:before{content:"\E633"}.next-icon-search:before{content:"\E656"}.next-icon-close:before{content:"\E626"}.next-icon-ellipsis:before{content:"\E654"}.next-icon-picture:before{content:"\E631"}.next-icon-calendar:before{content:"\E607"}.next-icon-ashbin:before{content:"\E639"}.next-icon-upload:before{content:"\E7EE"}.next-icon-download:before{content:"\E628"}.next-icon-set:before{content:"\E683"}.next-icon-edit:before{content:"\E63B"}.next-icon-refresh:before{content:"\E677"}.next-icon-filter:before{content:"\E627"}.next-icon-attachment:before{content:"\E665"}.next-icon-account:before{content:"\E608"}.next-icon-email:before{content:"\E605"}.next-icon-atm:before{content:"\E606"}.next-icon-loading:before{content:"\E646";-webkit-animation:loadingCircle 1s linear infinite;animation:loadingCircle 1s linear infinite}@-webkit-keyframes loadingCircle{0%{-webkit-transform-origin:50% 50%;transform-origin:50% 50%;-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform-origin:50% 50%;transform-origin:50% 50%;-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes loadingCircle{0%{-webkit-transform-origin:50% 50%;transform-origin:50% 50%;-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform-origin:50% 50%;transform-origin:50% 50%;-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.next-icon.next-xxs:before{width:8px;font-size:8px;line-height:inherit}@media (-webkit-min-device-pixel-ratio:0) and (min-resolution:0.001dpcm){.next-icon.next-xxs{-webkit-transform:scale(.5);-ms-transform:scale(.5);transform:scale(.5);margin-left:-4px;margin-right:-4px}.next-icon.next-xxs:before{width:16px;font-size:16px}}.next-icon.next-xs:before{width:12px;font-size:12px;line-height:inherit}.next-icon.next-small:before{width:16px;font-size:16px;line-height:inherit}.next-icon.next-medium:before{width:20px;font-size:20px;line-height:inherit}.next-icon.next-large:before{width:24px;font-size:24px;line-height:inherit}.next-icon.next-xl:before{width:32px;font-size:32px;line-height:inherit}.next-icon.next-xxl:before{width:48px;font-size:48px;line-height:inherit}.next-icon.next-xxxl:before{width:64px;font-size:64px;line-height:inherit}.next-icon.next-inherit:before{width:inherit;font-size:inherit;line-height:inherit}@-webkit-keyframes fadeIn{0%{opacity:0}to{opacity:1}}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}@-webkit-keyframes fadeInDown{0%{opacity:0;-webkit-transform:translateY(-100px);-ms-transform:translateY(-100px);transform:translateY(-100px)}to{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}@keyframes fadeInDown{0%{opacity:0;-webkit-transform:translateY(-100px);-ms-transform:translateY(-100px);transform:translateY(-100px)}to{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes fadeInLeft{0%{opacity:0;-webkit-transform:translateX(-20px);-ms-transform:translateX(-20px);transform:translateX(-20px)}to{opacity:1;-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}}@keyframes fadeInLeft{0%{opacity:0;-webkit-transform:translateX(-20px);-ms-transform:translateX(-20px);transform:translateX(-20px)}to{opacity:1;-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}}@-webkit-keyframes fadeInRight{0%{opacity:0;-webkit-transform:translateX(20px);-ms-transform:translateX(20px);transform:translateX(20px)}to{opacity:1;-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}}@keyframes fadeInRight{0%{opacity:0;-webkit-transform:translateX(20px);-ms-transform:translateX(20px);transform:translateX(20px)}to{opacity:1;-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}}@-webkit-keyframes fadeInUp{0%{opacity:0;-webkit-transform:translateY(20px);-ms-transform:translateY(20px);transform:translateY(20px)}to{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}@keyframes fadeInUp{0%{opacity:0;-webkit-transform:translateY(20px);-ms-transform:translateY(20px);transform:translateY(20px)}to{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes fadeOut{0%{opacity:1}to{opacity:0}}@keyframes fadeOut{0%{opacity:1}to{opacity:0}}@-webkit-keyframes fadeOutDown{0%{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(20px);-ms-transform:translateY(20px);transform:translateY(20px)}}@keyframes fadeOutDown{0%{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(20px);-ms-transform:translateY(20px);transform:translateY(20px)}}@-webkit-keyframes fadeOutLeft{0%{opacity:1;-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}to{opacity:0;-webkit-transform:translateX(-20px);-ms-transform:translateX(-20px);transform:translateX(-20px)}}@keyframes fadeOutLeft{0%{opacity:1;-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}to{opacity:0;-webkit-transform:translateX(-20px);-ms-transform:translateX(-20px);transform:translateX(-20px)}}@-webkit-keyframes fadeOutRight{0%{opacity:1;-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}to{opacity:0;-webkit-transform:translateX(20px);-ms-transform:translateX(20px);transform:translateX(20px)}}@keyframes fadeOutRight{0%{opacity:1;-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}to{opacity:0;-webkit-transform:translateX(20px);-ms-transform:translateX(20px);transform:translateX(20px)}}@-webkit-keyframes fadeOutUp{0%{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(-100px);-ms-transform:translateY(-100px);transform:translateY(-100px)}}@keyframes fadeOutUp{0%{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(-100px);-ms-transform:translateY(-100px);transform:translateY(-100px)}}@-webkit-keyframes slideOutDown{0%{-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(2000px);-ms-transform:translateY(2000px);transform:translateY(2000px)}}@keyframes slideOutDown{0%{-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(2000px);-ms-transform:translateY(2000px);transform:translateY(2000px)}}@-webkit-keyframes slideOutLeft{0%{-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}to{opacity:0;-webkit-transform:translateX(-2000px);-ms-transform:translateX(-2000px);transform:translateX(-2000px)}}@keyframes slideOutLeft{0%{-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}to{opacity:0;-webkit-transform:translateX(-2000px);-ms-transform:translateX(-2000px);transform:translateX(-2000px)}}@-webkit-keyframes slideOutRight{0%{-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}to{opacity:0;-webkit-transform:translateX(2000px);-ms-transform:translateX(2000px);transform:translateX(2000px)}}@keyframes slideOutRight{0%{-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}to{opacity:0;-webkit-transform:translateX(2000px);-ms-transform:translateX(2000px);transform:translateX(2000px)}}@-webkit-keyframes slideOutUp{0%{-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(-2000px);-ms-transform:translateY(-2000px);transform:translateY(-2000px)}}@keyframes slideOutUp{0%{-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(-2000px);-ms-transform:translateY(-2000px);transform:translateY(-2000px)}}@-webkit-keyframes slideInDown{0%{opacity:0;-webkit-transform:translateY(-2000px);-ms-transform:translateY(-2000px);transform:translateY(-2000px)}to{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}@keyframes slideInDown{0%{opacity:0;-webkit-transform:translateY(-2000px);-ms-transform:translateY(-2000px);transform:translateY(-2000px)}to{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes slideInLeft{0%{opacity:0;-webkit-transform:translateX(-2000px);-ms-transform:translateX(-2000px);transform:translateX(-2000px)}to{opacity:1;-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}}@keyframes slideInLeft{0%{opacity:0;-webkit-transform:translateX(-2000px);-ms-transform:translateX(-2000px);transform:translateX(-2000px)}to{opacity:1;-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}}@-webkit-keyframes slideInRight{0%{opacity:0;-webkit-transform:translateX(2000px);-ms-transform:translateX(2000px);transform:translateX(2000px)}to{opacity:1;-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}}@keyframes slideInRight{0%{opacity:0;-webkit-transform:translateX(2000px);-ms-transform:translateX(2000px);transform:translateX(2000px)}to{opacity:1;-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}}@-webkit-keyframes slideInUp{0%{opacity:0;-webkit-transform:translateY(2000px);-ms-transform:translateY(2000px);transform:translateY(2000px)}to{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}@keyframes slideInUp{0%{opacity:0;-webkit-transform:translateY(2000px);-ms-transform:translateY(2000px);transform:translateY(2000px)}to{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes zoomIn{0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);-ms-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}50%{opacity:1}}@keyframes zoomIn{0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);-ms-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}50%{opacity:1}}@-webkit-keyframes zoomOut{0%{opacity:1}50%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);-ms-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}to{opacity:0}}@keyframes zoomOut{0%{opacity:1}50%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);-ms-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}to{opacity:0}}@-webkit-keyframes expandInDown{0%{opacity:0;-webkit-transform:scaleY(.6);-ms-transform:scaleY(.6);transform:scaleY(.6);-webkit-transform-origin:left top 0;-ms-transform-origin:left top 0;transform-origin:left top 0}to{opacity:1;-webkit-transform:scaleY(1);-ms-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:left top 0;-ms-transform-origin:left top 0;transform-origin:left top 0}}@keyframes expandInDown{0%{opacity:0;-webkit-transform:scaleY(.6);-ms-transform:scaleY(.6);transform:scaleY(.6);-webkit-transform-origin:left top 0;-ms-transform-origin:left top 0;transform-origin:left top 0}to{opacity:1;-webkit-transform:scaleY(1);-ms-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:left top 0;-ms-transform-origin:left top 0;transform-origin:left top 0}}@-webkit-keyframes expandInUp{0%{opacity:0;-webkit-transform:scaleY(.6);-ms-transform:scaleY(.6);transform:scaleY(.6);-webkit-transform-origin:left bottom 0;-ms-transform-origin:left bottom 0;transform-origin:left bottom 0}to{opacity:1;-webkit-transform:scaleY(1);-ms-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:left bottom 0;-ms-transform-origin:left bottom 0;transform-origin:left bottom 0}}@keyframes expandInUp{0%{opacity:0;-webkit-transform:scaleY(.6);-ms-transform:scaleY(.6);transform:scaleY(.6);-webkit-transform-origin:left bottom 0;-ms-transform-origin:left bottom 0;transform-origin:left bottom 0}to{opacity:1;-webkit-transform:scaleY(1);-ms-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:left bottom 0;-ms-transform-origin:left bottom 0;transform-origin:left bottom 0}}@-webkit-keyframes expandInWithFade{0%{opacity:0}40%{opacity:.1}50%{opacity:.9}to{opacity:1}}@keyframes expandInWithFade{0%{opacity:0}40%{opacity:.1}50%{opacity:.9}to{opacity:1}}@-webkit-keyframes expandOutUp{0%{opacity:1;-webkit-transform:scaleY(1);-ms-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:left top 0;-ms-transform-origin:left top 0;transform-origin:left top 0}to{opacity:0;-webkit-transform:scaleY(.6);-ms-transform:scaleY(.6);transform:scaleY(.6);-webkit-transform-origin:left top 0;-ms-transform-origin:left top 0;transform-origin:left top 0}}@keyframes expandOutUp{0%{opacity:1;-webkit-transform:scaleY(1);-ms-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:left top 0;-ms-transform-origin:left top 0;transform-origin:left top 0}to{opacity:0;-webkit-transform:scaleY(.6);-ms-transform:scaleY(.6);transform:scaleY(.6);-webkit-transform-origin:left top 0;-ms-transform-origin:left top 0;transform-origin:left top 0}}@-webkit-keyframes expandOutDown{0%{opacity:1;-webkit-transform:scaleY(1);-ms-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:left bottom 0;-ms-transform-origin:left bottom 0;transform-origin:left bottom 0}to{opacity:0;-webkit-transform:scaleY(.6);-ms-transform:scaleY(.6);transform:scaleY(.6);-webkit-transform-origin:left bottom 0;-ms-transform-origin:left bottom 0;transform-origin:left bottom 0}}@keyframes expandOutDown{0%{opacity:1;-webkit-transform:scaleY(1);-ms-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:left bottom 0;-ms-transform-origin:left bottom 0;transform-origin:left bottom 0}to{opacity:0;-webkit-transform:scaleY(.6);-ms-transform:scaleY(.6);transform:scaleY(.6);-webkit-transform-origin:left bottom 0;-ms-transform-origin:left bottom 0;transform-origin:left bottom 0}}@-webkit-keyframes expandOutWithFade{0%{opacity:1}70%{opacity:0}to{opacity:0}}@keyframes expandOutWithFade{0%{opacity:1}70%{opacity:0}to{opacity:0}}@-webkit-keyframes pulse{0%{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}20%{-webkit-transform:scale(1.2);-ms-transform:scale(1.2);transform:scale(1.2)}to{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}@keyframes pulse{0%{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}20%{-webkit-transform:scale(1.2);-ms-transform:scale(1.2);transform:scale(1.2)}to{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}.fadeIn{-webkit-animation-name:fadeIn;animation-name:fadeIn;-webkit-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.23,1,.32,1);animation-timing-function:cubic-bezier(.23,1,.32,1);-webkit-animation-fill-mode:both;animation-fill-mode:both}.fadeIn,.fadeInDown{-webkit-backface-visibility:hidden;backface-visibility:hidden}.fadeInDown{-webkit-animation-name:fadeInDown;animation-name:fadeInDown;-webkit-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.23,1,.32,1);animation-timing-function:cubic-bezier(.23,1,.32,1);-webkit-animation-fill-mode:both;animation-fill-mode:both}.fadeInLeft{-webkit-animation-name:fadeInLeft;animation-name:fadeInLeft;-webkit-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.23,1,.32,1);animation-timing-function:cubic-bezier(.23,1,.32,1);-webkit-animation-fill-mode:both;animation-fill-mode:both}.fadeInLeft,.fadeInRight{-webkit-backface-visibility:hidden;backface-visibility:hidden}.fadeInRight{-webkit-animation-name:fadeInRight;animation-name:fadeInRight;-webkit-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.23,1,.32,1);animation-timing-function:cubic-bezier(.23,1,.32,1);-webkit-animation-fill-mode:both;animation-fill-mode:both}.fadeInUp{-webkit-animation-name:fadeInUp;animation-name:fadeInUp;-webkit-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.23,1,.32,1);animation-timing-function:cubic-bezier(.23,1,.32,1);-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-backface-visibility:hidden;backface-visibility:hidden}.fadeOut{-webkit-animation-name:fadeOut;animation-name:fadeOut;-webkit-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.755,.05,.855,.06);animation-timing-function:cubic-bezier(.755,.05,.855,.06);-webkit-animation-fill-mode:both;animation-fill-mode:both}.fadeOut,.fadeOutDown{-webkit-backface-visibility:hidden;backface-visibility:hidden}.fadeOutDown{-webkit-animation-name:fadeOutDown;animation-name:fadeOutDown;-webkit-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.755,.05,.855,.06);animation-timing-function:cubic-bezier(.755,.05,.855,.06);-webkit-animation-fill-mode:both;animation-fill-mode:both}.fadeOutLeft{-webkit-animation-name:fadeOutLeft;animation-name:fadeOutLeft;-webkit-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.755,.05,.855,.06);animation-timing-function:cubic-bezier(.755,.05,.855,.06);-webkit-animation-fill-mode:both;animation-fill-mode:both}.fadeOutLeft,.fadeOutRight{-webkit-backface-visibility:hidden;backface-visibility:hidden}.fadeOutRight{-webkit-animation-name:fadeOutRight;animation-name:fadeOutRight;-webkit-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.755,.05,.855,.06);animation-timing-function:cubic-bezier(.755,.05,.855,.06);-webkit-animation-fill-mode:both;animation-fill-mode:both}.fadeOutUp{-webkit-animation-name:fadeOutUp;animation-name:fadeOutUp;-webkit-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.755,.05,.855,.06);animation-timing-function:cubic-bezier(.755,.05,.855,.06);-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-backface-visibility:hidden;backface-visibility:hidden}.slideInUp{-webkit-animation-name:slideInUp;animation-name:slideInUp;-webkit-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.86,0,.07,1);animation-timing-function:cubic-bezier(.86,0,.07,1);-webkit-animation-fill-mode:both;animation-fill-mode:both}.slideInDown,.slideInUp{-webkit-backface-visibility:hidden;backface-visibility:hidden}.slideInDown{-webkit-animation-name:slideInDown;animation-name:slideInDown;-webkit-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.86,0,.07,1);animation-timing-function:cubic-bezier(.86,0,.07,1);-webkit-animation-fill-mode:both;animation-fill-mode:both}.slideInLeft{-webkit-animation-name:slideInLeft;animation-name:slideInLeft;-webkit-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.86,0,.07,1);animation-timing-function:cubic-bezier(.86,0,.07,1);-webkit-animation-fill-mode:both;animation-fill-mode:both}.slideInLeft,.slideInRight{-webkit-backface-visibility:hidden;backface-visibility:hidden}.slideInRight{-webkit-animation-name:slideInRight;animation-name:slideInRight;-webkit-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.86,0,.07,1);animation-timing-function:cubic-bezier(.86,0,.07,1);-webkit-animation-fill-mode:both;animation-fill-mode:both}.slideOutUp{-webkit-animation-name:slideOutUp;animation-name:slideOutUp;-webkit-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.23,1,.32,1);animation-timing-function:cubic-bezier(.23,1,.32,1);-webkit-animation-fill-mode:both;animation-fill-mode:both}.slideOutRight,.slideOutUp{-webkit-backface-visibility:hidden;backface-visibility:hidden}.slideOutRight{-webkit-animation-name:slideOutRight;animation-name:slideOutRight;-webkit-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.23,1,.32,1);animation-timing-function:cubic-bezier(.23,1,.32,1);-webkit-animation-fill-mode:both;animation-fill-mode:both}.slideOutLeft{-webkit-animation-name:slideOutLeft;animation-name:slideOutLeft;-webkit-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.23,1,.32,1);animation-timing-function:cubic-bezier(.23,1,.32,1);-webkit-animation-fill-mode:both;animation-fill-mode:both}.slideOutDown,.slideOutLeft{-webkit-backface-visibility:hidden;backface-visibility:hidden}.slideOutDown{-webkit-animation-name:slideOutDown;animation-name:slideOutDown;-webkit-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.23,1,.32,1);animation-timing-function:cubic-bezier(.23,1,.32,1);-webkit-animation-fill-mode:both;animation-fill-mode:both}.zoomIn{-webkit-animation-name:zoomIn;animation-name:zoomIn;-webkit-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.23,1,.32,1);animation-timing-function:cubic-bezier(.23,1,.32,1);-webkit-animation-fill-mode:both;animation-fill-mode:both}.zoomIn,.zoomOut{-webkit-backface-visibility:hidden;backface-visibility:hidden}.zoomOut{-webkit-animation-name:zoomOut;animation-name:zoomOut;-webkit-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.755,.05,.855,.06);animation-timing-function:cubic-bezier(.755,.05,.855,.06);-webkit-animation-fill-mode:both;animation-fill-mode:both}.expandInDown{-webkit-animation-name:expandInDown;animation-name:expandInDown;-webkit-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.23,1,.32,1);animation-timing-function:cubic-bezier(.23,1,.32,1);-webkit-animation-fill-mode:both;animation-fill-mode:both}.expandInDown,.expandOutUp{-webkit-backface-visibility:hidden;backface-visibility:hidden}.expandOutUp{-webkit-animation-name:expandOutUp;animation-name:expandOutUp;-webkit-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.15s;animation-duration:.15s;-webkit-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.23,1,.32,1);animation-timing-function:cubic-bezier(.23,1,.32,1);-webkit-animation-fill-mode:both;animation-fill-mode:both}.expandInUp{-webkit-animation-name:expandInUp;animation-name:expandInUp;-webkit-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.23,1,.32,1);animation-timing-function:cubic-bezier(.23,1,.32,1);-webkit-animation-fill-mode:both;animation-fill-mode:both}.expandInUp,.expandOutDown{-webkit-backface-visibility:hidden;backface-visibility:hidden}.expandOutDown{-webkit-animation-name:expandOutDown;animation-name:expandOutDown;-webkit-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.15s;animation-duration:.15s;-webkit-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.23,1,.32,1);animation-timing-function:cubic-bezier(.23,1,.32,1);-webkit-animation-fill-mode:both;animation-fill-mode:both}.pulse{-webkit-animation-name:pulse;animation-name:pulse;-webkit-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.23,1,.32,1);animation-timing-function:cubic-bezier(.23,1,.32,1);-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-backface-visibility:hidden;backface-visibility:hidden}.expand-enter{overflow:hidden}.expand-enter-active{-webkit-transition:all .3s ease-out;transition:all .3s ease-out}.expand-enter-active>*{-webkit-animation-name:expandInWithFade;animation-name:expandInWithFade;-webkit-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.23,1,.32,1);animation-timing-function:cubic-bezier(.23,1,.32,1);-webkit-animation-fill-mode:"forwards";animation-fill-mode:"forwards";-webkit-backface-visibility:hidden;backface-visibility:hidden}.expand-leave{overflow:hidden}.expand-leave-active{-webkit-transition:all .2s ease-out;transition:all .2s ease-out}.expand-leave-active>*{-webkit-animation-name:expandOutWithFade;animation-name:expandOutWithFade;-webkit-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.23,1,.32,1);animation-timing-function:cubic-bezier(.23,1,.32,1);-webkit-animation-fill-mode:"forwards";animation-fill-mode:"forwards";-webkit-backface-visibility:hidden;backface-visibility:hidden}.next-overlay-wrapper .next-overlay-inner{z-index:1001}.next-overlay-wrapper .next-overlay-backdrop{position:fixed;z-index:1001;top:0;left:0;width:100%;height:100%;background:#000;-webkit-transition:opacity .3s ease;transition:opacity .3s ease;opacity:0}.next-overlay-wrapper.opened .next-overlay-backdrop{opacity:.3}.next-loading-fusion-reactor[dir=rtl]{-webkit-animation-name:nextVectorRouteRTL;animation-name:nextVectorRouteRTL}@-webkit-keyframes nextVectorRouteRTL{0%{-webkit-transform:rotate(0deg);-ms-transform:rotate(0deg);transform:rotate(0deg)}5%{-webkit-transform:rotate(-90deg);-ms-transform:rotate(-90deg);transform:rotate(-90deg)}25%{-webkit-transform:rotate(-90deg);-ms-transform:rotate(-90deg);transform:rotate(-90deg)}30%{-webkit-transform:rotate(-180deg);-ms-transform:rotate(-180deg);transform:rotate(-180deg)}50%{-webkit-transform:rotate(-180deg);-ms-transform:rotate(-180deg);transform:rotate(-180deg)}55%{-webkit-transform:rotate(-270deg);-ms-transform:rotate(-270deg);transform:rotate(-270deg)}75%{-webkit-transform:rotate(-270deg);-ms-transform:rotate(-270deg);transform:rotate(-270deg)}80%{-webkit-transform:rotate(-1turn);-ms-transform:rotate(-1turn);transform:rotate(-1turn)}to{-webkit-transform:rotate(-1turn);-ms-transform:rotate(-1turn);transform:rotate(-1turn)}}@keyframes nextVectorRouteRTL{0%{-webkit-transform:rotate(0deg);-ms-transform:rotate(0deg);transform:rotate(0deg)}5%{-webkit-transform:rotate(-90deg);-ms-transform:rotate(-90deg);transform:rotate(-90deg)}25%{-webkit-transform:rotate(-90deg);-ms-transform:rotate(-90deg);transform:rotate(-90deg)}30%{-webkit-transform:rotate(-180deg);-ms-transform:rotate(-180deg);transform:rotate(-180deg)}50%{-webkit-transform:rotate(-180deg);-ms-transform:rotate(-180deg);transform:rotate(-180deg)}55%{-webkit-transform:rotate(-270deg);-ms-transform:rotate(-270deg);transform:rotate(-270deg)}75%{-webkit-transform:rotate(-270deg);-ms-transform:rotate(-270deg);transform:rotate(-270deg)}80%{-webkit-transform:rotate(-1turn);-ms-transform:rotate(-1turn);transform:rotate(-1turn)}to{-webkit-transform:rotate(-1turn);-ms-transform:rotate(-1turn);transform:rotate(-1turn)}}.next-loading{position:relative}.next-loading.next-open{pointer-events:none}.next-loading .next-loading-component{opacity:.7;-webkit-filter:blur(1px);filter:blur(1px);-webkit-filter:"progid:DXImageTransform.Microsoft.Blur(PixelRadius=1, MakeShadow=false)";filter:"progid:DXImageTransform.Microsoft.Blur(PixelRadius=1, MakeShadow=false)";position:relative;pointer-events:none}.next-loading-masker{position:absolute;top:0;bottom:0;left:0;right:0;z-index:99;opacity:.2;background:#fff}.next-loading-inline{display:inline-block}.next-loading-tip{display:block;position:absolute;top:50%;left:50%;z-index:4;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);text-align:center}.next-loading-tip-fullscreen{top:inherit;left:inherit;-webkit-transform:inherit;-ms-transform:inherit;transform:inherit}.next-loading-tip-placeholder{display:none}.next-loading-right-tip .next-loading-indicator{display:inline-block}.next-loading-right-tip .next-loading-tip-content{position:absolute;display:block;top:50%;right:0;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.next-loading-right-tip .next-loading-tip-placeholder{display:inline-block;visibility:hidden;margin-left:1em}.next-loading-fusion-reactor{display:inline-block;width:48px;height:48px;position:relative;margin:0;-webkit-animation-duration:5.6s;animation-duration:5.6s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-timing-function:linear;animation-timing-function:linear;-webkit-animation-name:nextVectorRoute;animation-name:nextVectorRoute}.next-loading-fusion-reactor .next-loading-dot{position:absolute;margin:auto;width:12px;height:12px;border-radius:50%;background:#f60;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-duration:1.4s;animation-duration:1.4s}.next-loading-fusion-reactor .next-loading-dot:first-child{top:0;bottom:0;left:0;-webkit-animation-name:nextVectorDotsX;animation-name:nextVectorDotsX}.next-loading-fusion-reactor .next-loading-dot:nth-child(2){left:0;right:0;top:0;opacity:.8;-webkit-animation-name:nextVectorDotsY;animation-name:nextVectorDotsY}.next-loading-fusion-reactor .next-loading-dot:nth-child(3){top:0;bottom:0;right:0;opacity:.6;-webkit-animation-name:nextVectorDotsXR;animation-name:nextVectorDotsXR}.next-loading-fusion-reactor .next-loading-dot:nth-child(4){left:0;right:0;bottom:0;opacity:.2;-webkit-animation-name:nextVectorDotsYR;animation-name:nextVectorDotsYR}.next-loading-medium-fusion-reactor{width:32px;height:32px}.next-loading-medium-fusion-reactor .next-loading-dot{width:8px;height:8px}.next-loading-medium-fusion-reactor .next-loading-dot:first-child{-webkit-animation-name:nextVectorDotsX-medium;animation-name:nextVectorDotsX-medium}.next-loading-medium-fusion-reactor .next-loading-dot:nth-child(2){-webkit-animation-name:nextVectorDotsY-medium;animation-name:nextVectorDotsY-medium}.next-loading-medium-fusion-reactor .next-loading-dot:nth-child(3){-webkit-animation-name:nextVectorDotsXR-medium;animation-name:nextVectorDotsXR-medium}.next-loading-medium-fusion-reactor .next-loading-dot:nth-child(4){-webkit-animation-name:nextVectorDotsYR-medium;animation-name:nextVectorDotsYR-medium}@-webkit-keyframes nextVectorRoute{0%{-webkit-transform:rotate(0deg);-ms-transform:rotate(0deg);transform:rotate(0deg)}5%{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}25%{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}30%{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}50%{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}55%{-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}75%{-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}80%{-webkit-transform:rotate(1turn);-ms-transform:rotate(1turn);transform:rotate(1turn)}to{-webkit-transform:rotate(1turn);-ms-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes nextVectorRoute{0%{-webkit-transform:rotate(0deg);-ms-transform:rotate(0deg);transform:rotate(0deg)}5%{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}25%{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}30%{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}50%{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}55%{-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}75%{-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}80%{-webkit-transform:rotate(1turn);-ms-transform:rotate(1turn);transform:rotate(1turn)}to{-webkit-transform:rotate(1turn);-ms-transform:rotate(1turn);transform:rotate(1turn)}}@-webkit-keyframes nextVectorDotsYR{25%{bottom:0}45%,50%{bottom:16.8px;height:14.4px;width:14.4px}90%{bottom:0;height:12px;width:12px}}@keyframes nextVectorDotsYR{25%{bottom:0}45%,50%{bottom:16.8px;height:14.4px;width:14.4px}90%{bottom:0;height:12px;width:12px}}@-webkit-keyframes nextVectorDotsY{25%{top:0}45%,50%{top:16.8px;height:14.4px;width:14.4px}90%{top:0;height:12px;width:12px}}@keyframes nextVectorDotsY{25%{top:0}45%,50%{top:16.8px;height:14.4px;width:14.4px}90%{top:0;height:12px;width:12px}}@-webkit-keyframes nextVectorDotsX{25%{left:0}45%,50%{left:16.8px;width:14.4px;height:14.4px}90%{left:0;height:12px;width:12px}}@keyframes nextVectorDotsX{25%{left:0}45%,50%{left:16.8px;width:14.4px;height:14.4px}90%{left:0;height:12px;width:12px}}@-webkit-keyframes nextVectorDotsXR{25%{right:0}45%,50%{right:16.8px;width:14.4px;height:14.4px}90%{right:0;height:12px;width:12px}}@keyframes nextVectorDotsXR{25%{right:0}45%,50%{right:16.8px;width:14.4px;height:14.4px}90%{right:0;height:12px;width:12px}}@-webkit-keyframes nextVectorDotsYR-medium{25%{bottom:0}45%,50%{bottom:11.2px;height:9.6px;width:9.6px}90%{bottom:0;height:8px;width:8px}}@keyframes nextVectorDotsYR-medium{25%{bottom:0}45%,50%{bottom:11.2px;height:9.6px;width:9.6px}90%{bottom:0;height:8px;width:8px}}@-webkit-keyframes nextVectorDotsY-medium{25%{top:0}45%,50%{top:11.2px;height:9.6px;width:9.6px}90%{top:0;height:8px;width:8px}}@keyframes nextVectorDotsY-medium{25%{top:0}45%,50%{top:11.2px;height:9.6px;width:9.6px}90%{top:0;height:8px;width:8px}}@-webkit-keyframes nextVectorDotsX-medium{25%{left:0}45%,50%{left:11.2px;width:9.6px;height:9.6px}90%{left:0;height:8px;width:8px}}@keyframes nextVectorDotsX-medium{25%{left:0}45%,50%{left:11.2px;width:9.6px;height:9.6px}90%{left:0;height:8px;width:8px}}@-webkit-keyframes nextVectorDotsXR-medium{25%{right:0}45%,50%{right:11.2px;width:9.6px;height:9.6px}90%{right:0;height:8px;width:8px}}@keyframes nextVectorDotsXR-medium{25%{right:0}45%,50%{right:11.2px;width:9.6px;height:9.6px}90%{right:0;height:8px;width:8px}}.next-sr-only{position:absolute;width:1px;height:1px;padding:0;clip:rect(0,0,0,0);white-space:nowrap;border:0;margin:-1px}.container-block,.next-sr-only{overflow:hidden}
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta http-equiv="x-ua-compatible" content="ie=edge,chrome=1">
<meta name="viewport" content="width=device-width">
<title>海外管理系统</title>
<link rel="shortcut icon" href="./favicon.png"><link href="./css\1.css" rel="stylesheet"><link href="./css\index.css" rel="stylesheet"></head>
<body>
<div id="ice-container"></div>
<script type="text/javascript" src="./vendors~index.90bbc091ff3d706d4ac7.js"></script><script type="text/javascript" src="./index.1158e86530440d84d73d.js"></script></body>
</html>
This source diff could not be displayed because it is too large. You can view the blob instead.
export const Platforms = [
{
"id": 1,
"name": "PC",
},
{
"id": 2,
"name": "安卓",
},
{
"id": 3,
"name": "iOS",
},
{
"id": 4,
"name": "H5",
},
{
"id": 5,
"name": "微信小游戏",
}
];
import { Action, Store } from 'marine';
Action.def('global', {
'getProjectId': (action, data) => {
action.emit({
channel:'projectIdSave',
data: data
});
}
});
const areaCode = [{"cn":"阿富汗","en":"Afghanistan","phone_code":"+93"},
{"cn":"阿尔巴尼亚","en":"Albania","phone_code":"+355"},
{"cn":"阿尔及利亚","en":"Algeria","phone_code":"+213"},
{"cn":"美属萨摩亚","en":"American Samoa","phone_code":"+684"},
{"cn":"安道尔","en":"Andorra","phone_code":"+376"},
{"cn":"安哥拉","en":"Angola","phone_code":"+244"},
{"cn":"安圭拉","en":"Anguilla","phone_code":"+1264"},
{"cn":"南极洲","en":"Antarctica","phone_code":"+672"},
{"cn":"安提瓜和巴布达","en":"Antigua and Barbuda","phone_code":"+1268"},
{"cn":"阿根廷","en":"Argentina","phone_code":"+54"},
{"cn":"亚美尼亚","en":"Armenia","phone_code":"+374"},
{"cn":"阿鲁巴","en":"Aruba","phone_code":"+297"},
{"cn":"澳大利亚","en":"Australia","phone_code":"+61"},
{"cn":"奥地利","en":"Austria","phone_code":"+43"},
{"cn":"阿塞拜疆","en":"Azerbaijan","phone_code":"+994"},
{"cn":"巴林","en":"Bahrain","phone_code":"+973"},
{"cn":"孟加拉国","en":"Bangladesh","phone_code":"+880"},
{"cn":"巴巴多斯","en":"Barbados","phone_code":"+1246"},
{"cn":"白俄罗斯","en":"Belarus","phone_code":"+375"},
{"cn":"比利时","en":"Belgium","phone_code":"+32"},
{"cn":"伯利兹","en":"Belize","phone_code":"+501"},
{"cn":"贝宁","en":"Benin","phone_code":"+229"},
{"cn":"百慕大","en":"Bermuda","phone_code":"+1441"},
{"cn":"不丹","en":"Bhutan","phone_code":"+975"},
{"cn":"玻利维亚","en":"Bolivia","phone_code":"+591"},
{"cn":"波黑","en":"Bosnia and Herzegovina","phone_code":"+387"},
{"cn":"博茨瓦纳","en":"Botswana","phone_code":"+267"},
{"cn":"巴西","en":"Brazil","phone_code":"+55"},
{"cn":"英属维尔京群岛","en":"British Virgin Islands","phone_code":"+1284"},
{"cn":"文莱","en":"Brunei Darussalam","phone_code":"+673"},
{"cn":"保加利亚","en":"Bulgaria","phone_code":"+359"},
{"cn":"布基纳法索","en":"Burkina Faso","phone_code":"+226"},
{"cn":"缅甸","en":"Burma","phone_code":"+95"},
{"cn":"布隆迪","en":"Burundi","phone_code":"+257"},
{"cn":"柬埔寨","en":"Cambodia","phone_code":"+855"},
{"cn":"喀麦隆","en":"Cameroon","phone_code":"+237"},
{"cn":"加拿大","en":"Canada","phone_code":"+1"},
{"cn":"佛得角","en":"Cape Verde","phone_code":"+238"},
{"cn":"开曼群岛","en":"Cayman Islands","phone_code":"+1345"},
{"cn":"中非","en":"Central African Republic","phone_code":"+236"},
{"cn":"乍得","en":"Chad","phone_code":"+235"},
{"cn":"智利","en":"Chile","phone_code":"+56"},
{"cn":"中国","en":"China","phone_code":"+86"},
{"cn":"圣诞岛","en":"Christmas Island","phone_code":"+61"},
{"cn":"科科斯(基林)群岛","en":"Cocos (Keeling) Islands","phone_code":"+61"},
{"cn":"哥伦比亚","en":"Colombia","phone_code":"+57"},
{"cn":"科摩罗","en":"Comoros","phone_code":"+269"},
{"cn":"刚果(金)","en":"Democratic Republic of the Congo","phone_code":"+243"},
{"cn":"刚果(布)","en":"Republic of the Congo","phone_code":"+242"},
{"cn":"库克群岛","en":"Cook Islands","phone_code":"+682"},
{"cn":"哥斯达黎加","en":"Costa Rica","phone_code":"+506"},
{"cn":"科特迪瓦","en":"Cote d'Ivoire","phone_code":"+225"},
{"cn":"克罗地亚","en":"Croatia","phone_code":"+385"},
{"cn":"古巴","en":"Cuba","phone_code":"+53"},
{"cn":"塞浦路斯","en":"Cyprus","phone_code":"+357"},
{"cn":"捷克","en":"Czech Republic","phone_code":"+420"},
{"cn":"丹麦","en":"Denmark","phone_code":"+45"},
{"cn":"吉布提","en":"Djibouti","phone_code":"+253"},
{"cn":"多米尼克","en":"Dominica","phone_code":"+1767"},
{"cn":"多米尼加","en":"Dominican Republic","phone_code":"+1809"},
{"cn":"厄瓜多尔","en":"Ecuador","phone_code":"+593"},
{"cn":"埃及","en":"Egypt","phone_code":"+20"},
{"cn":"萨尔瓦多","en":"El Salvador","phone_code":"+503"},
{"cn":"赤道几内亚","en":"Equatorial Guinea","phone_code":"+240"},
{"cn":"厄立特里亚","en":"Eritrea","phone_code":"+291"},
{"cn":"爱沙尼亚","en":"Estonia","phone_code":"+372"},
{"cn":"埃塞俄比亚","en":"Ethiopia","phone_code":"+251"},
{"cn":"福克兰群岛(马尔维纳斯)","en":"Falkland Islands (Islas Malvinas)","phone_code":"+500"},
{"cn":"法罗群岛","en":"Faroe Islands","phone_code":"+298"},
{"cn":"斐济","en":"Fiji","phone_code":"+679"},
{"cn":"芬兰","en":"Finland","phone_code":"+358"},
{"cn":"法国","en":"France","phone_code":"+33"},
{"cn":"法属圭亚那","en":"French Guiana","phone_code":"+594"},
{"cn":"法属波利尼西亚","en":"French Polynesia","phone_code":"+689"},
{"cn":"加蓬","en":"Gabon","phone_code":"+241"},
{"cn":"格鲁吉亚","en":"Georgia","phone_code":"+995"},
{"cn":"德国","en":"Germany","phone_code":"+49"},
{"cn":"加纳","en":"Ghana","phone_code":"+233"},
{"cn":"直布罗陀","en":"Gibraltar","phone_code":"+350"},
{"cn":"希腊","en":"Greece","phone_code":"+30"},
{"cn":"格陵兰","en":"Greenland","phone_code":"+299"},
{"cn":"格林纳达","en":"Grenada","phone_code":"+1473"},
{"cn":"瓜德罗普","en":"Guadeloupe","phone_code":"+590"},
{"cn":"关岛","en":"Guam","phone_code":"+1671"},
{"cn":"危地马拉","en":"Guatemala","phone_code":"+502"},
{"cn":"根西岛","en":"Guernsey","phone_code":"+1481"},
{"cn":"几内亚","en":"Guinea","phone_code":"+224"},
{"cn":"几内亚比绍","en":"Guinea-Bissau","phone_code":"+245"},
{"cn":"圭亚那","en":"Guyana","phone_code":"+592"},
{"cn":"海地","en":"Haiti","phone_code":"+509"},
{"cn":"梵蒂冈","en":"Holy See (Vatican City)","phone_code":"+379"},
{"cn":"洪都拉斯","en":"Honduras","phone_code":"+504"},
{"cn":"香港","en":"Hong Kong (SAR)","phone_code":"+852"},
{"cn":"匈牙利","en":"Hungary","phone_code":"+36"},
{"cn":"冰岛","en":"Iceland","phone_code":"+354"},
{"cn":"印度","en":"India","phone_code":"+91"},
{"cn":"印度尼西亚","en":"Indonesia","phone_code":"+62"},
{"cn":"伊朗","en":"Iran","phone_code":"+98"},
{"cn":"伊拉克","en":"Iraq","phone_code":"+964"},
{"cn":"爱尔兰","en":"Ireland","phone_code":"+353"},
{"cn":"以色列","en":"Israel","phone_code":"+972"},
{"cn":"意大利","en":"Italy","phone_code":"+39"},
{"cn":"牙买加","en":"Jamaica","phone_code":"+1876"},
{"cn":"日本","en":"Japan","phone_code":"+81"},
{"cn":"约旦","en":"Jordan","phone_code":"+962"},
{"cn":"哈萨克斯坦","en":"Kazakhstan","phone_code":"+73"},
{"cn":"肯尼亚","en":"Kenya","phone_code":"+254"},
{"cn":"基里巴斯","en":"Kiribati","phone_code":"+686"},
{"cn":"朝鲜","en":"North Korea","phone_code":"+850"},
{"cn":"韩国","en":"South Korea","phone_code":"+82"},
{"cn":"科威特","en":"Kuwait","phone_code":"+965"},
{"cn":"吉尔吉斯斯坦","en":"Kyrgyzstan","phone_code":"+996"},
{"cn":"老挝","en":"Laos","phone_code":"+856"},
{"cn":"拉脱维亚","en":"Latvia","phone_code":"+371"},
{"cn":"黎巴嫩","en":"Lebanon","phone_code":"+961"},
{"cn":"莱索托","en":"Lesotho","phone_code":"+266"},
{"cn":"利比里亚","en":"Liberia","phone_code":"+231"},
{"cn":"利比亚","en":"Libya","phone_code":"+218"},
{"cn":"列支敦士登","en":"Liechtenstein","phone_code":"+423"},
{"cn":"立陶宛","en":"Lithuania","phone_code":"+370"},
{"cn":"卢森堡","en":"Luxembourg","phone_code":"+352"},
{"cn":"澳门","en":"Macao","phone_code":"+853"},
{"cn":"前南马其顿","en":"The Former Yugoslav Republic of Macedonia","phone_code":"+389"},
{"cn":"马达加斯加","en":"Madagascar","phone_code":"+261"},
{"cn":"马拉维","en":"Malawi","phone_code":"+265"},
{"cn":"马来西亚","en":"Malaysia","phone_code":"+60"},
{"cn":"马尔代夫","en":"Maldives","phone_code":"+960"},
{"cn":"马里","en":"Mali","phone_code":"+223"},
{"cn":"马耳他","en":"Malta","phone_code":"+356"},
{"cn":"马绍尔群岛","en":"Marshall Islands","phone_code":"+692"},
{"cn":"马提尼克","en":"Martinique","phone_code":"+596"},
{"cn":"毛里塔尼亚","en":"Mauritania","phone_code":"+222"},
{"cn":"毛里求斯","en":"Mauritius","phone_code":"+230"},
{"cn":"马约特","en":"Mayotte","phone_code":"+269"},
{"cn":"墨西哥","en":"Mexico","phone_code":"+52"},
{"cn":"密克罗尼西亚","en":"Federated States of Micronesia","phone_code":"+691"},
{"cn":"摩尔多瓦","en":"Moldova","phone_code":"+373"},
{"cn":"摩纳哥","en":"Monaco","phone_code":"+377"},
{"cn":"蒙古","en":"Mongolia","phone_code":"+976"},
{"cn":"蒙特塞拉特","en":"Montserrat","phone_code":"+1664"},
{"cn":"摩洛哥","en":"Morocco","phone_code":"+212"},
{"cn":"莫桑比克","en":"Mozambique","phone_code":"+258"},
{"cn":"纳米尼亚","en":"Namibia","phone_code":"+264"},
{"cn":"瑙鲁","en":"Nauru","phone_code":"+674"},
{"cn":"尼泊尔","en":"Nepal","phone_code":"+977"},
{"cn":"荷兰","en":"Netherlands","phone_code":"+31"},
{"cn":"荷属安的列斯","en":"Netherlands Antilles","phone_code":"+599"},
{"cn":"新喀里多尼亚","en":"New Caledonia","phone_code":"+687"},
{"cn":"新西兰","en":"New Zealand","phone_code":"+64"},
{"cn":"尼加拉瓜","en":"Nicaragua","phone_code":"+505"},
{"cn":"尼日尔","en":"Niger","phone_code":"+227"},
{"cn":"尼日利亚","en":"Nigeria","phone_code":"+234"},
{"cn":"纽埃","en":"Niue","phone_code":"+683"},
{"cn":"诺福克岛","en":"Norfolk Island","phone_code":"+6723"},
{"cn":"北马里亚纳","en":"Northern Mariana Islands","phone_code":"+1"},
{"cn":"挪威","en":"Norway","phone_code":"+47"},
{"cn":"阿曼","en":"Oman","phone_code":"+968"},
{"cn":"巴基斯坦","en":"Pakistan","phone_code":"+92"},
{"cn":"帕劳","en":"Palau","phone_code":"+680"},
{"cn":"巴拿马","en":"Panama","phone_code":"+507"},
{"cn":"巴布亚新几内亚","en":"Papua New Guinea","phone_code":"+675"},
{"cn":"巴拉圭","en":"Paraguay","phone_code":"+595"},
{"cn":"秘鲁","en":"Peru","phone_code":"+51"},
{"cn":"菲律宾","en":"Philippines","phone_code":"+63"},
{"cn":"波兰","en":"Poland","phone_code":"+48"},
{"cn":"葡萄牙","en":"Portugal","phone_code":"+351"},
{"cn":"波多黎各","en":"Puerto Rico","phone_code":"+1809"},
{"cn":"卡塔尔","en":"Qatar","phone_code":"+974"},
{"cn":"留尼汪","en":"Reunion","phone_code":"+262"},
{"cn":"罗马尼亚","en":"Romania","phone_code":"+40"},
{"cn":"俄罗斯","en":"Russia","phone_code":"+7"},
{"cn":"卢旺达","en":"Rwanda","phone_code":"+250"},
{"cn":"圣赫勒拿","en":"Saint Helena","phone_code":"+290"},
{"cn":"圣基茨和尼维斯","en":"Saint Kitts and Nevis","phone_code":"+1869"},
{"cn":"圣卢西亚","en":"Saint Lucia","phone_code":"+1758"},
{"cn":"圣皮埃尔和密克隆","en":"Saint Pierre and Miquelon","phone_code":"+508"},
{"cn":"圣文森特和格林纳丁斯","en":"Saint Vincent and the Grenadines","phone_code":"+1784"},
{"cn":"萨摩亚","en":"Samoa","phone_code":"+685"},
{"cn":"圣马力诺","en":"San Marino","phone_code":"+378"},
{"cn":"圣多美和普林西比","en":"Sao Tome and Principe","phone_code":"+239"},
{"cn":"沙特阿拉伯","en":"Saudi Arabia","phone_code":"+966"},
{"cn":"塞内加尔","en":"Senegal","phone_code":"+221"},
{"cn":"塞尔维亚和黑山","en":"Serbia and Montenegro","phone_code":"+381"},
{"cn":"塞舌尔","en":"Seychelles","phone_code":"+248"},
{"cn":"塞拉利","en":"Sierra Leone","phone_code":"+232"},
{"cn":"新加坡","en":"Singapore","phone_code":"+65"},
{"cn":"斯洛伐克","en":"Slovakia","phone_code":"+421"},
{"cn":"斯洛文尼亚","en":"Slovenia","phone_code":"+386"},
{"cn":"所罗门群岛","en":"Solomon Islands","phone_code":"+677"},
{"cn":"索马里","en":"Somalia","phone_code":"+252"},
{"cn":"南非","en":"South Africa","phone_code":"+27"},
{"cn":"西班牙","en":"Spain","phone_code":"+34"},
{"cn":"斯里兰卡","en":"Sri Lanka","phone_code":"+94"},
{"cn":"苏丹","en":"Sudan","phone_code":"+249"},
{"cn":"苏里南","en":"Suriname","phone_code":"+597"},
{"cn":"斯瓦尔巴岛和扬马延岛","en":"Svalbard","phone_code":"+47"},
{"cn":"斯威士兰","en":"Swaziland","phone_code":"+268"},
{"cn":"瑞典","en":"Sweden","phone_code":"+46"},
{"cn":"瑞士","en":"Switzerland","phone_code":"+41"},
{"cn":"叙利亚","en":"Syria","phone_code":"+963"},
{"cn":"台湾","en":"Taiwan","phone_code":"+886"},
{"cn":"塔吉克斯坦","en":"Tajikistan","phone_code":"+992"},
{"cn":"坦桑尼亚","en":"Tanzania","phone_code":"+255"},
{"cn":"泰国","en":"Thailand","phone_code":"+66"},
{"cn":"巴哈马","en":"The Bahamas","phone_code":"+1242"},
{"cn":"冈比亚","en":"The Gambia","phone_code":"+220"},
{"cn":"多哥","en":"Togo","phone_code":"+228"},
{"cn":"托克劳","en":"Tokelau","phone_code":"+690"},
{"cn":"汤加","en":"Tonga","phone_code":"+676"},
{"cn":"特立尼达和多巴哥","en":"Trinidad and Tobago","phone_code":"+1868"},
{"cn":"突尼斯","en":"Tunisia","phone_code":"+216"},
{"cn":"土耳其","en":"Turkey","phone_code":"+90"},
{"cn":"土库曼斯坦","en":"Turkmenistan","phone_code":"+993"},
{"cn":"特克斯和凯科斯群岛","en":"Turks and Caicos Islands","phone_code":"+1649"},
{"cn":"图瓦卢","en":"Tuvalu","phone_code":"+688"},
{"cn":"乌干达","en":"Uganda","phone_code":"+256"},
{"cn":"乌克兰","en":"Ukraine","phone_code":"+380"},
{"cn":"阿拉伯联合酋长国","en":"United Arab Emirates","phone_code":"+971"},
{"cn":"英国","en":"United Kingdom","phone_code":"+44"},
{"cn":"美国","en":"United States","phone_code":"+1"},
{"cn":"乌拉圭","en":"Uruguay","phone_code":"+598"},
{"cn":"乌兹别克斯坦","en":"Uzbekistan","phone_code":"+998"},
{"cn":"瓦努阿图","en":"Vanuatu","phone_code":"+678"},
{"cn":"委内瑞拉","en":"Venezuela","phone_code":"+58"},
{"cn":"越南","en":"Vietnam","phone_code":"+84"},
{"cn":"美属维尔京群岛","en":"Virgin Islands","phone_code":"+1340"},
{"cn":"瓦利斯和富图纳","en":"Wallis and Futuna","phone_code":"+681"},
{"cn":"也门","en":"Yemen","phone_code":"+967"},
{"cn":"赞比亚","en":"Zambia","phone_code":"+260"},
{"cn":"津巴布韦","en":"Zimbabwe","phone_code":"+263"}]
export default areaCode
import React, {Component, Fragment} from 'react';
import {withRouter} from "react-router-dom";
import {Button} from "antd";
import { get } from "../../service/Global";
import './ItemAppInfo.scss'
@withRouter
export default class ItemAppInfo extends Component {
constructor(props) {
super(props)
this.state = {
a: '',
}
}
componentWillMount() {
this.setState({
a: get('readonly')
})
}
eidtApp = (id) => {
console.log(id);
this.props.history.push({
pathname:'/app/edit',
state:{
appid:id,
},
})
};
render() {
console.log(this.props.app_info);
return (
<Fragment>
<div className="app-info-group">
<img src={this.props.app_info.icon ? this.props.app_info.icon : null} alt={this.props.app_info.name}/>
<div className="app-text ctm-left">
<p className="name">{this.props.app_info.name}</p>
<ul>
<li>运营平台:<span>{this.props.app_info.operator_name}</span></li>
<li>官网:<span>{this.props.app_info.website}</span></li>
<li>H5应用地址:<span>{this.props.app_info.website_h5}</span></li>
{
this.props.app_info.platform_name ?
<Fragment>
<li>应用平台:<span>{this.props.app_info.platform_name}</span></li>
<li>应用ID:<span>{this.props.app_info.appid}</span></li>
</Fragment>
:
null
}
</ul>
</div>
{
this.props.app_info.platform_name ?
null
:
<div className="btn-edit ctm-right">
<Button type="normal" onClick={() => this.eidtApp(this.props.app_info.id)} disabled={this.state.a == 1 ? true : false}>编辑</Button>
</div>
}
</div>
</Fragment>
)
}
}
.app-info-group{
@include clearfix;
img{
width: 150px;
height: 150px;
border-radius: 4px;
float: left;
}
.app-text{
margin-left: 30px;
>.name{
font-size: 24px;
color: #404040;
}
ul{
width: 460px;
>li{
width: 50%;
float: left;
font-size: 14px;
color: #404040;
margin-top: 16px;
}
}
}
}
import ItemAppInfo from './ItemAppInfo'
export default ItemAppInfo;
import React,{Fragment} from 'react';
import UnitInput from './components/UnitInput'
import UnitModal from './components/UnitModal'
import './ItemCard.scss'
export default class ItemCard extends React.Component{
constructor(props){
super(props)
}
render() {
return(
<ul className="item-card ctm-clearfix">
{
this.props.columns.map((item,index)=>{
if(item === {}){
return <li key={index}></li>
}
if(item.type === 'input'){
return <Fragment>
<li key={index}>
<ul>
<li>{item.title}</li>
<li>
<UnitInput value={this.props.res[item.dataIndex]} config={item}/>
</li>
</ul>
</li>
</Fragment>
}else if(item.type === 'modal'){
return <Fragment>
<li key={index}>
<ul>
<li>{item.title}</li>
<li><UnitModal value={this.props.res} config={item}/></li>
</ul>
</li>
</Fragment>
}else if(item.render){
return <Fragment>
<li key={index}>
<ul>
<li>{item.title}</li>
<li>{item.render(this.props.res[item.dataIndex])}</li>
</ul>
</li>
</Fragment>
} else {
return <Fragment>
<li key={index}>
<ul>
<li>{item.title}</li>
<li>{this.props.res[item.dataIndex]||undefined}</li>
</ul>
</li>
</Fragment>
}
})
}
</ul>
)
}
}
.item-card{
padding: 20px;
width: 100%;
>li:nth-child(4n+1),>li:nth-child(4n+2){
background-color: #F7F9FA;
}
>li{
width: 50%;
float: left;
height: 50px;
border-bottom: 1px solid #ebedee;
border-right: 1px solid #ebedee;
>ul{
float: left;
width: 100%;
li{
float: left;
line-height: 50px;
padding-left: 20px;
}
li:first-child{
width: 23%;
}
li:last-child{
width: 77%;
}
}
}
}
import React,{Fragment} from 'react';
import {Button, Icon, Input, message, Popconfirm} from 'antd';
export default class UnitInput extends React.Component{
constructor(props){
super(props);
this.state={
value:undefined,
editStatus:false
}
}
inputVal;
editStatusToggle=(boolean)=>{
this.setState({
editStatus:boolean
})
}
save=()=>{
if(this.props.config.pattern.test(this.inputVal)){
this.setState({
value:this.inputVal,
editStatus:false,
});
this.props.config.getOutput(this.inputVal);
}else {
message.error('输入有误')
}
};
cancel=()=>{
this.setState({
defaultValue:this.state.value,
editStatus:false
})
};
componentDidMount() {
this.setState({
value : this.props.value
})
}
getValue=(e)=>{
this.inputVal = e.target.value
};
render() {
return(
<Fragment>
{
(()=>{
if(!this.state.editStatus){
return <span>{this.state.value} <Icon onClick={()=>this.editStatusToggle(true)} type="edit" /> <i className="ml-20" style={{fontSize:'12px'}}>{this.props.config.tips}</i>
{
(()=>{
if(this.props.config.removeBd){
return <Popconfirm title="确定解绑?" okText="是" onConfirm={this.props.config.removeBd} cancelText="否"><a className='ml-20'>解绑</a></Popconfirm>
}
})()
}
</span>
}else {
return <div>
<Input style={{width:'34%'}} placeholder={this.props.placeholder||'请输入...'} onChange={this.getValue} defaultValue={this.state.value}/>
<a className="ml-10 mr-10" onClick={this.save}>保存</a>
<a onClick={this.cancel}>取消</a>
<i className="ml-20" style={{fontSize:'12px'}}>{this.props.config.tips}</i>
</div>
}
})()
}
</Fragment>
)
}
}
import UnitInput from './UnitInput'
export default UnitInput
import React,{Fragment} from 'react';
import {Icon, Tag} from 'antd';
import ItemModal from '../../../../components/ItemModal'
export default class UnitModal extends React.Component{
constructor(props){
super(props);
this.state={
value:{status:undefined},
config:{
title:'用户状态修改',
render:[
{
type:'select',
label:'状态',
key: 'status',
data:[{name:'正常',id:0},{name:'黑名单',id:1}],
required:true,
},
{
type:'textarea',
label:'修改原因',
key: 'remark',
required:true,
}
],
dataSource:{}
},
}
}
modal;
editStatusToggle=()=>{
this.modal.showModal();
};
componentDidMount() {
this.setState({
value:this.props.value,
config:Object.assign(this.state.config,{dataSource:this.props.value},{...this.props.config})
})
}
componentWillReceiveProps(nextProps, nextContext) {
this.setState({
value:nextProps.value,
config:Object.assign(this.state.config,{dataSource:nextProps.value},{...this.props.config})
})
}
render() {
return(
<Fragment>
<span>
{
(()=>{
switch (this.state.value.status) {
case 1:
return <Tag color="#404040">黑名单</Tag>;
case 0:
return <Tag color="#9AD680">正常</Tag>;
}
})()
}
<Icon onClick={this.editStatusToggle} type="edit" />
</span>
<ItemModal ref={r=> this.modal =r} config={this.state.config}/>
</Fragment>
)
}
}
import UnitModal from './UnitModal'
export default UnitModal
import ItemCard from './ItemCard'
export default ItemCard
import React, { Component, Fragment } from "react";
import {
Form,
Select,
Input,
Radio,
Button,
Checkbox,
Row,
Col,
Switch,
message,
InputNumber,
Modal
} from "antd";
import ItemUpload from "./components/ItemUpload/ItemUpload";
import ItemRadioSelect from "./components/ItemRadioSelect/ItemRadioSelect";
import ItemSelectPlus from "./components/ItemSelectPlus";
import ItemLoginMethod from "./components/ItemLoginMethod";
import ItemFunctionSwitches from "./components/ItemFunctionSwitches";
import ItemProductList from "./components/ItemProductList";
const { Option } = Select;
const { TextArea } = Input;
const { confirm } = Modal;
class FormTpl extends Component {
constructor(props) {
super(props);
}
formItemLayout;
handleSubmit = (e) => {
e.preventDefault();
this.props.form.validateFields((errs, values) => {
// product_list = product_list.filter(element => element.price && element.product_id);
// values.product_list = product_list;
if (errs) {
for(let i in errs){
if(errs[i].errors){
errs[i].errors.forEach(e => message.error(e.message) )
}
return
}
}else{
let product_list = values.product_list;
if(product_list && product_list.length > 0){
let content = "请填写完整";
product_list.forEach((element)=>{
if(!element.price && element.product_id) {
content = content + element.product_id + ":";
}else if(!element.product_id && element.price) {
content = content + ":" + element.price;
} else if(!element.price && !element.product_id) {
content = content + ":";
}
})
let flag = product_list.some((element)=>{
return !element.price || !element.product_id;
})
if(flag){
this.showConfirm(content);
return;
}
}
this.props.getReqParams(values);
}
});
};
showConfirm = (contentStr) => {
confirm({
title: '提示',
content: contentStr,
onOk() {
return new Promise((resolve, reject) => {
setTimeout(Math.random() > 0.5 ? resolve : reject, 1000);
}).catch(() => console.log('Oops errors!'));
},
onCancel() {},
});
}
handleReset = () => {
this.props.form.resetFields();
};
normFile = e => {
console.log("Upload event:", e);
if (Array.isArray(e)) {
return e;
}
return e && e.fileList;
};
render() {
const { getFieldDecorator } = this.props.form;
const radioLayout = {
labelCol: {
xs: { span: 5 },
sm: { span: 5 }
},
wrapperCol: {
xs: { span: 12 },
sm: { span: 12 }
}
};
if (!this.props.formItemLayout) {
this.formItemLayout = {
labelCol: {
xs: { span: 5 },
sm: { span: 5 }
},
wrapperCol: {
xs: { span: 16 },
sm: { span: 16 }
}
};
} else {
this.formItemLayout = this.props.formItemLayout;
}
return (
<Form onSubmit={this.handleSubmit}>
{this.props.config.map((item, i) => {
switch (item.type) {
case "input":
return (
<Form.Item
key={i}
{...this.formItemLayout}
label={item.label}
className="mr-20"
>
{getFieldDecorator(item.key, {
initialValue: this.props.dataSource ? this.props.dataSource[item.key] : undefined,
rules: [
{
required: item.required,
message: "缺少" + item.label
}
]
})(
<Input
placeholder={item.placeholder}
disabled={item.disabled || false}
readOnly={item.readOnly || false}
/>
)}
{(() => {
if (!!item.explain) {
return <p>{item.explain}</p>;
} else {
return null;
}
})()}
</Form.Item>
);
case "password":
return (
<Form.Item
key={i}
{...this.formItemLayout}
label={item.label}
className="mr-20"
>
{getFieldDecorator(item.key, {
initialValue: this.props.dataSource ? this.props.dataSource[item.key] : undefined,
rules: [
{
required: item.required,
message: "缺少" + item.label
}
]
})(
<Input.Password
placeholder={item.placeholder}
disabled={item.disabled || false}
readOnly={item.readOnly || false}
/>
)}
{(() => {
if (!!item.explain) {
return <p>{item.explain}</p>;
} else {
return null;
}
})()}
</Form.Item>
);
case "inputNumber":
return (
<Form.Item
key={i}
{...this.formItemLayout}
label={item.label}
className="mr-20"
>
{getFieldDecorator(item.key, {
initialValue: this.props.dataSource ? this.props.dataSource[item.key] : undefined,
rules: [
{
required: item.required,
message: "缺少" + item.label
}
]
})(
<InputNumber
placeholder={item.placeholder}
disabled={item.disabled || false}
readOnly={item.readOnly || false}
/>
)}
{(() => {
if (!!item.explain) {
return <p>{item.explain}</p>;
} else {
return null;
}
})()}
</Form.Item>
);
case "select":
return (
<Form.Item {...this.formItemLayout} label={item.label} key={i}>
{getFieldDecorator(item.key, {
initialValue: this.props.dataSource ? this.props.dataSource[item.key] : undefined,
rules: [{ required: item.required, message: item.error }]
})(
<Select
placeholder={item.placeholder}
onChange={item.onChange || undefined}
>
{item.data.map((data, index) => {
if (item.name_value_label) {
return <Option value={data.id}>{data.name} <i>{data.id}</i></Option>;
} else {
return <Option value={data.id}>{data.name}</Option>;
}
})}
</Select>
)}
{(() => {
if (!!item.explain) {
return <p>{item.explain}</p>;
} else {
return null;
}
})()}
</Form.Item>
);
case "select_multiple":
return (
<Form.Item {...item.formItemLayout || this.formItemLayout} label={item.label} key={i}>
{getFieldDecorator(item.key, {
initialValue: this.props.dataSource ? this.props.dataSource[item.key] : undefined,
rules: [{ required: item.required, message: item.error }]
})(
<Select
placeholder={item.placeholder}
onChange={item.onChange || undefined}
mode="multiple"
>
{
item.data.map((data, index) => {
return <Option value={data.id}>{data.name}</Option>;
})}
</Select>
)}
{(() => {
if (!!item.explain) {
return <p>{item.explain}</p>;
} else {
return null;
}
})()}
</Form.Item>
);
case "checkbox":
return (
<Form.Item label={item.label} {...radioLayout}
key={i}
>
{getFieldDecorator(item.key, {
initialValue: this.props.dataSource[item.key]
? this.props.dataSource[item.key]
: undefined,
rules: [
{
required: item.required,
message: "缺少" + item.label
}
]
})(
<Checkbox.Group
style={{ width: "100%", marginTop: "10px" }}
>
<Row>
{item.data.map((data, index) => {
if (!item.canAdd) {
if (this.props.dataSource && this.props.dataSource[item.key].indexOf(data.id) > -1) {
return (
<Col span={3}>
<Checkbox value={data.id}>
{data.name}
</Checkbox>
</Col>
);
} else {
return (
<Col span={3}>
<Checkbox value={data.id} disabled>
{data.name}
</Checkbox>
</Col>
);
}
} else {
if (
this.props.dataSource[
item.key
].initialValue.indexOf(data.id) > -1
) {
return (
<Col span={3}>
<Checkbox value={data.id} disabled>
{data.name}
</Checkbox>
</Col>
);
} else {
return (
<Col span={3}>
<Checkbox value={data.id}>
{data.name}
</Checkbox>
</Col>
);
}
}
})}
</Row>
</Checkbox.Group>
)}
</Form.Item>
);
case "radio":
return (
<Form.Item label={item.label} {...this.formItemLayout}
key={i}
>
{getFieldDecorator(item.key, {
initialValue: this.props.dataSource ? this.props.dataSource[item.key] : undefined,
rules: [
{
required: item.required,
message: "缺少" + item.label
}
]
})(
<Radio.Group onChange={item.onChange || undefined}>
{item.data.map((data, index) => {
return <Radio value={data.id}>{data.name}</Radio>;
})}
</Radio.Group>
)}
{(() => {
if (!!item.explain) {
return <p>{item.explain}</p>;
} else {
return null;
}
})()}
</Form.Item>
);
case "switch":
return (
<Form.Item label={item.label} {...this.formItemLayout}
key={i}
>
{getFieldDecorator(item.key, {
initialValue: this.props.dataSource ? this.props.dataSource[item.key] == 1 : false,
valuePropName: "checked", //https://github.com/ckinmind/antd-react-demo/issues/17
rules: [
{
required: item.required,
message: "缺少" + item.label
}
],
getValueFromEvent(e) {
return e === true ? 1 : 0;
}
})(<Switch />)}
</Form.Item>
);
case "upload":
return (
<Form.Item label={item.label} {...this.formItemLayout}
key={i}
>
{getFieldDecorator(item.key, {
initialValue: this.props.dataSource ? this.props.dataSource[item.key] : undefined,
rules: [
{
required: item.required,
message: "缺少" + item.label
}
],
})(
<ItemUpload />
)}
</Form.Item>
);
case "text":
return (
<Form.Item label={item.label} {...this.formItemLayout}
key={i}
>
{getFieldDecorator(item.key, {
initialValue:
this.props.dataSource[item.key] && item.translation_map
? item.translation_map[this.props.dataSource[item.key]]
: this.props.dataSource[item.key]
})(
<Input
placeholder={item.placeholder}
style={{
border: "none",
backgroundColor: "transparent",
color: "#565656"
}}
disabled
/>
)}
</Form.Item>
);
case "plain-text":
return (
<Form.Item label={item.label} {...this.formItemLayout}
key={i}
>
<span className="ant-form-text">
{this.props.dataSource[item.key] && item.translation_map
? item.translation_map[this.props.dataSource[item.key]]
: this.props.dataSource[item.key]}
</span>
</Form.Item>
);
case "icon":
return (
<Form.Item label={item.label} {...this.formItemLayout}
key={i}
>
{getFieldDecorator(item.key, {
initialValue: this.props.dataSource
? this.props.dataSource[item.key]
: null
})(
<Fragment>
<img
style={{ height: "100px" }}
src={
this.props.dataSource
? this.props.dataSource[item.key]
: null
}
alt=""
/>
</Fragment>
)}
</Form.Item>
);
case "textarea":
return (
<Form.Item {...this.formItemLayout} label={item.label}
key={i}
>
{getFieldDecorator(item.key, {
initialValue: this.props.dataSource ? this.props.dataSource[item.key] : undefined,
rules: [
{
required: item.required,
message: "缺少" + item.label
}
]
})(<TextArea rows={4} placeholder={item.placeholder} />)}
</Form.Item>
);
case "radio_select":
return (
<ItemRadioSelect form={this.props.form} dataSource={this.props.dataSource} item={item} formItemLayout={this.formItemLayout}
key={i}
/>
);
case "tpl":
return (
<Form.Item
key={i}
wrapperCol={{ offset: 4 }}>{item.render}</Form.Item>
);
case "origin":
return <Fragment
key={i}
>{item.render}</Fragment>;
case "select_plus":
return (
<ItemSelectPlus
key={i}
form={this.props.form}
item={item}
formItemLayout={this.formItemLayout}
getParams={this.props.getParams}
getRadioData={this.props.getRadioData}
/>
);
case "login_methods":
return (
<Form.Item
key={i}
{...this.formItemLayout}
label={item.label}
className="mr-20"
>
{getFieldDecorator(item.key, {
initialValue: this.props.dataSource[item.key] || [],
rules: [
{
validator: (rule, value, callback) => {
// if (value.length > 7) {
// callback("登录方式不可超过7种,请重新配置");
// return
// }
for (let item of value) {
if (item.type == 'guest' || item.type == 'account' ||item.type == 'citation') {
continue
}
let idPlaceholder = 'APP ID';
let secretPlaceholder = 'APP SECRET';
switch (item.type) {
case 'google':
idPlaceholder = 'Google_SERVER_CLIENT_ID';
break;
case 'facebook':
idPlaceholder = 'FACEBOOK_ID';
secretPlaceholder = 'FACEBOOK_KEY';
break;
case 'naver':
idPlaceholder = 'NV_clinet_ID';
secretPlaceholder = 'NV_clinet_SECRET';
break;
case 'line':
idPlaceholder = 'Channel ID';
secretPlaceholder = 'Channel Secret';
break;
case 'twitter':
idPlaceholder = 'Custom key';
secretPlaceholder = 'Custom Secret';
break
}
if (item.type != 'google' && item.type != 'apple'&& item.type != 'citation') {
if (!item.app_key) {
callback(item.name + idPlaceholder + '不能为空');
return
}
}
if (!item.app_id) {
callback(item.name + secretPlaceholder + '不能为空');
return
}
}
callback()
}
}
]
})(<ItemLoginMethod />)}
</Form.Item>
);
case "function_switches":
return (
// item.label.map((value, index)=>{
// return <Form.Item
// key={index}
// {...this.formItemLayout}
// label={value}
// >
// {getFieldDecorator(item.key, {
// initialValue: this.props.dataSource[item.key] || {}
// })(<ItemFunctionSwitches />)}
// </Form.Item>
// })
<Form.Item
key={i}
// {...this.formItemLayout}
// label={item.label[0]}
className="mr-20"
>
{getFieldDecorator(item.key, {
initialValue: this.props.dataSource[item.key] || {}
})(<ItemFunctionSwitches />)}
</Form.Item>
);
case "pay_switches":
return (
<Form.Item
key={i}
className="mr-20"
>
{getFieldDecorator(item.key, {
initialValue: this.props.dataSource[item.key] || {}
})(<ItemFunctionSwitches />)}
</Form.Item>
);
case "product_list":
return (
<Form.Item
key={i}
{...this.formItemLayout}
label={item.label}
className="mr-20"
>
{getFieldDecorator(item.key, {
initialValue: this.props.dataSource[item.key]
})(<ItemProductList />)}
</Form.Item>
);
case "submit":
return (
<Form.Item wrapperCol={{ span: 12, offset: 4 }}
key={i}
>
{(() => {
switch (item.extend) {
case true:
return item.render;
default:
return (
<Fragment>
<Button
type="primary"
htmlType="submit"
className="mr-20"
>
提交
</Button>
<Button onClick={this.handleReset}>重置</Button>
</Fragment>
);
}
})()}
</Form.Item>
);
}
})}
</Form>
);
}
}
const ItemForm = Form.create({ name: "validate_other" })(FormTpl);
export default ItemForm;
import React, { Fragment } from 'react'
import { Switch, Typography } from 'antd';
const { Text } = Typography;
export default class ItemFunctionSwitches extends React.Component {
constructor(props) {
super(props);
this.state = {
}
}
triggerChange = changedValue => {
const { onChange, value } = this.props;
if (onChange) {
onChange({
...value,
...changedValue,
});
}
}
componentDidMount() {
}
handleuUgradeAccountChange = (checked) => {
let data = {
switch_upgrade_account: checked === true ? 1 : 0,
}
this.triggerChange(data)
}
handleProtocolChange = (checked) => {
let data = {
switch_protocol: checked === true ? 1 : 0,
}
this.triggerChange(data)
}
handleuMycardChange = (checked) => {
let data = {
mycard: checked === true ? 1 : 0,
}
this.triggerChange(data)
}
handleRazerChange = (checked) => {
let data = {
razer: checked === true ? 1 : 0,
}
this.triggerChange(data)
}
render() {
let switch_upgrade_account = this.props.value.switch_upgrade_account || 0;
let switch_protocol = this.props.value.switch_protocol || 0;
let mycard = this.props.value.mycard || 0;
let razer = this.props.value.razer || 0;
let id = this.props.id.split('validate_other_')[1];
return (
<Fragment>
{(id==='function_switches') ? (<div><div>
<div className="ant-col ant-form-item-label ant-col-xs-5 ant-col-sm-5">账户升级:</div>
<div className="ant-col ant-form-item-control-wrapper ant-col-xs-16 ant-col-sm-16">
<Switch checkedChildren="启用" unCheckedChildren="禁用"
checked={switch_upgrade_account === 1} onChange={this.handleuUgradeAccountChange} />
<Text>每次支付后对未升级的账户弹窗提醒账户升级</Text>
</div>
</div>
<div>
<div className="ant-col ant-form-item-label ant-col-xs-5 ant-col-sm-5">强制确认协议:</div>
<div className="ant-col ant-form-item-control-wrapper ant-col-xs-16 ant-col-sm-16">
<Switch checkedChildren="启用" unCheckedChildren="禁用"
checked={switch_protocol === 1} onChange={this.handleProtocolChange} />
<Text>在用户登录前让用户同意所有协议条款</Text>
</div>
</div></div>):(id==='pay_switches') ? (<div><div>
<div className="ant-col ant-form-item-label ant-col-xs-5 ant-col-sm-5">mycard支付开关:</div>
<div className="ant-col ant-form-item-control-wrapper ant-col-xs-16 ant-col-sm-16">
<Switch checkedChildren="启用" unCheckedChildren="禁用"
checked={mycard === 1} onChange={this.handleuMycardChange} />
</div>
</div>
<div>
<div className="ant-col ant-form-item-label ant-col-xs-5 ant-col-sm-5">razer gold支付开关:</div>
<div className="ant-col ant-form-item-control-wrapper ant-col-xs-16 ant-col-sm-16">
<Switch checkedChildren="启用" unCheckedChildren="禁用"
checked={razer === 1} onChange={this.handleRazerChange} />
</div>
</div></div>):null}
</Fragment>
)
}
}
import ItemFunctionSwitches from './ItemFunctionSwitches'
export default ItemFunctionSwitches
import React, { Fragment } from 'react'
import { Table, Divider, Row, Col, Alert, Input, Switch } from 'antd';
export default class ItemLoginMethod extends React.Component {
constructor(props) {
super(props);
this.state = {
data: [],
unused_data: []
}
}
triggerChange = (changedValue) => {
// Should provide an event to pass value to Form.
const onChange = this.props.onChange;
if (onChange) {
onChange(changedValue);
}
};
source = [
{
order_id: 1,
name: '邮箱账号',
type: 'account',
app_id: '',
app_key: '',
},
{
order_id: 2,
name: '谷歌账号',
type: 'google',
app_id: '',
app_key: '',
},
{
order_id: 3,
name: 'Facebook账号',
type: 'facebook',
app_id: '',
app_key: '',
use_union_id: false
},
{
order_id: 4,
name: 'NAVER账号',
type: 'naver',
app_id: '',
app_key: '',
},
{
order_id: 5,
name: 'Line账号',
type: 'line',
app_id: '',
app_key: '',
},
{
order_id: 6,
name: 'Twitter账号',
type: 'twitter',
app_id: '',
app_key: '',
},
{
order_id: 7,
name: 'Apple账号',
type: 'apple',
app_id: '',
app_key: '',
first_priority_login: false
},
{
order_id: 8,
name: '游客登录',
type: 'guest',
app_id: '',
app_key: '',
},
{
order_id: 9,
name: '引继码登录',
type: 'citation',
app_id: '',
app_key: '',
}
]
columns = [{
title: '顺序',
dataIndex: 'order_id',
key: 'order_id',
width: 80,
}, {
title: '登录方式',
dataIndex: 'name',
key: 'name',
width: 150,
}, {
title: '参数',
dataIndex: 'app_id',
key: 'app_id',
width: 250,
render: (text, record, index) => {
if (record.type == 'guest' || record.type == 'account' || record.type == 'citation' ) {
return <span></span>
}
let idPlaceholder = 'APP ID'
let secretPlaceholder = 'APP SECRET'
switch (record.type) {
case 'google':
idPlaceholder = 'Google_SERVER_CLIENT_ID'
break
case 'facebook':
idPlaceholder = 'APP ID'
secretPlaceholder = 'APP KEY'
break
case 'naver':
idPlaceholder = 'NV_clinet_ID'
secretPlaceholder = 'NV_clinet_SECRET'
break
case 'line':
idPlaceholder = 'Channel ID'
secretPlaceholder = 'Channel Secret'
break
case 'twitter':
idPlaceholder = 'Custom key'
secretPlaceholder = 'Custom Secret'
break
case 'apple':
idPlaceholder = 'APP ID'
}
let appSecretDom = ''
let unionIDDom = ''
let priorityLoginDom = ''
if (record.type == 'facebook' || record.type == 'naver' || record.type == 'line' || record.type == 'twitter') {
appSecretDom = (
<div style={{ marginTop: "15px" }}>
<span>
{secretPlaceholder}
</span>
<Input placeholder={secretPlaceholder} value={record.app_key}
onChange={(e) => {
this.state.data[index].app_key = e.target.value
// this.setState({ data: this.state.data })
this.triggerChange(this.state.data)
}}
/>
</div>
)
}
if (record.type == 'facebook') {
let defaultChecked = record.use_union_id == 1 ? true : false
unionIDDom = (
<div style={{ marginTop: "15px" }}>
<div>
UnionID开关
</div>
<Switch checkedChildren="开启" unCheckedChildren="关闭" checked={defaultChecked} onChange={(checked) => {
this.state.data[index].use_union_id = checked === true ? 1 : 0
// this.setState({ data: this.state.data })
this.triggerChange(this.state.data)
}} />
</div>
)
}
if (record.type == 'apple') {
let defaultChecked = record.first_priority_login == 1 ? true : false
priorityLoginDom = (
<div style={{ marginTop: "15px"}}>
<div>
首次启动自动登陆开关
</div>
<Switch checkedChildren="开启" unCheckedChildren="关闭" checked={defaultChecked} onChange={(checked) => {
this.state.data[index].first_priority_login = checked === true ? 1: 0
this.triggerChange(this.state.data)
}}/>
</div>
)
}
return (
<div>
<div>
<span>
{idPlaceholder}
</span>
<Input placeholder={idPlaceholder} value={record.app_id}
onChange={(e) => {
this.state.data[index].app_id = e.target.value
// this.setState({ data: this.state.data })
this.triggerChange(this.state.data)
}}
/>
<br />
</div>
{appSecretDom}
{unionIDDom}
{priorityLoginDom}
</div>
)
}
}, {
title: '操作',
dataIndex: 'action',
key: 'action',
width: 180,
render: (text, record, index) => {
if(record.type !== 'guest'){
return <span >
<a disabled={index == 0} onClick={() => {
let item = this.state.data.splice(index, 1)[0]
this.state.data.splice(index - 1, 0, item)
this.triggerChange(this.state.data)
}}>上移</a>
<Divider type="vertical" />
<a disabled={index == this.state.data.length - 1} onClick={() => {
let item = this.state.data.splice(index, 1)[0]
this.state.data.splice(index + 1, 0, item)
this.triggerChange(this.state.data)
}}>下移</a>
<Divider type="vertical" />
<a onClick={() => {
let item = this.state.data.splice(index, 1)
this.triggerChange(this.state.data)
}}>删除</a>
</span>
}else {
return <span >
<a onClick={() => {
let item = this.state.data.splice(index, 1)
this.triggerChange(this.state.data)
}}>删除</a>
</span>
}
}
}];
unused_columns = [{
title: '登录方式',
dataIndex: 'name',
key: 'name',
}, {
title: '操作',
dataIndex: 'action',
key: 'action',
render: (text, record, index) => (
<a onClick={() => {
this.addLoginType(record);
this.triggerChange(this.state.data)
}}>添加</a>
)
}];
addLoginType = (record) => {
let guestIndex = 0;
let hasGuest = false;
if(record.type !== 'guest'){
this.state.data.map((item,index)=>{
if(item.type === 'guest'){
guestIndex = index;
hasGuest = true;
}
});
if(hasGuest){
this.state.data.splice(guestIndex,0,record)
}else {
this.state.data.push(record)
}
}else {
this.state.data.push(record)
}
};
componentWillReceiveProps(props) {
const datasource = props.value || [];
let data = []
let unused_data = []
if (datasource.length == 0) {
if (this.state.unused_data.length == 0) {
data = JSON.parse(JSON.stringify(this.source))
}else{
unused_data = JSON.parse(JSON.stringify(this.source))
}
} else {
data = datasource
this.source.forEach(row => {
let item = datasource.find(i => {
return row.type == i.type
})
if (!item) {
unused_data.push(row)
}
})
}
let order_id = 1;
for(let item of data){
item.order_id = order_id++
}
this.setState({
data: data,
unused_data: unused_data
})
}
render() {
return (
<Fragment>
<Alert message="登录方式按顺序从小到大排序(UI从右到左)" type="warning" showIcon />
<br />
<Row gutter={24}>
<Col span={18} >
<Table rowKey="type" dataSource={this.state.data} columns={this.columns} title={() => '已选登录方式'} bordered pagination={false} />
</Col>
<Col span={6} >
<Table rowKey="type" dataSource={this.state.unused_data} columns={this.unused_columns} bordered title={() => '未选登录方式'} pagination={false} />
</Col>
</Row>
</Fragment>
)
}
}
import ItemLoginMethod from './ItemLoginMethod'
export default ItemLoginMethod
import React, { Fragment } from 'react'
import {Table, Divider, Row, Col, Alert, Input, Switch, Button} from 'antd';
const { TextArea } = Input;
export default class ItemProductList extends React.Component{
constructor(props) {
super(props);
this.state = {
data: [],
dataStr: '',
isChange: false
}
}
triggerChange = (changedValue) => {
// Should provide an event to pass value to Form.
const onChange = this.props.onChange;
if (onChange) {
onChange(changedValue);
}
};
column = [
{
title: '商品ID',
dataIndex: 'product_id',
key: 'product_id',
render: (text, record, index) => {
return (
<div>
<Input type="text" value={record.product_id} onChange={(e) => {
this.state.data[index].product_id = e.target.value;
this.triggerChange(this.state.data);
}}/>
</div>
);
}
},
{
title: '价格',
dataIndex: 'price',
key: 'price',
render: (text, record, index) => {
return (
<div>
<Input type="text" value={record.price} onChange={(e) => {
this.state.data[index].price = e.target.value;
this.triggerChange(this.state.data);
}}/>
</div>
);
}
},
{
title: '操作',
dataIndex: 'action',
key: 'action',
render: (text, record, index) => {
return (
<div>
<a onClick={() => {
this.delProductInfo(index);
this.triggerChange(this.state.data);
}}>删除</a>
</div>
);
}
},
];
// componentWillReceiveProps(props) {
// const datasource = props.value || [];
// let data = []
// if (datasource.length == 0) {
// data = []
// } else {
// data = datasource
// }
// this.setState({
// data: data,
// })
// }
componentWillReceiveProps(props) {
if (this.state.isChange) {
return;
}
console.log('componentWillReceiveProps', props.value)
const datasource = props.value || [];
let data = [];
let that = this;
if (datasource.length == 0) {
data = []
} else {
data = datasource
}
this.setState({
data: data,
},() => {
that.getDataStr();
})
}
addProductInfo = () => {
this.state.data.push({
product_id: '',
price: ''
});
};
delProductInfo = (index) => {
this.state.data.splice(index, 1);
};
// componentWillMount() {
// const datasource = this.props.value || [];
// let data = [];
// let that = this;
// if (datasource.length == 0) {
// data = []
// } else {
// data = datasource
// }
// this.setState({
// data: data,
// },() => {
// that.getDataStr();
// })
// }
reorganizationData = (e) => {
let currentValue = e.target.value;
let currentValueList = currentValue.split('\n');
let dataList = [];
for (let index = 0; index < currentValueList.length; index++) {
const element = (currentValueList[index].trim()).replace(/\n/g,'');
if(element.trim() != ''){
// if(!element.split(":")[1] && element.split(":")[0]) {
// if(element.split(":").length==1) {
// content = content + element.split(":")[0] + "\n";
// }else {
// content = content + element.split(":")[0] + ":" + "\n";
// }
// }else if(!element.split(":")[0] && element.split(":")[1]) {
// content = content + ":" + element.split(":")[1] + "\n";
// } else if(!element.split(":")[1] && !element.split(":")[0]) {
// content = content + ":" + "\n";
// }
let dataObj = {};
dataObj.price = element.split(":")[1];
dataObj.product_id = element.split(":")[0];
dataList.push(dataObj);
}
}
this.setState({
dataStr: currentValue,
isChange: true
}, () => {
this.triggerChange(dataList)
})
// console.log(dataList)
// this.state.data = dataList;
// this.triggerChange(dataList);
}
getDataStr = () => {
let dataStr = "";
this.state.data.map((item, index) => {
dataStr = dataStr + item.product_id + ':' + item.price + "\n";
})
this.setState({
dataStr: dataStr
})
}
render() {
return (
<Fragment>
{/*<Table dataSource={this.source} columns={this.column} />*/}
<Row gutter={10}>
<Col span={36} >
<TextArea rows={10} onChange={(e) => {this.reorganizationData(e)}}
value={this.state.dataStr} />
{/* <Table dataSource={this.state.data} columns={this.column} pagination={false} /> */}
</Col>
{/*<Col span={6} >*/}
{/* <Table rowKey="type" dataSource={this.state.unused_data} columns={this.unused_columns} bordered title={() => '未选登录方式'} pagination={false} />*/}
{/*</Col>*/}
</Row>
{/* <Button block type={"dashed"} onClick={() => {
this.addProductInfo();
this.triggerChange(this.state.data);
}}> + 添加</Button> */}
</Fragment>
);
}
}
import ItemProductList from "./ItemProductList";
export default ItemProductList;
import React, {Fragment} from 'react'
import { Form, Radio, Select } from 'antd'
import './ItemRadioSelect.scss'
const Option = Select.Option;
const RadioGroup = Radio.Group;
export default class ItemRadioSelect extends React.Component{
constructor(props){
super(props);
this.state = {
disabled: true,
}
}
onChange = (e) => {
if(e.target.value ===1 ){
this.setState({
disabled: true,
})
}else {
this.setState({
disabled: false,
})
}
this.setState({
value: e.target.value,
});
};
componentDidMount() {
if(this.props.dataSource[this.props.item.key.radio].initialValue < 1){
this.setState({
disabled:false,
})
}
}
componentWillReceiveProps(nextProps, nextContext) {
if(nextProps.dataSource[this.props.item.key.radio].initialValue > 0){
this.setState({
disabled:true,
})
}
}
render() {
const { getFieldDecorator } = this.props.form;
return (
<Fragment>
<Form.Item label={
<span>
<i className={'iconfont '+ this.props.item.transfer}></i>
{this.props.item.label.radio}
</span>
} {...this.props.formItemLayout}>
{getFieldDecorator(this.props.item.key.radio, {
initialValue: this.props.dataSource[this.props.item.key.radio]?this.props.dataSource[this.props.item.key.radio].initialValue:null,
rules: [
{
required: this.props.item.required,
message: '必须',
},
],
})(
<RadioGroup onChange={this.onChange}>
<Radio value={1}></Radio>
<Radio value={0}></Radio>
</RadioGroup>
)}
</Form.Item>
<Form.Item label={this.props.item.label.select} {...this.props.formItemLayout}>
{getFieldDecorator(this.props.item.key.select, {
initialValue: this.props.dataSource[this.props.item.key.select].initialValue?this.props.dataSource[this.props.item.key.select].initialValue:[],
rules: [
{
required: this.state.disabled,
message: '必须',
},
],
})(
<Select disabled={!this.state.disabled} style={{ width: 120 }} onChange={this.handleChange}>
{
this.props.item.data.select.map((item,i)=> {
return <Option value={item.id}>{item.name}</Option>
})
}
</Select>
)}
</Form.Item>
</Fragment>
);
}
}
.wechat{
color: #7AE62F;
margin-right: 6px;
font-size: 22px;
vertical-align: middle;
&:before{
content: '\e668';
}
}
.alipay{
color: #65C7FF;
margin-right: 6px;
font-size: 22px;
vertical-align: middle;
&:before{
content: '\e64a';
}
}
import ItemRadioSelect from './ItemRadioSelect'
export default ItemRadioSelect;
import React,{Fragment} from 'react'
import { Select, Form } from 'antd';
import HttpClient from '../../../../service/HttpClient'
import Api from '../../../../service/Api'
const Option = Select.Option;
export default class SelectAdd extends React.Component{
constructor(props){
super(props);
this.state = {
platform: [],
app: [],
proSelect:'',
}
}
handlePlatformChange = (id) => {
this.setState({proSelect:''});
this.getProjectList({operator_id:id,flatten:1}).then(data => {
this.setState({
app: data.list,
});
})
};
onProjectChange = (value) => {
this.props.getParams(value);
this.setState({proSelect:value.id});
this.getAppList({project_id:value.id,flatten:1}).then(data => {
this.props.getRadioData(data);
})
};
componentDidMount() {
this.getPlatForm({limit:100}).then(data => {
this.setState({
platform:data,
})
})
}
async getPlatForm(params){
return await HttpClient.get(Api.operation_all_platform,params)
}
async getProjectList(params){
return await HttpClient.get(Api.project_list, params)
}
async getAppList(params){
return await HttpClient.get(Api.app_list,params)
}
render() {
const { getFieldDecorator } = this.props.form;
return(
<Fragment>
<Form.Item label={this.props.item.label} {...this.props.formItemLayout}>
{getFieldDecorator(this.props.item.key.first_key, {
rules: [
{
required: true,
message: '必须',
},
],
})(
<Select className="mr-20" style={{ width: 120 }}>
{this.state.platform.map(item => <Option key={item.id} onClick={() =>this.handlePlatformChange(item.id)}>{item.name}</Option>)}
</Select>
)}
{getFieldDecorator(this.props.item.key.second_key, {
rules: [
{
required: true,
message: '必须',
},
],
})(
<Select style={{ width: 200 }} value={this.state.proSelect}>
{this.state.app.map(item => <Option key={item.id} value={[item.name,item.id]} onClick={()=>this.onProjectChange(item)}>{item.name}</Option>)}
</Select>
)}
</Form.Item>
</Fragment>
)
}
}
import ItemSelectPlus from './ItemSelectPlus'
export default ItemSelectPlus
import React,{Fragment} from 'react';
import axios from 'axios';
import {Upload, Icon, Modal, message, Form, Select} from 'antd';
import HttpClient from "../../../../service/HttpClient";
import Api from "../../../../service/Api";
export default class ItemUploader extends React.Component{
constructor(props){
super(props);
this.state = {
previewVisible: false,
previewImage: '',
fileList: [],
}
}
componentWillReceiveProps(nextProps, nextContext) {
if (nextProps.value) {
this.setState({
fileList: [
{
uid: '-1',
url: nextProps.value,
status: 'done',
},
],
})
}
}
beforeUpload=(file)=>{
if (!file.type === 'image/png' || !file.type === 'image/jpeg') {
message.error('您上传的文件格式不支持!');
return false
}
const isLt2M = file.size / 1024 / 1024 < 2;
if (!isLt2M) {
message.error('请小于2M!');
return false
}
return true;
};
handleChange = ({fileList}) => {
if(fileList.length === 0){
this.setState({fileList:[]});
this.props.onChange(undefined);
}
this.setState({fileList});
}
handleCancel = (e) => {
this.setState({ previewVisible: false })
}
handlePreview = (file) => {
this.setState({
previewImage: file.url || file.thumbUrl,
previewVisible: true,
});
};
customRequest = (option)=> {
this.getToken({name:option.file.name,type:option.file.type}).then(data =>{
let param = new FormData(); // 创建form对象
let fileList = Object.assign([],this.state.fileList);
param.append('name', option.file.name);// 通过append向form对象添加数据
param.append('key', data.key);
param.append('policy', data.policy);
param.append('OSSAccessKeyId', data.accessid);
param.append('success_action_status', 200);
param.append('signature', data.signature);
param.append('file', option.file, option.file.name);
let up = axios.create({
timeout: 15000,// 请求超时时间
headers: {
'Content-Type': 'multipart/form-data',
},
});
let arr = [];
up.post(data.host, param).then(response => {
this.state.fileList = this.state.fileList.map((item,index)=>{
if(option.file.uid === item.uid){
return {
uid: option.file.uid,
name: option.file.name,
status: 'done',
url: `${data.host}/${data.key}`,
}
}
});
this.setState({
fileList:this.state.fileList,
})
this.props.onChange(this.state.fileList[0].url);
}).catch(function (error) {
message.error('上传失败!',1)
});
})
};
async getToken(params){
return await HttpClient.get(Api.upload_token,params);
}
componentDidMount() {
}
render() {
const { previewVisible, previewImage, fileList } = this.state;
const uploadButton = (
<div>
<Icon type="plus" />
<div className="ant-upload-text">上传</div>
</div>
);
return(
<div className="ctm-clearfix">
<Upload
listType="picture-card"
fileList={fileList}
beforeUpload={this.beforeUpload}
customRequest={this.customRequest}
onPreview={this.handlePreview}
onChange={this.handleChange}
>
{fileList.length >= 1 ? null : uploadButton}
</Upload>
<Modal visible={previewVisible} footer={null} onCancel={this.handleCancel}>
<img alt="预览" style={{ width: '100%' }} src={previewImage} />
</Modal>
</div>
)
}
}
import ItemUpload from './ItemUpload'
export default ItemUpload;
import ItemForm from './ItemForm'
export default ItemForm;
import React,{Fragment} from 'react';
import { Modal } from 'antd';
import ItemForm from '../ItemForm'
export default class ItemModal extends React.Component{
constructor(props){
super(props);
this.state = {
visible: false,
dataSource:{},
config:[],
};
this.modalConfirm = React.createRef();
}
modalConfirm;
showModal = () => {
this.setState({
visible: true,
});
};
handleOk = () => {
this.modalConfirm.handleSubmit();
if(this.props.config && this.props.config.autoClose){
this.handleCancel();
}
};
handleCancel = () => {
this.setState({
visible: false,
});
this.modalConfirm.handleReset();
};
getReqParams=(values,err)=>{
if(!err){
this.props.config.getOutput(values)
}
}
componentWillReceiveProps(nextProps, nextContext) {
this.setState({
dataSource:nextProps.config.dataSource,
config:nextProps.config.render
})
}
render() {
const { visible, confirmLoading } = this.state;
return(
<div>
<Modal
title={this.props.config.title}
visible={visible}
onOk={this.handleOk}
onCancel={this.handleCancel}
>
<div>
<ItemForm wrappedComponentRef={r => this.modalConfirm = r} dataSource={this.state.dataSource} config={this.state.config} getReqParams={this.getReqParams}/>
</div>
</Modal>
</div>
)
}
}
import ItemModal from './ItemModal'
export default ItemModal;
import React, { Component } from 'react';
import './ItemName.scss'
export default class ItemName extends Component{
constructor(props){
super(props)
}
render() {
return(
<div className="title">
<p>{this.props.itemName}</p>
</div>
)
}
}
.title{
>p{
line-height: 62px;
font-size: 20px;
border-bottom: 1px solid #E5E5E5;
}
}
import ItemName from './ItemName'
export default ItemName;
import React, { Component, Fragment } from 'react';
import { withRouter } from "react-router-dom";
import { Breadcrumb, Button } from 'antd';
import { get } from "../../service/Global";
import './ItemNav.scss'
@withRouter
export default class ItemNav extends Component {
constructor(props) {
super(props)
this.state = {
a: '',
}
}
componentWillMount() {
this.setState({
a: get('readonly')
})
}
render() {
return (
<Fragment>
<div className="breadcrumb-nav">
{
(() => {
if (this.props.itemNav.list) {
return (
<div className="nav-group">
<Breadcrumb>
{
this.props.itemNav.list.map((item, i) => {
return (
<Breadcrumb.Item key={i.toString()}>{item.anchor}</Breadcrumb.Item>
)
})
}
</Breadcrumb>
</div>
)
}
})()
}
{
(() => {
if (this.props.itemNav.extends) {
return (
<div className="btn-group">
{
this.props.itemNav.extends.map((item, i) => {
if (item.url) {
return (
<Button key={i.toString()} type={item.type} onClick={() => { this.props.history.push(item.url) }} disabled={this.state.a == 1 ? true : false}>
{
(() => {
if (item.icon) {
return <i className="iconfont" dangerouslySetInnerHTML={{ __html: item.icon }}></i>
}
})()
}
{item.label}
</Button>
)
} else if (item.render) {
return item.render()
}
})
}
</div>
)
}
})()
}
</div>
</Fragment>
)
}
}
.breadcrumb-nav{
color: #404040;
height: 60px;
background-color: #ffffff;
@include clearfix;
.nav-group{
padding-left: 30px;
float: left;
span{
font-size: 20px;
line-height: 60px;
}
}
.btn-group{
float: right;
margin-top: 14px;
margin-right: 30px;
}
}
import ItemNav from './ItemNav';
export default ItemNav
import React, {Component, Fragment} from 'react';
import { Table} from 'antd';
export default class ItemTable extends Component{
constructor(props){
super(props)
}
render() {
return(
<Fragment>
{
(()=>{
if(this.props.scroll){
return <Table rowKey='id' bordered scroll={this.props.scroll} onChange={this.props.onChange || null} columns={this.props.columns} dataSource={this.props.dataSource.data} pagination={{onChange: this.props.pager,pageSize:this.props.dataSource.pageSize,current:this.props.dataSource.page,total:this.props.dataSource.totalNum}} rowSelection={this.props.rowSelection}/>
}else {
return <Table rowKey='id' bordered onChange={this.props.onChange || null} columns={this.props.columns} dataSource={this.props.dataSource.data} pagination={{onChange: this.props.pager,pageSize:this.props.dataSource.pageSize,current:this.props.dataSource.page,total:this.props.dataSource.totalNum}} rowSelection={this.props.rowSelection}/>
}
})()
}
</Fragment>
)
}
}
import ItemTable from './ItemTable'
export default ItemTable
import React, {Component, Fragment} from 'react'
import {Form, Select, Input, Switch, Radio, Slider, Button, DatePicker, Row, Col} from 'antd';
import './ItemTableQuery.scss'
const {Option} = Select;
const {RangePicker} = DatePicker;
class Tpl extends Component {
constructor(props) {
super(props);
}
handleSubmit = (e) => {
e.preventDefault();
this.props.form.validateFields((err, fieldsValue) => {
if (err) {
return
}
let values ={};
if(fieldsValue.range_picker){
const rangeValue = fieldsValue['range_picker'];
values = {
...fieldsValue,
'range_picker': [rangeValue[0].format('YYYY-MM-DD'), rangeValue[1].format('YYYY-MM-DD')],
};
}else {
values = {
...fieldsValue,
};
}
this.props.getTableQuery(values);
});
};
handleReset = (e) => {
this.props.form.resetFields();
this.props.resetParams();
this.handleSubmit(e)
};
render() {
const {getFieldDecorator} = this.props.form;
return (
<Form layout="inline" onSubmit={this.handleSubmit}>
{
this.props.itemTableQuery.map((item, i) => {
switch (item.type) {
case 'range_picker':
return (
<Form.Item label={item.label} key={i}>
{getFieldDecorator('range_picker',
{
initialValue:item.defaultSelectDate || null,
rules: [
{
type: 'array',
required: item.required||false,
message: '请选择时间!'
}],
})(
<RangePicker disabledDate={item.disabledDate||null}/>
)}
</Form.Item>
);
case 'input':
return (
<Form.Item label={item.label} key={i}>
{getFieldDecorator(item.key, {
rules: [{
required: item.required,
message: item.placeholder,
}],
})(
<Input placeholder={item.placeholder} style={{minWidth:'260px'}}/>
)}
</Form.Item>
);
case 'select':
return (
<Form.Item label={item.label} key={i}>
{getFieldDecorator(item.key, {
initialValue: item.defaultValue?item.defaultValue:undefined,
rules: [
{required: item.required, message: item.placeholder},
],
})(
<Select onChange={item.onChange || null} disabled={item.disabled||false} placeholder={item.placeholder} style={{minWidth:'160px'}} allowClear mode={item.mode}>
{
item.data.map((item,index) => {
if(item)
return <Option value={item.id} key={index}>{item.name}</Option>
})
}
</Select>
)}
</Form.Item>
);
case 'radio':
return (
<Form.Item label={item.label} key={i} {...this.formItemLayout}>
{getFieldDecorator(item.key, {
initialValue: this.props.dataSource[item.key]
? this.props.dataSource[item.key]
: undefined,
rules: [
{
required: item.required,
message: "缺少" + item.label
}
]
})(
<Radio.Group>
{item.data.map((data, index) => {
return <Radio value={data.id} key={index}>{data.name}</Radio>;
})}
</Radio.Group>
)}
</Form.Item>
)
case 'submit':
return (
<Form.Item key={i} >
{
(()=> {
switch (item.extend) {
case true:
return item.render;
default: return <Fragment>
<Button type="primary" htmlType="submit" className="mr-20">查询</Button>
{/* <Button onClick={this.handleReset}>重置</Button> */}
{
(()=>{
if(item.render){
return item.render
}else {
return null
}
})()
}
</Fragment>
}
})()
}
</Form.Item>
)
}
})
}
</Form>
)
}
}
const ItemTableQuery = Form.create({name: 'form_query'})(Tpl);
export default ItemTableQuery;
.item-table-query{
display: inline-block;
margin-bottom: 20px;
@include clearfix;
.item{
margin-right: 20px;
}
}
import ItemTableQuery from './ItemTableQuery'
export default ItemTableQuery
import React, { Component } from 'react';
import { Link } from 'react-router-dom';
import IceContainer from '@icedesign/container';
import './NotFound.scss';
export default class NotFound extends Component {
static displayName = 'NotFound';
render() {
return (
<div className="basic-not-found">
<IceContainer>
<div style={styles.exceptionContent} className="exception-content">
<img
src="https://img.alicdn.com/tfs/TB1txw7bNrI8KJjy0FpXXb5hVXa-260-260.png"
style={styles.image}
className="imgException"
alt="页面不存在"
/>
<div className="prompt">
<h3 style={styles.title} className="title">
抱歉,你访问的页面不存在
</h3>
<p style={styles.description} className="description">
您要找的页面没有找到,请返回
<Link to="/">首页</Link>
继续浏览
</p>
</div>
</div>
</IceContainer>
</div>
);
}
}
const styles = {
exceptionContent: {
display: 'flex',
justifyContent: 'center',
alignItems: 'center',
},
title: {
color: '#333',
},
description: {
color: '#666',
},
};
@media screen and (max-width: 720px) {
.exception-content {
min-height: 200px;
.imgException {
max-width: 100px;
margin-right: 10px;
}
.title {
font-size: 14px;
margin: 10px 0;
}
.description {
font-size: 12px;
}
}
}
@media screen and (min-width: 721px) and (max-width: 1199px) {
.exception-content {
min-height: 300px;
.imgException {
max-width: 180px;
margin-right: 30px;
}
.title {
font-size: 20px;
margin: 10px 0;
}
.description {
font-size: 14px;
}
}
}
@media screen and (min-width: 1200px) {
.exception-content {
min-height: 500px;
.imgException {
max-width: 260px;
margin-right: 50px;
}
.title {
font-size: 24px;
margin: 20px 0;
}
.description {
font-size: 16px;
}
}
}
import NotFound from './NotFound';
export default NotFound;
!function(l){var a,e='<svg><symbol id="iconshiyongbangzhuiconx" viewBox="0 0 1024 1024"><path d="M512 1024A512 512 0 1 1 512 0a512 512 0 0 1 0 1024z m7.964444-796.444444c-55.808 0-99.555556 16.384-131.185777 50.062222C357.148444 310.328889 341.333333 354.872889 341.333333 411.932444h79.075556c0-34.417778 6.826667-60.984889 20.366222-79.701333 15.075556-22.698667 39.936-33.621333 73.841778-33.621333 27.136 0 48.981333 7.793778 64.056889 23.438222 14.336 15.644444 21.845333 36.750222 21.845333 64.056889 0 20.366222-7.509333 39.082667-21.048889 57.059555l-12.856889 14.848c-46.648889 43.008-75.320889 75.036444-85.105777 96.881778-10.581333 20.366222-15.075556 45.340444-15.075556 74.24v13.312h80.611556v-13.312c0-18.773333 3.754667-35.896889 12.060444-51.541333 6.769778-14.051556 17.294222-28.16 31.630222-40.618667 35.441778-32.085333 56.490667-52.337778 63.317334-60.984889 18.773333-25.031111 28.615111-57.059556 28.615111-95.345777 0-46.876444-15.075556-84.366222-45.226667-111.729778C607.288889 240.867556 568.149333 227.555556 519.964444 227.555556z m-13.653333 457.159111a52.337778 52.337778 0 0 0-39.139555 15.587555c-10.581333 10.183111-15.815111 23.495111-15.815112 39.879111 0 15.644444 5.233778 28.899556 15.815112 39.822223A53.020444 53.020444 0 0 0 506.311111 796.444444a55.466667 55.466667 0 0 0 39.139556-15.644444 56.433778 56.433778 0 0 0 16.611555-40.618667c0-16.384-5.290667-29.696-15.815111-39.822222-10.581333-10.979556-24.120889-15.644444-39.936-15.644444z" ></path></symbol><symbol id="icontishiiconx" viewBox="0 0 1024 1024"><path d="M512 512m-448 0a448 448 0 1 0 896 0 448 448 0 1 0-896 0Z" fill="#FF751A" ></path><path d="M448 192h128.128L544 640.32h-64L448 192z m63.616 512c18.112 0 33.856 5.952 46.208 17.792 11.52 11.904 18.176 27.136 18.176 45.76 0 18.688-6.592 34.752-18.176 46.656a66.048 66.048 0 0 1-46.208 17.792 60.16 60.16 0 0 1-44.608-18.624C453.76 801.472 448 786.24 448 767.552c0-18.624 5.76-33.92 19.008-45.76A59.52 59.52 0 0 1 511.616 704z" fill="#FFFFFF" ></path></symbol><symbol id="iconjinggaoiconx" viewBox="0 0 1024 1024"><path d="M512 512m-512 0a512 512 0 1 0 1024 0 512 512 0 1 0-1024 0Z" fill="#F0E444" ></path><path d="M438.848 146.304h146.432L548.48 658.56H475.52l-36.608-512.32z m72.704 585.152c20.736 0 38.656 6.784 52.8 20.288 13.248 13.568 20.8 31.04 20.8 52.352 0 21.312-7.552 39.68-20.8 53.248a75.52 75.52 0 0 1-52.8 20.352c-20.8 0-37.76-7.68-51.008-21.312-15.104-13.568-21.696-30.976-21.696-52.288 0-21.312 6.592-38.784 21.76-52.352 13.184-13.504 30.144-20.288 50.944-20.288z" fill="#404040" ></path></symbol><symbol id="iconxinzengx" viewBox="0 0 1024 1024"><path d="M976.337455 463.220364H555.008V48.128A47.848727 47.848727 0 0 0 507.345455 0a47.848727 47.848727 0 0 0-47.569455 48.128v415.092364H47.662545A47.848727 47.848727 0 0 0 0 511.348364c0 26.624 21.317818 48.128 47.662545 48.128h412.113455v416.395636c0 26.624 21.224727 48.128 47.569455 48.128a47.848727 47.848727 0 0 0 47.662545-48.128V559.476364h421.329455A47.848727 47.848727 0 0 0 1024 511.348364a47.848727 47.848727 0 0 0-47.662545-48.128z" ></path></symbol><symbol id="iconshangchuantupianICONx" viewBox="0 0 1024 1024"><path d="M864 928v-197.76a32 32 0 1 1 64 0V960a32 32 0 0 1-32 32H128a32 32 0 0 1-32-32v-229.76a32 32 0 1 1 64 0v197.76h704zM486.4 53.376a32 32 0 0 1 46.336 44.16L247.168 396.608a32 32 0 1 1-46.272-44.16L486.4 53.312z m57.152 665.28a32 32 0 1 1-64 0.192l-1.92-643.264a32 32 0 0 1 54.912-22.4l290.432 299.52a32 32 0 1 1-45.952 44.608l-235.2-242.56 1.728 563.904z" ></path></symbol><symbol id="iconceshiyonghux" viewBox="0 0 1024 1024"><path d="M0.064 303.36C0.064 244.8 34.88 192 88.576 168.96L454.336 11.904a146.24 146.24 0 0 1 115.456 0L935.104 168.96a146.24 146.24 0 0 1 88.512 134.4v415.744c0 58.368-34.688 111.104-88.256 134.208l-365.248 158.016c-37.056 16-79.04 16-116.096 0l-365.696-157.952A146.24 146.24 0 0 1 0.064 718.976V303.36z m232.576 122.688c7.808 0 13.696-1.92 17.6-5.76A20.352 20.352 0 0 0 256.064 405.12a20.8 20.8 0 0 0-5.76-15.296C246.464 385.984 240.576 384 232.64 384H87.168c-7.488 0-13.248 1.92-17.152 5.696A20.352 20.352 0 0 0 64.064 405.12c0 6.272 1.92 11.328 5.76 15.168 3.712 3.84 9.6 5.76 17.344 5.76h49.92v182.848c0 10.432 2.176 18.24 6.4 23.36A20.48 20.48 0 0 0 160.064 640c6.656 0 12.16-2.56 16.32-7.68 4.224-5.056 6.336-12.864 6.336-23.424V426.048h49.92z m229.12-2.048c7.36 0 12.8-1.856 16.448-5.504a19.904 19.904 0 0 0 5.376-14.592 19.712 19.712 0 0 0-5.376-14.4C474.624 385.856 469.12 384 461.696 384H339.264a35.52 35.52 0 0 0-16.128 3.2 19.648 19.648 0 0 0-9.344 10.304 47.616 47.616 0 0 0-2.944 18.304v192.384c0 11.2 2.24 19.264 6.656 24.32 4.416 4.992 11.648 7.488 21.76 7.488h126.08c7.296 0 12.8-1.92 16.512-5.696a20.224 20.224 0 0 0 5.568-14.72 20.672 20.672 0 0 0-5.568-15.104c-3.712-3.84-9.216-5.696-16.448-5.696H357.184V525.952h96.256c7.168 0 12.48-1.792 15.936-5.504a19.968 19.968 0 0 0 5.12-14.208 19.2 19.2 0 0 0-5.184-14.08c-3.52-3.52-8.768-5.312-15.872-5.312H357.184v-62.848h104.512z m262.336 137.472c0-12.48-2.048-23.04-6.144-31.68a57.92 57.92 0 0 0-17.216-21.312 103.68 103.68 0 0 0-26.688-14.4 328.32 328.32 0 0 0-35.136-10.816 529.984 529.984 0 0 1-22.144-6.4 66.816 66.816 0 0 1-13.312-6.08 32.32 32.32 0 0 1-10.24-9.28 21.952 21.952 0 0 1-3.84-12.8c0-8 3.712-14.848 11.072-20.544a46.08 46.08 0 0 1 28.928-8.512c12.928 0 22.336 2.56 28.16 7.808 5.824 5.248 10.88 12.544 14.976 21.888a58.24 58.24 0 0 0 8.96 14.08c2.816 2.88 6.848 4.352 12.16 4.352a18.112 18.112 0 0 0 14.592-7.168 24.832 24.832 0 0 0 5.888-16.128 48.32 48.32 0 0 0-4.736-20.096 62.08 62.08 0 0 0-14.784-19.712 75.584 75.584 0 0 0-25.6-15.04A105.792 105.792 0 0 0 632.512 384c-17.6 0-32.896 2.816-45.888 8.512a65.92 65.92 0 0 0-29.888 24.448 65.152 65.152 0 0 0-10.24 36.288c0 14.272 3.2 26.24 9.728 35.84 6.464 9.6 15.296 17.28 26.368 22.848 11.136 5.568 24.896 10.432 41.344 14.592 12.288 3.008 22.144 5.888 29.44 8.576a44.416 44.416 0 0 1 17.984 11.776c4.608 5.12 6.976 11.776 6.976 20.032a32 32 0 0 1-12.928 25.92 51.776 51.776 0 0 1-33.472 10.368 49.472 49.472 0 0 1-24.256-5.12 39.296 39.296 0 0 1-14.272-13.12 103.552 103.552 0 0 1-9.472-19.776 40.384 40.384 0 0 0-8.64-15.04 16.896 16.896 0 0 0-12.48-5.056 19.2 19.2 0 0 0-14.912 6.528 22.528 22.528 0 0 0-5.824 15.616c0 10.432 3.2 21.248 9.728 32.32s14.976 19.968 25.408 26.624c14.72 9.216 33.28 13.824 55.936 13.824 18.88 0 35.2-3.392 48.896-10.112a72.704 72.704 0 0 0 42.048-68.416z m212.544-135.424c7.808 0 13.696-1.92 17.6-5.76A20.352 20.352 0 0 0 960.064 405.12a20.8 20.8 0 0 0-5.76-15.296c-3.84-3.84-9.728-5.824-17.664-5.824h-145.472c-7.488 0-13.248 1.92-17.152 5.696A20.352 20.352 0 0 0 768.064 405.12c0 6.272 1.92 11.328 5.76 15.168 3.712 3.84 9.6 5.76 17.344 5.76h49.92v182.848c0 10.432 2.176 18.24 6.4 23.36A20.48 20.48 0 0 0 864.064 640c6.656 0 12.16-2.56 16.32-7.68 4.224-5.056 6.336-12.864 6.336-23.424V426.048h49.92z" ></path></symbol><symbol id="iconyingyongpeizhix" viewBox="0 0 1024 1024"><path d="M68.266667 68.266667h273.066666a68.266667 68.266667 0 0 1 68.266667 68.266666v273.066667a68.266667 68.266667 0 0 1-68.266667 68.266667H68.266667a68.266667 68.266667 0 0 1-68.266667-68.266667V136.533333a68.266667 68.266667 0 0 1 68.266667-68.266666z m0 546.133333h273.066666a68.266667 68.266667 0 0 1 68.266667 68.266667v273.066666a68.266667 68.266667 0 0 1-68.266667 68.266667H68.266667a68.266667 68.266667 0 0 1-68.266667-68.266667v-273.066666a68.266667 68.266667 0 0 1 68.266667-68.266667zM799.197867 31.675733l193.1264 193.1264a68.266667 68.266667 0 0 1 0 96.529067l-193.1264 193.1264a68.266667 68.266667 0 0 1-96.529067 0L509.5424 321.3312a68.266667 68.266667 0 0 1 0-96.529067L702.6688 31.675733a68.266667 68.266667 0 0 1 96.529067 0zM614.4 614.4h273.066667a68.266667 68.266667 0 0 1 68.266666 68.266667v273.066666a68.266667 68.266667 0 0 1-68.266666 68.266667H614.4a68.266667 68.266667 0 0 1-68.266667-68.266667v-273.066666a68.266667 68.266667 0 0 1 68.266667-68.266667z" ></path></symbol><symbol id="icondingdanguanlix" viewBox="0 0 1365 1024"><path d="M569.514667 209.066667h639.488a101.12 101.12 0 0 0 0-202.24H569.514667a101.12 101.12 0 1 0 0 202.24zM275.2 6.826667H153.941333a101.12 101.12 0 1 0 0 202.24h121.258667a101.12 101.12 0 1 0 0-202.24z m933.802667 404.48H569.514667a101.12 101.12 0 1 0 0 202.24h639.488a101.12 101.12 0 0 0 0-202.24z m-933.802667 0H153.941333a101.12 101.12 0 1 0 0 202.24h121.258667a101.12 101.12 0 1 0 0-202.24z m933.802667 404.48H569.514667a101.12 101.12 0 0 0 0 202.24h639.488a101.12 101.12 0 1 0 0-202.24z m-933.802667 0H153.941333a101.12 101.12 0 0 0 0 202.24h121.258667a101.12 101.12 0 1 0 0-202.24z" ></path></symbol><symbol id="iconkaiguanx" viewBox="0 0 1024 1024"><path d="M42.688 768a213.376 213.376 0 0 1 213.248-213.312h512.128a213.376 213.376 0 0 1 0 426.688H255.936A213.44 213.44 0 0 1 42.688 768zM256 853.312a85.312 85.312 0 1 0 0-170.624 85.312 85.312 0 0 0 0 170.624z" ></path><path d="M42.688 256A213.376 213.376 0 0 1 255.936 42.688h512.128a213.376 213.376 0 0 1 0 426.688H255.936A213.44 213.44 0 0 1 42.688 256zM768 341.312a85.312 85.312 0 1 0 0-170.624 85.312 85.312 0 0 0 0 170.624z" ></path></symbol><symbol id="iconzhanghuguanlix" viewBox="0 0 1024 1024"><path d="M960 1024v-151.68c0-167.616-100.288-303.424-224-303.424h-448c-123.712 0-224 135.808-224 303.36V1024" ></path><path d="M288 227.584a227.584 224 90 1 0 448 0 227.584 224 90 1 0-448 0Z" ></path></symbol><symbol id="iconyonghuguanlix" viewBox="0 0 1160 1024"><path d="M921.6 936.209067v-112.64c0-146.2272-77.0048-271.086933-183.978667-303.445334H955.733333c113.117867 0 204.8 124.245333 204.8 277.435734v138.6496h-238.933333zM627.780267 374.306133A277.2992 277.2992 0 0 0 682.666667 208.0768c0-62.395733-20.48-119.944533-54.8864-166.229333A201.796267 201.796267 0 0 1 750.933333 0c113.117867 0 204.8 93.115733 204.8 208.0768 0 114.8928-91.682133 208.008533-204.8 208.008533a201.796267 201.796267 0 0 1-123.153066-41.7792zM819.2 962.218667v-138.717867C819.2 670.378667 727.517867 546.133333 614.4 546.133333H204.8c-113.117867 0-204.8 124.245333-204.8 277.367467v138.717867" ></path><path d="M204.8 208.0768a208.0768 204.8 90 1 0 409.6 0 208.0768 204.8 90 1 0-409.6 0Z" ></path></symbol><symbol id="iconiCONx" viewBox="0 0 1024 1024"><path d="M512 512m-512 0a512 512 0 1 0 1024 0 512 512 0 1 0-1024 0Z" fill="#FFFFFF" opacity=".1" ></path><path d="M356.386133 287.573333a271.5648 271.5648 0 0 1 106.973867-44.305066l11.776-58.88A17.066667 17.066667 0 0 1 491.861333 170.666667h40.277334a17.066667 17.066667 0 0 1 16.725333 13.7216l11.776 58.88a271.5648 271.5648 0 0 1 106.973867 44.305066l49.9712-33.314133a17.066667 17.066667 0 0 1 21.504 2.1504l28.501333 28.4672a17.066667 17.066667 0 0 1 2.1504 21.538133l-33.314133 49.9712a271.5648 271.5648 0 0 1 44.305066 106.973867l58.88 11.776a17.066667 17.066667 0 0 1 13.7216 16.725333v40.277334a17.066667 17.066667 0 0 1-13.7216 16.725333l-58.88 11.776a271.5648 271.5648 0 0 1-44.305066 106.973867l33.314133 49.9712a17.066667 17.066667 0 0 1-2.1504 21.504l-28.4672 28.501333a17.066667 17.066667 0 0 1-21.538133 2.1504l-49.9712-33.314133a271.5648 271.5648 0 0 1-106.973867 44.305066l-11.776 58.88a17.066667 17.066667 0 0 1-16.725333 13.7216h-40.277334a17.066667 17.066667 0 0 1-16.725333-13.7216l-11.776-58.88a271.5648 271.5648 0 0 1-106.973867-44.305066l-49.9712 33.314133a17.066667 17.066667 0 0 1-21.504-2.1504l-28.501333-28.4672a17.066667 17.066667 0 0 1-2.1504-21.538133l33.314133-49.9712a271.5648 271.5648 0 0 1-44.305066-106.973867l-58.88-11.776A17.066667 17.066667 0 0 1 170.666667 532.138667v-40.277334a17.066667 17.066667 0 0 1 13.7216-16.725333l58.88-11.776a271.5648 271.5648 0 0 1 44.305066-106.973867L254.293333 306.414933a17.066667 17.066667 0 0 1 2.1504-21.504l28.4672-28.501333a17.066667 17.066667 0 0 1 21.538134-2.1504l49.9712 33.314133zM512 341.333333c-95.402667 0-170.666667 76.458667-170.666667 170.666667 0 94.8224 76.458667 170.666667 170.666667 170.666667 91.9552 0 168.379733-76.458667 170.666667-170.666667 0-95.402667-75.844267-170.666667-170.666667-170.666667z" fill="#FFFFFF" ></path><path d="M414.037333 481.826133c8.021333 17.851733 25.941333 30.173867 46.762667 30.173867 27.579733 0 50.517333-22.9376 51.2-51.2a50.858667 50.858667 0 0 0-30.139733-46.762667c9.489067-2.901333 19.626667-4.437333 30.139733-4.437333 56.900267 0 102.4 45.1584 102.4 102.4-1.365333 56.558933-47.240533 102.4-102.4 102.4-56.558933 0-102.4-45.499733-102.4-102.4 0-10.513067 1.570133-20.650667 4.437333-30.173867z" fill="#FFFFFF" ></path></symbol></svg>',t=(a=document.getElementsByTagName("script"))[a.length-1].getAttribute("data-injectcss");if(t&&!l.__iconfont__svg__cssinject__){l.__iconfont__svg__cssinject__=!0;try{document.write("<style>.svgfont {display: inline-block;width: 1em;height: 1em;fill: currentColor;vertical-align: -0.1em;font-size:16px;}</style>")}catch(a){console&&console.log(a)}}!function(a){if(document.addEventListener)if(~["complete","loaded","interactive"].indexOf(document.readyState))setTimeout(a,0);else{var t=function(){document.removeEventListener("DOMContentLoaded",t,!1),a()};document.addEventListener("DOMContentLoaded",t,!1)}else document.attachEvent&&(e=a,i=l.document,o=!1,c=function(){o||(o=!0,e())},(n=function(){try{i.documentElement.doScroll("left")}catch(a){return void setTimeout(n,50)}c()})(),i.onreadystatechange=function(){"complete"==i.readyState&&(i.onreadystatechange=null,c())});var e,i,o,c,n}(function(){var a,t;(a=document.createElement("div")).innerHTML=e,e=null,(t=a.getElementsByTagName("svg")[0])&&(t.setAttribute("aria-hidden","true"),t.style.position="absolute",t.style.width=0,t.style.height=0,t.style.overflow="hidden",function(a,t){t.firstChild?function(a,t){t.parentNode.insertBefore(a,t)}(a,t.firstChild):t.appendChild(a)}(t,document.body))})}(window);
\ No newline at end of file
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
<!--
2013-9-30: Created.
-->
<svg>
<metadata>
Created by iconfont
</metadata>
<defs>
<font id="iconfont" horiz-adv-x="1024" >
<font-face
font-family="iconfont"
font-weight="500"
font-stretch="normal"
units-per-em="1024"
ascent="896"
descent="-128"
/>
<missing-glyph />
<glyph glyph-name="shiyongbangzhuiconx" unicode="&#58924;" d="M512-128A512 512 0 1 0 512 896a512 512 0 0 0 0-1024z m7.964444 796.444444c-55.808 0-99.555556-16.384-131.185777-50.062222C357.148444 585.671111 341.333333 541.127111 341.333333 484.067556h79.075556c0 34.417778 6.826667 60.984889 20.366222 79.701333 15.075556 22.698667 39.936 33.621333 73.841778 33.621333 27.136 0 48.981333-7.793778 64.056889-23.438222 14.336-15.644444 21.845333-36.750222 21.845333-64.056889 0-20.366222-7.509333-39.082667-21.048889-57.059555l-12.856889-14.848c-46.648889-43.008-75.320889-75.036444-85.105777-96.881778-10.581333-20.366222-15.075556-45.340444-15.075556-74.24v-13.312h80.611556v13.312c0 18.773333 3.754667 35.896889 12.060444 51.541333 6.769778 14.051556 17.294222 28.16 31.630222 40.618667 35.441778 32.085333 56.490667 52.337778 63.317334 60.984889 18.773333 25.031111 28.615111 57.059556 28.615111 95.345777 0 46.876444-15.075556 84.366222-45.226667 111.729778C607.288889 655.132444 568.149333 668.444444 519.964444 668.444444z m-13.653333-457.159111a52.337778 52.337778 0 0 1-39.139555-15.587555c-10.581333-10.183111-15.815111-23.495111-15.815112-39.879111 0-15.644444 5.233778-28.899556 15.815112-39.822223A53.020444 53.020444 0 0 1 506.311111 99.555556a55.466667 55.466667 0 0 1 39.139556 15.644444 56.433778 56.433778 0 0 1 16.611555 40.618667c0 16.384-5.290667 29.696-15.815111 39.822222-10.581333 10.979556-24.120889 15.644444-39.936 15.644444z" horiz-adv-x="1024" />
<glyph glyph-name="tishiiconx" unicode="&#58943;" d="M512 384m-448 0a448 448 0 1 1 896 0 448 448 0 1 1-896 0ZM448 704h128.128L544 255.68h-64L448 704z m63.616-512c18.112 0 33.856-5.952 46.208-17.792 11.52-11.904 18.176-27.136 18.176-45.76 0-18.688-6.592-34.752-18.176-46.656a66.048 66.048 0 0 0-46.208-17.792 60.16 60.16 0 0 0-44.608 18.624C453.76 94.528 448 109.76 448 128.448c0 18.624 5.76 33.92 19.008 45.76A59.52 59.52 0 0 0 511.616 192z" horiz-adv-x="1024" />
<glyph glyph-name="jinggaoiconx" unicode="&#58944;" d="M512 384m-512 0a512 512 0 1 1 1024 0 512 512 0 1 1-1024 0ZM438.848 749.696h146.432L548.48 237.44H475.52l-36.608 512.32z m72.704-585.152c20.736 0 38.656-6.784 52.8-20.288 13.248-13.568 20.8-31.04 20.8-52.352 0-21.312-7.552-39.68-20.8-53.248a75.52 75.52 0 0 0-52.8-20.352c-20.8 0-37.76 7.68-51.008 21.312-15.104 13.568-21.696 30.976-21.696 52.288 0 21.312 6.592 38.784 21.76 52.352 13.184 13.504 30.144 20.288 50.944 20.288z" horiz-adv-x="1024" />
<glyph glyph-name="xinzengx" unicode="&#58947;" d="M976.337455 432.779636H555.008V847.872A47.848727 47.848727 0 0 1 507.345455 896a47.848727 47.848727 0 0 1-47.569455-48.128v-415.092364H47.662545A47.848727 47.848727 0 0 1 0 384.651636c0-26.624 21.317818-48.128 47.662545-48.128h412.113455v-416.395636c0-26.624 21.224727-48.128 47.569455-48.128a47.848727 47.848727 0 0 1 47.662545 48.128V336.523636h421.329455A47.848727 47.848727 0 0 1 1024 384.651636a47.848727 47.848727 0 0 1-47.662545 48.128z" horiz-adv-x="1024" />
<glyph glyph-name="shangchuantupianICONx" unicode="&#58949;" d="M864-32v197.76a32 32 0 1 0 64 0V-64a32 32 0 0 0-32-32H128a32 32 0 0 0-32 32v229.76a32 32 0 1 0 64 0v-197.76h704zM486.4 842.624a32 32 0 0 0 46.336-44.16L247.168 499.392a32 32 0 1 0-46.272 44.16L486.4 842.688z m57.152-665.28a32 32 0 1 0-64-0.192l-1.92 643.264a32 32 0 0 0 54.912 22.4l290.432-299.52a32 32 0 1 0-45.952-44.608l-235.2 242.56 1.728-563.904z" horiz-adv-x="1024" />
<glyph glyph-name="ceshiyonghux" unicode="&#58963;" d="M0.064 592.64C0.064 651.2 34.88 704 88.576 727.04L454.336 884.096a146.24 146.24 0 0 0 115.456 0L935.104 727.04a146.24 146.24 0 0 0 88.512-134.4v-415.744c0-58.368-34.688-111.104-88.256-134.208l-365.248-158.016c-37.056-16-79.04-16-116.096 0l-365.696 157.952A146.24 146.24 0 0 0 0.064 177.024V592.64z m232.576-122.688c7.808 0 13.696 1.92 17.6 5.76A20.352 20.352 0 0 1 256.064 490.88a20.8 20.8 0 0 1-5.76 15.296C246.464 510.016 240.576 512 232.64 512H87.168c-7.488 0-13.248-1.92-17.152-5.696A20.352 20.352 0 0 1 64.064 490.88c0-6.272 1.92-11.328 5.76-15.168 3.712-3.84 9.6-5.76 17.344-5.76h49.92v-182.848c0-10.432 2.176-18.24 6.4-23.36A20.48 20.48 0 0 1 160.064 256c6.656 0 12.16 2.56 16.32 7.68 4.224 5.056 6.336 12.864 6.336 23.424V469.952h49.92z m229.12 2.048c7.36 0 12.8 1.856 16.448 5.504a19.904 19.904 0 0 1 5.376 14.592 19.712 19.712 0 0 1-5.376 14.4C474.624 510.144 469.12 512 461.696 512H339.264a35.52 35.52 0 0 1-16.128-3.2 19.648 19.648 0 0 1-9.344-10.304 47.616 47.616 0 0 1-2.944-18.304v-192.384c0-11.2 2.24-19.264 6.656-24.32 4.416-4.992 11.648-7.488 21.76-7.488h126.08c7.296 0 12.8 1.92 16.512 5.696a20.224 20.224 0 0 1 5.568 14.72 20.672 20.672 0 0 1-5.568 15.104c-3.712 3.84-9.216 5.696-16.448 5.696H357.184V370.048h96.256c7.168 0 12.48 1.792 15.936 5.504a19.968 19.968 0 0 1 5.12 14.208 19.2 19.2 0 0 1-5.184 14.08c-3.52 3.52-8.768 5.312-15.872 5.312H357.184v62.848h104.512z m262.336-137.472c0 12.48-2.048 23.04-6.144 31.68a57.92 57.92 0 0 1-17.216 21.312 103.68 103.68 0 0 1-26.688 14.4 328.32 328.32 0 0 1-35.136 10.816 529.984 529.984 0 0 0-22.144 6.4 66.816 66.816 0 0 0-13.312 6.08 32.32 32.32 0 0 0-10.24 9.28 21.952 21.952 0 0 0-3.84 12.8c0 8 3.712 14.848 11.072 20.544a46.08 46.08 0 0 0 28.928 8.512c12.928 0 22.336-2.56 28.16-7.808 5.824-5.248 10.88-12.544 14.976-21.888a58.24 58.24 0 0 1 8.96-14.08c2.816-2.88 6.848-4.352 12.16-4.352a18.112 18.112 0 0 1 14.592 7.168 24.832 24.832 0 0 1 5.888 16.128 48.32 48.32 0 0 1-4.736 20.096 62.08 62.08 0 0 1-14.784 19.712 75.584 75.584 0 0 1-25.6 15.04A105.792 105.792 0 0 1 632.512 512c-17.6 0-32.896-2.816-45.888-8.512a65.92 65.92 0 0 1-29.888-24.448 65.152 65.152 0 0 1-10.24-36.288c0-14.272 3.2-26.24 9.728-35.84 6.464-9.6 15.296-17.28 26.368-22.848 11.136-5.568 24.896-10.432 41.344-14.592 12.288-3.008 22.144-5.888 29.44-8.576a44.416 44.416 0 0 0 17.984-11.776c4.608-5.12 6.976-11.776 6.976-20.032a32 32 0 0 0-12.928-25.92 51.776 51.776 0 0 0-33.472-10.368 49.472 49.472 0 0 0-24.256 5.12 39.296 39.296 0 0 0-14.272 13.12 103.552 103.552 0 0 0-9.472 19.776 40.384 40.384 0 0 1-8.64 15.04 16.896 16.896 0 0 1-12.48 5.056 19.2 19.2 0 0 1-14.912-6.528 22.528 22.528 0 0 1-5.824-15.616c0-10.432 3.2-21.248 9.728-32.32s14.976-19.968 25.408-26.624c14.72-9.216 33.28-13.824 55.936-13.824 18.88 0 35.2 3.392 48.896 10.112a72.704 72.704 0 0 1 42.048 68.416z m212.544 135.424c7.808 0 13.696 1.92 17.6 5.76A20.352 20.352 0 0 1 960.064 490.88a20.8 20.8 0 0 1-5.76 15.296c-3.84 3.84-9.728 5.824-17.664 5.824h-145.472c-7.488 0-13.248-1.92-17.152-5.696A20.352 20.352 0 0 1 768.064 490.88c0-6.272 1.92-11.328 5.76-15.168 3.712-3.84 9.6-5.76 17.344-5.76h49.92v-182.848c0-10.432 2.176-18.24 6.4-23.36A20.48 20.48 0 0 1 864.064 256c6.656 0 12.16 2.56 16.32 7.68 4.224 5.056 6.336 12.864 6.336 23.424V469.952h49.92z" horiz-adv-x="1024" />
<glyph glyph-name="yingyongpeizhix" unicode="&#58964;" d="M68.266667 827.733333h273.066666a68.266667 68.266667 0 0 0 68.266667-68.266666v-273.066667a68.266667 68.266667 0 0 0-68.266667-68.266667H68.266667a68.266667 68.266667 0 0 0-68.266667 68.266667V759.466667a68.266667 68.266667 0 0 0 68.266667 68.266666z m0-546.133333h273.066666a68.266667 68.266667 0 0 0 68.266667-68.266667v-273.066666a68.266667 68.266667 0 0 0-68.266667-68.266667H68.266667a68.266667 68.266667 0 0 0-68.266667 68.266667v273.066666a68.266667 68.266667 0 0 0 68.266667 68.266667zM799.197867 864.324267l193.1264-193.1264a68.266667 68.266667 0 0 0 0-96.529067l-193.1264-193.1264a68.266667 68.266667 0 0 0-96.529067 0L509.5424 574.6688a68.266667 68.266667 0 0 0 0 96.529067L702.6688 864.324267a68.266667 68.266667 0 0 0 96.529067 0zM614.4 281.6h273.066667a68.266667 68.266667 0 0 0 68.266666-68.266667v-273.066666a68.266667 68.266667 0 0 0-68.266666-68.266667H614.4a68.266667 68.266667 0 0 0-68.266667 68.266667v273.066666a68.266667 68.266667 0 0 0 68.266667 68.266667z" horiz-adv-x="1024" />
<glyph glyph-name="dingdanguanlix" unicode="&#58965;" d="M569.514667 686.933333h639.488a101.12 101.12 0 0 1 0 202.24H569.514667a101.12 101.12 0 1 1 0-202.24zM275.2 889.173333H153.941333a101.12 101.12 0 1 1 0-202.24h121.258667a101.12 101.12 0 1 1 0 202.24z m933.802667-404.48H569.514667a101.12 101.12 0 1 1 0-202.24h639.488a101.12 101.12 0 0 1 0 202.24z m-933.802667 0H153.941333a101.12 101.12 0 1 1 0-202.24h121.258667a101.12 101.12 0 1 1 0 202.24z m933.802667-404.48H569.514667a101.12 101.12 0 0 1 0-202.24h639.488a101.12 101.12 0 1 1 0 202.24z m-933.802667 0H153.941333a101.12 101.12 0 0 1 0-202.24h121.258667a101.12 101.12 0 1 1 0 202.24z" horiz-adv-x="1365" />
<glyph glyph-name="kaiguanx" unicode="&#58966;" d="M42.688 128a213.376 213.376 0 0 0 213.248 213.312h512.128a213.376 213.376 0 0 0 0-426.688H255.936A213.44 213.44 0 0 0 42.688 128zM256 42.688a85.312 85.312 0 1 1 0 170.624 85.312 85.312 0 0 1 0-170.624zM42.688 640A213.376 213.376 0 0 0 255.936 853.312h512.128a213.376 213.376 0 0 0 0-426.688H255.936A213.44 213.44 0 0 0 42.688 640zM768 554.688a85.312 85.312 0 1 1 0 170.624 85.312 85.312 0 0 1 0-170.624z" horiz-adv-x="1024" />
<glyph glyph-name="zhanghuguanlix" unicode="&#58967;" d="M960-128v151.68c0 167.616-100.288 303.424-224 303.424h-448c-123.712 0-224-135.808-224-303.36V-128M288 668.416a227.584 224 90 1 1 448 0 227.584 224 90 1 1-448 0Z" horiz-adv-x="1024" />
<glyph glyph-name="yonghuguanlix" unicode="&#58968;" d="M921.6-40.209067v112.64c0 146.2272-77.0048 271.086933-183.978667 303.445334H955.733333c113.117867 0 204.8-124.245333 204.8-277.435734v-138.6496h-238.933333zM627.780267 521.693867A277.2992 277.2992 0 0 1 682.666667 687.9232c0 62.395733-20.48 119.944533-54.8864 166.229333A201.796267 201.796267 0 0 0 750.933333 896c113.117867 0 204.8-93.115733 204.8-208.0768 0-114.8928-91.682133-208.008533-204.8-208.008533a201.796267 201.796267 0 0 0-123.153066 41.7792zM819.2-66.218667v138.717867C819.2 225.621333 727.517867 349.866667 614.4 349.866667H204.8c-113.117867 0-204.8-124.245333-204.8-277.367467v-138.717867M204.8 687.9232a208.0768 204.8 90 1 1 409.6 0 208.0768 204.8 90 1 1-409.6 0Z" horiz-adv-x="1160" />
<glyph glyph-name="iCONx" unicode="&#58969;" d="M512 384m-512 0a512 512 0 1 1 1024 0 512 512 0 1 1-1024 0ZM356.386133 608.426667a271.5648 271.5648 0 0 0 106.973867 44.305066l11.776 58.88A17.066667 17.066667 0 0 0 491.861333 725.333333h40.277334a17.066667 17.066667 0 0 0 16.725333-13.7216l11.776-58.88a271.5648 271.5648 0 0 0 106.973867-44.305066l49.9712 33.314133a17.066667 17.066667 0 0 0 21.504-2.1504l28.501333-28.4672a17.066667 17.066667 0 0 0 2.1504-21.538133l-33.314133-49.9712a271.5648 271.5648 0 0 0 44.305066-106.973867l58.88-11.776a17.066667 17.066667 0 0 0 13.7216-16.725333v-40.277334a17.066667 17.066667 0 0 0-13.7216-16.725333l-58.88-11.776a271.5648 271.5648 0 0 0-44.305066-106.973867l33.314133-49.9712a17.066667 17.066667 0 0 0-2.1504-21.504l-28.4672-28.501333a17.066667 17.066667 0 0 0-21.538133-2.1504l-49.9712 33.314133a271.5648 271.5648 0 0 0-106.973867-44.305066l-11.776-58.88a17.066667 17.066667 0 0 0-16.725333-13.7216h-40.277334a17.066667 17.066667 0 0 0-16.725333 13.7216l-11.776 58.88a271.5648 271.5648 0 0 0-106.973867 44.305066l-49.9712-33.314133a17.066667 17.066667 0 0 0-21.504 2.1504l-28.501333 28.4672a17.066667 17.066667 0 0 0-2.1504 21.538133l33.314133 49.9712a271.5648 271.5648 0 0 0-44.305066 106.973867l-58.88 11.776A17.066667 17.066667 0 0 0 170.666667 363.861333v40.277334a17.066667 17.066667 0 0 0 13.7216 16.725333l58.88 11.776a271.5648 271.5648 0 0 0 44.305066 106.973867L254.293333 589.585067a17.066667 17.066667 0 0 0 2.1504 21.504l28.4672 28.501333a17.066667 17.066667 0 0 0 21.538134 2.1504l49.9712-33.314133zM512 554.666667c-95.402667 0-170.666667-76.458667-170.666667-170.666667 0-94.8224 76.458667-170.666667 170.666667-170.666667 91.9552 0 168.379733 76.458667 170.666667 170.666667 0 95.402667-75.844267 170.666667-170.666667 170.666667zM414.037333 414.173867c8.021333-17.851733 25.941333-30.173867 46.762667-30.173867 27.579733 0 50.517333 22.9376 51.2 51.2a50.858667 50.858667 0 0 1-30.139733 46.762667c9.489067 2.901333 19.626667 4.437333 30.139733 4.437333 56.900267 0 102.4-45.1584 102.4-102.4-1.365333-56.558933-47.240533-102.4-102.4-102.4-56.558933 0-102.4 45.499733-102.4 102.4 0 10.513067 1.570133 20.650667 4.437333 30.173867z" horiz-adv-x="1024" />
</font>
</defs></svg>
import React from 'react';
import ReactDOM from 'react-dom';
import { HashRouter } from 'react-router-dom';
// 载入默认全局样式 normalize 、.clearfix 和一些 mixin 方法等
import './style/antd-loader.less'
import '@alifd/next/reset.scss';
import './style/public.scss';
import router from './router';
require('./action');
const ICE_CONTAINER = document.getElementById('ice-container');
if (!ICE_CONTAINER) {
throw new Error('当前页面不存在 <div id="ice-container"></div> 节点.');
}
ReactDOM.render(
<HashRouter>{router()}</HashRouter>,
ICE_CONTAINER
);
import React, { Component } from 'react';
import { Layout } from 'antd';
import {Action, Store} from 'marine';
import { withRouter,hashHistory } from 'react-router-dom';
import Headers from './components/Headers';
import Aside from './components/Aside';
import MainRoutes from './MainRoutes';
import { ConfigProvider } from 'antd';
import zh_CN from 'antd/lib/locale-provider/zh_CN';
import moment from 'moment';
import 'moment/locale/zh-cn';
import {set} from "../../service/Global";
import {hasIt} from "../../service/utils";
moment.locale('zh-cn');
const {Content} = Layout;
@withRouter
export default class BasicLayout extends Component {
constructor(props) {
super(props);
this.state = {
projectId:''
};
}
projectIdChange = (id)=>{
Action.global.getProjectId({project_id:id});
this.setState({
projectId:id
});
if(!hasIt('/app/list',window.location.href)){
// this.props.history.push('/app/list')
}
};
componentDidMount() {
Store.on('global.projectIdSave',StoreDate =>{
set('project_id', StoreDate.data.project_id);
})
}
render() {
return (
<Layout style={{height:'100%'}}>
<Aside />
<Layout>
<Headers history={this.props.history}/>
{
<Content style={{overFlow:'hidden'}}>
<ConfigProvider locale={zh_CN}>
<MainRoutes/>
</ConfigProvider>
</Content>
}
</Layout>
</Layout>
);
}
}
import React from 'react'
import Login from "../../pages/Login";
export default class LoginLayout extends React.Component{
constructor(props){
super(props)
}
render() {
return(
<section>
<Login />
</section>
)
}
}
import React, { Component } from 'react';
import { Redirect, Switch, Route } from 'react-router-dom';
import { asideMenuConfig } from '../../menuConfig';
import routerData from '../../routerConfig';
import NotFound from '../../components/NotFound'
import {clear, get} from "../../service/Global";
import HttpClient from "../../service/HttpClient";
import Api from '../../service/Api'
let old = [{
name: '监控预警',
path: '/monitor',
icon: '&#xe654;',
authority: 'user',
children: [{
name: '提现监控管理',
path: '/monitor/manage',
authority: 'user',
},
{
name: '通知管理人',
path: '/monitor/manger',
authority: 'user',
},
{
name: '报警通知',
path: '/monitor/inform',
authority: 'user',
},
]
},
{
name: '玩家查询',
path: '/query',
icon: '&#xe657;',
authority: 'user',
children:[
{
name: '玩家货币查询',
path: '/query/player',
authority: 'user',
},
]
},
{
name: '白名单',
path: '/white',
icon: '&#xe657;',
authority: 'user',
children:[
{
name: '白名单管理',
path: '/white/mange',
authority: 'user',
},
]
},
{
name: '系统设置',
path: '/set',
icon: '&#xe657;',
authority: 'user',
children:[
{
name: '用户管理',
path: '/set/user',
authority: 'user',
},
]
}
];
class MainRoutes extends Component {
static displayName = 'MainRoutes';
constructor(props) {
super(props);
this.state = {
asideMenuConfig: []
}
}
componentWillMount() {
this.setState({
asideMenuConfig:old
})
// let scanType = get('scanCode');
// if (scanType == 0) {
// this.setState({
// asideMenuConfig:old
// })
// } else {
// this.headerMenuConfigs();
// }
}
headerMenuConfigs = () => {
HttpClient.get(Api.menu).then(data => {
this.setState({
asideMenuConfig: data
})
})
}
/**
* 根据菜单取得重定向地址.
*/
getRedirectData = () => {
const asideMenuConfig=this.state.asideMenuConfig
const redirectData = [];
const getRedirect = (item) => {
if (item && item.children) {
if (item.children[0] && item.children[0].path) {
redirectData.push({
from: `${item.path}`,
to: `${item.children[0].path}`,
});
item.children.forEach((children) => {
getRedirect(children);
});
}
}
};
asideMenuConfig.forEach(getRedirect);
return redirectData;
};
/**
* 渲染路由组件
*/
renderNormalRoute = (item, index) => {
let token = get('token');
if(item.authority === 'admin'){
if (token) {
if(get('overdue_data') < Date.now()){
clear();
window.location.href='/#/login';
return
}
} else {
window.location.href='/#/login';
return
}
}
return item.component ? (
<Route
key={index}
path={item.path}
component={item.component}
exact={item.exact}
/>
) : null;
};
render() {
const redirectData = this.getRedirectData();
return (
<Switch>
{/* 渲染路由表 */}
{routerData.map(this.renderNormalRoute)}
{/* 路由重定向,嵌套路由默认重定向到当前菜单的第一个路由 */}
{redirectData.map((item, index) => {
return <Redirect key={index} exact from={item.from} to={item.to} />;
})}
<Redirect exact from="/" to="/" />
{/* 未匹配到的路由重定向到 <Guide> 组件,实际情况应该重定向到 404 */}
<Route component={NotFound} />
</Switch>
);
}
}
export default MainRoutes;
import React, { Component } from 'react';
import { Link } from 'react-router-dom';
import { withRouter } from 'react-router-dom';
import { Menu, Icon, Button, Layout } from 'antd';
import { get,set } from "../../../../service/Global";
import HttpClient from "../../../../service/HttpClient";
import Api from '../../../../service/Api'
import Logo from '../Logo/Logo'
import { asideMenuConfig } from '../../../../menuConfig';
const SubMenu = Menu.SubMenu;
const { Sider } = Layout;
let old = [{
name: '监控预警',
path: '/monitor',
icon: '&#xe654;',
authority: 'user',
children: [{
name: '提现监控管理',
path: '/monitor/manage',
authority: 'user',
},
{
name: '通知管理人',
path: '/monitor/manger',
authority: 'user',
},
{
name: '报警通知',
path: '/monitor/inform',
authority: 'user',
},
]
},
{
name: '玩家查询',
path: '/query',
icon: '&#xe657;',
authority: 'user',
children:[
{
name: '玩家货币查询',
path: '/query/player',
authority: 'user',
},
]
},
{
name: '白名单',
path: '/white',
icon: '&#xe657;',
authority: 'user',
children:[
{
name: '白名单管理',
path: '/white/mange',
authority: 'user',
},
]
},
{
name: '系统设置',
path: '/set',
icon: '&#xe657;',
authority: 'user',
children:[
{
name: '用户管理',
path: '/set/user',
authority: 'user',
},
]
}
];
@withRouter
export default class Aside extends Component {
constructor(props) {
super(props);
this.state = {
asideMenuConfig: []
}
}
componentWillMount() {
this.setState({
asideMenuConfig:old
})
// let scanType = get('scanCode');
// if (scanType == 0) {
// } else {
// this.headerMenuConfigs();
// }
}
headerMenuConfigs = () => {
HttpClient.get(Api.menu).then(data => {
this.setState({
asideMenuConfig: data
})
})
}
/**
* 获取默认展开菜单项
*/
getDefaultOpenKeys = () => {
const { location = {} } = this.props;
const { pathname } = location;
const asideMenuConfig=this.state.asideMenuConfig
const menus = this.getNavMenuItems(asideMenuConfig);
let openKeys = [];
if (Array.isArray(menus)) {
asideMenuConfig.forEach((item, index) => {
if (pathname.startsWith(item.path)) {
openKeys = [`${index}`];
}
});
}
return openKeys;
};
toggleCollapsed = () => {
this.setState({
collapsed: !this.state.collapsed,
});
};
/**
* 获取菜单项数据
*/
getNavMenuItems = (menusData) => {
if (!menusData) {
return [];
}
return menusData.filter(item => item.name && !item.hideInMenu).map((item, index) => {
const role = get('role');
if (item.authority === 'user') {
return this.getSubMenuOrItem(item, index);
} else {
if (role === 'admin' || role === 'configurer') {
return this.getSubMenuOrItem(item, index);
}
}
});
};
handleClick=(item)=>{
// if(!item){return}
set('readonly',item)
}
/**
* 二级导航
*/
getSubMenuOrItem = (item, index) => {
if (item.children && item.children.some(child => child.name)) {
const childrenItems = this.getNavMenuItems(item.children);
if (childrenItems && childrenItems.length > 0) {
return (
<SubMenu key={item.path + index} title={<span>
{
(() => {
if (item.icon) {
return <i className="iconfont mr-12" dangerouslySetInnerHTML={{ __html: item.icon }}></i>
} else {
return null
}
})()
}
{item.name}
</span>}>
{childrenItems}
</SubMenu>
);
}
return null;
}
return (
<Menu.Item key={'#' + item.path}>
<Link to={item.path} onClick={()=>this.handleClick(item.readonly)}>
{
(() => {
if (item.icon) {
return <i className="iconfont mr-12" dangerouslySetInnerHTML={{ __html: item.icon }}></i>
} else {
return null
}
})()
}
{item.name}
</Link>
</Menu.Item>
);
};
render() {
const asideMenuConfig=this.state.asideMenuConfig
return (
<Sider style={{ height: '100%', maxWidth: '160px', backgroundColor: '#FFF', boxShadow: '0 1px 10px rgba(200,200,200,.5)', zIndex: '999' }}>
<Logo />
<Menu selectedKeys={[window.location.hash]} defaultOpenKeys={['sub0']} mode="inline">
{this.getNavMenuItems(asideMenuConfig)}
</Menu>
</Sider>
)
}
}
import Aside from './Aside';
export default Aside;
import React, { PureComponent } from 'react';
import { Layout } from 'antd';
const {Footer} = Layout;
export default class Footers extends PureComponent {
render() {
return (
<Footer style={{ textAlign: 'center' }}>
Kingnet ©2019 应用接入系统
</Footer>
);
}
}
import Footers from './Footers';
export default Footers;
import React, { PureComponent } from "react";
import { Layout, Menu, Dropdown, Icon, Select, Form } from "antd";
import {get, getObj, set} from "../../../../service/Global";
import HttpClient from "../../../../service/HttpClient";
import Api from "../../../../service/Api";
import {hasIt} from "../../../../service/utils";
const { Header } = Layout;
@Form.create()
export default class Headers extends PureComponent {
state = {
loginInfo: { ...getObj("login_info") },
projectList:[],
projectId:''
};
getMenu = () => {
if (!this.state.loginInfo) {
return "";
} else {
return (
<Menu>
<Menu.Item key="1">
<a rel="noopener noreferrer" href="/#/account/change_password">
修改密码
</a>
</Menu.Item>
<Menu.Item key="2">
<a rel="noopener noreferrer" onClick={this.Logout}>
退出登录
</a>
</Menu.Item>
</Menu>
);
}
};
Logout=()=>{
return HttpClient.post(Api.logout).then(data => {
if(data){
this.props.history.push({
pathname:'/login'
})
}
})
}
// getProjectIds(params) {
// HttpClient.get(Api.projects, params).then(data => {
// if(data && data.data.length > 0){
// set('project_id', data.data[0].id);
// this.props.projectIdChange(data.data[0].id);
// this.setState({
// projectList: data.data,
// });
// }
// });
// }
componentDidMount() {
// this.getProjectIds({page_size:9999});
}
render() {
const { getFieldDecorator } = this.props.form;
return (
<Header style={{ padding: "0 40px" }} className="ctm-clearfix">
<div className="ctm-right">
<Dropdown overlay={this.getMenu}>
<a className="ant-dropdown-link" style={{ color: "#fff" }}>
<span className="mr-12">Hi! {this.state.loginInfo.name}</span>
<Icon type="down" />
</a>
</Dropdown>
</div>
</Header>
);
}
}
import Headers from './Headers';
export default Headers;
import React, { PureComponent } from 'react';
import { Link } from 'react-router-dom';
import './Logo.scss';
export default class Logo extends PureComponent {
render() {
return (
<div className="logo">
<Link to="/" className="logo-text"><i className="iconfont" style={{color:''}}>&#xe659;</i><span className="ml-10">夜店后台管理</span></Link>
</div>
);
}
}
.logo {
max-width: 256px;
height: 64px;
line-height: 64px;
text-align: center;
// border-bottom: 1px solid #E5E5E5;
.logo-text {
display: block;
width: 100%;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
font-size: 22px;
// color: #FF751A;
font-weight: bold;
>i{
font-weight: lighter;
font-size: 24px;
}
}
}
@media screen and (max-width: 1199px) {
.logo {
width: 80px;
.logo-text {
font-size: 22px;
}
}
}
import Logo from './Logo';
export default Logo;
import BasicLayout from './BasicLayout';
export default BasicLayout;
.ice-design-layout-dark {
&.ice-design-layout {
min-height: 100vh;
background-size: 100%;
background-repeat: no-repeat;
background-attachment: fixed;
}
.ice-layout {
width: 100%;
min-height: 100vh;
padding: 0 20px;
// background: transparent;
}
.ice-layout-main {
padding: 0 0 0 20px;
}
.ice-layout-section {
margin: 20px 0 0;
}
}
import HttpClient from "./service/HttpClient";
import Api from './service/Api'
import { get } from "./service/Global";
let asideMenuConfig =[{
name: '监控预警',
path: '/monitor',
icon: '&#xe654;',
authority: 'user',
children: [{
name: '提现监控管理',
path: '/monitor/manage',
authority: 'user',
},
{
name: '通知管理人',
path: '/monitor/manger',
authority: 'user',
},
{
name: '报警通知',
path: '/monitor/inform',
authority: 'user',
},
]
},
{
name: '玩家查询',
path: '/query',
icon: '&#xe657;',
authority: 'user',
children:[
{
name: '玩家货币查询',
path: '/query/player',
authority: 'user',
},
]
},
{
name: '白名单',
path: '/white',
icon: '&#xe657;',
authority: 'user',
children:[
{
name: '白名单管理',
path: '/white/mange',
authority: 'user',
},
]
},
{
name: '系统设置',
path: '/set',
icon: '&#xe657;',
authority: 'user',
children:[
{
name: '用户管理',
path: '/set/user',
authority: 'user',
},
]
}
];
// let scanType = get('scanCode');
// if (scanType == 0||!scanType) {
// asideMenuConfig = old;
// } else {
// const headerMenuConfigs = function () {
// HttpClient.get(Api.menu).then(data => {
// asideMenuConfig = data.data;
// })
// };
// headerMenuConfigs();
// }
const headerMenuConfig = []
export {
headerMenuConfig,
asideMenuConfig
};
import React, { Component, Fragment } from "react";
import ItemNav from "../../components/ItemNav";
import ItemName from "../../components/ItemName";
import ItemForm from "../../components/ItemForm";
import { Button, message, Alert } from "antd";
import HttpClient from "../../service/HttpClient";
import Api from "../../service/Api";
import { getObj } from "../../service/Global";
import { locale } from "moment";
export default class AccountChangePassword extends Component {
constructor(props) {
super(props);
this.state = {
dataSource: {
...getObj('login_info')
},
};
}
itemNav = {
list: [{ anchor: "账户配置" }, { anchor: "重置密码" }]
};
itemName = "账户信息";
back = () => {
location.href = '/#/login'
};
formItemLayout = {
labelCol: {
xs: { span: 4 },
sm: { span: 4 }
},
wrapperCol: {
xs: { span: 4 },
sm: { span: 4 }
}
};
config = [
{
type: "input",
label: "用户ID",
placeholder: "请输入...",
key: "id",
required: true,
disabled : true
},
{
type: "password",
label: "重置密码",
placeholder: "请输入...",
key: "pwd",
required: true,
},
// {
// type: "password",
// label: "新密码",
// placeholder: "请输入...",
// key: "new_password",
// required: true,
// },
// {
// type: "password",
// label: "确认密码",
// placeholder: "请输入...",
// key: "confirm_new_password",
// required: true,
// },
{
type: "submit",
extend: true,
render: (
<Fragment>
<Button type="primary" htmlType="submit" className="mr-20">
提交
</Button>
{/* <Button onClick={this.onClose}>返回</Button> */}
</Fragment>
)
}
];
getReqParams = params => {
// if(params.new_password != params.confirm_new_password){
// message.error('确认密码不一致')
// return
// }
this.changePassword({ ...params});
};
async getInfo(id) {
return await HttpClient.get(Api.get_user_list + "/" + id);
}
async changePassword(data) {
return await HttpClient.post(Api.rePwd, data).then(
data => {
if (data) {
message.success("操作成功", 1, this.back);
}
}
);
}
componentDidMount() {
}
render() {
return (
<Fragment>
<ItemNav itemNav={this.itemNav} />
<section className="content-base">
<ItemForm
config={this.config}
dataSource={this.state.dataSource}
formItemLayout={this.formItemLayout}
getReqParams={this.getReqParams}
/>
</section>
</Fragment>
);
}
}
import AccountChangePassword from './AccountChangePassword'
export default AccountChangePassword
import React from 'react'
import {Form, Icon, Input, Button} from 'antd'
import {withRouter} from "react-router-dom";
import {set, setObj,clear} from "../../service/Global";
import HttpClient from '../../service/HttpClient'
import Api from '../../service/Api'
import Base64 from 'base-64'
import './Login.scss'
@withRouter
class LoginTpl extends React.Component{
constructor(props){
super(props)
this.state={
loginType:0,
display:0
}
}
handleSubmit = (e) => {
e.preventDefault();
this.props.form.validateFields((err, values) => {
if (!err) {
this.loginTo(values);
}
});
};
loginTo(values){
HttpClient.post(Api.login,values).then(data => {
if(data){
setObj('login_info',data);
set('token', data.token);
//set('role', data.role);
// set('overdue_data', Date.now() + 1000*60*60*24);
// set('scanCode',data.scanCode)
this.props.history.push('/');
}
})
}
// componentDidMount() {
// clear();
// }
componentWillMount(){
//引入“微信内嵌二维码”脚本
var script = document.createElement('script');
script.type = 'text/javascript';
script.async = false;
script.src = 'https://rescdn.qqmail.com/node/ww/wwopenmng/js/sso/wwLogin-1.0.0.js';
document.head.appendChild(script);
}
componentDidMount(){
clear();
var data=location.href.split('=')[1]
if(data){
var lists=Base64.decode(data);
var email=lists.split('&')[0].split('=')[1]
var password=lists.split('&')[1].split('=')[1]
var obj={
email:email,
password:password
}
this.loginTo(obj);
}
/**
* ... other code
* */
//加载微信二维码
setTimeout(function() {
/**
* 微信内嵌二维码自定义样式有两种方式实现
* 第一种是把自定义样式写在一个css文件里面,部署到一个https链接上
* 第二种是把自定义样式通过base64加密后设置在href上
* */
var customeStyle = "data:text/css;base64,Lnd4X3FyY29kZSBpZnJhbWUgeyB3aWR0aDogMTYwcHg7IGhlaWdodDogMTYwcHg7IG1hcmdpbjogMDsgcGFkZGluZzogMDsgfQ0KLmxvZ2luUGFuZWwgeyBtYXJnaW46MDsgcGFkZGluZzogMDsgfQ0KLmxvZ2luUGFuZWwgLnRpdGxlLCAubG9naW5QYW5lbCAuaW5mbyB7IGRpc3BsYXk6IG5vbmU7IH0NCi5pbXBvd2VyQm94IC5xcmNvZGUgeyBtYXJnaW46IDA7IHdpZHRoOiAxNjBweDsgYm9yZGVyOiBub25lOyB9";
window.WwLogin({
// self_redirect: false,
id: "wx_login_container",
appid: "wwa846aeddd5ae71bf", //微信开放平台网站应用appid
// scope: "snsapi_login",
agentid:"1000021",
redirect_uri: encodeURI('http://test.auth.ahg-op.com/wx-api/user/permission'), //设置扫码成功后回调页面
state: "1",
style: "black",
href: customeStyle, //location.origin + "/css/wx_qrcode.css", //自定义微信二维码样式文件
});
//设置iframe标签可以进行跨域跳转
var qrcodeBox = document.getElementById("wx_login_container");
var iframes = qrcodeBox.getElementsByTagName("iframe");
if (iframes.length){
var ifr = iframes[0];
ifr.setAttribute("sandbox", "allow-scripts allow-top-navigation allow-same-origin");
}
}, 1000)
}
handleType=(e)=>{
e.preventDefault();
this.setState({
loginType:0,
display:0
})
}
handleType1=(e)=>{
e.preventDefault();
this.setState({
loginType:1,
display:1
})
}
render() {
const { getFieldDecorator } = this.props.form;
return(
<section>
<div className="login_panel">
<div className="title">夜店管理后台</div>
<div className='tab'>
<a href="#" className={this.state.display==0?'first active':'first'} onClick={this.handleType}>账号登录</a>
{/* <a href="#" onClick={this.handleType1} className={this.state.display==1?'active':''}>注册</a> */}
</div>
<Form onSubmit={this.handleSubmit} className="login-form" style={{display:this.state.loginType==0?'block':'none'}}>
<Form.Item>
{getFieldDecorator('name', {
rules: [{ required: true, message: '请输入用户名!' }],
})(
<Input prefix={<Icon type="user" style={{ color: 'rgba(0,0,0,.25)' }} />} placeholder="用户名" />
)}
</Form.Item>
<Form.Item>
{getFieldDecorator('pwd', {
rules: [{ required: true, message: '请输入密码!' }],
})(
<Input prefix={<Icon type="lock" style={{ color: 'rgba(0,0,0,.25)' }} />} type="password" placeholder="密码" />
)}
</Form.Item>
<Button type="primary" htmlType="submit" className="login-form-button">
登录
</Button>
</Form>
{/* <div className='codeContainer' style={{display:this.state.loginType==1?'block':'none'}}>
<div id='wx_login_container' className="wx_qrcode"></div>
</div> */}
</div>
</section>
)
}
}
const Login = Form.create({ name: 'login' })(LoginTpl);
export default Login;
.login_panel{
width: 300px;
margin: 120px auto;
>.title{
font-size: 26px;
color: #FF751A;
}
.tab{
display: flex;
width: 100%;
margin: 10px auto 5px auto;
justify-content: center;
align-items: center;
a{
width: 50%;
text-align: center;
font-size: 16px;
color: #000;
}
// .first{
// border-right: 1px solid #000;
// }
// .active{
// color: #FF751A;
// }
}
}
import Login from './Login'
export default Login;
import React,{Fragment} from 'react';
import moment from 'moment';
import { withRouter } from "react-router-dom";
import ItemNav from "../../components/ItemNav";
import ItemTableQuery from "../../components/ItemTableQuery";
import ItemTable from "../../components/ItemTable";
import HttpClient from "../../service/HttpClient";
import Api from "../../service/Api";
import { set, get } from "../../service/Global";
import {Tag, Button, Empty, Modal, Table, Input,Form, Select} from 'antd';
import {dateFormat, parseParams} from "../../service/utils";
import {Store} from "marine";
const { TextArea } = Input;
@withRouter
class MonitorInform extends React.Component{
constructor(props){
super(props);
this.state={
platData:[],
dataSource:{
},
}
}
form;
defaultParams = {
page:1,
pageSize:10
};
itemNav = {
list: [{ anchor: "报警通知" }],
};
columns = [
{ title: "ID", dataIndex: "id", key: "id",fixed: 'left',width: 100},
{ title: "平台名称", dataIndex: "platform", key: "platform"},
{ title: "渠道名称", dataIndex: "channel", key: "channel" },
{ title: "提现金额", dataIndex: "amount", key: "amount" },
{ title: "预警时间", dataIndex: "createdAt", key: "createdAt", },
{ title: "单次最高提现", dataIndex: "oneWithdrawal", key: "oneWithdrawal"},
{ title: "单日最高提现", dataIndex: "dayWithdrawal", key: "dayWithdrawal",},
{ title: "单日单用户最高提现", dataIndex: "userDayWithdrawal", key: "userDayWithdrawal",},
// { title: "预警时间", dataIndex: "operate", key: "operate"},
];
getList(params){
return HttpClient.post(Api.warnLog,{...params}).then(data => {
this.setState({
dataSource: data,
})
})
}
getPlatList(){
return HttpClient.post(Api.platformList).then(data => {
let tmp=[]
for(var i in data){
if(i!=0){
let obj= {id:i,name:data[i]}
tmp.push(obj)
}
}
this.setState({
platData:tmp
})
})
}
pager = (page) => {
this.defaultParams = Object.assign({},this.defaultParams,{page_index:page});
this.getList(this.defaultParams);
};
getTableQuery=(params)=>{
if(params['range_picker']){
console.log(params['range_picker'])
const [startTime,endTime] = params['range_picker'];
this.defaultParams = Object.assign(this.defaultParams,{startTime,endTime},{...params});
}else {
this.defaultParams = Object.assign(this.defaultParams,{...params});
}
delete this.defaultParams.range_picker;
this.getList(this.defaultParams);
};
resetParams = ()=>{
this.defaultParams = {};
this.setState({
tableData:{}
})
};
showBatchModal = () => {
this.setState({visible: true,});
};
componentDidMount() {
this.getPlatList()
this.getList(this.defaultParams)
}
render() {
const {platData}=this.state;
const itemTableQuery= [
{
label:'选择日期',
type: "range_picker",
key: "date",
},
{
label:'所属平台',
type:'select',
key:'platform',
// mode:'multiple',
placeholder:'全部',
data:platData,
},
{
type:'input',
key:'id',
placeholder:'请输入警告id'
},
{
type: "submit",
extend: false,
}
];
return(
<Fragment>
<ItemNav itemNav={this.itemNav} />
<section className='content-base'>
<div className='mb-20'>
<ItemTableQuery getTableQuery={this.getTableQuery} resetParams={this.resetParams} itemTableQuery={itemTableQuery} />
</div>
<ItemTable columns={this.columns} dataSource={this.state.dataSource} pager={this.pager} />
</section>
</Fragment>
)
}
}
export default Form.create()(MonitorInform)
\ No newline at end of file
import MonitorInform from './MonitorInform'
export default MonitorInform
import React,{Fragment} from 'react';
import moment from 'moment';
import { withRouter } from "react-router-dom";
import ItemNav from "../../components/ItemNav";
import ItemTableQuery from "../../components/ItemTableQuery";
import ItemTable from "../../components/ItemTable";
import HttpClient from "../../service/HttpClient";
import Api from "../../service/Api";
import { set, get } from "../../service/Global";
import {Tag, Button, Empty, Modal, Table, Input,Form, Select,Popconfirm,message} from 'antd';
import {dateFormat, parseParams} from "../../service/utils";
import {Store} from "marine";
import './index.scss'
const { TextArea } = Input;
@withRouter
class MonitorMange extends React.Component{
constructor(props){
super(props);
this.state={
visible: false,
platData:[],
channelData:[],
dataSource:{},
currencyData:[],
list:{},
selectedRowKeys:[],
}
}
form;
defaultParams = {
page:1,
pageSize:10
};
itemNav = {
list: [{ anchor: "提现监控管理" }],
};
columns = [
{ title: "平台", dataIndex: "platform", key: "platform"},
{ title: "渠道", dataIndex: "channel", key: "channel" },
{ title: "货币", dataIndex: "type", key: "type" },
{ title: "单次最高提现", dataIndex: "oneWithdrawal", key: "oneWithdrawal", },
{ title: "单日最高提现", dataIndex: "dayWithdrawal", key: "dayWithdrawal"},
{ title: "每日单用户最高提现", dataIndex: "userDayWithdrawal", key: "userDayWithdrawal",},
{ title: "状态", dataIndex: "statusName", key: "statusName",},
{ title: "操作", dataIndex: "operate", key: "operate",render:(text,record)=>{
return <div>
<Button type='default' className='ml-10 edit' onClick={()=> this.showBatchModal(record)}>修改</Button>
<Popconfirm
title="你确定删除吗?"
onConfirm={()=>{this.handleDelete(record.id)}}
//onCancel={this.cancel}
okText="Yes"
cancelText="No"
>
<Button type='link ml-20 delete-red' >删除</Button>
</Popconfirm>
</div>
}}
];
handleDelete=(id)=>{
return HttpClient.post(Api.warnDelete,{id:id}).then(data => {
if(data){
message.success('删除成功!');
this.getList(this.defaultParams)
}
})
}
getList(params){
return HttpClient.post(Api.warnList,{...params,}).then(data => {
this.setState({
dataSource: data,
})
})
}
getPlatList(){
return HttpClient.post(Api.platformList).then(data => {
let tmp=[]
for(var i in data){
if(i!=0){
let obj= {id:i,name:data[i]}
tmp.push(obj)
}
}
this.setState({
platData:tmp
})
})
}
channelList=()=>{
return HttpClient.post(Api.channelList).then(data => {
let tmp=[]
for(var i in data){
if(i!=0){
let obj= {id:i,name:data[i]}
tmp.push(obj)
}
}
this.setState({
channelData:tmp
})
})
}
currencyList=()=>{
return HttpClient.post(Api.currencyList).then(data => {
let tmp=[]
for(var i in data){
if(i!=0){
let obj= {id:i,name:data[i]}
tmp.push(obj)
}
}
this.setState({
currencyData:tmp
})
})
}
pager = (page) => {
this.defaultParams = Object.assign({},this.defaultParams,{page_index:page});
this.getList(this.defaultParams);
};
getTableQuery=(params)=>{
this.defaultParams = Object.assign(this.defaultParams,{...params});
this.getList(this.defaultParams);
};
resetParams = ()=>{
this.defaultParams = {};
this.setState({
tableData:{}
})
};
handleCancel = () => {
this.setState({ visible: false });
};
handleOk=()=>{
const id=this.state.list.id;
this.props.form.validateFields((err, values) => {
if (!err) {
console.log('Received values of form: ', values);
if(id){
HttpClient.post(Api.warnEdit,{...values,id:id}).then(data => {
this.setState({ visible: false });
this.getList(this.defaultParams)
})
}else{
HttpClient.post(Api.warnAdd,{...values}).then(data => {
this.setState({ visible: false });
this.getList(this.defaultParams)
})
}
}
});
}
showBatchModal = (list) => {
if(list){
this.setState({visible: true,list});
}else{
this.setState({visible: true,list:{}});
}
};
handleStart=(status)=>{
const that=this;
const {selectedRowKeys}=this.state;
if(selectedRowKeys.length==0){
message.info('请至少选择一个!');
return;
}
return HttpClient.post(Api.warnStatusAll,{status,ids:selectedRowKeys.join('#')}).then(data => {
if(data){
message.success('操作成功');
this.getList(this.defaultParams);
that.setState({
selectedRowKeys:null,
})
}
})
}
componentDidMount() {
this.getPlatList();
this.channelList()
this.currencyList()
this.getList(this.defaultParams)
}
render() {
const {platData,channelData,currencyData,list,selectedRowKeys}=this.state;
const itemTableQuery= [
{
label:'所属平台',
type: "select",
key: "platform",
mode:"multiple",
data: platData,
placeholder: "全部",
},
{
label:'所属渠道',
type:'select',
key:'channel',
mode:"multiple",
placeholder: "全部",
data:channelData,
//defaultValue:"0"
},
{
type:'select',
key:'status',
label:'状态',
defaultValue:"0",
data:[
{name:'全部',id:"0"},
{name:'启用',id:1},
{name:'停用',id:2},
],
},
{
type: "submit",
extend: false,
render: <Fragment>
<Popconfirm
title="你确定启用吗?"
onConfirm={()=> this.handleStart(1)}
//onCancel={this.cancel}
okText="Yes"
cancelText="No"
>
<Button type='default' className='ml-10 start' >启用</Button>
</Popconfirm>
<Popconfirm
title="你确定暂停吗?"
onConfirm={()=> this.handleStart(2)}
//onCancel={this.cancel}
okText="Yes"
cancelText="No"
>
<Button type='default' className='ml-10 stop' >暂停</Button>
</Popconfirm>
</Fragment>,
},
];
const { getFieldDecorator } = this.props.form;
const formItemLayout = {
labelCol: {
xs: { span: 24 },
sm: { span: 8 },
},
wrapperCol: {
xs: { span: 24 },
sm: { span: 12 },
},
};
const rowSelection = {
selectedRowKeys,
onChange: (selectedRowKeys, selectedRows) => {
console.log(`selectedRowKeys: ${selectedRowKeys}`);
this.setState({selectedRowKeys})
},
// onSelect: (record, selected, selectedRows) => {
// //console.log(record, selected, selectedRows);
// },
// onSelectAll: (selected, selectedRows, changeRows) => {
// // console.log(selected, selectedRows, changeRows);
// },
};
return(
<Fragment>
<ItemNav itemNav={this.itemNav} />
<section className='content-base'>
<div className='mb-20 formwrapper'>
<div className='formBg'><ItemTableQuery getTableQuery={this.getTableQuery} resetParams={this.resetParams} itemTableQuery={itemTableQuery} /></div>
<Button type='primary' className='ml-20' onClick={()=> this.showBatchModal()}>设置监控提现</Button>
</div>
<ItemTable columns={this.columns} dataSource={this.state.dataSource} pager={this.pager} rowSelection={rowSelection}/>
</section>
<Modal title="设置提现监控"
visible={this.state.visible}
onOk={this.handleOk}
onCancel={this.handleCancel}>
<Form {...formItemLayout} >
<Form.Item label="所属平台">
{getFieldDecorator('platform', {
initialValue:list.platformId?list.platformId.toString():'',
rules: [
// {
// required: true,
// message: '请选择',
// },
],
})(
<Select placeholder='全部' disabled={list.platformId?true:false}>
{
platData&&platData.map((item,i)=>{
return <Select.Option value={item.id} key={i}>{item.name}</Select.Option>
})
}
</Select>
)}
</Form.Item>
<Form.Item label="所属渠道" placeholder='请选择'>
{getFieldDecorator('channel', {
initialValue:list.channelId?list.channelId.toString():'',
rules: [
{
required: true,
message: '请选择',
},
],
})(
<Select disabled={list.channelId?true:false} placeholder='全部'>
{
channelData&&channelData.map((item,i)=>{
return <Select.Option value={item.id} key={i}>{item.name}</Select.Option>
})
}
</Select>
)}
</Form.Item>
<Form.Item label="货币">
{getFieldDecorator('type', {
initialValue:list.typeId?list.typeId.toString():'',
rules: [
{
required: true,
message: '请选择',
},
],
})(
<Select disabled={list.typeId?true:false}>
{
currencyData&&currencyData.map((item,i)=>{
return <Option value={item.id} key={i}>{item.name}</Option>
})
}
</Select>
)}
</Form.Item>
<Form.Item label="单日单次最高提现值">
{getFieldDecorator('oneWithdrawal', {
initialValue:list?list.oneWithdrawal:'',
rules: [
{
required: true,
message: '请选择',
},
],
})(
<Input/>
)}
</Form.Item>
<Form.Item label="单日最高提现值">
{getFieldDecorator('dayWithdrawal', {
initialValue:list?list.dayWithdrawal:'',
rules: [
{
required: true,
message: '请选择',
},
],
})(
<Input/>
)}
</Form.Item>
<Form.Item label="单日单用户最高提现值">
{getFieldDecorator('userDayWithdrawal', {
initialValue:list?list.userDayWithdrawal:'',
rules: [
{
required: true,
message: '请选择',
},
],
})(
<Input/>
)}
</Form.Item>
</Form>
</Modal>
</Fragment>
)
}
}
export default Form.create()(MonitorMange)
\ No newline at end of file
import MonitorMange from './MonitorMange'
export default MonitorMange;
\ No newline at end of file
.formwrapper{
display: flex;
.formBg{
width: 90%;
}
}
\ No newline at end of file
import React,{Fragment} from 'react';
import moment from 'moment';
import { withRouter } from "react-router-dom";
import ItemNav from "../../components/ItemNav";
import ItemTableQuery from "../../components/ItemTableQuery";
import ItemTable from "../../components/ItemTable";
import HttpClient from "../../service/HttpClient";
import Api from "../../service/Api";
import { set, get } from "../../service/Global";
import {Tag, Button, Empty, Modal, Table, Input,Form, Select,Popconfirm,message} from 'antd';
import {dateFormat, parseParams} from "../../service/utils";
import {Store} from "marine";
const { TextArea } = Input;
@withRouter
class MonitorManger extends React.Component{
constructor(props){
super(props);
this.state={
visible: false,
platData:[],
channelData:[],
dataSource:{},
list:{}
}
}
form;
defaultParams = {
page:1,
pageSize:10
};
itemNav = {
list: [{ anchor: "通知管理人" }],
};
columns = [
{ title: "平台名称", dataIndex: "platform", key: "platform",},
{ title: "渠道名称", dataIndex: "channel", key: "channel" },
{ title: "姓名", dataIndex: "name", key: "name" },
{ title: "手机号", dataIndex: "phone", key: "phone", },
{ title: "状态", dataIndex: "statusName", key: "statusName",},
{ title: "操作人", dataIndex: "optionUser", key: "optionUser",},
{ title: "更新时间", dataIndex: "createdAt", key: "createdAt",},
{ title: "操作", dataIndex: "operate", key: "operate",render:(text,record)=>{
return <div>
<Button type='link' onClick={()=>{this.showBatchModal(record)}}>修改</Button>
<Button type='link start-color' onClick={()=>{this.setStatus(record)}}>{record.status==1?'禁用':'启用'}</Button>
<Popconfirm
title="你确定删除吗?"
onConfirm={()=>{this.handleDelete(record.id)}}
//onCancel={this.cancel}
okText="Yes"
cancelText="No"
>
<Button type='link ml-20 delete-red' >删除</Button>
</Popconfirm>
</div>
}},
];
setStatus=(record)=>{
return HttpClient.post(Api.peopleStatus,{id:record.id,status:record.status==1?2:1}).then(data => {
if(data){
message.success('操作成功!');
this.getList(this.defaultParams)
}
})
}
handleDelete=(id)=>{
return HttpClient.post(Api.peopleDelete,{id:id}).then(data => {
if(data){
message.success('删除成功!');
this.getList(this.defaultParams)
}
// this.setState({
// dataSource: data,
// })
})
}
getList(params){
return HttpClient.post(Api.peopleList,{...params,}).then(data => {
this.setState({
dataSource: data,
})
})
}
getPlatList(){
return HttpClient.post(Api.platformList).then(data => {
let tmp=[]
for(var i in data){
let obj= {id:i,name:data[i]}
tmp.push(obj)
}
this.setState({
platData:tmp
})
})
}
channelList=()=>{
return HttpClient.post(Api.channelList).then(data => {
let tmp=[]
for(var i in data){
let obj= {id:i,name:data[i]}
tmp.push(obj)
}
this.setState({
channelData:tmp
})
})
}
pager = (page) => {
this.defaultParams = Object.assign({},this.defaultParams,{page_index:page});
this.getList(this.defaultParams);
};
getTableQuery=(params)=>{
if(params['range_picker']){
const [startTime,endTime] = params['range_picker'];
this.defaultParams = Object.assign(this.defaultParams,{startTime,endTime},{...params});
}else {
this.defaultParams = Object.assign(this.defaultParams,{...params});
}
delete this.defaultParams.range_picker;
this.getList(this.defaultParams);
};
resetParams = ()=>{
this.defaultParams = {};
this.setState({
tableData:{}
})
};
handleCancel = () => {
this.setState({ visible: false });
};
handleOk=()=>{
const id=this.state.list.id;
this.props.form.validateFields((err, values) => {
if (!err) {
console.log('Received values of form: ', values);
if(id){
HttpClient.post(Api.peopleEdit,{...values,id:id}).then(data => {
this.setState({ visible: false });
this.getList(this.defaultParams)
})
}else{
HttpClient.post(Api.peopleAdd,{...values}).then(data => {
this.setState({ visible: false });
this.getList(this.defaultParams)
})
}
}
});
}
showBatchModal = (list) => {
if(list){
this.setState({visible: true,list});
}else{
this.setState({visible: true,list:{}});
}
};
componentDidMount() {
this.getPlatList();
this.channelList();
this.getList(this.defaultParams)
}
render() {
const {platData,channelData,list}=this.state;
const itemTableQuery= [
{
label:'选择日期',
type: "range_picker",
key: "date",
},
{
label:'所属平台',
type:'select',
key:'platform',
// mode:'multiple',
placeholder:'全部',
data:platData,
},
{
type:'input',
key:'key',
placeholder:'请输入姓名'
},
{
type: "submit",
extend: false,
render: <Fragment>
</Fragment>,
},
];
const { getFieldDecorator } = this.props.form;
const formItemLayout = {
labelCol: {
xs: { span: 24 },
sm: { span: 8 },
},
wrapperCol: {
xs: { span: 24 },
sm: { span: 12 },
},
};
return(
<Fragment>
<ItemNav itemNav={this.itemNav} />
<section className='content-base'>
<div className='mb-20 formwrapper'>
<div className='formBg'><ItemTableQuery getTableQuery={this.getTableQuery} resetParams={this.resetParams} itemTableQuery={itemTableQuery} /></div>
<Button type='primary' className='ml-20' onClick={()=> this.showBatchModal()}>添加管理员</Button>
</div>
<ItemTable columns={this.columns} dataSource={this.state.dataSource} pager={this.pager} />
</section>
<Modal title="添加管理员"
visible={this.state.visible}
onOk={this.handleOk}
onCancel={this.handleCancel}>
<Form {...formItemLayout} >
<Form.Item label="所属平台">
{getFieldDecorator('platform', {
initialValue:list.platformId?list.platformId.toString():"0",
rules: [
{
required: true,
message: '请选择',
},
],
})(
<Select>
{
platData&&platData.map((item,i)=>{
return <Select.Option value={item.id} key={i}>{item.name}</Select.Option>
})
}
</Select>
)}
</Form.Item>
<Form.Item label="所属渠道">
{getFieldDecorator('channel', {
initialValue:list.channelId?list.channelId.toString():'0',
rules: [
{
required: true,
message: '请选择',
},
],
})(
<Select >
{
channelData&&channelData.map((item,i)=>{
return <Select.Option value={item.id} key={i}>{item.name}</Select.Option>
})
}
</Select>
)}
</Form.Item>
<Form.Item label="真实姓名">
{getFieldDecorator('remarkName', {
initialValue:list?list.name:'',
rules: [
{
required: true,
message: '请选择',
},
],
})(
<Input/>
)}
</Form.Item>
<Form.Item label="手机号">
{getFieldDecorator('phone', {
initialValue:list?list.phone:'',
rules: [
{
required: true,
message: '请选择',
},
],
})(
<Input/>
)}
</Form.Item>
</Form>
</Modal>
</Fragment>
)
}
}
export default Form.create()(MonitorManger)
\ No newline at end of file
import MonitorManger from './MonitorManger'
export default MonitorManger
import React,{Fragment} from 'react';
import moment from 'moment';
import { withRouter } from "react-router-dom";
import ItemNav from "../../components/ItemNav";
import ItemTableQuery from "../../components/ItemTableQuery";
import ItemTable from "../../components/ItemTable";
import HttpClient from "../../service/HttpClient";
import Api from "../../service/Api";
import { set, get,downloadExcel } from "../../service/Global";
import {Tag, Button, Empty, Modal, Table, Input,Form, Select} from 'antd';
import {dateFormat, parseParams} from "../../service/utils";
import {Store} from "marine";
const { TextArea } = Input;
@withRouter
class QueryPlayer extends React.Component{
constructor(props){
super(props);
this.state={
visible: false,
platData:[],
channelData:[],
currencyData:[],
dataSource:{},
}
}
form;
defaultParams = {
page:1,
pageSize:10
};
itemNav = {
list: [{ anchor: "玩家管理" }],
};
columns = [
{ title: "玩家ID", dataIndex: "uid", key: "uid",},
{ title: "平台名称", dataIndex: "platformName", key: "platformName"},
{ title: "渠道名称", dataIndex: "channelName", key: "channelName" },
{ title: "原来数量", dataIndex: "beforeNum", key: "beforeNum" },
{ title: "日志类型", dataIndex: "typeName", key: "typeName", },
{ title: "变化量", dataIndex: "optionNum", key: "optionNum"},
{ title: "现在数量", dataIndex: "afterNum", key: "afterNum",},
{ title: "来源", dataIndex: "source", key: "source",},
{ title: "日志时间", dataIndex: "logTime", key: "logTime"},
];
getList(params){
return HttpClient.post(Api.logList,{...params}).then(data => {
this.setState({
dataSource: data,
})
})
}
getPlatList(){
return HttpClient.post(Api.platformList).then(data => {
let tmp=[]
for(var i in data){
let obj= {id:i,name:data[i]}
tmp.push(obj)
}
this.setState({
platData:tmp
})
})
}
channelList=()=>{
return HttpClient.post(Api.channelList).then(data => {
let tmp=[]
for(var i in data){
let obj= {id:i,name:data[i]}
tmp.push(obj)
}
this.setState({
channelData:tmp
})
})
}
currencyList=()=>{
return HttpClient.post(Api.currencyList).then(data => {
let tmp=[]
for(var i in data){
let obj= {id:i,name:data[i]}
tmp.push(obj)
}
this.setState({
currencyData:tmp
})
})
}
pager = (page) => {
this.defaultParams = Object.assign({},this.defaultParams,{page_index:page});
this.getList(this.defaultParams);
};
getTableQuery=(params)=>{
if(params['range_picker']){
console.log(params['range_picker'])
const [startTime,endTime] = params['range_picker'];
this.defaultParams = Object.assign(this.defaultParams,{startTime,endTime},{...params});
}else {
this.defaultParams = Object.assign(this.defaultParams,{...params});
}
delete this.defaultParams.range_picker;
this.getList(this.defaultParams);
};
resetParams = ()=>{
this.defaultParams = {};
this.setState({
tableData:{}
})
};
getExcel = () => {
const {data}=this.state.dataSource.data?this.state.dataSource:{};
downloadExcel(data,'玩家管理', ["uid","platformName","channelName","beforeNum","typeName","optionNum","afterNum","source","logTime"],["玩家ID","平台名称","渠道名称","原来数量","日志类型","变化量","现在数量","来源","日志时间",])
};
showBatchModal = () => {
this.setState({visible: true,});
};
componentDidMount() {
this.getPlatList();
this.channelList();
this.currencyList();
this.getList(this.defaultParams)
}
render() {
const {platData,channelData,currencyData}=this.state;
const itemTableQuery= [
{
label:'选择日期',
type: "range_picker",
key: "date",
},
{
label:'所属平台',
type:'select',
key:'platform',
// mode:'multiple',
defaultValue:platData.length>0?'0':'',
data:platData,
},
{
label:'所属渠道',
type:'select',
key:'channel',
defaultValue:channelData.length>0?'0':'',
data:channelData,
},
{
label:'日志类型',
type:'select',
key:'logType',
//placeholder:'全部',
data:[
{name:'货币产出',id:1},
{name:'货币消耗',id:2},
],
},
{
label:'货币类型',
type:'select',
key:'type',
defaultValue:currencyData.length>0?'0':'',
data:currencyData,
},
{
type:'input',
key:'uid',
placeholder:'请输入玩家ID'
},
{
type: "submit",
extend: false,
render: <Fragment>
<Button type='default' className='ml-20 export' onClick={()=> this.getExcel()}>导出</Button>
</Fragment>,
}
];
return(
<Fragment>
<ItemNav itemNav={this.itemNav} />
<section className='content-base'>
<div className='mb-20'>
<ItemTableQuery getTableQuery={this.getTableQuery} resetParams={this.resetParams} itemTableQuery={itemTableQuery} />
</div>
<ItemTable columns={this.columns} dataSource={this.state.dataSource} pager={this.pager} />
</section>
</Fragment>
)
}
}
export default Form.create()(QueryPlayer)
\ No newline at end of file
import QueryPlayer from "./QueryPlayer";
export default QueryPlayer
import React,{Fragment} from 'react';
import moment from 'moment';
import { withRouter } from "react-router-dom";
import ItemNav from "../../components/ItemNav";
import ItemTableQuery from "../../components/ItemTableQuery";
import ItemTable from "../../components/ItemTable";
import HttpClient from "../../service/HttpClient";
import Api from "../../service/Api";
import { set, get } from "../../service/Global";
import {Tag, Button, Empty, Modal, Table, Input,Form, Popconfirm,message} from 'antd';
import {dateFormat, parseParams} from "../../service/utils";
import {Store} from "marine";
const { TextArea } = Input;
@withRouter
class User extends React.Component{
constructor(props){
super(props);
this.state={
visible: false,
visible_edit:false,
title:'新增用户',
list:{},
dataSource:{},
}
}
form;
defaultParams = {
page:1,
pageSize:10
};
itemNav = {
list: [{ anchor: "用户管理" }],
};
columns = [
{ title: "姓名", dataIndex: "name", key: "name" },
{ title: "真实姓名", dataIndex: "realName", key: "realName"},
{ title: "手机号", dataIndex: "phone", key: "phone",},
{ title: "邮箱", dataIndex: "email", key: "email", },
{ title: "创建时间", dataIndex: "created_at", key: "created_at",},
{ title: "操作", dataIndex: "operate", key: "operate",render:(text,record)=>{
return <div>
<Button type='link start-color' onClick={()=> this.handleStart(record.id,record.status)}>{record.status==0?'启用':'封停'}</Button>
<Button type='link ' onClick={()=> this.handleEditPwd(record)}>重置密码</Button>
<Popconfirm
title="你确定删除吗?"
onConfirm={()=> this.handleDelete(record)}
//onCancel={this.cancel}
okText="Yes"
cancelText="No"
>
<Button type='link ml-20 delete-red' >删除</Button>
</Popconfirm>
</div>
}},
];
handleStart(id,status){
return HttpClient.post(Api.setUserStatus,{id:id,status:status==1?2:1}).then(data => {
this.getList(this.defaultParams);
})
}
handleEditPwd=(list)=>{
this.setState({
visible_edit:true,
list:list
})
}
handleDelete=(record)=>{
return HttpClient.post(Api.deleteUserList,{id:record.id}).then(data => {
if(data){
message.success('删除成功!');
this.getList(this.defaultParams)
}
// this.setState({
// dataSource: data,
// })
})
}
getList(params){
return HttpClient.post(Api.getUserList,{...params}).then(data => {
this.setState({
dataSource: data,
})
})
}
pager = (page) => {
this.defaultParams = Object.assign({},this.defaultParams,{page_index:page});
this.getList(this.defaultParams);
};
getTableQuery=(params)=>{
this.defaultParams = Object.assign(this.defaultParams,{...params});
this.getList(this.defaultParams);
};
// resetParams = ()=>{
// this.defaultParams = {};
// this.setState({
// tableData:{}
// })
// };
handleCancel = () => {
this.setState({ visible: false,visible_edit:false });
};
handleOk=()=>{
this.props.form.validateFields((err, values) => {
console.log(values)
if (!err) {
console.log('Received values of form: ', values);
HttpClient.post(Api.addUser,{...values}).then(data => {
this.setState({ visible: false });
this.getList(this.defaultParams)
})
}
});
}
handleOkEdit=()=>{
this.props.form.validateFields((err, values) => {
HttpClient.post(Api.rePwd,{id:values.id,pwd:values.pwd}).then(data => {
if(data){
message.success('操作成功!')
this.setState({ visible_edit: false });
this.getList(this.defaultParams)
}
})
});
}
getExcel = () => {
// window.open(parseParams(Api.crm_order,Object.assign(this.defaultParams,{api_token:get('token'),export:1})));
};
showBatchModal = (list) => {
if(list){
this.setState({visible: true,list:list,title:'编辑用户'});
}else{
this.setState({visible: true,title:'新增用户'});
}
};
componentDidMount() {
this.getList(this.defaultParams)
}
render() {
const itemTableQuery= [
{
type:'input',
key:'key',
placeholder:'请输入姓名'
},
{
type: "submit",
extend: false,
// render: <Fragment>
// </Fragment>,
},
];
const { getFieldDecorator } = this.props.form;
const formItemLayout = {
labelCol: {
xs: { span: 24 },
sm: { span: 8 },
},
wrapperCol: {
xs: { span: 24 },
sm: { span: 12 },
},
};
const {list,title}=this.state;
return(
<Fragment>
<ItemNav itemNav={this.itemNav} />
<section className='content-base'>
<div className='mb-20 formwrapper'>
<div className='formBg'><ItemTableQuery getTableQuery={this.getTableQuery} resetParams={this.resetParams} itemTableQuery={itemTableQuery} /></div>
<Button type='primary' className='ml-20' onClick={()=> this.showBatchModal()}>添加</Button>
</div>
<ItemTable columns={this.columns} dataSource={this.state.dataSource} pager={this.pager} />
</section>
<Modal title={title}
visible={this.state.visible}
onOk={this.handleOk}
onCancel={this.handleCancel}>
<Form {...formItemLayout} >
<Form.Item label="姓名">
{getFieldDecorator('name', {
// initialValue:list?list.name:'',
rules: [
{
required: true,
message: '请选择',
},
],
})(
<Input/>
)}
</Form.Item>
<Form.Item label="真实姓名">
{getFieldDecorator('realName', {
// initialValue:list?list.realName:'',
rules: [
{
required: true,
message: '请选择',
},
],
})(
<Input/>
)}
</Form.Item>
<Form.Item label="密码">
{getFieldDecorator('pwd', {
// initialValue:list?list.pwd:'',
rules: [
{
required: true,
message: '请选择',
},
],
})(
<Input type='password'/>
)}
</Form.Item>
<Form.Item label="手机号">
{getFieldDecorator('phone', {
// initialValue:list?list.phone:'',
// rules: [
// {
// required: true,
// message: '请选择',
// },
// ],
})(
<Input type='phone'/>
)}
</Form.Item>
<Form.Item label="邮箱">
{getFieldDecorator('email', {
// initialValue:list?list.email:'',
// rules: [
// {
// required: true,
// message: '请选择',
// },
// ],
})(
<Input type='email'/>
)}
</Form.Item>
<Form.Item label="备注">
{getFieldDecorator('remark', {
// initialValue:list?list.remark:'',
// rules: [
// {
// required: true,
// message: '请选择',
// },
// ],
})(
<Input type='text'/>
)}
</Form.Item>
</Form>
</Modal>
<Modal title={title}
visible={this.state.visible_edit}
onOk={this.handleOkEdit}
onCancel={this.handleCancel}>
<Form {...formItemLayout} >
<Form.Item label="用户ID">
{getFieldDecorator('id', {
initialValue:list?list.id:'',
rules: [
{
required: true,
message: '请选择',
},
],
})(
<Input disabled/>
)}
</Form.Item>
<Form.Item label="密码">
{getFieldDecorator('pwd', {
// initialValue:list?list.realName:'',
rules: [
{
required: true,
message: '请选择',
},
],
})(
<Input/>
)}
</Form.Item>
</Form>
</Modal>
</Fragment>
)
}
}
export default Form.create()(User)
\ No newline at end of file
import User from './User';
export default User;
\ No newline at end of file
import React,{Fragment} from 'react';
import moment from 'moment';
import { withRouter } from "react-router-dom";
import ItemNav from "../../components/ItemNav";
import ItemTableQuery from "../../components/ItemTableQuery";
import ItemTable from "../../components/ItemTable";
import HttpClient from "../../service/HttpClient";
import Api from "../../service/Api";
import { set, get } from "../../service/Global";
import {Tag, Button, Empty, Modal, Table, Input,Form, Select,Popconfirm,message} from 'antd';
import {dateFormat, parseParams} from "../../service/utils";
import {Store} from "marine";
const { TextArea } = Input;
@withRouter
class WhiteMange extends React.Component{
constructor(props){
super(props);
this.state={
visible: false,
list:{},
startText:'启用',
stopText:'暂停',
disableds:false,
disabledt:false,
dataSource:{},
}
}
form;
defaultParams = {
page:1,
pageSize:10
};
itemNav = {
list: [{ anchor: "白名单管理" }],
};
columns = [
{ title: "ID", dataIndex: "id", key: "id",width: 100},
{ title: "账号", dataIndex: "name", key: "name", },
{ title: "状态", dataIndex: "status", key: "status",render:text=>{
if(text==1){
return '开启'
}else{
return '关闭'
}
}},
{ title: "创建人", dataIndex: "optionUser", key: "optionUser",},
{ title: "创建时间", dataIndex: "addTime", key: "addTime",},
{ title: "操作", dataIndex: "operate", key: "operate",render:(text,record)=>{
return <div>
<Button type='link start-color' onClick={()=> this.handleStart(record.id,1)} disabled={record.status==1?true:false}>{record.status==1?'已启用':'启用'}</Button>
<Button type='link delete-red' onClick={()=> this.handleStart(record.id,2)} disabled={record.status==2?true:false}>{record.status==2?'已暂停':'暂停'}</Button>
{/* <Button type='link' onClick={()=> this.showBatchModal(record)}>修改</Button> */}
<Popconfirm
title="你确定删除吗?"
onConfirm={()=> this.handleDelete(record)}
onCancel={this.cancel}
okText="Yes"
cancelText="No"
>
<Button type='link delete-red ml-20'>删除</Button>
</Popconfirm>
</div>
}},
];
handleStart(id,status){
return HttpClient.post(Api.setWhiteStatus,{id:id,status:status}).then(data => {
if(status==1){
message.success('当前账号白名单功能已启用!')
}else{
message.warn('当前账号白名单功能已暂停!')
}
this.getList(this.defaultParams)
})
}
handleDelete=(record)=>{
return HttpClient.post(Api.deleteUserList,{id:record.id}).then(data => {
message.success('删除成功!')
this.getList(this.defaultParams)
})
}
getList(params){
return HttpClient.post(Api.getWhiteList,{...params}).then(data => {
console.log(data)
this.setState({
dataSource: data,
})
})
}
pager = (page) => {
this.defaultParams = Object.assign({},this.defaultParams,{page_index:page});
this.getList(this.defaultParams);
};
getTableQuery=(params)=>{
this.defaultParams = Object.assign(this.defaultParams,{...params});
this.getList(this.defaultParams);
};
handleCancel = () => {
this.setState({ visible: false });
};
handleOk=()=>{
this.props.form.validateFields((err, values) => {
if (!err) {
console.log('Received values of form: ', values);
HttpClient.post(Api.addWhite,{...values}).then(data => {
this.setState({ visible: false });
this.getList(this.defaultParams)
})
}
});
}
showBatchModal = () => {
this.setState({visible: true});
};
componentDidMount() {
this.getList(this.defaultParams)
}
render() {
const itemTableQuery= [
{
label:'状态',
type:'select',
key:'status',
// mode:'multiple',
placeholder:'全部',
// defaultValue:-1,
data:[
// {name:'全部',id:-1},
{name:'启用',id:1},
{name:'禁用',id:2},
],
},
{
type:'input',
key:'name',
placeholder:'请输入姓名'
},
{
type: "submit",
extend: false,
render: <Fragment>
</Fragment>,
},
];
const { getFieldDecorator } = this.props.form;
const formItemLayout = {
labelCol: {
xs: { span: 24 },
sm: { span: 8 },
},
wrapperCol: {
xs: { span: 24 },
sm: { span: 12 },
},
};
const {list}=this.state;
return(
<Fragment>
<ItemNav itemNav={this.itemNav} />
<section className='content-base'>
<div className='mb-20 formwrapper'>
<div className='formBg'><ItemTableQuery getTableQuery={this.getTableQuery} itemTableQuery={itemTableQuery} /></div>
<Button type='primary' className='ml-20' onClick={()=> this.showBatchModal()}>添加白名单</Button>
</div>
<ItemTable columns={this.columns} dataSource={this.state.dataSource} pager={this.pager} />
</section>
<Modal title="添加白名单"
visible={this.state.visible}
onOk={this.handleOk}
onCancel={this.handleCancel}>
<Form {...formItemLayout} >
<Form.Item label="姓名">
{getFieldDecorator('name',
{
initialValue:list?list.name:'',
rules: [
{
required: true,
message: '请选择',
},
// {
// max:5,
// message:'最大长度5位'
// }
],
})(
<Input/>
)}
</Form.Item>
<Form.Item label="账号">
{getFieldDecorator('uid', {
rules: [
{
required: true,
message: '请选择',
},
// {
// len:11,
// message:'字段长度11位'
// }
],
})(
<Input/>
)}
</Form.Item>
</Form>
</Modal>
</Fragment>
)
}
}
export default Form.create()(WhiteMange)
\ No newline at end of file
import WhiteMange from "./WhiteMange";
export default WhiteMange;
\ No newline at end of file
/**
* 定义应用路由
*/
import { Switch, Route,HashRouter,hashHistory } from 'react-router-dom';
import React from 'react';
import BasicLayout from './layouts/BasicLayout';
import LoginLayout from "./layouts/BasicLayout/LoginLayout";
// 按照 Layout 归类分组可以按照如下方式组织路由
const router = () => {
return (
<HashRouter history={hashHistory}>
<Switch>
<Route path="/login" component={LoginLayout} />
<Route path="/" component={BasicLayout} />
</Switch>
</HashRouter>
);
};
export default router;
import BasicLayout from './layouts/BasicLayout'
import MonitorManger from "./pages/MonitorManger";
import MonitorInform from "./pages/MonitorInform";
import QueryPlayer from "./pages/QueryPlayer";
import MonitorMange from './pages/MonitorMange'
import User from './pages/User';
import WhiteMange from './pages/WhiteMange/WhiteMange';
import AccountChangePassword from './pages/AccountChangePassword'
const routerConfig = [
{
path: '/account/change_password',
layout: BasicLayout,
component: AccountChangePassword,
authority: 'admin',
},
{
path: '/monitor/manage',
layout: BasicLayout,
component: MonitorMange,
authority: 'admin',
},
{
path: '/monitor/manger',
layout: BasicLayout,
component: MonitorManger,
authority: 'admin',
},
{
path: '/monitor/inform',
layout: BasicLayout,
component: MonitorInform,
authority: 'admin',
},
{
path: '/query/player',
layout: BasicLayout,
component: QueryPlayer,
authority: 'admin',
},
{
path: '/set/user',
layout: BasicLayout,
component: User,
authority: 'admin',
},
{
path: '/white/mange',
layout: BasicLayout,
component: WhiteMange,
authority: 'admin',
},
];
export default routerConfig;
const APP_HOST_URL = process.env.APP_HOST_URL;
const domain = window.location.host;
let AMS_API_URL;
switch (domain) {
case 'os-ams.gamehaza.com':
AMS_API_URL = process.env.AMS_API_URL_01;
break;
default:
AMS_API_URL = process.env.AMS_API_URL_02;
break;
}
const Api = {
login: APP_HOST_URL + "/login", //登录
addUser:APP_HOST_URL + "/user/add", //新增用户post
getUserList:APP_HOST_URL + "/user/list", //获取用户列表post
deleteUserList:APP_HOST_URL + "/user/del", //获取用户列表post
rePwd:APP_HOST_URL + "/user/reset/pwd", //重置密码
addWhite:APP_HOST_URL + "/white/add", //新增用户post
getWhiteList:APP_HOST_URL + "/white/list", //获取用户列表post
deleteWhiteList:APP_HOST_URL + "/white/del", //获取用户列表post
setWhiteStatus:APP_HOST_URL + "/white/set/status", //白名单状态
setUserStatus:APP_HOST_URL + "/user/set/status", //设置用户状态
refreshToken:APP_HOST_URL + "/refresh/token", //刷新token
logout:APP_HOST_URL + "/logout", //退出
platformList:APP_HOST_URL + "/account/platform/list", //平台列表
channelList:APP_HOST_URL + "/account/channel/list", //渠道列表
currencyList:APP_HOST_URL + "/account/currency/list", //货币列表
logList:APP_HOST_URL + "/account/log", //货币查询
peopleAdd:APP_HOST_URL + "/warn/people/add", //预警人添加
peopleList:APP_HOST_URL + "/warn/people/list", //预警人列表
peopleEdit:APP_HOST_URL + "/warn/people/edit", //预警人编辑
peopleDelete:APP_HOST_URL + "/warn/people/del", //预警人删除
peopleStatus:APP_HOST_URL + "/warn/people/set/status", //预警人状态
warnAdd:APP_HOST_URL + "/warn/config/add", //预警人配置添加
warnEdit:APP_HOST_URL + "/warn/config/edit", //预警人配置编辑
warnList:APP_HOST_URL + "/warn/config/list", //预警人配置编辑
warnDelete:APP_HOST_URL + "/warn/config/del", //预警人配置删除
warnStatusAll:APP_HOST_URL + "/warn/config/set/all/status", //预警人配置批量状态
warnLog:APP_HOST_URL + "/warn/log", //预警通知
};
export default Api;
import axios from 'axios';
import {get,set,clear} from "./Global";
import {hasIt} from './utils';
import { message } from 'antd';
//取消请求
let CancelToken = axios.CancelToken;
axios.create({
timeout: 15000,// 请求超时时间
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
},
});
const error = (msg) => {
message.error(msg);
};
//开始请求设置,发起拦截处理
axios.interceptors.request.use(config => {
if(!hasIt('login', config.url)){
let token = get('token');
if (token) {
if(get('overdue_data') < Date.now()){
clear();
window.location.href='/#/login';
return
}
config.headers.token=token
} else {
window.location.href='/#/login';
}
}
let requestName = config.method;
return config
}, error => {
return Promise.reject(error)
});
// respone拦截器
axios.interceptors.response.use(
response => {
const res = response.data;
//这里根据后台返回来设置
if (res.code === '200') {
return res.data;
} else {
error(res.msg);
if(res.code==402){
clear();
window.location.href='/#/login';
}
return false;
}
},
error => {
console.log(error)
if(hasIt('402', error.toString())){
message.error('token超时,请重新登录!',1,()=>{
clear();
window.location.href='/#/login';
});
}
return Promise.reject(error)
}
);
export default axios;
import {reactLocalStorage} from 'reactjs-localstorage';
import ExportJsonExcel from 'js-export-excel';
export function set (key,value){
return reactLocalStorage.set(key,value);
}
export function get (key){
return reactLocalStorage.get(key);
}
export function remove (key){
return reactLocalStorage.remove(key);
}
export function setObj (key,value){
return reactLocalStorage.setObject(key,value);
}
export function getObj (key,value){
return reactLocalStorage.getObject(key);
}
export function clear(){
return reactLocalStorage.clear();
}
export function downloadExcel(data,title,filter,header){
// const data = data ? data : '';//表格数据
if(!data){return}
var option={};
option.fileName = title
option.datas=[
{
sheetData:data,
sheetName:'sheet',
sheetFilter:filter,
sheetHeader:header,
}
];
var toExcel = new ExportJsonExcel(option);
toExcel.saveExcel();
}
\ No newline at end of file
import server from './ApiInterceptors';
const HttpClient = {
get(url,params){
return server({
url: url,
method: 'get',
dataType: "json",
contentType: "application/x-www-form-urlencoded;charset=UTF-8",
params: params,
})
},
post(url,data){
return server({
url: url,
method: 'post',
dataType: "json",
contentType: "application/x-www-form-urlencoded;charset=UTF-8",
data: data,
})
},
put(url,data){
return server({
url: url,
method: 'put',
dataType: "json",
contentType: "application/x-www-form-urlencoded;charset=UTF-8",
data: data,
})
},
delete(url,params){
return server({
url: url,
method: 'delete',
dataType: "json",
contentType: "application/x-www-form-urlencoded;charset=UTF-8",
data: params,
})
},
};
export default HttpClient;
import HttpClient from './HttpClient'
export default class RestfulClient {
baseURL = null;
constructor(baseURL, ) {
this.baseURL = baseURL;
}
all = async params => {
return await HttpClient.get(this.baseURL, params);
};
update = async(id, params) => {
return await HttpClient.put(`${this.baseURL}/${id}`, params);
};
add = async params => {
return await HttpClient.post(this.baseURL, params);
};
delete = async id => {
return await HttpClient.delete(`${this.baseURL}/${id}`);
};
view = async id => {
return await HttpClient.get(`${this.baseURL}/${id}`);
};
}
\ No newline at end of file
import Api from './Api'
import HttpClient from './HttpClient'
const Service = {
getAppList : async data =>{
return await HttpClient.post(Api.crm_app_list,data)
},
updateUsername : async data =>{
return await HttpClient.post(Api.crm_update_username,data)
},
updateMobile : async data => {
return await HttpClient.post(Api.crm_update_mobile,data)
},
updateStatus : async data => {
return await HttpClient.post(Api.crm_update_status,data)
},
updatePwd : async data => {
return await HttpClient.post(Api.crm_update_pwd,data)
},
removeMobileBd : async data => {
return await HttpClient.post(Api.crm_user_un_bd_mobile,data)
},
removeEmailBd : async data => {
return await HttpClient.post(Api.crm_user_un_bd_email,data)
},
removeThirdAccountBd : async data => {
return await HttpClient.post(Api.crm_user_un_bd_third_account,data)
},
};
export default Service
import moment from 'moment'
export function hasIt(regex, target) {
let rule = new RegExp(regex);
return rule.test(target);
}
export function buildReq(data,keyArr) {
const arr=[];
const result = [];
const getRegex=(ruleKey)=>{
let rule = new RegExp(ruleKey);
Object.keys(data).forEach(function(key){
if(rule.test(key)){
let index = key.replace(ruleKey,'');
let obj = {};
obj[ruleKey] = data[key];
arr[index] = Object.assign({},arr[index],obj);
}
});
};
keyArr.map((item,i)=>{
getRegex(item);
});
arr.map((item,i)=>{
if(item){
result.push(item);
}
});
return result;
}
export function getPattern(index) {
const list = {
intel_mobile:/\+(9[976]\d|8[987530]\d|6[987]\d|5[90]\d|42\d|3[875]\d|2[98654321]\d|9[8543210]|8[6421]|6[6543210]|5[87654321]|4[987654310]|3[9643210]|2[70]|7|1)+\-(\d{1,14})$/,
email:/^([A-Za-z0-9_\-\.\u4e00-\u9fa5])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,8})$/,
};
return new RegExp(list[index]);
}
export function dateFormat(date) {
const dateParams = new Date(parseInt(date) * 1000);
return moment(dateParams).format('YYYY-MM-DD HH:mm:ss');
}
export function parseParams(uri, params){
const paramsArray = [];
Object.keys(params).forEach(key => params[key] && paramsArray.push(`${key}=${params[key]}`));
if (uri.search(/\?/) === -1) {
uri += `?${paramsArray.join('&')}`
} else {
uri += `&${paramsArray.join('&')}`
}
return uri
}
export function toPercent(point) {
var str=Number(point*100).toFixed(2);
str+="%";
return str;
}
@import "~antd/dist/antd.less";
@import "custom-antd.less";
@primary-color: #1890ff;
@text-color-secondary : #404040;
#ice-container{
width: 100%;
height: 100%;
min-height: 100%;
}
@font-face {font-family: 'iconfont';
src: url('../fonts/iconfont.eot');
src: url('../fonts/iconfont.eot?#iefix') format('embedded-opentype'),
url('../fonts/iconfont.woff') format('woff'),
url('../fonts/iconfont.ttf') format('truetype'),
url('../fonts/iconfont.svg#iconfont') format('svg');
}
.ant-menu-inline, .ant-menu-vertical, .ant-menu-vertical-left{
border-right:none!important;;
}
.iconfont{
font-family:"iconfont" !important;
font-size:16px;font-style:normal;
-webkit-font-smoothing: antialiased;
-webkit-text-stroke-width: 0.2px;
-moz-osx-font-smoothing: grayscale;}
.mr-10{
margin-right: 10px;
}
.mr-12{
margin-right: 12px;
}
.ml-10{
margin-left: 10px;
}
.ml-20{
margin-left: 20px;
}
.mr-20{
margin-right: 20px;
}
.mt-20{
margin-top: 20px;
}
.mt-30{
margin-top: 30px;
}
.mb-20{
margin-bottom: 20px;
}
.ant-input{
line-height: 1.5!important;
}
.ele-hide{
display: none;
}
.ctm-clearfix{
@include clearfix;
}
.delete-red{
color: red;
}
.ctm-left{
float: left;
}
.ctm-right{
float: right;
}
.export{
background-color: rgb(165,209,96);
color: #fff;
}
.start-color{
color: #38DE64;
}
.stop-color{
color: #F36E6F;
}
.start{
background-color: rgb(117,184,12);
color: #fff;
}
.stop{
background-color: rgb(236,128,141);
color: #fff;
}
.edit{
background-color: rgb(126,81,23);
color:#fff;
}
.content-base{
@include clearfix;
padding: 20px;
margin: 20px;
background-color: #ffffff;
}
.unit-tpl{
.ant-table-tbody> tr > td{
padding: 1px 16px!important;
}
}
.hide-ele{
display: none;
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment