python学习

This commit is contained in:
2019-07-29 15:28:02 +08:00
parent 5ee5b5035c
commit 04327fbd47
18 changed files with 709 additions and 274 deletions

550
.idea/workspace.xml generated
View File

@@ -2,12 +2,24 @@
<project version="4"> <project version="4">
<component name="ChangeListManager"> <component name="ChangeListManager">
<list default="true" id="d564f57a-9f96-4262-9481-cacdf2b8445c" name="Default" comment="python学习"> <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$/com" afterDir="false" />
<change afterPath="$PROJECT_DIR$/common/models/log/AppErrorLog.py" afterDir="false" /> <change afterPath="$PROJECT_DIR$/common/libs/LogService.py" afterDir="false" />
<change afterPath="$PROJECT_DIR$/web/templates/common/tab_account.html" 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$/.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/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> </list>
<option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" /> <option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
<option name="SHOW_DIALOG" value="false" /> <option name="SHOW_DIALOG" value="false" />
@@ -18,45 +30,63 @@
<component name="FileEditorManager"> <component name="FileEditorManager">
<leaf SIDE_TABS_SIZE_LIMIT_KEY="300"> <leaf SIDE_TABS_SIZE_LIMIT_KEY="300">
<file pinned="false" current-in-tab="false"> <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"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="1268"> <state relative-caret-position="372">
<caret line="117" lean-forward="true" selection-start-line="117" selection-end-line="117" /> <caret line="30" lean-forward="true" selection-start-line="30" selection-end-line="30" />
<folding> <folding>
<element signature="e#24#91#0" expanded="true" /> <element signature="e#24#51#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" />
</folding> </folding>
</state> </state>
</provider> </provider>
</entry> </entry>
</file> </file>
<file pinned="false" current-in-tab="true"> <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"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="310"> <state relative-caret-position="248">
<caret line="10" column="6" lean-forward="true" selection-start-line="10" selection-start-column="6" selection-end-line="10" selection-end-column="6" /> <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> </state>
</provider> </provider>
</entry> </entry>
</file> </file>
<file pinned="false" current-in-tab="false"> <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"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="2046"> <state relative-caret-position="217">
<caret line="66" column="14" lean-forward="true" selection-start-line="66" selection-start-column="14" selection-end-line="66" selection-end-column="14" /> <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> </state>
</provider> </provider>
</entry> </entry>
@@ -64,7 +94,8 @@
<file pinned="false" current-in-tab="false"> <file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/common/models/log/AppAccessLog.py"> <entry file="file://$PROJECT_DIR$/common/models/log/AppAccessLog.py">
<provider selected="true" editor-type-id="text-editor"> <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> <folding>
<element signature="e#16#90#0" expanded="true" /> <element signature="e#16#90#0" expanded="true" />
</folding> </folding>
@@ -75,7 +106,8 @@
<file pinned="false" current-in-tab="false"> <file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/common/models/log/AppErrorLog.py"> <entry file="file://$PROJECT_DIR$/common/models/log/AppErrorLog.py">
<provider selected="true" editor-type-id="text-editor"> <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> <folding>
<element signature="e#16#78#0" expanded="true" /> <element signature="e#16#78#0" expanded="true" />
</folding> </folding>
@@ -83,41 +115,20 @@
</provider> </provider>
</entry> </entry>
</file> </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"> <file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/config/local_setting.py"> <entry file="file://$PROJECT_DIR$/config/local_setting.py">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="186"> <state relative-caret-position="62">
<caret line="6" column="31" lean-forward="true" selection-start-line="6" selection-start-column="31" selection-end-line="6" selection-end-column="31" /> <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> </state>
</provider> </provider>
</entry> </entry>
@@ -137,6 +148,13 @@
<find>route_user</find> <find>route_user</find>
<find>login_name</find> <find>login_name</find>
<find>render_template</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> </findStrings>
<replaceStrings> <replaceStrings>
<replace>ops_render</replace> <replace>ops_render</replace>
@@ -149,7 +167,6 @@
<option name="CHANGED_PATHS"> <option name="CHANGED_PATHS">
<list> <list>
<option value="$PROJECT_DIR$/imooc.py" /> <option value="$PROJECT_DIR$/imooc.py" />
<option value="$PROJECT_DIR$/common/libs/UrlManager.py" />
<option value="$PROJECT_DIR$/Hello.py" /> <option value="$PROJECT_DIR$/Hello.py" />
<option value="$PROJECT_DIR$/config/production.py" /> <option value="$PROJECT_DIR$/config/production.py" />
<option value="$PROJECT_DIR$/docs/mysql.md" /> <option value="$PROJECT_DIR$/docs/mysql.md" />
@@ -157,7 +174,6 @@
<option value="$PROJECT_DIR$/manager.py" /> <option value="$PROJECT_DIR$/manager.py" />
<option value="$PROJECT_DIR$/mina/project.config.json" /> <option value="$PROJECT_DIR$/mina/project.config.json" />
<option value="$PROJECT_DIR$/common/models/User.py" /> <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$/requirements.txt" />
<option value="$PROJECT_DIR$/application.py" /> <option value="$PROJECT_DIR$/application.py" />
<option value="$PROJECT_DIR$/config/__init__.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/templates/user/login.html" />
<option value="$PROJECT_DIR$/web/static/js/common.js" /> <option value="$PROJECT_DIR$/web/static/js/common.js" />
<option value="$PROJECT_DIR$/web/static/js/user/login.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$/web/templates/common/layout_main.html" />
<option value="$PROJECT_DIR$/common/libs/user/Helper.py" /> <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/index.py" />
<option value="$PROJECT_DIR$/web/controllers/stat/Stat.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/member/Member.py" />
<option value="$PROJECT_DIR$/web/controllers/food/Food.py" /> <option value="$PROJECT_DIR$/web/controllers/food/Food.py" />
<option value="$PROJECT_DIR$/web/controllers/finance/Finance.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/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/user/edit.html" />
<option value="$PROJECT_DIR$/web/templates/account/info.html" />
<option value="$PROJECT_DIR$/common/libs/Helper.py" /> <option value="$PROJECT_DIR$/common/libs/Helper.py" />
<option value="$PROJECT_DIR$/config/base_setting.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/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> </list>
</option> </option>
</component> </component>
@@ -195,10 +217,10 @@
<packageJsonPaths /> <packageJsonPaths />
</component> </component>
<component name="ProjectFrameBounds"> <component name="ProjectFrameBounds">
<option name="x" value="963" /> <option name="x" value="960" />
<option name="y" value="22" /> <option name="y" value="20" />
<option name="width" value="938" /> <option name="width" value="958" />
<option name="height" value="1028" /> <option name="height" value="939" />
</component> </component>
<component name="ProjectLevelVcsManager" settingsEditedManually="true" /> <component name="ProjectLevelVcsManager" settingsEditedManually="true" />
<component name="ProjectView"> <component name="ProjectView">
@@ -224,6 +246,13 @@
<item name="common" type="462c0819:PsiDirectoryNode" /> <item name="common" type="462c0819:PsiDirectoryNode" />
<item name="libs" type="462c0819:PsiDirectoryNode" /> <item name="libs" type="462c0819:PsiDirectoryNode" />
</path> </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> <path>
<item name="order" type="b2602c69:ProjectViewProjectNode" /> <item name="order" type="b2602c69:ProjectViewProjectNode" />
<item name="order" type="462c0819:PsiDirectoryNode" /> <item name="order" type="462c0819:PsiDirectoryNode" />
@@ -237,11 +266,63 @@
<item name="models" type="462c0819:PsiDirectoryNode" /> <item name="models" type="462c0819:PsiDirectoryNode" />
<item name="log" type="462c0819:PsiDirectoryNode" /> <item name="log" type="462c0819:PsiDirectoryNode" />
</path> </path>
<path>
<item name="order" type="b2602c69:ProjectViewProjectNode" />
<item name="order" type="462c0819:PsiDirectoryNode" />
<item name="config" type="462c0819:PsiDirectoryNode" />
</path>
<path> <path>
<item name="order" type="b2602c69:ProjectViewProjectNode" /> <item name="order" type="b2602c69:ProjectViewProjectNode" />
<item name="order" type="462c0819:PsiDirectoryNode" /> <item name="order" type="462c0819:PsiDirectoryNode" />
<item name="web" type="462c0819:PsiDirectoryNode" /> <item name="web" type="462c0819:PsiDirectoryNode" />
</path> </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> <path>
<item name="order" type="b2602c69:ProjectViewProjectNode" /> <item name="order" type="b2602c69:ProjectViewProjectNode" />
<item name="order" type="462c0819:PsiDirectoryNode" /> <item name="order" type="462c0819:PsiDirectoryNode" />
@@ -262,6 +343,13 @@
<item name="templates" type="462c0819:PsiDirectoryNode" /> <item name="templates" type="462c0819:PsiDirectoryNode" />
<item name="common" type="462c0819:PsiDirectoryNode" /> <item name="common" type="462c0819:PsiDirectoryNode" />
</path> </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> <path>
<item name="order" type="b2602c69:ProjectViewProjectNode" /> <item name="order" type="b2602c69:ProjectViewProjectNode" />
<item name="External Libraries" type="cb654da1:ExternalLibrariesNode" /> <item name="External Libraries" type="cb654da1:ExternalLibrariesNode" />
@@ -276,7 +364,7 @@
<component name="PropertiesComponent"> <component name="PropertiesComponent">
<property name="SHARE_PROJECT_CONFIGURATION_FILES" value="true" /> <property name="SHARE_PROJECT_CONFIGURATION_FILES" value="true" />
<property name="WebServerToolWindowFactoryState" value="false" /> <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_interpreter_path.stuck_in_default_project" value="undefined stuck path" />
<property name="nodejs_npm_path_reset_for_default_project" value="true" /> <property name="nodejs_npm_path_reset_for_default_project" value="true" />
<property name="options.lastSelected" value="com.jetbrains.python.configuration.PythonSdkConfigurable" /> <property name="options.lastSelected" value="com.jetbrains.python.configuration.PythonSdkConfigurable" />
@@ -287,11 +375,11 @@
</component> </component>
<component name="RecentsManager"> <component name="RecentsManager">
<key name="CopyFile.RECENT_KEYS"> <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\web\templates\common" />
<recent name="D:\order\common\models" /> <recent name="D:\order\web\static\js\account" />
<recent name="D:\order\web\static\js\user" />
<recent name="D:\order\web\templates\user" />
<recent name="D:\order" />
</key> </key>
<key name="MoveFile.RECENT_KEYS"> <key name="MoveFile.RECENT_KEYS">
<recent name="D:\order\common\libs" /> <recent name="D:\order\common\libs" />
@@ -379,7 +467,14 @@
<option name="project" value="LOCAL" /> <option name="project" value="LOCAL" />
<updated>1563789519074</updated> <updated>1563789519074</updated>
</task> </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 /> <servers />
</component> </component>
<component name="TodoView"> <component name="TodoView">
@@ -392,10 +487,9 @@
</todo-panel> </todo-panel>
</component> </component>
<component name="ToolWindowManager"> <component name="ToolWindowManager">
<frame x="963" y="22" width="938" height="1028" extended-state="0" /> <frame x="960" y="20" width="958" height="939" extended-state="0" />
<editor active="true" />
<layout> <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="Structure" order="1" side_tool="true" weight="0.25" />
<window_info id="Favorites" order="2" side_tool="true" /> <window_info id="Favorites" order="2" side_tool="true" />
<window_info id="Project Explorer" order="3" /> <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="TODO" order="6" weight="0.32960895" />
<window_info anchor="bottom" id="Docker" order="7" show_stripe_button="false" /> <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="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="Event Log" order="10" side_tool="true" />
<window_info anchor="bottom" id="Version Control" order="11" /> <window_info anchor="bottom" id="Version Control" order="11" />
<window_info anchor="bottom" id="Python Console" order="12" /> <window_info anchor="bottom" id="Python Console" order="12" />
@@ -434,47 +528,6 @@
<option name="LAST_COMMIT_MESSAGE" value="python学习" /> <option name="LAST_COMMIT_MESSAGE" value="python学习" />
</component> </component>
<component name="editorHistoryManager"> <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"> <entry file="file://$PROJECT_DIR$/venv/Lib/site-packages/sqlalchemy/engine/strategies.py">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="166"> <state relative-caret-position="166">
@@ -530,64 +583,21 @@
</state> </state>
</provider> </provider>
</entry> </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"> <entry file="file://$PROJECT_DIR$/web/interceptors/__init__.py">
<provider selected="true" editor-type-id="text-editor" /> <provider selected="true" editor-type-id="text-editor" />
</entry> </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$/README.en.md" />
<entry file="file://$PROJECT_DIR$/web/interceptors/ApiAuthInterceptor.py"> <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$/readme.md"> <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]"> <provider selected="true" editor-type-id="split-provider[text-editor;markdown-preview-editor]">
<state split_layout="SPLIT"> <state split_layout="SPLIT">
<first_editor /> <first_editor />
<second_editor /> <second_editor />
</state> </state>
</provider> </provider>
</entry> <provider editor-type-id="text-editor">
<entry file="file://$PROJECT_DIR$/web/interceptors/AuthInterceptor.py"> <state relative-caret-position="108">
<provider selected="true" editor-type-id="text-editor"> <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 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>
</state> </state>
</provider> </provider>
</entry> </entry>
@@ -674,36 +684,6 @@
</state> </state>
</provider> </provider>
</entry> </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"> <entry file="file://$PROJECT_DIR$/web/templates/user/reset_pwd.html">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="62"> <state relative-caret-position="62">
@@ -720,7 +700,7 @@
</entry> </entry>
<entry file="file://$PROJECT_DIR$/application.py"> <entry file="file://$PROJECT_DIR$/application.py">
<provider selected="true" editor-type-id="text-editor"> <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" /> <caret line="16" selection-start-line="16" selection-end-line="16" />
<folding> <folding>
<element signature="e#24#47#0" expanded="true" /> <element signature="e#24#47#0" expanded="true" />
@@ -728,30 +708,121 @@
</state> </state>
</provider> </provider>
</entry> </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"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="186"> <state relative-caret-position="399">
<caret line="6" column="31" lean-forward="true" selection-start-line="6" selection-start-column="31" selection-end-line="6" selection-end-column="31" /> <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> </state>
</provider> </provider>
</entry> </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"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="364"> <state relative-caret-position="168">
<caret line="16" lean-forward="true" selection-start-line="16" selection-end-line="16" /> <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> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/web/templates/account/index.html"> <entry file="file://$PROJECT_DIR$/web/templates/account/index.html">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="288"> <state relative-caret-position="62">
<caret line="97" column="14" lean-forward="true" selection-start-line="97" selection-start-column="14" selection-end-line="97" selection-end-column="14" /> <caret line="2" column="39" selection-start-line="2" selection-start-column="39" selection-end-line="2" selection-end-column="39" />
</state> </state>
</provider> </provider>
</entry> </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"> <entry file="file://$PROJECT_DIR$/common/models/log/AppAccessLog.py">
<provider selected="true" editor-type-id="text-editor"> <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> <folding>
<element signature="e#16#90#0" expanded="true" /> <element signature="e#16#90#0" expanded="true" />
</folding> </folding>
@@ -760,34 +831,61 @@
</entry> </entry>
<entry file="file://$PROJECT_DIR$/common/models/log/AppErrorLog.py"> <entry file="file://$PROJECT_DIR$/common/models/log/AppErrorLog.py">
<provider selected="true" editor-type-id="text-editor"> <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> <folding>
<element signature="e#16#78#0" expanded="true" /> <element signature="e#16#78#0" expanded="true" />
</folding> </folding>
</state> </state>
</provider> </provider>
</entry> </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"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="2046"> <state relative-caret-position="496">
<caret line="66" column="14" lean-forward="true" selection-start-line="66" selection-start-column="14" selection-end-line="66" selection-end-column="14" /> <caret line="16" column="22" selection-start-line="16" selection-start-column="22" selection-end-line="16" selection-end-column="22" />
</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" />
<folding> <folding>
<element signature="e#24#68#0" expanded="true" /> <element signature="e#24#35#0" expanded="true" />
</folding> </folding>
</state> </state>
</provider> </provider>
</entry> </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"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="310"> <state relative-caret-position="372">
<caret line="10" column="6" lean-forward="true" selection-start-line="10" selection-start-column="6" selection-end-line="10" selection-end-column="6" /> <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> </state>
</provider> </provider>
</entry> </entry>

22
com Normal file
View 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())

View File

@@ -58,3 +58,10 @@ def ops_render( template,context = {} ):
if 'current_user' in g: if 'current_user' in g:
context['current_user'] = g.current_user context['current_user'] = g.current_user
return render_template( template,**context ) 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
View 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

View File

@@ -1,5 +1,6 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import time
from application import app
class UrlManager(object): class UrlManager(object):
def __init__(self): def __init__(self):
pass pass
@@ -10,6 +11,7 @@ class UrlManager(object):
@staticmethod @staticmethod
def buildStaticUrl(path): 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 path = "/static" + path + "?ver=" + ver
return UrlManager.buildUrl( path ) return UrlManager.buildUrl( path )

View File

@@ -4,7 +4,6 @@ from sqlalchemy.schema import FetchedValue
from application import db from application import db
class AppAccessLog(db.Model): class AppAccessLog(db.Model):
__tablename__ = 'app_access_log' __tablename__ = 'app_access_log'

View File

@@ -1,9 +1,13 @@
# coding: utf-8 # coding: utf-8
from sqlalchemy import Column, DateTime, Integer, String, Text from sqlalchemy import Column, DateTime, Integer, String, Text
from sqlalchemy.schema import FetchedValue from sqlalchemy.schema import FetchedValue
from application import db from application import db
class AppErrorLog(db.Model): class AppErrorLog(db.Model):
__tablename__ = 'app_error_log' __tablename__ = 'app_error_log'

View File

@@ -17,3 +17,8 @@ IGNORE_CHECK_LOGIN_URLS = [
PAGE_SIZE = 50 PAGE_SIZE = 50
PAGE_DISPLAY = 10 PAGE_DISPLAY = 10
STATUS_MAPPING = {
"1":"正常",
"0":"已删除"
}

View File

@@ -5,3 +5,4 @@ SQLALCHEMY_ECHO = True
SQLALCHEMY_DATABASE_URI = 'mysql://root:123456@127.0.0.1/food_db' SQLALCHEMY_DATABASE_URI = 'mysql://root:123456@127.0.0.1/food_db'
SQLALCHEMY_TRACK_MODIFICATIONS = False SQLALCHEMY_TRACK_MODIFICATIONS = False
SQLALCHEMY_ENCODING = "utf8mb4" SQLALCHEMY_ENCODING = "utf8mb4"
# RELEASE_VERSION = "20190730"

View File

@@ -1,9 +1,11 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from flask import Blueprint,request,redirect from flask import Blueprint,request,redirect,jsonify
from common.libs.Helper import ops_render,iPagination from common.libs.Helper import ops_render,iPagination,getCurrentDate
from common.libs.UrlManager import UrlManager from common.libs.UrlManager import UrlManager
from common.libs.user.UserService import UserService
from common.models.User import User from common.models.User import User
from common.models.log.AppAccessLog import AppAccessLog from common.models.log.AppAccessLog import AppAccessLog
from sqlalchemy import or_
route_account = Blueprint( 'account_page',__name__ ) route_account = Blueprint( 'account_page',__name__ )
from application import app,db from application import app,db
@route_account.route( "/index" ) @route_account.route( "/index" )
@@ -13,12 +15,17 @@ def index():
page = int(req['p']) if ('p' in req and req['p']) else 1 page = int(req['p']) if ('p' in req and req['p']) else 1
query = User.query 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 = { page_params = {
'total': query.count(), 'total': query.count(),
'page_size': app.config['PAGE_SIZE'], 'page_size': app.config['PAGE_SIZE'],
'page': page, 'page': page,
'display': app.config['PAGE_DISPLAY'], 'display': app.config['PAGE_DISPLAY'],
'url': '/account/index' 'url': request.full_path.replace( "&p={}".format(page),"")
} }
pages = iPagination(page_params) pages = iPagination(page_params)
@@ -29,6 +36,8 @@ def index():
resp_data['list'] = list resp_data['list'] = list
resp_data['pages'] = pages 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) return ops_render("account/index.html", resp_data)
@route_account.route( "/info" ) @route_account.route( "/info" )
@@ -48,6 +57,111 @@ def info():
return ops_render("account/info.html", resp_data) return ops_render("account/info.html", resp_data)
@route_account.route( "/set" ) @route_account.route( "/set" ,methods=["GET", "POST"])
def set(): 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)

View File

@@ -40,6 +40,12 @@ def login():
resp['msg'] = "请输入正确的登录用户名和密码-2~~" resp['msg'] = "请输入正确的登录用户名和密码-2~~"
return jsonify(resp) return jsonify(resp)
if user_info.status !=1:
resp['code'] = -1
resp['msg'] = "帐号已被禁用,请联系管理员处理~~"
return jsonify(resp)
response = make_response(json.dumps(resp)) response = make_response(json.dumps(resp))
response.set_cookie(app.config['AUTH_COOKIE_NAME'], '%s#%s' % ( response.set_cookie(app.config['AUTH_COOKIE_NAME'], '%s#%s' % (
UserService.geneAuthCode(user_info), user_info.uid)) # 保存120天 UserService.geneAuthCode(user_info), user_info.uid)) # 保存120天

View File

@@ -5,6 +5,7 @@ from flask import request,g,redirect
from common.models.User import ( User ) from common.models.User import ( User )
from common.libs.user.UserService import ( UserService ) from common.libs.user.UserService import ( UserService )
from common.libs.UrlManager import ( UrlManager ) from common.libs.UrlManager import ( UrlManager )
from common.libs.LogService import LogService
import re import re
@app.before_request @app.before_request
@@ -22,7 +23,8 @@ def before_request():
g.current_user=None g.current_user=None
if user_info: if user_info:
g.current_user=user_info g.current_user=user_info
# 加入日志
LogService.addAccessLog()
pattern = re.compile('%s' % "|".join(ignore_urls)) pattern = re.compile('%s' % "|".join(ignore_urls))
if pattern.match(path): if pattern.match(path):
return return

View 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':'很抱歉!您访问的页面不存在' } )

View 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();
} );

View 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();
} );

View File

@@ -1,16 +1,6 @@
{% extends "common/layout_main.html" %} {% extends "common/layout_main.html" %}
{% block content %} {% block content %}
<div class="row border-bottom"> {% include "common/tab_account.html" %}
<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>
<div class="row"> <div class="row">
<div class="col-lg-12"> <div class="col-lg-12">
<form class="form-inline wrap_search"> <form class="form-inline wrap_search">
@@ -18,15 +8,17 @@
<div class="form-group"> <div class="form-group">
<select name="status" class="form-control inline"> <select name="status" class="form-control inline">
<option value="-1">请选择状态</option> <option value="-1">请选择状态</option>
<option value="1">正常</option> {% for tmp_key in status_mapping %}
<option value="0">已删除</option> <option value="{{tmp_key}}" {% if tmp_key==search_con['status'] %} selected {% endif %}>{{ status_mapping[ tmp_key] }}</option>
{% endfor %}
</select> </select>
</div> </div>
<div class="form-group"> <div class="form-group">
<div class="input-group"> <div class="input-group">
<input type="text" name="mix_kw" placeholder="请输入姓名或者手机号码" class="form-control" value=""> <input type="text" name="mix_kw" placeholder="请输入姓名或者手机号码" class="form-control" value="{{ search_con['mix_kw']}}">
<input type="hidden" name="p" value="1"> <input type="hidden" name="p" value="{{ search_con['p']}}">
<span class="input-group-btn"> <span class="input-group-btn">
<button type="button" class="btn btn-primary search"> <button type="button" class="btn btn-primary search">
<i class="fa fa-search"></i>搜索 <i class="fa fa-search"></i>搜索
@@ -96,3 +88,6 @@
</div> </div>
</div> </div>
{% endblock %} {% endblock %}
{% block js %}
<script src="{{ buildStaticUrl('/js/account/index.js') }}"></script>
{% endblock %}

View File

@@ -1,16 +1,6 @@
{% extends "common/layout_main.html" %} {% extends "common/layout_main.html" %}
{% block content %} {% block content %}
<div class="row border-bottom"> {% include "common/tab_account.html" %}
<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>
<div class="row m-t wrap_account_set"> <div class="row m-t wrap_account_set">
<div class="col-lg-12"> <div class="col-lg-12">
<h2 class="text-center">账号设置</h2> <h2 class="text-center">账号设置</h2>
@@ -18,41 +8,41 @@
<div class="form-group"> <div class="form-group">
<label class="col-lg-2 control-label">姓名:</label> <label class="col-lg-2 control-label">姓名:</label>
<div class="col-lg-10"> <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> </div>
<div class="hr-line-dashed"></div> <div class="hr-line-dashed"></div>
<div class="form-group"> <div class="form-group">
<label class="col-lg-2 control-label">手机:</label> <label class="col-lg-2 control-label">手机:</label>
<div class="col-lg-10"> <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> </div>
<div class="hr-line-dashed"></div> <div class="hr-line-dashed"></div>
<div class="form-group"> <div class="form-group">
<label class="col-lg-2 control-label">邮箱:</label> <label class="col-lg-2 control-label">邮箱:</label>
<div class="col-lg-10"> <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> </div>
<div class="hr-line-dashed"></div> <div class="hr-line-dashed"></div>
<div class="form-group"> <div class="form-group">
<label class="col-lg-2 control-label">登录名:</label> <label class="col-lg-2 control-label">登录名:</label>
<div class="col-lg-10"> <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> </div>
<div class="hr-line-dashed"></div> <div class="hr-line-dashed"></div>
<div class="form-group"> <div class="form-group">
<label class="col-lg-2 control-label">登录密码:</label> <label class="col-lg-2 control-label">登录密码:</label>
<div class="col-lg-10"> <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> </div>
<div class="hr-line-dashed"></div> <div class="hr-line-dashed"></div>
<div class="form-group"> <div class="form-group">
<div class="col-lg-4 col-lg-offset-2"> <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> <button class="btn btn-w-m btn-outline btn-primary save">保存</button>
</div> </div>
</div> </div>
@@ -60,3 +50,6 @@
</div> </div>
</div> </div>
{% endblock %} {% endblock %}
{% block js %}
<script src="{{ buildStaticUrl('/js/account/set.js') }}"></script>
{% endblock %}

1
www.py
View File

@@ -5,6 +5,7 @@ from application import app
统一拦截处理和统一错误处理 统一拦截处理和统一错误处理
''' '''
from web.interceptors.AuthInterceptor import * from web.interceptors.AuthInterceptor import *
from web.interceptors.ErrorInterceptor import *
''' '''
蓝图功能对所有的url进行蓝图功能配置 蓝图功能对所有的url进行蓝图功能配置