master 0f12aaaf25de cached
102 files
356.4 KB
122.3k tokens
108 symbols
1 requests
Download .txt
Showing preview only (405K chars total). Download the full file or copy to clipboard to get everything.
Repository: DiCaprio17/fruits-and-vegetables
Branch: master
Commit: 0f12aaaf25de
Files: 102
Total size: 356.4 KB

Directory structure:
gitextract_iu6wfhn7/

├── .gitattributes
├── README.md
├── dailyfresh/
│   ├── .idea/
│   │   ├── dailyfresh.iml
│   │   ├── dictionaries/
│   │   │   └── smart.xml
│   │   ├── misc.xml
│   │   ├── modules.xml
│   │   └── workspace.xml
│   ├── apps/
│   │   ├── __init__.py
│   │   ├── cart/
│   │   │   ├── __init__.py
│   │   │   ├── admin.py
│   │   │   ├── migrations/
│   │   │   │   └── __init__.py
│   │   │   ├── models.py
│   │   │   ├── tests.py
│   │   │   ├── urls.py
│   │   │   └── views.py
│   │   ├── goods/
│   │   │   ├── __init__.py
│   │   │   ├── admin.py
│   │   │   ├── migrations/
│   │   │   │   ├── 0001_initial.py
│   │   │   │   └── __init__.py
│   │   │   ├── models.py
│   │   │   ├── search_indexes.py
│   │   │   ├── tests.py
│   │   │   ├── urls.py
│   │   │   └── views.py
│   │   ├── order/
│   │   │   ├── __init__.py
│   │   │   ├── admin.py
│   │   │   ├── alipay_public_key.pem
│   │   │   ├── app_private_key.pem
│   │   │   ├── migrations/
│   │   │   │   ├── 0001_initial.py
│   │   │   │   ├── 0002_auto_20171113_1813.py
│   │   │   │   └── __init__.py
│   │   │   ├── models.py
│   │   │   ├── tests.py
│   │   │   ├── urls.py
│   │   │   └── views.py
│   │   └── user/
│   │       ├── __init__.py
│   │       ├── admin.py
│   │       ├── migrations/
│   │       │   ├── 0001_initial.py
│   │       │   └── __init__.py
│   │       ├── models.py
│   │       ├── tests.py
│   │       ├── urls.py
│   │       └── views.py
│   ├── celery_tasks/
│   │   ├── __init__.py
│   │   └── tasks.py
│   ├── dailyfresh/
│   │   ├── __init__.py
│   │   ├── settings.py
│   │   ├── urls.py
│   │   └── wsgi.py
│   ├── dailyfresh.sql
│   ├── db/
│   │   ├── __init__.py
│   │   └── base_model.py
│   ├── manage.py
│   ├── static/
│   │   ├── cart(1).html
│   │   ├── css/
│   │   │   ├── main.css
│   │   │   └── reset.css
│   │   ├── detail.html
│   │   ├── index.html
│   │   ├── js/
│   │   │   ├── jquery.cookie.js
│   │   │   ├── register.js
│   │   │   └── slide.js
│   │   ├── list.html
│   │   ├── login.html
│   │   ├── place_order.html
│   │   ├── register.html
│   │   ├── test.html
│   │   ├── user_center_info.html
│   │   ├── user_center_order.html
│   │   └── user_center_site.html
│   ├── templates/
│   │   ├── base.html
│   │   ├── base_detail_list.html
│   │   ├── base_no_cart.html
│   │   ├── base_user_center.html
│   │   ├── cart.html
│   │   ├── detail.html
│   │   ├── index.html
│   │   ├── list.html
│   │   ├── login.html
│   │   ├── order_comment.html
│   │   ├── place_order.html
│   │   ├── register.html
│   │   ├── search/
│   │   │   ├── indexes/
│   │   │   │   └── goods/
│   │   │   │       └── goodssku_text.txt
│   │   │   ├── search.html
│   │   │   └── search1.html
│   │   ├── static_base.html
│   │   ├── static_index.html
│   │   ├── user_center_info.html
│   │   ├── user_center_order.html
│   │   └── user_center_site.html
│   ├── utils/
│   │   ├── __init__.py
│   │   ├── fdfs/
│   │   │   ├── __init__.py
│   │   │   ├── client.conf
│   │   │   └── storage.py
│   │   └── mixin.py
│   ├── uwsgi.ini
│   ├── uwsgi.log
│   ├── uwsgi.pid
│   ├── uwsgi2.ini
│   ├── uwsgi2.log
│   ├── uwsgi2.pid
│   └── whoosh_index/
│       └── _MAIN_0.toc
└── requirements.txt

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitattributes
================================================
*.js linguist-language=Python


================================================
FILE: README.md
================================================
# fruits-and-vegetables
基于python3.6和Django1.8.2

使用Python Web框架Django开发的一个B2C网上蔬果商城,包含用户、商品、购物车、订单等模块等等,使用了Celery异步任务队列,MySQL数据库,Redis数据库,FastDFS分布式的图片存储服 务,Nginx负载均衡服务器,uWSGI应用服务器。
# 项目总结
1.	生鲜类产品  B2C  PC电脑端网页
2.	功能模块:用户模块  商品模块(首页、 搜索、商品) 购物车模块  订单模块(下单、 支付)
3.	用户模块:注册、登录、激活、退出、个人中心、地址
4.	商品模块:首页、详情、列表、搜索(haystack+whoosh)
5.	购物车: 增加、删除、修改、查询
6.	订单模块:确认订单页面、提交订单(下单)、请求支付、查询支付结果、评论
7.	django默认的认证系统 AbstractUser
8.	itsdangerous  生成签名的token (序列化工具 dumps  loads)
9.	邮件 (django提供邮件支持 配置参数  send_mail)
10.	 celery (重点  整体认识 异步任务)
11.	 页面静态化 (缓解压力  celery  nginx)
12.	 缓存(缓解压力, 保存的位置、有效期、与数据库的一致性问题)
13.	 FastDFS (分布式的图片存储服务, 修改了django的默认文件存储系统)
14.	 搜索( whoosh  索引  分词)
15.	 购物车redis 哈希 历史记录redis list
16.	 ajax 前端用ajax请求后端接口
17.	 事务
18.	 高并发的库存问题 (悲观锁、乐观锁)
19.	 支付的使用流程
20.	 nginx (负载均衡  提供静态文件)

# 安装
使用pip安装:pip install -r requirements.txt

# 配置
## uwsgi
遵循wsgi协议的web服务器。
### uwsgi的安装
	pip install uwsgi
### uwsgi的配置
项目部署时,需要把settings.py文件夹下的:
    DEBUG=FALSE
    ALLOWED_HOSTS=[‘*’] 
    
    [uwsgi]
    #使用nginx连接时使用
    #socket=127.0.0.1:8080
    #直接做web服务器使用
    http=127.0.0.1:8080
    #项目目录
    chdir=/Users/smart/Desktop/dj/bj17/dailyfresh
    #项目中wsgi.py文件的目录,相对于项目目录
    wsgi-file=dailyfresh/wsgi.py
    processes=4
    threads=2
    master=True
    pidfile=uwsgi.pid
    daemonize=uwsgi.log
    virtualenv=/Users/smart/.virtualenvs/dailyfresh
### uwsgi的启动和停止
启动:uwsgi –-ini 配置文件路径 例如:uwsgi --ini uwsgi.ini

停止:uwsgi --stop uwsgi.pid路径 例如:uwsgi --stop uwsgi.pid
## nginx
Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器
### nginx 配置转发请求给uwsgi
    location / {
    	include uwsgi_params;
    	uwsgi_pass uwsgi服务器的ip:port;
    }
### nginx配置处理静态文件
django settings.py中配置收集静态文件路径:


- STATIC_ROOT=收集的静态文件路径 例如:/var/www/dailyfresh/static;

django 收集静态文件的命令:

    python manage.py collectstatic
执行上面的命令会把项目中所使用的静态文件收集到STATIC_ROOT指定的目录下。

收集完静态文件之后,让nginx提供静态文件,需要在nginx配置文件中增加如下配置:

    location /static {
    	alias /var/www/dailyfresh/static/;
    }
### nginx转发请求给另外地址
在location 对应的配置项中增加 proxy_pass 转发的服务器地址。
如当用户访问127.0.0.1时,在nginx中配置把这个请求转发给172.16.179.131:80(nginx)服务器,让这台服务器提供静态首页。
配置如下:

    location = /{
    	proxy_pass http://172.16.179.131;
    }
### nginx配置upstream实现负载均衡
ngnix 配置负载均衡时,在server配置的前面增加upstream配置项。

    upstream dailyfresh {
    	server 127.0.0.1:8080;
    	server 127.0.0.1:8081;
    }


================================================
FILE: dailyfresh/.idea/dailyfresh.iml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<module type="PYTHON_MODULE" version="4">
  <component name="FacetManager">
    <facet type="django" name="Django">
      <configuration>
        <option name="rootFolder" value="$MODULE_DIR$" />
        <option name="settingsModule" value="dailyfresh/settings.py" />
        <option name="manageScript" value="manage.py" />
        <option name="environment" value="&lt;map/&gt;" />
        <option name="doNotUseTestRunner" value="false" />
        <option name="trackFilePattern" value="migrations" />
      </configuration>
    </facet>
  </component>
  <component name="NewModuleRootManager">
    <content url="file://$MODULE_DIR$" />
    <orderEntry type="jdk" jdkName="Python 3.5 (pytest)" jdkType="Python SDK" />
    <orderEntry type="sourceFolder" forTests="false" />
  </component>
  <component name="TemplatesService">
    <option name="TEMPLATE_CONFIGURATION" value="Django" />
  </component>
  <component name="TestRunnerService">
    <option name="PROJECT_TEST_RUNNER" value="Unittests" />
  </component>
</module>

================================================
FILE: dailyfresh/.idea/dictionaries/smart.xml
================================================
<component name="ProjectDictionaryState">
  <dictionary name="smart" />
</component>

================================================
FILE: dailyfresh/.idea/misc.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="ProjectInspectionProfilesVisibleTreeState">
    <entry key="Project Default">
      <profile-state>
        <expanded-state>
          <State>
            <id />
          </State>
        </expanded-state>
        <selected-state>
          <State>
            <id>AngularJS</id>
          </State>
        </selected-state>
      </profile-state>
    </entry>
  </component>
  <component name="ProjectRootManager" version="2" project-jdk-name="Python 3.5 (pytest)" project-jdk-type="Python SDK" />
  <component name="masterDetails">
    <states>
      <state key="ScopeChooserConfigurable.UI">
        <settings>
          <splitter-proportions>
            <option name="proportions">
              <list>
                <option value="0.2" />
              </list>
            </option>
          </splitter-proportions>
        </settings>
      </state>
    </states>
  </component>
</project>

================================================
FILE: dailyfresh/.idea/modules.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="ProjectModuleManager">
    <modules>
      <module fileurl="file://$PROJECT_DIR$/.idea/dailyfresh.iml" filepath="$PROJECT_DIR$/.idea/dailyfresh.iml" />
    </modules>
  </component>
</project>

================================================
FILE: dailyfresh/.idea/workspace.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="ChangeListManager">
    <list default="true" id="8237aec5-5bff-4b6f-a21a-cd6747db5f5d" name="Default" comment="" />
    <ignored path="dailyfresh.iws" />
    <ignored path=".idea/workspace.xml" />
    <ignored path=".idea/dataSources.local.xml" />
    <option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
    <option name="SHOW_DIALOG" value="false" />
    <option name="HIGHLIGHT_CONFLICTS" value="true" />
    <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
    <option name="LAST_RESOLUTION" value="IGNORE" />
  </component>
  <component name="CreatePatchCommitExecutor">
    <option name="PATCH_PATH" value="" />
  </component>
  <component name="DjangoConsoleOptions" custom-start-script="import sys; print('Python %s on %s' % (sys.version, sys.platform))&#10;import django; print('Django %s' % django.get_version())&#10;sys.path.extend([WORKING_DIR_AND_PYTHON_PATHS])&#10;if 'setup' in dir(django): django.setup()&#10;import django_manage_shell; django_manage_shell.run(PROJECT_ROOT)">
    <option name="myCustomStartScript" value="import sys; print('Python %s on %s' % (sys.version, sys.platform))&#10;import django; print('Django %s' % django.get_version())&#10;sys.path.extend([WORKING_DIR_AND_PYTHON_PATHS])&#10;if 'setup' in dir(django): django.setup()&#10;import django_manage_shell; django_manage_shell.run(PROJECT_ROOT)" />
  </component>
  <component name="FavoritesManager">
    <favorites_list name="dailyfresh" />
  </component>
  <component name="FileEditorManager">
    <leaf SIDE_TABS_SIZE_LIMIT_KEY="375">
      <file pinned="false" current-in-tab="true">
        <entry file="file://$PROJECT_DIR$/uwsgi.log">
          <provider selected="true" editor-type-id="text-editor">
            <state relative-caret-position="-781">
              <caret line="1140" column="40" selection-start-line="1140" selection-start-column="40" selection-end-line="1140" selection-end-column="40" />
            </state>
          </provider>
        </entry>
      </file>
      <file pinned="false" current-in-tab="false">
        <entry file="file://$PROJECT_DIR$/uwsgi2.log">
          <provider selected="true" editor-type-id="text-editor">
            <state relative-caret-position="-1555" />
          </provider>
        </entry>
      </file>
    </leaf>
  </component>
  <component name="FileTemplateManagerImpl">
    <option name="RECENT_TEMPLATES">
      <list>
        <option value="Python Script" />
        <option value="HTML File" />
      </list>
    </option>
  </component>
  <component name="FindInProjectRecents">
    <findStrings>
      <find>Address</find>
      <find>GoodsSKU</find>
    </findStrings>
  </component>
  <component name="IdeDocumentHistory">
    <option name="CHANGED_PATHS">
      <list>
        <option value="$PROJECT_DIR$/db/base_model.py" />
        <option value="$PROJECT_DIR$/dailyfresh/__init__.py" />
        <option value="$USER_HOME$/.virtualenvs/bj16_py3/lib/python3.5/site-packages/django/views/generic/base.py" />
        <option value="$PROJECT_DIR$/static/detail.html" />
        <option value="$PROJECT_DIR$/templates/base_no_cart.html" />
        <option value="$PROJECT_DIR$/templates/register.html" />
        <option value="$PROJECT_DIR$/apps/user/models.py" />
        <option value="$PROJECT_DIR$/static/css/main.css" />
        <option value="$PROJECT_DIR$/templates/user_center_site.html" />
        <option value="$PROJECT_DIR$/templates/login.html" />
        <option value="$PROJECT_DIR$/templates/static_base.html" />
        <option value="$PROJECT_DIR$/templates/static_index.html" />
        <option value="$PROJECT_DIR$/apps/goods/admin.py" />
        <option value="$PROJECT_DIR$/templates/index.html" />
        <option value="$PROJECT_DIR$/templates/base_detail_list.html" />
        <option value="$PROJECT_DIR$/apps/goods/views.py" />
        <option value="$PROJECT_DIR$/templates/list.html" />
        <option value="$PROJECT_DIR$/apps/goods/search_indexes.py" />
        <option value="$PROJECT_DIR$/templates/search/indexes/goods/goodssku_text.txt" />
        <option value="$PROJECT_DIR$/dailyfresh/urls.py" />
        <option value="$PROJECT_DIR$/templates/search/search.html" />
        <option value="$PROJECT_DIR$/utils/mixin.py" />
        <option value="$PROJECT_DIR$/apps/cart/urls.py" />
        <option value="$PROJECT_DIR$/templates/cart.html" />
        <option value="$PROJECT_DIR$/apps/cart/views.py" />
        <option value="$PROJECT_DIR$/templates/base.html" />
        <option value="$PROJECT_DIR$/templates/base_user_center.html" />
        <option value="$PROJECT_DIR$/apps/order/models.py" />
        <option value="$PROJECT_DIR$/templates/place_order.html" />
        <option value="$PROJECT_DIR$/apps/order/migrations/alipay_public_key.pem" />
        <option value="$PROJECT_DIR$/apps/goods/urls.py" />
        <option value="$PROJECT_DIR$/templates/user_center_order.html" />
        <option value="$PROJECT_DIR$/templates/detail.html" />
        <option value="$PROJECT_DIR$/apps/order/views.py" />
        <option value="$PROJECT_DIR$/utils/fdfs/storage.py" />
        <option value="$PROJECT_DIR$/templates/user_center_info.html" />
        <option value="$PROJECT_DIR$/apps/goods/models.py" />
        <option value="$PROJECT_DIR$/apps/user/views.py" />
        <option value="$PROJECT_DIR$/static/test.html" />
        <option value="$PROJECT_DIR$/celery_tasks/tasks.py" />
        <option value="$PROJECT_DIR$/apps/order/urls.py" />
        <option value="$PROJECT_DIR$/apps/user/urls.py" />
        <option value="$PROJECT_DIR$/uwsgi2.pid" />
        <option value="$PROJECT_DIR$/uwsgi.ini" />
        <option value="$PROJECT_DIR$/dailyfresh/settings.py" />
        <option value="$PROJECT_DIR$/utils/fdfs/client.conf" />
        <option value="$PROJECT_DIR$/uwsgi2.ini" />
      </list>
    </option>
  </component>
  <component name="ProjectFrameBounds" extendedState="6">
    <option name="x" value="65" />
    <option name="y" value="-4" />
    <option name="width" value="735" />
    <option name="height" value="604" />
  </component>
  <component name="ProjectView">
    <navigator proportions="" version="1">
      <foldersAlwaysOnTop value="true" />
    </navigator>
    <panes>
      <pane id="ProjectPane">
        <subPane>
          <expand>
            <path>
              <item name="dailyfresh" type="b2602c69:ProjectViewProjectNode" />
              <item name="dailyfresh" type="462c0819:PsiDirectoryNode" />
            </path>
            <path>
              <item name="dailyfresh" type="b2602c69:ProjectViewProjectNode" />
              <item name="dailyfresh" type="462c0819:PsiDirectoryNode" />
              <item name="apps" type="462c0819:PsiDirectoryNode" />
            </path>
            <path>
              <item name="dailyfresh" type="b2602c69:ProjectViewProjectNode" />
              <item name="dailyfresh" type="462c0819:PsiDirectoryNode" />
              <item name="apps" type="462c0819:PsiDirectoryNode" />
              <item name="goods" type="462c0819:PsiDirectoryNode" />
            </path>
            <path>
              <item name="dailyfresh" type="b2602c69:ProjectViewProjectNode" />
              <item name="dailyfresh" type="462c0819:PsiDirectoryNode" />
              <item name="apps" type="462c0819:PsiDirectoryNode" />
              <item name="order" type="462c0819:PsiDirectoryNode" />
            </path>
            <path>
              <item name="dailyfresh" type="b2602c69:ProjectViewProjectNode" />
              <item name="dailyfresh" type="462c0819:PsiDirectoryNode" />
              <item name="apps" type="462c0819:PsiDirectoryNode" />
              <item name="user" type="462c0819:PsiDirectoryNode" />
            </path>
            <path>
              <item name="dailyfresh" type="b2602c69:ProjectViewProjectNode" />
              <item name="dailyfresh" type="462c0819:PsiDirectoryNode" />
              <item name="celery_tasks" type="462c0819:PsiDirectoryNode" />
            </path>
            <path>
              <item name="dailyfresh" type="b2602c69:ProjectViewProjectNode" />
              <item name="dailyfresh" type="462c0819:PsiDirectoryNode" />
              <item name="dailyfresh" type="462c0819:PsiDirectoryNode" />
            </path>
            <path>
              <item name="dailyfresh" type="b2602c69:ProjectViewProjectNode" />
              <item name="dailyfresh" type="462c0819:PsiDirectoryNode" />
              <item name="utils" type="462c0819:PsiDirectoryNode" />
            </path>
            <path>
              <item name="dailyfresh" type="b2602c69:ProjectViewProjectNode" />
              <item name="dailyfresh" type="462c0819:PsiDirectoryNode" />
              <item name="utils" type="462c0819:PsiDirectoryNode" />
              <item name="fdfs" type="462c0819:PsiDirectoryNode" />
            </path>
          </expand>
          <select />
        </subPane>
      </pane>
      <pane id="Scope" />
    </panes>
  </component>
  <component name="PropertiesComponent">
    <property name="DefaultHtmlFileTemplate" value="HTML File" />
    <property name="WebServerToolWindowFactoryState" value="false" />
    <property name="js-jscs-nodeInterpreter" value="/usr/local/bin/node" />
    <property name="last_opened_file_path" value="$PROJECT_DIR$" />
    <property name="node.js.detected.package.eslint" value="true" />
    <property name="node.js.path.for.package.eslint" value="project" />
    <property name="node.js.selected.package.eslint" value="(autodetect)" />
    <property name="settings.editor.selected.configurable" value="editor.preferences.fonts.default" />
  </component>
  <component name="RecentsManager">
    <key name="CopyFile.RECENT_KEYS">
      <recent name="$PROJECT_DIR$" />
      <recent name="$PROJECT_DIR$/templates" />
      <recent name="$PROJECT_DIR$/apps/order" />
      <recent name="$PROJECT_DIR$/templates/search" />
      <recent name="$PROJECT_DIR$/utils/fdfs" />
    </key>
    <key name="MoveFile.RECENT_KEYS">
      <recent name="$PROJECT_DIR$/apps/order" />
      <recent name="$PROJECT_DIR$/apps" />
    </key>
  </component>
  <component name="RunDashboard">
    <option name="ruleStates">
      <list>
        <RuleState>
          <option name="name" value="ConfigurationTypeDashboardGroupingRule" />
        </RuleState>
        <RuleState>
          <option name="name" value="StatusDashboardGroupingRule" />
        </RuleState>
      </list>
    </option>
  </component>
  <component name="RunManager">
    <configuration default="true" type="tests" factoryName="Attests">
      <option name="INTERPRETER_OPTIONS" value="" />
      <option name="PARENT_ENVS" value="true" />
      <envs />
      <option name="SDK_HOME" value="" />
      <option name="WORKING_DIRECTORY" value="" />
      <option name="IS_MODULE_SDK" value="false" />
      <option name="ADD_CONTENT_ROOTS" value="true" />
      <option name="ADD_SOURCE_ROOTS" value="true" />
      <module name="dailyfresh" />
      <EXTENSION ID="PythonCoverageRunConfigurationExtension" enabled="false" sample_coverage="true" runner="coverage.py" />
      <option name="SCRIPT_NAME" value="" />
      <option name="CLASS_NAME" value="" />
      <option name="METHOD_NAME" value="" />
      <option name="FOLDER_NAME" value="" />
      <option name="TEST_TYPE" value="TEST_SCRIPT" />
      <option name="PATTERN" value="" />
      <option name="USE_PATTERN" value="false" />
      <method />
    </configuration>
    <configuration name="dailyfresh" type="Python.DjangoServer" factoryName="Django server">
      <module name="dailyfresh" />
      <option name="INTERPRETER_OPTIONS" value="" />
      <option name="PARENT_ENVS" value="true" />
      <envs>
        <env name="PYTHONUNBUFFERED" value="1" />
      </envs>
      <option name="SDK_HOME" value="" />
      <option name="WORKING_DIRECTORY" value="" />
      <option name="IS_MODULE_SDK" value="false" />
      <option name="ADD_CONTENT_ROOTS" value="true" />
      <option name="ADD_SOURCE_ROOTS" value="true" />
      <option name="launchJavascriptDebuger" value="false" />
      <option name="port" value="8000" />
      <option name="host" value="" />
      <option name="additionalOptions" value="" />
      <option name="browserUrl" value="" />
      <option name="runTestServer" value="false" />
      <option name="runNoReload" value="false" />
      <option name="useCustomRunCommand" value="false" />
      <option name="customRunCommand" value="" />
      <method v="2" />
    </configuration>
    <configuration default="true" type="js.build_tools.gulp">
      <node-interpreter>project</node-interpreter>
      <node-options />
      <gulpfile />
      <tasks />
      <arguments />
      <envs />
      <method v="2" />
    </configuration>
  </component>
  <component name="SvnConfiguration">
    <configuration />
  </component>
  <component name="TaskManager">
    <task active="true" id="Default" summary="Default task">
      <changelist id="8237aec5-5bff-4b6f-a21a-cd6747db5f5d" name="Default" comment="" />
      <created>1510566739293</created>
      <option name="number" value="Default" />
      <option name="presentableId" value="Default" />
      <updated>1510566739293</updated>
      <workItem from="1558708296375" duration="85000" />
      <workItem from="1558746359408" duration="450000" />
      <workItem from="1558750380836" duration="15877000" />
      <workItem from="1558845644952" duration="7330000" />
      <workItem from="1558868487137" duration="6475000" />
      <workItem from="1558879898647" duration="3028000" />
      <workItem from="1558931650256" duration="1334000" />
    </task>
    <servers />
  </component>
  <component name="TimeTrackingManager">
    <option name="totallyTimeSpent" value="34494000" />
  </component>
  <component name="ToolWindowManager">
    <frame x="64" y="-4" width="1299" height="630" extended-state="6" />
    <layout>
      <window_info content_ui="combo" id="Project" order="0" visible="true" weight="0.25502816" />
      <window_info id="Structure" order="1" side_tool="true" weight="0.25" />
      <window_info id="Favorites" order="2" side_tool="true" />
      <window_info anchor="bottom" id="Message" order="0" />
      <window_info anchor="bottom" id="Find" order="1" />
      <window_info anchor="bottom" id="Run" order="2" />
      <window_info anchor="bottom" id="Debug" order="3" weight="0.4" />
      <window_info anchor="bottom" id="Cvs" order="4" weight="0.25" />
      <window_info anchor="bottom" id="Inspection" order="5" weight="0.4" />
      <window_info anchor="bottom" id="TODO" order="6" />
      <window_info anchor="bottom" id="Version Control" order="7" show_stripe_button="false" />
      <window_info anchor="bottom" id="Python Console" order="8" sideWeight="0.49711815" weight="0.562323" />
      <window_info active="true" anchor="bottom" id="Terminal" order="9" sideWeight="0.49423632" visible="true" weight="0.268714" />
      <window_info anchor="bottom" id="Docker" order="10" show_stripe_button="false" />
      <window_info anchor="bottom" id="Database Changes" order="11" show_stripe_button="false" />
      <window_info anchor="bottom" id="Event Log" order="12" sideWeight="0.5028818" side_tool="true" weight="0.562323" />
      <window_info anchor="right" id="Commander" order="0" weight="0.4" />
      <window_info anchor="right" id="Ant Build" order="1" weight="0.25" />
      <window_info anchor="right" content_ui="combo" id="Hierarchy" order="2" weight="0.25" />
      <window_info anchor="right" id="SciView" order="3" />
      <window_info anchor="right" id="Database" order="4" />
    </layout>
  </component>
  <component name="TypeScriptGeneratedFilesManager">
    <option name="version" value="1" />
  </component>
  <component name="Vcs.Log.UiProperties">
    <option name="RECENTLY_FILTERED_USER_GROUPS">
      <collection />
    </option>
    <option name="RECENTLY_FILTERED_BRANCH_GROUPS">
      <collection />
    </option>
  </component>
  <component name="editorHistoryManager">
    <entry file="file://$PROJECT_DIR$/apps/order/views.py">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="1431">
          <caret line="385" column="60" selection-start-line="385" selection-start-column="18" selection-end-line="385" selection-end-column="60" />
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/apps/order/models.py">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="666">
          <caret line="38" column="16" selection-start-line="38" selection-start-column="8" selection-end-line="38" selection-end-column="16" />
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/apps/order/__init__.py">
      <provider selected="true" editor-type-id="text-editor" />
    </entry>
    <entry file="file://$PROJECT_DIR$/dailyfresh/__init__.py">
      <provider selected="true" editor-type-id="text-editor" />
    </entry>
    <entry file="file://$PROJECT_DIR$/../../../python36-env/pytest/Lib/site-packages/django/apps/registry.py" />
    <entry file="file://$PROJECT_DIR$/templates/static_base.html">
      <provider selected="true" editor-type-id="text-editor" />
    </entry>
    <entry file="file://$PROJECT_DIR$/templates/register.html">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="234">
          <caret line="19" column="29" lean-forward="true" selection-start-line="19" selection-start-column="29" selection-end-line="19" selection-end-column="29" />
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/../../../python36-env/pytest/Lib/site-packages/django/db/utils.py" />
    <entry file="file://$PROJECT_DIR$/../../../python36-env/pytest/Lib/importlib/__init__.py" />
    <entry file="file://$PROJECT_DIR$/../../../python36-env/pytest/Lib/site-packages/django/db/backends/mysql/base.py" />
    <entry file="file://$PROJECT_DIR$/../../../python36-env/pytest/Lib/site-packages/celery/app/base.py" />
    <entry file="file://$PROJECT_DIR$/../../../python36-env/pytest/Lib/site-packages/celery/fixups/django.py" />
    <entry file="file://$PROJECT_DIR$/apps/user/models.py">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="234">
          <caret line="15" column="37" selection-start-line="15" selection-start-column="37" selection-end-line="15" selection-end-column="37" />
          <folding>
            <element signature="e#0#28#0" expanded="true" />
          </folding>
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/templates/login.html">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="252">
          <caret line="14" column="50" selection-start-line="14" selection-start-column="50" selection-end-line="14" selection-end-column="50" />
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/db/base_model.py">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="198">
          <caret line="11" column="23" selection-start-line="11" selection-start-column="23" selection-end-line="11" selection-end-column="23" />
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/db/__init__.py">
      <provider selected="true" editor-type-id="text-editor" />
    </entry>
    <entry file="file://$PROJECT_DIR$/utils/fdfs/__init__.py">
      <provider selected="true" editor-type-id="text-editor" />
    </entry>
    <entry file="file://$PROJECT_DIR$/apps/user/views.py">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="1168">
          <caret line="398" column="19" selection-start-line="398" selection-start-column="19" selection-end-line="398" selection-end-column="19" />
          <folding>
            <element signature="e#0#44#0" expanded="true" />
            <element signature="e#857#2172#0" />
            <element signature="e#2209#3221#0" />
            <element signature="e#4981#5557#0" />
            <element signature="e#5601#7347#0" />
          </folding>
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/apps/user/admin.py">
      <provider selected="true" editor-type-id="text-editor" />
    </entry>
    <entry file="file://$PROJECT_DIR$/apps/user/tests.py">
      <provider selected="true" editor-type-id="text-editor" />
    </entry>
    <entry file="file://$PROJECT_DIR$/utils/__init__.py">
      <provider selected="true" editor-type-id="text-editor" />
    </entry>
    <entry file="file://$PROJECT_DIR$/utils/mixin.py">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="144">
          <caret line="8" column="35" selection-start-line="8" selection-start-column="35" selection-end-line="8" selection-end-column="35" />
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/static/index.html">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="54">
          <caret line="3" column="52" selection-start-line="3" selection-start-column="52" selection-end-line="3" selection-end-column="52" />
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/apps/goods/models.py">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="378">
          <caret line="21" column="26" selection-start-line="21" selection-start-column="26" selection-end-line="21" selection-end-column="26" />
          <folding>
            <element signature="e#0#28#0" expanded="true" />
          </folding>
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/static/test.html">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="126">
          <caret line="7" column="26" selection-start-line="7" selection-start-column="26" selection-end-line="7" selection-end-column="26" />
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/static/place_order.html">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="162">
          <caret line="9" column="28" lean-forward="true" selection-start-line="9" selection-start-column="28" selection-end-line="9" selection-end-column="28" />
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/templates/base.html">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="504">
          <caret line="28" column="54" selection-start-line="28" selection-start-column="54" selection-end-line="28" selection-end-column="54" />
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/templates/order_comment.html">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="90">
          <caret line="5" column="44" lean-forward="true" selection-start-line="5" selection-start-column="44" selection-end-line="5" selection-end-column="44" />
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/apps/goods/views.py">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="630">
          <caret line="42" column="38" selection-start-line="42" selection-start-column="38" selection-end-line="42" selection-end-column="38" />
          <folding>
            <element signature="e#0#45#0" expanded="true" />
          </folding>
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/apps/order/urls.py">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="54">
          <caret line="4" column="17" selection-start-line="4" selection-start-column="17" selection-end-line="4" selection-end-column="17" />
          <folding>
            <element signature="e#0#32#0" expanded="true" />
          </folding>
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/apps/user/urls.py">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="324">
          <caret line="20" column="38" selection-start-line="20" selection-start-column="38" selection-end-line="20" selection-end-column="38" />
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/apps/goods/urls.py">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="162">
          <caret line="9" selection-start-line="9" selection-end-line="9" />
          <folding>
            <element signature="e#0#32#0" expanded="true" />
          </folding>
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/templates/search/indexes/goods/goodssku_text.txt">
      <provider selected="true" editor-type-id="text-editor" />
    </entry>
    <entry file="file://$PROJECT_DIR$/templates/search/search.html">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="540">
          <caret line="30" column="30" selection-start-line="30" selection-start-column="30" selection-end-line="30" selection-end-column="30" />
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/templates/index.html">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="558">
          <caret line="31" column="40" selection-start-line="31" selection-start-column="40" selection-end-line="31" selection-end-column="40" />
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/dailyfresh/urls.py">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="78">
          <caret line="19" column="46" selection-start-line="19" selection-start-column="46" selection-end-line="19" selection-end-column="46" />
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/uwsgi2.pid">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="18">
          <caret line="1" lean-forward="true" selection-start-line="1" selection-end-line="1" />
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/uwsgi.pid">
      <provider selected="true" editor-type-id="text-editor" />
    </entry>
    <entry file="file://$PROJECT_DIR$/dailyfresh/wsgi.py">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="234">
          <caret line="15" column="36" lean-forward="true" selection-start-line="15" selection-start-column="36" selection-end-line="15" selection-end-column="36" />
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/apps/goods/search_indexes.py">
      <provider selected="true" editor-type-id="text-editor">
        <state>
          <folding>
            <element signature="e#8#36#0" expanded="true" />
          </folding>
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/celery_tasks/tasks.py">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="90">
          <caret line="5" column="11" selection-start-line="5" selection-start-column="11" selection-end-line="5" selection-end-column="11" />
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/apps/order/admin.py">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="54">
          <caret line="3" lean-forward="true" selection-start-line="3" selection-end-line="3" />
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/apps/goods/admin.py">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="180">
          <caret line="10" selection-start-line="10" selection-end-line="10" />
          <folding>
            <element signature="e#0#32#0" expanded="true" />
          </folding>
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/dailyfresh/settings.py">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="193">
          <caret line="153" column="31" lean-forward="true" selection-start-line="153" selection-start-column="31" selection-end-line="153" selection-end-column="31" />
          <folding>
            <element signature="e#383#392#0" expanded="true" />
          </folding>
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/utils/fdfs/storage.py">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="144">
          <caret line="10" column="51" selection-start-line="10" selection-start-column="51" selection-end-line="10" selection-end-column="51" />
          <folding>
            <element signature="e#0#45#0" expanded="true" />
          </folding>
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/utils/fdfs/client.conf">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="252">
          <caret line="14" selection-start-line="14" selection-end-line="14" />
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/manage.py">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="162">
          <caret line="10" selection-start-line="10" selection-end-line="10" />
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/uwsgi.ini">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="342">
          <caret line="19" column="11" selection-start-line="19" selection-start-column="11" selection-end-line="19" selection-end-column="40" />
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/uwsgi2.ini">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="342">
          <caret line="19" column="40" selection-start-line="19" selection-start-column="40" selection-end-line="19" selection-end-column="40" />
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/uwsgi2.log">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="-1555" />
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/uwsgi.log">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="-781">
          <caret line="1140" column="40" selection-start-line="1140" selection-start-column="40" selection-end-line="1140" selection-end-column="40" />
        </state>
      </provider>
    </entry>
  </component>
</project>

================================================
FILE: dailyfresh/apps/__init__.py
================================================


================================================
FILE: dailyfresh/apps/cart/__init__.py
================================================


================================================
FILE: dailyfresh/apps/cart/admin.py
================================================
from django.contrib import admin

# Register your models here.


================================================
FILE: dailyfresh/apps/cart/migrations/__init__.py
================================================


================================================
FILE: dailyfresh/apps/cart/models.py
================================================
from django.db import models

# Create your models here.


================================================
FILE: dailyfresh/apps/cart/tests.py
================================================
from django.test import TestCase

# Create your tests here.


================================================
FILE: dailyfresh/apps/cart/urls.py
================================================
from django.conf.urls import url
from cart.views import CartAddView, CartInfoView, CartUpdateView, CartDeleteView

urlpatterns = [
    url(r'^add$', CartAddView.as_view(), name='add'), # 购物车记录添加
    url(r'^$', CartInfoView.as_view(), name='show'), # 购物车页面显示
    url(r'^update$', CartUpdateView.as_view(), name='update'), # 购物车记录更新
    url(r'^delete$', CartDeleteView.as_view(), name='delete'), # 购物车记录删除
]


================================================
FILE: dailyfresh/apps/cart/views.py
================================================
from django.shortcuts import render
from django.views.generic import View
from django.http import JsonResponse

from goods.models import GoodsSKU
from django_redis import get_redis_connection
from utils.mixin import LoginRequiredMixin

# Create your views here.
# 添加商品到购物车:
# 1)请求方式,采用ajax post
# 如果涉及到数据的修改(新增,更新,删除), 采用post
# 如果只涉及到数据的获取,采用get
# 2) 传递参数: 商品id(sku_id) 商品数量(count)


# ajax发起的请求都在后台,在浏览器中看不到效果
# /cart/add
class CartAddView(View):
    '''购物车记录添加'''
    def post(self, request):
        '''购物车记录添加'''
        user = request.user
        if not user.is_authenticated():
            # 用户未登录
            return JsonResponse({'res':0, 'errmsg':'请先登录'})

        # 接收数据
        sku_id = request.POST.get('sku_id')
        count = request.POST.get('count')

        # 数据校验
        if not all([sku_id, count]):
            return JsonResponse({'res':1, 'errmsg':'数据不完整'})

        # 校验添加的商品数量
        try:
            count = int(count)
        except Exception as e:
            # 数目出错
            return JsonResponse({'res':2, 'errmsg':'商品数目出错'})

        # 校验商品是否存在
        try:
            sku = GoodsSKU.objects.get(id=sku_id)
        except GoodsSKU.DoesNotExist:
            # 商品不存在
            return JsonResponse({'res':3, 'errmsg':'商品不存在'})

        # 业务处理:添加购物车记录
        conn = get_redis_connection('default')
        cart_key = 'cart_%d'%user.id
        # 先尝试获取sku_id的值 -> hget cart_key 属性
        # 如果sku_id在hash中不存在,hget返回None
        cart_count = conn.hget(cart_key, sku_id)
        if cart_count:
            # 累加购物车中商品的数目
            count += int(cart_count)

        # 校验商品的库存
        if count > sku.stock:
            return JsonResponse({'res':4, 'errmsg':'商品库存不足'})

        # 设置hash中sku_id对应的值
        # hset->如果sku_id已经存在,更新数据, 如果sku_id不存在,添加数据
        conn.hset(cart_key, sku_id, count)

        # 计算用户购物车商品的条目数
        total_count = conn.hlen(cart_key)

        # 返回应答
        return JsonResponse({'res':5, 'total_count':total_count, 'message':'添加成功'})


# /cart/
class CartInfoView(LoginRequiredMixin, View):
    '''购物车页面显示'''
    def get(self, request):
        '''显示'''
        # 获取登录的用户
        user = request.user
        # 获取用户购物车中商品的信息
        conn = get_redis_connection('default')
        cart_key = 'cart_%d'%user.id
        # {'商品id':商品数量, ...}
        cart_dict = conn.hgetall(cart_key)

        skus = []
        # 保存用户购物车中商品的总数目和总价格
        total_count = 0
        total_price = 0
        # 遍历获取商品的信息
        for sku_id, count in cart_dict.items():
            # 根据商品的id获取商品的信息
            sku = GoodsSKU.objects.get(id=sku_id)
            # 计算商品的小计
            amount = sku.price*int(count)
            # 动态给sku对象增加一个属性amount, 保存商品的小计
            sku.amount = amount
            # 动态给sku对象增加一个属性count, 保存购物车中对应商品的数量
            sku.count = count
            # 添加
            skus.append(sku)

            # 累加计算商品的总数目和总价格
            total_count += int(count)
            total_price += amount

        # 组织上下文
        context = {'total_count':total_count,
                   'total_price':total_price,
                   'skus':skus}

        # 使用模板
        return render(request, 'cart.html', context)


# 更新购物车记录
# 采用ajax post请求
# 前端需要传递的参数:商品id(sku_id) 更新的商品数量(count)
# /cart/update
class CartUpdateView(View):
    '''购物车记录更新'''
    def post(self, request):
        '''购物车记录更新'''
        user = request.user
        if not user.is_authenticated():
            # 用户未登录
            return JsonResponse({'res': 0, 'errmsg': '请先登录'})

        # 接收数据
        sku_id = request.POST.get('sku_id')
        count = request.POST.get('count')

        # 数据校验
        if not all([sku_id, count]):
            return JsonResponse({'res': 1, 'errmsg': '数据不完整'})

        # 校验添加的商品数量
        try:
            count = int(count)
        except Exception as e:
            # 数目出错
            return JsonResponse({'res': 2, 'errmsg': '商品数目出错'})

        # 校验商品是否存在
        try:
            sku = GoodsSKU.objects.get(id=sku_id)
        except GoodsSKU.DoesNotExist:
            # 商品不存在
            return JsonResponse({'res': 3, 'errmsg': '商品不存在'})

        # 业务处理:更新购物车记录
        conn = get_redis_connection('default')
        cart_key = 'cart_%d'%user.id

        # 校验商品的库存
        if count > sku.stock:
            return JsonResponse({'res':4, 'errmsg':'商品库存不足'})

        # 更新
        conn.hset(cart_key, sku_id, count)

        # 计算用户购物车中商品的总件数 {'1':5, '2':3}
        total_count = 0
        vals = conn.hvals(cart_key)
        for val in vals:
            total_count += int(val)

        # 返回应答
        return JsonResponse({'res':5, 'total_count':total_count, 'message':'更新成功'})


# 删除购物车记录
# 采用ajax post请求
# 前端需要传递的参数:商品的id(sku_id)
# /cart/delete
class CartDeleteView(View):
    '''购物车记录删除'''
    def post(self, request):
        '''购物车记录删除'''
        user = request.user
        if not user.is_authenticated():
            # 用户未登录
            return JsonResponse({'res': 0, 'errmsg': '请先登录'})

        # 接收参数
        sku_id = request.POST.get('sku_id')

        # 数据的校验
        if not sku_id:
            return JsonResponse({'res':1, 'errmsg':'无效的商品id'})

        # 校验商品是否存在
        try:
            sku = GoodsSKU.objects.get(id=sku_id)
        except GoodsSKU.DoesNotExist:
            # 商品不存在
            return JsonResponse({'res':2, 'errmsg':'商品不存在'})

        # 业务处理:删除购物车记录
        conn = get_redis_connection('default')
        cart_key = 'cart_%d'%user.id

        # 删除 hdel
        conn.hdel(cart_key, sku_id)

        # 计算用户购物车中商品的总件数 {'1':5, '2':3}
        total_count = 0
        vals = conn.hvals(cart_key)
        for val in vals:
            total_count += int(val)

        # 返回应答
        return JsonResponse({'res':3, 'total_count':total_count, 'message':'删除成功'})
















================================================
FILE: dailyfresh/apps/goods/__init__.py
================================================


================================================
FILE: dailyfresh/apps/goods/admin.py
================================================
from django.contrib import admin
from django.core.cache import cache
from goods.models import GoodsType,IndexPromotionBanner,IndexGoodsBanner,IndexTypeGoodsBanner
# Register your models here.


class BaseModelAdmin(admin.ModelAdmin):
    def save_model(self, request, obj, form, change):
        '''新增或更新表中的数据时调用'''
        super().save_model(request, obj, form, change)

        # 发出任务,让celery worker重新生成首页静态页
        from celery_tasks.tasks import generate_static_index_html
        generate_static_index_html.delay()

        # 清除首页的缓存数据
        cache.delete('index_page_data')

    def delete_model(self, request, obj):
        '''删除表中的数据时调用'''
        super().delete_model(request, obj)
        # 发出任务,让celery worker重新生成首页静态页
        from celery_tasks.tasks import generate_static_index_html
        generate_static_index_html.delay()

        # 清除首页的缓存数据
        cache.delete('index_page_data')


class GoodsTypeAdmin(BaseModelAdmin):
    pass


class IndexGoodsBannerAdmin(BaseModelAdmin):
    pass


class IndexTypeGoodsBannerAdmin(BaseModelAdmin):
    pass


class IndexPromotionBannerAdmin(BaseModelAdmin):
    pass


admin.site.register(GoodsType, GoodsTypeAdmin)
admin.site.register(IndexGoodsBanner, IndexGoodsBannerAdmin)
admin.site.register(IndexTypeGoodsBanner, IndexTypeGoodsBannerAdmin)
admin.site.register(IndexPromotionBanner, IndexPromotionBannerAdmin)


================================================
FILE: dailyfresh/apps/goods/migrations/0001_initial.py
================================================
# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.db import models, migrations
import tinymce.models


class Migration(migrations.Migration):

    dependencies = [
    ]

    operations = [
        migrations.CreateModel(
            name='Goods',
            fields=[
                ('id', models.AutoField(verbose_name='ID', serialize=False, primary_key=True, auto_created=True)),
                ('create_time', models.DateTimeField(verbose_name='创建时间', auto_now_add=True)),
                ('update_time', models.DateTimeField(verbose_name='更新时间', auto_now=True)),
                ('is_delete', models.BooleanField(verbose_name='删除标记', default=False)),
                ('name', models.CharField(verbose_name='商品SPU名称', max_length=20)),
                ('detail', tinymce.models.HTMLField(verbose_name='商品详情', blank=True)),
            ],
            options={
                'verbose_name': '商品SPU',
                'db_table': 'df_goods',
                'verbose_name_plural': '商品SPU',
            },
        ),
        migrations.CreateModel(
            name='GoodsImage',
            fields=[
                ('id', models.AutoField(verbose_name='ID', serialize=False, primary_key=True, auto_created=True)),
                ('create_time', models.DateTimeField(verbose_name='创建时间', auto_now_add=True)),
                ('update_time', models.DateTimeField(verbose_name='更新时间', auto_now=True)),
                ('is_delete', models.BooleanField(verbose_name='删除标记', default=False)),
                ('image', models.ImageField(verbose_name='图片路径', upload_to='goods')),
            ],
            options={
                'verbose_name': '商品图片',
                'db_table': 'df_goods_image',
                'verbose_name_plural': '商品图片',
            },
        ),
        migrations.CreateModel(
            name='GoodsSKU',
            fields=[
                ('id', models.AutoField(verbose_name='ID', serialize=False, primary_key=True, auto_created=True)),
                ('create_time', models.DateTimeField(verbose_name='创建时间', auto_now_add=True)),
                ('update_time', models.DateTimeField(verbose_name='更新时间', auto_now=True)),
                ('is_delete', models.BooleanField(verbose_name='删除标记', default=False)),
                ('name', models.CharField(verbose_name='商品名称', max_length=20)),
                ('desc', models.CharField(verbose_name='商品简介', max_length=256)),
                ('price', models.DecimalField(verbose_name='商品价格', max_digits=10, decimal_places=2)),
                ('unite', models.CharField(verbose_name='商品单位', max_length=20)),
                ('image', models.ImageField(verbose_name='商品图片', upload_to='goods')),
                ('stock', models.IntegerField(verbose_name='商品库存', default=1)),
                ('sales', models.IntegerField(verbose_name='商品销量', default=0)),
                ('status', models.SmallIntegerField(verbose_name='商品状态', default=1, choices=[(0, '下线'), (1, '上线')])),
                ('goods', models.ForeignKey(verbose_name='商品SPU', to='goods.Goods')),
            ],
            options={
                'verbose_name': '商品',
                'db_table': 'df_goods_sku',
                'verbose_name_plural': '商品',
            },
        ),
        migrations.CreateModel(
            name='GoodsType',
            fields=[
                ('id', models.AutoField(verbose_name='ID', serialize=False, primary_key=True, auto_created=True)),
                ('create_time', models.DateTimeField(verbose_name='创建时间', auto_now_add=True)),
                ('update_time', models.DateTimeField(verbose_name='更新时间', auto_now=True)),
                ('is_delete', models.BooleanField(verbose_name='删除标记', default=False)),
                ('name', models.CharField(verbose_name='种类名称', max_length=20)),
                ('logo', models.CharField(verbose_name='标识', max_length=20)),
                ('image', models.ImageField(verbose_name='商品类型图片', upload_to='type')),
            ],
            options={
                'verbose_name': '商品种类',
                'db_table': 'df_goods_type',
                'verbose_name_plural': '商品种类',
            },
        ),
        migrations.CreateModel(
            name='IndexGoodsBanner',
            fields=[
                ('id', models.AutoField(verbose_name='ID', serialize=False, primary_key=True, auto_created=True)),
                ('create_time', models.DateTimeField(verbose_name='创建时间', auto_now_add=True)),
                ('update_time', models.DateTimeField(verbose_name='更新时间', auto_now=True)),
                ('is_delete', models.BooleanField(verbose_name='删除标记', default=False)),
                ('image', models.ImageField(verbose_name='图片', upload_to='banner')),
                ('index', models.SmallIntegerField(verbose_name='展示顺序', default=0)),
                ('sku', models.ForeignKey(verbose_name='商品', to='goods.GoodsSKU')),
            ],
            options={
                'verbose_name': '首页轮播商品',
                'db_table': 'df_index_banner',
                'verbose_name_plural': '首页轮播商品',
            },
        ),
        migrations.CreateModel(
            name='IndexPromotionBanner',
            fields=[
                ('id', models.AutoField(verbose_name='ID', serialize=False, primary_key=True, auto_created=True)),
                ('create_time', models.DateTimeField(verbose_name='创建时间', auto_now_add=True)),
                ('update_time', models.DateTimeField(verbose_name='更新时间', auto_now=True)),
                ('is_delete', models.BooleanField(verbose_name='删除标记', default=False)),
                ('name', models.CharField(verbose_name='活动名称', max_length=20)),
                ('url', models.URLField(verbose_name='活动链接')),
                ('image', models.ImageField(verbose_name='活动图片', upload_to='banner')),
                ('index', models.SmallIntegerField(verbose_name='展示顺序', default=0)),
            ],
            options={
                'verbose_name': '主页促销活动',
                'db_table': 'df_index_promotion',
                'verbose_name_plural': '主页促销活动',
            },
        ),
        migrations.CreateModel(
            name='IndexTypeGoodsBanner',
            fields=[
                ('id', models.AutoField(verbose_name='ID', serialize=False, primary_key=True, auto_created=True)),
                ('create_time', models.DateTimeField(verbose_name='创建时间', auto_now_add=True)),
                ('update_time', models.DateTimeField(verbose_name='更新时间', auto_now=True)),
                ('is_delete', models.BooleanField(verbose_name='删除标记', default=False)),
                ('display_type', models.SmallIntegerField(verbose_name='展示类型', default=1, choices=[(0, '标题'), (1, '图片')])),
                ('index', models.SmallIntegerField(verbose_name='展示顺序', default=0)),
                ('sku', models.ForeignKey(verbose_name='商品SKU', to='goods.GoodsSKU')),
                ('type', models.ForeignKey(verbose_name='商品类型', to='goods.GoodsType')),
            ],
            options={
                'verbose_name': '主页分类展示商品',
                'db_table': 'df_index_type_goods',
                'verbose_name_plural': '主页分类展示商品',
            },
        ),
        migrations.AddField(
            model_name='goodssku',
            name='type',
            field=models.ForeignKey(verbose_name='商品种类', to='goods.GoodsType'),
        ),
        migrations.AddField(
            model_name='goodsimage',
            name='sku',
            field=models.ForeignKey(verbose_name='商品', to='goods.GoodsSKU'),
        ),
    ]


================================================
FILE: dailyfresh/apps/goods/migrations/__init__.py
================================================


================================================
FILE: dailyfresh/apps/goods/models.py
================================================
from django.db import models
from db.base_model import BaseModel
from tinymce.models import HTMLField
# Create your models here.


class GoodsType(BaseModel):
    '''商品类型模型类'''
    name = models.CharField(max_length=20, verbose_name='种类名称')
    logo = models.CharField(max_length=20, verbose_name='标识')
    image = models.ImageField(upload_to='type', verbose_name='商品类型图片')

    class Meta:
        db_table = 'df_goods_type'
        verbose_name = '商品种类'
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.name


class GoodsSKU(BaseModel):
    '''商品SKU模型类'''
    status_choices = (
        (0, '下线'),
        (1, '上线'),
    )

    type = models.ForeignKey('GoodsType', verbose_name='商品种类')
    goods = models.ForeignKey('Goods', verbose_name='商品SPU')
    name = models.CharField(max_length=20, verbose_name='商品名称')
    desc = models.CharField(max_length=256, verbose_name='商品简介')
    price = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='商品价格')
    unite = models.CharField(max_length=20, verbose_name='商品单位')
    image = models.ImageField(upload_to='goods', verbose_name='商品图片')
    stock = models.IntegerField(default=1, verbose_name='商品库存')
    sales = models.IntegerField(default=0, verbose_name='商品销量')
    status = models.SmallIntegerField(default=1, choices=status_choices, verbose_name='商品状态')

    class Meta:
        db_table = 'df_goods_sku'
        verbose_name = '商品'
        verbose_name_plural = verbose_name


class Goods(BaseModel):
    '''商品SPU模型类'''
    name = models.CharField(max_length=20, verbose_name='商品SPU名称')
    # 富文本类型:带有格式的文本
    detail = HTMLField(blank=True, verbose_name='商品详情')

    class Meta:
        db_table = 'df_goods'
        verbose_name = '商品SPU'
        verbose_name_plural = verbose_name


class GoodsImage(BaseModel):
    '''商品图片模型类'''
    sku = models.ForeignKey('GoodsSKU', verbose_name='商品')
    image = models.ImageField(upload_to='goods', verbose_name='图片路径')

    class Meta:
        db_table = 'df_goods_image'
        verbose_name = '商品图片'
        verbose_name_plural = verbose_name


class IndexGoodsBanner(BaseModel):
    '''首页轮播商品展示模型类'''
    sku = models.ForeignKey('GoodsSKU', verbose_name='商品')
    image = models.ImageField(upload_to='banner', verbose_name='图片')
    index = models.SmallIntegerField(default=0, verbose_name='展示顺序') # 0 1 2 3

    class Meta:
        db_table = 'df_index_banner'
        verbose_name = '首页轮播商品'
        verbose_name_plural = verbose_name


class IndexTypeGoodsBanner(BaseModel):
    '''首页分类商品展示模型类'''
    DISPLAY_TYPE_CHOICES = (
        (0, "标题"),
        (1, "图片")
    )

    type = models.ForeignKey('GoodsType', verbose_name='商品类型')
    sku = models.ForeignKey('GoodsSKU', verbose_name='商品SKU')
    display_type = models.SmallIntegerField(default=1, choices=DISPLAY_TYPE_CHOICES, verbose_name='展示类型')
    index = models.SmallIntegerField(default=0, verbose_name='展示顺序')

    class Meta:
        db_table = 'df_index_type_goods'
        verbose_name = "主页分类展示商品"
        verbose_name_plural = verbose_name


class IndexPromotionBanner(BaseModel):
    '''首页促销活动模型类'''
    name = models.CharField(max_length=20, verbose_name='活动名称')
    url = models.CharField(max_length=256, verbose_name='活动链接')
    image = models.ImageField(upload_to='banner', verbose_name='活动图片')
    index = models.SmallIntegerField(default=0, verbose_name='展示顺序')

    class Meta:
        db_table = 'df_index_promotion'
        verbose_name = "主页促销活动"
        verbose_name_plural = verbose_name

================================================
FILE: dailyfresh/apps/goods/search_indexes.py
================================================
# 定义索引类
from haystack import indexes
# 导入你的模型类
from goods.models import GoodsSKU


# 指定对于某个类的某些数据建立索引
# 索引类名格式:模型类名+Index
class GoodsSKUIndex(indexes.SearchIndex, indexes.Indexable):
    # 索引字段 use_template=True指定根据表中的哪些字段建立索引文件的说明放在一个文件中
    text = indexes.CharField(document=True, use_template=True)

    def get_model(self):
        # 返回你的模型类
        return GoodsSKU

    # 建立索引的数据
    def index_queryset(self, using=None):
        return self.get_model().objects.all()


================================================
FILE: dailyfresh/apps/goods/tests.py
================================================
from django.test import TestCase

# Create your tests here.


================================================
FILE: dailyfresh/apps/goods/urls.py
================================================
from django.conf.urls import url
from goods.views import IndexView, DetailView, ListView

urlpatterns = [
    url(r'^index$', IndexView.as_view(), name='index'), # 首页
    url(r'^goods/(?P<goods_id>\d+)$', DetailView.as_view(), name='detail'), # 详情页
    url(r'^list/(?P<type_id>\d+)/(?P<page>\d+)$', ListView.as_view(), name='list'), # 列表页

]


================================================
FILE: dailyfresh/apps/goods/views.py
================================================
from django.shortcuts import render, redirect
from django.core.urlresolvers import reverse
from django.views.generic import View
from django.core.cache import cache
from django.core.paginator import Paginator
from goods.models import GoodsType, GoodsSKU, IndexGoodsBanner,IndexPromotionBanner,IndexTypeGoodsBanner
from django_redis import get_redis_connection
from order.models import OrderGoods
# Create your views here.

# class Test(object):
#     def __init__(self):
#         self.name = 'abc'
#
# t = Test()
# t.age = 10
# print(t.age)


# http://127.0.0.1:8000
class IndexView(View):
    '''首页'''
    def get(self, request):
        '''显示首页'''
        # 尝试从缓存中获取数据
        context = cache.get('index_page_data')

        if context is None:
            print('设置缓存')
            # 缓存中没有数据
            # 获取商品的种类信息
            types = GoodsType.objects.all()

            # 获取首页轮播商品信息
            goods_banners = IndexGoodsBanner.objects.all().order_by('index')

            # 获取首页促销活动信息
            promotion_banners = IndexPromotionBanner.objects.all().order_by('index')

            # 获取首页分类商品展示信息
            for type in types: # GoodsType
                # 获取type种类首页分类商品的图片展示信息
                image_banners = IndexTypeGoodsBanner.objects.filter(type=type, display_type=1).order_by('index')
                # 获取type种类首页分类商品的文字展示信息
                title_banners = IndexTypeGoodsBanner.objects.filter(type=type, display_type=0).order_by('index')

                # 动态给type增加属性,分别保存首页分类商品的图片展示信息和文字展示信息
                type.image_banners = image_banners
                type.title_banners = title_banners

            context = {'types': types,
                       'goods_banners': goods_banners,
                       'promotion_banners': promotion_banners}
            # 设置缓存
            # key  value timeout
            cache.set('index_page_data', context, 3600)

        # 获取用户购物车中商品的数目
        user = request.user
        cart_count = 0
        if user.is_authenticated():
            # 用户已登录
            conn = get_redis_connection('default')
            cart_key = 'cart_%d'%user.id
            cart_count = conn.hlen(cart_key)

        # 组织模板上下文
        context.update(cart_count=cart_count)

        # 使用模板
        return render(request, 'index.html', context)


# /goods/商品id
class DetailView(View):
    '''详情页'''
    def get(self, request, goods_id):
        '''显示详情页'''
        try:
            sku = GoodsSKU.objects.get(id=goods_id)
        except GoodsSKU.DoesNotExist:
            # 商品不存在
            return redirect(reverse('goods:index'))

        # 获取商品的分类信息
        types = GoodsType.objects.all()

        # 获取商品的评论信息
        sku_orders = OrderGoods.objects.filter(sku=sku).exclude(comment='')

        # 获取新品信息
        new_skus = GoodsSKU.objects.filter(type=sku.type).order_by('-create_time')[:2]

        # 获取同一个SPU的其他规格商品
        same_spu_skus = GoodsSKU.objects.filter(goods=sku.goods).exclude(id=goods_id)

        # 获取用户购物车中商品的数目
        user = request.user
        cart_count = 0
        if user.is_authenticated():
            # 用户已登录
            conn = get_redis_connection('default')
            cart_key = 'cart_%d' % user.id
            cart_count = conn.hlen(cart_key)

            # 添加用户的历史记录
            conn = get_redis_connection('default')
            history_key = 'history_%d'%user.id
            # 移除列表中的goods_id
            conn.lrem(history_key, 0, goods_id)
            # 把goods_id插入到列表的左侧
            conn.lpush(history_key, goods_id)
            # 只保存用户最新浏览的5条信息
            conn.ltrim(history_key, 0, 4)

        # 组织模板上下文
        context = {'sku':sku, 'types':types,
                   'sku_orders':sku_orders,
                   'new_skus':new_skus,
                   'same_spu_skus':same_spu_skus,
                   'cart_count':cart_count}

        # 使用模板
        return render(request, 'detail.html', context)


# 种类id 页码 排序方式
# restful api -> 请求一种资源
# /list?type_id=种类id&page=页码&sort=排序方式
# /list/种类id/页码/排序方式
# /list/种类id/页码?sort=排序方式
class ListView(View):
    '''列表页'''
    def get(self, request, type_id, page):
        '''显示列表页'''
        # 获取种类信息
        try:
            type = GoodsType.objects.get(id=type_id)
        except GoodsType.DoesNotExist:
            # 种类不存在
            return redirect(reverse('goods:index'))

        # 获取商品的分类信息
        types = GoodsType.objects.all()

        # 获取排序的方式 # 获取分类商品的信息
        # sort=default 按照默认id排序
        # sort=price 按照商品价格排序
        # sort=hot 按照商品销量排序
        sort = request.GET.get('sort')

        if sort == 'price':
            skus = GoodsSKU.objects.filter(type=type).order_by('price')
        elif sort == 'hot':
            skus = GoodsSKU.objects.filter(type=type).order_by('-sales')
        else:
            sort = 'default'
            skus = GoodsSKU.objects.filter(type=type).order_by('-id')

        # 对数据进行分页
        paginator = Paginator(skus, 1)

        # 获取第page页的内容
        try:
            page = int(page)
        except Exception as e:
            page = 1

        if page > paginator.num_pages:
            page = 1

        # 获取第page页的Page实例对象
        skus_page = paginator.page(page)

        # todo: 进行页码的控制,页面上最多显示5个页码
        # 1.总页数小于5页,页面上显示所有页码
        # 2.如果当前页是前3页,显示1-5页
        # 3.如果当前页是后3页,显示后5页
        # 4.其他情况,显示当前页的前2页,当前页,当前页的后2页
        num_pages = paginator.num_pages
        if num_pages < 5:
            pages = range(1, num_pages+1)
        elif page <= 3:
            pages = range(1, 6)
        elif num_pages - page <= 2:
            pages = range(num_pages-4, num_pages+1)
        else:
            pages = range(page-2, page+3)

        # 获取新品信息
        new_skus = GoodsSKU.objects.filter(type=type).order_by('-create_time')[:2]

        # 获取用户购物车中商品的数目
        user = request.user
        cart_count = 0
        if user.is_authenticated():
            # 用户已登录
            conn = get_redis_connection('default')
            cart_key = 'cart_%d' % user.id
            cart_count = conn.hlen(cart_key)

        # 组织模板上下文
        context = {'type':type, 'types':types,
                   'skus_page':skus_page,
                   'new_skus':new_skus,
                   'cart_count':cart_count,
                   'pages':pages,
                   'sort':sort}

        # 使用模板
        return render(request, 'list.html', context)


















================================================
FILE: dailyfresh/apps/order/__init__.py
================================================


================================================
FILE: dailyfresh/apps/order/admin.py
================================================
from django.contrib import admin

# Register your models here.


================================================
FILE: dailyfresh/apps/order/alipay_public_key.pem
================================================
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAslvKn/bhdwTG4xLX7sDfyZ7Nj/jmmD9NMdupMpu+m+2ulGiXcFCbqC2s9VnxAoecNPEawQkR51Pv7Y76V0PD5LXTsnsKK5GHh9ufhHklaAXwHAazur4b5gfsKCIeqBQtjVt5/SpYY7ClazZEM+YK1U4FNM/FuGEnHNtqFOujOrZNQCz1dkVZGpyj8jJiEFt+MkiDYs8iT45vKPH6nY2H+KZVu8DU7JwjSwO5VQD5Ac0TJLRgtJJpaJlW2iKrVww0K/EpTEdRLLP+UkldvuSaX7JME+YL9uCjimmpnK1TFtQ++IGP4s+pWt2BhCqbtFO0YsESnSpzeoLdE6jr743sGwIDAQAB
-----END PUBLIC KEY-----

================================================
FILE: dailyfresh/apps/order/app_private_key.pem
================================================
-----BEGIN RSA PRIVATE KEY-----
MIIEpQIBAAKCAQEAxPty8S0j29pQ4ZaqpQqzAm4gX+qhQKabY6thC4jHIWf/v26q
DEOIApqc0iSrWJNAtF7pu+jgOIEWM80yuc6qhIvgtRyJ/O7g7ivM8RTws8UVOeJz
v7eRJsXJIGuzk65uL25SKwRfWo1vtps67Fcdc4OGzMCdMW4kyJ3LOa9juP4Fwu3A
GtAXSz3U6yJNyyyTu720DGZAacWKAHqPBDotTey8zBJx00TTu2a9Il4S5Y8OCfDl
+Pos+UaMPYIaY62Tm+YEJccnT0I+42d3gwhEQvkGjijToyALmiSncgrEVIw8Dzzm
90KjlU/rTvbET3S0NB7R/BGzOjc/aYDiB5z63QIDAQABAoIBAEGmVA6RLsxNHHuy
zTioMjTzIxMUjZ2QaWV0bql7cnJtyMyyQzZHI4NKqE1ZL0ob+Yqjv16DJIdwbkfh
cbB/clEulTuHQW3s50Y5jtoiUn53hrV+BXm14kh7zqZhfr4PemWQbQ4tLOJvFPZV
EfRGrGgdQ8Xlw/3/aX77KAoXrDKwz8JQs7VhWP7aSr0t9Uf2NQeziuGomGN2jhIa
s1GfCWoOmhGTnvDONcS6LDpx+BwhCPGbXNCDcXeK1NV0/EJm8hGTL/xTA2nHdvHK
FeTqxDu2Dk+7h6U62pTmkvaEsqSDiVaJSqQSgSxRij36BKpBGEcIec6T6ygJh+RI
XFpNIMECgYEA/h2m9qhvtJ1/Ij8lfCnzNeTw/StmSXQr2z+yoOk2OKkJpZybMO8V
F2YOneoVk5ShyYSfuJSq6S9sKDMv4BHtNFHi4x0CssdBzx3IUBSQfzT8hLC8YIzF
oSfbiTi5omlQSi3nF3NmoVgxPe/vk0KWqCfRJHXgzE3c36bHIbaslhkCgYEAxnFZ
YBoDw+7xYeBqxosICO/B+LX32oBQRUiu7NwAbWZSmSoB+MIW86SxZdcwHLLHp9VF
Yaq5PfyrexRbKYTuwbBLWyyA2q2dRbo3nlYa1fk21BNFB2neLiiqxnKcY2An+Ytq
kMtRXRYzBHvhiaeCzuOH00aBPNvXqt44EVgeO2UCgYEAjxTZHwdGJneLzxepHpls
RQtMmfBm3rMXwpLCHJJTomGjeemNBGeKA6vGTSoxzfAhjJstZ7vl4/h8uMHhkhPl
8NCupNx/2XQSXPFTCawalFWcXYY5+08oNA6CMWiMNaOAvtPLy8uBnRVQXKSNy+fx
dms8+n+Y/NBWrmN0uknmMXkCgYEAsTnWGk/hgQFLLqCge8T7Xg/Sam8JdmkWR2pM
X1l0QEAcEJJFxIaCvQIfNNbkLx0z1p5QIpO4cLXR6FAbwo7oNK9f/YNXaPWY+gb/
WTeJLAQwhWLYSXCxbwP+0NDW/qGH0gRDHiGW/s2urph8qtWhq2fljDjxfwrQJ9fi
twq9pUkCgYEA/ITjFfe4lIivKmdX5fSo00DloLM3SW5nILERxiIGyfv3lJVlCVJ6
D6RGQF/shktSHv2HcFGGGamgUi4gWREk8Sb8uoUl4VPcMlQICjT8Dbry384f4jxW
ifjIEydKtFKpF8R1lOgCtzfwSeaegy3ETaYS7chqug9+QR36czV3q4E=
-----END RSA PRIVATE KEY-----


================================================
FILE: dailyfresh/apps/order/migrations/0001_initial.py
================================================
# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.db import models, migrations


class Migration(migrations.Migration):

    dependencies = [
    ]

    operations = [
        migrations.CreateModel(
            name='OrderGoods',
            fields=[
                ('id', models.AutoField(verbose_name='ID', serialize=False, primary_key=True, auto_created=True)),
                ('create_time', models.DateTimeField(verbose_name='创建时间', auto_now_add=True)),
                ('update_time', models.DateTimeField(verbose_name='更新时间', auto_now=True)),
                ('is_delete', models.BooleanField(verbose_name='删除标记', default=False)),
                ('count', models.IntegerField(verbose_name='商品数目', default=1)),
                ('price', models.DecimalField(verbose_name='商品价格', max_digits=10, decimal_places=2)),
                ('comment', models.CharField(verbose_name='评论', max_length=256)),
            ],
            options={
                'verbose_name': '订单商品',
                'db_table': 'df_order_goods',
                'verbose_name_plural': '订单商品',
            },
        ),
        migrations.CreateModel(
            name='OrderInfo',
            fields=[
                ('create_time', models.DateTimeField(verbose_name='创建时间', auto_now_add=True)),
                ('update_time', models.DateTimeField(verbose_name='更新时间', auto_now=True)),
                ('is_delete', models.BooleanField(verbose_name='删除标记', default=False)),
                ('order_id', models.CharField(verbose_name='订单id', max_length=128, serialize=False, primary_key=True)),
                ('pay_method', models.SmallIntegerField(verbose_name='支付方式', default=3, choices=[(1, '货到付款'), (2, '微信支付'), (3, '支付宝'), (4, '银联支付')])),
                ('total_count', models.IntegerField(verbose_name='商品数量', default=1)),
                ('total_price', models.DecimalField(verbose_name='商品总价', max_digits=10, decimal_places=2)),
                ('transit_price', models.DecimalField(verbose_name='订单运费', max_digits=10, decimal_places=2)),
                ('order_status', models.SmallIntegerField(verbose_name='订单状态', default=1, choices=[(1, '待支付'), (2, '待发货'), (3, '待收货'), (4, '待评价'), (5, '已完成')])),
                ('trade_no', models.CharField(verbose_name='支付编号', max_length=128)),
            ],
            options={
                'verbose_name': '订单',
                'db_table': 'df_order_info',
                'verbose_name_plural': '订单',
            },
        ),
    ]


================================================
FILE: dailyfresh/apps/order/migrations/0002_auto_20171113_1813.py
================================================
# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.db import models, migrations
from django.conf import settings


class Migration(migrations.Migration):

    dependencies = [
        ('goods', '0001_initial'),
        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
        ('user', '0001_initial'),
        ('order', '0001_initial'),
    ]

    operations = [
        migrations.AddField(
            model_name='orderinfo',
            name='addr',
            field=models.ForeignKey(verbose_name='地址', to='user.Address'),
        ),
        migrations.AddField(
            model_name='orderinfo',
            name='user',
            field=models.ForeignKey(verbose_name='用户', to=settings.AUTH_USER_MODEL),
        ),
        migrations.AddField(
            model_name='ordergoods',
            name='order',
            field=models.ForeignKey(verbose_name='订单', to='order.OrderInfo'),
        ),
        migrations.AddField(
            model_name='ordergoods',
            name='sku',
            field=models.ForeignKey(verbose_name='商品SKU', to='goods.GoodsSKU'),
        ),
    ]


================================================
FILE: dailyfresh/apps/order/migrations/__init__.py
================================================


================================================
FILE: dailyfresh/apps/order/models.py
================================================
from django.db import models
from db.base_model import BaseModel
# Create your models here.


class OrderInfo(BaseModel):
    '''订单模型类'''
    PAY_METHODS = {
        '1': "货到付款",
        '2': "微信支付",
        '3': "支付宝",
        '4': '银联支付'
    }

    PAY_METHODS_ENUM = {
        "CASH": 1,
        "ALIPAY": 2
    }

    ORDER_STATUS_ENUM = {
        "UNPAID": 1,
        "UNSEND": 2,
        "UNRECEIVED": 3,
        "UNCOMMENT": 4,
        "FINISHED": 5
    }

    PAY_METHOD_CHOICES = (
        (1, '货到付款'),
        (2, '微信支付'),
        (3, '支付宝'),
        (4, '银联支付')
    )

    ORDER_STATUS = {
        1:'待支付',
        2:'待发货',
        3:'待收货',
        4:'待评价',
        5:'已完成'
    }

    ORDER_STATUS_CHOICES = (
        (1, '待支付'),
        (2, '待发货'),
        (3, '待收货'),
        (4, '待评价'),
        (5, '已完成')
    )

    order_id = models.CharField(max_length=128, primary_key=True, verbose_name='订单id')
    user = models.ForeignKey('user.User', verbose_name='用户')
    addr = models.ForeignKey('user.Address', verbose_name='地址')
    pay_method = models.SmallIntegerField(choices=PAY_METHOD_CHOICES, default=3, verbose_name='支付方式')
    total_count = models.IntegerField(default=1, verbose_name='商品数量')
    total_price = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='商品总价')
    transit_price = models.DecimalField(max_digits=10, decimal_places=2,verbose_name='订单运费')
    order_status = models.SmallIntegerField(choices=ORDER_STATUS_CHOICES, default=1, verbose_name='订单状态')
    trade_no = models.CharField(max_length=128, default='', verbose_name='支付编号')

    class Meta:
        db_table = 'df_order_info'
        verbose_name = '订单'
        verbose_name_plural = verbose_name


class OrderGoods(BaseModel):
    '''订单商品模型类'''
    order = models.ForeignKey('OrderInfo', verbose_name='订单')
    sku = models.ForeignKey('goods.GoodsSKU', verbose_name='商品SKU')
    count = models.IntegerField(default=1, verbose_name='商品数目')
    price = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='商品价格')
    comment = models.CharField(max_length=256, default='', verbose_name='评论')

    class Meta:
        db_table = 'df_order_goods'
        verbose_name = '订单商品'
        verbose_name_plural = verbose_name

================================================
FILE: dailyfresh/apps/order/tests.py
================================================
from django.test import TestCase

# Create your tests here.


================================================
FILE: dailyfresh/apps/order/urls.py
================================================
from django.conf.urls import url
from order.views import OrderPlaceView, OrderCommitView, OrderPayView, CheckPayView,CommentView

urlpatterns = [
    url(r'^place$', OrderPlaceView.as_view(), name='place'), # 提交订单页面显示
    url(r'^commit$', OrderCommitView.as_view(), name='commit'), # 订单创建
    url(r'^pay$', OrderPayView.as_view(), name='pay'), # 订单支付
    url(r'^check$', CheckPayView.as_view(), name='check'), # 查询支付交易结果
    url(r'^comment/(?P<order_id>.+)$', CommentView.as_view(), name='comment'),  # 订单评论
]


================================================
FILE: dailyfresh/apps/order/views.py
================================================
from django.shortcuts import render, redirect
from django.core.urlresolvers import reverse
from django.http import JsonResponse
from django.db import transaction
from django.conf import settings
from django.views.generic import View

from user.models import Address
from goods.models import GoodsSKU
from order.models import OrderInfo, OrderGoods

from django_redis import get_redis_connection
from utils.mixin import LoginRequiredMixin
from datetime import datetime
from alipay import AliPay
import os
# Create your views here.


# /order/place
class OrderPlaceView(LoginRequiredMixin, View):
    '''提交订单页面显示'''
    def post(self, request):
        '''提交订单页面显示'''
        # 获取登录的用户
        user = request.user
        # 获取参数sku_ids
        sku_ids = request.POST.getlist('sku_ids') # [1,26]

        # 校验参数
        if not sku_ids:
            # 跳转到购物车页面
            return redirect(reverse('cart:show'))

        conn = get_redis_connection('default')
        cart_key = 'cart_%d'%user.id

        skus = []
        # 保存商品的总件数和总价格
        total_count = 0
        total_price = 0
        # 遍历sku_ids获取用户要购买的商品的信息
        for sku_id in sku_ids:
            # 根据商品的id获取商品的信息
            sku = GoodsSKU.objects.get(id=sku_id)
            # 获取用户所要购买的商品的数量
            count = conn.hget(cart_key, sku_id)
            # 计算商品的小计
            amount = sku.price*int(count)
            # 动态给sku增加属性count,保存购买商品的数量
            sku.count = count
            # 动态给sku增加属性amount,保存购买商品的小计
            sku.amount = amount
            # 追加
            skus.append(sku)
            # 累加计算商品的总件数和总价格
            total_count += int(count)
            total_price += amount

        # 运费:实际开发的时候,属于一个子系统
        transit_price = 10 # 写死

        # 实付款
        total_pay = total_price + transit_price

        # 获取用户的收件地址
        addrs = Address.objects.filter(user=user)

        # 组织上下文
        sku_ids = ','.join(sku_ids) # [1,25]->1,25
        context = {'skus':skus,
                   'total_count':total_count,
                   'total_price':total_price,
                   'transit_price':transit_price,
                   'total_pay':total_pay,
                   'addrs':addrs,
                   'sku_ids':sku_ids}

        # 使用模板
        return render(request, 'place_order.html', context)


# 前端传递的参数:地址id(addr_id) 支付方式(pay_method) 用户要购买的商品id字符串(sku_ids)
# mysql事务: 一组sql操作,要么都成功,要么都失败
# 高并发:秒杀
# 支付宝支付
class OrderCommitView1(View):
    '''订单创建'''
    @transaction.atomic
    def post(self, request):
        '''订单创建'''
        # 判断用户是否登录
        user = request.user
        if not user.is_authenticated():
            # 用户未登录
            return JsonResponse({'res':0, 'errmsg':'用户未登录'})

        # 接收参数
        addr_id = request.POST.get('addr_id')
        pay_method = request.POST.get('pay_method')
        sku_ids = request.POST.get('sku_ids') # 1,3

        # 校验参数
        if not all([addr_id, pay_method, sku_ids]):
            return JsonResponse({'res':1, 'errmsg':'参数不完整'})

        # 校验支付方式
        if pay_method not in OrderInfo.PAY_METHODS.keys():
            return JsonResponse({'res':2, 'errmsg':'非法的支付方式'})

        # 校验地址
        try:
            addr = Address.objects.get(id=addr_id)
        except Address.DoesNotExist:
            # 地址不存在
            return JsonResponse({'res':3, 'errmsg':'地址非法'})

        # todo: 创建订单核心业务

        # 组织参数
        # 订单id: 20171122181630+用户id
        order_id = datetime.now().strftime('%Y%m%d%H%M%S')+str(user.id)

        # 运费
        transit_price = 10

        # 总数目和总金额
        total_count = 0
        total_price = 0

        # 设置事务保存点
        save_id = transaction.savepoint()
        try:
            # todo: 向df_order_info表中添加一条记录
            order = OrderInfo.objects.create(order_id=order_id,
                                             user=user,
                                             addr=addr,
                                             pay_method=pay_method,
                                             total_count=total_count,
                                             total_price=total_price,
                                             transit_price=transit_price)

            # todo: 用户的订单中有几个商品,需要向df_order_goods表中加入几条记录
            conn = get_redis_connection('default')
            cart_key = 'cart_%d'%user.id

            sku_ids = sku_ids.split(',')
            for sku_id in sku_ids:
                # 获取商品的信息
                try:
                    # select * from df_goods_sku where id=sku_id for update;
                    sku = GoodsSKU.objects.select_for_update().get(id=sku_id)
                except:
                    # 商品不存在
                    transaction.savepoint_rollback(save_id)
                    return JsonResponse({'res':4, 'errmsg':'商品不存在'})

                print('user:%d stock:%d'%(user.id, sku.stock))
                import time
                time.sleep(10)

                # 从redis中获取用户所要购买的商品的数量
                count = conn.hget(cart_key, sku_id)

                # todo: 判断商品的库存
                if int(count) > sku.stock:
                    transaction.savepoint_rollback(save_id)
                    return JsonResponse({'res':6, 'errmsg':'商品库存不足'})

                # todo: 向df_order_goods表中添加一条记录
                OrderGoods.objects.create(order=order,
                                          sku=sku,
                                          count=count,
                                          price=sku.price)

                # todo: 更新商品的库存和销量
                sku.stock -= int(count)
                sku.sales += int(count)
                sku.save()

                # todo: 累加计算订单商品的总数量和总价格
                amount = sku.price*int(count)
                total_count += int(count)
                total_price += amount

            # todo: 更新订单信息表中的商品的总数量和总价格
            order.total_count = total_count
            order.total_price = total_price
            order.save()
        except Exception as e:
            transaction.savepoint_rollback(save_id)
            return JsonResponse({'res':7, 'errmsg':'下单失败'})

        # 提交事务
        transaction.savepoint_commit(save_id)

        # todo: 清除用户购物车中对应的记录
        conn.hdel(cart_key, *sku_ids)

        # 返回应答
        return JsonResponse({'res':5, 'message':'创建成功'})


class OrderCommitView(View):
    '''订单创建'''
    @transaction.atomic
    def post(self, request):
        '''订单创建'''
        # 判断用户是否登录
        user = request.user
        if not user.is_authenticated():
            # 用户未登录
            return JsonResponse({'res':0, 'errmsg':'用户未登录'})

        # 接收参数
        addr_id = request.POST.get('addr_id')
        pay_method = request.POST.get('pay_method')
        sku_ids = request.POST.get('sku_ids') # 1,3

        # 校验参数
        if not all([addr_id, pay_method, sku_ids]):
            return JsonResponse({'res':1, 'errmsg':'参数不完整'})

        # 校验支付方式
        if pay_method not in OrderInfo.PAY_METHODS.keys():
            return JsonResponse({'res':2, 'errmsg':'非法的支付方式'})

        # 校验地址
        try:
            addr = Address.objects.get(id=addr_id)
        except Address.DoesNotExist:
            # 地址不存在
            return JsonResponse({'res':3, 'errmsg':'地址非法'})

        # todo: 创建订单核心业务

        # 组织参数
        # 订单id: 20171122181630+用户id
        order_id = datetime.now().strftime('%Y%m%d%H%M%S')+str(user.id)

        # 运费
        transit_price = 10

        # 总数目和总金额
        total_count = 0
        total_price = 0

        # 设置事务保存点
        save_id = transaction.savepoint()
        try:
            # todo: 向df_order_info表中添加一条记录
            order = OrderInfo.objects.create(order_id=order_id,
                                             user=user,
                                             addr=addr,
                                             pay_method=pay_method,
                                             total_count=total_count,
                                             total_price=total_price,
                                             transit_price=transit_price)

            # todo: 用户的订单中有几个商品,需要向df_order_goods表中加入几条记录
            conn = get_redis_connection('default')
            cart_key = 'cart_%d'%user.id

            sku_ids = sku_ids.split(',')
            for sku_id in sku_ids:
                for i in range(3):
                    # 获取商品的信息
                    try:
                        sku = GoodsSKU.objects.get(id=sku_id)
                    except:
                        # 商品不存在
                        transaction.savepoint_rollback(save_id)
                        return JsonResponse({'res':4, 'errmsg':'商品不存在'})

                    # 从redis中获取用户所要购买的商品的数量
                    count = conn.hget(cart_key, sku_id)

                    # todo: 判断商品的库存
                    if int(count) > sku.stock:
                        transaction.savepoint_rollback(save_id)
                        return JsonResponse({'res':6, 'errmsg':'商品库存不足'})

                    # todo: 更新商品的库存和销量
                    orgin_stock = sku.stock
                    new_stock = orgin_stock - int(count)
                    new_sales = sku.sales + int(count)

                    # print('user:%d times:%d stock:%d' % (user.id, i, sku.stock))
                    # import time
                    # time.sleep(10)

                    # update df_goods_sku set stock=new_stock, sales=new_sales
                    # where id=sku_id and stock = orgin_stock

                    # 返回受影响的行数
                    res = GoodsSKU.objects.filter(id=sku_id, stock=orgin_stock).update(stock=new_stock, sales=new_sales)
                    if res == 0:
                        if i == 2:
                            # 尝试的第3次
                            transaction.savepoint_rollback(save_id)
                            return JsonResponse({'res': 7, 'errmsg': '下单失败2'})
                        continue

                    # todo: 向df_order_goods表中添加一条记录
                    OrderGoods.objects.create(order=order,
                                              sku=sku,
                                              count=count,
                                              price=sku.price)

                    # todo: 累加计算订单商品的总数量和总价格
                    amount = sku.price*int(count)
                    total_count += int(count)
                    total_price += amount

                    # 跳出循环
                    break

            # todo: 更新订单信息表中的商品的总数量和总价格
            order.total_count = total_count
            order.total_price = total_price
            order.save()
        except Exception as e:
            transaction.savepoint_rollback(save_id)
            return JsonResponse({'res':7, 'errmsg':'下单失败'})

        # 提交事务
        transaction.savepoint_commit(save_id)

        # todo: 清除用户购物车中对应的记录
        conn.hdel(cart_key, *sku_ids)

        # 返回应答
        return JsonResponse({'res':5, 'message':'创建成功'})


# ajax post
# 前端传递的参数:订单id(order_id)
# /order/pay
class OrderPayView(View):
    '''订单支付'''
    def post(self, request):
        '''订单支付'''
        # 用户是否登录
        user = request.user
        if not user.is_authenticated():
            return JsonResponse({'res':0, 'errmsg':'用户未登录'})

        # 接收参数
        order_id = request.POST.get('order_id')

        # 校验参数
        if not order_id:
            return JsonResponse({'res':1, 'errmsg':'无效的订单id'})

        try:
            order = OrderInfo.objects.get(order_id=order_id,
                                          user=user,
                                          pay_method=3,
                                          order_status=1)
        except OrderInfo.DoesNotExist:
            return JsonResponse({'res':2, 'errmsg':'订单错误'})

        # 业务处理:使用python sdk调用支付宝的支付接口
        # 初始化
        alipay = AliPay(
            appid="2016090800464054", # 应用id
            app_notify_url=None,  # 默认回调url
            app_private_key_path=os.path.join(settings.BASE_DIR, 'apps/order/app_private_key.pem'),
            alipay_public_key_path=os.path.join(settings.BASE_DIR, 'apps/order/alipay_public_key.pem'), # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
            sign_type="RSA2",  # RSA 或者 RSA2
            debug=True  # 默认False
        )

        # 调用支付接口
        # 电脑网站支付,需要跳转到https://openapi.alipaydev.com/gateway.do? + order_string
        total_pay = order.total_price+order.transit_price # Decimal
        order_string = alipay.api_alipay_trade_page_pay(
            out_trade_no=order_id, # 订单id
            total_amount=str(total_pay), # 支付总金额
            subject='天天生鲜%s'%order_id,
            return_url=None,
            notify_url=None  # 可选, 不填则使用默认notify url
        )

        # 返回应答
        pay_url = 'https://openapi.alipaydev.com/gateway.do?' + order_string
        return JsonResponse({'res':3, 'pay_url':pay_url})


# ajax post
# 前端传递的参数:订单id(order_id)
# /order/check
class CheckPayView(View):
    '''查看订单支付的结果'''
    def post(self, request):
        '''查询支付结果'''
        # 用户是否登录
        user = request.user
        if not user.is_authenticated():
            return JsonResponse({'res': 0, 'errmsg': '用户未登录'})

        # 接收参数
        order_id = request.POST.get('order_id')

        # 校验参数
        if not order_id:
            return JsonResponse({'res': 1, 'errmsg': '无效的订单id'})

        try:
            order = OrderInfo.objects.get(order_id=order_id,
                                          user=user,
                                          pay_method=3,
                                          order_status=1)
        except OrderInfo.DoesNotExist:
            return JsonResponse({'res': 2, 'errmsg': '订单错误'})

        # 业务处理:使用python sdk调用支付宝的支付接口
        # 初始化
        alipay = AliPay(
            appid="2016090800464054",  # 应用id
            app_notify_url=None,  # 默认回调url
            app_private_key_path=os.path.join(settings.BASE_DIR, 'apps/order/app_private_key.pem'),
            alipay_public_key_path=os.path.join(settings.BASE_DIR, 'apps/order/alipay_public_key.pem'),
            # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
            sign_type="RSA2",  # RSA 或者 RSA2
            debug=True  # 默认False
        )

        # 调用支付宝的交易查询接口
        while True:
            response = alipay.api_alipay_trade_query(order_id)

            # response = {
            #         "trade_no": "2017032121001004070200176844", # 支付宝交易号
            #         "code": "10000", # 接口调用是否成功
            #         "invoice_amount": "20.00",
            #         "open_id": "20880072506750308812798160715407",
            #         "fund_bill_list": [
            #             {
            #                 "amount": "20.00",
            #                 "fund_channel": "ALIPAYACCOUNT"
            #             }
            #         ],
            #         "buyer_logon_id": "csq***@sandbox.com",
            #         "send_pay_date": "2017-03-21 13:29:17",
            #         "receipt_amount": "20.00",
            #         "out_trade_no": "out_trade_no15",
            #         "buyer_pay_amount": "20.00",
            #         "buyer_user_id": "2088102169481075",
            #         "msg": "Success",
            #         "point_amount": "0.00",
            #         "trade_status": "TRADE_SUCCESS", # 支付结果
            #         "total_amount": "20.00"
            # }

            code = response.get('code')

            if code == '10000' and response.get('trade_status') == 'TRADE_SUCCESS':
                # 支付成功
                # 获取支付宝交易号
                trade_no = response.get('trade_no')
                # 更新订单状态
                order.trade_no = trade_no
                order.order_status = 4 # 待评价
                order.save()
                # 返回结果
                return JsonResponse({'res':3, 'message':'支付成功'})
            elif code == '40004' or (code == '10000' and response.get('trade_status') == 'WAIT_BUYER_PAY'):
                # 等待买家付款
                # 业务处理失败,可能一会就会成功
                import time
                time.sleep(5)
                continue
            else:
                # 支付出错
                print(code)
                return JsonResponse({'res':4, 'errmsg':'支付失败'})


class CommentView(LoginRequiredMixin, View):
    """订单评论"""
    def get(self, request, order_id):
        """提供评论页面"""
        user = request.user

        # 校验数据
        if not order_id:
            return redirect(reverse('user:order'))

        try:
            order = OrderInfo.objects.get(order_id=order_id, user=user)
        except OrderInfo.DoesNotExist:
            return redirect(reverse("user:order"))

        # 根据订单的状态获取订单的状态标题
        order.status_name = OrderInfo.ORDER_STATUS[order.order_status]

        # 获取订单商品信息
        order_skus = OrderGoods.objects.filter(order_id=order_id)
        for order_sku in order_skus:
            # 计算商品的小计
            amount = order_sku.count*order_sku.price
            # 动态给order_sku增加属性amount,保存商品小计
            order_sku.amount = amount
        # 动态给order增加属性order_skus, 保存订单商品信息
        order.order_skus = order_skus

        # 使用模板
        return render(request, "order_comment.html", {"order": order})

    def post(self, request, order_id):
        """处理评论内容"""
        user = request.user
        # 校验数据
        if not order_id:
            return redirect(reverse('user:order'))

        try:
            order = OrderInfo.objects.get(order_id=order_id, user=user)
        except OrderInfo.DoesNotExist:
            return redirect(reverse("user:order"))

        # 获取评论条数
        total_count = request.POST.get("total_count")
        total_count = int(total_count)

        # 循环获取订单中商品的评论内容
        for i in range(1, total_count + 1):
            # 获取评论的商品的id
            sku_id = request.POST.get("sku_%d" % i) # sku_1 sku_2
            # 获取评论的商品的内容
            content = request.POST.get('content_%d' % i, '') # cotent_1 content_2 content_3
            try:
                order_goods = OrderGoods.objects.get(order=order, sku_id=sku_id)
            except OrderGoods.DoesNotExist:
                continue

            order_goods.comment = content
            order_goods.save()

        order.order_status = 5 # 已完成
        order.save()

        return redirect(reverse("user:order", kwargs={"page": 1}))












================================================
FILE: dailyfresh/apps/user/__init__.py
================================================


================================================
FILE: dailyfresh/apps/user/admin.py
================================================
from django.contrib import admin

# Register your models here.


================================================
FILE: dailyfresh/apps/user/migrations/0001_initial.py
================================================
# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.db import models, migrations
import django.contrib.auth.models
import django.core.validators
import django.utils.timezone
from django.conf import settings


class Migration(migrations.Migration):

    dependencies = [
        ('auth', '0006_require_contenttypes_0002'),
    ]

    operations = [
        migrations.CreateModel(
            name='User',
            fields=[
                ('id', models.AutoField(verbose_name='ID', serialize=False, primary_key=True, auto_created=True)),
                ('password', models.CharField(verbose_name='password', max_length=128)),
                ('last_login', models.DateTimeField(verbose_name='last login', blank=True, null=True)),
                ('is_superuser', models.BooleanField(verbose_name='superuser status', default=False, help_text='Designates that this user has all permissions without explicitly assigning them.')),
                ('username', models.CharField(validators=[django.core.validators.RegexValidator('^[\\w.@+-]+$', 'Enter a valid username. This value may contain only letters, numbers and @/./+/-/_ characters.', 'invalid')], max_length=30, error_messages={'unique': 'A user with that username already exists.'}, unique=True, verbose_name='username', help_text='Required. 30 characters or fewer. Letters, digits and @/./+/-/_ only.')),
                ('first_name', models.CharField(verbose_name='first name', blank=True, max_length=30)),
                ('last_name', models.CharField(verbose_name='last name', blank=True, max_length=30)),
                ('email', models.EmailField(verbose_name='email address', blank=True, max_length=254)),
                ('is_staff', models.BooleanField(verbose_name='staff status', default=False, help_text='Designates whether the user can log into this admin site.')),
                ('is_active', models.BooleanField(verbose_name='active', default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.')),
                ('date_joined', models.DateTimeField(verbose_name='date joined', default=django.utils.timezone.now)),
                ('create_time', models.DateTimeField(verbose_name='创建时间', auto_now_add=True)),
                ('update_time', models.DateTimeField(verbose_name='更新时间', auto_now=True)),
                ('is_delete', models.BooleanField(verbose_name='删除标记', default=False)),
                ('groups', models.ManyToManyField(related_name='user_set', blank=True, to='auth.Group', verbose_name='groups', help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_query_name='user')),
                ('user_permissions', models.ManyToManyField(related_name='user_set', blank=True, to='auth.Permission', verbose_name='user permissions', help_text='Specific permissions for this user.', related_query_name='user')),
            ],
            options={
                'verbose_name': '用户',
                'db_table': 'df_user',
                'verbose_name_plural': '用户',
            },
            managers=[
                ('objects', django.contrib.auth.models.UserManager()),
            ],
        ),
        migrations.CreateModel(
            name='Address',
            fields=[
                ('id', models.AutoField(verbose_name='ID', serialize=False, primary_key=True, auto_created=True)),
                ('create_time', models.DateTimeField(verbose_name='创建时间', auto_now_add=True)),
                ('update_time', models.DateTimeField(verbose_name='更新时间', auto_now=True)),
                ('is_delete', models.BooleanField(verbose_name='删除标记', default=False)),
                ('receiver', models.CharField(verbose_name='收件人', max_length=20)),
                ('addr', models.CharField(verbose_name='收件地址', max_length=256)),
                ('zip_code', models.CharField(verbose_name='邮政编码', max_length=6, null=True)),
                ('phone', models.CharField(verbose_name='联系电话', max_length=11)),
                ('is_default', models.BooleanField(verbose_name='是否默认', default=False)),
                ('user', models.ForeignKey(verbose_name='所属账户', to=settings.AUTH_USER_MODEL)),
            ],
            options={
                'verbose_name': '地址',
                'db_table': 'df_address',
                'verbose_name_plural': '地址',
            },
        ),
    ]


================================================
FILE: dailyfresh/apps/user/migrations/__init__.py
================================================


================================================
FILE: dailyfresh/apps/user/models.py
================================================
from django.db import models
from django.contrib.auth.models import AbstractUser
from db.base_model import BaseModel
# Create your models here.


class User(AbstractUser, BaseModel):
    '''用户模型类'''

    class Meta:
        db_table = 'df_user'
        verbose_name = '用户'
        verbose_name_plural = verbose_name


class AddressManager(models.Manager):
    '''地址模型管理器类'''
    # 1.改变原有查询的结果集:all()
    # 2.封装方法:用户操作模型类对应的数据表(增删改查)
    def get_default_address(self, user):
        '''获取用户默认收货地址'''
        # self.model:获取self对象所在的模型类
        try:
            address = self.get(user=user, is_default=True)  # models.Manager
        except self.model.DoesNotExist:
            # 不存在默认收货地址
            address = None

        return address


class Address(BaseModel):
    '''地址模型类'''
    user = models.ForeignKey('User', verbose_name='所属账户')
    receiver = models.CharField(max_length=20, verbose_name='收件人')
    addr = models.CharField(max_length=256, verbose_name='收件地址')
    zip_code = models.CharField(max_length=6, null=True, verbose_name='邮政编码')
    phone = models.CharField(max_length=11, verbose_name='联系电话')
    is_default = models.BooleanField(default=False, verbose_name='是否默认')

    # 自定义一个模型管理器对象
    objects = AddressManager()

    class Meta:
        db_table = 'df_address'
        verbose_name = '地址'
        verbose_name_plural = verbose_name


================================================
FILE: dailyfresh/apps/user/tests.py
================================================
from django.test import TestCase

# Create your tests here.


================================================
FILE: dailyfresh/apps/user/urls.py
================================================
from django.conf.urls import url
from django.contrib.auth.decorators import login_required
from user.views import RegisterView, ActiveView, LoginView, LogoutView, UserInfoView, UserOrderView, AddressView

urlpatterns = [
    # url(r'^register$', views.register, name='register'), # 注册
    # url(r'^register_handle$', views.register_handle, name='register_handle'), # 注册处理

    url(r'^register$', RegisterView.as_view(), name='register'), # 注册
    url(r'^active/(?P<token>.*)$', ActiveView.as_view(), name='active'), # 用户激活

    url(r'^login$', LoginView.as_view(), name='login'), # 登录
    url(r'^logout$', LogoutView.as_view(), name='logout'), # 注销登录

    # url(r'^$', login_required(UserInfoView.as_view()), name='user'), # 用户中心-信息页
    # url(r'^order$', login_required(UserOrderView.as_view()), name='order'), # 用户中心-订单页
    # url(r'^address$', login_required(AddressView.as_view()), name='address'), # 用户中心-地址页

    url(r'^$', UserInfoView.as_view(), name='user'), # 用户中心-信息页
    url(r'^order/(?P<page>\d+)$', UserOrderView.as_view(), name='order'), # 用户中心-订单页
    # url(r'^order$', UserOrderView.as_view(), name='order'), # 用户中心-订单页
    url(r'^address$', AddressView.as_view(), name='address'), # 用户中心-地址页
]

================================================
FILE: dailyfresh/apps/user/views.py
================================================
from django.shortcuts import render,redirect
from django.core.urlresolvers import reverse
from django.core.mail import send_mail
from django.contrib.auth import authenticate, login, logout
from django.core.paginator import Paginator
from django.views.generic import View
from django.http import HttpResponse,JsonResponse
from django.conf import settings

from user.models import User, Address
from goods.models import GoodsSKU
from order.models import OrderInfo,OrderGoods

from celery_tasks.tasks import send_register_active_email
from itsdangerous import TimedJSONWebSignatureSerializer as Serializer
from itsdangerous import SignatureExpired
from utils.mixin import LoginRequiredMixin
from django_redis import get_redis_connection
import re
import time
# Create your views here.


# /user/register
# GET POST PUT DELETE OPTION
def register(request):
    '''注册'''
    if request.method == 'GET':
        # 显示注册页面
        return render(request, 'register.html')
    else:
        # 进行注册处理
        # 接收数据
        username = request.POST.get('user_name')
        password = request.POST.get('pwd')
        email = request.POST.get('email')
        allow = request.POST.get('allow')  # 用户使用协议

        # 进行数据校验 all里面的参数都为真时则返回真
        if not all([username, password, email]):
            # 数据不完整
            return render(request, 'register.html', {'errmsg': '数据不完整'})

        # 校验邮箱 使用正则,导入re库
        if not re.match(r'^[a-z0-9][\w.\-]*@[a-z0-9\-]+(\.[a-z]{2,5}){1,2}$', email):
            return render(request, 'register.html', {'errmsg': '邮箱格式不正确'})

        if allow != 'on':
            return render(request, 'register.html', {'errmsg': '请同意协议'})

        # 校验用户名是否重复
        try:
            user = User.objects.get(username=username)
        except User.DoesNotExist:
            # 用户名不存在
            user = None

        if user:
            # 用户名已存在
            return render(request, 'register.html', {'errmsg': '用户名已存在'})

        # 进行业务处理: 进行用户注册 Django内置方法
        user = User.objects.create_user(username, email, password)
        user.is_active = 0
        user.save()

        # 返回应答, 跳转到首页,reverse方向解析函数
        return redirect(reverse('goods:index'))


def register_handle(request):
    '''进行注册处理'''
    # 接收数据
    username = request.POST.get('user_name')
    password = request.POST.get('pwd')
    email = request.POST.get('email')
    allow = request.POST.get('allow')

    # 进行数据校验
    if not all([username, password, email]):
        # 数据不完整
        return render(request, 'register.html', {'errmsg':'数据不完整'})

    # 校验邮箱
    if not re.match(r'^[a-z0-9][\w.\-]*@[a-z0-9\-]+(\.[a-z]{2,5}){1,2}$', email):
        return render(request, 'register.html', {'errmsg':'邮箱格式不正确'})

    if allow != 'on':
        return render(request, 'register.html', {'errmsg':'请同意协议'})

    # 校验用户名是否重复
    try:
        user = User.objects.get(username=username)
    except User.DoesNotExist:
        # 用户名不存在
        user = None

    if user:
        # 用户名已存在
        return render(request, 'register.html', {'errmsg':'用户名已存在'})

    # 进行业务处理: 进行用户注册
    user = User.objects.create_user(username, email, password)
    user.is_active = 0
    user.save()

    # 返回应答, 跳转到首页
    return redirect(reverse('goods:index'))


# /user/register
class RegisterView(View):
    '''注册'''
    def get(self, request):
        '''显示注册页面'''
        return render(request, 'register.html')

    def post(self, request):
        '''进行注册处理'''
        # 接收数据
        username = request.POST.get('user_name')
        password = request.POST.get('pwd')
        email = request.POST.get('email')
        allow = request.POST.get('allow')

        # 进行数据校验
        if not all([username, password, email]):
            # 数据不完整
            return render(request, 'register.html', {'errmsg': '数据不完整'})

        # 校验邮箱
        if not re.match(r'^[a-z0-9][\w.\-]*@[a-z0-9\-]+(\.[a-z]{2,5}){1,2}$', email):
            return render(request, 'register.html', {'errmsg': '邮箱格式不正确'})

        if allow != 'on':
            return render(request, 'register.html', {'errmsg': '请同意协议'})

        # 校验用户名是否重复
        try:
            user = User.objects.get(username=username)
        except User.DoesNotExist:
            # 用户名不存在
            user = None

        if user:
            # 用户名已存在
            return render(request, 'register.html', {'errmsg': '用户名已存在'})

        # 进行业务处理: 进行用户注册
        user = User.objects.create_user(username, email, password)
        user.is_active = 0
        user.save()

        # 发送激活邮件,包含激活链接: http://127.0.0.1:8000/user/active/3
        # 激活链接中需要包含用户的身份信息, 并且要把身份信息进行加密

        # 加密用户的身份信息,生成激活token
        serializer = Serializer(settings.SECRET_KEY, 3600)
        info = {'confirm':user.id}
        token = serializer.dumps(info) # bytes 字节流
        token = token.decode()  # 字节流转换成字符串

        # 发邮件
        send_register_active_email.delay(email, username, token)

        # 返回应答, 跳转到首页
        return redirect(reverse('goods:index'))


class ActiveView(View):
    '''用户激活'''
    def get(self, request, token):
        '''进行用户激活'''
        # 进行解密,获取要激活的用户信息
        serializer = Serializer(settings.SECRET_KEY, 3600)
        try:
            info = serializer.loads(token)
            # 获取待激活用户的id
            user_id = info['confirm']

            # 根据id获取用户信息
            user = User.objects.get(id=user_id)
            user.is_active = 1
            user.save()

            # 跳转到登录页面
            return redirect(reverse('user:login'))
        except SignatureExpired as e:
            # 激活链接已过期
            return HttpResponse('激活链接已过期')


# /user/login
class LoginView(View):
    '''登录'''
    def get(self, request):
        '''显示登录页面'''
        # 判断是否记住了用户名
        if 'username' in request.COOKIES:
            username = request.COOKIES.get('username')
            checked = 'checked'
        else:
            username = ''
            checked = ''

        # 使用模板
        return render(request, 'login.html', {'username':username, 'checked':checked})

    def post(self, request):
        '''登录校验'''
        # 接收数据
        username = request.POST.get('username')
        password = request.POST.get('pwd')

        # 校验数据
        if not all([username, password]):
            return render(request, 'login.html', {'errmsg':'数据不完整'})

        # 业务处理:登录校验
        user = authenticate(username=username, password=password)
        if user is not None:
            # 用户名密码正确
            if user.is_active:
                # 用户已激活
                # 记录用户的登录状态
                login(request, user)

                # 获取登录后所要跳转到的地址
                # 默认跳转到首页
                next_url = request.GET.get('next', reverse('goods:index'))

                # 跳转到next_url
                response = redirect(next_url) # HttpResponseRedirect

                # 判断是否需要记住用户名
                remember = request.POST.get('remember')

                if remember == 'on':
                    # 记住用户名
                    response.set_cookie('username', username, max_age=7*24*3600)
                else:
                    response.delete_cookie('username')

                # 返回response
                return response
            else:
                # 用户未激活
                return render(request, 'login.html', {'errmsg':'账户未激活'})
        else:
            # 用户名或密码错误
            return render(request, 'login.html', {'errmsg':'用户名或密码错误'})


# /user/logout
class LogoutView(View):
    '''退出登录'''
    def get(self, request):
        '''退出登录'''
        # 清除用户的session信息
        logout(request)

        # 跳转到首页
        return redirect(reverse('goods:index'))


# /user
class UserInfoView(LoginRequiredMixin, View):
    '''用户中心-信息页'''
    def get(self, request):
        '''显示'''
        # Django会给request对象添加一个属性request.user
        # 如果用户未登录->user是AnonymousUser类的一个实例对象
        # 如果用户登录->user是User类的一个实例对象
        # request.user.is_authenticated()

        # 获取用户的个人信息
        user = request.user
        address = Address.objects.get_default_address(user)

        # 获取用户的历史浏览记录
        # from redis import StrictRedis
        # sr = StrictRedis(host='172.16.179.130', port='6379', db=9)
        con = get_redis_connection('default')

        history_key = 'history_%d'%user.id

        # 获取用户最新浏览的5个商品的id
        sku_ids = con.lrange(history_key, 0, 4) # [2,3,1]

        # 从数据库中查询用户浏览的商品的具体信息
        # goods_li = GoodsSKU.objects.filter(id__in=sku_ids)
        #
        # goods_res = []
        # for a_id in sku_ids:
        #     for goods in goods_li:
        #         if a_id == goods.id:
        #             goods_res.append(goods)

        # 遍历获取用户浏览的商品信息
        goods_li = []
        for id in sku_ids:
            goods = GoodsSKU.objects.get(id=id)
            goods_li.append(goods)

        # 组织上下文
        context = {'page':'user',
                   'address':address,
                   'goods_li':goods_li}

        # 除了你给模板文件传递的模板变量之外,django框架会把request.user也传给模板文件
        return render(request, 'user_center_info.html', context)


# /user/order
class UserOrderView(LoginRequiredMixin, View):
    '''用户中心-订单页'''
    def get(self, request, page):
        '''显示'''
        # 获取用户的订单信息
        user = request.user
        orders = OrderInfo.objects.filter(user=user).order_by('-create_time')

        # 遍历获取订单商品的信息
        for order in orders:
            # 根据order_id查询订单商品信息
            order_skus = OrderGoods.objects.filter(order_id=order.order_id)

            # 遍历order_skus计算商品的小计
            for order_sku in order_skus:
                # 计算小计
                amount = order_sku.count*order_sku.price
                # 动态给order_sku增加属性amount,保存订单商品的小计
                order_sku.amount = amount

            # 动态给order增加属性,保存订单状态标题
            order.status_name = OrderInfo.ORDER_STATUS[order.order_status]
            # 动态给order增加属性,保存订单商品的信息
            order.order_skus = order_skus

        # 分页
        paginator = Paginator(orders, 1)

        # 获取第page页的内容
        try:
            page = int(page)
        except Exception as e:
            page = 1

        if page > paginator.num_pages:
            page = 1

        # 获取第page页的Page实例对象
        order_page = paginator.page(page)

        # todo: 进行页码的控制,页面上最多显示5个页码
        # 1.总页数小于5页,页面上显示所有页码
        # 2.如果当前页是前3页,显示1-5页
        # 3.如果当前页是后3页,显示后5页
        # 4.其他情况,显示当前页的前2页,当前页,当前页的后2页
        num_pages = paginator.num_pages
        if num_pages < 5:
            pages = range(1, num_pages + 1)
        elif page <= 3:
            pages = range(1, 6)
        elif num_pages - page <= 2:
            pages = range(num_pages - 4, num_pages + 1)
        else:
            pages = range(page - 2, page + 3)

        # 组织上下文
        context = {'order_page':order_page,
                   'pages':pages,
                   'page': 'order'}

        # 使用模板
        return render(request, 'user_center_order.html', context)


# /user/address
class AddressView(LoginRequiredMixin, View):
    '''用户中心-地址页'''
    def get(self, request):
        '''显示'''
        # 获取登录用户对应User对象
        user = request.user

        # 获取用户的默认收货地址
        try:
            address = Address.objects.get(user=user, is_default=True) # models.Manager
        except Address.DoesNotExist:
            # 不存在默认收货地址
            address = None
        # address = Address.objects.get_default_address(user)

        # 使用模板
        return render(request, 'user_center_site.html', {'page':'address', 'address':address})

    def post(self, request):
        '''地址的添加'''
        # 接收数据
        receiver = request.POST.get('receiver')
        addr = request.POST.get('addr')
        zip_code = request.POST.get('zip_code')
        phone = request.POST.get('phone')

        # 校验数据
        if not all([receiver, addr, phone, type]):
            return render(request, 'user_center_site.html', {'errmsg':'数据不完整'})

        # 校验手机号
        if not re.match(r'^1[3|4|5|7|8][0-9]{9}$', phone):
            return render(request, 'user_center_site.html', {'errmsg':'手机格式不正确'})

        # 业务处理:地址添加
        # 如果用户已存在默认收货地址,添加的地址不作为默认收货地址,否则作为默认收货地址
        # 获取登录用户对应User对象
        user = request.user

        # try:
        #     address = Address.objects.get(user=user, is_default=True)
        # except Address.DoesNotExist:
        #     # 不存在默认收货地址
        #     address = None

        address = Address.objects.get_default_address(user)

        if address:
            is_default = False
        else:
            is_default = True

        # 添加地址
        Address.objects.create(user=user,
                               receiver=receiver,
                               addr=addr,
                               zip_code=zip_code,
                               phone=phone,
                               is_default=is_default)

        # 返回应答,刷新地址页面
        return redirect(reverse('user:address')) # get请求方式








================================================
FILE: dailyfresh/celery_tasks/__init__.py
================================================


================================================
FILE: dailyfresh/celery_tasks/tasks.py
================================================
# 使用celery
from django.core.mail import send_mail
from django.conf import settings
from django.template import loader, RequestContext
from celery import Celery
import time

# 在任务处理者一端加这几句,Django环境的初始化
import os
import django
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "dailyfresh.settings")
django.setup()

from goods.models import GoodsType,IndexGoodsBanner,IndexPromotionBanner,IndexTypeGoodsBanner
# from django_redis import get_redis_connection

# 创建一个Celery类的实例对象 第一个参数一般写的是路径,broker使用redis,8代表8号数据库
app = Celery('celery_tasks.tasks', broker='redis://127.0.0.1:6379/8')


# 定义任务函数(发邮件)
@app.task
def send_register_active_email(to_email, username, token):
    '''发送激活邮件'''
    # 组织邮件信息
    subject = '天天生鲜欢迎信息'
    message = ''
    sender = settings.EMAIL_FROM
    receiver = [to_email]
    html_message = '<h1>%s, 欢迎您成为天天生鲜注册会员</h1>请点击下面链接激活您的账户<br/><a href="http://127.0.0.1:8000/user/active/%s">http://127.0.0.1:8000/user/active/%s</a>' % (username, token, token)

    send_mail(subject, message, sender, receiver, html_message=html_message)
    time.sleep(5)


@app.task
def generate_static_index_html():
    '''产生首页静态页面'''
    # 获取商品的种类信息
    types = GoodsType.objects.all()

    # 获取首页轮播商品信息
    goods_banners = IndexGoodsBanner.objects.all().order_by('index')

    # 获取首页促销活动信息
    promotion_banners = IndexPromotionBanner.objects.all().order_by('index')

    # 获取首页分类商品展示信息
    for type in types:  # GoodsType
        # 获取type种类首页分类商品的图片展示信息
        image_banners = IndexTypeGoodsBanner.objects.filter(type=type, display_type=1).order_by('index')
        # 获取type种类首页分类商品的文字展示信息
        title_banners = IndexTypeGoodsBanner.objects.filter(type=type, display_type=0).order_by('index')

        # 动态给type增加属性,分别保存首页分类商品的图片展示信息和文字展示信息
        type.image_banners = image_banners
        type.title_banners = title_banners


    # 组织模板上下文
    context = {'types': types,
               'goods_banners': goods_banners,
               'promotion_banners': promotion_banners}

    # 使用模板
    # 1.加载模板文件,返回模板对象
    temp = loader.get_template('static_index.html')
    # 2.模板渲染
    static_index_html = temp.render(context)
    print(static_index_html)
    # 生成首页对应静态文件
    save_path = os.path.join(settings.BASE_DIR, 'static/index.html')
    print(save_path)
    with open(save_path, 'w') as f:
        f.write(static_index_html)










================================================
FILE: dailyfresh/dailyfresh/__init__.py
================================================
import pymysql
pymysql.install_as_MySQLdb()

================================================
FILE: dailyfresh/dailyfresh/settings.py
================================================
"""
Django settings for dailyfresh project.

Generated by 'django-admin startproject' using Django 1.8.2.

For more information on this file, see
https://docs.djangoproject.com/en/1.8/topics/settings/

For the full list of settings and their values, see
https://docs.djangoproject.com/en/1.8/ref/settings/
"""

# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
import os
import sys

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

sys.path.insert(0, os.path.join(BASE_DIR, 'apps'))

# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/1.8/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'bga5t#n-a9=mx^glxprkc#16c#z*n_t%o8jiwh(y*i+h7c!xo$'

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
# DEBUG = True
ALLOWED_HOSTS = ['*']
# ALLOWED_HOSTS = []

# Application definition

INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'tinymce', # 富文本编辑器
    'haystack', # 注册全文检索框架
    'user', # 用户模块
    'goods', # 商品模块
    'cart', # 购物车模块
    'order', # 订单模块
)

MIDDLEWARE_CLASSES = (
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'django.middleware.security.SecurityMiddleware',
)

ROOT_URLCONF = 'dailyfresh.urls'

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

WSGI_APPLICATION = 'dailyfresh.wsgi.application'


# Database
# https://docs.djangoproject.com/en/1.8/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'dailyfresh',
        'USER': 'root',
        'PASSWORD': '123456',
        'HOST': 'localhost',
        'PORT':3306,
    }
}

# django认证系统使用的模型类
AUTH_USER_MODEL='user.User' # python manage.py createsuper

# Internationalization
# https://docs.djangoproject.com/en/1.8/topics/i18n/

LANGUAGE_CODE = 'zh-hans'

TIME_ZONE = 'Asia/Shanghai'

USE_I18N = True

USE_L10N = True

USE_TZ = True


# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.8/howto/static-files/

STATIC_URL = '/static/'
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]
# 指定收集静态文件的路径
STATIC_ROOT='/var/www/dailyfresh/static'

# 富文本编辑器配置
TINYMCE_DEFAULT_CONFIG = {
    'theme': 'advance',
    'width': 600,
    'height': 400,
}

# 发送邮件配置
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
# smpt服务地址
EMAIL_HOST = 'smtp.qq.com'
EMAIL_PORT = 25
# 发送邮件的邮箱
EMAIL_HOST_USER = '171628543@qq.com'
# 在邮箱中设置的客户端授权密码
EMAIL_HOST_PASSWORD = 'eqpqbdxruabebibh'
# 收件人看到的发件人
EMAIL_FROM = '天天生鲜<171628543@qq.com>'


# Django的缓存配置
CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379/9",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
        }
    }
}

# 配置session存储
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
SESSION_CACHE_ALIAS = "default"

# 配置登录url地址
LOGIN_URL='/user/login' # /accounts/login?next=/user

# 设置Django的文件存储类
DEFAULT_FILE_STORAGE='utils.fdfs.storage.FDFSStorage'

# 设置fdfs使用的client.conf文件路径
FDFS_CLIENT_CONF='./utils/fdfs/client.conf'

# 设置fdfs存储服务器上nginx的IP和端口号
FDFS_URL='http://192.168.31.89:8888/'

# 全文检索框架的配置
HAYSTACK_CONNECTIONS = {
    'default': {
        # 使用whoosh引擎
        'ENGINE': 'haystack.backends.whoosh_cn_backend.WhooshEngine',
        # 'ENGINE': 'haystack.backends.whoosh_backend.WhooshEngine',
        # 索引文件路径
        'PATH': os.path.join(BASE_DIR, 'whoosh_index'),
    }
}

# 当添加、修改、删除数据时,自动生成索引
HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'

# 指定搜索结果每页显示的条数
HAYSTACK_SEARCH_RESULTS_PER_PAGE=1


================================================
FILE: dailyfresh/dailyfresh/urls.py
================================================
"""dailyfresh URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/1.8/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  url(r'^$', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  url(r'^$', Home.as_view(), name='home')
Including another URLconf
    1. Add an import:  from blog import urls as blog_urls
    2. Add a URL to urlpatterns:  url(r'^blog/', include(blog_urls))
"""
from django.conf.urls import include, url
from django.contrib import admin

urlpatterns = [
    url(r'^admin/', include(admin.site.urls)),
    url(r'^tinymce/', include('tinymce.urls')), # 富文本编辑器
    url(r'^search', include('haystack.urls')), # 全文检索框架
    url(r'^user/', include('user.urls', namespace='user')), # 用户模块
    url(r'^cart/', include('cart.urls', namespace='cart')), # 购物车模块
    url(r'^order/', include('order.urls', namespace='order')), # 订单模块
    url(r'^', include('goods.urls', namespace='goods')), # 商品模块
]


================================================
FILE: dailyfresh/dailyfresh/wsgi.py
================================================
"""
WSGI config for dailyfresh project.

It exposes the WSGI callable as a module-level variable named ``application``.

For more information on this file, see
https://docs.djangoproject.com/en/1.8/howto/deployment/wsgi/
"""

import os

from django.core.wsgi import get_wsgi_application

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "dailyfresh.settings")

application = get_wsgi_application()


================================================
FILE: dailyfresh/dailyfresh.sql
================================================
/*!40000 ALTER TABLE `df_goods` DISABLE KEYS */;
INSERT INTO `df_goods` VALUES (1,'2017-11-15 03:03:05.257969','2017-11-15 03:03:05.258130',0,'草莓','<p><strong>很不错的草莓</strong></p>'),(2,'2017-11-15 03:05:36.964951','2017-11-15 03:05:36.965129',0,'葡萄',''),(3,'2017-11-15 03:05:52.323866','2017-11-15 03:05:52.323949',0,'柠檬',''),(4,'2017-11-15 03:06:01.267481','2017-11-15 03:06:01.267615',0,'奇异果',''),(5,'2017-11-15 03:06:30.418683','2017-11-15 03:06:30.418789',0,'大青虾',''),(6,'2017-11-15 03:06:35.994464','2017-11-15 03:06:35.994567',0,'秋刀鱼',''),(7,'2017-11-15 03:06:48.115318','2017-11-15 03:06:48.115410',0,'扇贝',''),(8,'2017-11-15 03:07:03.057514','2017-11-15 03:07:03.057601',0,'基围虾',''),(9,'2017-11-15 03:07:36.306725','2017-11-15 03:07:36.306926',0,'猪肉',''),(10,'2017-11-15 03:07:39.056064','2017-11-15 03:07:39.056145',0,'牛肉',''),(11,'2017-11-15 03:07:41.955755','2017-11-15 03:07:41.955833',0,'羊肉',''),(12,'2017-11-15 03:07:44.741474','2017-11-15 03:07:44.741574',0,'牛排',''),(13,'2017-11-15 03:07:51.748699','2017-11-15 03:07:51.748828',0,'鸡蛋',''),(14,'2017-11-15 03:07:56.413773','2017-11-15 03:07:56.413853',0,'鸡肉',''),(15,'2017-11-15 03:07:59.568405','2017-11-15 03:07:59.568554',0,'鸭蛋',''),(16,'2017-11-15 03:08:03.020608','2017-11-15 03:08:03.020764',0,'鸡腿',''),(17,'2017-11-15 03:08:10.063820','2017-11-15 03:08:10.063898',0,'白菜',''),(18,'2017-11-15 03:08:13.315906','2017-11-15 03:08:13.316025',0,'芹菜',''),(19,'2017-11-15 03:08:16.351445','2017-11-15 03:08:16.351526',0,'香菜',''),(20,'2017-11-15 03:08:24.232660','2017-11-15 03:08:24.232743',0,'冬瓜',''),(21,'2017-11-15 03:08:36.939678','2017-11-15 03:08:36.940113',0,'鱼丸',''),(22,'2017-11-15 03:08:43.194862','2017-11-15 03:08:43.194985',0,'蟹棒',''),(23,'2017-11-15 03:08:50.771785','2017-11-15 03:08:50.771931',0,'虾丸',''),(24,'2017-11-15 03:09:01.546052','2017-11-15 03:09:01.546152',0,'速冻水饺',''),(25,'2017-11-14 08:50:50.383071','2017-11-14 08:50:50.383115',0,'芒果',''),(26,'2017-11-17 07:54:26.657410','2017-11-17 07:54:26.657443',0,'鹌鹑蛋',''),(27,'2017-11-17 07:54:35.205668','2017-11-17 07:54:35.205703',0,'鹅蛋',''),(28,'2017-11-17 07:54:46.756236','2017-11-17 07:54:46.756272',0,'红辣椒','');
/*!40000 ALTER TABLE `df_goods` ENABLE KEYS */;



/*!40000 ALTER TABLE `df_goods_sku` DISABLE KEYS */;
INSERT INTO `df_goods_sku` VALUES (1,'2017-11-15 03:10:14.045538','2017-11-14 08:24:49.138489',0,'草莓 500g','草莓简介',10.00,'500g','group1/M00/00/00/rBCzg1oKqFGAR2tjAAAljHPuXJg4272079',98,0,1,1,1),(2,'2017-11-15 03:11:04.490384','2017-11-14 08:44:43.484243',0,'盒装草莓','草莓简介',20.00,'盒','group1/M00/00/00/rBCzg1oKrPuAKse1AAEc8FlxEvU2553153',10,0,1,1,1),(3,'2017-11-15 03:12:32.165020','2017-11-14 08:25:22.505620',0,'葡萄','葡萄简介',20.00,'500g','group1/M00/00/00/rBCzg1oKqHKAYfXaAAAjjiYTEkw5436358',7,0,1,2,1),(4,'2017-11-15 03:13:16.457844','2017-11-14 08:25:34.181904',0,'柠檬','简介',32.00,'500g','group1/M00/00/00/rBCzg1oKqH6AMZt_AAAgnaeGwNQ6246033',12,0,1,3,1),(5,'2017-11-15 03:14:05.799352','2017-11-14 08:25:56.427676',0,'奇异果','简介',12.12,'500g','group1/M00/00/00/rBCzg1oKqJSAS1xIAAAeuLYy0pU6253560',12,0,1,4,1),(6,'2017-11-15 03:15:09.971968','2017-11-14 08:26:09.113586',0,'大青虾','简介',34.00,'500g','group1/M00/00/00/rBCzg1oKqKGAFAV-AAA5OS4Kl4c4097622',12,0,1,5,2),(7,'2017-11-15 03:15:53.812181','2017-11-14 08:26:19.094675',0,'北海道秋刀鱼','简介',50.00,'500g','group1/M00/00/00/rBCzg1oKqKuAavf8AAAkaP_7_187862565',15,0,1,6,2),(8,'2017-11-15 03:16:24.763232','2017-11-14 08:26:31.121824',0,'扇贝','简介',56.60,'500g','group1/M00/00/00/rBCzg1oKqLeATLQAAAAk8WCqqmI2968215',13,0,1,7,2),(9,'2017-11-15 03:17:13.426611','2017-11-14 08:26:58.739624',0,'基围虾','简介',100.90,'500g','group1/M00/00/00/rBCzg1oKqNKANQKOAAAk0DN4-yE7007770',14,0,1,8,2),(10,'2017-11-15 03:17:47.656066','2017-11-14 08:29:56.158261',0,'猪肉','简介',23.99,'500g','group1/M00/00/00/rBCzg1oKqYSASWr0AAEVpb1YHUE4011268',100,0,1,9,3),(11,'2017-11-15 03:18:15.497630','2017-11-14 08:31:27.169999',0,'牛肉','简介',34.99,'500g','group1/M00/00/00/rBCzg1oKqd-AUsoBAAEExAU4yXU2908730',100,0,1,10,3),(12,'2017-11-15 03:18:44.453933','2017-11-14 08:32:22.493340',0,'羊肉','简介',56.99,'500g','group1/M00/00/00/rBCzg1oKqhaAKgwkAAB6NOQDrpk3374052',100,0,1,11,3),(13,'2017-11-15 03:19:10.209472','2017-11-14 08:33:15.061544',0,'牛排','简介',99.99,'500g','group1/M00/00/00/rBCzg1oKqkuAUD0WAACwa3rCDPQ3064181',100,0,1,12,3),(14,'2017-11-15 03:19:44.020204','2017-11-14 08:34:31.275370',0,'盒装鸡蛋','简介',23.00,'500g','group1/M00/00/00/rBCzg1oKqpeAZnSEAADUKbwLSqY1972845',100,0,1,13,4),(15,'2017-11-15 03:20:20.962831','2017-11-14 08:35:21.725162',0,'鸡肉','简介',32.00,'500g','group1/M00/00/00/rBCzg1oKqsmAVxzcAADUY5hC_sI5143658',100,0,1,14,4),(16,'2017-11-15 03:20:53.724305','2017-11-14 08:37:27.336911',0,'鸭蛋','简介',45.00,'盒','group1/M00/00/00/rBCzg1oKq0eAMxKFAAFC_2tSkFo4950479',121,0,1,15,4),(17,'2017-11-15 03:21:22.965398','2017-11-14 08:38:08.440778',0,'鸡腿','简介',45.00,'500g','group1/M00/00/00/rBCzg1oKq3CADiewAAA2_p7G96w3860045',12,0,1,16,4),(18,'2017-11-15 03:22:04.462490','2017-11-14 08:38:45.119926',0,'白菜','简介',4.50,'500g','group1/M00/00/00/rBCzg1oKq5WAQnWDAADWHYeKaNI7952227',100,0,1,17,5),(19,'2017-11-15 03:22:31.745392','2017-11-14 08:39:40.030728',0,'芹菜','简介',3.50,'500g','group1/M00/00/00/rBCzg1oKq8yAa_CvAACIrzuaK646641688',12,0,1,18,5),(20,'2017-11-15 03:23:21.161526','2017-11-14 08:40:08.185684',0,'香菜','简介',7.90,'500g','group1/M00/00/00/rBCzg1oKq-iAUG8xAACNpHC0IEY3849954',100,0,1,19,5),(21,'2017-11-15 03:23:46.986158','2017-11-14 08:40:38.330247',0,'冬瓜','简介',12.99,'500g','group1/M00/00/00/rBCzg1oKrAaAN1Z6AAENHrNG1-s8874196',100,0,1,20,5),(22,'2017-11-15 03:24:10.445214','2017-11-14 08:41:19.155821',0,'鱼丸','简介',66.00,'500g','group1/M00/00/00/rBCzg1oKrC-ACdOBAADZQphQJ2o3748807',12,0,1,21,6),(23,'2017-11-15 03:24:37.927158','2017-11-14 08:41:59.658787',0,'蟹棒','简介',68.00,'500g','group1/M00/00/00/rBCzg1oKrFeAJ9PuAABxy5vKkgY2006901',100,0,1,22,6),(24,'2017-11-15 03:25:18.235816','2017-11-14 08:42:25.868409',0,'虾丸','简介',89.99,'500g','group1/M00/00/00/rBCzg1oKrHGADF7jAABICav_wjk1418828',100,0,1,23,6),(25,'2017-11-15 03:25:56.170531','2017-11-14 08:43:18.768380',0,'速冻水饺','简介',20.00,'袋','group1/M00/00/00/rBCzg1oKrKaAFrRTAACMoBJXjDs3577358',100,0,1,24,6),(26,'2017-11-14 08:53:00.188619','2017-11-14 08:53:00.188652',0,'越南芒果','新鲜越南芒果',29.90,'2.5kg','group1/M00/00/00/rBCzg1oKruyABIIzAAByzTJcTjM7085820',100,0,1,25,1),(27,'2017-11-17 07:57:00.677981','2017-11-17 07:57:00.678022',0,'鹌鹑蛋','简介',39.80,'126枚','group1/M00/00/00/rBCzg1oOlkyAHiH3AAGZ6KapWiA5556935',100,0,1,26,4),(28,'2017-11-17 07:58:18.361078','2017-11-17 07:58:18.361122',0,'鹅蛋','简介',49.90,'6枚','group1/M00/00/00/rBCzg1oOlpqAOZ8gAADg_NUp5b47679136',80,0,1,27,4),(29,'2017-11-17 07:59:48.998394','2017-11-17 07:59:48.998431',0,'红辣椒','简介',11.00,'2.5kg','group1/M00/00/00/rBCzg1oOlvWAB6BMAAHXO8pdocY9345486',150,0,1,28,5);
/*!40000 ALTER TABLE `df_goods_sku` ENABLE KEYS */;


/*!40000 ALTER TABLE `df_goods_type` DISABLE KEYS */;
INSERT INTO `df_goods_type` VALUES (1,'2017-11-14 05:02:09.888544','2017-11-14 05:02:09.888598',0,'新鲜水果','fruit','group1/M00/00/00/rBCzg1oKeNKAEl87AAAmv27pX4k4942898'),(2,'2017-11-14 05:04:32.069517','2017-11-14 05:04:32.069561',0,'海鲜水产','seafood','group1/M00/00/00/rBCzg1oKeWCAOQBsAABHr3RQqFs4497074'),(3,'2017-11-14 05:05:34.514415','2017-11-14 05:05:34.514449',0,'猪牛羊肉','meet','group1/M00/00/00/rBCzg1oKeZ6AA5HjAAAy1Tlm9So7276786'),(4,'2017-11-14 05:05:58.366135','2017-11-14 05:05:58.366170',0,'禽类蛋品','egg','group1/M00/00/00/rBCzg1oKebaAcEWVAAAqR4DoSUg3788077'),(5,'2017-11-14 05:06:32.561861','2017-11-14 05:06:32.561895',0,'新鲜蔬菜','vegetables','group1/M00/00/00/rBCzg1oKediAdUaaAAA-0ZoYkpM9419116'),(6,'2017-11-14 05:06:55.562634','2017-11-14 05:06:55.562673',0,'速冻食品','ice','group1/M00/00/00/rBCzg1oKee-AGMXLAAA3sZPrVzQ0297876');
/*!40000 ALTER TABLE `df_goods_type` ENABLE KEYS */;



/*!40000 ALTER TABLE `df_index_banner` DISABLE KEYS */;
INSERT INTO `df_index_banner` VALUES (1,'2017-11-14 08:48:05.549864','2017-11-14 08:48:05.549896',0,'group1/M00/00/00/rBCzg1oKrcWAX7y-AACpB-LsCdE6038911',0,5),(2,'2017-11-14 08:53:26.498965','2017-11-14 08:53:26.499001',0,'group1/M00/00/00/rBCzg1oKrwaAUerYAAC3B-z8J2c2488703',1,26),(3,'2017-11-14 08:53:40.586457','2017-11-14 08:53:40.586490',0,'group1/M00/00/00/rBCzg1oKrxSAac1BAAETwXb_pso9132934',2,13),(4,'2017-11-14 08:54:02.805958','2017-11-14 08:54:02.805992',0,'group1/M00/00/00/rBCzg1oKryqAPjmzAAD0akkXmFo4923405',3,9);
/*!40000 ALTER TABLE `df_index_banner` ENABLE KEYS */;


/*!40000 ALTER TABLE `df_index_promotion` DISABLE KEYS */;
INSERT INTO `df_index_promotion` VALUES (1,'2017-11-14 08:56:21.863522','2017-11-17 08:29:08.554743',0,'吃货暑假趴','#','group1/M00/00/00/rBCzg1oKr7aAdR-2AAA2pLUeB609027808',0),(2,'2017-11-14 08:56:53.522161','2017-11-14 08:56:53.522193',0,'盛夏尝鲜季','#','group1/M00/00/00/rBCzg1oKr9WADLksAAA98yvCs1I5148432',1);
/*!40000 ALTER TABLE `df_index_promotion` ENABLE KEYS */;


/*!40000 ALTER TABLE `df_index_type_goods` DISABLE KEYS */;
INSERT INTO `df_index_type_goods` VALUES (1,'2017-11-14 08:57:41.509910','2017-11-14 08:57:41.509945',0,1,0,1,1),(2,'2017-11-14 08:57:50.129355','2017-11-14 08:57:50.129388',0,1,1,3,1),(3,'2017-11-14 08:58:00.896427','2017-11-14 08:58:00.896459',0,1,2,5,1),(4,'2017-11-14 08:58:20.417072','2017-11-14 08:58:20.417107',0,1,3,4,1),(5,'2017-11-14 08:58:32.934165','2017-11-14 08:58:32.934197',0,0,0,2,1),(6,'2017-11-14 08:58:53.943189','2017-11-14 08:58:53.943227',0,0,1,4,1),(7,'2017-11-14 08:59:16.396829','2017-11-14 08:59:16.396864',0,1,0,6,2),(8,'2017-11-14 08:59:25.723510','2017-11-14 08:59:25.723545',0,1,1,7,2),(9,'2017-11-14 08:59:37.353278','2017-11-14 08:59:37.353315',0,1,2,8,2),(10,'2017-11-14 08:59:48.082119','2017-11-14 09:30:28.117330',0,1,3,9,2),(11,'2017-11-14 08:59:59.725972','2017-11-14 08:59:59.726006',0,0,0,9,2),(12,'2017-11-14 09:00:11.685051','2017-11-14 09:00:11.685098',0,0,1,8,2),(13,'2017-11-14 09:00:20.409490','2017-11-14 09:00:20.409522',0,1,0,10,3),(15,'2017-11-14 09:00:41.325634','2017-11-14 09:00:41.325668',0,1,2,12,3),(16,'2017-11-14 09:00:56.193991','2017-11-14 09:00:56.194023',0,1,3,13,3),(17,'2017-11-14 09:01:09.550978','2017-11-14 09:01:09.551016',0,0,0,15,3),(18,'2017-11-14 09:01:18.798219','2017-11-14 09:01:18.798251',0,1,1,17,3),(19,'2017-11-14 09:01:29.182673','2017-11-14 09:01:29.182705',0,1,0,14,4),(20,'2017-11-14 09:01:44.702111','2017-11-14 09:01:44.702146',0,1,1,16,4),(21,'2017-11-14 09:02:01.490018','2017-11-14 09:02:01.490053',0,0,0,14,4),(22,'2017-11-14 09:02:14.000306','2017-11-14 09:02:14.000344',0,0,1,16,4),(23,'2017-11-14 09:02:29.300733','2017-11-14 09:02:29.300768',0,1,0,18,5),(24,'2017-11-14 09:02:38.655411','2017-11-14 09:02:38.655444',0,1,1,19,5),(25,'2017-11-14 09:02:48.641048','2017-11-14 09:02:48.641080',0,1,2,20,5),(26,'2017-11-14 09:03:01.896718','2017-11-14 09:03:01.896759',0,0,0,20,5),(27,'2017-11-14 09:03:14.583044','2017-11-14 09:03:14.583086',0,0,1,19,5),(28,'2017-11-14 09:03:27.597171','2017-11-14 09:03:27.597206',0,1,0,22,6),(29,'2017-11-14 09:03:37.078417','2017-11-14 09:03:37.078451',0,1,1,23,6),(30,'2017-11-14 09:03:48.459266','2017-11-14 09:03:48.459299',0,1,2,24,6),(31,'2017-11-14 09:03:58.834392','2017-11-14 09:03:58.834428',0,1,3,25,6),(32,'2017-11-14 09:04:11.118584','2017-11-14 09:04:11.118628',0,0,0,23,6),(33,'2017-11-14 09:04:21.235831','2017-11-14 09:04:21.235887',0,0,1,25,6),(34,'2017-11-17 08:00:09.522776','2017-11-17 08:00:09.522811',0,1,2,27,4),(35,'2017-11-17 08:00:19.382093','2017-11-17 08:00:19.382125',0,1,3,28,4),(36,'2017-11-17 08:00:31.352237','2017-11-17 08:00:31.352274',0,1,3,29,5);
/*!40000 ALTER TABLE `df_index_type_goods` ENABLE KEYS */;


================================================
FILE: dailyfresh/db/__init__.py
================================================


================================================
FILE: dailyfresh/db/base_model.py
================================================
from django.db import models


class BaseModel(models.Model):
    '''模型抽象基类'''
    create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
    update_time = models.DateTimeField(auto_now=True, verbose_name='更新时间')
    is_delete = models.BooleanField(default=False, verbose_name='删除标记')

    class Meta:
        # 说明是一个抽象模型类
        abstract = True

================================================
FILE: dailyfresh/manage.py
================================================
#!/usr/bin/env python
import os
import sys

if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "dailyfresh.settings")

    from django.core.management import execute_from_command_line

    execute_from_command_line(sys.argv)


================================================
FILE: dailyfresh/static/cart(1).html
================================================
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
	<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
	<title>天天生鲜-购物车</title>
	<link rel="stylesheet" type="text/css" href="css/reset.css">
	<link rel="stylesheet" type="text/css" href="css/main.css">
</head>
<body>
	<div class="header_con">
		<div class="header">
			<div class="welcome fl">欢迎来到天天生鲜!</div>
			<div class="fr">
				<div class="login_info fl">
					欢迎您:<em>张 山</em>
				</div>
				<div class="login_btn fl">
					<a href="login.html">登录</a>
					<span>|</span>
					<a href="register.html">注册</a>
				</div>
				<div class="user_link fl">
					<span>|</span>
					<a href="user_center_info.html">用户中心</a>
					<span>|</span>
					<a href="cart.html">我的购物车</a>
					<span>|</span>
					<a href="user_center_order.html">我的订单</a>
				</div>
			</div>
		</div>		
	</div>

	<div class="search_bar clearfix">
		<a href="index.html" class="logo fl"><img src="images/logo.png"></a>
		<div class="sub_page_name fl">|&nbsp;&nbsp;&nbsp;&nbsp;购物车</div>
		<div class="search_con fr">
			<input type="text" class="input_text fl" name="" placeholder="搜索商品">
			<input type="button" class="input_btn fr" name="" value="搜索">
		</div>		
	</div>

	<div class="total_count">全部商品<em>2</em>件</div>	
	<ul class="cart_list_th clearfix">
		<li class="col01">商品名称</li>
		<li class="col02">商品单位</li>
		<li class="col03">商品价格</li>
		<li class="col04">数量</li>
		<li class="col05">小计</li>
		<li class="col06">操作</li>
	</ul>
	<ul class="cart_list_td clearfix">
		<li class="col01"><input type="checkbox" name="" checked></li>
		<li class="col02"><img src="images/goods/goods012.jpg"></li>
		<li class="col03">奇异果<br><em>25.80元/500g</em></li>
		<li class="col04">500g</li>
		<li class="col05">25.80元</li>
		<li class="col06">
			<div class="num_add">
				<a href="javascript:;" class="add fl">+</a>
				<input type="text" class="num_show fl" value="1">	
				<a href="javascript:;" class="minus fl">-</a>	
			</div>
		</li>
		<li class="col07">25.80元</li>
		<li class="col08"><a href="javascript:;">删除</a></li>
	</ul>

	<ul class="cart_list_td clearfix">
		<li class="col01"><input type="checkbox" name="" checked></li>
		<li class="col02"><img src="images/goods/goods003.jpg"></li>
		<li class="col03">大兴大棚草莓<br><em>16.80元/500g</em></li>
		<li class="col04">500g</li>
		<li class="col05">16.80元</li>
		<li class="col06">
			<div class="num_add">
				<a href="javascript:;" class="add fl">+</a>
				<input type="text" class="num_show fl" value="1">	
				<a href="javascript:;" class="minus fl">-</a>	
			</div>
		</li>
		<li class="col07">16.80元</li>
		<li class="col08"><a href="javascript:;">删除</a></li>
	</ul>
	

	<ul class="settlements">
		<li class="col01"><input type="checkbox" name="" checked=""></li>
		<li class="col02">全选</li>
		<li class="col03">合计(不含运费):<span>¥</span><em>42.60</em><br>共计<b>2</b>件商品</li>
		<li class="col04"><a href="place_order.html">去结算</a></li>
	</ul>

	<div class="footer">
		<div class="foot_link">
			<a href="#">关于我们</a>
			<span>|</span>
			<a href="#">联系我们</a>
			<span>|</span>
			<a href="#">招聘人才</a>
			<span>|</span>
			<a href="#">友情链接</a>		
		</div>
		<p>CopyRight © 2016 北京天天生鲜信息技术有限公司 All Rights Reserved</p>
		<p>电话:010-****888    京ICP备*******8号</p>
	</div>
	
</body>
</html>

================================================
FILE: dailyfresh/static/css/main.css
================================================
body{font-family:'Microsoft Yahei';font-size:12px;color:#666;}
html,body{height:100%}
/* 顶部样式 */
.header_con{
	background-color:#f7f7f7;
	height:29px;
	border-bottom:1px solid #dddddd
}

.header{
	width:1200px;
	height:29px;
	margin:0 auto;
}

.welcome,.login_info,.login_btn,.user_link{
	line-height:29px;
}

.login_info{
	display:none;
}

.login_info em{color:#ff8800}

.login_btn a,.user_link a{
	color:#666;
}

.login_btn a:hover,.user_link a:hover{
	color:#ff8800;
}

.login_btn span,.user_link span{
	color:#cecece;
	margin:0 10px;
}


/* logo、搜索框、购物车样式 */

.search_bar{width:1200px;height:115px;margin:0 auto;}
.logo{width:150px;height:59px;margin:29px 0 0 17px;}

.search_con{width:616px;height:38px;border:1px solid #37ab40;margin:34px 0 0 124px;background:url(../images/icons.png) 10px -338px no-repeat;}
.search_con .input_text{width:470px;height:34px;border:0px;margin:2px 0 0 36px;outline:none;font-size:12px;color:#737272;font-family:'Microsoft Yahei'}

.search_con .input_btn{
	width:100px;height:38px;background-color:#37ab40;border:0px;font-size:14px;color:#fff;font-family:'Microsoft Yahei';outline:none;cursor:pointer;
}

.guest_cart{
	width:200px;height:40px;margin-top:34px;
}

.guest_cart .cart_name{
	width:158px;height:38px;line-height:38px;border:1px solid #dddddd;display:block;background:url(../images/icons.png) 13px -300px no-repeat;font-size:14px;color:#37ab40;text-indent:56px;
}

.guest_cart .goods_count{
	width:40px;height:40px;text-align:center;line-height:40px;font-size:18px;
	font-weight:bold;color:#fff;background-color:#ff8800;
}


/* 菜单、幻灯片样式 */

.navbar_con{height:40px;border-bottom:2px solid #39a93e}
.navbar{width:1200px;margin:0 auto;}
.navbar h1{width:200px;height:40px;line-height:40px;text-align: center;font-size:14px;color:#fff;background-color:#39a93e;}

.navbar .subnav_con{width:200px;height:40px;background-color:#39a93e;position:relative;cursor:pointer;}

.navbar .subnav_con h1{position:absolute;left:0;top:0;text-align:left;text-indent:40px}
.navbar .subnav_con span{display:block;width:16px;height:9px;background:url(../images/down.png) no-repeat;position:absolute;right:27px;top:16px;transition:all 300ms ease-in;
}

.navbar .subnav_con:hover span{transform:rotateZ(180deg)}

.navbar .subnav_con .subnav{position:absolute;left:0;top:40px;display:none;border-top:2px solid  #39a93e;}
.navbar .subnav_con:hover .subnav{display:block;}


.navlist{margin-left:34px;}
.navlist li{height:40px;float:left;line-height:40px;}
.navlist li a{color:#666;font-size:14px}
.navlist li a:hover{color:#ff8800}
.navlist .interval{margin:0 15px;}


.center_con{width:1200px;height:270px;margin:0 auto;}
.subnav{width:198px;height:270px;border-left:1px solid #eee;border-right:1px solid #eee;}
.subnav li{height:44px;border-bottom:1px solid #eee;background:url(../images/icons.png) 178px -257px no-repeat #fff;}

.subnav li a{display:block;height:44px;line-height:44px;text-indent:71px;font-size:14px;color:#333}
.subnav li a:hover{color:#ff8800}

.subnav li .fruit{background:url(../images/icons.png) 28px 0px no-repeat;}
.subnav li .seafood{background:url(../images/icons.png) 28px -43px no-repeat;}
.subnav li .meet{background:url(../images/icons.png) 28px -86px no-repeat;}
.subnav li .egg{background:url(../images/icons.png) 28px -132px no-repeat;}
.subnav li .vegetables{background:url(../images/icons.png) 28px -174px no-repeat;}
.subnav li .ice{background:url(../images/icons.png) 28px -220px no-repeat;}


.slide{width:760px;height:270px;position:relative;overflow:hidden;}
.slide .slide_pics{position:relative;left:0;top:0;width:760px;height:270px;}
.slide .slide_pics li{width:760px;height:270px;position:absolute;left:0;top:0}
.slide .prev,.slide .next{width:17px;height:23px;background:url(../images/icons.png) left -388px no-repeat;position:absolute;left:11px;top:122px;cursor:pointer;}
.slide .next{background-position:left -428px;left:732px;}
.points{width:100%;height:11px;position:absolute;left:0;top:250px;text-align:center;}
.points li{display:inline-block;width:11px;height:11px;margin:0 5px;background-color:#9f9f9f;border-radius:50%;cursor:pointer;}
.points li.active{background-color:#cecece}

.adv{width:240px;height:270px; overflow:hidden; background-color:gold;}
.adv a{display:block;float:left;}


/* 商品列表样式 */

.list_model{width:1200px;height:340px;margin:15px auto 0;}
.list_title{height:40px;border-bottom:2px solid #42ad46}
.list_title h3{height:40px;line-height:40px;font-size:16px;color:#37ab40;font-weight:bold;}
.list_title .subtitle{height:20px;line-height:20px;margin-top:15px;}
.list_title .subtitle span{color:#666;margin:0 10px 0 20px;}
.list_title .subtitle a{color:#666;margin:0 5px;}
.list_title .subtitle a:hover,.goods_more:hover{color:#ff8800}
.goods_more{height:20px;margin-top:15px;color:#666}

.goods_con{height:300px;}
.goods_banner{width:200px;height:300px;}
.goods_banner img{width:200px;height:300px;}

.goods_list{width:1000px;height:299px;border-bottom:1px solid #ededed}
.goods_list li{height:299px;width:249px;border-right:1px solid #ededed;float:left}
.goods_list li:hover{width:248px;height:297px;border:1px solid gold;}
.goods_list li:hover img{opacity:0.8}

.goods_list li h4{width:200px;height:50px;margin:20px auto 0;text-align:center;}
.goods_list li h4 a{font-size:14px;color:#666;font-weight:normal;line-height:24px;}
.goods_list li h4 a:hover{color:#ff8800}

.goods_list li img{display:block;width:180px;height:180px;margin:0 auto;}
.goods_list li .prize{text-align:center;font-size:20px;color:#c40000;margin-top:5px;}

/* 页面底部样式 */
.footer{
	border-top:2px solid #42ad46;
	margin:30px 0;
}

.foot_link{text-align:center;margin-top:30px;}
.foot_link a,.foot_link span{color:#4e4e4e;}
.foot_link a:hover{color:#ff8800}
.foot_link span{padding:0 10px}
.footer p{text-align:center; margin-top:10px;}


/* 二级页面面包屑导航 */
.breadcrumb{
	width:1200px;height:40px;margin:0 auto;
}
.breadcrumb a{line-height:40px;color:#37ab40}
.breadcrumb a:hover{color:#ff8800}
.breadcrumb span{line-height:40px;color:#666;padding:0 5px;}


.main_wrap{width:1200px;margin:0 auto;}
.l_wrap{width:200px;}
.r_wrap{width:980px;}


/* 新品推荐样式 */

.new_goods{
	border:1px solid #ededed;
	border-top:2px solid #37ab40;
	padding-bottom:10px;
}

.new_goods h3{
	height:33px;line-height:33px;background-color:#fcfcfc;border-bottom:1px solid #ededed;font-size:14px;font-weight:normal;text-indent:10px;
}

.new_goods ul{width:160px;margin:0 auto;overflow:hidden;}
.new_goods li{border-bottom:1px solid #ededed;margin-bottom:-1px;}
.new_goods li img{display:block;width:150px;height:150px;margin:10px auto;}
.new_goods li h4{width:160px;margin:0 auto;}
.new_goods li h4 a{font-weight:normal;color:#666;display:block;width:160px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;}
.new_goods li .prize{font-size:14px;color:#da260e;margin:10px auto;}



/* 商品列表样式 */

.sort_bar{height:30px;background-color:#f0fdec}
.sort_bar a{display:block;height:30px;line-height:30px;padding:0 20px;float:left;color:#000}
.sort_bar .active{background-color:#37ab40;color:#fff;}


.goods_type_list{
	margin:10px auto 0;
}

.goods_type_list li{
	width:196px;
	float:left;
	margin-bottom:10px
}

.goods_type_list li img{width:160px;height:160px;display:block;margin:10px auto;}
.goods_type_list li h4{width:160px;margin:0 auto;}
.goods_type_list li h4 a{font-weight:normal;color:#666;display:block;width:160px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;}
.operate{width:160px;margin:10px auto;position:relative;}
.goods_type_list .operate .prize{color:#da260e; font-size:14px;} 
.goods_type_list .operate .unit{color:#999;padding-left:5px;}
.goods_type_list .operate .add_goods{display:inline-block;width:15px;height:15px;background:url(../images/shop_cart.png);position:absolute;right:0;top:3px;}


/* 分页样式 */

.pagenation{height:32px;text-align:center;font-size:0;margin:30px auto;}
.pagenation a{display:inline-block;border:1px solid #d2d2d2;background-color:#f8f6f7;font-size:12px;padding:7px 10px;color:#666;margin:5px}

.pagenation .active{background-color:#fff;color:#43a200}


/* 商品详情样式 */
.goods_detail_con{
	width:1198px;
	height:398px;
	border:1px solid #ededed;
	margin:0 auto 20px;
}

.goods_detail_pic{width:350px;height:350px;margin:24px 0 0 24px;}
.goods_detail_list{
	width:730px;height:350px;margin:24px 24px 0 0;
}
.goods_detail_list h3{font-size:24px;line-height:24px;color:#666;font-weight:normal;}
.goods_detail_list p{color:#666;line-height:40px;}
.prize_bar{height:72px;background-color:#fff5f5;line-height:72px;}
.prize_bar .show_pirze{font-size:20px;color:#ff3e3e;padding-left:20px}
.prize_bar .show_pirze em{font-style:normal;font-size:36px;padding-left:10px}
.prize_bar .show_unit{padding-left:150px}

.goods_num{height:52px;margin-top:19px;}
.goods_num .num_name{width:70px;height:52px;line-height:52px;}
.goods_num .num_add{width:75px;height:50px;border:1px solid #dddddd}
.goods_num .num_add input{width:49px;height:50px;text-align:center;line-height:50px;border:0px;outline:none;font-size:14px;color:#666}
.goods_num .num_add .add,.goods_num .num_add .minus{width:25px;line-height:25px;text-align:center;border-left:1px solid #ddd;border-bottom:1px solid #ddd;color:#666;font-size:14px}
.goods_num .num_add .minus{border-bottom:0px}

.total{height:35px;line-height:35px;margin-top:25px;}
.total em{font-style:normal;color:#ff3e3e;font-size:18px}

.operate_btn{height:40px;margin-top:35px;font-size:0;position:relative;}
.operate_btn .buy_btn,.operate_btn .add_cart{display:inline-block;width:178px;height:38px;border:1px solid #c40000;font-size:14px;color:#c40000;line-height:38px;text-align:center;background-color:#ffeded;}
.operate_btn .add_cart{background-color:#c40000;color:#fff;margin-left:10px;position:relative;z-index:10;}

.add_jump{width:20px;height:20px;background-color:#c40000;position:absolute;left:268px;top:10px;border-radius:50%;z-index:9;display:none;}

.detail_tab{
	height:35px;
	border-bottom:1px solid #37ab40
}

.detail_tab li{height:34px;line-height:34px;padding:0 30px;font-size:14px;color:#333333;float:left;border:1px solid #e8e8e8;border-bottom:0px;cursor:pointer;background-color:#faf8f8}

.detail_tab li.active{border-top:2px solid #37ab40;position:relative;background-color:#fff;border-left:1px solid #37ab40;border-right:1px solid #37ab40;top:-1px;height:35px;}

.tab_content dt{margin-top:10px;font-size:16px;color:#044d39}
.tab_content dd{line-height:24px;margin-top:5px;}


/* 登录页 */

.login_top{width:960px;height:130px;margin:0 auto;}
.login_logo{display:block;width:193px;height:76px;margin-top:30px;}
.login_form_bg{height:480px;background-color:#518e17}
.no-mp{margin-top:0px;}
.login_form_wrap{width:960px;height:480px;margin:0 auto;}
.login_banner{width:381px;height:322px;background:url(../images/login_banner.png) no-repeat;margin-top:90px;}
.slogan{width:40px;height:300px;font-size:30px;color:#f0f9e8;text-align:center;line-height:36px;margin:80px 0 0 120px}
.login_form{width:368px;height:378px;border:1px solid #c6c6c5;background-color:#fff; margin-top:50px;}

.login_title{height:60px;width:308px;margin:10px auto;border-bottom:1px solid #e0e0e0;}

.login_title h1{font-size:24px;height:60px;line-height:60px;color:#a8a8a8;float:left;font-weight:bold;margin-left:44px;}
.login_title a{width:100px;height:20px;display:block;font-size:16px;color:#5fb42a;text-indent:26px;background:url(../images/icons02.png) left 5px no-repeat;float:left;margin:20px 0 0 36px}

.form_input{width:308px;height:250px;margin:20px auto;position:relative;}
.name_input,.pass_input{width:306px;height:36px;border:1px solid #e0e0e0;background:url(../images/icons02.png) 280px -41px no-repeat #f8f8f8;outline:none;font-size:14px;text-indent:10px;position: absolute;left:0;top:0}
.pass_input{top:65px;background-position:280px -95px;}

.user_error,.pwd_error{color:#f00;position:absolute;left:0;top:43px;display:none}

.pwd_error{top:110px;}

.more_input{position:absolute;left:0;top:130px;width:100%}

.more_input input{float:left;margin-top:2px;}
.more_input label{float:left;margin-left:10px;}
.more_input a{float:right;color:#666}
.more_input a:hover{color:#ff8800}

.input_submit{width:100%;height:40px;position:absolute;left:0;top:180px;background-color:#47aa34;color:#fff;font-size:22px;border:0px;font-family:'Microsoft Yahei';cursor:pointer;}


/* 注册页面 */
.register_con{
	width:700px;
	height:560px;
	margin:50px auto 0;
	background:url(../images/interval_line.png) 300px top no-repeat;
}

.l_con{width:300px;}
.reg_logo{width:200px;height:76px;float:right;margin-right:30px;}
.reg_slogan{width:300px;height:30px;float:right;text-align:right;font-size:24px;color:#69a81e;margin:20px 30px 0 0;}
.reg_banner{width:251px;height:329px;background:url(../images/register_banner.png) no-repeat;float:right; margin:20px 10px 0 0;opacity:0.5}


.r_con{width:400px;}
.reg_title{width:360px;height:50px;float:left;margin-left:30px;border-bottom:1px solid #e0e0e0}
.reg_title h1{height:50px;line-height:50px;float:left;font-size:24px;color:#a8a8a8;font-weight:bold;}
.reg_title a{float:right;height:20px;line-height:20px;font-size:16px;color:#5fb42a;padding-right:20px;background:url(../images/icons02.png) 35px 3px no-repeat;margin-top:15px}

.reg_form{width:360px;margin:30px 0 0 30px;float:left;position:relative;}
.reg_form li{height:70px;}
.reg_form li label{width:70px;height:40px;line-height:40px;float:left;font-size:14px;color:#a8a8a8}
.reg_form li input{width:288px;height:38px;border:1px solid #e0e0e0;float:left;outline:none;text-indent:10px;background-color:#f8f8f8}
.reg_form li.agreement input{width:15px;height:15px;float:left;margin-top:13px}
.reg_form li.agreement label{width:300px;float:left;margin-left:10px;}
.reg_form li.reg_sub input{width:360px;height:40px;background-color:#47aa34;font-size:18px;color:#fff;font-family:'Microsoft Yahei';cursor:pointer;}
.reg_form li .error_tip{float:left;height:30px;line-height:30px;margin-left:70px;color:#e62e2e;display:none;}
.reg_form li .error_tip2{float:left;height:20px;line-height:20px;color:#e62e2e;display:none;}


.sub_page_name{font-size:18px;color:#666;margin:50px 0 0 20px}

.total_count{
	width:1200px;margin:0 auto;height:40px;line-height:40px;font-size:14px;
}
.total_count em{
	font-size:16px;color:#ff4200;margin:0 5px;
}

.cart_list_th{width:1198px;border:1px solid #ddd;background-color:#f7f7f7;margin:0 auto;}
.cart_list_th li{height:40px;line-height:40px;float:left;text-align:center;}
.cart_list_th .col01{width:26%;}
.cart_list_th .col02{width:16%;}
.cart_list_th .col03{width:13%;}
.cart_list_th .col04{width:12%;}
.cart_list_th .col05{width:15%;}
.cart_list_th .col06{width:18%;}

.cart_list_td{width:1198px;border:1px solid #ddd;background-color:#edfff9;margin:0 auto;margin-top:-1px;}
.cart_list_td li{height:120px;line-height:120px;float:left;text-align:center;}

.cart_list_td .col01{width:4%;}
.cart_list_td .col02{width:12%;}
.cart_list_td .col03{width:10%;}
.cart_list_td .col04{width:16%;}
.cart_list_td .col05{width:13%;}
.cart_list_td .col06{width:12%;}
.cart_list_td .col07{width:15%;}
.cart_list_td .col08{width:18%;}

.cart_list_td .col02 img{width:100px;height:100px;border:1px solid #ddd;display:block;margin:10px auto 0;}
.cart_list_td .col03{height:48px;text-align:left;line-height:24px;margin-top:38px;}
.cart_list_td .col03 em{color:#999}
.cart_list_td .col08 a{color:#666}

.cart_list_td .col06 .num_add{width:98px;height:28px;border:1px solid #ddd;margin:40px auto 0;}
.cart_list_td .col06 .num_add a{width:29px;height:28px;line-height:28px;background-color:#f3f3f3;font-size:14px;color:#666}
.cart_list_td .col06 .num_add input{width:38px;height:28px;text-align:center;line-height:30px;border:0px;display:block;float:left;outline:none;border-left:1px solid #ddd;border-right:1px solid #ddd;}


.settlements{width:1198px;height:78px;border:1px solid #ddd;background-color:#fff4e8;margin:-1px auto 0;}
.settlements li{line-height:78px;float:left;}
.settlements .col01{width:4%;text-align:center}
.settlements .col02{width:12%;}
.settlements .col03{width:69%; height:48px; line-height:28px;text-align:right;margin-top:10px;}
.settlements .col03 span{color:#ff0000;padding-right:5px}
.settlements .col03 em{color:#ff3d3d;font-size:22px;font-weight:bold;}
.settlements .col03 span{color:#ff0000;}
.settlements .col03 b{color:#ff0000;font-size:14px;padding:0 5px;}

.settlements .col04{width:14%;text-align:center;float:right;}
.settlements .col04 a{display:block;height:78px;background-color:#ff3d3d;text-align:center;line-height:78px;color:#fff;font-size:24px}


.common_title{width:1200px;margin:20px auto 0;font-size:14px;}

.common_list_con{width:1200px;border:1px solid #dddddd;border-top:2px solid #00bc6f;margin:10px auto 0;background-color:#f7f7f7;position:relative;}

.common_list_con dl{margin:20px;}
.common_list_con dt{font-size:14px;font-weight:bold;margin-bottom:10px}
.common_list_con dd input{vertical-align:bottom;margin-right:10px}

.edit_site{position:absolute; right:20px;top:30px;width:100px;height:30px;background-color:#37ab40;text-align:center;line-height:30px;color:#fff}

.pay_style_con{margin:20px;}
.pay_style_con input{float:left;margin:14px 7px 0 0;}
.pay_style_con label{float:left;border:1px solid #ccc;background-color:#fff;padding:10px 10px 10px 40px;margin-right:25px}

.pay_style_con .cash{background:url(../images/pay_icons.png) 8px top no-repeat #fff;}
.pay_style_con .weixin{background:url(../images/pay_icons.png) 6px -36px no-repeat #fff;}

.pay_style_con .zhifubao{background:url(../images/pay_icons.png) 12px -72px no-repeat #fff;width:50px;height:16px}

.pay_style_con .bank{background:url(../images/pay_icons.png) 6px -108px no-repeat #fff;}


.goods_list_th{height:40px;border-bottom:1px solid #ccc}
.goods_list_th li{float:left;line-height:40px;text-align:center;}
.goods_list_th .col01{width:25%}
.goods_list_th .col02{width:20%}
.goods_list_th .col03{width:25%}
.goods_list_th .col04{width:15%}
.goods_list_th .col05{width:15%}

.goods_list_td{height:80px;border-bottom:1px solid #eeeded}
.goods_list_td li{float:left;line-height:80px;text-align:center;}
.goods_list_td .col01{width:4%}
.goods_list_td .col02{width:6%}
.goods_list_td .col03{width:15%}
.goods_list_td .col04{width:20%}
.goods_list_td .col05{width:25%}
.goods_list_td .col06{width:15%}
.goods_list_td .col07{width:15%}

.goods_list_td .col02{text-align:right}
.goods_list_td .col02 img{width:63px;height:63px;border:1px solid #ddd;display:block;margin:7px 0;float:right;}
.goods_list_td .col03{text-align:left;text-indent:20px}


.settle_con{margin:10px}
.total_goods_count,.transit,.total_pay{line-height:24px;text-align:right}
.total_goods_count em,.total_goods_count b,.transit b,.total_pay b{font-size:14px;color:#ff4200;padding:0 5px;}

.order_submit{width:1200px;margin:20px auto;}
.order_submit a{width:160px;height:40px;line-height:40px;text-align:center;background-color:#47aa34;color:#fff;font-size:16px;display:block;float:right}


.order_list_th{width:1198px;border:1px solid #ddd;background-color:#f7f7f7;margin:20px auto 0;}
.order_list_th li{float:left;height:30px;line-height:30px}
.order_list_th .col01{width:20%;margin-left:20px}
.order_list_th .col02{width:20%}


.order_list_table{
	width:1200px;
	border-collapse:collapse;
	border-spacing:0px;
	border:1px solid #ddd;
	margin:-1px auto 0;
}

.order_list_table td{
	border:1px solid #ddd;	
	text-align:center;
}

.order_goods_list{border-bottom:1px solid #ddd;margin-bottom:-2px;}
.order_goods_list li{float:left; height:80px;line-height:80px;}
.order_goods_list .col01{width:20%}
.order_goods_list .col01 img{width:60px;height:60px;border:1px solid #ddd;margin:10px auto;}
.order_goods_list .col02{width:50%;text-align:left;}
.order_goods_list .col02 em{color:#999;margin-left:10px}
.order_goods_list .col03{width:10%}
.order_goods_list .col04{width:20%}

.oper_btn{display:inline-block;border:1px solid #ddd;color:#666;padding:5px 10px}

.popup_con{display:none;}
.popup{width:300px;height:150px;border:1px solid #dddddd;border-top:2px solid #00bc6f;background-color:#f7f7f7;position:fixed;
	left:50%;
	margin-left:-150px;
	top:50%;
	margin-top:-75px;
	z-index:1000;
}

.popup p{height:150px;line-height:150px;text-align:center;font-size:18px;}

.mask{width:100%;height:100%;position:fixed;left:0;top:0;background-color:#000;opacity:0.3;z-index:999;}


.main_con{
	width:1200px;
	margin:0 auto;
	background:url(../images/left_bg.jpg) repeat-y;
}

.left_menu_con{
	width:200px;
	float:left;
}

.left_menu_con h3{
	font-size:16px;
	line-height:40px;
	border-bottom:1px solid #ddd;
	text-align:center;
	margin-bottom:10px;
}

.left_menu_con ul li{
	line-height:40px;
	text-align:center;
	font-size:14px;
}

.left_menu_con ul li a{
	color:#666;
}

.left_menu_con ul li .active{
	color:#ff8800;
	font-weight:bold;
}

.right_content{
	width:980px;
	float:right;
	min-height:500px;
}

.w980{
	width:980px;
}

.w978{
	width:978px;
}


.common_title2{height:20px;line-height:20px;font-size:16px;margin:10px 0;}
.user_info_list{
	background-color:#f9f9f9;
	margin:10px 0 15px;
	padding:10px 0;
	height:90px;
}

.user_info_list li{
	line-height:30px;
	text-indent:30px;
	font-size:14px;
}

.user_info_list li span{
	width:100px;
	float:left;
	text-align:right;
}

.info_con{
	width:980px;
}

.info_l{
	width:600px;
	float:left;
}

.info_r{
	width:360px;
	float:right;
}

.site_con{
	background-color:#f9f9f9;
	padding:10px 0;
	margin-bottom:20px;
}

.site_con dt{
	font-size:14px;
	line-height:30px;
	text-indent:30px;
	font-weight:bold;
}

.site_con dd{
	font-size:14px;
	line-height:30px;
	text-indent:30px;
}

.site_con .form_group{
	height:40px;
	line-height:40px;
	margin-top:10px;
}

.site_con .form_group label{
	width:100px;
	float:left;
	text-align:right;
	font-size:14px;
	height:40px;
	line-height:40px;
}

.site_con .form_group input{
	width:300px;
	height:25px;
	border:1px solid #ddd;
	float:left;
	outline:none;
	margin-top:7px;
	text-indent:10px;
}

.site_con .form_group2{
	height:90px;
}

.site_area{
	width:280px;
	height:60px;
	border:1px solid #ddd;
	outline:none;
	padding:10px;
}
.info_submit{
	width:80px;
	height:30px;
	background-color:#37ab40;
	border:0px;
	color:#fff;
	margin:10px 0 10px 100px;
	cursor:pointer;
	font-family:'Microsoft Yahei'
}

.info_address{
	width:80px;
	height:30px;
	background-color:#37ab40;
	border:0px;
	color:#fff;
	margin:10px 0 10px 30px;
	cursor:pointer;
	font-family:'Microsoft Yahei'
}

.stress{
	color:#ff8800;
}

================================================
FILE: dailyfresh/static/css/reset.css
================================================
/* 把标签默认的间距设为0 */
body,ul,ol,p,h1,h2,h3,h4,h5,h6,dl,dd,select,input,textarea,form{margin:0;padding:0}

/* 让h标签文字大小继承body的文字设置 */
h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal;}

/* 去掉列表默认的图标 */
ul,ol{list-style:none;}

/* 去掉em默认的斜体 */
em{font-style: normal;}

/* 去掉a标签默认的下划线 */
a{text-decoration:none;}


/* 去掉加链接时产生的框线 */
img{border:0;}

/* 清除浮动 */
.clearfix:before,.clearfix:after{content:"";display:table}
.clearfix:after{clear:both;}
.clearfix{zoom:1}

/* 浮动 */
.fl{float:left}
.fr{float:right}

================================================
FILE: dailyfresh/static/detail.html
================================================
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
	<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
	<title>天天生鲜-商品详情</title>
	<link rel="stylesheet" type="text/css" href="css/reset.css">
	<link rel="stylesheet" type="text/css" href="css/main.css">
</head>
<body>
	<div class="header_con">
		<div class="header">
			<div class="welcome fl">欢迎来到天天生鲜!</div>
			<div class="fr">
				<div class="login_info fl">
					欢迎您:<em>张 山</em>
				</div>
				<div class="login_btn fl">
					<a href="login.html">登录</a>
					<span>|</span>
					<a href="register.html">注册</a>
				</div>
				<div class="user_link fl">
					<span>|</span>
					<a href="user_center_info.html">用户中心</a>
					<span>|</span>
					<a href="cart.html">我的购物车</a>
					<span>|</span>
					<a href="user_center_order.html">我的订单</a>
				</div>
			</div>
		</div>		
	</div>

	<div class="search_bar clearfix">
		<a href="index.html" class="logo fl"><img src="images/logo.png"></a>
		<div class="search_con fl">
			<input type="text" class="input_text fl" name="" placeholder="搜索商品">
			<input type="button" class="input_btn fr" name="" value="搜索">
		</div>
		<div class="guest_cart fr">
			<a href="cart.html" class="cart_name fl">我的购物车</a>
			<div class="goods_count fl" id="show_count">1</div>
		</div>
	</div>

	<div class="navbar_con">
		<div class="navbar clearfix">
			<div class="subnav_con fl">
				<h1>全部商品分类</h1>	
				<span></span>			
				<ul class="subnav">
					<li><a href="#" class="fruit">新鲜水果</a></li>
					<li><a href="#" class="seafood">海鲜水产</a></li>
					<li><a href="#" class="meet">猪牛羊肉</a></li>
					<li><a href="#" class="egg">禽类蛋品</a></li>
					<li><a href="#" class="vegetables">新鲜蔬菜</a></li>
					<li><a href="#" class="ice">速冻食品</a></li>
				</ul>
			</div>
			<ul class="navlist fl">
				<li><a href="">首页</a></li>
				<li class="interval">|</li>
				<li><a href="">手机生鲜</a></li>
				<li class="interval">|</li>
				<li><a href="">抽奖</a></li>
			</ul>
		</div>
	</div>

	<div class="breadcrumb">
		<a href="#">全部分类</a>
		<span>></span>
		<a href="#">新鲜水果</a>
		<span>></span>
		<a href="#">商品详情</a>
	</div>

	<div class="goods_detail_con clearfix">
		<div class="goods_detail_pic fl"><img src="images/goods_detail.jpg"></div>

		<div class="goods_detail_list fr">
			<h3>大兴大棚草莓</h3>
			<p>草莓浆果柔软多汁,味美爽口,适合速冻保鲜贮藏。草莓速冻后,可以保持原有的色、香、味,既便于贮藏,又便于外销。</p>
			<div class="prize_bar">
				<span class="show_pirze">¥<em>16.80</em></span>
				<span class="show_unit">单  位:500g</span>
			</div>
			<div class="goods_num clearfix">
				<div class="num_name fl">数 量:</div>
				<div class="num_add fl">
					<input type="text" class="num_show fl" value="1">
					<a href="javascript:;" class="add fr">+</a>
					<a href="javascript:;" class="minus fr">-</a>	
				</div> 
			</div>
			<div class="total">总价:<em>16.80元</em></div>
			<div class="operate_btn">
				<a href="javascript:;" class="buy_btn">立即购买</a>
				<a href="javascript:;" class="add_cart" id="add_cart">加入购物车</a>				
			</div>
		</div>
	</div>

	<div class="main_wrap clearfix">
		<div class="l_wrap fl clearfix">
			<div class="new_goods">
				<h3>新品推荐</h3>
				<ul>
					<li>
						<a href="#"><img src="images/goods/goods001.jpg"></a>
						<h4><a href="#">进口柠檬</a></h4>
						<div class="prize">¥3.90</div>
					</li>
					<li>
						<a href="#"><img src="images/goods/goods002.jpg"></a>
						<h4><a href="#">玫瑰香葡萄</a></h4>
						<div class="prize">¥16.80</div>
					</li>
				</ul>
			</div>
		</div>

		<div class="r_wrap fr clearfix">
			<ul class="detail_tab clearfix">
				<li class="active">商品介绍</li>
				<li>评论</li>
			</ul>

			<div class="tab_content">
				<dl>
					<dt>商品详情:</dt>
					<dd>草莓采摘园位于北京大兴区 庞各庄镇四各庄村 ,每年1月-6月面向北京以及周围城市提供新鲜草莓采摘和精品礼盒装草莓,草莓品种多样丰富,个大香甜。所有草莓均严格按照有机标准培育,不使用任何化肥和农药。草莓在采摘期间免洗可以直接食用。欢迎喜欢草莓的市民前来采摘,也欢迎各大单位选购精品有机草莓礼盒,有机草莓礼盒是亲朋馈赠、福利送礼的最佳选择。 </dd>
				</dl>
			</div>

		</div>
	</div>

	<div class="footer">
		<div class="foot_link">
			<a href="#">关于我们</a>
			<span>|</span>
			<a href="#">联系我们</a>
			<span>|</span>
			<a href="#">招聘人才</a>
			<span>|</span>
			<a href="#">友情链接</a>		
		</div>
		<p>CopyRight © 2016 北京天天生鲜信息技术有限公司 All Rights Reserved</p>
		<p>电话:010-****888    京ICP备*******8号</p>
	</div>
	<div class="add_jump"></div>

	<script type="text/javascript" src="js/jquery-1.12.2.js"></script>
	<script type="text/javascript">
		var $add_x = $('#add_cart').offset().top;
		var $add_y = $('#add_cart').offset().left;

		var $to_x = $('#show_count').offset().top;
		var $to_y = $('#show_count').offset().left;

		$(".add_jump").css({'left':$add_y+80,'top':$add_x+10,'display':'block'})
		$('#add_cart').click(function(){
			$(".add_jump").stop().animate({
				'left': $to_y+7,
				'top': $to_x+7},
				"fast", function() {
					$(".add_jump").fadeOut('fast',function(){
						$('#show_count').html(2);
					});

			});
		})
	</script>
	
</body>
</html>

================================================
FILE: dailyfresh/static/index.html
================================================

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">

<head>
	<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
    
	<title>天天生鲜-首页</title>
	<link rel="stylesheet" type="text/css" href="/static/css/reset.css">
	<link rel="stylesheet" type="text/css" href="/static/css/main.css">
	
    
	<script type="text/javascript" src="/static/js/jquery-1.12.4.min.js"></script>
	<script type="text/javascript" src="/static/js/jquery-ui.min.js"></script>
	<script type="text/javascript" src="/static/js/slide.js"></script>

</head>
<body>


	<div class="header_con">
		<div class="header">
			<div class="welcome fl">欢迎来到天天生鲜!</div>
			<div class="fr">
				<div class="login_btn fl">
					<a href="/user/login">登录</a>
					<span>|</span>
					<a href="/user/register">注册</a>
				</div>
				<div class="user_link fl">
					<span>|</span>
					<a href="/user/">用户中心</a>
					<span>|</span>
					<a href="cart.html">我的购物车</a>
					<span>|</span>
					<a href="/user/order">我的订单</a>
				</div>
			</div>
		</div>		
	</div>




	<div class="search_bar clearfix">
		<a href="index.html" class="logo fl"><img src="/static/images/logo.png"></a>
		<div class="search_con fl">
			<input type="text" class="input_text fl" name="" placeholder="搜索商品">
			<input type="button" class="input_btn fr" name="" value="搜索">
		</div>
		<div class="guest_cart fr">
			<a href="#" class="cart_name fl">我的购物车</a>
			<div class="goods_count fl" id="show_count"></div>
		</div>
	</div>




	<div class="navbar_con">
		<div class="navbar">
			<h1 class="fl">全部商品分类</h1>
			<ul class="navlist fl">
				<li><a href="">首页</a></li>
				<li class="interval">|</li>
				<li><a href="">手机生鲜</a></li>
				<li class="interval">|</li>
				<li><a href="">抽奖</a></li>
			</ul>
		</div>
	</div>

	<div class="center_con clearfix">
		<ul class="subnav fl">
            
		</ul>
		<div class="slide fl">
			<ul class="slide_pics">
                
			</ul>
			<div class="prev"></div>
			<div class="next"></div>
			<ul class="points"></ul>
		</div>
		<div class="adv fl">
            
		</div>
	</div>

    


	<div class="footer">
		<div class="foot_link">
			<a href="#">关于我们</a>
			<span>|</span>
			<a href="#">联系我们</a>
			<span>|</span>
			<a href="#">招聘人才</a>
			<span>|</span>
			<a href="#">友情链接</a>		
		</div>
		<p>CopyRight © 2016 北京天天生鲜信息技术有限公司 All Rights Reserved</p>
		<p>电话:010-****888    京ICP备*******8号</p>
	</div>
    
    
    
	
</body>
</html>

================================================
FILE: dailyfresh/static/js/jquery.cookie.js
================================================
/*!
 * jQuery Cookie Plugin v1.4.1
 * https://github.com/carhartl/jquery-cookie
 *
 * Copyright 2013 Klaus Hartl
 * Released under the MIT license
 */
(function (factory) {
	if (typeof define === 'function' && define.amd) {
		// AMD
		define(['jquery'], factory);
	} else if (typeof exports === 'object') {
		// CommonJS
		factory(require('jquery'));
	} else {
		// Browser globals
		factory(jQuery);
	}
}(function ($) {

	var pluses = /\+/g;

	function encode(s) {
		return config.raw ? s : encodeURIComponent(s);
	}

	function decode(s) {
		return config.raw ? s : decodeURIComponent(s);
	}

	function stringifyCookieValue(value) {
		return encode(config.json ? JSON.stringify(value) : String(value));
	}

	function parseCookieValue(s) {
		if (s.indexOf('"') === 0) {
			// This is a quoted cookie as according to RFC2068, unescape...
			s = s.slice(1, -1).replace(/\\"/g, '"').replace(/\\\\/g, '\\');
		}

		try {
			// Replace server-side written pluses with spaces.
			// If we can't decode the cookie, ignore it, it's unusable.
			// If we can't parse the cookie, ignore it, it's unusable.
			s = decodeURIComponent(s.replace(pluses, ' '));
			return config.json ? JSON.parse(s) : s;
		} catch(e) {}
	}

	function read(s, converter) {
		var value = config.raw ? s : parseCookieValue(s);
		return $.isFunction(converter) ? converter(value) : value;
	}

	var config = $.cookie = function (key, value, options) {

		// Write

		if (value !== undefined && !$.isFunction(value)) {
			options = $.extend({}, config.defaults, options);

			if (typeof options.expires === 'number') {
				var days = options.expires, t = options.expires = new Date();
				t.setTime(+t + days * 864e+5);
			}

			return (document.cookie = [
				encode(key), '=', stringifyCookieValue(value),
				options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE
				options.path    ? '; path=' + options.path : '',
				options.domain  ? '; domain=' + options.domain : '',
				options.secure  ? '; secure' : ''
			].join(''));
		}

		// Read

		var result = key ? undefined : {};

		// To prevent the for loop in the first place assign an empty array
		// in case there are no cookies at all. Also prevents odd result when
		// calling $.cookie().
		var cookies = document.cookie ? document.cookie.split('; ') : [];

		for (var i = 0, l = cookies.length; i < l; i++) {
			var parts = cookies[i].split('=');
			var name = decode(parts.shift());
			var cookie = parts.join('=');

			if (key && key === name) {
				// If second argument (value) is a function it's a converter...
				result = read(cookie, value);
				break;
			}

			// Prevent storing a cookie that we couldn't decode.
			if (!key && (cookie = read(cookie)) !== undefined) {
				result[name] = cookie;
			}
		}

		return result;
	};

	config.defaults = {};

	$.removeCookie = function (key, options) {
		if ($.cookie(key) === undefined) {
			return false;
		}

		// Must not alter options, thus extending a fresh object...
		$.cookie(key, '', $.extend({}, options, { expires: -1 }));
		return !$.cookie(key);
	};

}));


================================================
FILE: dailyfresh/static/js/register.js
================================================
$(function(){

	var error_name = false;
	var error_password = false;
	var error_check_password = false;
	var error_email = false;
	var error_check = false;


	$('#user_name').blur(function() {
		check_user_name();
	});

	$('#pwd').blur(function() {
		check_pwd();
	});

	$('#cpwd').blur(function() {
		check_cpwd();
	});

	$('#email').blur(function() {
		check_email();
	});

	$('#allow').click(function() {
		if($(this).is(':checked'))
		{
			error_check = false;
			$(this).siblings('span').hide();
		}
		else
		{
			error_check = true;
			$(this).siblings('span').html('请勾选同意');
			$(this).siblings('span').show();
		}
	});


	function check_user_name(){
		var len = $('#user_name').val().length;
		if(len<5||len>20)
		{
			$('#user_name').next().html('请输入5-20个字符的用户名')
			$('#user_name').next().show();
			error_name = true;
		}
		else
		{
			$('#user_name').next().hide();
			error_name = false;
		}
	}

	function check_pwd(){
		var len = $('#pwd').val().length;
		if(len<8||len>20)
		{
			$('#pwd').next().html('密码最少8位,最长20位')
			$('#pwd').next().show();
			error_password = true;
		}
		else
		{
			$('#pwd').next().hide();
			error_password = false;
		}		
	}


	function check_cpwd(){
		var pass = $('#pwd').val();
		var cpass = $('#cpwd').val();

		if(pass!=cpass)
		{
			$('#cpwd').next().html('两次输入的密码不一致')
			$('#cpwd').next().show();
			error_check_password = true;
		}
		else
		{
			$('#cpwd').next().hide();
			error_check_password = false;
		}		
		
	}

	function check_email(){
		var re = /^[a-z0-9][\w\.\-]*@[a-z0-9\-]+(\.[a-z]{2,5}){1,2}$/;

		if(re.test($('#email').val()))
		{
			$('#email').next().hide();
			error_email = false;
		}
		else
		{
			$('#email').next().html('你输入的邮箱格式不正确')
			$('#email').next().show();
			error_check_password = true;
		}

	}


	$('#reg_form').submit(function() {
		check_user_name();
		check_pwd();
		check_cpwd();
		check_email();

		if(error_name == false && error_password == false && error_check_password == false && error_email == false && error_check == false)
		{
			return true;
		}
		else
		{
			return false;
		}

	});








})

================================================
FILE: dailyfresh/static/js/slide.js
================================================
$(function(){
	var $slides = $('.slide_pics li');
	var len = $slides.length;
	var nowli = 0;
	var prevli = 0;
	var $prev = $('.prev');
	var $next = $('.next');
	var ismove = false;
	var timer = null;
	$slides.not(':first').css({left:760});
	$slides.each(function(index, el) {
		var $li = $('<li>');

		if(index==0)
		{
			$li.addClass('active');
		}

		$li.appendTo($('.points'));
	});
	$points = $('.points li');
	timer = setInterval(autoplay,4000);

	$('.slide').mouseenter(function() {
		clearInterval(timer);
	});

	$('.slide').mouseleave(function() {
		timer = setInterval(autoplay,4000);
	});

	function autoplay(){
		nowli++;
		move();
		$points.eq(nowli).addClass('active').siblings().removeClass('active');
	}

	$points.click(function(event) {
		if(ismove)
		{
			return;
		}
		nowli = $(this).index();

		if(nowli==prevli)
		{
			return;
		}
		
		$(this).addClass('active').siblings().removeClass('active');
		move();

	});

	$prev.click(function() {
		if(ismove)
		{
			return;
		}		
		nowli--;
		move();
		$points.eq(nowli).addClass('active').siblings().removeClass('active');

	});
	
	$next.click(function() {
		if(ismove)
		{
			return;
		}		
		nowli++;
		move();
		$points.eq(nowli).addClass('active').siblings().removeClass('active');

	});


	function move(){

		ismove = true;

		if(nowli<0)
		{
			nowli=len-1;
			prevli = 0
			$slides.eq(nowli).css({left:-760});
			$slides.eq(nowli).animate({left:0},800,'easeOutExpo');
			$slides.eq(prevli).animate({left:760},800,'easeOutExpo',function(){
				ismove = false;
			});
			prevli=nowli;
			return;
		}

		if(nowli>len-1)
		{
			nowli = 0;
			prevli = len-1;
			$slides.eq(nowli).css({left:760});
			$slides.eq(nowli).animate({left:0},800,'easeOutExpo');
			$slides.eq(prevli).animate({left:-760},800,'easeOutExpo',function(){
				ismove = false;
			});
			prevli=nowli;
			return;
		}


		if(prevli<nowli)
		{
			$slides.eq(nowli).css({left:760});			
			$slides.eq(prevli).animate({left:-760},800,'easeOutExpo');
			$slides.eq(nowli).animate({left:0},800,'easeOutExpo',function(){
				ismove = false;
			});
			prevli=nowli;
			
		}
		else
		{			
			$slides.eq(nowli).css({left:-760});			
			$slides.eq(prevli).animate({left:760},800,'easeOutExpo');	
			$slides.eq(nowli).animate({left:0},800,'easeOutExpo',function(){
				ismove = false;
			});
			prevli=nowli;		
		}

	}
})

================================================
FILE: dailyfresh/static/list.html
================================================
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
	<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
	<title>天天生鲜-商品列表</title>
	<link rel="stylesheet" type="text/css" href="css/reset.css">
	<link rel="stylesheet" type="text/css" href="css/main.css">
</head>
<body>
	<div class="header_con">
		<div class="header">
			<div class="welcome fl">欢迎来到天天生鲜!</div>
			<div class="fr">
				<div class="login_info fl">
					欢迎您:<em>张 山</em>
				</div>
				<div class="login_btn fl">
					<a href="login.html">登录</a>
					<span>|</span>
					<a href="register.html">注册</a>
				</div>
				<div class="user_link fl">
					<span>|</span>
					<a href="user_center_info.html">用户中心</a>
					<span>|</span>
					<a href="cart.html">我的购物车</a>
					<span>|</span>
					<a href="user_center_order.html">我的订单</a>
				</div>
			</div>
		</div>		
	</div>

	<div class="search_bar clearfix">
		<a href="index.html" class="logo fl"><img src="images/logo.png"></a>
		<div class="search_con fl">
			<input type="text" class="input_text fl" name="" placeholder="搜索商品">
			<input type="button" class="input_btn fr" name="" value="搜索">
		</div>
		<div class="guest_cart fr">
			<a href="#" class="cart_name fl">我的购物车</a>
			<div class="goods_count fl">1</div>
		</div>
	</div>

	<div class="navbar_con">
		<div class="navbar clearfix">
			<div class="subnav_con fl">
				<h1>全部商品分类</h1>	
				<span></span>			
				<ul class="subnav">
					<li><a href="#" class="fruit">新鲜水果</a></li>
					<li><a href="#" class="seafood">海鲜水产</a></li>
					<li><a href="#" class="meet">猪牛羊肉</a></li>
					<li><a href="#" class="egg">禽类蛋品</a></li>
					<li><a href="#" class="vegetables">新鲜蔬菜</a></li>
					<li><a href="#" class="ice">速冻食品</a></li>
				</ul>
			</div>
			<ul class="navlist fl">
				<li><a href="">首页</a></li>
				<li class="interval">|</li>
				<li><a href="">手机生鲜</a></li>
				<li class="interval">|</li>
				<li><a href="">抽奖</a></li>
			</ul>
		</div>
	</div>

	<div class="breadcrumb">
		<a href="#">全部分类</a>
		<span>></span>
		<a href="#">新鲜水果</a>
	</div>

	<div class="main_wrap clearfix">
		<div class="l_wrap fl clearfix">
			<div class="new_goods">
				<h3>新品推荐</h3>
				<ul>
					<li>
						<a href="#"><img src="images/goods/goods001.jpg"></a>
						<h4><a href="#">进口柠檬</a></h4>
						<div class="prize">¥3.90</div>
					</li>
					<li>
						<a href="#"><img src="images/goods/goods002.jpg"></a>
						<h4><a href="#">玫瑰香葡萄</a></h4>
						<div class="prize">¥16.80</div>
					</li>
				</ul>
			</div>
		</div>

		<div class="r_wrap fr clearfix">
			<div class="sort_bar">
				<a href="#" class="active">默认</a>
				<a href="#">价格</a>
				<a href="#">人气</a>
			</div>

			<ul class="goods_type_list clearfix">
				<li>
					<a href="detail.html"><img src="images/goods/goods003.jpg"></a>
					<h4><a href="detail.html">大兴大棚草莓</a></h4>
					<div class="operate">
						<span class="prize">¥16.80</span>
						<span class="unit">16.80/500g</span>
						<a href="#" class="add_goods" title="加入购物车"></a>
					</div>
				</li>

				<li>
					<a href="#"><img src="images/goods/goods004.jpg"></a>
					<h4><a href="#">吐鲁番梨光杏</a></h4>
					<div class="operate">
						<span class="prize">¥5.50</span>
						<span class="unit">5.50/500g</span>
						<a href="#" class="add_goods" title="加入购物车"></a>
					</div>
				</li>

				<li>
					<a href="#"><img src="images/goods/goods005.jpg"></a>
					<h4><a href="#">黄肉桃</a></h4>
					<div class="operate">
						<span class="prize">¥10.00</span>
						<span class="unit">10.00/500g</span>
						<a href="#" class="add_goods" title="加入购物车"></a>
					</div>
				</li>

				<li>
					<a href="#"><img src="images/goods/goods006.jpg"></a>
					<h4><a href="#">进口西梅</a></h4>
					<div class="operate">
						<span class="prize">¥28.80</span>
						<span class="unit">28.8/500g</span>
						<a href="#" class="add_goods" title="加入购物车"></a>
					</div>
				</li>

				<li>
					<a href="#"><img src="images/goods/goods007.jpg"></a>
					<h4><a href="#">香梨</a></h4>
					<div class="operate">
						<span class="prize">¥6.45</span>
						<span class="unit">6.45/500g</span>
						<a href="#" class="add_goods" title="加入购物车"></a>
					</div>
				</li>

				<li>
					<a href="#"><img src="images/goods/goods008.jpg"></a>
					<h4><a href="#">栗子</a></h4>
					<div class="operate">
						<span class="prize">¥9.50</span>
						<span class="unit">9.50/500g</span>
						<a href="#" class="add_goods" title="加入购物车"></a>
					</div>
				</li>

				<li>
					<a href="#"><img src="images/goods/goods009.jpg"></a>
					<h4><a href="#">海南香蕉</a></h4>
					<div class="operate">
						<span class="prize">¥3.30</span>
						<span class="unit">3.30/500g</span>
						<a href="#" class="add_goods" title="加入购物车"></a>
					</div>
				</li>

				<li>
					<a href="#"><img src="images/goods/goods010.jpg"></a>
					<h4><a href="#">青苹果</a></h4>
					<div class="operate">
						<span class="prize">¥5.00</span>
						<span class="unit">5.00/500g</span>
						<a href="#" class="add_goods" title="加入购物车"></a>
					</div>
				</li>

				<li>
					<a href="#"><img src="images/goods/goods011.jpg"></a>
					<h4><a href="#">山莓</a></h4>
					<div class="operate">
						<span class="prize">¥28.80</span>
						<span class="unit">28.8/500g</span>
						<a href="#" class="add_goods" title="加入购物车"></a>
					</div>
				</li>

				<li>
					<a href="#"><img src="images/goods/goods012.jpg"></a>
					<h4><a href="#">奇异果</a></h4>
					<div class="operate">
						<span class="prize">¥25.80</span>
						<span class="unit">25.8/500g</span>
						<a href="#" class="add_goods" title="加入购物车"></a>
					</div>
				</li>
				<li>
					<a href="#"><img src="images/goods/goods013.jpg"></a>
					<h4><a href="#">蜜桔</a></h4>
					<div class="operate">
						<span class="prize">¥4.80</span>
						<span class="unit">4.8/500g</span>
						<a href="#" class="add_goods" title="加入购物车"></a>
					</div>
				</li>
				<li>
					<a href="#"><img src="images/goods/goods014.jpg"></a>
					<h4><a href="#">脐橙</a></h4>
					<div class="operate">
						<span class="prize">¥3.50</span>
						<span class="unit">3.50/500g</span>
						<a href="#" class="add_goods" title="加入购物车"></a>
					</div>
				</li>
				<li>
					<a href="#"><img src="images/goods/goods001.jpg"></a>
					<h4><a href="#">进口柠檬</a></h4>
					<div class="operate">
						<span class="prize">¥3.90</span>
						<span class="unit">3.90/500g</span>
						<a href="#" class="add_goods" title="加入购物车"></a>
					</div>
				</li>
				<li>
					<a href="#"><img src="images/goods/goods002.jpg"></a>
					<h4><a href="#">玫瑰香葡萄</a></h4>
					<div class="operate">
						<span class="prize">¥16.80</span>
						<span class="unit">16.80/500g</span>
						<a href="#" class="add_goods" title="加入购物车"></a>
					</div>
				</li>
			</ul>

			<div class="pagenation">
				<a href="#"><上一页</a>
				<a href="#" class="active">1</a>
				<a href="#">2</a>
				<a href="#">3</a>
				<a href="#">4</a>
				<a href="#">5</a>
				<a href="#">下一页></a>
			</div>
		</div>
	</div>

	<div class="footer">
		<div class="foot_link">
			<a href="#">关于我们</a>
			<span>|</span>
			<a href="#">联系我们</a>
			<span>|</span>
			<a href="#">招聘人才</a>
			<span>|</span>
			<a href="#">友情链接</a>		
		</div>
		<p>CopyRight © 2016 北京天天生鲜信息技术有限公司 All Rights Reserved</p>
		<p>电话:010-****888    京ICP备*******8号</p>
	</div>
	
</body>
</html>

================================================
FILE: dailyfresh/static/login.html
================================================
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
	<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
	<title>天天生鲜-登录</title>
	<link rel="stylesheet" type="text/css" href="css/reset.css">
	<link rel="stylesheet" type="text/css" href="css/main.css">
</head>
<body>
	<div class="login_top clearfix">
		<a href="index.html" class="login_logo"><img src="images/logo02.png"></a>	
	</div>

	<div class="login_form_bg">
		<div class="login_form_wrap clearfix">
			<div class="login_banner fl"></div>
			<div class="slogan fl">日夜兼程 · 急速送达</div>
			<div class="login_form fr">
				<div class="login_title clearfix">
					<h1>用户登录</h1>
					<a href="#">立即注册</a>
				</div>
				<div class="form_input">
					<form>
						<input type="text" name="username" class="name_input" placeholder="请输入用户名">
						<div class="user_error">输入错误</div>
						<input type="password" name="pwd" class="pass_input" placeholder="请输入密码">
						<div class="pwd_error">输入错误</div>
						<div class="more_input clearfix">
							<input type="checkbox" name="">
							<label>记住用户名</label>
							<a href="#">忘记密码</a>
						</div>
						<input type="submit" name="" value="登录" class="input_submit">
					</form>
				</div>
			</div>
		</div>
	</div>

	<div class="footer no-mp">
		<div class="foot_link">
			<a href="#">关于我们</a>
			<span>|</span>
			<a href="#">联系我们</a>
			<span>|</span>
			<a href="#">招聘人才</a>
			<span>|</span>
			<a href="#">友情链接</a>		
		</div>
		<p>CopyRight © 2016 北京天天生鲜信息技术有限公司 All Rights Reserved</p>
		<p>电话:010-****888    京ICP备*******8号</p>
	</div>
	
</body>
</html>

================================================
FILE: dailyfresh/static/place_order.html
================================================
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
	<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
	<title>天天生鲜-提交订单</title>
	<link rel="stylesheet" type="text/css" href="css/reset.css">
	<link rel="stylesheet" type="text/css" href="css/main.css">
</head>
<body>
	<div class="header_con">
		<div class="header">
			<div class="welcome fl">欢迎来到天天生鲜!</div>
			<div class="fr">
				<div class="login_info fl">
					欢迎您:<em>张 山</em>
				</div>
				<div class="login_btn fl">
					<a href="login.html">登录</a>
					<span>|</span>
					<a href="register.html">注册</a>
				</div>
				<div class="user_link fl">
					<span>|</span>
					<a href="user_center_info.html">用户中心</a>
					<span>|</span>
					<a href="cart.html">我的购物车</a>
					<span>|</span>
					<a href="user_center_order.html">我的订单</a>
				</div>
			</div>
		</div>		
	</div>

	<div class="search_bar clearfix">
		<a href="index.html" class="logo fl"><img src="images/logo.png"></a>
		<div class="sub_page_name fl">|&nbsp;&nbsp;&nbsp;&nbsp;提交订单</div>
		<div class="search_con fr">
			<input type="text" class="input_text fl" name="" placeholder="搜索商品">
			<input type="button" class="input_btn fr" name="" value="搜索">
		</div>		
	</div>
	
	<h3 class="common_title">确认收货地址</h3>

	<div class="common_list_con clearfix">
		<dl>
			<dt>寄送到:</dt>
			<dd><input type="radio" name="" checked="">北京市 海淀区 东北旺西路8号中关村软件园 (李思 收) 182****7528</dd>
		</dl>
		<a href="user_center_site.html" class="edit_site">编辑收货地址</a>

	</div>
	
	<h3 class="common_title">支付方式</h3>	
	<div class="common_list_con clearfix">
		<div class="pay_style_con clearfix">
			<input type="radio" name="pay_style" checked>
			<label class="cash">货到付款</label>
			<input type="radio" name="pay_style">
			<label class="weixin">微信支付</label>
			<input type="radio" name="pay_style">
			<label class="zhifubao"></label>
			<input type="radio" name="pay_style">
			<label class="bank">银行卡支付</label>
		</div>
	</div>

	<h3 class="common_title">商品列表</h3>
	
	<div class="common_list_con clearfix">
		<ul class="goods_list_th clearfix">
			<li class="col01">商品名称</li>
			<li class="col02">商品单位</li>
			<li class="col03">商品价格</li>
			<li class="col04">数量</li>
			<li class="col05">小计</li>		
		</ul>
		<ul class="goods_list_td clearfix">
			<li class="col01">1</li>			
			<li class="col02"><img src="images/goods/goods012.jpg"></li>
			<li class="col03">奇异果</li>
			<li class="col04">500g</li>
			<li class="col05">25.80元</li>
			<li class="col06">1</li>
			<li class="col07">25.80元</li>	
		</ul>
		<ul class="goods_list_td clearfix">
			<li class="col01">2</li>			
			<li class="col02"><img src="images/goods/goods003.jpg"></li>
			<li class="col03">大兴大棚草莓</li>
			<li class="col04">500g</li>
			<li class="col05">16.80元</li>
			<li class="col06">1</li>
			<li class="col07">16.80元</li>	
		</ul>
	</div>

	<h3 class="common_title">总金额结算</h3>

	<div class="common_list_con clearfix">
		<div class="settle_con">
			<div class="total_goods_count">共<em>2</em>件商品,总金额<b>42.60元</b></div>
			<div class="transit">运费:<b>10元</b></div>
			<div class="total_pay">实付款:<b>52.60元</b></div>
		</div>
	</div>

	<div class="order_submit clearfix">
		<a href="javascript:;" id="order_btn">提交订单</a>
	</div>	

	<div class="footer">
		<div class="foot_link">
			<a href="#">关于我们</a>
			<span>|</span>
			<a href="#">联系我们</a>
			<span>|</span>
			<a href="#">招聘人才</a>
			<span>|</span>
			<a href="#">友情链接</a>		
		</div>
		<p>CopyRight © 2016 北京天天生鲜信息技术有限公司 All Rights Reserved</p>
		<p>电话:010-****888    京ICP备*******8号</p>
	</div>

	<div class="popup_con">
		<div class="popup">
			<p>订单提交成功!</p>
		</div>
		
		<div class="mask"></div>
	</div>
	<script type="text/javascript" src="js/jquery-1.12.2.js"></script>
	<script type="text/javascript">
		$('#order_btn').click(function() {
			localStorage.setItem('order_finish',2);

			$('.popup_con').fadeIn('fast', function() {

				setTimeout(function(){
					$('.popup_con').fadeOut('fast',function(){
						window.location.href = 'index.html';
					});	
				},3000)
				
			});
		});
	</script>
</body>
</html>

================================================
FILE: dailyfresh/static/register.html
================================================
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
	<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
	<title>天天生鲜-注册</title>
	<link rel="stylesheet" type="text/css" href="css/reset.css">
	<link rel="stylesheet" type="text/css" href="css/main.css">
	<script type="text/javascript" src="js/jquery-1.12.4.min.js"></script>
	<script type="text/javascript" src="js/register.js"></script>
</head>
<body>
	<div class="register_con">
		<div class="l_con fl">
			<a class="reg_logo"><img src="images/logo02.png"></a>
			<div class="reg_slogan">足不出户  ·  新鲜每一天</div>
			<div class="reg_banner"></div>
		</div>

		<div class="r_con fr">
			<div class="reg_title clearfix">
				<h1>用户注册</h1>
				<a href="#">登录</a>
			</div>
			<div class="reg_form clearfix">
				<form>
				<ul>
					<li>
						<label>用户名:</label>
						<input type="text" name="user_name" id="user_name">
						<span class="error_tip">提示信息</span>
					</li>					
					<li>
						<label>密码:</label>
						<input type="password" name="pwd" id="pwd">
						<span class="error_tip">提示信息</span>
					</li>
					<li>
						<label>确认密码:</label>
						<input type="password" name="cpwd" id="cpwd">
						<span class="error_tip">提示信息</span>
					</li>
					<li>
						<label>邮箱:</label>
						<input type="text" name="email" id="email">
						<span class="error_tip">提示信息</span>
					</li>
					<li class="agreement">
						<input type="checkbox" name="allow" id="allow" checked="checked">
						<label>同意”天天生鲜用户使用协议“</label>
						<span class="error_tip2">提示信息</span>
					</li>
					<li class="reg_sub">
						<input type="submit" value="注 册" name="">
					</li>
				</ul>				
				</form>
			</div>

		</div>

	</div>

	<div class="footer no-mp">
		<div class="foot_link">
			<a href="#">关于我们</a>
			<span>|</span>
			<a href="#">联系我们</a>
			<span>|</span>
			<a href="#">招聘人才</a>
			<span>|</span>
			<a href="#">友情链接</a>		
		</div>
		<p>CopyRight © 2016 北京天天生鲜信息技术有限公司 All Rights Reserved</p>
		<p>电话:010-****888    京ICP备*******8号</p>
	</div>
	
</body>
</html>

================================================
FILE: dailyfresh/static/test.html
================================================
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<img src="http://127.0.0.1:8888/group1/M00/00/00/wKgfWVznv-iAH8rAAACG07GLXPk205.jpg">
</body>
</html>

================================================
FILE: dailyfresh/static/user_center_info.html
================================================
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
	<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
	<title>天天生鲜-用户中心</title>
	<link rel="stylesheet" type="text/css" href="css/reset.css">
	<link rel="stylesheet" type="text/css" href="css/main.css">
</head>
<body>
	<div class="header_con">
		<div class="header">
			<div class="welcome fl">欢迎来到天天生鲜!</div>
			<div class="fr">
				<div class="login_info fl">
					欢迎您:<em>张 山</em>
				</div>
				<div class="login_btn fl">
					<a href="login.html">登录</a>
					<span>|</span>
					<a href="register.html">注册</a>
				</div>
				<div class="user_link fl">
					<span>|</span>
					<a href="user_center_info.html">用户中心</a>
					<span>|</span>
					<a href="cart.html">我的购物车</a>
					<span>|</span>
					<a href="user_center_order.html">我的订单</a>
				</div>
			</div>
		</div>		
	</div>

	<div class="search_bar clearfix">
		<a href="index.html" class="logo fl"><img src="images/logo.png"></a>
		<div class="sub_page_name fl">|&nbsp;&nbsp;&nbsp;&nbsp;用户中心</div>
		<div class="search_con fr">
			<input type="text" class="input_text fl" name="" placeholder="搜索商品">
			<input type="button" class="input_btn fr" name="" value="搜索">
		</div>		
	</div>

	<div class="main_con clearfix">
		<div class="left_menu_con clearfix">
			<h3>用户中心</h3>
			<ul>
				<li><a href="user_center_info.html" class="active">· 个人信息</a></li>
				<li><a href="user_center_order.html">· 全部订单</a></li>
				<li><a href="user_center_site.html">· 收货地址</a></li>
			</ul>
		</div>
		<div class="right_content clearfix">
				<div class="info_con clearfix">
				<h3 class="common_title2">基本信息</h3>
						<ul class="user_info_list">
							<li><span>用户名:</span>18210569700</li>
							<li><span>联系方式:</span>18210569700</li>
							<li><span>联系地址:</span>北京市昌平区</li>			
						</ul>
				</div>
				
				<h3 class="common_title2">最近浏览</h3>
				<div class="has_view_list">
					<ul class="goods_type_list clearfix">
				<li>
					<a href="detail.html"><img src="images/goods/goods003.jpg"></a>
					<h4><a href="detail.html">大兴大棚草莓</a></h4>
					<div class="operate">
						<span class="prize">¥16.80</span>
						<span class="unit">16.80/500g</span>
						<a href="#" class="add_goods" title="加入购物车"></a>
					</div>
				</li>

				<li>
					<a href="#"><img src="images/goods/goods004.jpg"></a>
					<h4><a href="#">吐鲁番梨光杏</a></h4>
					<div class="operate">
						<span class="prize">¥5.50</span>
						<span class="unit">5.50/500g</span>
						<a href="#" class="add_goods" title="加入购物车"></a>
					</div>
				</li>

				<li>
					<a href="#"><img src="images/goods/goods005.jpg"></a>
					<h4><a href="#">黄肉桃</a></h4>
					<div class="operate">
						<span class="prize">¥10.00</span>
						<span class="unit">10.00/500g</span>
						<a href="#" class="add_goods" title="加入购物车"></a>
					</div>
				</li>

				<li>
					<a href="#"><img src="images/goods/goods006.jpg"></a>
					<h4><a href="#">进口西梅</a></h4>
					<div class="operate">
						<span class="prize">¥28.80</span>
						<span class="unit">28.8/500g</span>
						<a href="#" class="add_goods" title="加入购物车"></a>
					</div>
				</li>

				<li>
					<a href="#"><img src="images/goods/goods007.jpg"></a>
					<h4><a href="#">香梨</a></h4>
					<div class="operate">
						<span class="prize">¥6.45</span>
						<span class="unit">6.45/500g</span>
						<a href="#" class="add_goods" title="加入购物车"></a>
					</div>
				</li>
			</ul>
		</div>
		</div>
	</div>



	<div class="footer">
		<div class="foot_link">
			<a href="#">关于我们</a>
			<span>|</span>
			<a href="#">联系我们</a>
			<span>|</span>
			<a href="#">招聘人才</a>
			<span>|</span>
			<a href="#">友情链接</a>		
		</div>
		<p>CopyRight © 2016 北京天天生鲜信息技术有限公司 All Rights Reserved</p>
		<p>电话:010-****888    京ICP备*******8号</p>
	</div>
	
</body>
</
Download .txt
gitextract_iu6wfhn7/

├── .gitattributes
├── README.md
├── dailyfresh/
│   ├── .idea/
│   │   ├── dailyfresh.iml
│   │   ├── dictionaries/
│   │   │   └── smart.xml
│   │   ├── misc.xml
│   │   ├── modules.xml
│   │   └── workspace.xml
│   ├── apps/
│   │   ├── __init__.py
│   │   ├── cart/
│   │   │   ├── __init__.py
│   │   │   ├── admin.py
│   │   │   ├── migrations/
│   │   │   │   └── __init__.py
│   │   │   ├── models.py
│   │   │   ├── tests.py
│   │   │   ├── urls.py
│   │   │   └── views.py
│   │   ├── goods/
│   │   │   ├── __init__.py
│   │   │   ├── admin.py
│   │   │   ├── migrations/
│   │   │   │   ├── 0001_initial.py
│   │   │   │   └── __init__.py
│   │   │   ├── models.py
│   │   │   ├── search_indexes.py
│   │   │   ├── tests.py
│   │   │   ├── urls.py
│   │   │   └── views.py
│   │   ├── order/
│   │   │   ├── __init__.py
│   │   │   ├── admin.py
│   │   │   ├── alipay_public_key.pem
│   │   │   ├── app_private_key.pem
│   │   │   ├── migrations/
│   │   │   │   ├── 0001_initial.py
│   │   │   │   ├── 0002_auto_20171113_1813.py
│   │   │   │   └── __init__.py
│   │   │   ├── models.py
│   │   │   ├── tests.py
│   │   │   ├── urls.py
│   │   │   └── views.py
│   │   └── user/
│   │       ├── __init__.py
│   │       ├── admin.py
│   │       ├── migrations/
│   │       │   ├── 0001_initial.py
│   │       │   └── __init__.py
│   │       ├── models.py
│   │       ├── tests.py
│   │       ├── urls.py
│   │       └── views.py
│   ├── celery_tasks/
│   │   ├── __init__.py
│   │   └── tasks.py
│   ├── dailyfresh/
│   │   ├── __init__.py
│   │   ├── settings.py
│   │   ├── urls.py
│   │   └── wsgi.py
│   ├── dailyfresh.sql
│   ├── db/
│   │   ├── __init__.py
│   │   └── base_model.py
│   ├── manage.py
│   ├── static/
│   │   ├── cart(1).html
│   │   ├── css/
│   │   │   ├── main.css
│   │   │   └── reset.css
│   │   ├── detail.html
│   │   ├── index.html
│   │   ├── js/
│   │   │   ├── jquery.cookie.js
│   │   │   ├── register.js
│   │   │   └── slide.js
│   │   ├── list.html
│   │   ├── login.html
│   │   ├── place_order.html
│   │   ├── register.html
│   │   ├── test.html
│   │   ├── user_center_info.html
│   │   ├── user_center_order.html
│   │   └── user_center_site.html
│   ├── templates/
│   │   ├── base.html
│   │   ├── base_detail_list.html
│   │   ├── base_no_cart.html
│   │   ├── base_user_center.html
│   │   ├── cart.html
│   │   ├── detail.html
│   │   ├── index.html
│   │   ├── list.html
│   │   ├── login.html
│   │   ├── order_comment.html
│   │   ├── place_order.html
│   │   ├── register.html
│   │   ├── search/
│   │   │   ├── indexes/
│   │   │   │   └── goods/
│   │   │   │       └── goodssku_text.txt
│   │   │   ├── search.html
│   │   │   └── search1.html
│   │   ├── static_base.html
│   │   ├── static_index.html
│   │   ├── user_center_info.html
│   │   ├── user_center_order.html
│   │   └── user_center_site.html
│   ├── utils/
│   │   ├── __init__.py
│   │   ├── fdfs/
│   │   │   ├── __init__.py
│   │   │   ├── client.conf
│   │   │   └── storage.py
│   │   └── mixin.py
│   ├── uwsgi.ini
│   ├── uwsgi.log
│   ├── uwsgi.pid
│   ├── uwsgi2.ini
│   ├── uwsgi2.log
│   ├── uwsgi2.pid
│   └── whoosh_index/
│       └── _MAIN_0.toc
└── requirements.txt
Download .txt
SYMBOL INDEX (108 symbols across 20 files)

FILE: dailyfresh/apps/cart/views.py
  class CartAddView (line 19) | class CartAddView(View):
    method post (line 21) | def post(self, request):
  class CartInfoView (line 76) | class CartInfoView(LoginRequiredMixin, View):
    method get (line 78) | def get(self, request):
  class CartUpdateView (line 122) | class CartUpdateView(View):
    method post (line 124) | def post(self, request):
  class CartDeleteView (line 178) | class CartDeleteView(View):
    method post (line 180) | def post(self, request):

FILE: dailyfresh/apps/goods/admin.py
  class BaseModelAdmin (line 7) | class BaseModelAdmin(admin.ModelAdmin):
    method save_model (line 8) | def save_model(self, request, obj, form, change):
    method delete_model (line 19) | def delete_model(self, request, obj):
  class GoodsTypeAdmin (line 30) | class GoodsTypeAdmin(BaseModelAdmin):
  class IndexGoodsBannerAdmin (line 34) | class IndexGoodsBannerAdmin(BaseModelAdmin):
  class IndexTypeGoodsBannerAdmin (line 38) | class IndexTypeGoodsBannerAdmin(BaseModelAdmin):
  class IndexPromotionBannerAdmin (line 42) | class IndexPromotionBannerAdmin(BaseModelAdmin):

FILE: dailyfresh/apps/goods/migrations/0001_initial.py
  class Migration (line 8) | class Migration(migrations.Migration):

FILE: dailyfresh/apps/goods/models.py
  class GoodsType (line 7) | class GoodsType(BaseModel):
    class Meta (line 13) | class Meta:
    method __str__ (line 18) | def __str__(self):
  class GoodsSKU (line 22) | class GoodsSKU(BaseModel):
    class Meta (line 40) | class Meta:
  class Goods (line 46) | class Goods(BaseModel):
    class Meta (line 52) | class Meta:
  class GoodsImage (line 58) | class GoodsImage(BaseModel):
    class Meta (line 63) | class Meta:
  class IndexGoodsBanner (line 69) | class IndexGoodsBanner(BaseModel):
    class Meta (line 75) | class Meta:
  class IndexTypeGoodsBanner (line 81) | class IndexTypeGoodsBanner(BaseModel):
    class Meta (line 93) | class Meta:
  class IndexPromotionBanner (line 99) | class IndexPromotionBanner(BaseModel):
    class Meta (line 106) | class Meta:

FILE: dailyfresh/apps/goods/search_indexes.py
  class GoodsSKUIndex (line 9) | class GoodsSKUIndex(indexes.SearchIndex, indexes.Indexable):
    method get_model (line 13) | def get_model(self):
    method index_queryset (line 18) | def index_queryset(self, using=None):

FILE: dailyfresh/apps/goods/views.py
  class IndexView (line 21) | class IndexView(View):
    method get (line 23) | def get(self, request):
  class DetailView (line 75) | class DetailView(View):
    method get (line 77) | def get(self, request, goods_id):
  class ListView (line 132) | class ListView(View):
    method get (line 134) | def get(self, request, type_id, page):

FILE: dailyfresh/apps/order/migrations/0001_initial.py
  class Migration (line 7) | class Migration(migrations.Migration):

FILE: dailyfresh/apps/order/migrations/0002_auto_20171113_1813.py
  class Migration (line 8) | class Migration(migrations.Migration):

FILE: dailyfresh/apps/order/models.py
  class OrderInfo (line 6) | class OrderInfo(BaseModel):
    class Meta (line 61) | class Meta:
  class OrderGoods (line 67) | class OrderGoods(BaseModel):
    class Meta (line 75) | class Meta:

FILE: dailyfresh/apps/order/views.py
  class OrderPlaceView (line 21) | class OrderPlaceView(LoginRequiredMixin, View):
    method post (line 23) | def post(self, request):
  class OrderCommitView1 (line 87) | class OrderCommitView1(View):
    method post (line 90) | def post(self, request):
  class OrderCommitView (line 204) | class OrderCommitView(View):
    method post (line 207) | def post(self, request):
  class OrderPayView (line 339) | class OrderPayView(View):
    method post (line 341) | def post(self, request):
  class CheckPayView (line 393) | class CheckPayView(View):
    method post (line 395) | def post(self, request):
  class CommentView (line 480) | class CommentView(LoginRequiredMixin, View):
    method get (line 482) | def get(self, request, order_id):
    method post (line 511) | def post(self, request, order_id):

FILE: dailyfresh/apps/user/migrations/0001_initial.py
  class Migration (line 11) | class Migration(migrations.Migration):

FILE: dailyfresh/apps/user/models.py
  class User (line 7) | class User(AbstractUser, BaseModel):
    class Meta (line 10) | class Meta:
  class AddressManager (line 16) | class AddressManager(models.Manager):
    method get_default_address (line 20) | def get_default_address(self, user):
  class Address (line 32) | class Address(BaseModel):
    class Meta (line 44) | class Meta:

FILE: dailyfresh/apps/user/views.py
  function register (line 26) | def register(request):
  function register_handle (line 71) | def register_handle(request):
  class RegisterView (line 112) | class RegisterView(View):
    method get (line 114) | def get(self, request):
    method post (line 118) | def post(self, request):
  class ActiveView (line 170) | class ActiveView(View):
    method get (line 172) | def get(self, request, token):
  class LoginView (line 194) | class LoginView(View):
    method get (line 196) | def get(self, request):
    method post (line 209) | def post(self, request):
  class LogoutView (line 255) | class LogoutView(View):
    method get (line 257) | def get(self, request):
  class UserInfoView (line 267) | class UserInfoView(LoginRequiredMixin, View):
    method get (line 269) | def get(self, request):
  class UserOrderView (line 315) | class UserOrderView(LoginRequiredMixin, View):
    method get (line 317) | def get(self, request, page):
  class AddressView (line 380) | class AddressView(LoginRequiredMixin, View):
    method get (line 382) | def get(self, request):
    method post (line 398) | def post(self, request):

FILE: dailyfresh/celery_tasks/tasks.py
  function send_register_active_email (line 23) | def send_register_active_email(to_email, username, token):
  function generate_static_index_html (line 37) | def generate_static_index_html():

FILE: dailyfresh/db/base_model.py
  class BaseModel (line 4) | class BaseModel(models.Model):
    class Meta (line 10) | class Meta:

FILE: dailyfresh/static/js/jquery.cookie.js
  function encode (line 23) | function encode(s) {
  function decode (line 27) | function decode(s) {
  function stringifyCookieValue (line 31) | function stringifyCookieValue(value) {
  function parseCookieValue (line 35) | function parseCookieValue(s) {
  function read (line 50) | function read(s, converter) {

FILE: dailyfresh/static/js/register.js
  function check_user_name (line 41) | function check_user_name(){
  function check_pwd (line 56) | function check_pwd(){
  function check_cpwd (line 72) | function check_cpwd(){
  function check_email (line 90) | function check_email(){

FILE: dailyfresh/static/js/slide.js
  function autoplay (line 32) | function autoplay(){
  function move (line 78) | function move(){

FILE: dailyfresh/utils/fdfs/storage.py
  class FDFSStorage (line 6) | class FDFSStorage(Storage):
    method __init__ (line 8) | def __init__(self, client_conf=None, base_url=None):
    method _open (line 18) | def _open(self, name, mode='rb'):
    method _save (line 22) | def _save(self, name, content):
    method exists (line 52) | def exists(self, name):
    method url (line 56) | def url(self, name):

FILE: dailyfresh/utils/mixin.py
  class LoginRequiredMixin (line 4) | class LoginRequiredMixin(object):
    method as_view (line 6) | def as_view(cls, **initkwargs):
Condensed preview — 102 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (414K chars).
[
  {
    "path": ".gitattributes",
    "chars": 30,
    "preview": "*.js linguist-language=Python\n"
  },
  {
    "path": "README.md",
    "chars": 2311,
    "preview": "# fruits-and-vegetables\n基于python3.6和Django1.8.2\n\n使用Python Web框架Django开发的一个B2C网上蔬果商城,包含用户、商品、购物车、订单等模块等等,使用了Celery异步任务队列,"
  },
  {
    "path": "dailyfresh/.idea/dailyfresh.iml",
    "chars": 1067,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<module type=\"PYTHON_MODULE\" version=\"4\">\n  <component name=\"FacetManager\">\n    <"
  },
  {
    "path": "dailyfresh/.idea/dictionaries/smart.xml",
    "chars": 84,
    "preview": "<component name=\"ProjectDictionaryState\">\n  <dictionary name=\"smart\" />\n</component>"
  },
  {
    "path": "dailyfresh/.idea/misc.xml",
    "chars": 980,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"ProjectInspectionProfilesVisibleTreeStat"
  },
  {
    "path": "dailyfresh/.idea/modules.xml",
    "chars": 272,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"ProjectModuleManager\">\n    <modules>\n   "
  },
  {
    "path": "dailyfresh/.idea/workspace.xml",
    "chars": 31462,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"ChangeListManager\">\n    <list default=\"t"
  },
  {
    "path": "dailyfresh/apps/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "dailyfresh/apps/cart/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "dailyfresh/apps/cart/admin.py",
    "chars": 63,
    "preview": "from django.contrib import admin\n\n# Register your models here.\n"
  },
  {
    "path": "dailyfresh/apps/cart/migrations/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "dailyfresh/apps/cart/models.py",
    "chars": 57,
    "preview": "from django.db import models\n\n# Create your models here.\n"
  },
  {
    "path": "dailyfresh/apps/cart/tests.py",
    "chars": 60,
    "preview": "from django.test import TestCase\n\n# Create your tests here.\n"
  },
  {
    "path": "dailyfresh/apps/cart/urls.py",
    "chars": 406,
    "preview": "from django.conf.urls import url\nfrom cart.views import CartAddView, CartInfoView, CartUpdateView, CartDeleteView\n\nurlpa"
  },
  {
    "path": "dailyfresh/apps/cart/views.py",
    "chars": 5743,
    "preview": "from django.shortcuts import render\nfrom django.views.generic import View\nfrom django.http import JsonResponse\n\nfrom goo"
  },
  {
    "path": "dailyfresh/apps/goods/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "dailyfresh/apps/goods/admin.py",
    "chars": 1374,
    "preview": "from django.contrib import admin\nfrom django.core.cache import cache\nfrom goods.models import GoodsType,IndexPromotionBa"
  },
  {
    "path": "dailyfresh/apps/goods/migrations/0001_initial.py",
    "chars": 7545,
    "preview": "# -*- coding: utf-8 -*-\nfrom __future__ import unicode_literals\n\nfrom django.db import models, migrations\nimport tinymce"
  },
  {
    "path": "dailyfresh/apps/goods/migrations/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "dailyfresh/apps/goods/models.py",
    "chars": 3521,
    "preview": "from django.db import models\nfrom db.base_model import BaseModel\nfrom tinymce.models import HTMLField\n# Create your mode"
  },
  {
    "path": "dailyfresh/apps/goods/search_indexes.py",
    "chars": 473,
    "preview": "# 定义索引类\nfrom haystack import indexes\n# 导入你的模型类\nfrom goods.models import GoodsSKU\n\n\n# 指定对于某个类的某些数据建立索引\n# 索引类名格式:模型类名+Inde"
  },
  {
    "path": "dailyfresh/apps/goods/tests.py",
    "chars": 60,
    "preview": "from django.test import TestCase\n\n# Create your tests here.\n"
  },
  {
    "path": "dailyfresh/apps/goods/urls.py",
    "chars": 342,
    "preview": "from django.conf.urls import url\nfrom goods.views import IndexView, DetailView, ListView\n\nurlpatterns = [\n    url(r'^ind"
  },
  {
    "path": "dailyfresh/apps/goods/views.py",
    "chars": 6327,
    "preview": "from django.shortcuts import render, redirect\nfrom django.core.urlresolvers import reverse\nfrom django.views.generic imp"
  },
  {
    "path": "dailyfresh/apps/order/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "dailyfresh/apps/order/admin.py",
    "chars": 63,
    "preview": "from django.contrib import admin\n\n# Register your models here.\n"
  },
  {
    "path": "dailyfresh/apps/order/alipay_public_key.pem",
    "chars": 444,
    "preview": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAslvKn/bhdwTG4xLX7sDfyZ7Nj/jmmD9NMdupMpu+m+2ulGiXc"
  },
  {
    "path": "dailyfresh/apps/order/app_private_key.pem",
    "chars": 1679,
    "preview": "-----BEGIN RSA PRIVATE KEY-----\nMIIEpQIBAAKCAQEAxPty8S0j29pQ4ZaqpQqzAm4gX+qhQKabY6thC4jHIWf/v26q\nDEOIApqc0iSrWJNAtF7pu+j"
  },
  {
    "path": "dailyfresh/apps/order/migrations/0001_initial.py",
    "chars": 2504,
    "preview": "# -*- coding: utf-8 -*-\nfrom __future__ import unicode_literals\n\nfrom django.db import models, migrations\n\n\nclass Migrat"
  },
  {
    "path": "dailyfresh/apps/order/migrations/0002_auto_20171113_1813.py",
    "chars": 1129,
    "preview": "# -*- coding: utf-8 -*-\nfrom __future__ import unicode_literals\n\nfrom django.db import models, migrations\nfrom django.co"
  },
  {
    "path": "dailyfresh/apps/order/migrations/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "dailyfresh/apps/order/models.py",
    "chars": 2238,
    "preview": "from django.db import models\nfrom db.base_model import BaseModel\n# Create your models here.\n\n\nclass OrderInfo(BaseModel)"
  },
  {
    "path": "dailyfresh/apps/order/tests.py",
    "chars": 60,
    "preview": "from django.test import TestCase\n\n# Create your tests here.\n"
  },
  {
    "path": "dailyfresh/apps/order/urls.py",
    "chars": 510,
    "preview": "from django.conf.urls import url\nfrom order.views import OrderPlaceView, OrderCommitView, OrderPayView, CheckPayView,Com"
  },
  {
    "path": "dailyfresh/apps/order/views.py",
    "chars": 18155,
    "preview": "from django.shortcuts import render, redirect\nfrom django.core.urlresolvers import reverse\nfrom django.http import JsonR"
  },
  {
    "path": "dailyfresh/apps/user/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "dailyfresh/apps/user/admin.py",
    "chars": 63,
    "preview": "from django.contrib import admin\n\n# Register your models here.\n"
  },
  {
    "path": "dailyfresh/apps/user/migrations/0001_initial.py",
    "chars": 4439,
    "preview": "# -*- coding: utf-8 -*-\nfrom __future__ import unicode_literals\n\nfrom django.db import models, migrations\nimport django."
  },
  {
    "path": "dailyfresh/apps/user/migrations/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "dailyfresh/apps/user/models.py",
    "chars": 1361,
    "preview": "from django.db import models\nfrom django.contrib.auth.models import AbstractUser\nfrom db.base_model import BaseModel\n# C"
  },
  {
    "path": "dailyfresh/apps/user/tests.py",
    "chars": 60,
    "preview": "from django.test import TestCase\n\n# Create your tests here.\n"
  },
  {
    "path": "dailyfresh/apps/user/urls.py",
    "chars": 1211,
    "preview": "from django.conf.urls import url\nfrom django.contrib.auth.decorators import login_required\nfrom user.views import Regist"
  },
  {
    "path": "dailyfresh/apps/user/views.py",
    "chars": 12781,
    "preview": "from django.shortcuts import render,redirect\nfrom django.core.urlresolvers import reverse\nfrom django.core.mail import s"
  },
  {
    "path": "dailyfresh/celery_tasks/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "dailyfresh/celery_tasks/tasks.py",
    "chars": 2343,
    "preview": "# 使用celery\nfrom django.core.mail import send_mail\nfrom django.conf import settings\nfrom django.template import loader, R"
  },
  {
    "path": "dailyfresh/dailyfresh/__init__.py",
    "chars": 43,
    "preview": "import pymysql\npymysql.install_as_MySQLdb()"
  },
  {
    "path": "dailyfresh/dailyfresh/settings.py",
    "chars": 4645,
    "preview": "\"\"\"\nDjango settings for dailyfresh project.\n\nGenerated by 'django-admin startproject' using Django 1.8.2.\n\nFor more info"
  },
  {
    "path": "dailyfresh/dailyfresh/urls.py",
    "chars": 1142,
    "preview": "\"\"\"dailyfresh URL Configuration\n\nThe `urlpatterns` list routes URLs to views. For more information please see:\n    https"
  },
  {
    "path": "dailyfresh/dailyfresh/wsgi.py",
    "chars": 397,
    "preview": "\"\"\"\nWSGI config for dailyfresh project.\n\nIt exposes the WSGI callable as a module-level variable named ``application``.\n"
  },
  {
    "path": "dailyfresh/dailyfresh.sql",
    "chars": 11570,
    "preview": "/*!40000 ALTER TABLE `df_goods` DISABLE KEYS */;\nINSERT INTO `df_goods` VALUES (1,'2017-11-15 03:03:05.257969','2017-11-"
  },
  {
    "path": "dailyfresh/db/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "dailyfresh/db/base_model.py",
    "chars": 366,
    "preview": "from django.db import models\n\n\nclass BaseModel(models.Model):\n    '''模型抽象基类'''\n    create_time = models.DateTimeField(au"
  },
  {
    "path": "dailyfresh/manage.py",
    "chars": 253,
    "preview": "#!/usr/bin/env python\nimport os\nimport sys\n\nif __name__ == \"__main__\":\n    os.environ.setdefault(\"DJANGO_SETTINGS_MODULE"
  },
  {
    "path": "dailyfresh/static/cart(1).html",
    "chars": 3408,
    "preview": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\""
  },
  {
    "path": "dailyfresh/static/css/main.css",
    "chars": 22379,
    "preview": "body{font-family:'Microsoft Yahei';font-size:12px;color:#666;}\nhtml,body{height:100%}\n/* 顶部样式 */\n.header_con{\n\tbackgroun"
  },
  {
    "path": "dailyfresh/static/css/reset.css",
    "chars": 504,
    "preview": "/* 把标签默认的间距设为0 */\nbody,ul,ol,p,h1,h2,h3,h4,h5,h6,dl,dd,select,input,textarea,form{margin:0;padding:0}\n\n/* 让h标签文字大小继承body"
  },
  {
    "path": "dailyfresh/static/detail.html",
    "chars": 4982,
    "preview": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\""
  },
  {
    "path": "dailyfresh/static/index.html",
    "chars": 2554,
    "preview": "\n<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
  },
  {
    "path": "dailyfresh/static/js/jquery.cookie.js",
    "chars": 3121,
    "preview": "/*!\n * jQuery Cookie Plugin v1.4.1\n * https://github.com/carhartl/jquery-cookie\n *\n * Copyright 2013 Klaus Hartl\n * Rele"
  },
  {
    "path": "dailyfresh/static/js/register.js",
    "chars": 2091,
    "preview": "$(function(){\n\n\tvar error_name = false;\n\tvar error_password = false;\n\tvar error_check_password = false;\n\tvar error_email"
  },
  {
    "path": "dailyfresh/static/js/slide.js",
    "chars": 2344,
    "preview": "$(function(){\n\tvar $slides = $('.slide_pics li');\n\tvar len = $slides.length;\n\tvar nowli = 0;\n\tvar prevli = 0;\n\tvar $prev"
  },
  {
    "path": "dailyfresh/static/list.html",
    "chars": 7483,
    "preview": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\""
  },
  {
    "path": "dailyfresh/static/login.html",
    "chars": 1711,
    "preview": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\""
  },
  {
    "path": "dailyfresh/static/place_order.html",
    "chars": 4194,
    "preview": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\""
  },
  {
    "path": "dailyfresh/static/register.html",
    "chars": 2165,
    "preview": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\""
  },
  {
    "path": "dailyfresh/static/test.html",
    "chars": 208,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <title>Title</title>\n</head>\n<body>\n<img src=\"htt"
  },
  {
    "path": "dailyfresh/static/user_center_info.html",
    "chars": 3919,
    "preview": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\""
  },
  {
    "path": "dailyfresh/static/user_center_order.html",
    "chars": 4290,
    "preview": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\""
  },
  {
    "path": "dailyfresh/static/user_center_site.html",
    "chars": 2842,
    "preview": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\""
  },
  {
    "path": "dailyfresh/templates/base.html",
    "chars": 2611,
    "preview": "{# 首页 注册 登录 #}\n<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-tr"
  },
  {
    "path": "dailyfresh/templates/base_detail_list.html",
    "chars": 715,
    "preview": "{# 详情页 列表页 #}\n{% extends 'base.html' %}\n{# 网站主体内容块 #}\n{% block body %}\n\t<div class=\"navbar_con\">\n\t\t<div class=\"navbar cl"
  },
  {
    "path": "dailyfresh/templates/base_no_cart.html",
    "chars": 543,
    "preview": "{# 购物车 提交订单 #}\n{% extends 'base.html' %}\n{% load staticfiles %}\n{# 网页顶部搜索框块 #}\n{% block search_bar %}\n\t<div class=\"searc"
  },
  {
    "path": "dailyfresh/templates/base_user_center.html",
    "chars": 723,
    "preview": "{# 用户中心3页面 #}\n{% extends 'base_no_cart.html' %}\n{% block title %}天天生鲜-用户中心{% endblock title %}\n{% block page_title %}用户中"
  },
  {
    "path": "dailyfresh/templates/cart.html",
    "chars": 8442,
    "preview": "{% extends 'base_no_cart.html' %}\n{% load staticfiles %}\n{% block title %}天天生鲜-购物车{% endblock title %}\n{% block page_tit"
  },
  {
    "path": "dailyfresh/templates/detail.html",
    "chars": 6294,
    "preview": "{% extends 'base_detail_list.html' %}\n{% load staticfiles %}\n{% block title %}天天生鲜-商品详情{% endblock title %}\n\n{% block ma"
  },
  {
    "path": "dailyfresh/templates/index.html",
    "chars": 2441,
    "preview": "{% extends 'base.html' %}\n{% load staticfiles %}\n{% block title %}天天生鲜-首页{% endblock title %}\n{% block topfiles %}\n\t<scr"
  },
  {
    "path": "dailyfresh/templates/list.html",
    "chars": 2398,
    "preview": "{% extends 'base_detail_list.html' %}\n{% block title %}天天生鲜-商品列表{% endblock title %}\n{% block main_content %}\n\t<div clas"
  },
  {
    "path": "dailyfresh/templates/login.html",
    "chars": 1368,
    "preview": "{% extends 'base.html' %}\n{% load staticfiles %}\n{% block title %}天天生鲜-登录{% endblock title %}\n{% block header_con %}{% e"
  },
  {
    "path": "dailyfresh/templates/order_comment.html",
    "chars": 2182,
    "preview": "{% extends 'base_user_center.html' %}\n{% load staticfiles %}\n{% block title %}天天生鲜-用户中心{% endblock %}\n{% block page_titl"
  },
  {
    "path": "dailyfresh/templates/place_order.html",
    "chars": 3895,
    "preview": "{% extends 'base_no_cart.html' %}\n{% load staticfiles %}\n{% block title %}天天生鲜-提交订单{% endblock title %}\n{% block page_ti"
  },
  {
    "path": "dailyfresh/templates/register.html",
    "chars": 1824,
    "preview": "{% extends 'base.html' %}\n{% load staticfiles %}\n{% block title %}天天生鲜-注册{% endblock title %}\n{% block topfiles %}\n\t<scr"
  },
  {
    "path": "dailyfresh/templates/search/indexes/goods/goodssku_text.txt",
    "chars": 123,
    "preview": "# 指定根据表中的哪些字段建立索引数据\n{{ object.name }} # 根据商品的名称建立索引\n{{ object.desc }} # 根据商品的简介建立索引\n{{ object.goods.detail }} # 根据商品的详情建"
  },
  {
    "path": "dailyfresh/templates/search/search.html",
    "chars": 1656,
    "preview": "{% extends 'base_detail_list.html' %}\n{% block title %}天天生鲜-商品搜索结果列表{% endblock title %}\n{% block main_content %}\n\t<div "
  },
  {
    "path": "dailyfresh/templates/search/search1.html",
    "chars": 298,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <title>Title</title>\n</head>\n<body>\n搜索的关键字:{{ que"
  },
  {
    "path": "dailyfresh/templates/static_base.html",
    "chars": 2238,
    "preview": "{# 首页 注册 登录 #}\n<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-tr"
  },
  {
    "path": "dailyfresh/templates/static_index.html",
    "chars": 2297,
    "preview": "{% extends 'static_base.html' %}\n{% load staticfiles %}\n{% block title %}天天生鲜-首页{% endblock title %}\n{% block topfiles %"
  },
  {
    "path": "dailyfresh/templates/user_center_info.html",
    "chars": 1625,
    "preview": "{% extends 'base_user_center.html' %}\n{% block right_content %}\n\t\t<div class=\"right_content clearfix\">\n\t\t\t\t<div class=\"i"
  },
  {
    "path": "dailyfresh/templates/user_center_order.html",
    "chars": 3941,
    "preview": "{% extends 'base_user_center.html' %}\n{% load staticfiles %}\n{% block right_content %}\n\t\t<div class=\"right_content clear"
  },
  {
    "path": "dailyfresh/templates/user_center_site.html",
    "chars": 1484,
    "preview": "{% extends 'base_user_center.html' %}\n{% load staticfiles %}\n{% block right_content %}\n\t\t<div class=\"right_content clear"
  },
  {
    "path": "dailyfresh/utils/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "dailyfresh/utils/fdfs/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "dailyfresh/utils/fdfs/client.conf",
    "chars": 1457,
    "preview": "# connect timeout in seconds\n# default value is 30s\nconnect_timeout=30\n\n# network timeout in seconds\n# default value is "
  },
  {
    "path": "dailyfresh/utils/fdfs/storage.py",
    "chars": 1524,
    "preview": "from django.core.files.storage import Storage\nfrom django.conf import settings\nfrom fdfs_client.client import Fdfs_clien"
  },
  {
    "path": "dailyfresh/utils/mixin.py",
    "chars": 273,
    "preview": "from django.contrib.auth.decorators import login_required\n\n\nclass LoginRequiredMixin(object):\n    @classmethod\n    def a"
  },
  {
    "path": "dailyfresh/uwsgi.ini",
    "chars": 395,
    "preview": "[uwsgi]\n#使用nginx连接时使用\nsocket=127.0.0.1:8080\n#直接做web服务器使用 python manage.py runserver ip:port\n#http=127.0.0.1:8080\n#项目目录\nc"
  },
  {
    "path": "dailyfresh/uwsgi.log",
    "chars": 108017,
    "preview": "*** Starting uWSGI 2.0.15 (64bit) on [Sat Nov 25 16:07:56 2017] ***\ncompiled with version: 4.2.1 Compatible Apple LLVM 8"
  },
  {
    "path": "dailyfresh/uwsgi.pid",
    "chars": 5,
    "preview": "2486\n"
  },
  {
    "path": "dailyfresh/uwsgi2.ini",
    "chars": 397,
    "preview": "[uwsgi]\n#使用nginx连接时使用\nsocket=127.0.0.1:8081\n#直接做web服务器使用 python manage.py runserver ip:port\n#http=127.0.0.1:8080\n#项目目录\nc"
  },
  {
    "path": "dailyfresh/uwsgi2.log",
    "chars": 7484,
    "preview": "*** Starting uWSGI 2.0.15 (64bit) on [Sat Nov 25 17:14:32 2017] ***\ncompiled with version: 4.2.1 Compatible Apple LLVM 8"
  },
  {
    "path": "dailyfresh/uwsgi2.pid",
    "chars": 5,
    "preview": "2500\n"
  },
  {
    "path": "requirements.txt",
    "chars": 513,
    "preview": "amqp==1.4.9\nanyjson==0.3.3\nbilliard==3.3.0.23\ncelery==5.2.2\ncertifi==2023.7.22\nchardet==3.0.4\nDjango==2.2.28\ndjango-hays"
  }
]

// ... and 1 more files (download for full content)

About this extraction

This page contains the full source code of the DiCaprio17/fruits-and-vegetables GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 102 files (356.4 KB), approximately 122.3k tokens, and a symbol index with 108 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!