python学习
This commit is contained in:
550
.idea/workspace.xml
generated
550
.idea/workspace.xml
generated
@@ -2,12 +2,24 @@
|
||||
<project version="4">
|
||||
<component name="ChangeListManager">
|
||||
<list default="true" id="d564f57a-9f96-4262-9481-cacdf2b8445c" name="Default" comment="python学习">
|
||||
<change afterPath="$PROJECT_DIR$/common/models/log/AppAccessLog.py" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/common/models/log/AppErrorLog.py" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/web/templates/common/tab_account.html" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/com" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/common/libs/LogService.py" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/web/interceptors/ErrorInterceptor.py" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/web/static/js/account/index.js" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/web/static/js/account/set.js" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/common/libs/Helper.py" beforeDir="false" afterPath="$PROJECT_DIR$/common/libs/Helper.py" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/common/libs/UrlManager.py" beforeDir="false" afterPath="$PROJECT_DIR$/common/libs/UrlManager.py" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/common/models/log/AppAccessLog.py" beforeDir="false" afterPath="$PROJECT_DIR$/common/models/log/AppAccessLog.py" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/common/models/log/AppErrorLog.py" beforeDir="false" afterPath="$PROJECT_DIR$/common/models/log/AppErrorLog.py" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/config/base_setting.py" beforeDir="false" afterPath="$PROJECT_DIR$/config/base_setting.py" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/config/local_setting.py" beforeDir="false" afterPath="$PROJECT_DIR$/config/local_setting.py" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/web/controllers/account/Account.py" beforeDir="false" afterPath="$PROJECT_DIR$/web/controllers/account/Account.py" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/web/templates/account/info.html" beforeDir="false" afterPath="$PROJECT_DIR$/web/templates/account/info.html" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/web/controllers/user/User.py" beforeDir="false" afterPath="$PROJECT_DIR$/web/controllers/user/User.py" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/web/interceptors/AuthInterceptor.py" beforeDir="false" afterPath="$PROJECT_DIR$/web/interceptors/AuthInterceptor.py" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/web/templates/account/index.html" beforeDir="false" afterPath="$PROJECT_DIR$/web/templates/account/index.html" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/web/templates/account/set.html" beforeDir="false" afterPath="$PROJECT_DIR$/web/templates/account/set.html" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/www.py" beforeDir="false" afterPath="$PROJECT_DIR$/www.py" afterDir="false" />
|
||||
</list>
|
||||
<option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
|
||||
<option name="SHOW_DIALOG" value="false" />
|
||||
@@ -18,45 +30,63 @@
|
||||
<component name="FileEditorManager">
|
||||
<leaf SIDE_TABS_SIZE_LIMIT_KEY="300">
|
||||
<file pinned="false" current-in-tab="false">
|
||||
<entry file="file://$PROJECT_DIR$/web/controllers/user/User.py">
|
||||
<entry file="file://$PROJECT_DIR$/web/interceptors/AuthInterceptor.py">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="1268">
|
||||
<caret line="117" lean-forward="true" selection-start-line="117" selection-end-line="117" />
|
||||
<state relative-caret-position="372">
|
||||
<caret line="30" lean-forward="true" selection-start-line="30" selection-end-line="30" />
|
||||
<folding>
|
||||
<element signature="e#24#91#0" expanded="true" />
|
||||
<element signature="e#461#1600#0" />
|
||||
<element signature="e#1670#2484#0" />
|
||||
</folding>
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
</file>
|
||||
<file pinned="false" current-in-tab="false">
|
||||
<entry file="file://$PROJECT_DIR$/web/controllers/account/Account.py">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="226">
|
||||
<caret line="45" selection-start-line="45" selection-end-line="45" />
|
||||
<folding>
|
||||
<element signature="e#24#68#0" expanded="true" />
|
||||
<element signature="e#24#51#0" expanded="true" />
|
||||
</folding>
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
</file>
|
||||
<file pinned="false" current-in-tab="true">
|
||||
<entry file="file://$PROJECT_DIR$/web/templates/common/tab_account.html">
|
||||
<entry file="file://$PROJECT_DIR$/web/interceptors/ErrorInterceptor.py">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="310">
|
||||
<caret line="10" column="6" lean-forward="true" selection-start-line="10" selection-start-column="6" selection-end-line="10" selection-end-column="6" />
|
||||
<state relative-caret-position="248">
|
||||
<caret line="8" column="10" selection-start-line="8" selection-start-column="10" selection-end-line="8" selection-end-column="10" />
|
||||
<folding>
|
||||
<element signature="e#24#52#0" expanded="true" />
|
||||
</folding>
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
</file>
|
||||
<file pinned="false" current-in-tab="false">
|
||||
<entry file="file://$PROJECT_DIR$/web/templates/account/info.html">
|
||||
<entry file="file://$PROJECT_DIR$/www.py">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="2046">
|
||||
<caret line="66" column="14" lean-forward="true" selection-start-line="66" selection-start-column="14" selection-end-line="66" selection-end-column="14" />
|
||||
<state relative-caret-position="217">
|
||||
<caret line="7" column="28" selection-start-line="7" selection-start-column="28" selection-end-line="7" selection-end-column="28" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
</file>
|
||||
<file pinned="false" current-in-tab="false">
|
||||
<entry file="file://$PROJECT_DIR$/web/templates/error/error.html">
|
||||
<provider selected="true" editor-type-id="text-editor" />
|
||||
</entry>
|
||||
</file>
|
||||
<file pinned="false" current-in-tab="false">
|
||||
<entry file="file://$PROJECT_DIR$/common/libs/LogService.py">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="178">
|
||||
<caret line="25" column="8" selection-start-line="25" selection-start-column="8" selection-end-line="25" selection-end-column="8" />
|
||||
<folding>
|
||||
<element signature="e#24#51#0" expanded="true" />
|
||||
</folding>
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
</file>
|
||||
<file pinned="false" current-in-tab="false">
|
||||
<entry file="file://$PROJECT_DIR$/common/libs/UrlManager.py">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="496">
|
||||
<caret line="16" column="22" selection-start-line="16" selection-start-column="22" selection-end-line="16" selection-end-column="22" />
|
||||
<folding>
|
||||
<element signature="e#24#35#0" expanded="true" />
|
||||
</folding>
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
@@ -64,7 +94,8 @@
|
||||
<file pinned="false" current-in-tab="false">
|
||||
<entry file="file://$PROJECT_DIR$/common/models/log/AppAccessLog.py">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state>
|
||||
<state relative-caret-position="155">
|
||||
<caret line="5" lean-forward="true" selection-start-line="5" selection-end-line="5" />
|
||||
<folding>
|
||||
<element signature="e#16#90#0" expanded="true" />
|
||||
</folding>
|
||||
@@ -75,7 +106,8 @@
|
||||
<file pinned="false" current-in-tab="false">
|
||||
<entry file="file://$PROJECT_DIR$/common/models/log/AppErrorLog.py">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state>
|
||||
<state relative-caret-position="215">
|
||||
<caret line="7" lean-forward="true" selection-start-line="7" selection-end-line="7" />
|
||||
<folding>
|
||||
<element signature="e#16#78#0" expanded="true" />
|
||||
</folding>
|
||||
@@ -83,41 +115,20 @@
|
||||
</provider>
|
||||
</entry>
|
||||
</file>
|
||||
<file pinned="false" current-in-tab="false">
|
||||
<entry file="file://$PROJECT_DIR$/web/templates/account/index.html">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="288">
|
||||
<caret line="97" column="14" lean-forward="true" selection-start-line="97" selection-start-column="14" selection-end-line="97" selection-end-column="14" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
</file>
|
||||
<file pinned="false" current-in-tab="false">
|
||||
<entry file="file://$PROJECT_DIR$/application.py">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="474">
|
||||
<caret line="16" selection-start-line="16" selection-end-line="16" />
|
||||
<folding>
|
||||
<element signature="e#24#47#0" expanded="true" />
|
||||
</folding>
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
</file>
|
||||
<file pinned="false" current-in-tab="false">
|
||||
<entry file="file://$PROJECT_DIR$/config/base_setting.py">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="364">
|
||||
<caret line="16" lean-forward="true" selection-start-line="16" selection-end-line="16" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
</file>
|
||||
<file pinned="false" current-in-tab="false">
|
||||
<entry file="file://$PROJECT_DIR$/config/local_setting.py">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="186">
|
||||
<caret line="6" column="31" lean-forward="true" selection-start-line="6" selection-start-column="31" selection-end-line="6" selection-end-column="31" />
|
||||
<state relative-caret-position="62">
|
||||
<caret line="2" column="12" lean-forward="true" selection-start-line="2" selection-start-column="12" selection-end-line="2" selection-end-column="12" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
</file>
|
||||
<file pinned="false" current-in-tab="false">
|
||||
<entry file="file://$PROJECT_DIR$/web/static/js/account/index.js">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="1426">
|
||||
<caret line="46" column="2" lean-forward="true" selection-start-line="46" selection-start-column="2" selection-end-line="46" selection-end-column="2" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
@@ -137,6 +148,13 @@
|
||||
<find>route_user</find>
|
||||
<find>login_name</find>
|
||||
<find>render_template</find>
|
||||
<find>set</find>
|
||||
<find>user.uid</find>
|
||||
<find>first</find>
|
||||
<find>page_p</find>
|
||||
<find>ajax</find>
|
||||
<find>账户</find>
|
||||
<find>请输入姓名</find>
|
||||
</findStrings>
|
||||
<replaceStrings>
|
||||
<replace>ops_render</replace>
|
||||
@@ -149,7 +167,6 @@
|
||||
<option name="CHANGED_PATHS">
|
||||
<list>
|
||||
<option value="$PROJECT_DIR$/imooc.py" />
|
||||
<option value="$PROJECT_DIR$/common/libs/UrlManager.py" />
|
||||
<option value="$PROJECT_DIR$/Hello.py" />
|
||||
<option value="$PROJECT_DIR$/config/production.py" />
|
||||
<option value="$PROJECT_DIR$/docs/mysql.md" />
|
||||
@@ -157,7 +174,6 @@
|
||||
<option value="$PROJECT_DIR$/manager.py" />
|
||||
<option value="$PROJECT_DIR$/mina/project.config.json" />
|
||||
<option value="$PROJECT_DIR$/common/models/User.py" />
|
||||
<option value="$PROJECT_DIR$/config/local_setting.py" />
|
||||
<option value="$PROJECT_DIR$/requirements.txt" />
|
||||
<option value="$PROJECT_DIR$/application.py" />
|
||||
<option value="$PROJECT_DIR$/config/__init__.py" />
|
||||
@@ -165,23 +181,29 @@
|
||||
<option value="$PROJECT_DIR$/web/templates/user/login.html" />
|
||||
<option value="$PROJECT_DIR$/web/static/js/common.js" />
|
||||
<option value="$PROJECT_DIR$/web/static/js/user/login.js" />
|
||||
<option value="$PROJECT_DIR$/www.py" />
|
||||
<option value="$PROJECT_DIR$/web/templates/common/layout_main.html" />
|
||||
<option value="$PROJECT_DIR$/common/libs/user/Helper.py" />
|
||||
<option value="$PROJECT_DIR$/web/interceptors/AuthInterceptor.py" />
|
||||
<option value="$PROJECT_DIR$/web/controllers/index.py" />
|
||||
<option value="$PROJECT_DIR$/web/controllers/stat/Stat.py" />
|
||||
<option value="$PROJECT_DIR$/web/controllers/member/Member.py" />
|
||||
<option value="$PROJECT_DIR$/web/controllers/food/Food.py" />
|
||||
<option value="$PROJECT_DIR$/web/controllers/finance/Finance.py" />
|
||||
<option value="$PROJECT_DIR$/web/static/js/user/edit.js" />
|
||||
<option value="$PROJECT_DIR$/web/controllers/user/User.py" />
|
||||
<option value="$PROJECT_DIR$/web/templates/user/edit.html" />
|
||||
<option value="$PROJECT_DIR$/web/templates/account/info.html" />
|
||||
<option value="$PROJECT_DIR$/common/libs/Helper.py" />
|
||||
<option value="$PROJECT_DIR$/config/base_setting.py" />
|
||||
<option value="$PROJECT_DIR$/web/templates/account/index.html" />
|
||||
<option value="$PROJECT_DIR$/web/templates/account/info.html" />
|
||||
<option value="$PROJECT_DIR$/web/controllers/account/Account.py" />
|
||||
<option value="$PROJECT_DIR$/web/templates/account/index.html" />
|
||||
<option value="$PROJECT_DIR$/web/templates/account/set.html" />
|
||||
<option value="$PROJECT_DIR$/web/controllers/user/User.py" />
|
||||
<option value="$PROJECT_DIR$/web/static/js/account/index.js" />
|
||||
<option value="$PROJECT_DIR$/common/libs/UrlManager.py" />
|
||||
<option value="$PROJECT_DIR$/config/local_setting.py" />
|
||||
<option value="$PROJECT_DIR$/common/models/log/AppAccessLog.py" />
|
||||
<option value="$PROJECT_DIR$/common/models/log/AppErrorLog.py" />
|
||||
<option value="$PROJECT_DIR$/web/interceptors/AuthInterceptor.py" />
|
||||
<option value="$PROJECT_DIR$/www.py" />
|
||||
</list>
|
||||
</option>
|
||||
</component>
|
||||
@@ -195,10 +217,10 @@
|
||||
<packageJsonPaths />
|
||||
</component>
|
||||
<component name="ProjectFrameBounds">
|
||||
<option name="x" value="963" />
|
||||
<option name="y" value="22" />
|
||||
<option name="width" value="938" />
|
||||
<option name="height" value="1028" />
|
||||
<option name="x" value="960" />
|
||||
<option name="y" value="20" />
|
||||
<option name="width" value="958" />
|
||||
<option name="height" value="939" />
|
||||
</component>
|
||||
<component name="ProjectLevelVcsManager" settingsEditedManually="true" />
|
||||
<component name="ProjectView">
|
||||
@@ -224,6 +246,13 @@
|
||||
<item name="common" type="462c0819:PsiDirectoryNode" />
|
||||
<item name="libs" type="462c0819:PsiDirectoryNode" />
|
||||
</path>
|
||||
<path>
|
||||
<item name="order" type="b2602c69:ProjectViewProjectNode" />
|
||||
<item name="order" type="462c0819:PsiDirectoryNode" />
|
||||
<item name="common" type="462c0819:PsiDirectoryNode" />
|
||||
<item name="libs" type="462c0819:PsiDirectoryNode" />
|
||||
<item name="user" type="462c0819:PsiDirectoryNode" />
|
||||
</path>
|
||||
<path>
|
||||
<item name="order" type="b2602c69:ProjectViewProjectNode" />
|
||||
<item name="order" type="462c0819:PsiDirectoryNode" />
|
||||
@@ -237,11 +266,63 @@
|
||||
<item name="models" type="462c0819:PsiDirectoryNode" />
|
||||
<item name="log" type="462c0819:PsiDirectoryNode" />
|
||||
</path>
|
||||
<path>
|
||||
<item name="order" type="b2602c69:ProjectViewProjectNode" />
|
||||
<item name="order" type="462c0819:PsiDirectoryNode" />
|
||||
<item name="config" type="462c0819:PsiDirectoryNode" />
|
||||
</path>
|
||||
<path>
|
||||
<item name="order" type="b2602c69:ProjectViewProjectNode" />
|
||||
<item name="order" type="462c0819:PsiDirectoryNode" />
|
||||
<item name="web" type="462c0819:PsiDirectoryNode" />
|
||||
</path>
|
||||
<path>
|
||||
<item name="order" type="b2602c69:ProjectViewProjectNode" />
|
||||
<item name="order" type="462c0819:PsiDirectoryNode" />
|
||||
<item name="web" type="462c0819:PsiDirectoryNode" />
|
||||
<item name="controllers" type="462c0819:PsiDirectoryNode" />
|
||||
</path>
|
||||
<path>
|
||||
<item name="order" type="b2602c69:ProjectViewProjectNode" />
|
||||
<item name="order" type="462c0819:PsiDirectoryNode" />
|
||||
<item name="web" type="462c0819:PsiDirectoryNode" />
|
||||
<item name="controllers" type="462c0819:PsiDirectoryNode" />
|
||||
<item name="account" type="462c0819:PsiDirectoryNode" />
|
||||
</path>
|
||||
<path>
|
||||
<item name="order" type="b2602c69:ProjectViewProjectNode" />
|
||||
<item name="order" type="462c0819:PsiDirectoryNode" />
|
||||
<item name="web" type="462c0819:PsiDirectoryNode" />
|
||||
<item name="controllers" type="462c0819:PsiDirectoryNode" />
|
||||
<item name="user" type="462c0819:PsiDirectoryNode" />
|
||||
</path>
|
||||
<path>
|
||||
<item name="order" type="b2602c69:ProjectViewProjectNode" />
|
||||
<item name="order" type="462c0819:PsiDirectoryNode" />
|
||||
<item name="web" type="462c0819:PsiDirectoryNode" />
|
||||
<item name="interceptors" type="462c0819:PsiDirectoryNode" />
|
||||
</path>
|
||||
<path>
|
||||
<item name="order" type="b2602c69:ProjectViewProjectNode" />
|
||||
<item name="order" type="462c0819:PsiDirectoryNode" />
|
||||
<item name="web" type="462c0819:PsiDirectoryNode" />
|
||||
<item name="static" type="462c0819:PsiDirectoryNode" />
|
||||
</path>
|
||||
<path>
|
||||
<item name="order" type="b2602c69:ProjectViewProjectNode" />
|
||||
<item name="order" type="462c0819:PsiDirectoryNode" />
|
||||
<item name="web" type="462c0819:PsiDirectoryNode" />
|
||||
<item name="static" type="462c0819:PsiDirectoryNode" />
|
||||
<item name="js" type="462c0819:PsiDirectoryNode" />
|
||||
</path>
|
||||
<path>
|
||||
<item name="order" type="b2602c69:ProjectViewProjectNode" />
|
||||
<item name="order" type="462c0819:PsiDirectoryNode" />
|
||||
<item name="web" type="462c0819:PsiDirectoryNode" />
|
||||
<item name="static" type="462c0819:PsiDirectoryNode" />
|
||||
<item name="js" type="462c0819:PsiDirectoryNode" />
|
||||
<item name="account" type="462c0819:PsiDirectoryNode" />
|
||||
</path>
|
||||
<path>
|
||||
<item name="order" type="b2602c69:ProjectViewProjectNode" />
|
||||
<item name="order" type="462c0819:PsiDirectoryNode" />
|
||||
@@ -262,6 +343,13 @@
|
||||
<item name="templates" type="462c0819:PsiDirectoryNode" />
|
||||
<item name="common" type="462c0819:PsiDirectoryNode" />
|
||||
</path>
|
||||
<path>
|
||||
<item name="order" type="b2602c69:ProjectViewProjectNode" />
|
||||
<item name="order" type="462c0819:PsiDirectoryNode" />
|
||||
<item name="web" type="462c0819:PsiDirectoryNode" />
|
||||
<item name="templates" type="462c0819:PsiDirectoryNode" />
|
||||
<item name="error" type="462c0819:PsiDirectoryNode" />
|
||||
</path>
|
||||
<path>
|
||||
<item name="order" type="b2602c69:ProjectViewProjectNode" />
|
||||
<item name="External Libraries" type="cb654da1:ExternalLibrariesNode" />
|
||||
@@ -276,7 +364,7 @@
|
||||
<component name="PropertiesComponent">
|
||||
<property name="SHARE_PROJECT_CONFIGURATION_FILES" value="true" />
|
||||
<property name="WebServerToolWindowFactoryState" value="false" />
|
||||
<property name="last_opened_file_path" value="$PROJECT_DIR$/web/templates/common" />
|
||||
<property name="last_opened_file_path" value="$PROJECT_DIR$/web/templates" />
|
||||
<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="options.lastSelected" value="com.jetbrains.python.configuration.PythonSdkConfigurable" />
|
||||
@@ -287,11 +375,11 @@
|
||||
</component>
|
||||
<component name="RecentsManager">
|
||||
<key name="CopyFile.RECENT_KEYS">
|
||||
<recent name="D:\order\web\templates" />
|
||||
<recent name="D:\order\web\interceptors" />
|
||||
<recent name="D:\order\common\libs" />
|
||||
<recent name="D:\order\web\templates\common" />
|
||||
<recent name="D:\order\common\models" />
|
||||
<recent name="D:\order\web\static\js\user" />
|
||||
<recent name="D:\order\web\templates\user" />
|
||||
<recent name="D:\order" />
|
||||
<recent name="D:\order\web\static\js\account" />
|
||||
</key>
|
||||
<key name="MoveFile.RECENT_KEYS">
|
||||
<recent name="D:\order\common\libs" />
|
||||
@@ -379,7 +467,14 @@
|
||||
<option name="project" value="LOCAL" />
|
||||
<updated>1563789519074</updated>
|
||||
</task>
|
||||
<option name="localTasksCounter" value="9" />
|
||||
<task id="LOCAL-00009" summary="python学习">
|
||||
<created>1563790035610</created>
|
||||
<option name="number" value="00009" />
|
||||
<option name="presentableId" value="LOCAL-00009" />
|
||||
<option name="project" value="LOCAL" />
|
||||
<updated>1563790035610</updated>
|
||||
</task>
|
||||
<option name="localTasksCounter" value="10" />
|
||||
<servers />
|
||||
</component>
|
||||
<component name="TodoView">
|
||||
@@ -392,10 +487,9 @@
|
||||
</todo-panel>
|
||||
</component>
|
||||
<component name="ToolWindowManager">
|
||||
<frame x="963" y="22" width="938" height="1028" extended-state="0" />
|
||||
<editor active="true" />
|
||||
<frame x="960" y="20" width="958" height="939" extended-state="0" />
|
||||
<layout>
|
||||
<window_info active="true" content_ui="combo" id="Project" order="0" visible="true" weight="0.2777778" />
|
||||
<window_info active="true" content_ui="combo" id="Project" order="0" visible="true" weight="0.27173913" />
|
||||
<window_info id="Structure" order="1" side_tool="true" weight="0.25" />
|
||||
<window_info id="Favorites" order="2" side_tool="true" />
|
||||
<window_info id="Project Explorer" order="3" />
|
||||
@@ -410,7 +504,7 @@
|
||||
<window_info anchor="bottom" id="TODO" order="6" weight="0.32960895" />
|
||||
<window_info anchor="bottom" id="Docker" order="7" show_stripe_button="false" />
|
||||
<window_info anchor="bottom" id="Database Changes" order="8" show_stripe_button="false" />
|
||||
<window_info anchor="bottom" id="Terminal" order="9" visible="true" weight="0.3642458" />
|
||||
<window_info anchor="bottom" id="Terminal" order="9" visible="true" weight="0.29404467" />
|
||||
<window_info anchor="bottom" id="Event Log" order="10" side_tool="true" />
|
||||
<window_info anchor="bottom" id="Version Control" order="11" />
|
||||
<window_info anchor="bottom" id="Python Console" order="12" />
|
||||
@@ -434,47 +528,6 @@
|
||||
<option name="LAST_COMMIT_MESSAGE" value="python学习" />
|
||||
</component>
|
||||
<component name="editorHistoryManager">
|
||||
<entry file="file://$PROJECT_DIR$/mina/app.json">
|
||||
<provider selected="true" editor-type-id="text-editor" />
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/mina/pages/my/index.js">
|
||||
<provider selected="true" editor-type-id="text-editor" />
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/mina/.idea/mina.iml">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="217">
|
||||
<caret line="7" column="9" selection-start-line="7" selection-start-column="9" selection-end-line="7" selection-end-column="9" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/mina/project.config.json">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state>
|
||||
<caret line="11" column="32" selection-start-line="11" selection-start-column="32" selection-end-line="11" selection-end-column="32" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/venv/Lib/site-packages/flask_sqlalchemy/__init__.py">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="-28">
|
||||
<caret line="604" column="6" selection-start-line="604" selection-start-column="6" selection-end-line="604" selection-end-column="6" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/venv/Lib/site-packages/sqlalchemy/orm/query.py">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="1460">
|
||||
<caret line="1768" column="8" selection-start-line="1768" selection-start-column="8" selection-end-line="1768" selection-end-column="8" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/venv/Lib/site-packages/sqlalchemy/dialects/mysql/mysqldb.py">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="166">
|
||||
<caret line="117" selection-start-line="117" selection-end-line="117" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/venv/Lib/site-packages/sqlalchemy/engine/strategies.py">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="166">
|
||||
@@ -530,64 +583,21 @@
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/common/models/User.py">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="62">
|
||||
<caret line="5" selection-start-line="5" selection-end-line="5" />
|
||||
<folding>
|
||||
<element signature="e#16#84#0" expanded="true" />
|
||||
</folding>
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/common/libs/user/UserService.py">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="186">
|
||||
<caret line="6" column="8" selection-start-line="6" selection-start-column="8" selection-end-line="6" selection-end-column="8" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/web/interceptors/__init__.py">
|
||||
<provider selected="true" editor-type-id="text-editor" />
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/web/interceptors/ErrorInterceptor.py" />
|
||||
<entry file="file://$PROJECT_DIR$/www.py">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="93">
|
||||
<caret line="3" column="3" lean-forward="true" selection-start-line="3" selection-start-column="3" selection-end-line="3" selection-end-column="3" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/README.en.md" />
|
||||
<entry file="file://$PROJECT_DIR$/web/interceptors/ApiAuthInterceptor.py">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="-558">
|
||||
<folding>
|
||||
<element signature="e#24#51#0" expanded="true" />
|
||||
</folding>
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/web/interceptors/ApiAuthInterceptor.py" />
|
||||
<entry file="file://$PROJECT_DIR$/readme.md">
|
||||
<provider editor-type-id="text-editor">
|
||||
<state relative-caret-position="108">
|
||||
<caret line="2" column="4" lean-forward="true" selection-start-line="2" selection-start-column="4" selection-end-line="2" selection-end-column="4" />
|
||||
</state>
|
||||
</provider>
|
||||
<provider selected="true" editor-type-id="split-provider[text-editor;markdown-preview-editor]">
|
||||
<state split_layout="SPLIT">
|
||||
<first_editor />
|
||||
<second_editor />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/web/interceptors/AuthInterceptor.py">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="339">
|
||||
<caret line="20" column="29" lean-forward="true" selection-start-line="20" selection-start-column="29" selection-end-line="20" selection-end-column="29" />
|
||||
<folding>
|
||||
<element signature="e#24#51#0" expanded="true" />
|
||||
</folding>
|
||||
<provider editor-type-id="text-editor">
|
||||
<state relative-caret-position="108">
|
||||
<caret line="2" column="4" lean-forward="true" selection-start-line="2" selection-start-column="4" selection-end-line="2" selection-end-column="4" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
@@ -674,36 +684,6 @@
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/web/controllers/user/User.py">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="1268">
|
||||
<caret line="117" lean-forward="true" selection-start-line="117" selection-end-line="117" />
|
||||
<folding>
|
||||
<element signature="e#24#91#0" expanded="true" />
|
||||
<element signature="e#461#1600#0" />
|
||||
<element signature="e#1670#2484#0" />
|
||||
</folding>
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/common/libs/Helper.py">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="217">
|
||||
<caret line="51" selection-start-line="51" selection-end-line="51" />
|
||||
<folding>
|
||||
<element signature="e#24#59#0" expanded="true" />
|
||||
<element signature="e#122#1176#0" />
|
||||
</folding>
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/web/templates/common/tab_user.html">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="279">
|
||||
<caret line="9" column="21" lean-forward="true" selection-start-line="9" selection-start-column="21" selection-end-line="9" selection-end-column="21" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/web/templates/user/reset_pwd.html">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="62">
|
||||
@@ -720,7 +700,7 @@
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/application.py">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="474">
|
||||
<state relative-caret-position="372">
|
||||
<caret line="16" selection-start-line="16" selection-end-line="16" />
|
||||
<folding>
|
||||
<element signature="e#24#47#0" expanded="true" />
|
||||
@@ -728,30 +708,121 @@
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/config/local_setting.py">
|
||||
<entry file="file://$PROJECT_DIR$/common/libs/Helper.py">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="186">
|
||||
<caret line="6" column="31" lean-forward="true" selection-start-line="6" selection-start-column="31" selection-end-line="6" selection-end-column="31" />
|
||||
<state relative-caret-position="399">
|
||||
<caret line="67" selection-start-line="67" selection-end-line="67" />
|
||||
<folding>
|
||||
<element signature="e#24#59#0" expanded="true" />
|
||||
<element signature="e#122#1176#0" />
|
||||
</folding>
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/config/base_setting.py">
|
||||
<entry file="file://$PROJECT_DIR$/common/libs/user/UserService.py">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="364">
|
||||
<caret line="16" lean-forward="true" selection-start-line="16" selection-end-line="16" />
|
||||
<state relative-caret-position="168">
|
||||
<caret line="20" column="8" selection-start-line="20" selection-start-column="8" selection-end-line="20" selection-end-column="8" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/web/templates/common/tab_account.html">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="310">
|
||||
<caret line="10" column="6" selection-start-line="10" selection-start-column="6" selection-end-line="10" selection-end-column="6" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/web/controllers/account/Account.py">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="4805">
|
||||
<caret line="161" selection-start-line="161" selection-end-line="161" />
|
||||
<folding>
|
||||
<element signature="e#24#76#0" expanded="true" />
|
||||
</folding>
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/web/templates/account/info.html">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="2046">
|
||||
<caret line="66" column="14" selection-start-line="66" selection-start-column="14" selection-end-line="66" selection-end-column="14" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/web/static/js/account/set.js">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="2015">
|
||||
<caret line="65" column="50" selection-start-line="65" selection-start-column="43" selection-end-line="65" selection-end-column="50" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/web/templates/account/index.html">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="288">
|
||||
<caret line="97" column="14" lean-forward="true" selection-start-line="97" selection-start-column="14" selection-end-line="97" selection-end-column="14" />
|
||||
<state relative-caret-position="62">
|
||||
<caret line="2" column="39" selection-start-line="2" selection-start-column="39" selection-end-line="2" selection-end-column="39" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/web/templates/common/tab_user.html">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="279">
|
||||
<caret line="9" column="21" lean-forward="true" selection-start-line="9" selection-start-column="21" selection-end-line="9" selection-end-column="21" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/config/base_setting.py">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="620">
|
||||
<caret line="20" column="14" selection-start-line="20" selection-end-line="20" selection-end-column="14" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/web/templates/account/set.html">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="186">
|
||||
<caret line="6" column="8" selection-start-line="6" selection-start-column="8" selection-end-line="6" selection-end-column="8" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/web/controllers/user/User.py">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="899">
|
||||
<caret line="41" lean-forward="true" selection-start-line="41" selection-end-line="41" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/web/static/js/account/index.js">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="1426">
|
||||
<caret line="46" column="2" lean-forward="true" selection-start-line="46" selection-start-column="2" selection-end-line="46" selection-end-column="2" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/config/local_setting.py">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="62">
|
||||
<caret line="2" column="12" lean-forward="true" selection-start-line="2" selection-start-column="12" selection-end-line="2" selection-end-column="12" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/common/models/User.py">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="343">
|
||||
<caret line="22" lean-forward="true" selection-start-line="22" selection-end-line="22" />
|
||||
<folding>
|
||||
<element signature="e#16#84#0" expanded="true" />
|
||||
</folding>
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/common/models/AppAccessLog.py">
|
||||
<provider selected="true" editor-type-id="text-editor" />
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/common/models/log/AppAccessLog.py">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state>
|
||||
<state relative-caret-position="155">
|
||||
<caret line="5" lean-forward="true" selection-start-line="5" selection-end-line="5" />
|
||||
<folding>
|
||||
<element signature="e#16#90#0" expanded="true" />
|
||||
</folding>
|
||||
@@ -760,34 +831,61 @@
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/common/models/log/AppErrorLog.py">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state>
|
||||
<state relative-caret-position="215">
|
||||
<caret line="7" lean-forward="true" selection-start-line="7" selection-end-line="7" />
|
||||
<folding>
|
||||
<element signature="e#16#78#0" expanded="true" />
|
||||
</folding>
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/web/templates/account/info.html">
|
||||
<entry file="file://$PROJECT_DIR$/common/libs/UrlManager.py">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="2046">
|
||||
<caret line="66" column="14" lean-forward="true" selection-start-line="66" selection-start-column="14" selection-end-line="66" selection-end-column="14" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/web/controllers/account/Account.py">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="226">
|
||||
<caret line="45" selection-start-line="45" selection-end-line="45" />
|
||||
<state relative-caret-position="496">
|
||||
<caret line="16" column="22" selection-start-line="16" selection-start-column="22" selection-end-line="16" selection-end-column="22" />
|
||||
<folding>
|
||||
<element signature="e#24#68#0" expanded="true" />
|
||||
<element signature="e#24#35#0" expanded="true" />
|
||||
</folding>
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/web/templates/common/tab_account.html">
|
||||
<entry file="file://$PROJECT_DIR$/web/templates/error/error.html">
|
||||
<provider selected="true" editor-type-id="text-editor" />
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/web/interceptors/AuthInterceptor.py">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="310">
|
||||
<caret line="10" column="6" lean-forward="true" selection-start-line="10" selection-start-column="6" selection-end-line="10" selection-end-column="6" />
|
||||
<state relative-caret-position="372">
|
||||
<caret line="30" lean-forward="true" selection-start-line="30" selection-end-line="30" />
|
||||
<folding>
|
||||
<element signature="e#24#51#0" expanded="true" />
|
||||
</folding>
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/common/libs/LogService.py">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="178">
|
||||
<caret line="25" column="8" selection-start-line="25" selection-start-column="8" selection-end-line="25" selection-end-column="8" />
|
||||
<folding>
|
||||
<element signature="e#24#51#0" expanded="true" />
|
||||
</folding>
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/www.py">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="217">
|
||||
<caret line="7" column="28" selection-start-line="7" selection-start-column="28" selection-end-line="7" selection-end-column="28" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/web/interceptors/ErrorInterceptor.py">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="248">
|
||||
<caret line="8" column="10" selection-start-line="8" selection-start-column="10" selection-end-line="8" selection-end-column="10" />
|
||||
<folding>
|
||||
<element signature="e#24#52#0" expanded="true" />
|
||||
</folding>
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
|
||||
22
com
Normal file
22
com
Normal file
@@ -0,0 +1,22 @@
|
||||
# coding: utf-8
|
||||
from sqlalchemy import BigInteger, Column, DateTime, Integer, String, Text
|
||||
from sqlalchemy.schema import FetchedValue
|
||||
from sqlalchemy.ext.declarative import declarative_base
|
||||
|
||||
|
||||
Base = declarative_base()
|
||||
metadata = Base.metadata
|
||||
|
||||
|
||||
class AppAccessLog(Base):
|
||||
__tablename__ = 'app_access_log'
|
||||
|
||||
id = Column(Integer, primary_key=True)
|
||||
uid = Column(BigInteger, nullable=False, index=True, server_default=FetchedValue())
|
||||
referer_url = Column(String(255), nullable=False, server_default=FetchedValue())
|
||||
target_url = Column(String(255), nullable=False, server_default=FetchedValue())
|
||||
query_params = Column(Text, nullable=False)
|
||||
ua = Column(String(255), nullable=False, server_default=FetchedValue())
|
||||
ip = Column(String(32), nullable=False, server_default=FetchedValue())
|
||||
note = Column(String(1000), nullable=False, server_default=FetchedValue())
|
||||
created_time = Column(DateTime, nullable=False, server_default=FetchedValue())
|
||||
@@ -58,3 +58,10 @@ def ops_render( template,context = {} ):
|
||||
if 'current_user' in g:
|
||||
context['current_user'] = g.current_user
|
||||
return render_template( template,**context )
|
||||
|
||||
'''
|
||||
获取当前时间
|
||||
'''
|
||||
def getCurrentDate( format = "%Y-%m-%d %H:%M:%S"):
|
||||
#return datetime.datetime.now().strftime( format )
|
||||
return datetime.datetime.now()
|
||||
|
||||
37
common/libs/LogService.py
Normal file
37
common/libs/LogService.py
Normal file
@@ -0,0 +1,37 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from flask import request,g
|
||||
from application import app,db
|
||||
import json
|
||||
from common.libs.Helper import getCurrentDate
|
||||
from common.models.log.AppAccessLog import AppAccessLog
|
||||
from common.models.log.AppErrorLog import AppErrorLog
|
||||
|
||||
class LogService():
|
||||
@staticmethod
|
||||
def addAccessLog():
|
||||
target = AppAccessLog()
|
||||
target.target_url = request.url
|
||||
target.referer_url = request.referrer
|
||||
target.ip = request.remote_addr
|
||||
target.query_params = json.dumps( request.values.to_dict() )
|
||||
if 'current_user' in g and g.current_user is not None:
|
||||
target.uid = g.current_user.uid
|
||||
target.ua = request.headers.get( "User-Agent" )
|
||||
target.created_time = getCurrentDate()
|
||||
db.session.add( target )
|
||||
db.session.commit( )
|
||||
return True
|
||||
|
||||
@staticmethod
|
||||
def addErrorLog( content ):
|
||||
if 'favicon.ico' in request.url:
|
||||
return
|
||||
target = AppErrorLog()
|
||||
target.target_url = request.url
|
||||
target.referer_url = request.referrer
|
||||
target.query_params = json.dumps(request.values.to_dict())
|
||||
target.content = content
|
||||
target.created_time = getCurrentDate()
|
||||
db.session.add(target)
|
||||
db.session.commit()
|
||||
return True
|
||||
@@ -1,5 +1,6 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
import time
|
||||
from application import app
|
||||
class UrlManager(object):
|
||||
def __init__(self):
|
||||
pass
|
||||
@@ -10,6 +11,7 @@ class UrlManager(object):
|
||||
|
||||
@staticmethod
|
||||
def buildStaticUrl(path):
|
||||
ver = "%s"%( 22222222 )
|
||||
release_version = app.config.get('RELEASE_VERSION')
|
||||
ver = "%s" % (int(time.time())) if not release_version else release_version
|
||||
path = "/static" + path + "?ver=" + ver
|
||||
return UrlManager.buildUrl( path )
|
||||
@@ -4,7 +4,6 @@ from sqlalchemy.schema import FetchedValue
|
||||
from application import db
|
||||
|
||||
|
||||
|
||||
class AppAccessLog(db.Model):
|
||||
__tablename__ = 'app_access_log'
|
||||
|
||||
|
||||
@@ -1,9 +1,13 @@
|
||||
# coding: utf-8
|
||||
from sqlalchemy import Column, DateTime, Integer, String, Text
|
||||
from sqlalchemy.schema import FetchedValue
|
||||
|
||||
|
||||
|
||||
from application import db
|
||||
|
||||
|
||||
|
||||
class AppErrorLog(db.Model):
|
||||
__tablename__ = 'app_error_log'
|
||||
|
||||
|
||||
@@ -17,3 +17,8 @@ IGNORE_CHECK_LOGIN_URLS = [
|
||||
|
||||
PAGE_SIZE = 50
|
||||
PAGE_DISPLAY = 10
|
||||
|
||||
STATUS_MAPPING = {
|
||||
"1":"正常",
|
||||
"0":"已删除"
|
||||
}
|
||||
@@ -5,3 +5,4 @@ SQLALCHEMY_ECHO = True
|
||||
SQLALCHEMY_DATABASE_URI = 'mysql://root:123456@127.0.0.1/food_db'
|
||||
SQLALCHEMY_TRACK_MODIFICATIONS = False
|
||||
SQLALCHEMY_ENCODING = "utf8mb4"
|
||||
# RELEASE_VERSION = "20190730"
|
||||
|
||||
@@ -1,9 +1,11 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from flask import Blueprint,request,redirect
|
||||
from common.libs.Helper import ops_render,iPagination
|
||||
from flask import Blueprint,request,redirect,jsonify
|
||||
from common.libs.Helper import ops_render,iPagination,getCurrentDate
|
||||
from common.libs.UrlManager import UrlManager
|
||||
from common.libs.user.UserService import UserService
|
||||
from common.models.User import User
|
||||
from common.models.log.AppAccessLog import AppAccessLog
|
||||
from sqlalchemy import or_
|
||||
route_account = Blueprint( 'account_page',__name__ )
|
||||
from application import app,db
|
||||
@route_account.route( "/index" )
|
||||
@@ -13,12 +15,17 @@ def index():
|
||||
page = int(req['p']) if ('p' in req and req['p']) else 1
|
||||
query = User.query
|
||||
|
||||
if 'mix_kw' in req:
|
||||
rule = or_( User.nickname.ilike( "%{0}%".format( req['mix_kw'] ) ),User.mobile.ilike( "%{0}%".format( req['mix_kw'] ) ))
|
||||
query = query.filter( rule )
|
||||
if 'status' in req and int( req['status'] ) > -1:
|
||||
query = query.filter( User.status == int( req['status']) )
|
||||
page_params = {
|
||||
'total': query.count(),
|
||||
'page_size': app.config['PAGE_SIZE'],
|
||||
'page': page,
|
||||
'display': app.config['PAGE_DISPLAY'],
|
||||
'url': '/account/index'
|
||||
'url': request.full_path.replace( "&p={}".format(page),"")
|
||||
}
|
||||
|
||||
pages = iPagination(page_params)
|
||||
@@ -29,6 +36,8 @@ def index():
|
||||
|
||||
resp_data['list'] = list
|
||||
resp_data['pages'] = pages
|
||||
resp_data['search_con'] = req
|
||||
resp_data['status_mapping'] = app.config['STATUS_MAPPING']
|
||||
return ops_render("account/index.html", resp_data)
|
||||
|
||||
@route_account.route( "/info" )
|
||||
@@ -48,6 +57,111 @@ def info():
|
||||
|
||||
return ops_render("account/info.html", resp_data)
|
||||
|
||||
@route_account.route( "/set" )
|
||||
@route_account.route( "/set" ,methods=["GET", "POST"])
|
||||
def set():
|
||||
return ops_render( "account/set.html" )
|
||||
default_pwd = "******"
|
||||
if request.method == "GET":
|
||||
resp_data = {}
|
||||
req = request.args
|
||||
uid = int( req.get( "id",0))
|
||||
info = None
|
||||
if uid:
|
||||
info = User.query.filter_by( uid = uid ).first()
|
||||
resp_data['info'] = info
|
||||
return ops_render( "account/set.html",resp_data)
|
||||
resp = { 'code':200,'msg':'操作成功~~','data':{} }
|
||||
req = request.values
|
||||
|
||||
id = req['id'] if 'id' in req else 0
|
||||
nickname = req['nickname'] if 'nickname' in req else ''
|
||||
mobile = req['mobile'] if 'mobile' in req else ''
|
||||
email = req['email'] if 'email' in req else ''
|
||||
login_name = req['login_name'] if 'login_name' in req else ''
|
||||
login_pwd = req['login_pwd'] if 'login_pwd' in req else ''
|
||||
|
||||
if nickname is None or len( nickname ) < 1:
|
||||
resp['code'] = -1
|
||||
resp['msg'] = "请输入符合规范的姓名~~"
|
||||
return jsonify( resp )
|
||||
|
||||
if mobile is None or len( mobile ) < 1:
|
||||
resp['code'] = -1
|
||||
resp['msg'] = "请输入符合规范的手机号码~~"
|
||||
return jsonify( resp )
|
||||
|
||||
if email is None or len( email ) < 1:
|
||||
resp['code'] = -1
|
||||
resp['msg'] = "请输入符合规范的邮箱~~"
|
||||
return jsonify( resp )
|
||||
|
||||
if login_name is None or len( login_name ) < 1:
|
||||
resp['code'] = -1
|
||||
resp['msg'] = "请输入符合规范的登录用户名~~"
|
||||
return jsonify( resp )
|
||||
|
||||
if login_pwd is None or len( email ) < 6:
|
||||
resp['code'] = -1
|
||||
resp['msg'] = "请输入符合规范的登录密码~~"
|
||||
return jsonify( resp )
|
||||
|
||||
has_in = User.query.filter( User.login_name == login_name,User.uid!= id).first()
|
||||
if has_in:
|
||||
resp['code'] = -1
|
||||
resp['msg'] = "该登录名已存在,请换一个试试~~"
|
||||
return jsonify(resp)
|
||||
|
||||
user_info = User.query.filter_by(uid=id).first()
|
||||
if user_info:
|
||||
model_user = user_info
|
||||
else:
|
||||
model_user = User()
|
||||
model_user.created_time = getCurrentDate()
|
||||
model_user.login_salt = UserService.geneSalt()
|
||||
|
||||
model_user.nickname = nickname
|
||||
model_user.mobile = mobile
|
||||
model_user.email = email
|
||||
model_user.login_name = login_name
|
||||
|
||||
if login_pwd != default_pwd:
|
||||
model_user.login_pwd = UserService.genePwd( login_pwd,model_user.login_salt )
|
||||
|
||||
model_user.created_time = getCurrentDate()
|
||||
|
||||
db.session.add( model_user )
|
||||
db.session.commit()
|
||||
return jsonify(resp)
|
||||
|
||||
@route_account.route("/ops",methods = [ "POST" ])
|
||||
def ops():
|
||||
resp = {'code': 200, 'msg': '操作成功~~', 'data': {}}
|
||||
req = request.values
|
||||
|
||||
id = req['id'] if 'id' in req else 0
|
||||
act = req['act'] if 'act' in req else ''
|
||||
if not id :
|
||||
resp['code'] = -1
|
||||
resp['msg'] = "请选择要操作的账号~~"
|
||||
return jsonify(resp)
|
||||
|
||||
if act not in [ 'remove','recover' ] :
|
||||
resp['code'] = -1
|
||||
resp['msg'] = "操作有误,请重试~~"
|
||||
return jsonify(resp)
|
||||
|
||||
user_info = User.query.filter_by(uid=id).first()
|
||||
if not user_info:
|
||||
resp['code'] = -1
|
||||
resp['msg'] = "指定账号不存在~~"
|
||||
return jsonify(resp)
|
||||
|
||||
if act == "remove":
|
||||
user_info.status = 0
|
||||
elif act == "recover":
|
||||
user_info.status = 1
|
||||
|
||||
user_info.update_time = getCurrentDate()
|
||||
db.session.add(user_info)
|
||||
db.session.commit()
|
||||
return jsonify(resp)
|
||||
|
||||
|
||||
@@ -40,6 +40,12 @@ def login():
|
||||
resp['msg'] = "请输入正确的登录用户名和密码-2~~"
|
||||
return jsonify(resp)
|
||||
|
||||
if user_info.status !=1:
|
||||
resp['code'] = -1
|
||||
resp['msg'] = "帐号已被禁用,请联系管理员处理~~"
|
||||
return jsonify(resp)
|
||||
|
||||
|
||||
response = make_response(json.dumps(resp))
|
||||
response.set_cookie(app.config['AUTH_COOKIE_NAME'], '%s#%s' % (
|
||||
UserService.geneAuthCode(user_info), user_info.uid)) # 保存120天
|
||||
|
||||
@@ -5,6 +5,7 @@ from flask import request,g,redirect
|
||||
from common.models.User import ( User )
|
||||
from common.libs.user.UserService import ( UserService )
|
||||
from common.libs.UrlManager import ( UrlManager )
|
||||
from common.libs.LogService import LogService
|
||||
|
||||
import re
|
||||
@app.before_request
|
||||
@@ -22,7 +23,8 @@ def before_request():
|
||||
g.current_user=None
|
||||
if user_info:
|
||||
g.current_user=user_info
|
||||
|
||||
# 加入日志
|
||||
LogService.addAccessLog()
|
||||
pattern = re.compile('%s' % "|".join(ignore_urls))
|
||||
if pattern.match(path):
|
||||
return
|
||||
|
||||
9
web/interceptors/ErrorInterceptor.py
Normal file
9
web/interceptors/ErrorInterceptor.py
Normal file
@@ -0,0 +1,9 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from application import app
|
||||
from common.libs.Helper import ops_render
|
||||
from common.libs.LogService import LogService
|
||||
|
||||
@app.errorhandler( 404 )
|
||||
def error_404( e ):
|
||||
LogService.addErrorLog( str( e ) )
|
||||
return ops_render( 'error/error.html',{ 'status':404,'msg':'很抱歉!您访问的页面不存在' } )
|
||||
51
web/static/js/account/index.js
Normal file
51
web/static/js/account/index.js
Normal file
@@ -0,0 +1,51 @@
|
||||
;
|
||||
var account_index_ops = {
|
||||
init:function(){
|
||||
this.eventBind();
|
||||
},
|
||||
eventBind:function(){
|
||||
var that = this;
|
||||
$(".wrap_search .search").click(function(){
|
||||
$(".wrap_search").submit();
|
||||
});
|
||||
|
||||
$(".remove").click( function(){
|
||||
that.ops( "remove",$(this).attr("data") );
|
||||
} );
|
||||
|
||||
$(".recover").click( function(){
|
||||
that.ops( "recover",$(this).attr("data") );
|
||||
} );
|
||||
},
|
||||
ops:function( act,id ){
|
||||
var callback = {
|
||||
'ok':function(){
|
||||
$.ajax({
|
||||
url:common_ops.buildUrl( "/account/ops" ),
|
||||
type:'POST',
|
||||
data:{
|
||||
act:act,
|
||||
id:id
|
||||
},
|
||||
dataType:'json',
|
||||
success:function( res ){
|
||||
var callback = null;
|
||||
if( res.code == 200 ){
|
||||
callback = function(){
|
||||
window.location.href = window.location.href;
|
||||
}
|
||||
}
|
||||
common_ops.alert( res.msg,callback );
|
||||
}
|
||||
});
|
||||
},
|
||||
'cancel':null
|
||||
};
|
||||
common_ops.confirm( ( act == "remove" ? "确定删除?":"确定恢复?" ), callback );
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
$(document).ready( function(){
|
||||
account_index_ops.init();
|
||||
} );
|
||||
89
web/static/js/account/set.js
Normal file
89
web/static/js/account/set.js
Normal file
@@ -0,0 +1,89 @@
|
||||
;
|
||||
var account_set_ops = {
|
||||
init:function(){
|
||||
this.eventBind();
|
||||
},
|
||||
eventBind:function(){
|
||||
$(".wrap_account_set .save").click(function(){
|
||||
var btn_target = $(this);
|
||||
if( btn_target.hasClass("disabled") ){
|
||||
common_ops.alert("正在处理!!请不要重复提交~~");
|
||||
return;
|
||||
}
|
||||
|
||||
var nickname_target = $(".wrap_account_set input[name=nickname]");
|
||||
var nickname = nickname_target.val();
|
||||
|
||||
var mobile_target = $(".wrap_account_set input[name=mobile]");
|
||||
var mobile = mobile_target.val();
|
||||
|
||||
var email_target = $(".wrap_account_set input[name=email]");
|
||||
var email = email_target.val();
|
||||
|
||||
var login_name_target = $(".wrap_account_set input[name=login_name]");
|
||||
var login_name = login_name_target.val();
|
||||
|
||||
var login_pwd_target = $(".wrap_account_set input[name=login_pwd]");
|
||||
var login_pwd = login_pwd_target.val();
|
||||
|
||||
if( nickname.length < 1 ){
|
||||
common_ops.tip( "请输入符合规范的姓名~~",nickname_target );
|
||||
return false;
|
||||
}
|
||||
|
||||
if( mobile.length < 1 ){
|
||||
common_ops.tip( "请输入符合规范的手机号码~~",mobile_target );
|
||||
return false;
|
||||
}
|
||||
|
||||
if( email.length < 1 ){
|
||||
common_ops.tip( "请输入符合规范的邮箱~~",email_target );
|
||||
return false;
|
||||
}
|
||||
|
||||
if( login_name.length < 1 ){
|
||||
common_ops.tip( "请输入符合规范的登录用户名~~",login_name_target );
|
||||
return false;
|
||||
}
|
||||
|
||||
if( login_pwd.length < 6 ){
|
||||
common_ops.tip( "请输入符合规范的登录密码~~",login_pwd_target );
|
||||
return false;
|
||||
}
|
||||
|
||||
btn_target.addClass("disabled");
|
||||
|
||||
var data = {
|
||||
nickname: nickname,
|
||||
mobile: mobile,
|
||||
email: email,
|
||||
login_name:login_name,
|
||||
login_pwd:login_pwd,
|
||||
id:$(".wrap_account_set input[name=id]").val()
|
||||
};
|
||||
|
||||
$.ajax({
|
||||
url:common_ops.buildUrl( "/account/set" ),
|
||||
type:'POST',
|
||||
data:data,
|
||||
dataType:'json',
|
||||
success:function( res ){
|
||||
btn_target.removeClass("disabled");
|
||||
var callback = null;
|
||||
if( res.code == 200 ){
|
||||
callback = function(){
|
||||
window.location.href = common_ops.buildUrl("/account/index");
|
||||
}
|
||||
}
|
||||
common_ops.alert( res.msg,callback );
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
$(document).ready( function(){
|
||||
account_set_ops.init();
|
||||
} );
|
||||
@@ -1,16 +1,6 @@
|
||||
{% extends "common/layout_main.html" %}
|
||||
{% block content %}
|
||||
<div class="row border-bottom">
|
||||
<div class="col-lg-12">
|
||||
<div class="tab_title">
|
||||
<ul class="nav nav-pills">
|
||||
<li class="current">
|
||||
<a href="{{ buildUrl('/account/index') }}">账户列表</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% include "common/tab_account.html" %}
|
||||
<div class="row">
|
||||
<div class="col-lg-12">
|
||||
<form class="form-inline wrap_search">
|
||||
@@ -18,15 +8,17 @@
|
||||
<div class="form-group">
|
||||
<select name="status" class="form-control inline">
|
||||
<option value="-1">请选择状态</option>
|
||||
<option value="1">正常</option>
|
||||
<option value="0">已删除</option>
|
||||
{% for tmp_key in status_mapping %}
|
||||
<option value="{{tmp_key}}" {% if tmp_key==search_con['status'] %} selected {% endif %}>{{ status_mapping[ tmp_key] }}</option>
|
||||
{% endfor %}
|
||||
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<div class="input-group">
|
||||
<input type="text" name="mix_kw" placeholder="请输入姓名或者手机号码" class="form-control" value="">
|
||||
<input type="hidden" name="p" value="1">
|
||||
<input type="text" name="mix_kw" placeholder="请输入姓名或者手机号码" class="form-control" value="{{ search_con['mix_kw']}}">
|
||||
<input type="hidden" name="p" value="{{ search_con['p']}}">
|
||||
<span class="input-group-btn">
|
||||
<button type="button" class="btn btn-primary search">
|
||||
<i class="fa fa-search"></i>搜索
|
||||
@@ -96,3 +88,6 @@
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
{% block js %}
|
||||
<script src="{{ buildStaticUrl('/js/account/index.js') }}"></script>
|
||||
{% endblock %}
|
||||
|
||||
@@ -1,16 +1,6 @@
|
||||
{% extends "common/layout_main.html" %}
|
||||
{% block content %}
|
||||
<div class="row border-bottom">
|
||||
<div class="col-lg-12">
|
||||
<div class="tab_title">
|
||||
<ul class="nav nav-pills">
|
||||
<li class="current">
|
||||
<a href="{{ buildUrl('/account/index') }}">账户列表</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% include "common/tab_account.html" %}
|
||||
<div class="row m-t wrap_account_set">
|
||||
<div class="col-lg-12">
|
||||
<h2 class="text-center">账号设置</h2>
|
||||
@@ -18,41 +8,41 @@
|
||||
<div class="form-group">
|
||||
<label class="col-lg-2 control-label">姓名:</label>
|
||||
<div class="col-lg-10">
|
||||
<input type="text" name="nickname" class="form-control" placeholder="请输入姓名~~" value="">
|
||||
<input type="text" name="nickname" class="form-control" placeholder="请输入姓名~~" value="{{ info.nickname}}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="hr-line-dashed"></div>
|
||||
<div class="form-group">
|
||||
<label class="col-lg-2 control-label">手机:</label>
|
||||
<div class="col-lg-10">
|
||||
<input type="text" name="mobile" class="form-control" placeholder="请输入手机~~" value="">
|
||||
<input type="text" name="mobile" class="form-control" placeholder="请输入手机~~" value="{{ info.mobile}}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="hr-line-dashed"></div>
|
||||
<div class="form-group">
|
||||
<label class="col-lg-2 control-label">邮箱:</label>
|
||||
<div class="col-lg-10">
|
||||
<input type="text" name="email" class="form-control" placeholder="请输入邮箱~~" value="">
|
||||
<input type="text" name="email" class="form-control" placeholder="请输入邮箱~~" value="{{ info.email}}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="hr-line-dashed"></div>
|
||||
<div class="form-group">
|
||||
<label class="col-lg-2 control-label">登录名:</label>
|
||||
<div class="col-lg-10">
|
||||
<input type="text" name="login_name" class="form-control" autocomplete="off" placeholder="请输入登录名~~" value="">
|
||||
<input type="text" name="login_name" class="form-control" autocomplete="off" placeholder="请输入登录名~~" value="{{ info.login_name}}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="hr-line-dashed"></div>
|
||||
<div class="form-group">
|
||||
<label class="col-lg-2 control-label">登录密码:</label>
|
||||
<div class="col-lg-10">
|
||||
<input type="password" name="login_pwd" class="form-control" autocomplete="new-password" placeholder="请输入登录密码~~" value="">
|
||||
<input type="password" name="login_pwd" class="form-control" autocomplete="new-password" placeholder="请输入登录密码~~" value="******">
|
||||
</div>
|
||||
</div>
|
||||
<div class="hr-line-dashed"></div>
|
||||
<div class="form-group">
|
||||
<div class="col-lg-4 col-lg-offset-2">
|
||||
<input type="hidden" name="id" value="0">
|
||||
<input type="hidden" name="id" value="{{ info.uid}}">
|
||||
<button class="btn btn-w-m btn-outline btn-primary save">保存</button>
|
||||
</div>
|
||||
</div>
|
||||
@@ -60,3 +50,6 @@
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
{% block js %}
|
||||
<script src="{{ buildStaticUrl('/js/account/set.js') }}"></script>
|
||||
{% endblock %}
|
||||
|
||||
Reference in New Issue
Block a user