python学习

This commit is contained in:
2019-08-06 17:16:39 +08:00
parent 020f56d2d5
commit 2b7e1e1fc8
36 changed files with 3812 additions and 377 deletions

616
.idea/workspace.xml generated
View File

@@ -2,21 +2,36 @@
<project version="4">
<component name="ChangeListManager">
<list default="true" id="d564f57a-9f96-4262-9481-cacdf2b8445c" name="Default" comment="python学习">
<change afterPath="$PROJECT_DIR$/web/static/js/chart.js" afterDir="false" />
<change afterPath="$PROJECT_DIR$/web/static/js/index/index.js" afterDir="false" />
<change afterPath="$PROJECT_DIR$/web/static/js/stat/index.js" afterDir="false" />
<change afterPath="$PROJECT_DIR$/web/static/js/stat/member.js" afterDir="false" />
<change afterPath="$PROJECT_DIR$/web/static/js/stat/product.js" afterDir="false" />
<change afterPath="$PROJECT_DIR$/web/static/js/stat/share.js" afterDir="false" />
<change afterPath="$PROJECT_DIR$/mina/sitemap10.json" afterDir="false" />
<change afterPath="$PROJECT_DIR$/web/static/images/common/qrcode.jpg" afterDir="false" />
<change afterPath="$PROJECT_DIR$/web/static/plugins/scroll/jquery.mCustomScrollbar.js" afterDir="false" />
<change afterPath="$PROJECT_DIR$/web/static/plugins/scroll/jquery.mousewheel.min.js" afterDir="false" />
<change afterPath="$PROJECT_DIR$/web/static/plugins/scroll/scrollbar.min.css" afterDir="false" />
<change afterPath="$PROJECT_DIR$/web/static/plugins/ueditor/index.html" afterDir="false" />
<change afterPath="$PROJECT_DIR$/web/static/plugins/ueditor/php/Uploader.class.php" afterDir="false" />
<change afterPath="$PROJECT_DIR$/web/static/plugins/ueditor/php/action_crawler.php" afterDir="false" />
<change afterPath="$PROJECT_DIR$/web/static/plugins/ueditor/php/action_list.php" afterDir="false" />
<change afterPath="$PROJECT_DIR$/web/static/plugins/ueditor/php/action_upload.php" afterDir="false" />
<change afterPath="$PROJECT_DIR$/web/static/plugins/ueditor/php/config.json" afterDir="false" />
<change afterPath="$PROJECT_DIR$/web/static/plugins/ueditor/php/controller.php" afterDir="false" />
<change afterPath="$PROJECT_DIR$/web/static/plugins/ueditor/third-party/snapscreen/UEditorSnapscreen.exe" afterDir="false" />
<change afterPath="$PROJECT_DIR$/web/static/plugins/ueditor/third-party/xss.min.js" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/web/controllers/index.py" beforeDir="false" afterPath="$PROJECT_DIR$/web/controllers/index.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/web/controllers/stat/Stat.py" beforeDir="false" afterPath="$PROJECT_DIR$/web/controllers/stat/Stat.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$/mina" beforeDir="false" afterPath="$PROJECT_DIR$/mina" afterDir="false" />
<change beforePath="$PROJECT_DIR$/mina/app.js" beforeDir="false" afterPath="$PROJECT_DIR$/mina/app.js" afterDir="false" />
<change beforePath="$PROJECT_DIR$/mina/app.json" beforeDir="false" afterPath="$PROJECT_DIR$/mina/app.json" afterDir="false" />
<change beforePath="$PROJECT_DIR$/mina/pages/food/index.js" beforeDir="false" afterPath="$PROJECT_DIR$/mina/pages/food/index.js" afterDir="false" />
<change beforePath="$PROJECT_DIR$/mina/pages/food/index.json" beforeDir="false" afterPath="$PROJECT_DIR$/mina/pages/food/index.json" afterDir="false" />
<change beforePath="$PROJECT_DIR$/mina/pages/food/index.wxml" beforeDir="false" afterPath="$PROJECT_DIR$/mina/pages/food/index.wxml" 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/member/Member.py" beforeDir="false" afterPath="$PROJECT_DIR$/web/controllers/member/Member.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/web/static/font-awesome/fonts/fontawesome-webfont.eot" beforeDir="false" afterPath="$PROJECT_DIR$/web/static/font-awesome/fonts/fontawesome-webfont.eot" afterDir="false" />
<change beforePath="$PROJECT_DIR$/web/static/font-awesome/fonts/fontawesome-webfont.ttf" beforeDir="false" afterPath="$PROJECT_DIR$/web/static/font-awesome/fonts/fontawesome-webfont.ttf" afterDir="false" />
<change beforePath="$PROJECT_DIR$/web/static/font-awesome/fonts/fontawesome-webfont.woff" beforeDir="false" afterPath="$PROJECT_DIR$/web/static/font-awesome/fonts/fontawesome-webfont.woff" afterDir="false" />
<change beforePath="$PROJECT_DIR$/web/static/font-awesome/fonts/fontawesome-webfont.woff2" beforeDir="false" afterPath="$PROJECT_DIR$/web/static/font-awesome/fonts/fontawesome-webfont.woff2" afterDir="false" />
<change beforePath="$PROJECT_DIR$/web/static/js/common.js" beforeDir="false" afterPath="$PROJECT_DIR$/web/static/js/common.js" afterDir="false" />
<change beforePath="$PROJECT_DIR$/web/static/js/user/login.js" beforeDir="false" afterPath="$PROJECT_DIR$/web/static/js/user/login.js" afterDir="false" />
<change beforePath="$PROJECT_DIR$/web/static/js/stat/index.js" beforeDir="false" afterPath="$PROJECT_DIR$/web/static/js/stat/index.js" afterDir="false" />
<change beforePath="$PROJECT_DIR$/web/static/plugins/ueditor/dialogs/wordimage/fClipboard_ueditor.swf" beforeDir="false" afterPath="$PROJECT_DIR$/web/static/plugins/ueditor/dialogs/wordimage/fClipboard_ueditor.swf" afterDir="false" />
<change beforePath="$PROJECT_DIR$/web/static/plugins/ueditor/dialogs/wordimage/imageUploader.swf" beforeDir="false" afterPath="$PROJECT_DIR$/web/static/plugins/ueditor/dialogs/wordimage/imageUploader.swf" afterDir="false" />
<change beforePath="$PROJECT_DIR$/web/static/plugins/ueditor/third-party/video-js/font/vjs.eot" beforeDir="false" afterPath="$PROJECT_DIR$/web/static/plugins/ueditor/third-party/video-js/font/vjs.eot" afterDir="false" />
@@ -25,20 +40,6 @@
<change beforePath="$PROJECT_DIR$/web/static/plugins/ueditor/third-party/video-js/video-js.swf" beforeDir="false" afterPath="$PROJECT_DIR$/web/static/plugins/ueditor/third-party/video-js/video-js.swf" afterDir="false" />
<change beforePath="$PROJECT_DIR$/web/static/plugins/ueditor/third-party/webuploader/Uploader.swf" beforeDir="false" afterPath="$PROJECT_DIR$/web/static/plugins/ueditor/third-party/webuploader/Uploader.swf" afterDir="false" />
<change beforePath="$PROJECT_DIR$/web/static/plugins/ueditor/third-party/zeroclipboard/ZeroClipboard.swf" beforeDir="false" afterPath="$PROJECT_DIR$/web/static/plugins/ueditor/third-party/zeroclipboard/ZeroClipboard.swf" 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$/web/templates/food/index.html" beforeDir="false" afterPath="$PROJECT_DIR$/web/templates/food/index.html" afterDir="false" />
<change beforePath="$PROJECT_DIR$/web/templates/index/index.html" beforeDir="false" afterPath="$PROJECT_DIR$/web/templates/index/index.html" afterDir="false" />
<change beforePath="$PROJECT_DIR$/web/templates/member/comment.html" beforeDir="false" afterPath="$PROJECT_DIR$/web/templates/member/comment.html" afterDir="false" />
<change beforePath="$PROJECT_DIR$/web/templates/member/index.html" beforeDir="false" afterPath="$PROJECT_DIR$/web/templates/member/index.html" afterDir="false" />
<change beforePath="$PROJECT_DIR$/web/templates/member/info.html" beforeDir="false" afterPath="$PROJECT_DIR$/web/templates/member/info.html" afterDir="false" />
<change beforePath="$PROJECT_DIR$/web/templates/member/set.html" beforeDir="false" afterPath="$PROJECT_DIR$/web/templates/member/set.html" afterDir="false" />
<change beforePath="$PROJECT_DIR$/web/templates/stat/food.html" beforeDir="false" afterPath="$PROJECT_DIR$/web/templates/stat/food.html" afterDir="false" />
<change beforePath="$PROJECT_DIR$/web/templates/stat/index.html" beforeDir="false" afterPath="$PROJECT_DIR$/web/templates/stat/index.html" afterDir="false" />
<change beforePath="$PROJECT_DIR$/web/templates/stat/member.html" beforeDir="false" afterPath="$PROJECT_DIR$/web/templates/stat/member.html" afterDir="false" />
<change beforePath="$PROJECT_DIR$/web/templates/stat/share.html" beforeDir="false" afterPath="$PROJECT_DIR$/web/templates/stat/share.html" afterDir="false" />
<change beforePath="$PROJECT_DIR$/web/templates/user/edit.html" beforeDir="false" afterPath="$PROJECT_DIR$/web/templates/user/edit.html" afterDir="false" />
<change beforePath="$PROJECT_DIR$/web/templates/user/login.html" beforeDir="false" afterPath="$PROJECT_DIR$/web/templates/user/login.html" afterDir="false" />
</list>
<option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
<option name="SHOW_DIALOG" value="false" />
@@ -49,40 +50,51 @@
<component name="FileEditorManager">
<leaf SIDE_TABS_SIZE_LIMIT_KEY="300">
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/web/templates/index/index.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-1674" />
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/web/templates/stat/index.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="217">
<caret line="7" column="31" lean-forward="true" selection-start-line="7" selection-start-column="31" selection-end-line="7" selection-end-column="31" />
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/web/controllers/stat/__init__.py">
<entry file="file://$PROJECT_DIR$/config/__init__.py">
<provider selected="true" editor-type-id="text-editor" />
</entry>
</file>
<file pinned="false" current-in-tab="true">
<entry file="file://$PROJECT_DIR$/web/controllers/stat/Stat.py">
<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="248">
<caret line="20" lean-forward="true" selection-start-line="20" selection-end-line="20" />
<state relative-caret-position="93">
<caret line="45" column="35" selection-start-line="45" selection-start-column="35" selection-end-line="45" selection-end-column="35" />
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/web/controllers/chart.py">
<entry file="file://$PROJECT_DIR$/config/local_setting.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="287">
<caret line="41" column="21" selection-start-line="41" selection-start-column="21" selection-end-line="41" selection-end-column="21" />
<state relative-caret-position="31">
<caret line="1" selection-start-line="1" selection-end-line="1" />
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/web/controllers/user/User.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="279">
<caret line="21" selection-start-line="21" selection-end-line="21" />
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="true">
<entry file="file://$PROJECT_DIR$/mina/app.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="310">
<caret line="10" column="28" lean-forward="true" selection-start-line="10" selection-start-column="28" selection-end-line="10" selection-end-column="28" />
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/web/templates/user/edit.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="290">
<caret line="44" selection-start-line="44" selection-end-line="44" />
</state>
</provider>
</entry>
@@ -90,7 +102,32 @@
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/web/templates/user/login.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-186" />
<state relative-caret-position="930">
<caret line="54" selection-start-line="54" selection-end-line="54" />
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/web/templates/index/index.html">
<provider selected="true" editor-type-id="text-editor" />
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/web/static/js/user/login.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="341">
<caret line="11" column="13" selection-start-line="11" selection-start-column="13" selection-end-line="11" selection-end-column="13" />
</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="220">
<caret line="13" column="35" selection-start-line="13" selection-start-column="35" selection-end-line="13" selection-end-column="35" />
</state>
</provider>
</entry>
</file>
@@ -105,8 +142,6 @@
</component>
<component name="FindInProjectRecents">
<findStrings>
<find>render_template</find>
<find>set</find>
<find>user.uid</find>
<find>first</find>
<find>page_p</find>
@@ -135,29 +170,26 @@
<find>onSha</find>
<find>buyNo</find>
<find>getFor</find>
<find>login_name</find>
<find>user.login_name</find>
</findStrings>
<replaceStrings>
<replace>ops_render</replace>
</replaceStrings>
</component>
<component name="Git.Settings">
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$/mina" />
</component>
<component name="IdeDocumentHistory">
<option name="CHANGED_PATHS">
<list>
<option value="$PROJECT_DIR$/web/static/js/user/edit.js" />
<option value="$PROJECT_DIR$/web/templates/user/edit.html" />
<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/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$/web/templates/account/info.html" />
<option value="$PROJECT_DIR$/web/controllers/account/Account.py" />
<option value="$PROJECT_DIR$/config/local_setting.py" />
<option value="$PROJECT_DIR$/数据库文件/自动生成models.txt" />
<option value="$PROJECT_DIR$/common/models/member/Oauth_member_bind.py" />
<option value="$PROJECT_DIR$/common/libs/member/MemberService.py" />
@@ -181,7 +213,6 @@
<option value="$PROJECT_DIR$/mina/pages/food/index.js" />
<option value="$PROJECT_DIR$/mina/pages/index/index.js" />
<option value="$PROJECT_DIR$/mina/pages/index/index.wxml" />
<option value="$PROJECT_DIR$/mina/app.js" />
<option value="$PROJECT_DIR$/web/controllers/api/Member.py" />
<option value="$PROJECT_DIR$/mina/pages/food/info.js" />
<option value="$PROJECT_DIR$/mina/pages/cart/index.js" />
@@ -193,10 +224,16 @@
<option value="$PROJECT_DIR$/web/controllers/finance/Finance.py" />
<option value="$PROJECT_DIR$/www.py" />
<option value="$PROJECT_DIR$/web/controllers/api/__init__.py" />
<option value="$PROJECT_DIR$/config/base_setting.py" />
<option value="$PROJECT_DIR$/web/controllers/food/Food.py" />
<option value="$PROJECT_DIR$/web/templates/food/index.html" />
<option value="$PROJECT_DIR$/web/templates/stat/index.html" />
<option value="$PROJECT_DIR$/web/controllers/user/User.py" />
<option value="$PROJECT_DIR$/web/static/js/user/login.js" />
<option value="$PROJECT_DIR$/web/templates/user/login.html" />
<option value="$PROJECT_DIR$/web/templates/user/edit.html" />
<option value="$PROJECT_DIR$/config/base_setting.py" />
<option value="$PROJECT_DIR$/config/local_setting.py" />
<option value="$PROJECT_DIR$/mina/app.js" />
</list>
</option>
</component>
@@ -210,9 +247,9 @@
<packageJsonPaths />
</component>
<component name="ProjectFrameBounds">
<option name="x" value="108" />
<option name="y" value="59" />
<option name="width" value="909" />
<option name="x" value="2" />
<option name="y" value="51" />
<option name="width" value="1381" />
<option name="height" value="939" />
</component>
<component name="ProjectLevelVcsManager" settingsEditedManually="true" />
@@ -232,20 +269,12 @@
<path>
<item name="order" type="b2602c69:ProjectViewProjectNode" />
<item name="order" type="462c0819:PsiDirectoryNode" />
<item name="jobs" 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="jobs" type="462c0819:PsiDirectoryNode" />
<item name="tasks" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="order" type="b2602c69:ProjectViewProjectNode" />
<item name="order" type="462c0819:PsiDirectoryNode" />
<item name="jobs" type="462c0819:PsiDirectoryNode" />
<item name="tasks" type="462c0819:PsiDirectoryNode" />
<item name="stat" type="462c0819:PsiDirectoryNode" />
<item name="mina" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="order" type="b2602c69:ProjectViewProjectNode" />
@@ -262,24 +291,14 @@
<item name="order" type="b2602c69:ProjectViewProjectNode" />
<item name="order" type="462c0819:PsiDirectoryNode" />
<item name="web" type="462c0819:PsiDirectoryNode" />
<item name="templates" 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="stat" 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="数据库文件" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="order" type="b2602c69:ProjectViewProjectNode" />
<item name="External Libraries" type="cb654da1:ExternalLibrariesNode" />
</path>
</expand>
<select />
</subPane>
@@ -289,7 +308,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/controllers/stat" />
<property name="last_opened_file_path" value="$PROJECT_DIR$/web/templates/user" />
<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" />
@@ -299,18 +318,18 @@
<property name="settings.editor.selected.configurable" value="com.jetbrains.python.configuration.PyActiveSdkModuleConfigurable" />
</component>
<component name="RecentsManager">
<key name="CopyFile.RECENT_KEYS">
<recent name="D:\order\web\controllers\stat" />
<recent name="D:\order\web\static\plugins" />
<recent name="D:\order\web" />
<recent name="D:\order\web\static\js" />
<recent name="D:\order\web\templates\user" />
</key>
<key name="MoveFile.RECENT_KEYS">
<recent name="D:\order\common\libs" />
<recent name="D:\order\web" />
<recent name="D:\order\web\controllers\user" />
</key>
<key name="CopyFile.RECENT_KEYS">
<recent name="D:\order\web\templates\user" />
<recent name="D:\order\web\controllers\user" />
<recent name="D:\order" />
<recent name="D:\order\mina" />
<recent name="D:\order\mina\pages" />
</key>
</component>
<component name="RunDashboard">
<option name="ruleStates">
@@ -455,7 +474,14 @@
<option name="project" value="LOCAL" />
<updated>1565072263784</updated>
</task>
<option name="localTasksCounter" value="18" />
<task id="LOCAL-00018" summary="python学习">
<created>1565076076241</created>
<option name="number" value="00018" />
<option name="presentableId" value="LOCAL-00018" />
<option name="project" value="LOCAL" />
<updated>1565076076241</updated>
</task>
<option name="localTasksCounter" value="19" />
<servers />
</component>
<component name="TodoView">
@@ -468,9 +494,10 @@
</todo-panel>
</component>
<component name="ToolWindowManager">
<frame x="108" y="59" width="909" height="939" extended-state="0" />
<frame x="2" y="51" width="1381" height="939" extended-state="1" />
<editor active="true" />
<layout>
<window_info active="true" content_ui="combo" id="Project" order="0" visible="true" weight="0.3685419" />
<window_info active="true" content_ui="combo" id="Project" order="0" visible="true" weight="0.23976173" />
<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" />
@@ -485,9 +512,9 @@
<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.29528537" />
<window_info anchor="bottom" id="Terminal" order="9" visible="true" weight="0.34739456" />
<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" weight="0.3287841" />
<window_info anchor="bottom" id="Python Console" order="12" />
<window_info anchor="bottom" id="Console" order="13" />
<window_info anchor="bottom" id="DB Execution Console" order="14" />
@@ -509,192 +536,6 @@
<option name="LAST_COMMIT_MESSAGE" value="python学习" />
</component>
<component name="editorHistoryManager">
<entry file="file://$PROJECT_DIR$/mina/pages/order/index.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="558">
<caret line="96" selection-start-line="96" selection-end-line="96" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/common/libs/pay/PayService.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="1395">
<caret line="74" column="18" lean-forward="true" selection-start-line="74" selection-start-column="18" selection-end-line="74" selection-end-column="18" />
<folding>
<element signature="e#24#63#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/common/libs/queue/QueueService.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="303">
<caret line="12" column="29" lean-forward="true" selection-start-line="12" selection-start-column="29" selection-end-line="12" selection-end-column="29" />
<folding>
<element signature="e#24#36#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/web/controllers/api/My.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="310">
<caret line="10" column="20" lean-forward="true" selection-start-line="10" selection-start-column="20" selection-end-line="10" selection-end-column="20" />
<folding>
<element signature="e#24#65#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/web/controllers/finance/__init__.py">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/web/controllers/finance/Finance.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-1829">
<caret line="7" column="31" lean-forward="true" selection-start-line="7" selection-start-column="31" selection-end-line="7" selection-end-column="31" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/web/templates/finance/account.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="310">
<caret line="10" column="16" lean-forward="true" selection-start-line="10" selection-start-column="16" selection-end-line="10" selection-end-column="16" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/web/static/js/finance/index.js">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/数据库文件/food.sql">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="330">
<caret line="372" selection-start-line="372" selection-end-line="387" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/manager.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="93">
<caret line="3" column="10" lean-forward="true" selection-start-line="3" selection-start-column="10" selection-end-line="3" selection-end-column="10" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/common/models/member/OauthMemberBind.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="124">
<caret line="6" column="6" selection-start-line="6" selection-start-column="6" selection-end-line="6" selection-end-column="6" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/venv/Lib/site-packages/flask_sqlalchemy/model.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="112">
<caret line="89" selection-start-line="89" selection-end-line="89" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/www.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="1116">
<caret line="36" selection-start-line="36" selection-end-line="36" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/web/controllers/api/Order.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="228">
<caret line="14" lean-forward="true" selection-start-line="14" selection-end-line="14" />
<folding>
<element signature="e#24#65#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/web/controllers/api/Member.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="186">
<caret line="43" selection-start-line="43" selection-end-line="43" />
<folding>
<element signature="e#24#65#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/web/controllers/api/Cart.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="31">
<caret line="21" column="17" lean-forward="true" selection-start-line="21" selection-start-column="17" selection-end-line="21" selection-end-column="17" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/web/controllers/api/Address.py">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/web/controllers/api/__init__.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="279">
<caret line="9" selection-start-line="9" selection-end-line="9" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/common/libs/member/CartService.py">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/common/models/stat/StatDailyFood.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="279">
<caret line="11" selection-start-line="11" selection-end-line="11" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/web/interceptors/ApiAuthInterceptor.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="248">
<caret line="13" column="49" selection-start-line="13" selection-start-column="34" selection-end-line="13" selection-end-column="49" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/config/base_setting.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="189">
<caret line="10" column="1" selection-start-line="10" selection-start-column="1" selection-end-line="10" selection-end-column="1" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/web/templates/food/cat.html">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/web/controllers/food/Food.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="370">
<caret line="284" selection-start-line="284" selection-end-line="284" />
<folding>
<element signature="e#24#76#0" expanded="true" />
<element signature="e#1982#2584#0" />
<element signature="e#5497#5974#0" />
<element signature="e#6053#7221#0" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/web/templates/common/layout_main.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="186">
<caret line="6" column="23" lean-forward="true" selection-start-line="6" selection-start-column="23" selection-end-line="6" selection-end-column="23" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/web/templates/common/tab_food.html">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/web/templates/food/index.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="310">
<caret line="10" column="5" selection-start-line="10" selection-start-column="5" selection-end-line="10" selection-end-column="5" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/web/static/js/finance/pay_info.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="248">
@@ -716,13 +557,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="341">
<caret line="32" column="5" lean-forward="true" selection-start-line="32" selection-start-column="5" selection-end-line="32" selection-end-column="5" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/web/controllers/index.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="341">
@@ -748,14 +582,6 @@
<state relative-caret-position="-186" />
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/web/templates/user/edit.html">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/web/templates/user/login.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-186" />
</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="217">
@@ -770,11 +596,6 @@
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/web/templates/index/index.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-1674" />
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/web/static/js/food/cat.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="372">
@@ -808,16 +629,6 @@
<entry file="file://$PROJECT_DIR$/web/static/js/stat/product.js">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/web/templates/stat/index.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="217">
<caret line="7" column="31" lean-forward="true" selection-start-line="7" selection-start-column="31" selection-end-line="7" selection-end-column="31" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/web/controllers/stat/__init__.py">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/web/controllers/stat/Stat.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="248">
@@ -825,5 +636,184 @@
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/web/controllers/stat/__init__.py">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/web/controllers/api/My.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="31">
<caret line="10" column="20" selection-start-line="10" selection-start-column="20" selection-end-line="10" selection-end-column="20" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/web/templates/stat/index.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="217">
<caret line="7" column="31" selection-start-line="7" selection-start-column="31" selection-end-line="7" selection-end-column="31" />
</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="-1302" />
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/web/static/bootstrap/bootstrap.min.js">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/application.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="279">
<caret line="13" column="27" selection-start-line="13" selection-start-column="27" selection-end-line="13" selection-end-column="27" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/mina/pages/food/info.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-3666" />
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/mina/pages/index/index.js">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/mina/pages/food/info.wxml">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-2178">
<caret line="10" column="17" lean-forward="true" selection-start-line="10" selection-start-column="17" selection-end-line="10" selection-end-column="17" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/mina/pages/index/index.wxml">
<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/pages/food/index.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="248">
<caret line="8" column="23" selection-start-line="8" selection-start-column="23" selection-end-line="8" selection-end-column="23" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/mina/utils/city.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="93">
<caret column="403" selection-start-column="403" selection-end-column="403" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/mina/wxParse/emojis/01.gif">
<provider selected="true" editor-type-id="images" />
</entry>
<entry file="file://$PROJECT_DIR$/mina/wxParse/emojis/02.gif">
<provider selected="true" editor-type-id="images" />
</entry>
<entry file="file://$PROJECT_DIR$/mina/app.json">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="434">
<caret line="14" column="4" lean-forward="true" selection-start-line="14" selection-start-column="4" selection-end-line="14" selection-end-column="4" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/mina/sitemap.json">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/mina/app.wxss">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/mina/project.config.json">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="372">
<caret line="21" column="34" lean-forward="true" selection-start-line="21" selection-start-column="34" selection-end-line="21" selection-end-column="34" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/mina/sitemap10.json">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="186">
<caret line="6" column="1" lean-forward="true" selection-start-line="6" selection-start-column="1" selection-end-line="6" selection-end-column="1" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/config/production_setting.py">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/venv/Lib/site-packages/flask/_compat.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="1271">
<caret line="41" selection-start-line="41" selection-end-line="41" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/web/templates/index/index.html">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/web/static/js/user/login.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="341">
<caret line="11" column="13" selection-start-line="11" selection-start-column="13" selection-end-line="11" selection-end-column="13" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/common/libs/UrlManager.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="220">
<caret line="13" column="35" selection-start-line="13" selection-start-column="35" selection-end-line="13" selection-end-column="35" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/venv/Lib/site-packages/flask/app.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="5551">
<caret line="610" selection-start-line="414" selection-end-line="610" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/config/__init__.py">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/web/controllers/user/User.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="279">
<caret line="21" selection-start-line="21" selection-end-line="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="93">
<caret line="45" column="35" selection-start-line="45" selection-start-column="35" selection-end-line="45" selection-end-column="35" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/config/local_setting.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="31">
<caret line="1" selection-start-line="1" selection-end-line="1" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/web/templates/user/edit.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="290">
<caret line="44" selection-start-line="44" selection-end-line="44" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/web/templates/user/login.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="930">
<caret line="54" selection-start-line="54" selection-end-line="54" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/mina/app.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="310">
<caret line="10" column="28" lean-forward="true" selection-start-line="10" selection-start-column="28" selection-end-line="10" selection-end-column="28" />
</state>
</provider>
</entry>
</component>
</project>

View File

@@ -14,11 +14,11 @@ IGNORE_CHECK_LOGIN_URLS = [
"^/static",
"^/favicon.ico"
]
API_IGNORE_URLS = [
"^/api"
]
PAGE_SIZE = 50
PAGE_DISPLAY = 10
@@ -30,7 +30,7 @@ STATUS_MAPPING = {
MINA_APP = {
'appid':'wx2c65877d37fc29bf',
'appkey':'b670fb4798ec6abf4bab32ae3cf14a61',
'appkey':'8c61791794cde415042924a9714542a9',
'paykey':'xxxxxxxxxxxxxx换自己的',
'mch_id':'xxxxxxxxxxxx换自己的',
'callback_url':'/api/order/callback'
@@ -43,7 +43,7 @@ UPLOAD = {
}
APP = {
'domain':'http://127.0.0.1:9000'
'domain':'http://127.0.0.1:8999'
}

View File

@@ -1,5 +1,4 @@
# -*- coding: utf-8 -*-
SERVER_PORT = 9000
DEBUG = True
SQLALCHEMY_ECHO = True
SQLALCHEMY_DATABASE_URI = 'mysql://root:123456@127.0.0.1/food_db'

2
mina

Submodule mina updated: 2205b70d34...f71831a726

View File

@@ -3,74 +3,78 @@ 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 common.models.User import User
from sqlalchemy import or_
from application import app,db
route_account = Blueprint( 'account_page',__name__ )
@route_account.route( "/index" )
def index():
resp_data = {}
req = request.values
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
if 'mix_kw' in req:
rule = or_( User.nickname.ilike( "%{0}%".format( req['mix_kw'] ) ),User.mobile.ilike( "%{0}%".format( req['mix_kw'] ) ))
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']) )
query = query.filter( User.status == int( req['status'] ) )
page_params = {
'total': query.count(),
'page_size': app.config['PAGE_SIZE'],
'page_size':app.config['PAGE_SIZE'],
'page': page,
'display': app.config['PAGE_DISPLAY'],
'url': request.full_path.replace( "&p={}".format(page),"")
'display':app.config['PAGE_DISPLAY'],
'url': request.full_path.replace( "&p={}".format(page),"" )
}
pages = iPagination(page_params)
offset = (page - 1) * app.config['PAGE_SIZE']
pages = iPagination( page_params )
offset = ( page - 1 ) * app.config['PAGE_SIZE']
limit = app.config['PAGE_SIZE'] * page
list = query.order_by(User.uid.desc()).all()[offset:limit]
list = query.order_by( User.uid.desc() ).all()[ offset:limit ]
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)
return ops_render( "account/index.html",resp_data )
@route_account.route( "/info" )
def info():
resp_data = {}
req = request.args
uid = int(req.get('id', 0))
uid = int( req.get('id',0 ))
reback_url = UrlManager.buildUrl("/account/index")
if uid < 1:
return redirect(reback_url)
return redirect( reback_url )
info = User.query.filter_by(uid=uid).first()
info = User.query.filter_by( uid = uid ).first()
if not info:
return redirect(reback_url)
return redirect( reback_url )
access_list = AppAccessLog.query.filter_by(uid=uid).order_by(AppAccessLog.id.desc()).limit(10).all()
access_list = AppAccessLog.query.filter_by( uid = uid).order_by(AppAccessLog.id.desc() ).limit(10).all()
resp_data['info'] = info
resp_data['access_list'] = access_list
return ops_render( "account/info.html",resp_data )
return ops_render("account/info.html", resp_data)
@route_account.route( "/set" ,methods=["GET", "POST"])
@route_account.route( "/set",methods = [ "GET","POST" ] )
def set():
default_pwd = "******"
if request.method == "GET":
resp_data = {}
req = request.args
uid = int( req.get( "id",0))
uid = int( req.get( "id",0 ) )
info = None
if uid:
if uid :
info = User.query.filter_by( uid = uid ).first()
resp_data['info'] = info
return ops_render( "account/set.html",resp_data)
return ops_render( "account/set.html",resp_data )
resp = { 'code':200,'msg':'操作成功~~','data':{} }
req = request.values
@@ -106,13 +110,13 @@ def set():
resp['msg'] = "请输入符合规范的登录密码~~"
return jsonify( resp )
has_in = User.query.filter( User.login_name == login_name,User.uid!= id).first()
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()
user_info = User.query.filter_by( uid = id ).first()
if user_info:
model_user = user_info
else:
@@ -124,12 +128,15 @@ def set():
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 )
if user_info and user_info.uid == 1:
resp['code'] = -1
resp['msg'] = "该用户是演示账号,不准修改密码和登录用户名~~"
return jsonify(resp)
model_user.created_time = getCurrentDate()
model_user.login_pwd = UserService.genePwd( login_pwd,model_user.login_salt )
model_user.updated_time = getCurrentDate()
db.session.add( model_user )
db.session.commit()
return jsonify(resp)
@@ -162,8 +169,15 @@ def ops():
elif act == "recover":
user_info.status = 1
if user_info and user_info.uid == 1:
resp['code'] = -1
resp['msg'] = "该用户是演示账号,不准操作账号~~"
return jsonify(resp)
user_info.update_time = getCurrentDate()
db.session.add(user_info)
db.session.commit()
return jsonify(resp)

View File

@@ -1,8 +1,11 @@
# -*- coding: utf-8 -*-
from flask import Blueprint,redirect,request,jsonify
from common.libs.Helper import ops_render,iPagination,getCurrentDate
from flask import Blueprint,request,redirect,jsonify
from common.libs.Helper import ops_render,iPagination,getCurrentDate,getDictFilterField,selectFilterObj
from common.libs.UrlManager import UrlManager
from common.models.member.Member import Member
from common.models.member.MemberComments import MemberComments
from common.models.food.Food import Food
from common.models.pay.PayOrder import PayOrder
from application import app,db
route_member = Blueprint( 'member_page',__name__ )
@@ -12,55 +15,61 @@ def index():
req = request.values
page = int( req['p'] ) if ( 'p' in req and req['p'] ) else 1
query = Member.query
if 'mix_kw' in req:
query = query.filter(Member.nickname.ilike("%{0}%".format(req['mix_kw'])))
if 'status' in req and int(req['status']) > -1:
query = query.filter(Member.status == int(req['status']))
if 'mix_kw' in req:
query = query.filter( Member.nickname.ilike( "%{0}%".format( req['mix_kw'] ) ) )
if 'status' in req and int( req['status'] ) > -1 :
query = query.filter( Member.status == int( req['status'] ) )
page_params = {
'total': query.count(),
'total':query.count(),
'page_size': app.config['PAGE_SIZE'],
'page': page,
'display': app.config['PAGE_DISPLAY'],
'url': request.full_path.replace("&p={}".format(page), "")
'page':page,
'display':app.config['PAGE_DISPLAY'],
'url': request.full_path.replace("&p={}".format(page),"")
}
pages = iPagination(page_params)
offset = (page - 1) * app.config['PAGE_SIZE']
list = query.order_by(Member.id.desc()).offset(offset).limit(app.config['PAGE_SIZE']).all()
pages = iPagination( page_params )
offset = ( page - 1 ) * app.config['PAGE_SIZE']
list = query.order_by( Member.id.desc() ).offset( offset ).limit( app.config['PAGE_SIZE'] ).all()
resp_data['list'] = list
resp_data['pages'] = pages
resp_data['search_con'] = req
resp_data['status_mapping'] = app.config['STATUS_MAPPING']
resp_data['current'] = 'index'
return ops_render("member/index.html", resp_data)
return ops_render( "member/index.html",resp_data )
@route_member.route( "/info" )
def info():
resp_data = {}
req = request.args
id = int(req.get("id", 0))
reback_url = UrlManager.buildUrl("/member/index")
id = int( req.get( "id",0 ) )
reback_url = UrlManager.buildUrl( "/member/index" )
if id < 1:
return redirect(reback_url)
return redirect( reback_url )
info = Member.query.filter_by(id=id).first()
info = Member.query.filter_by( id =id ).first()
if not info:
return redirect(reback_url)
return redirect( reback_url )
pay_order_list = PayOrder.query.filter_by( member_id = id ).filter( PayOrder.status.in_( [-8,1] ) )\
.order_by( PayOrder.id.desc() ).all()
comment_list = MemberComments.query.filter_by( member_id = id ).order_by( MemberComments.id.desc() ).all()
resp_data['info'] = info
resp_data['pay_order_list'] = pay_order_list
resp_data['comment_list'] = comment_list
resp_data['current'] = 'index'
return ops_render("member/info.html", resp_data)
return ops_render( "member/info.html",resp_data )
@route_member.route( "/set",methods = [ "GET","POST" ] )
def set():
if request.method == "GET":
resp_data = {}
req = request.args
id = int(req.get("id", 0))
id = int( req.get( "id",0 ) )
reback_url = UrlManager.buildUrl("/member/index")
if id < 1:
return redirect(reback_url)
@@ -74,16 +83,16 @@ def set():
resp_data['info'] = info
resp_data['current'] = 'index'
return ops_render("member/set.html", resp_data)
return ops_render( "member/set.html",resp_data )
resp = {'code': 200, 'msg': '操作成功~~', '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 ''
if nickname is None or len(nickname) < 1:
if nickname is None or len( nickname ) < 1:
resp['code'] = -1
resp['msg'] = "请输入符合规范的姓名~~"
return jsonify(resp)
return jsonify( resp )
member_info = Member.query.filter_by(id=id).first()
if not member_info:
@@ -93,14 +102,63 @@ def set():
member_info.nickname = nickname
member_info.updated_time = getCurrentDate()
db.session.add(member_info)
db.session.add( member_info )
db.session.commit()
return jsonify(resp)
return jsonify( resp )
@route_member.route( "/comment" )
def comment():
return ops_render( "member/comment.html" )
resp_data = {}
req = request.args
page = int(req['p']) if ('p' in req and req['p']) else 1
query = MemberComments.query
page_params = {
'total': query.count(),
'page_size': app.config['PAGE_SIZE'],
'page': page,
'display': app.config['PAGE_DISPLAY'],
'url': request.full_path.replace("&p={}".format(page), "")
}
pages = iPagination(page_params)
offset = (page - 1) * app.config['PAGE_SIZE']
comment_list = query.order_by(MemberComments.id.desc()).offset( offset ).limit( app.config['PAGE_SIZE'] ).all()
data_list = []
if comment_list:
member_map = getDictFilterField( Member,Member.id,"id", selectFilterObj( comment_list ,"member_id" ) )
food_ids = []
for item in comment_list:
tmp_food_ids = (item.food_ids[1:-1]).split("_")
tmp_food_ids = {}.fromkeys( tmp_food_ids ).keys()
food_ids = food_ids + list( tmp_food_ids )
food_map = getDictFilterField( Food,Food.id,"id", food_ids )
for item in comment_list:
tmp_member_info = member_map[ item.member_id ]
tmp_foods = []
tmp_food_ids = (item.food_ids[1:-1]).split("_")
for tmp_food_id in tmp_food_ids:
tmp_food_info = food_map[ int( tmp_food_id ) ]
tmp_foods.append({
'name': tmp_food_info.name,
})
tmp_data = {
"content":item.content,
"score":item.score,
"member_info":tmp_member_info,
"foods":tmp_foods
}
data_list.append( tmp_data )
resp_data['list'] = data_list
resp_data['pages'] = pages
resp_data['current'] = 'comment'
return ops_render( "member/comment.html",resp_data )
@route_member.route("/ops",methods=["POST"])
@@ -135,4 +193,4 @@ def ops():
member_info.updated_time = getCurrentDate()
db.session.add(member_info)
db.session.commit()
return jsonify( resp )
return jsonify( resp )

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

View File

@@ -0,0 +1,46 @@
;
var stat_index_ops = {
init:function(){
this.eventBind();
this.drawChart();
this.datetimepickerComponent();
},
eventBind:function(){
$("#search_form_wrap .search").click( function(){
$("#search_form_wrap").submit();
});
},
datetimepickerComponent:function(){
var that = this;
$.datetimepicker.setLocale('zh');
params = {
scrollInput: false,
scrollMonth: false,
scrollTime: false,
dayOfWeekStart: 1,
lang: 'zh',
todayButton: true,//回到今天
defaultSelect: true,
defaultDate: new Date().Format('yyyy-MM-dd'),
format: 'Y-m-d',//格式化显示
timepicker: false
};
$('#search_form_wrap input[name=date_from]').datetimepicker(params);
$('#search_form_wrap input[name=date_to]').datetimepicker(params);
},
drawChart:function(){
charts_ops.setOption();
$.ajax({
url:common_ops.buildUrl("/chart/finance"),
dataType:'json',
success:function( res ){
charts_ops.drawLine( $('#container'),res.data )
}
});
}
};
$(document).ready( function(){
stat_index_ops.init();
});

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,8 @@
/*!
* jQuery Mousewheel 3.1.13
*
* Copyright 2015 jQuery Foundation and other contributors
* Released under the MIT license.
* http://jquery.org/license
*/
!function(a){"function"==typeof define&&define.amd?define(["jquery"],a):"object"==typeof exports?module.exports=a:a(jQuery)}(function(a){function b(b){var g=b||window.event,h=i.call(arguments,1),j=0,l=0,m=0,n=0,o=0,p=0;if(b=a.event.fix(g),b.type="mousewheel","detail"in g&&(m=-1*g.detail),"wheelDelta"in g&&(m=g.wheelDelta),"wheelDeltaY"in g&&(m=g.wheelDeltaY),"wheelDeltaX"in g&&(l=-1*g.wheelDeltaX),"axis"in g&&g.axis===g.HORIZONTAL_AXIS&&(l=-1*m,m=0),j=0===m?l:m,"deltaY"in g&&(m=-1*g.deltaY,j=m),"deltaX"in g&&(l=g.deltaX,0===m&&(j=-1*l)),0!==m||0!==l){if(1===g.deltaMode){var q=a.data(this,"mousewheel-line-height");j*=q,m*=q,l*=q}else if(2===g.deltaMode){var r=a.data(this,"mousewheel-page-height");j*=r,m*=r,l*=r}if(n=Math.max(Math.abs(m),Math.abs(l)),(!f||f>n)&&(f=n,d(g,n)&&(f/=40)),d(g,n)&&(j/=40,l/=40,m/=40),j=Math[j>=1?"floor":"ceil"](j/f),l=Math[l>=1?"floor":"ceil"](l/f),m=Math[m>=1?"floor":"ceil"](m/f),k.settings.normalizeOffset&&this.getBoundingClientRect){var s=this.getBoundingClientRect();o=b.clientX-s.left,p=b.clientY-s.top}return b.deltaX=l,b.deltaY=m,b.deltaFactor=f,b.offsetX=o,b.offsetY=p,b.deltaMode=0,h.unshift(b,j,l,m),e&&clearTimeout(e),e=setTimeout(c,200),(a.event.dispatch||a.event.handle).apply(this,h)}}function c(){f=null}function d(a,b){return k.settings.adjustOldDeltas&&"mousewheel"===a.type&&b%120===0}var e,f,g=["wheel","mousewheel","DOMMouseScroll","MozMousePixelScroll"],h="onwheel"in document||document.documentMode>=9?["wheel"]:["mousewheel","DomMouseScroll","MozMousePixelScroll"],i=Array.prototype.slice;if(a.event.fixHooks)for(var j=g.length;j;)a.event.fixHooks[g[--j]]=a.event.mouseHooks;var k=a.event.special.mousewheel={version:"3.1.12",setup:function(){if(this.addEventListener)for(var c=h.length;c;)this.addEventListener(h[--c],b,!1);else this.onmousewheel=b;a.data(this,"mousewheel-line-height",k.getLineHeight(this)),a.data(this,"mousewheel-page-height",k.getPageHeight(this))},teardown:function(){if(this.removeEventListener)for(var c=h.length;c;)this.removeEventListener(h[--c],b,!1);else this.onmousewheel=null;a.removeData(this,"mousewheel-line-height"),a.removeData(this,"mousewheel-page-height")},getLineHeight:function(b){var c=a(b),d=c["offsetParent"in a.fn?"offsetParent":"parent"]();return d.length||(d=a("body")),parseInt(d.css("fontSize"),10)||parseInt(c.css("fontSize"),10)||16},getPageHeight:function(b){return a(b).height()},settings:{adjustOldDeltas:!0,normalizeOffset:!0}};a.fn.extend({mousewheel:function(a){return a?this.bind("mousewheel",a):this.trigger("mousewheel")},unmousewheel:function(a){return this.unbind("mousewheel",a)}})});

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,175 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>完整demo</title>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
<script type="text/javascript" charset="utf-8" src="ueditor.config.js"></script>
<script type="text/javascript" charset="utf-8" src="ueditor.all.min.js"> </script>
<!--建议手动加在语言避免在ie下有时因为加载语言失败导致编辑器加载失败-->
<!--这里加载的语言文件会覆盖你在配置项目里添加的语言类型,比如你在配置项目里配置的是英文,这里加载的中文,那最后就是中文-->
<script type="text/javascript" charset="utf-8" src="lang/zh-cn/zh-cn.js"></script>
<style type="text/css">
div{
width:100%;
}
</style>
</head>
<body>
<div>
<h1>完整demo</h1>
<script id="editor" type="text/plain" style="width:1024px;height:500px;"></script>
</div>
<div id="btns">
<div>
<button onclick="getAllHtml()">获得整个html的内容</button>
<button onclick="getContent()">获得内容</button>
<button onclick="setContent()">写入内容</button>
<button onclick="setContent(true)">追加内容</button>
<button onclick="getContentTxt()">获得纯文本</button>
<button onclick="getPlainTxt()">获得带格式的纯文本</button>
<button onclick="hasContent()">判断是否有内容</button>
<button onclick="setFocus()">使编辑器获得焦点</button>
<button onmousedown="isFocus(event)">编辑器是否获得焦点</button>
<button onmousedown="setblur(event)" >编辑器失去焦点</button>
</div>
<div>
<button onclick="getText()">获得当前选中的文本</button>
<button onclick="insertHtml()">插入给定的内容</button>
<button id="enable" onclick="setEnabled()">可以编辑</button>
<button onclick="setDisabled()">不可编辑</button>
<button onclick=" UE.getEditor('editor').setHide()">隐藏编辑器</button>
<button onclick=" UE.getEditor('editor').setShow()">显示编辑器</button>
<button onclick=" UE.getEditor('editor').setHeight(300)">设置高度为300默认关闭了自动长高</button>
</div>
<div>
<button onclick="getLocalData()" >获取草稿箱内容</button>
<button onclick="clearLocalData()" >清空草稿箱</button>
</div>
</div>
<div>
<button onclick="createEditor()">
创建编辑器</button>
<button onclick="deleteEditor()">
删除编辑器</button>
</div>
<script type="text/javascript">
//实例化编辑器
//建议使用工厂方法getEditor创建和引用编辑器实例如果在某个闭包下引用该编辑器直接调用UE.getEditor('editor')就能拿到相关的实例
var ue = UE.getEditor('editor');
function isFocus(e){
alert(UE.getEditor('editor').isFocus());
UE.dom.domUtils.preventDefault(e)
}
function setblur(e){
UE.getEditor('editor').blur();
UE.dom.domUtils.preventDefault(e)
}
function insertHtml() {
var value = prompt('插入html代码', '');
UE.getEditor('editor').execCommand('insertHtml', value)
}
function createEditor() {
enableBtn();
UE.getEditor('editor');
}
function getAllHtml() {
alert(UE.getEditor('editor').getAllHtml())
}
function getContent() {
var arr = [];
arr.push("使用editor.getContent()方法可以获得编辑器的内容");
arr.push("内容为:");
arr.push(UE.getEditor('editor').getContent());
alert(arr.join("\n"));
}
function getPlainTxt() {
var arr = [];
arr.push("使用editor.getPlainTxt()方法可以获得编辑器的带格式的纯文本内容");
arr.push("内容为:");
arr.push(UE.getEditor('editor').getPlainTxt());
alert(arr.join('\n'))
}
function setContent(isAppendTo) {
var arr = [];
arr.push("使用editor.setContent('欢迎使用ueditor')方法可以设置编辑器的内容");
UE.getEditor('editor').setContent('欢迎使用ueditor', isAppendTo);
alert(arr.join("\n"));
}
function setDisabled() {
UE.getEditor('editor').setDisabled('fullscreen');
disableBtn("enable");
}
function setEnabled() {
UE.getEditor('editor').setEnabled();
enableBtn();
}
function getText() {
//当你点击按钮时编辑区域已经失去了焦点如果直接用getText将不会得到内容所以要在选回来然后取得内容
var range = UE.getEditor('editor').selection.getRange();
range.select();
var txt = UE.getEditor('editor').selection.getText();
alert(txt)
}
function getContentTxt() {
var arr = [];
arr.push("使用editor.getContentTxt()方法可以获得编辑器的纯文本内容");
arr.push("编辑器的纯文本内容为:");
arr.push(UE.getEditor('editor').getContentTxt());
alert(arr.join("\n"));
}
function hasContent() {
var arr = [];
arr.push("使用editor.hasContents()方法判断编辑器里是否有内容");
arr.push("判断结果为:");
arr.push(UE.getEditor('editor').hasContents());
alert(arr.join("\n"));
}
function setFocus() {
UE.getEditor('editor').focus();
}
function deleteEditor() {
disableBtn();
UE.getEditor('editor').destroy();
}
function disableBtn(str) {
var div = document.getElementById('btns');
var btns = UE.dom.domUtils.getElementsByTagName(div, "button");
for (var i = 0, btn; btn = btns[i++];) {
if (btn.id == str) {
UE.dom.domUtils.removeAttributes(btn, ["disabled"]);
} else {
btn.setAttribute("disabled", "true");
}
}
}
function enableBtn() {
var div = document.getElementById('btns');
var btns = UE.dom.domUtils.getElementsByTagName(div, "button");
for (var i = 0, btn; btn = btns[i++];) {
UE.dom.domUtils.removeAttributes(btn, ["disabled"]);
}
}
function getLocalData () {
alert(UE.getEditor('editor').execCommand( "getlocaldata" ));
}
function clearLocalData () {
UE.getEditor('editor').execCommand( "clearlocaldata" );
alert("已清空草稿箱")
}
</script>
</body>
</html>

View File

@@ -0,0 +1,372 @@
<?php
/**
* Created by JetBrains PhpStorm.
* User: taoqili
* Date: 12-7-18
* Time: 上午11: 32
* UEditor编辑器通用上传类
*/
class Uploader
{
private $fileField; //文件域名
private $file; //文件上传对象
private $base64; //文件上传对象
private $config; //配置信息
private $oriName; //原始文件名
private $fileName; //新文件名
private $fullName; //完整文件名,即从当前配置目录开始的URL
private $filePath; //完整文件名,即从当前配置目录开始的URL
private $fileSize; //文件大小
private $fileType; //文件类型
private $stateInfo; //上传状态信息,
private $stateMap = array( //上传状态映射表,国际化用户需考虑此处数据的国际化
"SUCCESS", //上传成功标记在UEditor中内不可改变否则flash判断会出错
"文件大小超出 upload_max_filesize 限制",
"文件大小超出 MAX_FILE_SIZE 限制",
"文件未被完整上传",
"没有文件被上传",
"上传文件为空",
"ERROR_TMP_FILE" => "临时文件错误",
"ERROR_TMP_FILE_NOT_FOUND" => "找不到临时文件",
"ERROR_SIZE_EXCEED" => "文件大小超出网站限制",
"ERROR_TYPE_NOT_ALLOWED" => "文件类型不允许",
"ERROR_CREATE_DIR" => "目录创建失败",
"ERROR_DIR_NOT_WRITEABLE" => "目录没有写权限",
"ERROR_FILE_MOVE" => "文件保存时出错",
"ERROR_FILE_NOT_FOUND" => "找不到上传文件",
"ERROR_WRITE_CONTENT" => "写入文件内容错误",
"ERROR_UNKNOWN" => "未知错误",
"ERROR_DEAD_LINK" => "链接不可用",
"ERROR_HTTP_LINK" => "链接不是http链接",
"ERROR_HTTP_CONTENTTYPE" => "链接contentType不正确",
"INVALID_URL" => "非法 URL",
"INVALID_IP" => "非法 IP"
);
/**
* 构造函数
* @param string $fileField 表单名称
* @param array $config 配置项
* @param bool $base64 是否解析base64编码可省略。若开启则$fileField代表的是base64编码的字符串表单名
*/
public function __construct($fileField, $config, $type = "upload")
{
$this->fileField = $fileField;
$this->config = $config;
$this->type = $type;
if ($type == "remote") {
$this->saveRemote();
} else if($type == "base64") {
$this->upBase64();
} else {
$this->upFile();
}
$this->stateMap['ERROR_TYPE_NOT_ALLOWED'] = iconv('unicode', 'utf-8', $this->stateMap['ERROR_TYPE_NOT_ALLOWED']);
}
/**
* 上传文件的主处理方法
* @return mixed
*/
private function upFile()
{
$file = $this->file = $_FILES[$this->fileField];
if (!$file) {
$this->stateInfo = $this->getStateInfo("ERROR_FILE_NOT_FOUND");
return;
}
if ($this->file['error']) {
$this->stateInfo = $this->getStateInfo($file['error']);
return;
} else if (!file_exists($file['tmp_name'])) {
$this->stateInfo = $this->getStateInfo("ERROR_TMP_FILE_NOT_FOUND");
return;
} else if (!is_uploaded_file($file['tmp_name'])) {
$this->stateInfo = $this->getStateInfo("ERROR_TMPFILE");
return;
}
$this->oriName = $file['name'];
$this->fileSize = $file['size'];
$this->fileType = $this->getFileExt();
$this->fullName = $this->getFullName();
$this->filePath = $this->getFilePath();
$this->fileName = $this->getFileName();
$dirname = dirname($this->filePath);
//检查文件大小是否超出限制
if (!$this->checkSize()) {
$this->stateInfo = $this->getStateInfo("ERROR_SIZE_EXCEED");
return;
}
//检查是否不允许的文件格式
if (!$this->checkType()) {
$this->stateInfo = $this->getStateInfo("ERROR_TYPE_NOT_ALLOWED");
return;
}
//创建目录失败
if (!file_exists($dirname) && !mkdir($dirname, 0777, true)) {
$this->stateInfo = $this->getStateInfo("ERROR_CREATE_DIR");
return;
} else if (!is_writeable($dirname)) {
$this->stateInfo = $this->getStateInfo("ERROR_DIR_NOT_WRITEABLE");
return;
}
//移动文件
if (!(move_uploaded_file($file["tmp_name"], $this->filePath) && file_exists($this->filePath))) { //移动失败
$this->stateInfo = $this->getStateInfo("ERROR_FILE_MOVE");
} else { //移动成功
$this->stateInfo = $this->stateMap[0];
}
}
/**
* 处理base64编码的图片上传
* @return mixed
*/
private function upBase64()
{
$base64Data = $_POST[$this->fileField];
$img = base64_decode($base64Data);
$this->oriName = $this->config['oriName'];
$this->fileSize = strlen($img);
$this->fileType = $this->getFileExt();
$this->fullName = $this->getFullName();
$this->filePath = $this->getFilePath();
$this->fileName = $this->getFileName();
$dirname = dirname($this->filePath);
//检查文件大小是否超出限制
if (!$this->checkSize()) {
$this->stateInfo = $this->getStateInfo("ERROR_SIZE_EXCEED");
return;
}
//创建目录失败
if (!file_exists($dirname) && !mkdir($dirname, 0777, true)) {
$this->stateInfo = $this->getStateInfo("ERROR_CREATE_DIR");
return;
} else if (!is_writeable($dirname)) {
$this->stateInfo = $this->getStateInfo("ERROR_DIR_NOT_WRITEABLE");
return;
}
//移动文件
if (!(file_put_contents($this->filePath, $img) && file_exists($this->filePath))) { //移动失败
$this->stateInfo = $this->getStateInfo("ERROR_WRITE_CONTENT");
} else { //移动成功
$this->stateInfo = $this->stateMap[0];
}
}
/**
* 拉取远程图片
* @return mixed
*/
private function saveRemote()
{
$imgUrl = htmlspecialchars($this->fileField);
$imgUrl = str_replace("&amp;", "&", $imgUrl);
//http开头验证
if (strpos($imgUrl, "http") !== 0) {
$this->stateInfo = $this->getStateInfo("ERROR_HTTP_LINK");
return;
}
preg_match('/(^https*:\/\/[^:\/]+)/', $imgUrl, $matches);
$host_with_protocol = count($matches) > 1 ? $matches[1] : '';
// 判断是否是合法 url
if (!filter_var($host_with_protocol, FILTER_VALIDATE_URL)) {
$this->stateInfo = $this->getStateInfo("INVALID_URL");
return;
}
preg_match('/^https*:\/\/(.+)/', $host_with_protocol, $matches);
$host_without_protocol = count($matches) > 1 ? $matches[1] : '';
// 此时提取出来的可能是 ip 也有可能是域名,先获取 ip
$ip = gethostbyname($host_without_protocol);
// 判断是否是私有 ip
if(!filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE)) {
$this->stateInfo = $this->getStateInfo("INVALID_IP");
return;
}
//获取请求头并检测死链
$heads = get_headers($imgUrl, 1);
if (!(stristr($heads[0], "200") && stristr($heads[0], "OK"))) {
$this->stateInfo = $this->getStateInfo("ERROR_DEAD_LINK");
return;
}
//格式验证(扩展名验证和Content-Type验证)
$fileType = strtolower(strrchr($imgUrl, '.'));
if (!in_array($fileType, $this->config['allowFiles']) || !isset($heads['Content-Type']) || !stristr($heads['Content-Type'], "image")) {
$this->stateInfo = $this->getStateInfo("ERROR_HTTP_CONTENTTYPE");
return;
}
//打开输出缓冲区并获取远程图片
ob_start();
$context = stream_context_create(
array('http' => array(
'follow_location' => false // don't follow redirects
))
);
readfile($imgUrl, false, $context);
$img = ob_get_contents();
ob_end_clean();
preg_match("/[\/]([^\/]*)[\.]?[^\.\/]*$/", $imgUrl, $m);
$this->oriName = $m ? $m[1]:"";
$this->fileSize = strlen($img);
$this->fileType = $this->getFileExt();
$this->fullName = $this->getFullName();
$this->filePath = $this->getFilePath();
$this->fileName = $this->getFileName();
$dirname = dirname($this->filePath);
//检查文件大小是否超出限制
if (!$this->checkSize()) {
$this->stateInfo = $this->getStateInfo("ERROR_SIZE_EXCEED");
return;
}
//创建目录失败
if (!file_exists($dirname) && !mkdir($dirname, 0777, true)) {
$this->stateInfo = $this->getStateInfo("ERROR_CREATE_DIR");
return;
} else if (!is_writeable($dirname)) {
$this->stateInfo = $this->getStateInfo("ERROR_DIR_NOT_WRITEABLE");
return;
}
//移动文件
if (!(file_put_contents($this->filePath, $img) && file_exists($this->filePath))) { //移动失败
$this->stateInfo = $this->getStateInfo("ERROR_WRITE_CONTENT");
} else { //移动成功
$this->stateInfo = $this->stateMap[0];
}
}
/**
* 上传错误检查
* @param $errCode
* @return string
*/
private function getStateInfo($errCode)
{
return !$this->stateMap[$errCode] ? $this->stateMap["ERROR_UNKNOWN"] : $this->stateMap[$errCode];
}
/**
* 获取文件扩展名
* @return string
*/
private function getFileExt()
{
return strtolower(strrchr($this->oriName, '.'));
}
/**
* 重命名文件
* @return string
*/
private function getFullName()
{
//替换日期事件
$t = time();
$d = explode('-', date("Y-y-m-d-H-i-s"));
$format = $this->config["pathFormat"];
$format = str_replace("{yyyy}", $d[0], $format);
$format = str_replace("{yy}", $d[1], $format);
$format = str_replace("{mm}", $d[2], $format);
$format = str_replace("{dd}", $d[3], $format);
$format = str_replace("{hh}", $d[4], $format);
$format = str_replace("{ii}", $d[5], $format);
$format = str_replace("{ss}", $d[6], $format);
$format = str_replace("{time}", $t, $format);
//过滤文件名的非法自负,并替换文件名
$oriName = substr($this->oriName, 0, strrpos($this->oriName, '.'));
$oriName = preg_replace("/[\|\?\"\<\>\/\*\\\\]+/", '', $oriName);
$format = str_replace("{filename}", $oriName, $format);
//替换随机字符串
$randNum = rand(1, 10000000000) . rand(1, 10000000000);
if (preg_match("/\{rand\:([\d]*)\}/i", $format, $matches)) {
$format = preg_replace("/\{rand\:[\d]*\}/i", substr($randNum, 0, $matches[1]), $format);
}
$ext = $this->getFileExt();
return $format . $ext;
}
/**
* 获取文件名
* @return string
*/
private function getFileName () {
return substr($this->filePath, strrpos($this->filePath, '/') + 1);
}
/**
* 获取文件完整路径
* @return string
*/
private function getFilePath()
{
$fullname = $this->fullName;
$rootPath = $_SERVER['DOCUMENT_ROOT'];
if (substr($fullname, 0, 1) != '/') {
$fullname = '/' . $fullname;
}
return $rootPath . $fullname;
}
/**
* 文件类型检测
* @return bool
*/
private function checkType()
{
return in_array($this->getFileExt(), $this->config["allowFiles"]);
}
/**
* 文件大小检测
* @return bool
*/
private function checkSize()
{
return $this->fileSize <= ($this->config["maxSize"]);
}
/**
* 获取当前上传成功文件的各项信息
* @return array
*/
public function getFileInfo()
{
return array(
"state" => $this->stateInfo,
"url" => $this->fullName,
"title" => $this->fileName,
"original" => $this->oriName,
"type" => $this->fileType,
"size" => $this->fileSize
);
}
}

View File

@@ -0,0 +1,44 @@
<?php
/**
* 抓取远程图片
* User: Jinqn
* Date: 14-04-14
* Time: 下午19:18
*/
set_time_limit(0);
include("Uploader.class.php");
/* 上传配置 */
$config = array(
"pathFormat" => $CONFIG['catcherPathFormat'],
"maxSize" => $CONFIG['catcherMaxSize'],
"allowFiles" => $CONFIG['catcherAllowFiles'],
"oriName" => "remote.png"
);
$fieldName = $CONFIG['catcherFieldName'];
/* 抓取远程图片 */
$list = array();
if (isset($_POST[$fieldName])) {
$source = $_POST[$fieldName];
} else {
$source = $_GET[$fieldName];
}
foreach ($source as $imgUrl) {
$item = new Uploader($imgUrl, $config, "remote");
$info = $item->getFileInfo();
array_push($list, array(
"state" => $info["state"],
"url" => $info["url"],
"size" => $info["size"],
"title" => htmlspecialchars($info["title"]),
"original" => htmlspecialchars($info["original"]),
"source" => htmlspecialchars($imgUrl)
));
}
/* 返回抓取数据 */
return json_encode(array(
'state'=> count($list) ? 'SUCCESS':'ERROR',
'list'=> $list
));

View File

@@ -0,0 +1,92 @@
<?php
/**
* 获取已上传的文件列表
* User: Jinqn
* Date: 14-04-09
* Time: 上午10:17
*/
include "Uploader.class.php";
/* 判断类型 */
switch ($_GET['action']) {
/* 列出文件 */
case 'listfile':
$allowFiles = $CONFIG['fileManagerAllowFiles'];
$listSize = $CONFIG['fileManagerListSize'];
$path = $CONFIG['fileManagerListPath'];
break;
/* 列出图片 */
case 'listimage':
default:
$allowFiles = $CONFIG['imageManagerAllowFiles'];
$listSize = $CONFIG['imageManagerListSize'];
$path = $CONFIG['imageManagerListPath'];
}
$allowFiles = substr(str_replace(".", "|", join("", $allowFiles)), 1);
/* 获取参数 */
$size = isset($_GET['size']) ? htmlspecialchars($_GET['size']) : $listSize;
$start = isset($_GET['start']) ? htmlspecialchars($_GET['start']) : 0;
$end = $start + $size;
/* 获取文件列表 */
$path = $_SERVER['DOCUMENT_ROOT'] . (substr($path, 0, 1) == "/" ? "":"/") . $path;
$files = getfiles($path, $allowFiles);
if (!count($files)) {
return json_encode(array(
"state" => "no match file",
"list" => array(),
"start" => $start,
"total" => count($files)
));
}
/* 获取指定范围的列表 */
$len = count($files);
for ($i = min($end, $len) - 1, $list = array(); $i < $len && $i >= 0 && $i >= $start; $i--){
$list[] = $files[$i];
}
//倒序
//for ($i = $end, $list = array(); $i < $len && $i < $end; $i++){
// $list[] = $files[$i];
//}
/* 返回数据 */
$result = json_encode(array(
"state" => "SUCCESS",
"list" => $list,
"start" => $start,
"total" => count($files)
));
return $result;
/**
* 遍历获取目录下的指定类型的文件
* @param $path
* @param array $files
* @return array
*/
function getfiles($path, $allowFiles, &$files = array())
{
if (!is_dir($path)) return null;
if(substr($path, strlen($path) - 1) != '/') $path .= '/';
$handle = opendir($path);
while (false !== ($file = readdir($handle))) {
if ($file != '.' && $file != '..') {
$path2 = $path . $file;
if (is_dir($path2)) {
getfiles($path2, $allowFiles, $files);
} else {
if (preg_match("/\.(".$allowFiles.")$/i", $file)) {
$files[] = array(
'url'=> substr($path2, strlen($_SERVER['DOCUMENT_ROOT'])),
'mtime'=> filemtime($path2)
);
}
}
}
}
return $files;
}

View File

@@ -0,0 +1,66 @@
<?php
/**
* 上传附件和上传视频
* User: Jinqn
* Date: 14-04-09
* Time: 上午10:17
*/
include "Uploader.class.php";
/* 上传配置 */
$base64 = "upload";
switch (htmlspecialchars($_GET['action'])) {
case 'uploadimage':
$config = array(
"pathFormat" => $CONFIG['imagePathFormat'],
"maxSize" => $CONFIG['imageMaxSize'],
"allowFiles" => $CONFIG['imageAllowFiles']
);
$fieldName = $CONFIG['imageFieldName'];
break;
case 'uploadscrawl':
$config = array(
"pathFormat" => $CONFIG['scrawlPathFormat'],
"maxSize" => $CONFIG['scrawlMaxSize'],
"allowFiles" => $CONFIG['scrawlAllowFiles'],
"oriName" => "scrawl.png"
);
$fieldName = $CONFIG['scrawlFieldName'];
$base64 = "base64";
break;
case 'uploadvideo':
$config = array(
"pathFormat" => $CONFIG['videoPathFormat'],
"maxSize" => $CONFIG['videoMaxSize'],
"allowFiles" => $CONFIG['videoAllowFiles']
);
$fieldName = $CONFIG['videoFieldName'];
break;
case 'uploadfile':
default:
$config = array(
"pathFormat" => $CONFIG['filePathFormat'],
"maxSize" => $CONFIG['fileMaxSize'],
"allowFiles" => $CONFIG['fileAllowFiles']
);
$fieldName = $CONFIG['fileFieldName'];
break;
}
/* 生成上传实例对象并完成上传 */
$up = new Uploader($fieldName, $config, $base64);
/**
* 得到上传文件所对应的各个参数,数组结构
* array(
* "state" => "", //上传状态,上传成功时必须返回"SUCCESS"
* "url" => "", //返回的地址
* "title" => "", //新文件名
* "original" => "", //原始文件名
* "type" => "" //文件类型
* "size" => "", //文件大小
* )
*/
/* 返回数据 */
return json_encode($up->getFileInfo());

View File

@@ -0,0 +1,94 @@
/* ,使 */
{
/* */
"imageActionName": "uploadimage", /* action */
"imageFieldName": "upfile", /* */
"imageMaxSize": 2048000, /* B */
"imageAllowFiles": [".png", ".jpg", ".jpeg", ".gif", ".bmp"], /* */
"imageCompressEnable": true, /* ,true */
"imageCompressBorder": 1600, /* */
"imageInsertAlign": "none", /* */
"imageUrlPrefix": "", /* 访 */
"imagePathFormat": "/ueditor/php/upload/image/{yyyy}{mm}{dd}/{time}{rand:6}", /* , */
/* {filename} , */
/* {rand:6} , */
/* {time} */
/* {yyyy} */
/* {yy} */
/* {mm} */
/* {dd} */
/* {hh} */
/* {ii} */
/* {ss} */
/* \ : * ? " < > | */
/* 具请体看线上文档: fex.baidu.com/ueditor/#use-format_upload_filename */
/* 涂鸦图片上传配置项 */
"scrawlActionName": "uploadscrawl", /* 执行上传涂鸦的action名称 */
"scrawlFieldName": "upfile", /* 提交的图片表单名称 */
"scrawlPathFormat": "/ueditor/php/upload/image/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */
"scrawlMaxSize": 2048000, /* 上传大小限制单位B */
"scrawlUrlPrefix": "", /* 图片访问路径前缀 */
"scrawlInsertAlign": "none",
/* 截图工具上传 */
"snapscreenActionName": "uploadimage", /* 执行上传截图的action名称 */
"snapscreenPathFormat": "/ueditor/php/upload/image/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */
"snapscreenUrlPrefix": "", /* 图片访问路径前缀 */
"snapscreenInsertAlign": "none", /* 插入的图片浮动方式 */
/* 抓取远程图片配置 */
"catcherLocalDomain": ["127.0.0.1", "localhost", "img.baidu.com"],
"catcherActionName": "catchimage", /* 执行抓取远程图片的action名称 */
"catcherFieldName": "source", /* 提交的图片列表表单名称 */
"catcherPathFormat": "/ueditor/php/upload/image/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */
"catcherUrlPrefix": "", /* 图片访问路径前缀 */
"catcherMaxSize": 2048000, /* 上传大小限制单位B */
"catcherAllowFiles": [".png", ".jpg", ".jpeg", ".gif", ".bmp"], /* 抓取图片格式显示 */
/* 上传视频配置 */
"videoActionName": "uploadvideo", /* 执行上传视频的action名称 */
"videoFieldName": "upfile", /* 提交的视频表单名称 */
"videoPathFormat": "/ueditor/php/upload/video/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */
"videoUrlPrefix": "", /* 视频访问路径前缀 */
"videoMaxSize": 102400000, /* 上传大小限制单位B默认100MB */
"videoAllowFiles": [
".flv", ".swf", ".mkv", ".avi", ".rm", ".rmvb", ".mpeg", ".mpg",
".ogg", ".ogv", ".mov", ".wmv", ".mp4", ".webm", ".mp3", ".wav", ".mid"], /* 上传视频格式显示 */
/* 上传文件配置 */
"fileActionName": "uploadfile", /* controller里,执行上传视频的action名称 */
"fileFieldName": "upfile", /* 提交的文件表单名称 */
"filePathFormat": "/ueditor/php/upload/file/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */
"fileUrlPrefix": "", /* 文件访问路径前缀 */
"fileMaxSize": 51200000, /* 上传大小限制单位B默认50MB */
"fileAllowFiles": [
".png", ".jpg", ".jpeg", ".gif", ".bmp",
".flv", ".swf", ".mkv", ".avi", ".rm", ".rmvb", ".mpeg", ".mpg",
".ogg", ".ogv", ".mov", ".wmv", ".mp4", ".webm", ".mp3", ".wav", ".mid",
".rar", ".zip", ".tar", ".gz", ".7z", ".bz2", ".cab", ".iso",
".doc", ".docx", ".xls", ".xlsx", ".ppt", ".pptx", ".pdf", ".txt", ".md", ".xml"
], /* 上传文件格式显示 */
/* 列出指定目录下的图片 */
"imageManagerActionName": "listimage", /* 执行图片管理的action名称 */
"imageManagerListPath": "/ueditor/php/upload/image/", /* 指定要列出图片的目录 */
"imageManagerListSize": 20, /* 每次列出文件数量 */
"imageManagerUrlPrefix": "", /* 图片访问路径前缀 */
"imageManagerInsertAlign": "none", /* 插入的图片浮动方式 */
"imageManagerAllowFiles": [".png", ".jpg", ".jpeg", ".gif", ".bmp"], /* 列出的文件类型 */
/* 列出指定目录下的文件 */
"fileManagerActionName": "listfile", /* 执行文件管理的action名称 */
"fileManagerListPath": "/ueditor/php/upload/file/", /* 指定要列出文件的目录 */
"fileManagerUrlPrefix": "", /* 文件访问路径前缀 */
"fileManagerListSize": 20, /* 每次列出文件数量 */
"fileManagerAllowFiles": [
".png", ".jpg", ".jpeg", ".gif", ".bmp",
".flv", ".swf", ".mkv", ".avi", ".rm", ".rmvb", ".mpeg", ".mpg",
".ogg", ".ogv", ".mov", ".wmv", ".mp4", ".webm", ".mp3", ".wav", ".mid",
".rar", ".zip", ".tar", ".gz", ".7z", ".bz2", ".cab", ".iso",
".doc", ".docx", ".xls", ".xlsx", ".ppt", ".pptx", ".pdf", ".txt", ".md", ".xml"
] /* */
}

View File

@@ -0,0 +1,59 @@
<?php
//header('Access-Control-Allow-Origin: http://www.baidu.com'); //设置http://www.baidu.com允许跨域访问
//header('Access-Control-Allow-Headers: X-Requested-With,X_Requested_With'); //设置允许的跨域header
date_default_timezone_set("Asia/chongqing");
error_reporting(E_ERROR);
header("Content-Type: text/html; charset=utf-8");
$CONFIG = json_decode(preg_replace("/\/\*[\s\S]+?\*\//", "", file_get_contents("config.json")), true);
$action = $_GET['action'];
switch ($action) {
case 'config':
$result = json_encode($CONFIG);
break;
/* 上传图片 */
case 'uploadimage':
/* 上传涂鸦 */
case 'uploadscrawl':
/* 上传视频 */
case 'uploadvideo':
/* 上传文件 */
case 'uploadfile':
$result = include("action_upload.php");
break;
/* 列出图片 */
case 'listimage':
$result = include("action_list.php");
break;
/* 列出文件 */
case 'listfile':
$result = include("action_list.php");
break;
/* 抓取远程文件 */
case 'catchimage':
$result = include("action_crawler.php");
break;
default:
$result = json_encode(array(
'state'=> '请求地址出错'
));
break;
}
/* 输出结果 */
if (isset($_GET["callback"])) {
if (preg_match("/^[\w_]+$/", $_GET["callback"])) {
echo htmlspecialchars($_GET["callback"]) . '(' . $result . ')';
} else {
echo json_encode(array(
'state'=> 'callback参数不合法'
));
}
} else {
echo $result;
}

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB