python学习

This commit is contained in:
2019-08-02 18:24:04 +08:00
parent f1a754820c
commit 6569d29d7e
29 changed files with 736 additions and 378 deletions

589
.idea/workspace.xml generated
View File

@@ -2,20 +2,22 @@
<project version="4">
<component name="ChangeListManager">
<list default="true" id="d564f57a-9f96-4262-9481-cacdf2b8445c" name="Default" comment="python学习">
<change afterPath="$PROJECT_DIR$/common/models/food/Food.py" afterDir="false" />
<change afterPath="$PROJECT_DIR$/common/models/food/FoodCat.py" afterDir="false" />
<change afterPath="$PROJECT_DIR$/common/models/food/FoodSaleChangeLog.py" afterDir="false" />
<change afterPath="$PROJECT_DIR$/common/models/food/FoodStockChangeLog.py" afterDir="false" />
<change afterPath="$PROJECT_DIR$/web/static/js/food/cat.js" afterDir="false" />
<change afterPath="$PROJECT_DIR$/web/static/js/food/cat_set.js" afterDir="false" />
<change afterPath="$PROJECT_DIR$/web/static/js/food/index.js" afterDir="false" />
<change afterPath="$PROJECT_DIR$/web/static/js/food/set.js" afterDir="false" />
<change afterPath="$PROJECT_DIR$/web/templates/common/tab_food.html" afterDir="false" />
<change afterPath="$PROJECT_DIR$/common/libs/UploadService.py" afterDir="false" />
<change afterPath="$PROJECT_DIR$/common/libs/food/FoodService.py" afterDir="false" />
<change afterPath="$PROJECT_DIR$/common/models/Image.py" afterDir="false" />
<change afterPath="$PROJECT_DIR$/web/controllers/upload/Upload.py" afterDir="false" />
<change afterPath="$PROJECT_DIR$/web/static/upload/readme.md" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/application.py" beforeDir="false" afterPath="$PROJECT_DIR$/application.py" 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$/config/base_setting.py" beforeDir="false" afterPath="$PROJECT_DIR$/config/base_setting.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/web/controllers/food/Food.py" beforeDir="false" afterPath="$PROJECT_DIR$/web/controllers/food/Food.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/web/templates/food/cat.html" beforeDir="false" afterPath="$PROJECT_DIR$/web/templates/food/cat.html" afterDir="false" />
<change beforePath="$PROJECT_DIR$/web/templates/food/cat_set.html" beforeDir="false" afterPath="$PROJECT_DIR$/web/templates/food/cat_set.html" 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/templates/common/layout_main.html" beforeDir="false" afterPath="$PROJECT_DIR$/web/templates/common/layout_main.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/food/set.html" beforeDir="false" afterPath="$PROJECT_DIR$/web/templates/food/set.html" afterDir="false" />
<change beforePath="$PROJECT_DIR$/www.py" beforeDir="false" afterPath="$PROJECT_DIR$/www.py" afterDir="false" />
</list>
<option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
<option name="SHOW_DIALOG" value="false" />
@@ -26,93 +28,98 @@
<component name="FileEditorManager">
<leaf SIDE_TABS_SIZE_LIMIT_KEY="300">
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/web/static/js/member/index.js">
<entry file="file://$PROJECT_DIR$/web/templates/food/set.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="403">
<caret line="22" column="17" lean-forward="true" selection-start-line="22" selection-start-column="17" selection-end-line="22" selection-end-column="17" />
<state relative-caret-position="203">
<caret line="41" column="30" lean-forward="true" selection-start-line="41" selection-start-column="30" selection-end-line="41" selection-end-column="30" />
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/common/libs/Helper.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="112">
<caret line="110" column="22" selection-start-line="110" selection-start-column="22" selection-end-line="110" selection-end-column="22" />
<folding>
<element signature="e#24#59#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/web/templates/food/info.html">
<provider selected="true" editor-type-id="text-editor" />
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/web/templates/food/index.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="372">
<caret line="12" column="11" lean-forward="true" selection-start-line="12" selection-start-column="11" selection-end-line="12" selection-end-column="11" />
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/web/static/js/food/set.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-2082">
<caret line="53" column="13" lean-forward="true" selection-start-line="53" selection-start-column="13" selection-end-line="53" selection-end-column="13" />
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="true">
<entry file="file://$PROJECT_DIR$/web/static/js/common.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="320">
<caret line="156" column="6" lean-forward="true" selection-start-line="156" selection-start-column="6" selection-end-line="156" selection-end-column="6" />
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/web/controllers/food/Food.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="718">
<caret line="98" column="25" lean-forward="true" selection-start-line="98" selection-start-column="25" selection-end-line="98" selection-end-column="25" />
<folding>
<element signature="e#24#67#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/web/static/js/food/cat.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="341">
<caret line="11" lean-forward="true" selection-start-line="11" selection-end-line="11" />
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/web/templates/food/cat.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-1962">
<caret line="1" column="19" lean-forward="true" selection-start-line="1" selection-start-column="19" selection-end-line="1" selection-end-column="19" />
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/web/templates/common/tab_food.html">
<provider selected="true" editor-type-id="text-editor" />
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/web/templates/food/set.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="301">
<caret line="88" selection-start-line="88" selection-end-line="88" />
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/web/templates/food/cat_set.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="275">
<caret line="39" column="18" lean-forward="true" selection-start-line="39" selection-start-column="18" selection-end-line="39" selection-end-column="18" />
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<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>
</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="496">
<caret line="22" column="2" selection-start-line="22" selection-start-column="2" selection-end-line="28" selection-end-column="5" />
<state relative-caret-position="31">
<caret line="37" column="36" selection-start-line="37" selection-start-column="36" selection-end-line="37" selection-end-column="36" />
<folding>
<element signature="e#24#76#0" expanded="true" />
<element signature="e#552#3166#0" />
<element signature="e#2377#3215#0" />
</folding>
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/mina/pages/index/index.wxml">
<entry file="file://$PROJECT_DIR$/config/base_setting.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="589">
<caret line="19" lean-forward="true" selection-start-line="19" selection-end-line="19" />
<state relative-caret-position="315">
<caret line="44" column="35" selection-start-line="44" selection-start-column="35" selection-end-line="44" selection-end-column="35" />
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/web/templates/common/layout_main.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="374">
<caret line="109" column="6" selection-start-line="109" selection-start-column="6" selection-end-line="109" selection-end-column="6" />
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/common/libs/UploadService.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="186">
<caret line="15" column="29" lean-forward="true" selection-start-line="15" selection-start-column="29" selection-end-line="15" selection-end-column="29" />
<folding>
<element signature="e#24#66#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
@@ -147,6 +154,8 @@
<find>sav</find>
<find>save</find>
<find>wrap_cat_set</find>
<find>img_k</find>
<find>upl</find>
</findStrings>
<replaceStrings>
<replace>ops_render</replace>
@@ -158,40 +167,31 @@
<component name="IdeDocumentHistory">
<option name="CHANGED_PATHS">
<list>
<option value="$PROJECT_DIR$/docs/mysql.md" />
<option value="$PROJECT_DIR$/readme.md" />
<option value="$PROJECT_DIR$/manager.py" />
<option value="$PROJECT_DIR$/mina/project.config.json" />
<option value="$PROJECT_DIR$/common/models/User.py" />
<option value="$PROJECT_DIR$/requirements.txt" />
<option value="$PROJECT_DIR$/application.py" />
<option value="$PROJECT_DIR$/config/__init__.py" />
<option value="$PROJECT_DIR$/common/__init__.py" />
<option value="$PROJECT_DIR$/web/templates/user/login.html" />
<option value="$PROJECT_DIR$/web/static/js/common.js" />
<option value="$PROJECT_DIR$/web/static/js/user/login.js" />
<option value="$PROJECT_DIR$/web/templates/common/layout_main.html" />
<option value="$PROJECT_DIR$/common/libs/user/Helper.py" />
<option value="$PROJECT_DIR$/web/controllers/index.py" />
<option value="$PROJECT_DIR$/web/controllers/stat/Stat.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/templates/user/edit.html" />
<option value="$PROJECT_DIR$/common/libs/Helper.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$/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$/web/controllers/api/__init__.py" />
<option value="$PROJECT_DIR$/www.py" />
<option value="$PROJECT_DIR$/config/local_setting.py" />
<option value="$PROJECT_DIR$/config/base_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" />
@@ -205,10 +205,19 @@
<option value="$PROJECT_DIR$/web/templates/member/info.html" />
<option value="$PROJECT_DIR$/web/controllers/member/Member.py" />
<option value="$PROJECT_DIR$/web/static/js/member/index.js" />
<option value="$PROJECT_DIR$/web/templates/food/set.html" />
<option value="$PROJECT_DIR$/web/templates/food/cat_set.html" />
<option value="$PROJECT_DIR$/web/templates/food/cat.html" />
<option value="$PROJECT_DIR$/www.py" />
<option value="$PROJECT_DIR$/common/libs/UrlManager.py" />
<option value="$PROJECT_DIR$/config/base_setting.py" />
<option value="$PROJECT_DIR$/web/static/js/common.js" />
<option value="$PROJECT_DIR$/web/static/js/food/set.js" />
<option value="$PROJECT_DIR$/web/templates/food/set.html" />
<option value="$PROJECT_DIR$/application.py" />
<option value="$PROJECT_DIR$/common/libs/Helper.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/common/layout_main.html" />
</list>
</option>
</component>
@@ -222,8 +231,8 @@
<packageJsonPaths />
</component>
<component name="ProjectFrameBounds">
<option name="x" value="1008" />
<option name="y" value="31" />
<option name="x" value="1029" />
<option name="y" value="30" />
<option name="width" value="887" />
<option name="height" value="939" />
</component>
@@ -255,14 +264,14 @@
<item name="order" type="b2602c69:ProjectViewProjectNode" />
<item name="order" type="462c0819:PsiDirectoryNode" />
<item name="common" type="462c0819:PsiDirectoryNode" />
<item name="models" type="462c0819:PsiDirectoryNode" />
<item name="libs" type="462c0819:PsiDirectoryNode" />
<item name="food" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="order" type="b2602c69:ProjectViewProjectNode" />
<item name="order" type="462c0819:PsiDirectoryNode" />
<item name="common" type="462c0819:PsiDirectoryNode" />
<item name="models" type="462c0819:PsiDirectoryNode" />
<item name="food" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="order" type="b2602c69:ProjectViewProjectNode" />
@@ -280,34 +289,6 @@
<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="api" 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="food" 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="member" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="order" type="b2602c69:ProjectViewProjectNode" />
<item name="order" type="462c0819:PsiDirectoryNode" />
@@ -321,22 +302,6 @@
<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="food" 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="member" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="order" type="b2602c69:ProjectViewProjectNode" />
<item name="order" type="462c0819:PsiDirectoryNode" />
@@ -376,7 +341,7 @@
<component name="PropertiesComponent">
<property name="SHARE_PROJECT_CONFIGURATION_FILES" value="true" />
<property name="WebServerToolWindowFactoryState" value="false" />
<property name="last_opened_file_path" value="$PROJECT_DIR$/web/templates/common" />
<property name="last_opened_file_path" value="$PROJECT_DIR$/common/libs" />
<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" />
@@ -387,11 +352,11 @@
</component>
<component name="RecentsManager">
<key name="CopyFile.RECENT_KEYS">
<recent name="D:\order\web\templates\common" />
<recent name="D:\order\web\static\js" />
<recent name="D:\order\common\libs" />
<recent name="D:\order\web\static" />
<recent name="D:\order\common\models" />
<recent name="D:\order\web\static\js\member" />
<recent name="D:\order\common\libs\member" />
<recent name="D:\order\web\controllers" />
<recent name="D:\order\web\templates\common" />
</key>
<key name="MoveFile.RECENT_KEYS">
<recent name="D:\order\common\libs" />
@@ -521,7 +486,14 @@
<option name="project" value="LOCAL" />
<updated>1564655284808</updated>
</task>
<option name="localTasksCounter" value="15" />
<task id="LOCAL-00015" summary="python学习">
<created>1564727948258</created>
<option name="number" value="00015" />
<option name="presentableId" value="LOCAL-00015" />
<option name="project" value="LOCAL" />
<updated>1564727948258</updated>
</task>
<option name="localTasksCounter" value="16" />
<servers />
</component>
<component name="TodoView">
@@ -534,9 +506,9 @@
</todo-panel>
</component>
<component name="ToolWindowManager">
<frame x="1008" y="31" width="887" height="939" extended-state="0" />
<frame x="1029" y="30" width="887" height="939" extended-state="0" />
<layout>
<window_info active="true" content_ui="combo" id="Project" order="0" visible="true" weight="0.27561837" />
<window_info content_ui="combo" id="Project" order="0" visible="true" weight="0.26855123" />
<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" />
@@ -551,7 +523,7 @@
<window_info anchor="bottom" id="TODO" order="6" weight="0.32960895" />
<window_info anchor="bottom" id="Docker" order="7" show_stripe_button="false" />
<window_info anchor="bottom" id="Database Changes" order="8" show_stripe_button="false" />
<window_info anchor="bottom" id="Terminal" order="9" visible="true" weight="0.27791563" />
<window_info active="true" anchor="bottom" id="Terminal" order="9" visible="true" weight="0.28163773" />
<window_info anchor="bottom" id="Event Log" order="10" side_tool="true" />
<window_info anchor="bottom" id="Version Control" order="11" />
<window_info anchor="bottom" id="Python Console" order="12" />
@@ -575,130 +547,6 @@
<option name="LAST_COMMIT_MESSAGE" value="python学习" />
</component>
<component name="editorHistoryManager">
<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/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$/common/models/AppAccessLog.py" />
<entry file="file://$PROJECT_DIR$/common/models/log/AppErrorLog.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="215">
<caret line="7" lean-forward="true" selection-start-line="7" selection-end-line="7" />
<folding>
<element signature="e#16#78#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/web/interceptors/AuthInterceptor.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="558">
<caret line="26" column="21" selection-start-line="26" selection-start-column="15" selection-end-line="26" selection-end-column="27" />
<folding>
<element signature="e#24#51#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/common/models/log/AppAccessLog.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="310">
<caret line="12" column="14" selection-start-line="12" selection-start-column="4" selection-end-line="12" selection-end-column="14" />
<folding>
<element signature="e#16#90#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="1612">
<caret line="52" column="55" selection-start-line="52" selection-start-column="51" selection-end-line="52" selection-end-column="55" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/web/interceptors/ErrorInterceptor.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="186">
<caret line="8" column="21" selection-start-line="8" selection-start-column="21" selection-end-line="8" selection-end-column="21" />
<folding>
<element signature="e#24#52#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/web/templates/error/error.html">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/common/libs/UrlManager.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="465">
<caret line="16" column="22" selection-start-line="16" selection-start-column="22" selection-end-line="16" selection-end-column="22" />
<folding>
<element signature="e#24#35#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/common/libs/LogService.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="80">
<caret line="10" column="8" selection-start-line="10" selection-start-column="8" selection-end-line="10" selection-end-column="8" />
<folding>
<element signature="e#24#51#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/mina/project.config.json">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/manager.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="248">
<caret line="10" selection-start-line="10" selection-end-line="10" />
<folding>
<element signature="e#24#59#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/web/controllers/api/__init__.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="62">
<caret line="2" column="22" selection-start-line="2" selection-start-column="22" selection-end-line="2" selection-end-column="22" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/www.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="651">
<caret line="21" column="41" lean-forward="true" selection-start-line="21" selection-start-column="41" selection-end-line="21" selection-end-column="41" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/mina/app.json">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-837" />
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/数据库文件/自动生成models.txt">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="31">
@@ -716,13 +564,6 @@
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/config/base_setting.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="279">
<caret line="9" column="19" selection-start-line="9" selection-start-column="19" selection-end-line="9" selection-end-column="19" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/mina/app.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="2387">
@@ -754,23 +595,6 @@
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/config/local_setting.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="248">
<caret line="8" lean-forward="true" selection-start-line="8" selection-end-line="8" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/common/libs/Helper.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="185">
<caret line="6" column="4" selection-start-line="6" selection-start-column="4" selection-end-line="6" selection-end-column="4" />
<folding>
<element signature="e#24#59#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/web/templates/member/comment.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-846" />
@@ -859,13 +683,6 @@
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/数据库文件/food.sql">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-372">
<caret line="148" selection-start-line="148" selection-end-line="160" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/web/static/js/member/index.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="403">
@@ -885,13 +702,6 @@
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/web/templates/food/set.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="301">
<caret line="88" selection-start-line="88" selection-end-line="88" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/common/models/food/FoodCat.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="124">
@@ -919,26 +729,175 @@
<entry file="file://$PROJECT_DIR$/web/static/js/food/cat.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="341">
<caret line="11" lean-forward="true" selection-start-line="11" selection-end-line="11" />
<caret line="11" selection-start-line="11" selection-end-line="11" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/web/templates/food/cat.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-1962">
<caret line="1" column="19" lean-forward="true" selection-start-line="1" selection-start-column="19" selection-end-line="1" selection-end-column="19" />
<caret line="1" column="19" selection-start-line="1" selection-start-column="19" selection-end-line="1" selection-end-column="19" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/www.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="463">
<caret line="32" column="61" selection-start-line="32" selection-start-column="61" selection-end-line="32" selection-end-column="61" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/common/models/Image.py">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/web/static/upload/readme.md">
<provider selected="true" editor-type-id="split-provider[text-editor;markdown-preview-editor]">
<state split_layout="SPLIT">
<first_editor />
<second_editor />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/common/libs/UrlManager.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="527">
<caret line="17" lean-forward="true" selection-start-line="17" selection-end-line="17" />
<folding>
<element signature="e#24#35#0" expanded="true" />
</folding>
</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$/config/local_setting.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="248">
<caret line="8" lean-forward="true" selection-start-line="8" selection-end-line="8" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/common/libs/UploadService.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="186">
<caret line="15" column="29" lean-forward="true" selection-start-line="15" selection-start-column="29" selection-end-line="15" selection-end-column="29" />
<folding>
<element signature="e#24#66#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/web/static/upload/20190802/57cf16593a3c4398a9503cb80c924da9.png">
<provider selected="true" editor-type-id="images" />
</entry>
<entry file="file://$PROJECT_DIR$/web/static/upload/20190802/a0704e7fdbf74dc3a98169a9602e22b8.png">
<provider selected="true" editor-type-id="images" />
</entry>
<entry file="file://$PROJECT_DIR$/web/static/upload/20190802/ea3743a978504fa0988fed9b2b3686a0.png">
<provider selected="true" editor-type-id="images" />
</entry>
<entry file="file://$PROJECT_DIR$/数据库文件/food.sql">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="186">
<caret line="171" lean-forward="true" selection-start-line="171" selection-end-line="171" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/web/controllers/upload/Upload.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="1364">
<caret line="44" lean-forward="true" selection-start-line="44" selection-end-line="44" />
<folding>
<element signature="e#24#67#0" expanded="true" />
<element signature="e#1609#2060#0" />
<element signature="e#2080#2657#0" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/web/static/js/food/set.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-2082">
<caret line="53" column="13" lean-forward="true" selection-start-line="53" selection-start-column="13" selection-end-line="53" selection-end-column="13" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/common/libs/food/FoodService.py">
<provider selected="true" editor-type-id="text-editor">
<state>
<folding>
<element signature="e#24#54#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/web/templates/food/info.html">
<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="298">
<caret line="25" column="66" selection-start-line="25" selection-start-column="66" selection-end-line="25" selection-end-column="66" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/web/templates/food/set.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="203">
<caret line="41" column="30" lean-forward="true" selection-start-line="41" selection-start-column="30" selection-end-line="41" selection-end-column="30" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/common/libs/Helper.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="112">
<caret line="110" column="22" selection-start-line="110" selection-start-column="22" selection-end-line="110" selection-end-column="22" />
<folding>
<element signature="e#24#59#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/web/controllers/food/Food.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="718">
<caret line="98" column="25" lean-forward="true" selection-start-line="98" selection-start-column="25" selection-end-line="98" selection-end-column="25" />
<state relative-caret-position="31">
<caret line="37" column="36" selection-start-line="37" selection-start-column="36" selection-end-line="37" selection-end-column="36" />
<folding>
<element signature="e#24#67#0" expanded="true" />
<element signature="e#24#76#0" expanded="true" />
<element signature="e#552#3166#0" />
<element signature="e#2377#3215#0" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/web/templates/food/index.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="372">
<caret line="12" column="11" lean-forward="true" selection-start-line="12" selection-start-column="11" selection-end-line="12" selection-end-column="11" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/config/base_setting.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="315">
<caret line="44" column="35" selection-start-line="44" selection-start-column="35" selection-end-line="44" selection-end-column="35" />
</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="374">
<caret line="109" column="6" selection-start-line="109" selection-start-column="6" selection-end-line="109" selection-end-column="6" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/web/static/js/common.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="320">
<caret line="156" column="6" lean-forward="true" selection-start-line="156" selection-start-column="6" selection-end-line="156" selection-end-column="6" />
</state>
</provider>
</entry>
</component>
</project>

View File

@@ -23,4 +23,5 @@ manager = Manager( app )
from common.libs.UrlManager import UrlManager
app.add_template_global(UrlManager.buildStaticUrl, 'buildStaticUrl')
app.add_template_global(UrlManager.buildUrl, 'buildUrl')
app.add_template_global(UrlManager.buildImageUrl, 'buildImageUrl')

View File

@@ -65,3 +65,63 @@ def ops_render( template,context = {} ):
def getCurrentDate( format = "%Y-%m-%d %H:%M:%S"):
#return datetime.datetime.now().strftime( format )
return datetime.datetime.now()
'''
获取格式化的时间
'''
def getFormatDate( date = None ,format = "%Y-%m-%d %H:%M:%S" ):
if date is None:
date = datetime.datetime.now()
return date.strftime( format )
'''
根据某个字段获取一个dic出来
'''
def getDictFilterField( db_model,select_filed,key_field,id_list ):
ret = {}
query = db_model.query
if id_list and len( id_list ) > 0:
query = query.filter( select_filed.in_( id_list ) )
list = query.all()
if not list:
return ret
for item in list:
if not hasattr( item,key_field ):
break
ret[ getattr( item,key_field ) ] = item
return ret
def selectFilterObj( obj,field ):
ret = []
for item in obj:
if not hasattr(item, field ):
break
if getattr( item,field ) in ret:
continue
ret.append( getattr( item,field ) )
return ret
def getDictFilterField( db_model,select_filed,key_field,id_list ):
ret = {}
query = db_model.query
if id_list and len( id_list ) > 0:
query = query.filter( select_filed.in_( id_list ) )
list = query.all()
if not list:
return ret
for item in list:
if not hasattr( item,key_field ):
break
if getattr( item,key_field ) not in ret:
ret[getattr(item, key_field)] = []
ret[ getattr( item,key_field ) ].append(item )
return ret

View File

@@ -0,0 +1,41 @@
# -*- coding: utf-8 -*-
from werkzeug.utils import secure_filename
from application import app,db
from common.libs.Helper import getCurrentDate
import datetime
import os,stat,uuid
from common.models.Image import Image
class UploadService():
@staticmethod
def uploadByFile( file ):
config_upload = app.config['UPLOAD']
resp = { 'code':200,'msg':'操作成功~~','data':{} }
filename = secure_filename( file.filename )
ext = filename.rsplit(".",1)[1]
if ext not in config_upload['ext']:
resp['code'] = -1
resp['msg'] = "不允许的扩展类型文件"
return resp
root_path = app.root_path + config_upload['prefix_path']
#不使用getCurrentDate创建目录为了保证其他写的可以用这里改掉服务器上好像对时间不兼容
file_dir = datetime.datetime.now().strftime("%Y%m%d")
save_dir = root_path + file_dir
if not os.path.exists( save_dir ):
os.mkdir( save_dir )
os.chmod( save_dir,stat.S_IRWXU | stat.S_IRGRP | stat.S_IRWXO )
file_name = str( uuid.uuid4() ).replace("-","") + "." + ext
file.save( "{0}/{1}".format( save_dir,file_name ) )
model_image = Image()
model_image.file_key = file_dir + "/" + file_name
model_image.created_time = getCurrentDate()
db.session.add( model_image)
db.session.commit()
resp['data'] = {
'file_key': model_image.file_key
}
return resp

View File

@@ -14,4 +14,10 @@ class UrlManager(object):
release_version = app.config.get('RELEASE_VERSION')
ver = "%s" % (int(time.time())) if not release_version else release_version
path = "/static" + path + "?ver=" + ver
return UrlManager.buildUrl( path )
return UrlManager.buildUrl( path )
@staticmethod
def buildImageUrl( path ):
app_config = app.config['APP']
url = app_config['domain'] + app.config['UPLOAD']['prefix_url'] + path
return url

View File

@@ -0,0 +1,28 @@
# -*- coding: utf-8 -*-
from application import app,db
from common.models.food.FoodStockChangeLog import FoodStockChangeLog
from common.models.food.Food import Food
from common.libs.Helper import getCurrentDate
class FoodService():
@staticmethod
def setStockChangeLog( food_id = 0,quantity = 0,note = '' ):
if food_id < 1:
return False
food_info = Food.query.filter_by( id = food_id ).first()
if not food_info:
return False
model_stock_change = FoodStockChangeLog()
model_stock_change.food_id = food_id
model_stock_change.unit = quantity
model_stock_change.total_stock = food_info.stock
model_stock_change.note = note
model_stock_change.created_time = getCurrentDate()
db.session.add(model_stock_change)
db.session.commit()
return True

12
common/models/Image.py Normal file
View File

@@ -0,0 +1,12 @@
# coding: utf-8
from sqlalchemy import Column, DateTime, Integer, String
from sqlalchemy.schema import FetchedValue
from application import db
class Image(db.Model):
__tablename__ = 'images'
id = db.Column(db.Integer, primary_key=True)
file_key = db.Column(db.String(60), nullable=False, server_default=db.FetchedValue())
created_time = db.Column(db.DateTime, nullable=False, server_default=db.FetchedValue())

View File

@@ -33,4 +33,14 @@ MINA_APP = {
'paykey':'xxxxxxxxxxxxxx换自己的',
'mch_id':'xxxxxxxxxxxx换自己的',
'callback_url':'/api/order/callback'
}
UPLOAD = {
'ext':[ 'jpg','gif','bmp','jpeg','png' ],
'prefix_path':'/web/static/upload/',
'prefix_url':'/static/upload/'
}
APP = {
'domain':'http://127.0.0.1:9000'
}

View File

@@ -1,24 +1,150 @@
# -*- coding: utf-8 -*-
from flask import Blueprint,request,jsonify
from flask import Blueprint,request,jsonify,redirect
from common.models.food.Food import Food
from common.libs.Helper import ops_render
from common.models.food.FoodCat import FoodCat
from application import app,db
from common.libs.Helper import getCurrentDate
from common.libs.Helper import getCurrentDate,iPagination,getDictFilterField
from common.libs.food.FoodService import FoodService
from common.libs.UrlManager import UrlManager
from decimal import Decimal
from sqlalchemy import or_
route_food = Blueprint( 'food_page',__name__ )
@route_food.route( "/index" )
def index():
return ops_render( "food/index.html" )
resp_data = {}
req = request.values
page = int(req['p']) if ('p' in req and req['p']) else 1
query = Food.query
if 'mix_kw' in req:
rule = or_(Food.name.ilike("%{0}%".format(req['mix_kw'])), Food.tags.ilike("%{0}%".format(req['mix_kw'])))
query = query.filter( rule )
if 'status' in req and int( req['status'] ) > -1 :
query = query.filter( Food.status == int( req['status'] ) )
if 'cat_id' in req and int( req['cat_id'] ) > 0 :
query = query.filter( Food.cat_id == int( req['cat_id'] ) )
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']
list = query.order_by( Food.id.desc() ).offset( offset ).limit( app.config['PAGE_SIZE'] ).all()
cat_mapping = getDictFilterField( FoodCat,FoodCat.id,"id",[] )
resp_data['list'] = list
resp_data['pages'] = pages
resp_data['search_con'] = req
resp_data['status_mapping'] = app.config['STATUS_MAPPING']
resp_data['cat_mapping'] = cat_mapping
resp_data['current'] = 'index'
return ops_render( "food/index.html",resp_data )
@route_food.route( "/info" )
def info():
return ops_render( "food/info.html" )
@route_food.route( "/set" )
@route_food.route( "/set" ,methods = [ 'GET','POST'] )
def set():
return ops_render( "food/set.html" )
if request.method == "GET":
resp_data = {}
req = request.args
id = int(req.get('id', 0))
info = Food.query.filter_by(id=id).first()
if info and info.status != 1:
return redirect(UrlManager.buildUrl("/food/index"))
cat_list = FoodCat.query.all()
resp_data['info'] = info
resp_data['cat_list'] = cat_list
resp_data['current'] = 'index'
return ops_render("food/set.html", resp_data)
resp = {'code': 200, 'msg': '操作成功~~', 'data': {}}
req = request.values
id = int(req['id']) if 'id' in req and req['id'] else 0
cat_id = int(req['cat_id']) if 'cat_id' in req else 0
name = req['name'] if 'name' in req else ''
price = req['price'] if 'price' in req else ''
main_image = req['main_image'] if 'main_image' in req else ''
summary = req['summary'] if 'summary' in req else ''
stock = int(req['stock']) if 'stock' in req else ''
tags = req['tags'] if 'tags' in req else ''
if cat_id < 1:
resp['code'] = -1
resp['msg'] = "请选择分类~~"
return jsonify(resp)
if name is None or len(name) < 1:
resp['code'] = -1
resp['msg'] = "请输入符合规范的名称~~"
return jsonify(resp)
if not price or len( price ) < 1:
resp['code'] = -1
resp['msg'] = "请输入符合规范的售卖价格~~"
return jsonify(resp)
price = Decimal(price).quantize(Decimal('0.00'))
if price <= 0:
resp['code'] = -1
resp['msg'] = "请输入符合规范的售卖价格~~"
return jsonify(resp)
if main_image is None or len(main_image) < 3:
resp['code'] = -1
resp['msg'] = "请上传封面图~~"
return jsonify(resp)
if summary is None or len(summary) < 3:
resp['code'] = -1
resp['msg'] = "请输入图书描述并不能少于10个字符~~"
return jsonify(resp)
if stock < 1:
resp['code'] = -1
resp['msg'] = "请输入符合规范的库存量~~"
return jsonify(resp)
if tags is None or len(tags) < 1:
resp['code'] = -1
resp['msg'] = "请输入标签,便于搜索~~"
return jsonify(resp)
food_info = Food.query.filter_by(id=id).first()
before_stock = 0
if food_info:
model_food = food_info
before_stock = model_food.stock
else:
model_food = Food()
model_food.status = 1
model_food.created_time = getCurrentDate()
model_food.cat_id = cat_id
model_food.name = name
model_food.price = price
model_food.main_image = main_image
model_food.summary = summary
model_food.stock = stock
model_food.tags = tags
model_food.updated_time = getCurrentDate()
db.session.add(model_food)
ret = db.session.commit()
FoodService.setStockChangeLog(model_food.id, int(stock) - int(before_stock), "后台修改")
return jsonify(resp)
@route_food.route( "/cat" )

View File

@@ -0,0 +1,91 @@
# -*- coding: utf-8 -*-
from flask import Blueprint,request,jsonify
from application import app
import re,json
from common.libs.UploadService import UploadService
from common.libs.UrlManager import UrlManager
from common.models.Image import Image
route_upload = Blueprint('upload_page', __name__)
'''
参考文章https://segmentfault.com/a/1190000002429055
'''
@route_upload.route("/ueditor",methods = [ "GET","POST" ])
def ueditor():
req = request.values
action = req['action'] if 'action' in req else ''
if action == "config":
root_path = app.root_path
config_path = "{0}/web/static/plugins/ueditor/upload_config.json".format( root_path )
with open( config_path,encoding="utf-8" ) as fp:
try:
config_data = json.loads( re.sub( r'\/\*.*\*/' ,'',fp.read() ) )
except:
config_data = {}
return jsonify( config_data )
if action == "uploadimage":
return uploadImage()
if action == "listimage":
return listImage()
return "upload"
@route_upload.route("/pic",methods = [ "GET","POST" ])
def uploadPic():
file_target = request.files
upfile = file_target['pic'] if 'pic' in file_target else None
callback_target = 'window.parent.upload'
if upfile is None:
return "<script type='text/javascript'>{0}.error('{1}')</script>".format( callback_target,"上传失败" )
ret = UploadService.uploadByFile(upfile)
if ret['code'] != 200:
return "<script type='text/javascript'>{0}.error('{1}')</script>".format(callback_target, "上传失败:" + ret['msg'])
return "<script type='text/javascript'>{0}.success('{1}')</script>".format(callback_target,ret['data']['file_key'] )
def uploadImage():
resp = { 'state':'SUCCESS','url':'','title':'','original':'' }
file_target = request.files
upfile = file_target['upfile'] if 'upfile' in file_target else None
if upfile is None:
resp['state'] = "上传失败"
return jsonify(resp)
ret = UploadService.uploadByFile( upfile )
if ret['code'] != 200:
resp['state'] = "上传失败:" + ret['msg']
return jsonify(resp)
resp['url'] = UrlManager.buildImageUrl( ret['data']['file_key'] )
return jsonify( resp )
def listImage():
resp = { 'state':'SUCCESS','list':[],'start':0 ,'total':0 }
req = request.values
start = int( req['start']) if 'start' in req else 0
page_size = int( req['size']) if 'size' in req else 20
query = Image.query
if start > 0:
query = query.filter( Image.id < start )
list = query.order_by( Image.id.desc() ).limit( page_size ).all()
images = []
if list:
for item in list:
images.append( { 'url': UrlManager.buildImageUrl( item.file_key ) } )
start = item.id
resp['list'] = images
resp['start'] = start
resp['total'] = len( images )
return jsonify( resp )

View File

@@ -150,7 +150,11 @@ var common_ops = {
}
return url + _paramUrl;
},
buildPicUrl:function( img_key ){
var domain = $(".hidden_layout_wrap input[name=domain]").val();
var prefix_url = $(".hidden_layout_wrap input[name=prefix_url]").val();
return domain + prefix_url + img_key;
}
};
$(document).ready( function() {

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

View File

@@ -0,0 +1 @@
上传目录upload

View File

@@ -104,6 +104,10 @@
{% block content %}{% endblock %}
</div>
</div>
<div class="hidden hidden_layout_wrap">
<input name="domain" value="{{ config.APP.domain }}">
<input name="prefix_url" value="{{ config.UPLOAD.prefix_url }}">
</div>
<script src="{{ buildStaticUrl('/plugins/jquery-2.1.1.js') }}"></script>
<script src="{{ buildStaticUrl('/bootstrap/bootstrap.min.js') }}"></script>

View File

@@ -1,19 +1,6 @@
{% extends "common/layout_main.html" %}
{% block content %}
<div class="row border-bottom">
<div class="col-lg-12">
<div class="tab_title">
<ul class="nav nav-pills">
<li class="current">
<a href="{{ buildUrl('/food/index') }}">美食列表</a>
</li>
<li>
<a href="{{ buildUrl('/food/cat') }}">分类列表</a>
</li>
</ul>
</div>
</div>
</div>
{% include "common/tab_food.html" %}
<div class="row">
<div class="col-lg-12">
<form class="form-inline wrap_search">
@@ -21,19 +8,23 @@
<div class="form-group">
<select name="status" class="form-control inline">
<option value="-1">请选择状态</option>
<option value="1">正常</option>
<option value="0">已删除</option>
{% for tmp_key in status_mapping %}
<option value="{{ tmp_key }}" {% if tmp_key == search_con['status'] %} selected {% endif %}>{{ status_mapping[ tmp_key ] }}</option>
{% endfor %}
</select>
</div>
<div class="form-group">
<select name="cat_id" class="form-control inline">
<option value="0">请选择分类</option>
<option value="1">111</option>
{% for tmp_key in cat_mapping %}
<option value="{{ tmp_key }}" {% if tmp_key|string == search_con['cat_id'] %} selected {% endif %} >{{ cat_mapping[ tmp_key].name }}</option>
{% endfor %}
</select>
</div>
<div class="form-group">
<div class="input-group">
<input type="text" name="mix_kw" placeholder="请输入关键字" class="form-control" value="">
<input type="text" name="mix_kw" placeholder="请输入关键字" class="form-control" value="{{ search_con['mix_kw'] }}">
<input type="hidden" name="p" value="{{ search_con['p'] }}">
<span class="input-group-btn">
<button type="button" class="btn btn-primary search">
<i class="fa fa-search"></i>搜索
@@ -64,35 +55,44 @@
</tr>
</thead>
<tbody>
{% if list %}
{% for item in list %}
<tr>
<td>小鸡炖蘑菇</td>
<td>东北菜</td>
<td>0.02</td>
<td>27</td>
<td>好吃</td>
<td>{{ item.name }}</td>
<td>{{ cat_mapping[ item.cat_id].name }}</td>
<td>{{ item.price }}</td>
<td>{{ item.stock }}</td>
<td>{{ item.tags }}</td>
<td>
<a href="{{ buildUrl('/food/info') }}">
<a href="{{ buildUrl('/food/info') }}?id={{ item.id }}">
<i class="fa fa-eye fa-lg"></i>
</a>
<a class="m-l" href="{{ buildUrl('/food/set') }}">
{% if item.status == 1 %}
<a class="m-l" href="{{ buildUrl('/food/set') }}?id={{ item.id }}">
<i class="fa fa-edit fa-lg"></i>
</a>
<a class="m-l remove" href="javascript:void(0);" data="3">
<a class="m-l remove" href="javascript:void(0);" data="{{ item.id }}">
<i class="fa fa-trash fa-lg"></i>
</a>
{% else %}
<a class="m-l recover" href="javascript:void(0);" data="{{ item.id }}">
<i class="fa fa-rotate-left fa-lg"></i>
</a>
{% endif %}
</td>
</tr>
{% endfor %}
{% else %}
<tr><td colspan="6">暂无数据~~</td></tr>
{% endif %}
</tbody>
</table>
<div class="row">
<div class="col-lg-12">
<span class="pagination_count" style="line-height: 40px;">共1条记录 | 每页50条</span>
<ul class="pagination pagination-lg pull-right" style="margin: 0 0 ;">
<li class="active"><a href="javascript:void(0);">1</a></li>
</ul>
</div>
</div>
<!--分页代码已被封装到统一模板文件中-->
{% include 'common/pagenation.html' %}
</div>
</div>
{% endblock %}
{% block js %}
<script src="{{ buildStaticUrl('/js/food/index.js') }}"></script>
{% endblock %}

View File

@@ -1,19 +1,6 @@
{% extends "common/layout_main.html" %}
{% block content %}
<div class="row border-bottom">
<div class="col-lg-12">
<div class="tab_title">
<ul class="nav nav-pills">
<li class="current">
<a href="{{ buildUrl('/food/index') }}">美食列表</a>
</li>
<li>
<a href="{{ buildUrl('/food/cat') }}">分类列表</a>
</li>
</ul>
</div>
</div>
</div>
{% include "common/tab_food.html" %}
<div class="row mg-t20 wrap_food_set" style="">
<div class="col-lg-12" style="">
<h2 class="text-center">设置</h2>
@@ -24,7 +11,9 @@
<select name="cat_id" class="form-control select2-hidden-accessible" tabindex="-1"
aria-hidden="true">
<option value="0">请选择分类</option>
<option value="8">111</option>
{% for item in cat_list %}
<option value="{{ item.id }}" {% if item.id == info.cat_id %} selected {% endif %}>{{ item.name }}</option>
{% endfor %}
</select>
</div>
</div>
@@ -32,14 +21,14 @@
<div class="form-group">
<label class="col-lg-2 control-label">名称:</label>
<div class="col-lg-10">
<input type="text" class="form-control" placeholder="请输入名称" name="name" value="">
<input type="text" class="form-control" placeholder="请输入名称" name="name" value="{{ info.name }}">
</div>
</div>
<div class="hr-line-dashed"></div>
<div class="form-group">
<label class="col-lg-2 control-label">价格:</label>
<div class="col-lg-10">
<input type="text" class="form-control" placeholder="请输入售价" name="price" value="">
<input type="text" class="form-control" placeholder="请输入售价" name="price" value="{{ info.price }}">
</div>
</div>
<div class="hr-line-dashed"></div>
@@ -51,6 +40,12 @@
<i class="fa fa-upload fa-2x"></i>
<input type="file" name="pic" accept="image/png, image/jpeg, image/jpg,image/gif">
</div>
{% if info and info.main_image %}
<span class="pic-each">
<img src="{{ buildImageUrl( info.main_image ) }}"/>
<span class="fa fa-times-circle del del_image" data="{{ info.main_image }}"></span>
</span>
{% endif %}
</form>
</div>
</div>
@@ -58,32 +53,50 @@
<div class="form-group" style="">
<label class="col-lg-2 control-label">描述:</label>
<div class="col-lg-10">
<textarea id="editor" name="summary" style="height: 300px;"></textarea>
<textarea id="editor" name="summary" style="height: 300px;">{{ info.summary }}</textarea>
</div>
</div>
<div class="hr-line-dashed"></div>
<div class="form-group">
<label class="col-lg-2 control-label">库存:</label>
<div class="col-lg-2">
<input type="text" name="stock" class="form-control" value="1">
<input type="text" name="stock" class="form-control" value="{{ info.stock }}">
</div>
</div>
<div class="hr-line-dashed"></div>
<div class="form-group">
<label class="col-lg-2 control-label">标签:</label>
<div class="col-lg-10">
<input type="text" class="form-control" name="tags" value="">
<input type="text" class="form-control" name="tags" value="{{ info.tags }}">
</div>
</div>
<div class="hr-line-dashed"></div>
<div class="form-group">
<div class="col-lg-4 col-lg-offset-2">
<input type="hidden" name="id" value="0">
<input type="hidden" name="id" value="{{ info.id }}">
<button class="btn btn-w-m btn-outline btn-primary save">保存</button>
</div>
</div>
</div>
</div>
</div>
<iframe name="upload_file" class="hide"></iframe>
{% endblock %}
{% block css %}
<link href="{{ buildStaticUrl( '/plugins/select2/select2.min.css' ) }}" rel="stylesheet">
<link href="{{ buildStaticUrl( '/plugins/tagsinput/jquery.tagsinput.min.css' ) }}" rel="stylesheet">
{% endblock %}
{% block js %}
<script src="{{ buildStaticUrl( '/plugins/ueditor/ueditor.config.js' ) }}"></script>
<script src="{{ buildStaticUrl( '/plugins/ueditor/ueditor.all.min.js' ) }}"></script>
<script src="{{ buildStaticUrl( '/plugins/ueditor/lang/zh-cn/zh-cn.js' ) }}"></script>
<script src="{{ buildStaticUrl( '/plugins/select2/select2.pinyin.js' ) }}"></script>
<script src="{{ buildStaticUrl( '/plugins/select2/zh-CN.js' ) }}"></script>
<script src="{{ buildStaticUrl( '/plugins/select2/pinyin.core.js' ) }}"></script>
<script src="{{ buildStaticUrl( '/plugins/tagsinput/jquery.tagsinput.min.js' ) }}"></script>
<script src="{{ buildStaticUrl( '/js/food/set.js' ) }}"></script>
{% endblock %}

2
www.py
View File

@@ -20,6 +20,7 @@ from web.controllers.food.Food import route_food
from web.controllers.member.Member import route_member
from web.controllers.stat.Stat import route_stat
from web.controllers.api import route_api
from web.controllers.upload.Upload import route_upload
app.register_blueprint( route_index,url_prefix = "/" )
app.register_blueprint( route_user,url_prefix = "/user" )
app.register_blueprint( route_static,url_prefix = "/static" )
@@ -29,3 +30,4 @@ app.register_blueprint(route_member,url_prefix="/member")
app.register_blueprint(route_food,url_prefix="/food")
app.register_blueprint(route_stat,url_prefix="/stat")
app.register_blueprint( route_api,url_prefix = "/api" )
app.register_blueprint( route_upload,url_prefix = "/upload" )