jiaweiqi 3 years ago
parent
commit
476f78b57a

+ 1 - 1
apps/account/models.py

@@ -45,7 +45,7 @@ class User(AbstractBaseUser, PermissionsMixin):
     EMPLOYEE = 1
     EMPLOYEE = 1
     CUSTOMER = 2
     CUSTOMER = 2
     TYPE_CHOICES = (
     TYPE_CHOICES = (
-        (EMPLOYEE, u'工'),
+        (EMPLOYEE, u'工'),
         (CUSTOMER, u'客户'),
         (CUSTOMER, u'客户'),
     )
     )
 
 

+ 1 - 1
apps/base.py

@@ -6,7 +6,7 @@ class Formater():
         res = u''
         res = u''
         if value != None:
         if value != None:
             try:
             try:
-                res = unicode(value)
+                res = str(value)
             except:
             except:
                 pass
                 pass
         return res
         return res

+ 14 - 0
apps/commodity/filters.py

@@ -2,4 +2,18 @@
 
 
 import django_filters
 import django_filters
 from django.db.models import Q
 from django.db.models import Q
+from apps.commodity.models import Commodity, CommodityImage
 
 
+
+class CommodityFilter(django_filters.FilterSet):
+
+    class Meta:
+        model = Commodity
+        fields = '__all__'
+
+
+class CommodityImageFilter(django_filters.FilterSet):
+
+    class Meta:
+        model = CommodityImage
+        fields = '__all__'

+ 12 - 23
apps/commodity/models.py

@@ -9,6 +9,13 @@ from apps.option.models import Option
 
 
 
 
 class Commodity(models.Model):
 class Commodity(models.Model):
+    CASH = 1
+    POINT = 2
+    TYPE_CHOICE = (
+        (CASH, u'现金商品'),
+        (POINT, u'积分商品')
+    )
+    TYPE_JSON = [{'id': item[0], 'value': item[1]} for item in TYPE_CHOICE]
 
 
     name = models.CharField(verbose_name=u'商品名称', max_length=100)
     name = models.CharField(verbose_name=u'商品名称', max_length=100)
     category = models.ForeignKey(Option, verbose_name=u'类别', on_delete=models.PROTECT)
     category = models.ForeignKey(Option, verbose_name=u'类别', on_delete=models.PROTECT)
@@ -16,7 +23,12 @@ class Commodity(models.Model):
     initial_sale_count = models.IntegerField(verbose_name=u'起始销量', default=0)
     initial_sale_count = models.IntegerField(verbose_name=u'起始销量', default=0)
     total_sales = models.IntegerField(verbose_name=u'实际总销量', default=0, editable=False)
     total_sales = models.IntegerField(verbose_name=u'实际总销量', default=0, editable=False)
     sort = models.PositiveSmallIntegerField(verbose_name=u'排序', default=0)
     sort = models.PositiveSmallIntegerField(verbose_name=u'排序', default=0)
+    type = models.PositiveSmallIntegerField(verbose_name=u'类型', choices=TYPE_CHOICE, default=CASH)
+    price = models.BigIntegerField(verbose_name=u'销售价格', default=0)
+    vip_price = models.BigIntegerField(verbose_name=u'会员价格', default=0)
+    point_price = models.BigIntegerField(verbose_name=u'积分价格', default=0)
     status = models.PositiveSmallIntegerField(choices=settings.SALES_STATUS_CHOICES, verbose_name=u"状态", default=settings.ONLINE)
     status = models.PositiveSmallIntegerField(choices=settings.SALES_STATUS_CHOICES, verbose_name=u"状态", default=settings.ONLINE)
+    notes = models.CharField(max_length=500, verbose_name=u"备注", null=True, blank=True)
     create_user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=u'创建人', editable=False, on_delete=models.PROTECT)
     create_user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=u'创建人', editable=False, on_delete=models.PROTECT)
     create_time = models.DateTimeField(verbose_name=u"创建时间", default=timezone.now, editable=False)
     create_time = models.DateTimeField(verbose_name=u"创建时间", default=timezone.now, editable=False)
     delete = models.BooleanField(verbose_name=u'删除', default=False, editable=False)
     delete = models.BooleanField(verbose_name=u'删除', default=False, editable=False)
@@ -50,26 +62,3 @@ class CommodityImage(models.Model):
         verbose_name = u'商品图片'
         verbose_name = u'商品图片'
         default_permissions = ()
         default_permissions = ()
         permissions = []
         permissions = []
-
-
-class CommodityDetails(models.Model):
-    CASH = 1
-    POINT = 2
-    TYPE_CHOICE = (
-        (CASH, u'现金商品'),
-        (POINT, u'积分商品')
-    )
-    commodity = models.ForeignKey(Commodity,verbose_name=u'商品', on_delete=models.PROTECT)
-    type = models.PositiveSmallIntegerField(verbose_name=u'类型', choices=TYPE_CHOICE, default=CASH)
-    price = models.BigIntegerField(verbose_name=u'销售价格')
-    vip_price = models.BigIntegerField(verbose_name=u'会员价格')
-    point_price = models.BigIntegerField(verbose_name=u'积分价格')
-    sales = models.IntegerField(verbose_name=u'实际销量', null=True, default=0)
-    status = models.PositiveSmallIntegerField(choices=settings.SALES_STATUS_CHOICES, verbose_name=u"状态", default=settings.ONLINE)
-
-    class Meta:
-        db_table = "commodity_details"
-        verbose_name = u'商品明细'
-        ordering = ['-id']
-        default_permissions = ()
-        permissions = []

+ 0 - 6
apps/customer/__init__.py

@@ -1,6 +0,0 @@
-#coding=utf-8
-
-
-def customer_log(customer, type, description, data=None):
-    from apps.log.models import BizLog
-    BizLog.objects.addnew(customer.tenant, customer.user, type, description, data)

+ 78 - 0
apps/customer/models.py

@@ -3,6 +3,15 @@
 from django.db import models
 from django.db import models
 from django.utils import timezone
 from django.utils import timezone
 from django.conf import settings
 from django.conf import settings
+from django.contrib.auth import get_user_model
+
+from utils.wx.wechat import WeChat
+from utils.exceptions import CustomError
+from utils.wx.WXBizDataCrypt import WXBizDataCrypt
+
+from apps.WechatApplet.models import WechatApplet
+
+User = get_user_model()
 
 
 
 
 class Customer(models.Model):
 class Customer(models.Model):
@@ -32,6 +41,23 @@ class Customer(models.Model):
         default_permissions = ()
         default_permissions = ()
         permissions = []
         permissions = []
 
 
+    def setInfo(self, appid, openid, encryptedData, iv):
+        wx_customer = CustomerWechat.objects.filter(openid=openid, wechat_app__authorizer_appid=appid).first()
+        if not wx_customer:
+            raise CustomError(u'未找到相应的微信客户!')
+        if wx_customer.customer and wx_customer.customer.id != self.id:
+            raise CustomError(u'该微信已同步其他客户!')
+        if not wx_customer.customer:
+            wx_customer.customer = self
+            wx_customer.save()
+        pc = WXBizDataCrypt(wx_customer.wechat_app.authorizer_appid, wx_customer.session_key)
+        result = pc.decrypt(encryptedData, iv)
+        self.name = result['nickName']
+        self.gender = result['gender']
+        self.face = result['avatarUrl']
+        self.save()
+        return self.face, self.name
+
 
 
 class SuperiorDistributor(models.Model):
 class SuperiorDistributor(models.Model):
     customer = models.ForeignKey(Customer, verbose_name=u'客户', editable=False, related_name='superior_distributor_customer', on_delete=models.PROTECT)
     customer = models.ForeignKey(Customer, verbose_name=u'客户', editable=False, related_name='superior_distributor_customer', on_delete=models.PROTECT)
@@ -50,6 +76,7 @@ class SuperiorDistributor(models.Model):
 
 
 
 
 class CustomerWechat(models.Model):
 class CustomerWechat(models.Model):
+    wechat_app = models.ForeignKey(WechatApplet, verbose_name=u'小程序', on_delete=models.PROTECT, editable=False)
     customer = models.ForeignKey(Customer, verbose_name=u'客户', on_delete=models.PROTECT, editable=False, null=True)
     customer = models.ForeignKey(Customer, verbose_name=u'客户', on_delete=models.PROTECT, editable=False, null=True)
     openid = models.CharField(max_length=512, verbose_name=u"openid")
     openid = models.CharField(max_length=512, verbose_name=u"openid")
     session_key = models.CharField(max_length=512, verbose_name=u'session_key',null=True)
     session_key = models.CharField(max_length=512, verbose_name=u'session_key',null=True)
@@ -62,6 +89,57 @@ class CustomerWechat(models.Model):
         ]
         ]
         default_permissions = ()
         default_permissions = ()
 
 
+    @staticmethod
+    def login(code, appid):
+        '''
+        微信自动登录小程序
+        :param code:
+        :param appid:
+        :return:
+        '''
+        wx = WechatApplet.getByAppid(appid)
+        res = WeChat.code2Session(appid, wx.secret, code)
+        instance = CustomerWechat.objects.filter(openid=res['openid'], wechat_app=wx).first()
+        if not instance:
+            instance = CustomerWechat.objects.create(wechat_app=wx, openid=res['openid'], session_key=res['session_key'])
+        else:
+            instance.session_key = res['session_key']
+            instance.save()
+        return instance
+
+    @staticmethod
+    def bindWechat(appid, openid, phoneEncryptedData, phoneIv):
+        '''
+        微信登录小程序
+        判断是否有推荐人,如果有且推荐人是分销商,就要创建上级分销表,同时查询推荐人是否存在上级分销表 如果存在就要将推荐人的上级分销相应的添加到本人的上级分销表里
+        :param appid:
+        :param openid:
+        :param phoneEncryptedData:
+        :param phoneIv:
+        :return:
+        '''
+        wx_customer = CustomerWechat.objects.filter(openid=openid, wechat_app__authorizer_appid=appid).first()
+        if not wx_customer:
+            raise CustomError(u'未找到相应的微信客户!')
+
+        pc = WXBizDataCrypt(appid, wx_customer.session_key)
+        phon_data = pc.decrypt(phoneEncryptedData, phoneIv)
+        tel = phon_data['purePhoneNumber']
+        if wx_customer.customer:
+            if wx_customer.customer.user.username != tel:
+                raise CustomError(u'微信绑定的手机号与系统记录的不符!')
+            else:
+                return wx_customer.customer
+        user = User.objects.filter(username=tel).first()
+        if not user:
+            user = User.objects.create_customer(tel, password=tel, **{'is_active': True})
+        customer = Customer.objects.filter(user=user).first()
+        if not customer:
+            customer = Customer.objects.create(user=user, name=tel, tel=tel)
+        wx_customer.customer = customer
+        wx_customer.save()
+        return customer
+
 
 
 class Area(models.Model):
 class Area(models.Model):
     PROVINCE = 0
     PROVINCE = 0

+ 2 - 1
apps/dashboard/views.py

@@ -2,10 +2,11 @@
 
 
 from django.http import HttpResponseRedirect, HttpResponsePermanentRedirect
 from django.http import HttpResponseRedirect, HttpResponsePermanentRedirect
 
 
+
 def index(request):
 def index(request):
     user_id = request.META.get('HTTP_USER_ID')
     user_id = request.META.get('HTTP_USER_ID')
     token = request.META.get('HTTP_ACCESS_TOKEN')
     token = request.META.get('HTTP_ACCESS_TOKEN')
     if not user_id or not token:
     if not user_id or not token:
         return HttpResponseRedirect('/views/account/login.html')
         return HttpResponseRedirect('/views/account/login.html')
     else:
     else:
-        return HttpResponsePermanentRedirect("/views/index.html")
+        return HttpResponsePermanentRedirect("/views/index.html")

+ 2 - 2
apps/employee/filters.py

@@ -6,10 +6,10 @@ from apps.employee.models import Employee
 
 
 
 
 class EmployeeFilter(django_filters.FilterSet):
 class EmployeeFilter(django_filters.FilterSet):
-    is_active = django_filters.CharFilter(field_name='user__is_active')
     username = django_filters.CharFilter(field_name='user__username', lookup_expr='icontains')
     username = django_filters.CharFilter(field_name='user__username', lookup_expr='icontains')
     name = django_filters.CharFilter(field_name='name', lookup_expr='icontains')
     name = django_filters.CharFilter(field_name='name', lookup_expr='icontains')
+    tel = django_filters.CharFilter(field_name='tel', lookup_expr='icontains')
 
 
     class Meta:
     class Meta:
         model = Employee
         model = Employee
-        fields = '__all__'
+        fields = ['username', 'name', 'tel', ]

+ 1 - 1
apps/employee/models.py

@@ -12,7 +12,7 @@ class Employee(models.Model):
 
 
     class Meta:
     class Meta:
         db_table = "employee"
         db_table = "employee"
-        verbose_name = u'工管理'
+        verbose_name = u'工管理'
         ordering = ['-id']
         ordering = ['-id']
         index_together = (
         index_together = (
             'name',
             'name',

+ 22 - 113
apps/images/models.py

@@ -6,23 +6,15 @@ from django.db import models
 from django.conf import settings
 from django.conf import settings
 from django.utils import timezone
 from django.utils import timezone
 
 
-from utils.file_operation import UploadFile, DeleteFile, DownloadFace
+from utils.file_operation import UploadFile, DeleteFile
 
 
 
 
 class ImagesManager(models.Manager):
 class ImagesManager(models.Manager):
-
-    def employee_addnew(self, employee, type, file):
-        return self._addnew(employee.user, type, file)
-
-    def customer_addnew(self, customer, type, file):
-        return self._addnew(customer.user, type, file)
-
-    def _addnew(self, user, type, file):
+    def _addnew(self, user, type, file, size=None):
         width = None
         width = None
         height = None
         height = None
 
 
-        path = ImagesManager.calculatePath(type, user.id)
-        modify_size = ImagesManager.canModifySize(type)
+        path = ImagesManager.calculatePath(type)
         filename = UploadFile(file, path)
         filename = UploadFile(file, path)
         fullname = "%s/%s" % (settings.MEDIA_ROOT, filename)
         fullname = "%s/%s" % (settings.MEDIA_ROOT, filename)
 
 
@@ -30,7 +22,7 @@ class ImagesManager(models.Manager):
             img = Image.open(fullname)
             img = Image.open(fullname)
             width, height = img.size
             width, height = img.size
             # 缩略图压缩宽或高最大200
             # 缩略图压缩宽或高最大200
-            if modify_size and (width > 200 or height > 200):
+            if width > 200 or height > 200:
                 if width > height:
                 if width > height:
                     size = (200, int(height * 200 / width))
                     size = (200, int(height * 200 / width))
                 elif width < height:
                 elif width < height:
@@ -45,8 +37,7 @@ class ImagesManager(models.Manager):
         instance = self.model(
         instance = self.model(
             user=user,
             user=user,
             type=type,
             type=type,
-            name=file.name,
-            picture=filename,
+            picture="%s%s" % (settings.MEDIA_URL, filename),
             width=width,
             width=width,
             height=height,
             height=height,
             create_time=timezone.now()
             create_time=timezone.now()
@@ -55,97 +46,35 @@ class ImagesManager(models.Manager):
         return instance
         return instance
 
 
     @staticmethod
     @staticmethod
-    def calculatePath(type, user_id):
+    def calculatePath(type):
         path_map = {
         path_map = {
-            Images.PACKAGE_FILE: package_detail_file,
-            Images.PACKAGE_THUMBNAIL_FILE: package_thumbnail_file,
-            Images.PACKAGE_PLAYBILL_FILE: package_playbill_file,
-            Images.POSTER_FILE: poster_file,
-            Images.SALES_ADVISOR_FACE: sales_advisor_face_file,
-            Images.SALES_ADVISOR_CODE: sales_advisor_code_file,
-            Images.SHOP_FILE: shop_file,
-            Images.VEHICLE_SERIES_THUMBNAIL: vehicle_series_thumbnail_file,
-            Images.VEHICLE_MODEL_THUMBNAIL: vehicle_model_thumbnail_file,
-            Images.VEHICLE_MODEL_PLAYBILL: vehicle_model_playbill_file,
-            Images.VEHICLE_IMAGES: vehicle_model_detail_file,
-            Images.VEHICLE_MODEL_IMAGES: vehicle_detail_file,
-            Images.CUSTOMER_FACE: customer_face_file,
-            Images.ACTIVITY_PLAYBILL_FILE: activity_playbill_file,
+            Images.COMMODITY_SHOW_IMAGE: commodity_show_image,
+            Images.COMMODITY_DETAILS_IMAGE: commodity_details_image,
+            Images.COMMODITY_CAROUSEL_IMAGE: commodity_carousel_image,
         }
         }
+        return path_map[type]
 
 
-        return path_map[type] + str(user_id) + '/'
 
 
-    @staticmethod
-    def canModifySize(type):
-        modify_size = False
-        can_modify_list = [
-            Images.PACKAGE_THUMBNAIL_FILE,
-            Images.SALES_ADVISOR_FACE,
-            Images.SALES_ADVISOR_CODE,
-            Images.SHOP_FILE,
-            Images.VEHICLE_SERIES_THUMBNAIL,
-            Images.VEHICLE_MODEL_THUMBNAIL,
-        ]
-        if type in can_modify_list:
-            modify_size = True
-
-        return modify_size
-
-
-package_detail_file = "package/detail/"
-package_thumbnail_file = "package/thumbnail/"
-package_playbill_file = "package/playbill/"
-poster_file = 'poster/'
-sales_advisor_face_file = "sales_advisor/face/"
-sales_advisor_code_file = "sales_advisor/code/"
-shop_file = "shop/"
-vehicle_series_thumbnail_file = 'vehicle_series/'
-vehicle_model_thumbnail_file = 'vehicle_model/thumbnail/'
-vehicle_model_playbill_file = 'vehicle_model/playbill/'
-vehicle_model_detail_file = 'vehicle_model/detail/'
-vehicle_detail_file = 'vehicle/detail/'
-customer_face_file = 'customer/face/'
-activity_playbill_file = 'activity/playbill/'
+commodity_show_image = "commodity/show/"
+commodity_details_image = "commodity/details/"
+commodity_carousel_image = "commodity/carousel/"
 
 
 
 
 class Images(models.Model):
 class Images(models.Model):
-    PACKAGE_FILE = 1
-    PACKAGE_THUMBNAIL_FILE = 2
-    PACKAGE_PLAYBILL_FILE = 3
-    POSTER_FILE = 4
-    SALES_ADVISOR_FACE = 5
-    SALES_ADVISOR_CODE = 6
-    SHOP_FILE = 7
-    VEHICLE_SERIES_THUMBNAIL = 8
-    VEHICLE_MODEL_THUMBNAIL = 9
-    VEHICLE_MODEL_PLAYBILL = 10
-    VEHICLE_IMAGES = 11
-    VEHICLE_MODEL_IMAGES = 12
-    CUSTOMER_FACE = 13
-    ACTIVITY_PLAYBILL_FILE= 14
+    COMMODITY_SHOW_IMAGE = 1
+    COMMODITY_DETAILS_IMAGE = 2
+    COMMODITY_CAROUSEL_IMAGE = 3
     TYPE_CHOICES = (
     TYPE_CHOICES = (
-        (PACKAGE_FILE, u'商品图片'),
-        (PACKAGE_THUMBNAIL_FILE, u'商品缩略图'),
-        (PACKAGE_PLAYBILL_FILE, u'商品海报'),
-        (POSTER_FILE, u'广告图片'),
-        (SALES_ADVISOR_FACE, u'销售顾问头像'),
-        (SALES_ADVISOR_CODE, u'销售顾问二维码'),
-        (SHOP_FILE, u'门店图片'),
-        (VEHICLE_SERIES_THUMBNAIL, u'车系缩略图'),
-        (VEHICLE_MODEL_THUMBNAIL, u'车型缩略图'),
-        (VEHICLE_MODEL_PLAYBILL, u'车型海报'),
-        (VEHICLE_IMAGES, u'整车图片'),
-        (VEHICLE_MODEL_IMAGES, u'车型图片'),
-        (CUSTOMER_FACE, u'客户头像'),
-        (ACTIVITY_PLAYBILL_FILE, u'活动封面'),
+        (COMMODITY_SHOW_IMAGE, u'商品缩略图'),
+        (COMMODITY_DETAILS_IMAGE, u'商品详情图'),
+        (COMMODITY_CAROUSEL_IMAGE, u'商品轮播图'),
     )
     )
 
 
     user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=u'操作人', on_delete=models.PROTECT)
     user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=u'操作人', on_delete=models.PROTECT)
     type = models.PositiveSmallIntegerField(choices=TYPE_CHOICES, verbose_name=u"类型")
     type = models.PositiveSmallIntegerField(choices=TYPE_CHOICES, verbose_name=u"类型")
-    name = models.CharField(verbose_name=u'图片名', max_length=250)
     picture = models.CharField(verbose_name=u'图片路径', max_length=250)
     picture = models.CharField(verbose_name=u'图片路径', max_length=250)
-    width = models.IntegerField(verbose_name=u"图片宽度")
-    height = models.IntegerField(verbose_name=u"图片高度")
+    width = models.IntegerField(verbose_name=u"图片宽度", blank=True, default=0)
+    height = models.IntegerField(verbose_name=u"图片高度", blank=True, default=0)
     create_time = models.DateTimeField(verbose_name=u'上传时间', default=timezone.now, editable=False)
     create_time = models.DateTimeField(verbose_name=u'上传时间', default=timezone.now, editable=False)
 
 
     objects = ImagesManager()
     objects = ImagesManager()
@@ -166,24 +95,4 @@ class Images(models.Model):
         DeleteFile(picture)
         DeleteFile(picture)
 
 
     def get_path(self):
     def get_path(self):
-        return '%s%s%s' % (settings.SERVER_DOMAIN, settings.MEDIA_URL, self.picture)
-
-    @staticmethod
-    def downLoadFace(customer, url):
-        save_path = customer_face_file + str(customer.user.id) + '/'
-        filename = DownloadFace(url, save_path, 'jpg')
-        name = filename.split('/')[-1]
-        fullname = "%s/%s" % (settings.MEDIA_ROOT, filename)
-        width = None
-        height = None
-        try:
-            img = Image.open(fullname)
-            width, height = img.size
-        except:
-            pass
-        instance = Images.objects.create(
-            tenant=customer.tenant, user=customer.user, type=Images.CUSTOMER_FACE, name=name, picture=filename,
-            width=width, height=height, create_time=timezone.now()
-        )
-        instance.save()
-        return instance
+        return '%s%s' % (settings.SERVER_DOMAIN, self.picture)

+ 2 - 2
apps/log/models.py

@@ -11,14 +11,14 @@ from utils.format import strftime, strfdate
 
 
 
 
 class BizLogManager(models.Manager):
 class BizLogManager(models.Manager):
-    def addnew(self, tenant, user, type, description, data=None):
+    def addnew(self, user, type, description, data=None):
         def default(o):
         def default(o):
             if isinstance(o, datetime.datetime):
             if isinstance(o, datetime.datetime):
                 return strftime(o)
                 return strftime(o)
             elif isinstance(o, datetime.date):
             elif isinstance(o, datetime.date):
                 return strfdate(o)
                 return strfdate(o)
 
 
-        row = self.model(tenant=tenant, user=user, type=type, description=description)
+        row = self.model(user=user, type=type, description=description)
         if data:
         if data:
             row.data = json.dumps(data, default=default)
             row.data = json.dumps(data, default=default)
         row.save()
         row.save()

+ 1 - 1
apps/option/models.py

@@ -26,7 +26,7 @@ class Option(models.Model):
 
 
     class Meta:
     class Meta:
         db_table = "system_option"
         db_table = "system_option"
-        verbose_name = u'系统选项'
+        verbose_name = u'自定义项'
         ordering = ['type', 'sort', ]
         ordering = ['type', 'sort', ]
         index_together = (
         index_together = (
             'type',
             'type',

+ 3 - 3
apps/order/models.py

@@ -4,7 +4,7 @@ from django.db import models
 from django.conf import settings
 from django.conf import settings
 from django.utils import timezone
 from django.utils import timezone
 from apps.option.models import Option
 from apps.option.models import Option
-from apps.commodity.models import CommodityDetails
+from apps.commodity.models import Commodity
 from apps.customer.models import Customer, CustomerAddress
 from apps.customer.models import Customer, CustomerAddress
 
 
 
 
@@ -41,7 +41,7 @@ class Pay(models.Model):
 
 
 
 
 class ShoppingCart(models.Model):
 class ShoppingCart(models.Model):
-    commodity_details = models.ForeignKey(CommodityDetails, verbose_name=u'产品明细', on_delete=models.PROTECT)
+    commodity_details = models.ForeignKey(Commodity, verbose_name=u'产品明细', on_delete=models.PROTECT)
     quantity = models.PositiveIntegerField(verbose_name=u'数量', default=1)
     quantity = models.PositiveIntegerField(verbose_name=u'数量', default=1)
     create_time = models.DateTimeField(verbose_name=u'创建时间', auto_now_add=True)
     create_time = models.DateTimeField(verbose_name=u'创建时间', auto_now_add=True)
     customer = models.ForeignKey(Customer, related_name='shopping_cart_customer', verbose_name=u"下单人", on_delete=models.PROTECT, editable=False)
     customer = models.ForeignKey(Customer, related_name='shopping_cart_customer', verbose_name=u"下单人", on_delete=models.PROTECT, editable=False)
@@ -105,7 +105,7 @@ class Order(models.Model):
 class OrderDetails(models.Model):
 class OrderDetails(models.Model):
 
 
     order = models.ForeignKey(Order, verbose_name=u'订单', on_delete=models.PROTECT)
     order = models.ForeignKey(Order, verbose_name=u'订单', on_delete=models.PROTECT)
-    commodity = models.ForeignKey(CommodityDetails, verbose_name=u'商品', on_delete=models.PROTECT)
+    commodity = models.ForeignKey(Commodity, verbose_name=u'商品', on_delete=models.PROTECT)
     price = models.IntegerField(verbose_name=u'价格', null=True, default=0)
     price = models.IntegerField(verbose_name=u'价格', null=True, default=0)
     point = models.IntegerField(verbose_name=u'积分', null=True, default=0)
     point = models.IntegerField(verbose_name=u'积分', null=True, default=0)
     count = models.IntegerField(verbose_name=u'数量', null=True, default=0)
     count = models.IntegerField(verbose_name=u'数量', null=True, default=0)

+ 11 - 5
cosmetics_shop/settings.py

@@ -47,6 +47,7 @@ INSTALLED_APPS = [
     'apps.account',
     'apps.account',
     'apps.collection',
     'apps.collection',
     'apps.commodity',
     'apps.commodity',
+    'apps.config',
     'apps.customer',
     'apps.customer',
     'apps.dashboard',
     'apps.dashboard',
     'apps.employee',
     'apps.employee',
@@ -169,6 +170,10 @@ USE_TZ = True
 # https://docs.djangoproject.com/en/1.9/howto/static-files/
 # https://docs.djangoproject.com/en/1.9/howto/static-files/
 
 
 STATIC_URL = '/static/'
 STATIC_URL = '/static/'
+STATIC_ROOT = os.path.join(BASE_DIR, "uis/static/")
+STATICFILES_DIRS = (
+    os.path.join(BASE_DIR, "static"),
+)
 
 
 MEDIA_URL = '/up/'
 MEDIA_URL = '/up/'
 MEDIA_ROOT = os.path.join(BASE_DIR, "uis/up/")
 MEDIA_ROOT = os.path.join(BASE_DIR, "uis/up/")
@@ -220,13 +225,14 @@ try:
 except ImportError:
 except ImportError:
     pass
     pass
 
 
-FEMALE = 1
-MALE = 2
-UNKNOWN = 3
+UNKNOWN = 0
+MALE = 1
+FEMALE = 2
+
 GENDER_CHOICES = (
 GENDER_CHOICES = (
-    (FEMALE, u'女'),
+    (UNKNOWN, u'未知'),
     (MALE, u'男'),
     (MALE, u'男'),
-    (UNKNOWN, u'男'),
+    (FEMALE, u'女'),
 )
 )
 
 
 OFFLINE = 0
 OFFLINE = 0

+ 10 - 0
cosmetics_shop/urls.py

@@ -1,3 +1,4 @@
+# coding=utf-8
 """cosmetics_shop URL Configuration
 """cosmetics_shop URL Configuration
 
 
 The `urlpatterns` list routes URLs to views. For more information please see:
 The `urlpatterns` list routes URLs to views. For more information please see:
@@ -20,4 +21,13 @@ from apps.dashboard.views import index
 
 
 urlpatterns = [
 urlpatterns = [
     url(r'^$', index),
     url(r'^$', index),
+    url(r'^employee/', include('apps.employee.urls')),
+    url(r'^customer/', include('apps.customer.urls')),
+    url(r'^config/', include('apps.config.urls')),
+    url(r'^commodity/', include('apps.commodity.urls')),
+    url(r'^option/', include('apps.option.urls')),
 ]
 ]
+
+urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
+urlpatterns += static(settings.UIS_URL, document_root=settings.UIS_ROOT)
+urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)